./0000755000015600001650000000000012700370716011100 5ustar jenkinsjenkins./scripts/0000755000015600001650000000000012700370701012561 5ustar jenkinsjenkins./scripts/pre-execution.sh0000755000015600001650000000122612700370701015710 0ustar jenkinsjenkins#!/bin/bash # # Copyright 2012 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # cd $1 qmake make ./ubuntu-sdk.pro0000644000015600001650000000200012700370701013705 0ustar jenkinsjenkins#include( documentation/documentation.pri ) BUILD_PATH_CONTENTS="SRC_DIR=\"$$PWD\"" \ "BUILD_DIR=\"$$OUT_PWD\"" write_file($$PWD/build_paths.inc,BUILD_PATH_CONTENTS) requires(qtHaveModule(quick)) load(qt_parts) SUBDIRS += po documentation app-launch-profiler ubuntu-ui-toolkit-launcher apicheck sub_tests.CONFIG -= no_default_target sub_tests.CONFIG -= no_default_install # additional 'make test' target required by continuous integration system test.target = test test.commands = make check test.depends = license sub_src QMAKE_EXTRA_TARGETS += test license.target = license license.commands = cd $$PWD; $$PWD/tests/license/checklicense.sh QMAKE_EXTRA_TARGETS += license check.target = check check.commands = $$PWD/tests/checkresults.sh $$OUT_PWD/tests/test_tst_*.xml #helper files OTHER_FILES += \ features/ubuntu_qml_module.prf \ features/ubuntu_qml_plugin.prf \ features/ubuntu_qt_module.prf \ features/ubuntu_enable_testing.prf \ features/coverage.prf \ .qmake.conf ./gallery.sh0000755000015600001650000000137612700370701013077 0ustar jenkinsjenkins#!/bin/bash # # Copyright 2012 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # if [ "$1" == "--autopilot" ] then tests/Gallery/gallery -testability & autopilot vis else tests/Gallery/gallery $@ fi ./mkspecs/0000755000015600001650000000000012700370700012536 5ustar jenkinsjenkins./export_qml_dir.sh0000755000015600001650000000267512700370714014477 0ustar jenkinsjenkins#!/bin/sh # # Copyright 2012 - 2016 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # # Get the current script directory (compatible with Bash and ZSH) SCRIPT_DIR=`dirname ${BASH_SOURCE[0]-$0}` SCRIPT_DIR=`cd $SCRIPT_DIR && pwd` source "$SCRIPT_DIR/build_paths.inc" || return 1 export QML_IMPORT_PATH=$BUILD_DIR/qml export QML2_IMPORT_PATH=$BUILD_DIR/qml export UBUNTU_UI_TOOLKIT_THEMES_PATH=$BUILD_DIR/qml UBUNTU_QML_ROOT=$BUILD_DIR/qml/Ubuntu UBUNTU_QML_DIRS=$UBUNTU_QML_ROOT/Components:$UBUNTU_QML_ROOT/Test:$UBUNTU_QML_ROOT/Layouts:$UBUNTU_QML_ROOT/PerformanceMetrics export LD_LIBRARY_PATH=$BUILD_DIR/lib:$UBUNTU_QML_DIRS$LD_LIBRARY_PATH /sbin/initctl set-env --global QML_IMPORT_PATH=$BUILD_DIR/qml /sbin/initctl set-env --global QML2_IMPORT_PATH=$BUILD_DIR/qml /sbin/initctl set-env --global UBUNTU_UI_TOOLKIT_THEMES_PATH=$BUILD_DIR/qml /sbin/initctl set-env --global LD_LIBRARY_PATH=$BUILD_DIR/lib ./sync.profile0000644000015600001650000000211012700370701013422 0ustar jenkinsjenkins%modules = ( # path to module name map "UbuntuGestures" => "$basedir/src/Ubuntu/UbuntuGestures", "UbuntuToolkit" => "$basedir/src/Ubuntu/UbuntuToolkit", ); %moduleheaders = ( # restrict the module headers to those found in relative path ); %classnames = ( #add classnames that are not automatically detected #e.g. "someheader.h" => "SomeType" "debughelpers.h" => "DebugHelpers", "pool.h" => "Pool", "touchregistry.h" => "TouchRegistry", "touchownershipevent.h" => "TouchOwnershipEvent", "unownedtouchevent.h" => "UnownedTouchEvent" ); # Module dependencies. # Every module that is required to build this module should have one entry. # Each of the module version specifiers can take one of the following values: # - A specific Git revision. # - any git symbolic ref resolvable from the module's repository (e.g. "refs/heads/master" to track master branch) # %dependencies = ( "qtbase" => "", "qtdeclarative" => "", "qtfeedback" => "", "qtpim" => "", ); #export all classes that are in a Ubuntu* namespace $publicclassregexp = "^Ubuntu[A-Za-z0-9]*::[^:]*\$" ./tests/0000755000015600001650000000000012700370716012242 5ustar jenkinsjenkins./tests/api/0000755000015600001650000000000012700370701013005 5ustar jenkinsjenkins./tests/api/Extinct/0000755000015600001650000000000012700370701014423 5ustar jenkinsjenkins./tests/api/Extinct/Extinct.pro0000644000015600001650000000004612700370701016563 0ustar jenkinsjenkinsTEMPLATE = subdirs SUBDIRS = Animals ./tests/api/Extinct/Animals/0000755000015600001650000000000012700370701016007 5ustar jenkinsjenkins./tests/api/Extinct/Animals/Paratriisodon.qml0000644000015600001650000000161412700370701021342 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Author: Christian Dywan */ import QtQuick 2.0 Item { id: body /*! \qmlproperty real skullSize */ property real skullSize /*! \qmlproperty real saggitalCrestSize */ property real saggitalCrestSize } ./tests/api/Extinct/Animals/AnimalModule.pro0000644000015600001650000000040612700370701021100 0ustar jenkinsjenkinsCXX_MODULE = qml TARGET = ExtinctAnimals TARGETPATH = Extinct/Animals IMPORT_VERSION = 0.1 include(plugin/plugin.pri) QML_FILES += \ Andrewsarchus.qml \ Paratriisodon.qml \ Gigantophis.qml \ test.qml \ digger.js \ load(ubuntu_qml_plugin) ./tests/api/Extinct/Animals/digger.js0000644000015600001650000000137512700370701017614 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! Return true if the object is a Flickable that can be flicked in vertical direction. */ function makeHole(){ } ./tests/api/Extinct/Animals/plugin/0000755000015600001650000000000012700370701017305 5ustar jenkinsjenkins./tests/api/Extinct/Animals/plugin/rune.cpp0000644000015600001650000000317112700370701020764 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #include #include "rune.h" QHash > UCQQuickImageExtension::s_rewrittenSciFiles; /*! \internal The UCQQuickImageExtension class makes sure that for images loaded via QQuickImageBase the right version is loaded and that they are scaled appropriately. It does so by overriding the QQuickImageBase's 'source' property. */ UCQQuickImageExtension::UCQQuickImageExtension(QObject *parent) : QObject(parent), m_image(static_cast(parent)) { // connect sourceChanged signal to extendedSourceChanged QObject::connect(m_image, &QQuickImageBase::sourceChanged, this, &UCQQuickImageExtension::extendedSourceChanged); } QUrl UCQQuickImageExtension::source() const { return m_source; } void UCQQuickImageExtension::setSource(const QUrl& url) { if (url != m_source) { m_source = url; } } ./tests/api/Extinct/Animals/plugin/rune.h0000644000015600001650000000266612700370701020441 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #ifndef EA_RUNE_H #define EA_RUNE_H #include #include #include #include class QQuickImageBase; class UCQQuickImageExtension : public QObject { Q_OBJECT Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY extendedSourceChanged) Q_PROPERTY(QUrl fountain READ source WRITE setSource NOTIFY extendedSourceChanged) public: explicit UCQQuickImageExtension(QObject *parent = 0); QUrl source() const; virtual void setSource(const QUrl& url); Q_SIGNALS: void extendedSourceChanged(); private: QQuickImageBase* m_image; QUrl m_source; static QHash > s_rewrittenSciFiles; }; #endif // EA_RUNE_H ./tests/api/Extinct/Animals/plugin/plugin.h0000644000015600001650000000206212700370701020754 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef EXTINCT_ANIMALS_PLUGIN_H #define EXTINCT_ANIMALS_PLUGIN_H #include #include class ExtinctAnimalsPlugin : public QQmlExtensionPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") public: void registerTypes(const char *uri); void initializeEngine(QQmlEngine *engine, const char *uri); }; #endif // EXTINCT_ANIMALS_PLUGIN_H ./tests/api/Extinct/Animals/plugin/plugin.qrc0000644000015600001650000000020712700370701021311 0ustar jenkinsjenkins ../Paratriisodon.qml ../digger.js ./tests/api/Extinct/Animals/plugin/smilodon.cpp0000644000015600001650000000270012700370701021634 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #include "smilodon.h" /*! * \qmltype Smilodon * \instantiates EASmilodon * \inqmlmodule Extinct.Animals 1.0 * \ingroup ubuntu-commandline * \brief The Smilodon class specifies the behavior of an extinct big cat. * * \sa Andrewsarchus */ EASmilodon::EASmilodon(QObject *parent) : QObject(parent) { } /*! * \qmlproperty string Smilodon::name * * Name identifying the smilodon. * */ QString EASmilodon::name() const { return m_name; } void EASmilodon::setName(const QString &name) { m_name = name; Q_EMIT(nameChanged()); } /*! * \qmlmethod string Smilodon::paw(int i) * * Returns the \e{i}th paw of the smilodon. * Values are counted from 0. * */ QString EASmilodon::paw(int i) const { return QString("Paw #%1").arg(i); } ./tests/api/Extinct/Animals/plugin/pangaea.cpp0000644000015600001650000000340212700370701021404 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #include "pangaea.h" /*! * \qmltype Ubuntu * \instantiates EAPangaea * \inqmlmodule Extinct.Animals 1.2 * \ingroup ubuntu * \since Extinct.Animals 1.2 * \brief Provides global object with different enums. * * \section2 Enums * * \section4 ModernContinent enum * The enumeration identifies the modern concept of a continent. * \table * \header * \li Enum * \li Description * \row * \li America * \li Originally part of Laurasia, Laurentia split from Eurasia, now known as America. * \row * \li Europe * \li The second smallest continent today, part of Eurasia. * \endtable */ EAPangaea::EAPangaea(QObject *parent) : QObject(parent) { } /*! * \qmlproperty uint16 Extinct::toolkitVersion * \since Extinct.Animals 4.0 * \readonly * The property holds the tectonic formation of the current continent. */ /*! * \qmlmethod uint16 Extinct::era(int year) * \since Extinct.Animals 4.0 * The function builds a tectonic identifier using the year. */ quint16 EAPangaea4::era(quint8 year) { Q_UNUSED(year); return 0; } ./tests/api/Extinct/Animals/plugin/smilodon.h0000644000015600001650000000227712700370701021312 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #ifndef UCARGUMENT_H #define UCARGUMENT_H #include #include #include class EASmilodon : public QObject { Q_OBJECT Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) public: explicit EASmilodon(QObject *parent = 0); QString name() const; void setName(const QString &name); Q_INVOKABLE QString paw(int i) const; Q_SIGNALS: void nameChanged(); private: QString m_name; }; #endif // UCARGUMENT_H ./tests/api/Extinct/Animals/plugin/plugin.cpp0000644000015600001650000000501012700370701021303 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #include "plugin.h" #include "tarpan.h" #include "smilodon.h" #include "pangaea.h" #include "rune.h" #include "europe.h" #include static QObject *registerPangaea(QQmlEngine *engine, QJSEngine *scriptEngine) { Q_UNUSED(engine) Q_UNUSED(scriptEngine) return new EAPangaea(); } static QObject *registerPangaea4(QQmlEngine *engine, QJSEngine *scriptEngine) { Q_UNUSED(engine) Q_UNUSED(scriptEngine) return new EAPangaea4(); } void ExtinctAnimalsPlugin::initializeEngine(QQmlEngine *engine, const char *uri) { Q_UNUSED(uri); Q_UNUSED(engine); } void ExtinctAnimalsPlugin::registerTypes(const char *uri) { Q_ASSERT(uri == QLatin1String("Extinct.Animals")); qmlRegisterType(); qmlRegisterType(uri, 1, 0, "Smilodon"); qmlRegisterType(uri, 0, 1, "ScimitarCat"); qmlRegisterType(QUrl(baseUrl().toString() + "/Andrewsarchus.qml"), uri, 0, 1, "Andrewsarchus"); // The second call overrrides the previous one, only the last version will show up qmlRegisterType(QUrl(baseUrl().toString() + "/Paratriisodon.qml"), uri, 2, 0, "Andrewsarchus"); qmlRegisterType(QUrl("qrc:///ea/Paratriisodon.qml"), uri, 2, 3, "AndrewsarchusMongoliensis"); // The second call overrrides the previous one, only the last version will show up qmlRegisterType(QUrl("qrc:///ea/Paratriisodon.qml"), uri, 2, 4, "AndrewsarchusMongoliensis"); qmlRegisterSingletonType(uri, 1, 0, "Pangaea", registerPangaea); qmlRegisterSingletonType(uri, 4, 0, "Pangaea", registerPangaea4); qmlRegisterUncreatableType(uri, 4, 1, "Europe", ""); qmlRegisterUncreatableType(uri, 4, 2, "Europe", ""); qmlRegisterExtendedType(uri, 3, 3, "QQuickImageBase"); } ./tests/api/Extinct/Animals/plugin/europe.cpp0000644000015600001650000000336312700370701021315 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #include "europe.h" /*! * \qmltype Ubuntu * \instantiates EAEurope * \inqmlmodule Extinct.Animals 1.2 * \ingroup ubuntu * \since Extinct.Animals 1.2 * \brief Provides global object with different enums. * * \section2 Enums * * \section4 ModernContinent enum * The enumeration identifies the modern concept of a continent. * \table * \header * \li Enum * \li Description * \row * \li America * \li Originally part of Laurasia, Laurentia split from Eurasia, now known as America. * \row * \li Europe * \li The second smallest continent today, part of Eurasia. * \endtable */ EAEurope::EAEurope(QObject *parent) : QObject(parent) { } /*! * \qmlproperty uint16 Extinct::era * \since Extinct.Animals 4.2 * \readonly * The property holds the tectonic formation of the current continent. */ /*! * \qmlmethod uint16 Extinct::era(int year) * \since Extinct.Animals 4.2 * The function builds a tectonic identifier using the year. */ quint16 EAEurope42::era(quint8 year) { Q_UNUSED(year); return 0; } ./tests/api/Extinct/Animals/plugin/tarpan.h0000644000015600001650000000221712700370701020745 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #ifndef UCTARPAN_H #define UCTARPAN_H #include #include class EATarpan : public QObject { Q_OBJECT Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) public: explicit EATarpan(QObject *parent = 0); QString name() const; void setName(const QString &name); Q_INVOKABLE void kick() const; Q_SIGNALS: void nameChanged(); private: QString m_name; }; #endif // UCTARPAN_H ./tests/api/Extinct/Animals/plugin/tarpan.cpp0000644000015600001650000000253512700370701021303 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #include "tarpan.h" /*! * \qmltype EATarpan * \instantiates EATarpan * \inqmlmodule Extinct.Animals 1.0 * \ingroup ubuntu-commandline * \brief The Tarpan class specifies the behavior of a Eurasian wild horse. */ EATarpan::EATarpan(QObject *parent) : QObject(parent) { } /*! * \qmlproperty string EATarpan::name * * Name identifying the wild horse. * */ QString EATarpan::name() const { return m_name; } void EATarpan::setName(const QString &name) { m_name = name; Q_EMIT(nameChanged()); } /*! * \qmlmethod string EATarpan::kick() * * A generous kick, commonly towards someone's groin area. * */ void EATarpan::kick() const { } ./tests/api/Extinct/Animals/plugin/europe.h0000644000015600001650000000265712700370701020767 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #ifndef EA_EUROPE_H #define EA_EUROPE_H #include class EAEurope : public QObject { Q_OBJECT Q_ENUMS(ModernContinent) public: static EAEurope& instance() { static EAEurope instance; return instance; } enum ModernContinent { America, Europe, }; explicit EAEurope(QObject *parent = 0); }; class EAEurope42 : public EAEurope { Q_OBJECT Q_PROPERTY(quint16 era READ era NOTIFY eraChanged REVISION 1) public: explicit EAEurope42(QObject *parent = 0) : EAEurope(parent) { } Q_INVOKABLE quint16 era(quint8 year); Q_SIGNALS: void eraChanged(); protected: virtual quint16 era() const { return 0; } }; #endif // EA_EUROPE_H ./tests/api/Extinct/Animals/plugin/plugin.pri0000644000015600001650000000123112700370701021314 0ustar jenkinsjenkinsQT *= core-private qml qml-private quick quick-private gui-private equals(QT_MAJOR_VERSION, 5):lessThan(QT_MINOR_VERSION, 2) { QT *= v8-private } CONFIG += no_keywords DEFINES += UBUNTU_QML_IMPORT_PATH='\\"$${ROOT_BUILD_DIR}/qml\\"' DEFINES += QT_USE_QSTRINGBUILDER TARGET = $$qtLibraryTarget($$TARGET) uri = Extinct.Animals HEADERS += \ $$PWD/plugin.h \ $$PWD/tarpan.h \ $$PWD/smilodon.h \ $$PWD/pangaea.h \ $$PWD/rune.h \ $$PWD/europe.h \ SOURCES += \ $$PWD/plugin.cpp \ $$PWD/tarpan.cpp \ $$PWD/smilodon.cpp \ $$PWD/pangaea.cpp \ $$PWD/rune.cpp \ $$PWD/europe.cpp \ RESOURCES += \ $$PWD/plugin.qrc ./tests/api/Extinct/Animals/plugin/pangaea.h0000644000015600001650000000267012700370701021057 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #ifndef EA_PANGAEA_H #define EA_PANGAEA_H #include class EAPangaea : public QObject { Q_OBJECT Q_ENUMS(ModernContinent) public: static EAPangaea& instance() { static EAPangaea instance; return instance; } enum ModernContinent { America, Europe, }; explicit EAPangaea(QObject *parent = 0); }; class EAPangaea4 : public EAPangaea { Q_OBJECT Q_PROPERTY(quint16 era READ era NOTIFY eraChanged REVISION 1) public: explicit EAPangaea4(QObject *parent = 0) : EAPangaea(parent) { } Q_INVOKABLE quint16 era(quint8 year); Q_SIGNALS: void eraChanged(); protected: virtual quint16 era() const { return 0; } }; #endif // EA_PANGAEA_H ./tests/api/Extinct/Animals/Gigantophis.qml0000644000015600001650000000156412700370701021004 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Extinct.Animals 4.2 Titanoboa { // Overridden property string eggs: "brown spotted" function first() { console.log('Hihi!') } // New API property bool extinct: true function fourth() { } } ./tests/api/Extinct/Animals/Andrewsarchus.qml0000644000015600001650000000135712700370701021341 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 Item { id: body /*! \qmlproperty real skullSize */ property real skullSize } ./tests/api/Extinct/Animals/Animals.pro0000644000015600001650000000006012700370701020111 0ustar jenkinsjenkinsTEMPLATE = subdirs SUBDIRS += AnimalModule.pro ./tests/api/Extinct/Animals/test.qml0000644000015600001650000000320312700370701017477 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 Item { id: foo property string spam /*! \qmlproperty string eggs */ property string eggs: "white" /*! \qmlproperty string bar \since Extinct.Animals 1.1 */ property alias bar: foo.eggs /*! \internal */ property var basket: ['brown', 'white'] property list buckets states: [ State { name: "" } ] signal jump() /*! \since 2.2 */ signal bounce(int length) /*! \qmlproperty url bazz */ property url bazz:"http://example.com" /*! \qmlmethod void fly(Wing wing) */ signal fly(var wing) function first() { console.log('Haha!') } /*! \since 3.3 */ function second(sliff) { } function third(sloff) { } // Member name may overlap with internal name in apicheck property var type property var version Item { id: one function two() { } function three() { } } } ./tests/api/Extinct/Animals/qmldir0000644000015600001650000000042512700370701017223 0ustar jenkinsjenkinsmodule Extinct.Animals plugin ExtinctAnimals Titanoboa 4.2 test.qml Gigantophis 4.3 Gigantophis.qml internal WoollyMammoth mammoth.qml MonsterSnake 3.1 test.qml Excavator 1.0 digger.js Excavator 1.1 qrc:///ea/digger.js AndrewsarchusMongoliensis 2.5 qrc:///ea/Paratriisodon.qml ./tests/api/api.pro0000644000015600001650000000015212700370701014276 0ustar jenkinsjenkinsTEMPLATE = subdirs SUBDIRS = Extinct OTHER_FILES += test.sh check.commands += $$PWD/test.sh || exit 1; ./tests/api/test.sh0000755000015600001650000000236212700370701014326 0ustar jenkinsjenkins#!/usr/bin/env sh # # Copyright 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # ################################################################################ . `dirname $0`/../../build_paths.inc if [ ! -e $BUILD_DIR/apicheck/apicheck ]; then echo API check tool not built! exit 1 elif [ ! -e $BUILD_DIR/qml/Extinct/Animals/libExtinctAnimals.so ]; then echo You need to build Extinct.Animals before you can dump QML API! exit 1 fi echo Self-testing API dump env QML2_IMPORT_PATH=$BUILD_DIR/qml \ $BUILD_DIR/apicheck/apicheck --qml Extinct.Animals | \ diff -F '[.0-9]' -u $SRC_DIR/tests/api/components.api - test $? != 0 && echo Error: Mismatch && exit 1 echo All fine. ./tests/api/components.api0000644000015600001650000000267712700370701015701 0ustar jenkinsjenkinsExtinct.Animals.Andrewsarchus 2.0 Paratriisodon: Item property double saggitalCrestSize property double skullSize Extinct.Animals.AndrewsarchusMongoliensis 2.5 Paratriisodon: Item property double saggitalCrestSize property double skullSize EATarpan: QtObject function kick() property string name Extinct.Animals.Europe 4.1: QtObject Extinct.Animals.Europe 4.2: Europe readonly property ushort era 4.2 function ushort era(uchar year) Extinct.Animals.Europe.ModernContinent: Enum America Europe Extinct.Animals.Excavator 1.0 1.1 Extinct.Animals.Gigantophis 4.3: QQuickItem property bool extinct function var first() function var fourth() Extinct.Animals.Pangaea 1.0: QtObject singleton Extinct.Animals.Pangaea 4.0: Pangaea singleton readonly property ushort era 4.0 function ushort era(uchar year) Extinct.Animals.Pangaea.ModernContinent: Enum America Europe Extinct.Animals.Smilodon 1.0 ScimitarCat 0.1 EASmilodon: QtObject function string paw(int i) property string name Extinct.Animals.Titanoboa 4.2 MonsterSnake 3.1 test: Item property string bar property var basket property url bazz property list buckets property string eggs signal jump() signal bounce(int length) signal fly(var wing) function var first() function var second(var sliff) function var third(var sloff) property string spam property var type property var version ./tests/tests.pro0000644000015600001650000000060412700370714014124 0ustar jenkinsjenkinsTEMPLATE = subdirs SUBDIRS += unit unit_x11 autopilot autopilot_module.path = $$[QT_INSTALL_PREFIX]/lib/python3/dist-packages/ubuntuuitoolkit autopilot_module.files = autopilot/ubuntuuitoolkit/* SUBDIRS += Gallery api INSTALLS += autopilot_module OTHER_FILES += qmlapicheck.sh check.commands += $$PWD/packaging-sorting.sh || exit 1; check.commands += $$PWD/qmlapicheck.sh || exit 1; ./tests/unit_x11/0000755000015600001650000000000012700370716013712 5ustar jenkinsjenkins./tests/unit_x11/test-include.pri0000644000015600001650000000025312700370701017020 0ustar jenkinsjenkinsinclude( ../unit/plugin_dependency.pri ) include( layout_dependency.pri ) include( add_makecheck.pri ) TEMPLATE = app QT += testlib qml quick CONFIG += no_keywords c++11 ./tests/unit_x11/tst_asyncloader/0000755000015600001650000000000012700370716017110 5ustar jenkinsjenkins./tests/unit_x11/tst_asyncloader/Document.qml0000644000015600001650000000152512700370714021402 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Column { anchors.fill: parent spacing: 1 Repeater { model: 200 TextField { width: parent.width } } } ./tests/unit_x11/tst_asyncloader/FaultyDocument.qml0000644000015600001650000000124712700370714022570 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 Label {} ./tests/unit_x11/tst_asyncloader/tst_asyncloader.cpp0000644000015600001650000002466212700370714023022 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include "uctestcase.h" #include "uctestextras.h" #include #include #include class LoaderSpy : public QObject { Q_OBJECT public: UbuntuToolkit::AsyncLoader *m_loader; QScopedPointer m_object; bool m_done = false; bool m_error = false; QList m_statusList; public: LoaderSpy(UbuntuToolkit::AsyncLoader *loader) : QObject(0) , m_loader(loader) { connect(loader, &UbuntuToolkit::AsyncLoader::loadingStatus, this, &LoaderSpy::onLoadingStatusChanged); } protected Q_SLOTS: virtual void onLoadingStatusChanged(UbuntuToolkit::AsyncLoader::LoadingStatus status, QObject *object) { m_statusList << status; if (status == UbuntuToolkit::AsyncLoader::Ready) { m_done = true; m_object.reset(object); } if (status == UbuntuToolkit::AsyncLoader::Error) { m_error = true; } } }; class ResetLoaderSpy : public LoaderSpy { Q_OBJECT public: bool m_reset = false; public: ResetLoaderSpy(UbuntuToolkit::AsyncLoader *loader) : LoaderSpy(loader) { } void onLoadingStatusChanged(UbuntuToolkit::AsyncLoader::LoadingStatus status, QObject *object) override { if (status == UbuntuToolkit::AsyncLoader::Loading) { m_loader->reset(); m_reset = true; } LoaderSpy::onLoadingStatusChanged(status, object); } }; class SecondLoaderSpy : public LoaderSpy { Q_OBJECT public: bool m_loadResult = false; public: SecondLoaderSpy(UbuntuToolkit::AsyncLoader *loader, UbuntuToolkit::AsyncLoader::LoadingStatus loadAt, const QUrl &url, QQmlContext *context) : LoaderSpy(loader) , m_loadAt(loadAt) , m_url(url) , m_context(context) { } void onLoadingStatusChanged(UbuntuToolkit::AsyncLoader::LoadingStatus status, QObject *object) override { if (status == (UbuntuToolkit::AsyncLoader::LoadingStatus)m_loadAt) { m_loadAt = -1; delete object; object = nullptr; m_loadResult = m_loader->load(m_url, m_context); } LoaderSpy::onLoadingStatusChanged(status, object); } private: int m_loadAt; QUrl m_url; QQmlContext *m_context; }; /******************************************************************** * Test ********************************************************************/ class tst_AsyncLoader : public QObject { Q_OBJECT private Q_SLOTS: void test_load_data() { QTest::addColumn("loadAsDocument"); QTest::addColumn("document"); QTest::addColumn("mode"); QTest::addColumn< QList >("statuses"); QTest::newRow("document") << true << "Document.qml" << (int)QQmlComponent::Asynchronous << (QList() << UbuntuToolkit::AsyncLoader::Compiling << UbuntuToolkit::AsyncLoader::Loading << UbuntuToolkit::AsyncLoader::Initializing << UbuntuToolkit::AsyncLoader::Ready ); QTest::newRow("component, asynchronous") << false << "Document.qml" << (int)QQmlComponent::Asynchronous << (QList() << UbuntuToolkit::AsyncLoader::Compiling << UbuntuToolkit::AsyncLoader::Loading << UbuntuToolkit::AsyncLoader::Initializing << UbuntuToolkit::AsyncLoader::Ready ); QTest::newRow("component, synchronous") << false << "Document.qml" << (int)QQmlComponent::PreferSynchronous << (QList() << UbuntuToolkit::AsyncLoader::Loading << UbuntuToolkit::AsyncLoader::Initializing << UbuntuToolkit::AsyncLoader::Ready ); } void test_load() { QFETCH(bool, loadAsDocument); QFETCH(QString, document); QFETCH(int, mode); QFETCH(QList, statuses); QScopedPointer view(new UbuntuTestCase("TestApp.qml")); UbuntuToolkit::AsyncLoader loader; LoaderSpy spy(&loader); QScopedPointer component; if (loadAsDocument) { loader.load(QUrl::fromLocalFile(document), view->rootContext()); } else { // create a component component.reset(new QQmlComponent(view->engine(), QUrl::fromLocalFile(document), (QQmlComponent::CompilationMode)mode)); loader.load(component.data(), view->rootContext()); } QTRY_VERIFY(spy.m_object != nullptr); // check the statuses QCOMPARE(spy.m_statusList.length(), statuses.length()); for (int i = 0; i < spy.m_statusList.length(); i++) { QVERIFY2((int)spy.m_statusList[i] == statuses[i], (QString(" Status at index %1 differs").arg(i)).toLocal8Bit().constData()); } } void test_load_with_error() { QUrl document = QUrl::fromLocalFile("FaultyDocument.qml"); UbuntuTestCase::ignoreWarning("FaultyDocument.qml", 20, "Label is not a type"); QScopedPointer view(new UbuntuTestCase("TestApp.qml")); UbuntuToolkit::AsyncLoader loader; LoaderSpy spy(&loader); loader.load(document, view->rootContext()); QTRY_VERIFY(spy.m_error == true); } void test_load_no_context() { UbuntuToolkit::AsyncLoader loader; QVERIFY(!loader.load(nullptr, nullptr)); QVERIFY(!loader.load(QUrl(), nullptr)); } void test_load_invalid_url() { QQmlEngine engine; UbuntuToolkit::AsyncLoader loader; LoaderSpy spy(&loader); QVERIFY(!loader.load(QUrl(), engine.rootContext())); } void test_load_null_component() { QQmlEngine engine; UbuntuToolkit::AsyncLoader loader; LoaderSpy spy(&loader); QVERIFY(!loader.load(nullptr, engine.rootContext())); } void test_load_and_cancel_data() { QTest::addColumn("loadAsDocument"); QTest::addColumn("document"); QTest::addColumn("mode"); QTest::newRow("document") << true << "HeavyDocument.qml" << (int)QQmlComponent::Asynchronous; QTest::newRow("component, asynchronous") << false << "HeavyDocument.qml" << (int)QQmlComponent::Asynchronous; QTest::newRow("component, synchronous") << false << "HeavyDocument.qml" << (int)QQmlComponent::PreferSynchronous; } void test_load_and_cancel() { QFETCH(bool, loadAsDocument); QFETCH(QString, document); QFETCH(int, mode); QScopedPointer view(new UbuntuTestCase("TestApp.qml")); UbuntuToolkit::AsyncLoader loader; ResetLoaderSpy spy(&loader); QScopedPointer component; if (loadAsDocument) { loader.load(QUrl::fromLocalFile(document), view->rootContext()); } else { // create a component component.reset(new QQmlComponent(view->engine(), QUrl::fromLocalFile(document), (QQmlComponent::CompilationMode)mode)); loader.load(component.data(), view->rootContext()); } if (loader.status() < UbuntuToolkit::AsyncLoader::Loading) { // cannot reset yet! QVERIFY(!loader.reset()); } QTRY_VERIFY(spy.m_reset); } void test_second_load_scenarios_data() { QTest::addColumn ("doc1"); QTest::addColumn ("doc2"); QTest::addColumn ("when"); QTest::addColumn ("success"); QTest::newRow("status = Compiling") << "Document.qml" << "HeavyDocument.qml" << (int)UbuntuToolkit::AsyncLoader::Compiling << false; QTest::newRow("status = Loading") << "Document.qml" << "HeavyDocument.qml" << (int)UbuntuToolkit::AsyncLoader::Loading << true; QTest::newRow("status = Initializing") << "Document.qml" << "HeavyDocument.qml" << (int)UbuntuToolkit::AsyncLoader::Initializing << true; QTest::newRow("status = Ready") << "Document.qml" << "HeavyDocument.qml" << (int)UbuntuToolkit::AsyncLoader::Ready << true; QTest::newRow("status = Error") << "FaultyDocument.qml" << "HeavyDocument.qml" << (int)UbuntuToolkit::AsyncLoader::Error << true; } void test_second_load_scenarios() { QFETCH(QString, doc1); QFETCH(QString, doc2); QFETCH(int, when); QFETCH(bool, success); QScopedPointer view(new UbuntuTestCase("TestApp.qml")); UbuntuToolkit::AsyncLoader loader; if (when == (int)UbuntuToolkit::AsyncLoader::Error) { UbuntuTestCase::ignoreWarning("FaultyDocument.qml", 20, "Label is not a type"); } SecondLoaderSpy spy(&loader, (UbuntuToolkit::AsyncLoader::LoadingStatus)when, QUrl::fromLocalFile(doc2), view->rootContext()); // load the first document QVERIFY(loader.load(QUrl::fromLocalFile(doc1), view->rootContext())); QTRY_VERIFY(spy.m_object != nullptr); QCOMPARE(spy.m_loadResult, success); } }; QTEST_MAIN(tst_AsyncLoader) #include "tst_asyncloader.moc" ./tests/unit_x11/tst_asyncloader/TestApp.qml0000644000015600001650000000125012700370714021177 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 Item { } ./tests/unit_x11/tst_asyncloader/HeavyDocument.qml0000644000015600001650000000153712700370714022402 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Column { anchors.fill: parent spacing: units.dp(1) Repeater { model: 200 TextField { width: parent.width } } } ./tests/unit_x11/tst_asyncloader/tst_asyncloader.pro0000644000015600001650000000035612700370714023032 0ustar jenkinsjenkinsinclude(../test-include.pri) QT += core-private qml-private quick-private gui-private UbuntuToolkit SOURCES += \ tst_asyncloader.cpp DISTFILES += \ Document.qml \ TestApp.qml \ HeavyDocument.qml \ FaultyDocument.qml ./tests/unit_x11/tst_layouts/0000755000015600001650000000000012700370701016276 5ustar jenkinsjenkins./tests/unit_x11/tst_layouts/DialerCrash.qml0000644000015600001650000000261612700370701021177 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Pickers 1.0 import Ubuntu.Layouts 1.0 MainView { width: units.gu(40) height: units.gu(71) backgroundColor: "#A55263" property bool wide: true Layouts { objectName: "layoutManager" layouts: [ ConditionalLayout { name: "wideAspect" when: wide ItemLayout { item: "object1" } }, ConditionalLayout { name: "regularAspect" when: !wide ItemLayout { item: "object2" } } ] Dialer { Layouts.item: "object1" } } } ./tests/unit_x11/tst_layouts/ResizingContainers.qml0000644000015600001650000000636512700370701022643 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Layouts 1.0 Item { id: root width: units.gu(40) height: units.gu(30) property alias currentLayout: layouts.currentLayout Layouts { objectName: "layouts" id: layouts anchors.fill: parent layouts: [ ConditionalLayout { name: "xlarge" when: layouts.width >= units.gu(80) Column { anchors.fill: parent ItemLayout { item: "item1" width: units.gu(30) height: units.gu(30) } ItemLayout { item: "item3" width: units.gu(30) height: units.gu(30) } ItemLayout { item: "item2" width: units.gu(40) height: units.gu(50) } } }, ConditionalLayout { name: "large" when: layouts.width >= units.gu(60) Column { anchors.fill: parent ItemLayout { item: "item1" width: units.gu(22) height: units.gu(22) } ItemLayout { item: "item2" width: units.gu(22) height: units.gu(22) } ItemLayout { item: "item3" width: units.gu(22) height: units.gu(22) } } }, ConditionalLayout { name: "small" when: layouts.width > units.gu(40) Row { anchors.fill: parent ItemLayout { item: "item1" width: units.gu(10) height: units.gu(10) } ItemLayout { item: "item2" width: units.gu(10) height: units.gu(10) } ItemLayout { item: "item3" width: units.gu(10) height: units.gu(10) } } } ] // default layout SizedDefaultLayout{ } } } ./tests/unit_x11/tst_layouts/LaidOutItemsOutsideOfLayout.qml0000644000015600001650000000247412700370701024403 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 360 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "portrait" when: root.width < root.height ItemLayout { item: "red" anchors.right: parent.right anchors.bottom: parent.bottom } } ] } Rectangle { objectName: "itemLaidOut" width: 40 height: 30 color: "red" Layouts.item: "red" } } ./tests/unit_x11/tst_layouts/SizedDefaultLayout.qml0000644000015600001650000000301612700370701022572 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Layouts 1.0 Item { objectName: "defaultLayout" anchors.fill: parent Button { objectName: "item1" id: label1 Layouts.item: "item1" text: "item1" anchors { left: parent.left right: parent.right } } Button { objectName: "item2" id: label2 anchors.bottom: label1.bottom Layouts.item: "item2" text: "item2" anchors { left: parent.left top: label1.bottom right: parent.right } } Button { objectName: "item3" id: label3 anchors.bottom: label2.bottom Layouts.item: "item3" text: "item3" anchors { left: parent.left top: label2.bottom right: parent.right } } } ./tests/unit_x11/tst_layouts/ItemInstanceAsProperty.qml0000644000015600001650000000322112700370701023423 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Layouts 1.0 Item { property bool wide: true width: units.gu(40) height: units.gu(71) function changeLayout() { loader.sourceComponent = undefined; wide = false } Layouts { objectName: "layoutManager" layouts: [ ConditionalLayout { name: "wideAspect" when: wide ItemLayout { item: "object1" } }, ConditionalLayout { name: "regularAspect" when: !wide ItemLayout { item: "object2" anchors.left: parent.left } } ] Item { Layouts.item: "object1" Loader { id: loader sourceComponent: ShaderEffectSource { sourceItem: Item { } } } } } } ./tests/unit_x11/tst_layouts/ExcludedItemDeleted.qml0000644000015600001650000000337712700370701022666 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Layouts 1.0 Item { property bool wide: true width: units.gu(40) height: units.gu(71) function changeLayout() { loader2.sourceComponent = undefined; wide = false } Layouts { objectName: "layoutManager" layouts: [ ConditionalLayout { name: "wideAspect" when: wide ItemLayout { item: "object1" } }, ConditionalLayout { name: "regularAspect" when: !wide ItemLayout { item: "object1" anchors.left: parent.left } } ] Column { Loader { Layouts.item: "object1" id: loader sourceComponent: ShaderEffectSource { sourceItem: Item { } } } Loader { id: loader2 sourceComponent: Item{} } } } } ./tests/unit_x11/tst_layouts/AnchorRight.qml0000644000015600001650000000263112700370701021223 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 300 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "landscape" when: root.width > root.height ItemLayout { objectName: "testLayout" anchors.fill: parent item: "test" } } ] Rectangle { width: 100 height: 100 color: "red" objectName: "testItem" Layouts.item: "test" anchors.right: parent.right anchors.rightMargin: 10 } } } ./tests/unit_x11/tst_layouts/PositioningOnLayoutChange.qml0000644000015600001650000000275712700370701024127 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 360 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "portrait" when: root.width < root.height ItemLayout { item: "red" anchors.right: parent.right anchors.bottom: parent.bottom } }, ConditionalLayout { name: "landscape" when: root.width > root.height } ] Rectangle { anchors.fill: parent; color: 'yellow'} Rectangle { width: 40 height: 30 color: "red" Layouts.item: "red" } } } ./tests/unit_x11/tst_layouts/AnchorCenteredInDefault.qml0000644000015600001650000000256212700370701023476 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 300 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "landscape" when: root.width > root.height ItemLayout { objectName: "testLayout" anchors.fill: parent item: "test" } } ] Rectangle { width: 100 height: 100 color: "red" objectName: "testItem" Layouts.item: "test" anchors.centerIn: parent } } } ./tests/unit_x11/tst_layouts/AnchorLeft.qml0000644000015600001650000000262612700370701021044 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 300 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "landscape" when: root.width > root.height ItemLayout { objectName: "testLayout" anchors.fill: parent item: "test" } } ] Rectangle { width: 100 height: 100 color: "red" objectName: "testItem" Layouts.item: "test" anchors.left: parent.left anchors.leftMargin: 10 } } } ./tests/unit_x11/tst_layouts/Visibility.qml0000644000015600001650000000522112700370701021140 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 import Ubuntu.Layouts 1.0 MainView { id: main objectName: "mainView" applicationName: "test-app" /* This property enables the application to change orientation when the device is rotated. The default is false. */ automaticOrientation: true // TODO: support wide aspect ratios, esp. on prepareGamePage property bool boundValue: true width: units.gu(100) height: units.gu(75) function portraitLayout() { width = units.gu(50); } function landscapeLayout() { width = units.gu(100); } PageStack { Component.onCompleted: push(testPage) Page { title: i18n.tr("Conditional Layouts with PageStack") id: testPage visible: false Layouts { id: layouts objectName: "layoutManager" width: parent.width height: parent.height layouts: [ ConditionalLayout { name: "wide" when: layouts.width < units.gu(60) UbuntuShape { width: units.gu(20) height: units.gu(20) backgroundColor: "red" Label { text: "wide" } } } ] // This is a default layout. // When using a PageStack and layouts is not empty, it won't display or switch to the default layout. // However it only works when putting it into the layouts list with an inversed condition. UbuntuShape { objectName: "DefaultLayout" width: units.gu(20) height: units.gu(20) backgroundColor: "green" visible: main.boundValue Label { text: "default" } } } } } } ./tests/unit_x11/tst_layouts/AnchorHorizontalCenterOffset.qml0000644000015600001650000000267412700370701024616 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 300 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "landscape" when: root.width > root.height ItemLayout { objectName: "testLayout" anchors.fill: parent item: "test" } } ] Rectangle { width: 100 height: 100 color: "red" objectName: "testItem" Layouts.item: "test" anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenterOffset: 50.0 } } } ./tests/unit_x11/tst_layouts/NestedLayouts.qml0000644000015600001650000000411112700370701021611 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Layouts 1.0 Item { id: root width: units.gu(40) height: units.gu(30) property string nestedLayout: "" Layouts { objectName: "layouts" id: layouts anchors.fill: parent layouts: [ ConditionalLayout { name: "extra-large" when: layouts.width > units.gu(80) Item { anchors.fill: parent Item { id: header ItemLayout { item: "item3" } } Row { anchors.fill: parent anchors.topMargin: header.height ItemLayout { item: "item1" } ItemLayout { item: "item2" } } } }, ConditionalLayout { name: "simple" when: layouts.width <= units.gu(100) SimpleLayouts{ id: nested anchors.fill: parent onCurrentLayoutChanged: root.nestedLayout = nested.currentLayout } } ] // default layout DefaultLayout{ } } } ./tests/unit_x11/tst_layouts/AnchorFilledMargins.qml0000644000015600001650000000253712700370701022673 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 300 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "landscape" when: root.width > root.height ItemLayout { objectName: "testLayout" anchors.fill: parent item: "test" } } ] Rectangle { color: "red" objectName: "testItem" Layouts.item: "test" anchors.fill: parent anchors.margins: 10 } } } ./tests/unit_x11/tst_layouts/tst_layouts.pro0000644000015600001650000000210312700370701021406 0ustar jenkinsjenkinsinclude(../test-include.pri) include(../../unit/qtprivate_dependency.pri) QT += gui SOURCES += \ tst_layouts.cpp OTHER_FILES += \ SimpleLayouts.qml \ NoLayouts.qml \ OverlappingCondition.qml \ SmallLayout.qml \ MediumLayout.qml \ LargeLayout.qml \ ExternalLayouts.qml \ NestedLayouts.qml \ DefaultLayout.qml \ ResizingContainers.qml \ SizedDefaultLayout.qml \ CurrentLayoutChange.qml \ PositioningOnLayoutChange.qml \ LaidOutItemsOutsideOfLayout.qml \ OverlaidInItemLayout.qml \ AnchorFilledReparenting.qml \ AnchorCenteredInDefault.qml \ AnchorFilledMargins.qml \ AnchorFilledSeparateMargins.qml \ AnchorVerticalCenter.qml \ AnchorVerticalCenterOffset.qml \ AnchorCenterWithOffset.qml \ AnchorHorizontalCenter.qml \ AnchorHorizontalCenterOffset.qml \ AnchorLeft.qml \ AnchorRight.qml \ AnchorTop.qml \ AnchorBottom.qml \ AnchorAll.qml \ ItemInstanceAsProperty.qml \ DialerCrash.qml \ ExcludedItemDeleted.qml \ Visibility.qml \ NestedVisibility.qml ./tests/unit_x11/tst_layouts/NestedVisibility.qml0000644000015600001650000001444612700370701022314 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Layouts 1.0 MainView { id: main objectName: "mainView" applicationName: "test-app" /* This property enables the application to change orientation when the device is rotated. The default is false. */ automaticOrientation: true // TODO: support wide aspect ratios, esp. on prepareGamePage width: units.gu(40) height: units.gu(75) function phoneLayout() { width = units.gu(50); } function tabletPortraitLayout() { width = units.gu(70); } function tabletLandscapeLayout() { width = units.gu(100); } PageStack { Component.onCompleted: push(testPage) Page { title: i18n.tr("Conditional Layouts with PageStack") id: testPage visible: false Layouts { id: layouts objectName: "mainLayout" width: parent.width height: parent.height layouts: [ ConditionalLayout { name: "tabletPortrait" when: main.width > units.gu(50) Layouts { anchors.fill: parent objectName: "nestedLayout" layouts: [ ConditionalLayout { name: "tabletLandscape" when: main.width > units.gu(70) Row { objectName: "tabletLandscape" anchors.fill: parent Rectangle { height: parent.height color: "white" width: parent.width / 5 } Flow { spacing: units.gu(2) ItemLayout { objectName: "nestedMagentaContainer" item: "mainMagenta" width: units.gu(20) height: width } ItemLayout { objectName: "nestedGreenContainer" item: "mainGreen" width: units.gu(60) height: width } } } } ] // Default layout, but can have ItemLayouts // as those will belong to the previous Layouts // and attaching Layouts.item we can layout it further Flow { objectName: "tabletPortrait" anchors.fill: parent ItemLayout { objectName: "greenContainer" item: "mainGreen" width: units.gu(40) height: width Layouts.item: item } ItemLayout { objectName: "magentaContainer" item: "mainMagenta" width: units.gu(60) height: width Layouts.item: item } } } } ] // default layout for mainLayout Flow { objectName: "mainDefaultLayout" anchors.fill: parent Rectangle { objectName: "mainRed" width: units.gu(15) height: width color: "red" Layouts.item: "mainRed" } Rectangle { objectName: "mainGreen" width: units.gu(15) height: width color: "green" Layouts.item: "mainGreen" } Rectangle { objectName: "mainBlue" width: units.gu(15) height: width color: "blue" Layouts.item: "mainBlue" } Rectangle { objectName: "mainMagenta" width: units.gu(15) height: width color: "magenta" Layouts.item: "mainMagenta" } Rectangle { objectName: "mainHidden" width: units.gu(15) height: width color: "yellow" visible: false } } } } } } ./tests/unit_x11/tst_layouts/SimpleLayouts.qml0000644000015600001650000000475512700370701021636 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Layouts 1.0 Item { id: root width: units.gu(40) height: units.gu(30) property alias currentLayout: layouts.currentLayout Layouts { objectName: "layouts" id: layouts anchors.fill: parent layouts: [ ConditionalLayout { name: "small" when: layouts.width <= units.gu(40) Column { anchors.fill: parent ItemLayout { item: "item1" } ItemLayout { item: "item2" } ItemLayout { item: "item3" } } }, ConditionalLayout { name: "medium" when: layouts.width > units.gu(40) && layouts.width <= units.gu(60) Flow { anchors.fill: parent ItemLayout { item: "item1" } ItemLayout { item: "item2" } ItemLayout { item: "item3" } } }, ConditionalLayout { name: "large" when: layouts.width > units.gu(60) Row { anchors.fill: parent ItemLayout { item: "item1" } ItemLayout { item: "item2" } ItemLayout { item: "item3" } } } ] // default layout DefaultLayout{ } } } ./tests/unit_x11/tst_layouts/AnchorBottom.qml0000644000015600001650000000263412700370701021415 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 300 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "landscape" when: root.width > root.height ItemLayout { objectName: "testLayout" anchors.fill: parent item: "test" } } ] Rectangle { width: 100 height: 100 color: "red" objectName: "testItem" Layouts.item: "test" anchors.bottom: parent.bottom anchors.bottomMargin: 10 } } } ./tests/unit_x11/tst_layouts/DefaultLayout.qml0000644000015600001650000000227712700370701021603 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Layouts 1.0 Item { objectName: "defaultLayout" anchors.fill: parent Label { objectName: "item1" id: label1 Layouts.item: "item1" text: "item1" } Label { objectName: "item2" id: label2 anchors.bottom: label1.bottom Layouts.item: "item2" text: "item2" } Label { objectName: "item3" id: label3 anchors.bottom: label2.bottom Layouts.item: "item3" text: "item3" } } ./tests/unit_x11/tst_layouts/AnchorTop.qml0000644000015600001650000000262312700370701020711 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 300 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "landscape" when: root.width > root.height ItemLayout { objectName: "testLayout" anchors.fill: parent item: "test" } } ] Rectangle { width: 100 height: 100 color: "red" objectName: "testItem" Layouts.item: "test" anchors.top: parent.top anchors.topMargin: 10 } } } ./tests/unit_x11/tst_layouts/AnchorFilledReparenting.qml0000644000015600001650000000247712700370701023554 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 300 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "landscape" when: root.width > root.height ItemLayout { objectName: "testLayout" anchors.fill: parent item: "test" } } ] Rectangle { color: "red" objectName: "testItem" Layouts.item: "test" anchors.fill: parent } } } ./tests/unit_x11/tst_layouts/LargeLayout.qml0000644000015600001650000000177112700370701021247 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Layouts 1.0 ConditionalLayout { name: "large" when: layouts.width > units.gu(60) Row { anchors.fill: parent ItemLayout { item: "item1" } ItemLayout { item: "item2" } ItemLayout { item: "item3" } } } ./tests/unit_x11/tst_layouts/OverlappingCondition.qml0000644000015600001650000000366312700370701023156 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Layouts 1.0 Item { id: root width: units.gu(40) height: units.gu(30) Layouts { objectName: "layouts" id: layouts anchors.fill: parent layouts: [ ConditionalLayout { name: "small" when: layouts.width <= units.gu(40) Column { anchors.fill: parent ItemLayout { item: "item1" } ItemLayout { item: "item2" } ItemLayout { item: "item3" } } }, ConditionalLayout { name: "medium" when: layouts.width >= units.gu(40) && layouts.width <= units.gu(60) Flow { anchors.fill: parent ItemLayout { item: "item1" } ItemLayout { item: "item2" } ItemLayout { item: "item3" } } } ] DefaultLayout{ } } } ./tests/unit_x11/tst_layouts/OverlaidInItemLayout.qml0000644000015600001650000000322312700370701023062 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 300 height: 360 Layouts { id: layoutManager objectName: "layoutManager" anchors.fill: parent layouts: [ ConditionalLayout { name: "portrait" when: root.width < root.height ItemLayout { objectName: "layout" item: "red" x: 20 y: 30 width: 40 height: 30 Rectangle { objectName: "overlay" width: 10 height: 10 color: "green" z: 100 } } } ] Rectangle { objectName: "hostedItem" id: red width: 40 height: 30 color: "red" Layouts.item: "red" } } } ./tests/unit_x11/tst_layouts/AnchorFilledSeparateMargins.qml0000644000015600001650000000271512700370701024356 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 300 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "landscape" when: root.width > root.height ItemLayout { objectName: "testLayout" anchors.fill: parent item: "test" } } ] Rectangle { color: "red" objectName: "testItem" Layouts.item: "test" anchors.fill: parent anchors.leftMargin: 10 anchors.topMargin: 20 anchors.rightMargin: 30 anchors.bottomMargin: 40 } } } ./tests/unit_x11/tst_layouts/SmallLayout.qml0000644000015600001650000000177512700370701021271 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Layouts 1.0 ConditionalLayout { name: "small" when: layouts.width <= units.gu(40) Column { anchors.fill: parent ItemLayout { item: "item1" } ItemLayout { item: "item2" } ItemLayout { item: "item3" } } } ./tests/unit_x11/tst_layouts/AnchorAll.qml0000644000015600001650000000301112700370701020647 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 300 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "landscape" when: root.width > root.height ItemLayout { objectName: "testLayout" anchors.fill: parent item: "test" } } ] Rectangle { width: 100 height: 100 color: "red" objectName: "testItem" Layouts.item: "test" anchors.left: parent.left anchors.top: parent.top anchors.right: parent.right anchors.bottom: parent.bottom anchors.margins: 20 } } } ./tests/unit_x11/tst_layouts/ExternalLayouts.qml0000644000015600001650000000205112700370701022152 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Layouts 1.0 Item { id: root width: units.gu(40) height: units.gu(30) Layouts { objectName: "layouts" id: layouts anchors.fill: parent layouts: [ SmallLayout{}, MediumLayout {}, LargeLayout {} ] // default layout DefaultLayout{ } } } ./tests/unit_x11/tst_layouts/NoLayouts.qml0000644000015600001650000000157512700370701020756 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Layouts 1.0 Item { id: root width: units.gu(40) height: units.gu(30) Layouts { objectName: "layouts" id: layouts anchors.fill: parent } } ./tests/unit_x11/tst_layouts/MediumLayout.qml0000644000015600001650000000203412700370701021426 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Layouts 1.0 ConditionalLayout { name: "medium" when: layouts.width > units.gu(40) && layouts.width <= units.gu(60) Flow { anchors.fill: parent ItemLayout { item: "item1" } ItemLayout { item: "item2" } ItemLayout { item: "item3" } } } ./tests/unit_x11/tst_layouts/AnchorVerticalCenterOffset.qml0000644000015600001650000000266412700370701024235 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 300 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "landscape" when: root.width > root.height ItemLayout { objectName: "testLayout" anchors.fill: parent item: "test" } } ] Rectangle { width: 100 height: 100 color: "red" objectName: "testItem" Layouts.item: "test" anchors.verticalCenter: parent.verticalCenter anchors.verticalCenterOffset: 50 } } } ./tests/unit_x11/tst_layouts/AnchorHorizontalCenter.qml0000644000015600001650000000261312700370701023440 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 300 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "landscape" when: root.width > root.height ItemLayout { objectName: "testLayout" anchors.fill: parent item: "test" } } ] Rectangle { width: 100 height: 100 color: "red" objectName: "testItem" Layouts.item: "test" anchors.horizontalCenter: parent.horizontalCenter } } } ./tests/unit_x11/tst_layouts/tst_layouts.cpp0000644000015600001650000011663712700370701021412 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include #include #include #include #include #include #include #include #include "ullayouts.h" #include "ucunits.h" #include "uctestcase.h" #include #include #define QCOMPARE_RET(actual, expected) \ do {\ if (!QTest::qCompare(actual, expected, #actual, #expected, __FILE__, __LINE__))\ return false;\ } while (0) #define QVERIFY_RET(statement, resturns) \ do {\ if (!QTest::qVerify((statement), #statement, "", __FILE__, __LINE__))\ return resturns;\ } while (0) class tst_Layouts : public QObject { Q_OBJECT private: QString m_modulePath; public: tst_Layouts() { } QQuickView * loadTest(const QString &file) { UbuntuTestCase* testCase = new UbuntuTestCase(file); return qobject_cast(testCase); } QQuickItem *testItem(QQuickItem *that, const QString &identifier) { if (that->property(identifier.toLocal8Bit()).isValid()) return that->property(identifier.toLocal8Bit()).value(); QList children = that->findChildren(identifier); return (children.count() > 0) ? children[0] : 0; } bool hasChildItem(QQuickItem *child, QQuickItem *parent) { QQuickItem *pl = child->parentItem(); while (pl) { if (pl == parent) { return true; } pl = pl->parentItem(); } return false; } QQuickItem *prevSibling(QQuickItem *item) { QList children = item->parentItem()->childItems(); int index = children.indexOf(item); return (index > 0) ? children.at(index - 1) : 0; } private Q_SLOTS: void initTestCase() { } void cleanupTestCase() { } void testCase_NoLayouts() { QScopedPointer testCase(new UbuntuTestCase("NoLayouts.qml")); ULLayouts *layouts = testCase->findItem("layouts"); QVERIFY(layouts->layoutList().isEmpty()); } void testCase_SimpleLayout() { QScopedPointer view(loadTest("SimpleLayouts.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layouts = qobject_cast(testItem(root, "layouts")); QVERIFY(layouts); QVERIFY(!layouts->layoutList().isEmpty()); QSignalSpy currentLayout(layouts, SIGNAL(currentLayoutChanged())); currentLayout.wait(300); QCOMPARE(layouts->currentLayout(), QString("small")); QQuickItem *item = testItem(root, "item1"); QVERIFY(item); QVERIFY(item->parentItem()->parentItem()->inherits("QQuickColumn")); item = testItem(root, "item2"); QVERIFY(item); QVERIFY(item->parentItem()->parentItem()->inherits("QQuickColumn")); item = testItem(root, "item3"); QVERIFY(item); QVERIFY(item->parentItem()->parentItem()->inherits("QQuickColumn")); } void testCase_SimpleLayout_Medium() { QScopedPointer view(loadTest("SimpleLayouts.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layouts = qobject_cast(testItem(root, "layouts")); QVERIFY(layouts); QVERIFY(!layouts->layoutList().isEmpty()); QSignalSpy layoutChangeSpy(layouts, SIGNAL(currentLayoutChanged())); root->setWidth(UCUnits::instance()->gu(55)); QCOMPARE(root->width(), UCUnits::instance()->gu(55)); layoutChangeSpy.wait(100); QCOMPARE(layoutChangeSpy.count(), 1); QCOMPARE(layouts->currentLayout(), QString("medium")); QQuickItem *item = testItem(root, "item1"); QVERIFY(item); QVERIFY(item->parentItem()->parentItem()->inherits("QQuickFlow")); item = testItem(root, "item2"); QVERIFY(item); QVERIFY(item->parentItem()->parentItem()->inherits("QQuickFlow")); item = testItem(root, "item3"); QVERIFY(item); QVERIFY(item->parentItem()->parentItem()->inherits("QQuickFlow")); } void testCase_SimpleLayout_Large() { QScopedPointer view(loadTest("SimpleLayouts.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layouts = qobject_cast(testItem(root, "layouts")); QVERIFY(layouts); QVERIFY(!layouts->layoutList().isEmpty()); QSignalSpy layoutChangeSpy(layouts, SIGNAL(currentLayoutChanged())); root->setWidth(UCUnits::instance()->gu(65)); QCOMPARE(root->width(), UCUnits::instance()->gu(65)); layoutChangeSpy.wait(100); QCOMPARE(layoutChangeSpy.count(), 1); QCOMPARE(layouts->currentLayout(), QString("large")); QQuickItem *item = testItem(root, "item1"); QVERIFY(item); QVERIFY(item->parentItem()->parentItem()->inherits("QQuickRow")); item = testItem(root, "item2"); QVERIFY(item); QVERIFY(item->parentItem()->parentItem()->inherits("QQuickRow")); item = testItem(root, "item3"); QVERIFY(item); QVERIFY(item->parentItem()->parentItem()->inherits("QQuickRow")); } void testCase_OverlappingCondition() { QScopedPointer view(loadTest("OverlappingCondition.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layouts = qobject_cast(testItem(root, "layouts")); QVERIFY(layouts); QVERIFY(!layouts->layoutList().isEmpty()); QSignalSpy currentLayout(layouts, SIGNAL(currentLayoutChanged())); currentLayout.wait(300); QCOMPARE(layouts->currentLayout(), QString("small")); } void testCase_ExternalLayouts() { QScopedPointer view(loadTest("ExternalLayouts.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layouts = qobject_cast(testItem(root, "layouts")); QVERIFY(layouts); QVERIFY(!layouts->layoutList().isEmpty()); QSignalSpy currentLayout(layouts, SIGNAL(currentLayoutChanged())); currentLayout.wait(300); QCOMPARE(layouts->currentLayout(), QString("small")); } void testCase_ExternalLayouts_Medium() { QScopedPointer view(loadTest("ExternalLayouts.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layouts = qobject_cast(testItem(root, "layouts")); QVERIFY(layouts); QVERIFY(!layouts->layoutList().isEmpty()); QSignalSpy layoutChangeSpy(layouts, SIGNAL(currentLayoutChanged())); root->setWidth(UCUnits::instance()->gu(55)); layoutChangeSpy.wait(100); QCOMPARE(layoutChangeSpy.count(), 1); QCOMPARE(layouts->currentLayout(), QString("medium")); } void testCase_ExternalLayouts_Large() { QScopedPointer view(loadTest("ExternalLayouts.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layouts = qobject_cast(testItem(root, "layouts")); QVERIFY(layouts); QVERIFY(!layouts->layoutList().isEmpty()); QSignalSpy layoutChangeSpy(layouts, SIGNAL(currentLayoutChanged())); root->setWidth(UCUnits::instance()->gu(65)); layoutChangeSpy.wait(100); QCOMPARE(layoutChangeSpy.count(), 1); QCOMPARE(layouts->currentLayout(), QString("large")); } void testCase_NestedLayouts() { QScopedPointer view(loadTest("NestedLayouts.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layouts = qobject_cast(testItem(root, "layouts")); QVERIFY(layouts); QVERIFY(!layouts->layoutList().isEmpty()); QSignalSpy currentLayout(layouts, SIGNAL(currentLayoutChanged())); currentLayout.wait(300); QCOMPARE(layouts->currentLayout(), QString("simple")); } void testCase_NestedLayouts_ExtraLarge() { QTest::ignoreMessage(QtWarningMsg, "\"There are still \"1\" items in the process of being created at engine destruction.\""); QScopedPointer view(loadTest("NestedLayouts.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layouts = qobject_cast(testItem(root, "layouts")); QVERIFY(layouts); QVERIFY(!layouts->layoutList().isEmpty()); QSignalSpy layoutChangeSpy(layouts, SIGNAL(currentLayoutChanged())); root->setWidth(UCUnits::instance()->gu(90)); layoutChangeSpy.wait(100); QCOMPARE(layoutChangeSpy.count(), 1); QCOMPARE(layouts->currentLayout(), QString("extra-large")); root->setWidth(UCUnits::instance()->gu(50)); layoutChangeSpy.wait(100); QCOMPARE(layoutChangeSpy.count(), 2); QCOMPARE(root->property("nestedLayout").toString(), QString("medium")); } void testCase_ResizingContainers() { QScopedPointer view(loadTest("ResizingContainers.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); // fetch the current size of one item QQuickItem *item = testItem(root, "item1"); qreal width = item->width(); qreal height = item->height(); QQuickItem *item2 = testItem(root, "item2"); qreal width2 = item2->width(); qreal height2 = item2->height(); ULLayouts *layouts = qobject_cast(testItem(root, "layouts")); QVERIFY(layouts); QVERIFY(!layouts->layoutList().isEmpty()); QSignalSpy layoutChangeSpy(layouts, SIGNAL(currentLayoutChanged())); root->setWidth(UCUnits::instance()->gu(50)); layoutChangeSpy.wait(100); QCOMPARE(layouts->currentLayout(), QString("small")); QCOMPARE(item->width(), UCUnits::instance()->gu(10)); QCOMPARE(item->height(), UCUnits::instance()->gu(10)); root->setWidth(UCUnits::instance()->gu(60)); layoutChangeSpy.wait(100); QCOMPARE(layouts->currentLayout(), QString("large")); QCOMPARE(item->width(), UCUnits::instance()->gu(22)); QCOMPARE(item->height(), UCUnits::instance()->gu(22)); root->setWidth(UCUnits::instance()->gu(80)); layoutChangeSpy.wait(100); QCOMPARE(layouts->currentLayout(), QString("xlarge")); QCOMPARE(item->width(), UCUnits::instance()->gu(30)); QCOMPARE(item->height(), UCUnits::instance()->gu(30)); QCOMPARE(item2->width(), UCUnits::instance()->gu(40)); QCOMPARE(item2->height(), UCUnits::instance()->gu(50)); root->setWidth(UCUnits::instance()->gu(40)); layoutChangeSpy.wait(100); QCOMPARE(item->width(), width); QCOMPARE(item->height(), height); QCOMPARE(item2->width(), width2); QCOMPARE(item2->height(), height2); } void testCase_CurrentLayoutChange() { UbuntuTestCase::ignoreWarning("CurrentLayoutChange.qml", 30, 13, "QML ConditionalLayout: ERROR: no container specified for layout \"portrait\". ConditionalLayout cannot be activated without a container."); UbuntuTestCase::ignoreWarning("CurrentLayoutChange.qml", 35, 13, "QML ConditionalLayout: ERROR: no container specified for layout \"landscape\". ConditionalLayout cannot be activated without a container."); UbuntuTestCase::ignoreWarning("CurrentLayoutChange.qml", 30, 13, "QML ConditionalLayout: WARNING: Cannot activate layout \"portrait\" with no container specified. Falling back to default layout."); QScopedPointer view(loadTest("CurrentLayoutChange.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layouts = qobject_cast(testItem(root, "layoutManager")); QVERIFY(layouts); QSignalSpy spy(layouts, SIGNAL(currentLayoutChanged())); root->setWidth(root->height() - 10); spy.wait(100); QEXPECT_FAIL(0, "Layout change should not happen when component is not defined", Continue); QCOMPARE(spy.count(), 1); } void testCase_PositioningOnLayoutChange() { UbuntuTestCase::ignoreWarning("PositioningOnLayoutChange.qml", 42, 13, "QML ConditionalLayout: WARNING: Cannot activate layout \"landscape\" with no container specified. Falling back to default layout.", 2); UbuntuTestCase::ignoreWarning("PositioningOnLayoutChange.qml", 42, 13, "QML ConditionalLayout: ERROR: no container specified for layout \"landscape\". ConditionalLayout cannot be activated without a container."); QScopedPointer view(loadTest("PositioningOnLayoutChange.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layouts = qobject_cast(testItem(root, "layoutManager")); QVERIFY(layouts); QSignalSpy spy(layouts, SIGNAL(currentLayoutChanged())); root->setWidth(root->height() + 10); spy.wait(100); QEXPECT_FAIL(0, "Layout change should not happen when component is not defined", Continue); QCOMPARE(spy.count(), 1); spy.clear(); root->setWidth(root->height() - 10); spy.wait(100); QCOMPARE(spy.count(), 1); } void testCase_LaidOutItemsOutsideOfLayout() { UbuntuTestCase::ignoreWarning("LaidOutItemsOutsideOfLayout.qml", 44, 5, "QML Rectangle: ERROR: Item that is not a child of a Layouts component will not be laid out."); QScopedPointer view(loadTest("LaidOutItemsOutsideOfLayout.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); QQuickItem *item = qobject_cast(testItem(root, "itemLaidOut")); QVERIFY(item); ULLayoutsAttached *marker = qobject_cast( qmlAttachedPropertiesObject(item, false)); QVERIFY(marker); QVERIFY(!marker->isValid()); } void testCase_OverlaidInItemLayout() { QScopedPointer view(loadTest("OverlaidInItemLayout.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layouts = qobject_cast(testItem(root, "layoutManager")); QVERIFY(layouts); QSignalSpy currentLayout(layouts, SIGNAL(currentLayoutChanged())); currentLayout.wait(300); QQuickItem *layout = qobject_cast(testItem(root, "layout")); QVERIFY(layout); QQuickItem *item = qobject_cast(testItem(root, "hostedItem")); QVERIFY(item); QCOMPARE(layout->childItems()[0], item); } void testCase_AnchorFilledReparenting() { QScopedPointer view(new UbuntuTestCase("AnchorFilledReparenting.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layout = view->findItem("layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); QQuickItem *item = view->findItem("testItem"); QVERIFY(item); QQuickAnchors *anchors = item->property("anchors").value(); QVERIFY(anchors); root->setWidth(root->width() + 100); layoutChangeSpy.wait(100); QQuickItem *testLayout = view->findItem("testLayout"); QVERIFY(testLayout); QCOMPARE(anchors->fill(), testLayout); root->setWidth(root->width() - 100); layoutChangeSpy.wait(100); QCOMPARE(anchors->fill(), layout->contentItem()); } void testCase_AnchorFilledMargins() { QScopedPointer view(new UbuntuTestCase("AnchorFilledMargins.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layout = view->findItem("layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); QQuickItem *item = view->findItem("testItem"); QVERIFY(item); QQuickAnchors *anchors = item->property("anchors").value(); QVERIFY(anchors); root->setWidth(root->width() + 100); layoutChangeSpy.wait(100); QQuickItem *testLayout = view->findItem("testLayout"); QVERIFY(testLayout); QCOMPARE(anchors->fill(), testLayout); QCOMPARE(anchors->margins(), 0.0); root->setWidth(root->width() - 100); layoutChangeSpy.wait(100); QCOMPARE(anchors->fill(), layout->contentItem()); QCOMPARE(anchors->margins(), 10.0); } void testCase_AnchorFilledSeparateMargins() { QScopedPointer view(new UbuntuTestCase("AnchorFilledSeparateMargins.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layout = view->findItem("layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); QQuickItem *item = view->findItem("testItem"); QVERIFY(item); QQuickAnchors *anchors = item->property("anchors").value(); QVERIFY(anchors); root->setWidth(root->width() + 100); layoutChangeSpy.wait(100); QQuickItem *testLayout = view->findItem("testLayout"); QVERIFY(testLayout); QCOMPARE(anchors->fill(), testLayout); QCOMPARE(anchors->margins(), 0.0); QCOMPARE(anchors->leftMargin(), 0.0); QCOMPARE(anchors->rightMargin(), 0.0); QCOMPARE(anchors->topMargin(), 0.0); QCOMPARE(anchors->bottomMargin(), 0.0); root->setWidth(root->width() - 100); layoutChangeSpy.wait(100); QCOMPARE(anchors->fill(), layout->contentItem()); QCOMPARE(anchors->leftMargin(), 10.0); QCOMPARE(anchors->topMargin(), 20.0); QCOMPARE(anchors->rightMargin(), 30.0); QCOMPARE(anchors->bottomMargin(), 40.0); } void testCase_AnchorCenteredInDefault() { QScopedPointer view(new UbuntuTestCase("AnchorCenteredInDefault.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layout = view->findItem("layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); QQuickItem *item = view->findItem("testItem"); QVERIFY(item); QQuickAnchors *anchors = item->property("anchors").value(); QVERIFY(anchors); root->setWidth(root->width() + 100); layoutChangeSpy.wait(100); QQuickItem *testLayout = view->findItem("testLayout"); QVERIFY(testLayout); QCOMPARE(anchors->fill(), testLayout); root->setWidth(root->width() - 100); layoutChangeSpy.wait(100); QCOMPARE(anchors->centerIn(), layout->contentItem()); } void testCase_AnchorVerticalCenter() { QScopedPointer view(new UbuntuTestCase("AnchorVerticalCenter.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layout = view->findItem("layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); QQuickItem *item = view->findItem("testItem"); QVERIFY(item); QQuickAnchors *anchors = item->property("anchors").value(); QVERIFY(anchors); QCOMPARE(anchors->verticalCenter().item, layout->contentItem()); root->setWidth(root->width() + 100); layoutChangeSpy.wait(100); QQuickItem *testLayout = view->findItem("testLayout"); QVERIFY(testLayout); QCOMPARE(anchors->fill(), testLayout); root->setWidth(root->width() - 100); layoutChangeSpy.wait(100); QCOMPARE(anchors->verticalCenter().item, layout->contentItem()); } void testCase_AnchorVerticalCenterOffset() { QScopedPointer view(new UbuntuTestCase("AnchorVerticalCenterOffset.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layout = view->findItem("layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); QQuickItem *item = view->findItem("testItem"); QVERIFY(item); QQuickAnchors *anchors = item->property("anchors").value(); QVERIFY(anchors); QCOMPARE(anchors->verticalCenter().item, layout->contentItem()); QCOMPARE(anchors->verticalCenterOffset(), 50.0); root->setWidth(root->width() + 100); layoutChangeSpy.wait(100); QQuickItem *testLayout = view->findItem("testLayout"); QVERIFY(testLayout); QCOMPARE(anchors->fill(), testLayout); // no need to check offset as it does not affect the fill root->setWidth(root->width() - 100); layoutChangeSpy.wait(100); QCOMPARE(anchors->verticalCenter().item, layout->contentItem()); QCOMPARE(anchors->verticalCenterOffset(), 50.0); } void testCase_AnchorHorizontalCenter() { QScopedPointer view(new UbuntuTestCase("AnchorHorizontalCenter.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layout = view->findItem("layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); QQuickItem *item = view->findItem("testItem"); QVERIFY(item); QQuickAnchors *anchors = item->property("anchors").value(); QVERIFY(anchors); QCOMPARE(anchors->horizontalCenter().item, layout->contentItem()); root->setWidth(root->width() + 100); layoutChangeSpy.wait(100); QQuickItem *testLayout = view->findItem("testLayout"); QVERIFY(testLayout); QCOMPARE(anchors->fill(), testLayout); root->setWidth(root->width() - 100); layoutChangeSpy.wait(100); QCOMPARE(anchors->horizontalCenter().item, layout->contentItem()); } void testCase_AnchorHorizontalCenterOffset() { QScopedPointer view(new UbuntuTestCase("AnchorHorizontalCenterOffset.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layout = view->findItem("layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); QQuickItem *item = view->findItem("testItem"); QVERIFY(item); QQuickAnchors *anchors = item->property("anchors").value(); QVERIFY(anchors); QCOMPARE(anchors->horizontalCenter().item, layout->contentItem()); QCOMPARE(anchors->horizontalCenterOffset(), 50.0); root->setWidth(root->width() + 100); layoutChangeSpy.wait(100); QQuickItem *testLayout = view->findItem("testLayout"); QVERIFY(testLayout); QCOMPARE(anchors->fill(), testLayout); // no need to check offset as it does not affect the fill root->setWidth(root->width() - 100); layoutChangeSpy.wait(100); QCOMPARE(anchors->horizontalCenter().item, layout->contentItem()); QCOMPARE(anchors->horizontalCenterOffset(), 50.0); } void testCase_AnchorCenterWithOffset() { QScopedPointer view(new UbuntuTestCase("AnchorCenterWithOffset.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layout = view->findItem("layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); QQuickItem *item = view->findItem("testItem"); QVERIFY(item); QQuickAnchors *anchors = item->property("anchors").value(); QVERIFY(anchors); QCOMPARE(anchors->centerIn(), layout->contentItem()); QCOMPARE(anchors->verticalCenterOffset(), 50.0); QCOMPARE(anchors->horizontalCenterOffset(), 40.0); root->setWidth(root->width() + 100); layoutChangeSpy.wait(100); QQuickItem *testLayout = view->findItem("testLayout"); QVERIFY(testLayout); QCOMPARE(anchors->fill(), testLayout); // no need to check offsets as it does not affect the fill root->setWidth(root->width() - 100); layoutChangeSpy.wait(100); QCOMPARE(anchors->centerIn(), layout->contentItem()); QCOMPARE(anchors->verticalCenterOffset(), 50.0); QCOMPARE(anchors->horizontalCenterOffset(), 40.0); } void testCase_AnchorLeft() { QScopedPointer view(new UbuntuTestCase("AnchorLeft.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layout = view->findItem("layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); QQuickItem *item = view->findItem("testItem"); QVERIFY(item); QQuickAnchors *anchors = item->property("anchors").value(); QVERIFY(anchors); QCOMPARE(anchors->left().item, layout->contentItem()); QCOMPARE(anchors->leftMargin(), 10.0); root->setWidth(root->width() + 100); layoutChangeSpy.wait(100); QQuickItem *testLayout = view->findItem("testLayout"); QVERIFY(testLayout); QCOMPARE(anchors->fill(), testLayout); QCOMPARE(anchors->leftMargin(), 0.0); root->setWidth(root->width() - 100); layoutChangeSpy.wait(100); QCOMPARE(anchors->left().item, layout->contentItem()); QCOMPARE(anchors->leftMargin(), 10.0); } void testCase_AnchorTop() { QScopedPointer view(new UbuntuTestCase("AnchorTop.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layout = view->findItem("layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); QQuickItem *item = view->findItem("testItem"); QVERIFY(item); QQuickAnchors *anchors = item->property("anchors").value(); QVERIFY(anchors); QCOMPARE(anchors->top().item, layout->contentItem()); QCOMPARE(anchors->topMargin(), 10.0); root->setWidth(root->width() + 100); layoutChangeSpy.wait(100); QQuickItem *testLayout = view->findItem("testLayout"); QVERIFY(testLayout); QCOMPARE(anchors->fill(), testLayout); QCOMPARE(anchors->topMargin(), 0.0); root->setWidth(root->width() - 100); layoutChangeSpy.wait(100); QCOMPARE(anchors->top().item, layout->contentItem()); QCOMPARE(anchors->topMargin(), 10.0); } void testCase_AnchorRight() { QScopedPointer view(new UbuntuTestCase("AnchorRight.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layout = view->findItem("layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); QQuickItem *item = view->findItem("testItem"); QVERIFY(item); QQuickAnchors *anchors = item->property("anchors").value(); QVERIFY(anchors); QCOMPARE(anchors->right().item, layout->contentItem()); QCOMPARE(anchors->rightMargin(), 10.0); root->setWidth(root->width() + 100); layoutChangeSpy.wait(100); QQuickItem *testLayout = view->findItem("testLayout"); QVERIFY(testLayout); QCOMPARE(anchors->fill(), testLayout); QCOMPARE(anchors->rightMargin(), 0.0); root->setWidth(root->width() - 100); layoutChangeSpy.wait(100); QCOMPARE(anchors->right().item, layout->contentItem()); QCOMPARE(anchors->rightMargin(), 10.0); } void testCase_AnchorBottom() { QScopedPointer view(new UbuntuTestCase("AnchorBottom.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layout = view->findItem("layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); QQuickItem *item = view->findItem("testItem"); QVERIFY(item); QQuickAnchors *anchors = item->property("anchors").value(); QVERIFY(anchors); QCOMPARE(anchors->bottom().item, layout->contentItem()); QCOMPARE(anchors->bottomMargin(), 10.0); root->setWidth(root->width() + 100); layoutChangeSpy.wait(100); QQuickItem *testLayout = view->findItem("testLayout"); QVERIFY(testLayout); QCOMPARE(anchors->fill(), testLayout); QCOMPARE(anchors->bottomMargin(), 0.0); root->setWidth(root->width() - 100); layoutChangeSpy.wait(100); QCOMPARE(anchors->bottom().item, layout->contentItem()); QCOMPARE(anchors->bottomMargin(), 10.0); } void testCase_AnchorAll() { QScopedPointer view(new UbuntuTestCase("AnchorAll.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layout = view->findItem("layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); QQuickItem *item = view->findItem("testItem"); QVERIFY(item); QQuickAnchors *anchors = item->property("anchors").value(); QVERIFY(anchors); QCOMPARE(anchors->left().item, layout->contentItem()); QCOMPARE(anchors->top().item, layout->contentItem()); QCOMPARE(anchors->right().item, layout->contentItem()); QCOMPARE(anchors->bottom().item, layout->contentItem()); QVERIFY(!anchors->fill()); QCOMPARE(anchors->margins(), 20.0); root->setWidth(root->width() + 100); layoutChangeSpy.wait(100); QQuickItem *testLayout = view->findItem("testLayout"); QVERIFY(testLayout); QCOMPARE(anchors->fill(), testLayout); QVERIFY(!anchors->left().item); QVERIFY(!anchors->top().item); QVERIFY(!anchors->right().item); QVERIFY(!anchors->bottom().item); QCOMPARE(anchors->margins(), 0.0); root->setWidth(root->width() - 100); layoutChangeSpy.wait(100); QCOMPARE(anchors->left().item, layout->contentItem()); QCOMPARE(anchors->top().item, layout->contentItem()); QCOMPARE(anchors->right().item, layout->contentItem()); QCOMPARE(anchors->bottom().item, layout->contentItem()); QVERIFY(!anchors->fill()); QCOMPARE(anchors->margins(), 20.0); } // the following tests guard bug #1280359 void testCase_ItemInstanceAsProperty() { UbuntuTestCase::ignoreWarning("ItemInstanceAsProperty.qml", 45, 17, "QML ItemLayout: WARNING: item \"object2\" not specified or has been specified for layout by more than one active ItemLayout"); QScopedPointer view(loadTest("ItemInstanceAsProperty.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); QQuickItem *layout = testItem(root, "layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); // invoke layout change view->rootObject()->metaObject()->invokeMethod(view->rootObject(), "changeLayout"); layoutChangeSpy.wait(); QCOMPARE(layoutChangeSpy.count(), 1); } void testCase_DialerCrash() { UbuntuTestCase::ignoreWarning("DialerCrash.qml", 45, 17, "QML ItemLayout: WARNING: item \"object2\" not specified or has been specified for layout by more than one active ItemLayout"); QScopedPointer view(loadTest("DialerCrash.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); QQuickItem *layout = testItem(root, "layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); // invoke layout change view->rootObject()->setProperty("wide", false); layoutChangeSpy.wait(); QCOMPARE(layoutChangeSpy.count(), 1); } void testCase_ExcludedItemDeleted() { QScopedPointer view(loadTest("ExcludedItemDeleted.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); QQuickItem *layout = testItem(root, "layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); // invoke layout change view->rootObject()->metaObject()->invokeMethod(view->rootObject(), "changeLayout"); layoutChangeSpy.wait(); QCOMPARE(layoutChangeSpy.count(), 1); } // guard bug #1204834 and #1300668 void testCase_Visibility() { QScopedPointer view(new UbuntuTestCase("Visibility.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *layout = view->findItem("layoutManager"); QVERIFY(layout); QSignalSpy layoutChangeSpy(layout, SIGNAL(currentLayoutChanged())); QQuickItem *defaultLayout = testItem(root, "DefaultLayout"); QVERIFY(defaultLayout); // invoke layout change view->rootObject()->metaObject()->invokeMethod(view->rootObject(), "portraitLayout"); layoutChangeSpy.wait(1000); QCOMPARE(defaultLayout->parentItem(), layout->contentItem()); // despite of visible property binding, the visibility of the component is false // while its parent is set to invisible QCOMPARE(defaultLayout->isVisible(), false); QCOMPARE(layout->contentItem()->isVisible(), false); // change layout back layoutChangeSpy.clear(); view->rootObject()->metaObject()->invokeMethod(view->rootObject(), "landscapeLayout"); layoutChangeSpy.wait(1000); QCOMPARE(defaultLayout->parentItem(), layout->contentItem()); QCOMPARE(defaultLayout->isVisible(), true); QCOMPARE(layout->contentItem()->isVisible(), true); } void testCase_NestedVisibility_data() { QTest::addColumn("layoutFunction"); QTest::addColumn("layoutName"); QTest::newRow("portrait") << "tabletPortraitLayout" << "tabletPortrait"; QTest::newRow("landscape") << "tabletLandscapeLayout" << "tabletLandscape"; } void testCase_NestedVisibility() { QFETCH(QString, layoutFunction); QFETCH(QString, layoutName); QScopedPointer view(new UbuntuTestCase("NestedVisibility.qml")); QVERIFY(view); QQuickItem *root = view->rootObject(); QVERIFY(root); ULLayouts *mainLayout = view->findItem("mainLayout"); QVERIFY(mainLayout); QQuickItem *red = testItem(mainLayout, "mainRed"); QVERIFY(red); QQuickItem *green = testItem(mainLayout, "mainGreen"); QVERIFY(green); QQuickItem *blue = testItem(mainLayout, "mainBlue"); QVERIFY(blue); QQuickItem *magenta = testItem(mainLayout, "mainMagenta"); QVERIFY(magenta); QQuickItem *hidden = testItem(mainLayout, "mainHidden"); QVERIFY(hidden); QCOMPARE(hidden->isVisible(), false); // default is phone layout, get layd out items' neighbors QQuickItem *greenPrev = prevSibling(green); QQuickItem *magentaPrev = prevSibling(magenta); QSizeF greenSize(green->width(), green->height()); QSizeF magentaSize(magenta->width(), magenta->height()); // invoke tablet layout change QSignalSpy mainLayoutChangeSpy(mainLayout, SIGNAL(currentLayoutChanged())); view->rootObject()->metaObject()->invokeMethod(view->rootObject(), layoutFunction.toLocal8Bit().data()); mainLayoutChangeSpy.wait(1000); // get the nested layout ULLayouts *nestedLayout = qobject_cast(testItem(mainLayout, "nestedLayout")); QVERIFY(nestedLayout); QQuickItem *nestedActiveLayout = testItem(nestedLayout, layoutName); QVERIFY(nestedActiveLayout); QCOMPARE(red->isVisible(), false); QCOMPARE(green->isVisible(), true); QCOMPARE(blue->isVisible(), false); QCOMPARE(magenta->isVisible(), true); QCOMPARE(hidden->isVisible(), false); // we cannot use findChild() to locate green and magenta boxes, as reparenting only // changes the parentItem, not the parent object itself; therefore we only check if // their container is in the layout QVERIFY(hasChildItem(green, nestedActiveLayout)); QVERIFY(hasChildItem(magenta, nestedActiveLayout)); // go back to default layout of main mainLayoutChangeSpy.clear(); view->rootObject()->metaObject()->invokeMethod(view->rootObject(), "phoneLayout"); mainLayoutChangeSpy.wait(1000); QCOMPARE(red->isVisible(), true); QCOMPARE(green->isVisible(), true); QCOMPARE(blue->isVisible(), true); QCOMPARE(magenta->isVisible(), true); QCOMPARE(hidden->isVisible(), false); QCOMPARE(prevSibling(green), greenPrev); QCOMPARE(prevSibling(magenta), magentaPrev); QCOMPARE(green->width(), greenSize.width()); QCOMPARE(green->height(), greenSize.height()); QCOMPARE(magenta->width(), magentaSize.width()); QCOMPARE(magenta->height(), magentaSize.height()); QVERIFY(hasChildItem(green, mainLayout->contentItem())); QVERIFY(hasChildItem(magenta, mainLayout->contentItem())); } }; QTEST_MAIN(tst_Layouts) #include "tst_layouts.moc" ./tests/unit_x11/tst_layouts/AnchorVerticalCenter.qml0000644000015600001650000000260712700370701023063 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 300 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "landscape" when: root.width > root.height ItemLayout { objectName: "testLayout" anchors.fill: parent item: "test" } } ] Rectangle { width: 100 height: 100 color: "red" objectName: "testItem" Layouts.item: "test" anchors.verticalCenter: parent.verticalCenter } } } ./tests/unit_x11/tst_layouts/AnchorCenterWithOffset.qml0000644000015600001650000000271612700370701023375 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 300 height: 360 Layouts { objectName: "layoutManager" id: layoutManager anchors.fill: parent layouts: [ ConditionalLayout { name: "landscape" when: root.width > root.height ItemLayout { objectName: "testLayout" anchors.fill: parent item: "test" } } ] Rectangle { width: 100 height: 100 color: "red" objectName: "testItem" Layouts.item: "test" anchors.centerIn: parent anchors.verticalCenterOffset: 50 anchors.horizontalCenterOffset: 40 } } } ./tests/unit_x11/tst_layouts/CurrentLayoutChange.qml0000644000015600001650000000214012700370701022734 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Layouts 1.0 Rectangle { id: root width: 360 height: 360 Layouts { objectName: "layoutManager" id: layoutManager layouts: [ ConditionalLayout { name: "portrait" when: root.width < root.height }, ConditionalLayout { name: "landscape" when: root.width >= root.height } ] } } ./tests/unit_x11/tst_test/0000755000015600001650000000000012700370701015555 5ustar jenkinsjenkins./tests/unit_x11/tst_test/tst_test.pro0000644000015600001650000000022012700370701020142 0ustar jenkinsjenkinsTESTS += $$system(ls tst_*.qml) include(../qmltest-include.pri) TARGET = tst_test SOURCES += tst_test.cpp OTHER_FILES += $$system(ls *.qml) ./tests/unit_x11/tst_test/tst_test.cpp0000644000015600001650000000130212700370701020126 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include QUICK_TEST_MAIN(test) ./tests/unit_x11/tst_test/tst_ubuntutestcase.qml0000644000015600001650000002170312700370701022243 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.0 Rectangle { id: root width: 800 height: 1000 Column { anchors.fill: parent MultiPointTouchArea { id: topTouchArea width: parent.width height: 100 touchPoints: TouchPoint { // id: point } } MouseArea { id: mouseArea objectName: "myMouseArea" width: parent.width height: 200 hoverEnabled: true acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton property int testX : 0 property int testY : 0 property int steps : 0 onPositionChanged: { testX = mouseX; testY = mouseY; steps++; } } MultiPointTouchArea { id: touchArea width: parent.width height: 100 touchPoints: TouchPoint { id: point } } Flickable { id: flicker width: parent.width height: 400 contentWidth: rect.width contentHeight: rect.height clip: true Rectangle { id: rect color: "blue" width: 1000 height: 1000 } } TextField { id: textField } } UbuntuTestCase { name: "TestTheUbuntuTestCase" when: windowShown function initTestCase() { TestExtras.registerTouchDevice(); } function init() { mouseArea.steps = 0; } function cleanup() { movementSpy.clear(); longPressSpy.clear(); touchPressSpy.clear(); touchReleaseSpy.clear(); touchUpdateSpy.clear(); touchPressSpy.target = null; touchReleaseSpy.target = null; touchUpdateSpy.target = null; } function test_mouseMoveSlowly() { mouseMoveSlowly(mouseArea,0,0,800,200,10,100); compare(mouseArea.testX,800); compare(mouseArea.testY,200); compare(mouseArea.steps,10); } function test_findChild() { var child = findChild(root,"myMouseArea"); compare(child!==null,true, "When a child is found, it is returned"); compare(child.objectName,"myMouseArea"); child = findChild(root,"NoSuchChildHere"); compare(child===null,true,"When there is no child, function should return null"); } SignalSpy { id: longPressSpy target: mouseArea signalName: "onPressAndHold" } function test_longPress_left() { longPressSpy.clear(); mouseLongPress(mouseArea, mouseArea.width / 2, mouseArea.height / 2); longPressSpy.wait(); // cleanup mouseRelease(mouseArea, mouseArea.width / 2, mouseArea.height / 2); } function test_longPress_right() { longPressSpy.clear(); mouseLongPress(mouseArea, mouseArea.width / 2, mouseArea.height / 2, Qt.RightButton); longPressSpy.wait(); // cleanup mouseRelease(mouseArea, mouseArea.width / 2, mouseArea.height / 2, Qt.RightButton); } function test_longPress_middle() { longPressSpy.clear(); mouseLongPress(mouseArea, mouseArea.width / 2, mouseArea.height / 2, Qt.MiddleButton); longPressSpy.wait(); // cleanup mouseRelease(mouseArea, mouseArea.width / 2, mouseArea.height / 2, Qt.MiddleButton); } SignalSpy { id: movementSpy target: flicker signalName: "onMovementEnded" } function test_flick_default() { flick(flicker, 0, 0, flicker.width, flicker.height); movementSpy.wait(); } function test_flick_long() { flick(flicker, 0, 0, flicker.width, flicker.height, -1, 10); movementSpy.wait(); } function test_flick_short() { flick(flicker, 0, 0, flicker.width, flicker.height, -1, 1); movementSpy.wait(); } function test_flick_pressTimeout() { flick(flicker, 0, 0, flicker.width, flicker.height, 400); movementSpy.wait(); } function test_flick_pressTimeout_short() { flick(flicker, flicker.width, flicker.height, -flicker.width, -flicker.height, 400, 1); movementSpy.wait(); } function test_flick_pressTimeout_long() { flick(flicker, flicker.width, flicker.height, -flicker.width, -flicker.height, 400, 100); movementSpy.wait(); } function test_typeString() { textField.forceActiveFocus(); typeString("Hello Ubuntu"); tryCompare(textField, "text", "Hello Ubuntu"); } SignalSpy { id: touchPressSpy signalName: "onPressed" target: touchArea } SignalSpy { id: touchReleaseSpy signalName: "onReleased" target: touchArea } SignalSpy { id: touchUpdateSpy signalName: "onUpdated" target: touchArea } function test_has_property() { verify(TestExtras.hasOwnProperty("touchPresent"), "touchPresent property missing"); } function test_touchPress_data() { return [ {touch: touchArea}, {touch: topTouchArea} ]; } function test_touchPress(data) { touchPressSpy.target = data.touch; TestExtras.touchPress(0, data.touch, Qt.point(10, 10)); touchPressSpy.wait(); // cleanup TestExtras.touchRelease(0, data.touch, Qt.point(10, 10)); } function test_touchRelease_data() { return [ {touch: touchArea}, {touch: topTouchArea} ]; } function test_touchRelease(data) { // prerequisite: do a press so we get a release TestExtras.touchPress(0, data.touch, Qt.point(10, 10)); touchReleaseSpy.target = data.touch; TestExtras.touchRelease(0, data.touch, Qt.point(10, 10)); touchReleaseSpy.wait(); } function test_touchClick_data() { return [ {touch: touchArea}, {touch: topTouchArea} ]; } function test_touchClick(data) { touchPressSpy.target = data.touch; touchReleaseSpy.target = data.touch; TestExtras.touchClick(0, data.touch, Qt.point(10, 10)); touchReleaseSpy.wait(); compare(touchPressSpy.count, 1, "Not pressed?"); compare(touchReleaseSpy.count, 1, "Not released?"); } function test_touchDoubleClick_data() { return [ {touch: touchArea}, {touch: topTouchArea} ]; } function test_touchDoubleClick(data) { touchPressSpy.target = data.touch; touchReleaseSpy.target = data.touch; TestExtras.touchDoubleClick(0, data.touch, Qt.point(10, 10)); compare(touchPressSpy.count, 2, "Not pressed twice?"); compare(touchReleaseSpy.count, 2, "Not released twice?"); } function test_touchMove_data() { return [ {touch: touchArea}, {touch: topTouchArea} ]; } function test_touchMove(data) { touchUpdateSpy.target = data.touch; TestExtras.touchPress(0, data.touch, Qt.point(0, 0)); TestExtras.touchMove(0, data.touch, Qt.point(10, 10)); touchUpdateSpy.wait(); TestExtras.touchRelease(0, data.touch, Qt.point(10, 10)); } function test_touchDrag_default_steps_data() { return [ {touch: touchArea}, {touch: topTouchArea} ]; } function test_touchDrag_default_steps(data) { touchPressSpy.target = data.touch; touchReleaseSpy.target = data.touch; touchUpdateSpy.target = data.touch; TestExtras.touchDrag(0, data.touch, Qt.point(0, 0), Qt.point(10, 10)); compare(touchPressSpy.count, 1, "Not pressed?"); compare(touchReleaseSpy.count, 1, "Not released?"); compare(touchUpdateSpy.count, 5, "Not moved?"); } function test_touchDrag_10_steps_data() { return [ {touch: touchArea}, {touch: topTouchArea} ]; } function test_touchDrag_10_steps(data) { touchPressSpy.target = data.touch; touchReleaseSpy.target = data.touch; touchUpdateSpy.target = data.touch; TestExtras.touchDrag(0, data.touch, Qt.point(0, 0), Qt.point(100, 100), 10); compare(touchPressSpy.count, 1, "Not pressed?"); compare(touchReleaseSpy.count, 1, "Not released?"); compare(touchUpdateSpy.count, 10, "Not moved?"); } } } ./tests/unit_x11/tst_ubuntu_shape/0000755000015600001650000000000012700370701017300 5ustar jenkinsjenkins./tests/unit_x11/tst_ubuntu_shape/no_distortion_expected.png0000644000015600001650000001037012700370701024562 0ustar jenkinsjenkinsPNG  IHDRtsBITOtEXtSoftwaregnome-screenshot>IDATxݱwB6f)-+"^U.x k.(HRmnL@wFXFwf>eYl8\(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1,CnGW/_|w}_?o_^^^^^O͛o~7zw}~7oܸ>ݎEyXlqJrJY>|WU T*Ç?>hX>9B?8pOχso~'ܺu+}Q*Dv;<}zzz>cgϞ SٳgC\1F8;;K8^c_~%} zmQ*^x>pJ6(@^J8^c?#} zmQ*P1Fl?IJ6(1oiT*Sʲz@Ruj jJR9, T*]ld1 @1 @1 @1 @1 @1 @1 @1 @1 @1 @1 @2}XT*erJrlT*ieY\R\e&QbQbQbQbQbQbQbQbQbQbQbhJR9, T*]ΠݴeRTN+Je-G7=gccccccccccL`G4V*)eY\R\5p-JrZYV/T*.m<*9ccccccccccce;ڧRTN)Je35F7m٨T*ʲz@RunQM`,>JrJYV/T*.WA1iFRV*ʮu[6o2{           f>iT*Sʲz@Ruj jM[6*J崲^.PTv]۲yT~s(1(1(1(1(1(1(1(1(1(1(1vOcRR*ʮUgPknڲQT*erJrݖͣ 3F1F1F1F1F1F1F1F1F1F1FY}+J唲^.PTv]?8ZctӖJR9, T*]ld1 @1 @1 @1 @1 @1 @1 @1 @1 @1 @1 @2}XT*erJrlT*ieY\R\e&QbQbQbQbQbQbQbQbQbQbQbhJR9, T*]ΠݴeRTN+Je-G7=gccccccccccL`G4V*)eY\R\5p-JrZYV/T*.m<*9ccccccccccce;ڧRTN)Je35F7m٨T*ʲz@RunQM`,>JrJYV/T*.WA1iFRV*ʮu[6o2{           f>iT*Sʲz@Ruj jM[6*J崲^.PTv]۲yT~s(1(1(1(1(1(1(1(1(1(1(1vOcRR*ʮUgPknڲQT*erJrݖͣ 3F1F1F1F1F1F1F1F1F1F1FY}+J唲^.PTv]?8ZctӖJR9, T*]ld1 @1 @1 @1 @1 @1 @1 @1 @1 @1 @1 @2}XT*erJrlT*ieY\R\e&QbQbQbQbQbQbQbQbQbQbQbhJR9, T*]ΠݴeRTN+Je-G7=gccccccccccL`G4V*)eY\R\5p-JrZYV/T*.m<*9ccccccccccce;ڧRTN)Je35F7m٨T*ʲz@RunQM`,>JrJYV/T*.WA1iFRV*ʮu[6o2{           f>iT*Sʲz@Ruj jM[6*J崲^.PTv]۲yT~s(1(1(1(1(1(1(1(1(1(1(1vOcRR*ʮUgPknڲQT*erJrݖͣ 3F1F1F1F1F1F1F1F1F1F1FY}+J唲^.PTv]?8ZctӖJR9, T*]ld1 PQA(U,~u W^ck׮R1 PGB#kcT믧R1 PŽ{ѳ ޽{C\TΝ)}w΃҇bTqrrxp\}sÓ9Uܿxhqr2ܼ> n\ ݿ?}+)[. oggëWs~}qw>pxR~ngbH8u짟~_|l.//Gptt47_{[nݹsݻS1 ;?n\^$IENDB`./tests/unit_x11/tst_ubuntu_shape/no_distortion.qml0000644000015600001650000000201412700370701022702 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { width: 900 height: 500 Row { spacing: 50 anchors.centerIn: parent Image { id: grid source: "no_distortion_source.png" } Shape { id: shape width: grid.width height: grid.height image: grid } } } ./tests/unit_x11/tst_ubuntu_shape/tst_ubuntu_shape.cpp0000644000015600001650000000360512700370701023404 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include #include #include class tst_UbuntuShape: public QObject { Q_OBJECT private: QQuickView *m_quickView; private Q_SLOTS: void initTestCase() { m_quickView = new QQuickView; m_quickView->setGeometry(0, 0, 900, 500); m_quickView->show(); // add modules folder so we have access to the plugin from QML QQmlEngine *engine = m_quickView->engine(); QString modules(UBUNTU_QML_IMPORT_PATH); QStringList imports = engine->importPathList(); imports.prepend(QDir(modules).absolutePath()); engine->setImportPathList(imports); } void noDistortion() { QSKIP("This test passes on local machines but not in CI as it requires working OpenGL"); m_quickView->setSource(QUrl::fromLocalFile("no_distortion.qml")); QCoreApplication::processEvents(); QImage result = m_quickView->grabWindow(); QVERIFY(!result.isNull()); QImage expected = QImage("no_distortion_expected.png"); QVERIFY(!expected.isNull()); QCOMPARE(result, expected); } }; QTEST_MAIN(tst_UbuntuShape) #include "tst_ubuntu_shape.moc" ./tests/unit_x11/tst_ubuntu_shape/tst_ubuntu_shape.pro0000644000015600001650000000026412700370701023420 0ustar jenkinsjenkinsinclude(../test-include.pri) SOURCES += tst_ubuntu_shape.cpp OTHER_FILES += no_distortion.qml \ no_distortion_source.png \ no_distortion_expected.png ./tests/unit_x11/tst_ubuntu_shape/no_distortion_source.png0000644000015600001650000000261612700370701024265 0ustar jenkinsjenkinsPNG  IHDR{n`%#bKGD pHYs  tIME223[%tEXtCommentclip2gif 0.7.2 by Yves Piguet@IDATxܱ 1ñTؑz.$0$O;;;;ӽ'b =b = yKy^K= =b =b =e|8K;;;z {@{@ziggg_/ b =b = _/%@{@{{2^륝]|`=b =b b /.^0@@{@{@(%^K= =b =b =e|8K;;;z {@{@ziggg_/ b =b = _/%@{@{{2^륝]|`=b =b bPK| {@{@{@{z pvvvvb =b =b=b@_/.^0@@{@{@(%^K= =b =b =e|8K;;;z {@{@ziggg_/ b =b = _/%@{@{{2^륝]|`=b =b bPK| {@{@{@{z pvvvvb =b =b=b@_/.^0@@{@{@(%^K= =b =b =e|8K;;;z {@{@ziggg_/ b =b = /UjNIENDB`./tests/unit_x11/tst_orientation/0000755000015600001650000000000012700370701017131 5ustar jenkinsjenkins./tests/unit_x11/tst_orientation/tst_orientation.cpp0000644000015600001650000000440712700370701023067 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #include #include #include #include #include #include #include #include #include #include #include #include #include "uctestcase.h" class tst_OrientationTest : public QObject { Q_OBJECT public: tst_OrientationTest() {} private Q_SLOTS: void test_defaults() { QScopedPointer testCase(new UbuntuTestCase("Defaults.qml")); QQuickItem *helper = testCase->findItem("helper"); QCOMPARE(helper->property("automaticOrientation").toBool(), true); // No warnings expected QCOMPARE(testCase->warnings(), 0); } void test_manualAngle() { QScopedPointer testCase(new UbuntuTestCase("ManualAngle.qml")); QQuickItem *helper = testCase->findItem("helper"); // No warning about "window" being undefined must appear QSKIP("TypeError: Cannot set property 'contentOrientation' of null"); QCOMPARE(testCase->warnings(), 0); QCOMPARE(helper->property("orientationAngle").toInt(), 90); // Verify expected values QQuickItem *checkpoint = testCase->findItem("checkpoint"); // window.contentOrientation QCOMPARE(checkpoint->property("contentOrientation").toInt(), helper->property("orientationAngle").toInt()); } }; QTEST_MAIN(tst_OrientationTest) #include "tst_orientation.moc" ./tests/unit_x11/tst_orientation/Defaults.qml0000644000015600001650000000143412700370701021415 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { width: 100 height: 100 OrientationHelper { objectName: "helper" } } ./tests/unit_x11/tst_orientation/tst_orientation.pro0000644000015600001650000000024312700370701023077 0ustar jenkinsjenkinsinclude(../test-include.pri) DEFINES += SRCDIR=\\\"$$PWD/\\\" SOURCES += \ tst_orientation.cpp OTHER_FILES += \ Defaults.qml \ ManualOrientation.qml ./tests/unit_x11/tst_orientation/ManualAngle.qml0000644000015600001650000000176012700370701022034 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import QtQuick.Window 2.0 Item { width: 100 height: 100 OrientationHelper { objectName: "helper" orientationAngle: 90 } Window { id: window } Item { objectName: "checkpoint" property int contentOrientation: window.contentOrientation } } ./tests/unit_x11/tst_subtheming/0000755000015600001650000000000012700370716016751 5ustar jenkinsjenkins./tests/unit_x11/tst_subtheming/ChangeDefaultPaletteInChildren.qml0000644000015600001650000000205512700370701025431 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes 1.3 StyledItem { theme.objectName: "MasterTheme" Loader { objectName: "loader" anchors.fill: parent sourceComponent: dynamicItem } Component { id: dynamicItem StyledItem { theme.palette: Palette { normal.background: "blue" } } } } ./tests/unit_x11/tst_subtheming/ParentChanges.qml0000644000015600001650000000210012700370701022171 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { objectName: "main" width: units.gu(40) height: units.gu(71) theme: ThemeSettings{ objectName: "top" } Item { anchors.fill: parent StyledItem { objectName: "testItem" theme: ThemeSettings { objectName: "testSet" name: "Ubuntu.Components.Themes.SuruDark" } } } } ./tests/unit_x11/tst_subtheming/StyleHintsElsewhere.qml0000644000015600001650000000144412700370701023433 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: units.gu(40) height: units.gu(71) StyleHints { anyProperty: true } } ./tests/unit_x11/tst_subtheming/TestStyleChange.qml0000644000015600001650000000413312700370701022525 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { width: units.gu(40) height: units.gu(71) objectName: "mainStyled" ThemeSettings { objectName: "Theme" } Component { id: dynamicComponent Item { property alias nestedStyled: innerItem StyledItem { id: innerItem anchors.fill: parent } } } Column { objectName: "simpleColumn" anchors.fill: parent StyledItem { objectName: "firstLevelStyled" width: parent.width height: units.gu(20) Item { anchors.fill: parent objectName: "simpleItem" StyledItem { objectName: "secondLevelStyled" anchors.fill: parent Loader { objectName: "thirdLevelLoader" anchors.fill: parent onItemChanged: if (item) item.nestedStyled.objectName = "thirdLevelLoaderStyled" sourceComponent: dynamicComponent } } } } Loader { objectName: "firstLevelLoader" width: parent.width height: units.gu(40) onItemChanged: if (item) item.nestedStyled.objectName = "firstLevelLoaderStyled" sourceComponent: dynamicComponent } } } ./tests/unit_x11/tst_subtheming/themes/0000755000015600001650000000000012700370716020236 5ustar jenkinsjenkins./tests/unit_x11/tst_subtheming/themes/TestModule/0000755000015600001650000000000012700370701022315 5ustar jenkinsjenkins./tests/unit_x11/tst_subtheming/themes/TestModule/TestTheme/0000755000015600001650000000000012700370701024217 5ustar jenkinsjenkins./tests/unit_x11/tst_subtheming/themes/TestModule/TestTheme/1.3/0000755000015600001650000000000012700370701024520 5ustar jenkinsjenkins./tests/unit_x11/tst_subtheming/themes/TestModule/TestTheme/1.3/TestStyle.qml0000644000015600001650000000135612700370701027200 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 Item { objectName: "TestStyle" property string newProperty: "version1.3" } ./tests/unit_x11/tst_subtheming/themes/TestModule/TestTheme/1.2/0000755000015600001650000000000012700370701024517 5ustar jenkinsjenkins./tests/unit_x11/tst_subtheming/themes/TestModule/TestTheme/1.2/TestStyle.qml0000644000015600001650000000130012700370701027164 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 Item { objectName: "TestStyle" } ./tests/unit_x11/tst_subtheming/themes/TestModule/TestTheme/qmldir0000644000015600001650000000014312700370701025430 0ustar jenkinsjenkinsmodule TestTheme TestStyle 1.0 ./1.2/TestStyle.qml #version 1.3 TestStyle 1.3 ./1.3/TestStyle.qml ./tests/unit_x11/tst_subtheming/themes/CustomTheme/0000755000015600001650000000000012700370701022465 5ustar jenkinsjenkins./tests/unit_x11/tst_subtheming/themes/CustomTheme/1.3/0000755000015600001650000000000012700370701022766 5ustar jenkinsjenkins./tests/unit_x11/tst_subtheming/themes/CustomTheme/1.3/TestStyle.qml0000644000015600001650000000131712700370701025443 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import TestTheme 1.3 as Parent Parent.TestStyle { } ./tests/unit_x11/tst_subtheming/themes/CustomTheme/Palette.qml0000644000015600001650000000175212700370701024603 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes.Ambiance 1.3 as Suru Suru.Palette { normal.selection: "#A21E1C" selected.selection: "#1C1EA2" selected.base: "lightblue" selected.baseText: "pink" selected.overlay: "#ABCDEF" selected.overlayText: "#FEDCBA" selected.fieldText: UbuntuColors.red } ./tests/unit_x11/tst_subtheming/themes/CustomTheme/TestStyle.qml0000644000015600001650000000131712700370701025142 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import TestTheme 1.0 as Parent Parent.TestStyle { } ./tests/unit_x11/tst_subtheming/themes/CustomTheme/parent_theme0000644000015600001650000000001212700370701025054 0ustar jenkinsjenkinsTestTheme ./tests/unit_x11/tst_subtheming/themes/DerivedTheme/0000755000015600001650000000000012700370716022603 5ustar jenkinsjenkins./tests/unit_x11/tst_subtheming/themes/DerivedTheme/1.3/0000755000015600001650000000000012700370714023102 5ustar jenkinsjenkins./tests/unit_x11/tst_subtheming/themes/DerivedTheme/1.3/Palette.qml0000644000015600001650000000200112700370714025204 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes.Ambiance 1.3 as Suru Suru.Palette { normal.selection: UbuntuColors.orange selected.selection: UbuntuColors.lightGrey selected.base: "lightblue" selected.baseText: "pink" selected.overlay: "#ABCDEF" selected.overlayText: "#FEDCBA" selected.fieldText: UbuntuColors.red } ./tests/unit_x11/tst_subtheming/themes/DerivedTheme/1.2/0000755000015600001650000000000012700370714023101 5ustar jenkinsjenkins./tests/unit_x11/tst_subtheming/themes/DerivedTheme/1.2/TestStyle.qml0000644000015600001650000000130012700370714025546 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 Item { objectName: "TestStyle" } ./tests/unit_x11/tst_subtheming/themes/DerivedTheme/parent_theme0000644000015600001650000000001212700370714025170 0ustar jenkinsjenkinsTestTheme ./tests/unit_x11/tst_subtheming/themes/BuggyTheme/0000755000015600001650000000000012700370701022270 5ustar jenkinsjenkins./tests/unit_x11/tst_subtheming/themes/BuggyTheme/Palette.qml0000644000015600001650000000151212700370701024400 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes 1.3 Palette { normal.selection: "#A21E1C" selected.selection: "#1C1EA2" imaginary.selection: "pink" } ./tests/unit_x11/tst_subtheming/ChangePaletteValueWhenParentChanges.qml0000644000015600001650000000203712700370701026446 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes 1.3 // the style of the root object will be changed StyledItem { theme.objectName: "MasterTheme" StyledItem { theme: ThemeSettings { objectName: "firstTheme" name: parentTheme.name palette: Palette { normal.background: "blue" } } } } ./tests/unit_x11/tst_subtheming/PropertyBindingHints.qml0000644000015600001650000000161712700370701023610 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: units.gu(40) height: units.gu(71) Button { objectName: "Button" id: button StyleHints { defaultColor: button.pressed ? "tan" : "blue" } } } ./tests/unit_x11/tst_subtheming/MoreStyleHints.qml0000644000015600001650000000165312700370701022414 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: units.gu(40) height: units.gu(71) Button { objectName: "Button" StyleHints { minimumWidth: units.gu(20) } StyleHints { defaultColor: "brown" } } } ./tests/unit_x11/tst_subtheming/GroupPropertyBindingHints.qml0000644000015600001650000000171312700370701024622 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: units.gu(40) height: units.gu(71) HintedButton { objectName: "Button" id: button gradient: UbuntuColors.greyGradient StyleHints { gradientProxy.topColor: button.pressed ? "tan" : "blue" } } } ./tests/unit_x11/tst_subtheming/SameNamedPaletteSettings.qml0000644000015600001650000000217612700370701024356 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes 1.3 Item { StyledItem { theme: ThemeSettings { objectName: "firstTheme" name: "Ubuntu.Components.Themes.SuruDark" palette: Palette{ normal.background: UbuntuColors.red } } } StyledItem { theme: ThemeSettings { objectName: "secondTheme" name: "Ubuntu.Components.Themes.SuruDark" } } } ./tests/unit_x11/tst_subtheming/SimplePropertyHints.qml0000644000015600001650000000154312700370701023465 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: units.gu(40) height: units.gu(71) Button { objectName: "Button" StyleHints { defaultColor: "blue" } } } ./tests/unit_x11/tst_subtheming/StyledItemAppThemeVersioned.qml0000644000015600001650000000142312700370701025044 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { id: item theme.name: "themes.CustomTheme" styleName: "TestStyle" } ./tests/unit_x11/tst_subtheming/HintedButton.qml0000644000015600001650000000137512700370701022073 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Button { StyleHints { minimumWidth: units.gu(20) } } ./tests/unit_x11/tst_subtheming/DynamicAssignment.qml0000644000015600001650000000203212700370701023070 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { objectName: "main" width: units.gu(40) height: units.gu(71) theme: ThemeSettings{ objectName: "top" } ThemeSettings { objectName: "testSet" name: "Ubuntu.Components.Themes.SuruDark" } Item { anchors.fill: parent StyledItem { objectName: "testItem" } } } ./tests/unit_x11/tst_subtheming/InvalidPalette.qml0000644000015600001650000000136212700370701022365 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { id: item theme.palette: QtObject{} } ./tests/unit_x11/tst_subtheming/DefaultTheme.qml0000644000015600001650000000144212700370701022026 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Label { id: label width: 400 height: width text: "HOLA" Label { } Button { } } ./tests/unit_x11/tst_subtheming/StyleHintsInvalidProperty.qml0000644000015600001650000000156012700370701024642 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: units.gu(40) height: units.gu(71) Button { StyleHints { ignoreUnknownProperties: false invalidProperty: 10 } } } ./tests/unit_x11/tst_subtheming/DeprecatedTheme.qml0000644000015600001650000000154112700370701022502 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { id: item width: units.gu(40) height: units.gu(40) theme.name: "Ubuntu.Components.Themes.SuruGradient" styleName: "OptionSelectorStyle" } ./tests/unit_x11/tst_subtheming/tst_subtheming.cpp0000644000015600001650000011403212700370714022513 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include #include #include #include #define private public #define protected public #include "uctheme.h" #undef protected #undef private #include "quickutils.h" #include "uctestcase.h" #include "ucstyleditembase_p.h" #include "ucnamespace.h" #include "ucunits.h" #include "uclabel.h" #include "plugin.h" class ThemeTestCase : public UbuntuTestCase { Q_OBJECT public: ThemeTestCase(const QString& file, bool assertOnFailure = true, QWindow* parent = 0) : UbuntuTestCase(file, QQuickView::SizeViewToRootObject, assertOnFailure, parent) { } ~ThemeTestCase() { // restore theme before quitting if (!rootContext()) { return; } UCTheme *theme = globalTheme(); if (theme) { theme->resetName(); } else { qWarning() << "No theme instance found!"; } } void setGlobalTheme(const QString &theme) { UCTheme *rootTheme = globalTheme(); QVERIFY(rootTheme); rootTheme->setName(theme); } void setTheme(const QString &theme, QQuickItem *watchedItem) { QSignalSpy spy(watchedItem, SIGNAL(themeChanged())); rootObject()->setProperty("themeName", theme); waitForSignal(&spy); } UCTheme *theme() { return rootObject()->property("theme").value(); } UCTheme *globalTheme() { return rootContext()->contextProperty("theme").value(); } }; class tst_Subtheming : public QObject { Q_OBJECT private: QString m_xdgDataPath; QString m_themesPath; private Q_SLOTS: void initTestCase() { m_xdgDataPath = QLatin1String(getenv("XDG_DATA_DIRS")); m_themesPath = QLatin1String(getenv("UBUNTU_UI_TOOLKIT_THEMES_PATH")); qputenv("SUPPRESS_DEPRECATED_NOTE", "yes"); } void cleanup() { qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", m_themesPath.toLatin1()); qputenv("XDG_DATA_DIRS", m_xdgDataPath.toLocal8Bit()); UCTheme::previousVersion = 0; } void test_default_theme() { QQmlEngine engine; UbuntuComponentsPlugin::initializeContextProperties(&engine); UCTheme::defaultTheme(&engine); } void test_default_name() { UCTheme theme; QCOMPARE(theme.name(), QString("Ubuntu.Components.Themes.Ambiance")); } void test_name_set() { QTest::ignoreMessage(QtWarningMsg, "Theme not found: \"MyBeautifulTheme\""); UCTheme theme; theme.setName("MyBeautifulTheme"); QCOMPARE(theme.name(), QString("MyBeautifulTheme")); } void test_name_reset() { UCTheme theme; theme.setName("Ubuntu.Components.Themes.SuruDark"); QCOMPARE(theme.name(), QString("Ubuntu.Components.Themes.SuruDark")); // reset theme.resetName(); QCOMPARE(theme.name(), QString("Ubuntu.Components.Themes.Ambiance")); } void test_create_without_engine() { QTest::ignoreMessage(QtCriticalMsg, "The item UCLabel was created without a valid QML Engine. Styling will not be possible."); QScopedPointer item(new UCLabel); QVERIFY(!item->getTheme()); } void test_default_theme_cleared_with_engine_bug1527546() { qputenv("QV4_FORCE_INTERPRETER", "1"); qputenv("QV4_MM_AGGRESSIVE_GC", "1"); for (int i = 0; i < 2; i++) { ThemeTestCase *view = new ThemeTestCase("DefaultTheme.qml"); QVERIFY(view->globalTheme()); QVERIFY(UCTheme::defaultTheme(view->engine())); QObjectCleanupHandler themeCleanup; themeCleanup.add(UCTheme::defaultTheme(view->engine())); delete view; QVERIFY(themeCleanup.isEmpty()); } } void test_multiple_view_instances_bug1527546() { qputenv("QV4_FORCE_INTERPRETER", "1"); qputenv("QV4_MM_AGGRESSIVE_GC", "1"); QScopedPointer view1(new ThemeTestCase("DefaultTheme.qml")); QScopedPointer view2(new ThemeTestCase("DefaultTheme.qml")); // the two views must have different default themes QVERIFY(view1->globalTheme() != view2->globalTheme()); } void test_multiple_themes_on_engine_bug1527546() { qputenv("QV4_FORCE_INTERPRETER", "1"); qputenv("QV4_MM_AGGRESSIVE_GC", "1"); QQmlEngine engine; UbuntuComponentsPlugin::initializeContextProperties(&engine); UCTheme *theme0 = UCTheme::defaultTheme(&engine); UCTheme *theme1 = new UCTheme(&engine); QVERIFY(theme0 != theme1); } void test_create_style_component_data() { QTest::addColumn("styleName"); QTest::addColumn("parentName"); QTest::addColumn("success"); QTest::addColumn("warning"); QTest::newRow("Existing style") << "TestStyle" << "SimpleItem.qml" << true << QString(); QTest::newRow("Non existing style") << "NotExistingTestStyle" << "SimpleItem.qml" << false << "QML SimpleItem: Warning: Style NotExistingTestStyle.qml not found in theme TestModule.TestTheme"; } void test_create_style_component() { QFETCH(QString, styleName); QFETCH(QString, parentName); QFETCH(bool, success); QFETCH(QString, warning); if (!warning.isEmpty()) { ThemeTestCase::ignoreWarning(parentName, 20, 1, warning); } qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", "./themes"); QScopedPointer view(new ThemeTestCase(parentName)); view->setTheme("TestModule.TestTheme", view->rootObject()); view->rootObject()->setProperty("styleName", styleName); QQuickItem *testStyle = view->rootObject()->findChild("TestStyle"); QCOMPARE(testStyle != NULL, success); } void test_relative_theme_paths_environment_variables_data() { QTest::addColumn("themePath"); QTest::addColumn("xdgPath"); QTest::addColumn("theme"); QTest::addColumn("style"); QTest::addColumn("warning"); QTest::addColumn("success"); QTest::newRow("One toolkit theme path") << "./themes" << "" << "TestModule.TestTheme" << "TestStyle" << "" << true; QTest::newRow("Two toolkit theme paths") << "./themes:./themes/TestModule" << "" << "CustomTheme" << "TestStyle" << "" << true; QTest::newRow("One XDG path") << "" << "./themes" << "TestModule.TestTheme" << "TestStyle" << "" << true; QTest::newRow("Two XDG paths") << "" << "./themes:./themes/TestModule" << "CustomTheme" << "TestStyle" << "" << true; QTest::newRow("No variables") << "" << "" << QString() << "TestStyle" << "QML SimpleItem: Warning: Style TestStyle.qml not found in theme Ubuntu.Components.Themes.Ambiance" << false; } void test_relative_theme_paths_environment_variables() { QFETCH(QString, themePath); QFETCH(QString, xdgPath); QFETCH(QString, theme); QFETCH(QString, style); QFETCH(QString, warning); QFETCH(bool, success); if (!warning.isEmpty()) { ThemeTestCase::ignoreWarning("SimpleItem.qml", 20, 1, warning); } qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", themePath.toLocal8Bit()); qputenv("XDG_DATA_DIRS", xdgPath.toLocal8Bit()); QScopedPointer view(new ThemeTestCase("SimpleItem.qml")); if (!theme.isEmpty()) { view->setTheme(theme, view->rootObject()); } view->rootObject()->setProperty("styleName", style); QQuickItem *styleItem = view->rootObject()->findChild("TestStyle"); QCOMPARE(styleItem != NULL, success); } void test_import_path() { if (!QFile(QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath) + "/Ubuntu/Components").exists()) QSKIP("This can only be tested if the UITK is installed"); qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", ""); qputenv("XDG_DATA_DIRS", ""); qputenv("QML2_IMPORT_PATH", ""); UCTheme theme; QCOMPARE(theme.name(), QString("Ubuntu.Components.Themes.Ambiance")); } void test_bogus_import_path_set() { if (!QFile(QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath) + "/Ubuntu/Components").exists()) QSKIP("This can only be tested if the UITK is installed"); qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", ""); qputenv("XDG_DATA_DIRS", ""); qputenv("QML2_IMPORT_PATH", "/no/plugins/here"); UCTheme theme; QCOMPARE(theme.name(), QString("Ubuntu.Components.Themes.Ambiance")); } void test_multiple_import_paths_set() { if (!QFile(QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath) + "/Ubuntu/Components").exists()) QSKIP("This can only be tested if the UITK is installed"); qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", ""); qputenv("XDG_DATA_DIRS", ""); qputenv("QML2_IMPORT_PATH", "/no/plugins/here"); QScopedPointer view(new ThemeTestCase("SimpleItem.qml")); view->setTheme("CustomModule.TestTheme", view->rootObject()); } void test_theme_not_root_theme() { qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", "."); QScopedPointer view(new ThemeTestCase("SimpleItem.qml")); view->setTheme("CustomModule.TestTheme", view->rootObject()); UCTheme *theme = view->theme(); UCTheme *globalTheme = view->globalTheme(); QVERIFY(theme); QVERIFY(globalTheme); QVERIFY(theme != globalTheme); } void test_theme_reset_name() { qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", "./themes"); QScopedPointer view(new ThemeTestCase("SimpleItem.qml")); view->setTheme("TestModule.TestTheme", view->rootObject()); UCTheme *theme = view->theme(); QCOMPARE(theme->name(), QString("TestModule.TestTheme")); // reset theme->resetName(); QCOMPARE(theme->name(), QString("Ubuntu.Components.Themes.Ambiance")); } void test_parent_change_when_assinged() { QScopedPointer view(new ThemeTestCase("DynamicAssignment.qml")); UCTheme *testSet = view->findItem("testSet"); UCStyledItemBase *testItem = view->findItem("testItem"); UCStyledItemBase *mainItem = qobject_cast(view->rootObject()); QSignalSpy parentChangeSpy(testSet, SIGNAL(parentThemeChanged())); testItem->setTheme(testSet); parentChangeSpy.wait(200); QCOMPARE(parentChangeSpy.count(), 1); // test if the parent is correct QCOMPARE(testSet->parentTheme(), mainItem->getTheme()); } void test_parent_set_reset_triggers_parent_change() { QScopedPointer view(new ThemeTestCase("ParentChanges.qml")); UCTheme *testSet = view->findItem("testSet"); UCTheme *topTheme = view->findItem("top"); UCStyledItemBase *mainItem = qobject_cast(view->rootObject()); QCOMPARE(testSet->parentTheme(), topTheme); // reset mainItem's theme should trigger parentChanged on testSet QSignalSpy parentChangeSpy(testSet, SIGNAL(parentThemeChanged())); mainItem->resetTheme(); parentChangeSpy.wait(200); QCOMPARE(parentChangeSpy.count(), 1); QCOMPARE(mainItem->getTheme(), UCTheme::defaultTheme(view->engine())); QCOMPARE(testSet->parentTheme(), mainItem->getTheme()); } void test_parent_set_namechange_triggers_parent_change() { QScopedPointer view(new ThemeTestCase("ParentChanges.qml")); UCTheme *testSet = view->findItem("testSet"); UCStyledItemBase *mainItem = qobject_cast(view->rootObject()); // change mainItem.theme.name should trigger parentChanged on testSet QSignalSpy parentChangeSpy(testSet, SIGNAL(parentThemeChanged())); QSignalSpy themeChangeSpy(mainItem, SIGNAL(themeChanged())); mainItem->getTheme()->setName("Ubuntu.Components.Themes.SuruDark"); UbuntuTestCase::waitForSignal(&themeChangeSpy); parentChangeSpy.wait(200); QCOMPARE(parentChangeSpy.count(), 1); QCOMPARE(testSet->parentTheme(), mainItem->getTheme()); } // testing global context property 'theme' name changes void test_set_global_theme_name() { QScopedPointer view(new ThemeTestCase("TestMain.qml")); QSignalSpy themeChaneSpy(view->rootObject(), SIGNAL(themeChanged())); view->setGlobalTheme("Ubuntu.Components.Themes.SuruDark"); UbuntuTestCase::waitForSignal(&themeChaneSpy); // verify theme changes UCStyledItemBase *styled = qobject_cast(view->rootObject()); QVERIFY(styled); QCOMPARE(styled->getTheme()->name(), QString("Ubuntu.Components.Themes.SuruDark")); // a deeper item's style name styled = view->findItem("secondLevelStyled"); QCOMPARE(styled->getTheme()->name(), QString("Ubuntu.Components.Themes.SuruDark")); } // changing StyledItem.theme.name for different items within a tree where // no sub-theming si applied void test_set_styleditem_theme_name_data() { QTest::addColumn("itemName"); QTest::newRow("Subtheming enabled, set firstLevelStyled") << "firstLevelStyled"; QTest::newRow("Subtheming enabled, set secondLevelStyled") << "secondLevelStyled"; } void test_set_styleditem_theme_name() { QFETCH(QString, itemName); QScopedPointer view(new ThemeTestCase("TestMain.qml")); // change theme name (theme) UCStyledItemBase *styled = view->findItem(itemName); QSignalSpy themeChangeSpy(styled, SIGNAL(themeChanged())); styled->getTheme()->setName("Ubuntu.Components.Themes.SuruDark"); UbuntuTestCase::waitForSignal(&themeChangeSpy); UCTheme *theme = view->globalTheme(); QCOMPARE(theme->name(), QString("Ubuntu.Components.Themes.SuruDark")); } void test_theme_change_data() { QTest::addColumn("themeName"); QTest::addColumn("applyOnItem"); // empty means root object QTest::addColumn("testItems"); // list of objectNames to be tested QTest::addColumn("expectedStyleNames"); // list of expected style names on the tested items QTest::addColumn< QList >("sameTheme"); // list of theme vs styledItem.theme camparison results expected QString suru("Ubuntu.Components.Themes.SuruDark"); QString ambiance("Ubuntu.Components.Themes.Ambiance"); QTest::newRow("Suru on mainStyled") << suru << "" << (QStringList() << "firstLevelStyled" << "secondLevelStyled" << "firstLevelLoaderStyled") << (QStringList() << suru << suru << suru) << (QList() << true << true << true); QTest::newRow("Suru on firstLevelStyled") << suru << "firstLevelStyled" << (QStringList() << "secondLevelStyled" << "firstLevelLoaderStyled") << (QStringList() << suru << ambiance) << (QList() << true << false); } void test_theme_change() { QFETCH(QString, themeName); QFETCH(QString, applyOnItem); QFETCH(QStringList, testItems); QFETCH(QStringList, expectedStyleNames); QFETCH(QList, sameTheme); bool validTest = (testItems.count() == expectedStyleNames.count()) && (testItems.count() == sameTheme.count()); QVERIFY2(validTest, "testItems, expectedStyleNames, and sametheme must have same amount of values"); QScopedPointer view(new ThemeTestCase("TestStyleChange.qml")); UCTheme *theme = view->findItem("Theme"); UCStyledItemBase *styledItem = applyOnItem.isEmpty() ? qobject_cast(view->rootObject()) : view->findItem(applyOnItem); QVERIFY(styledItem); // the theme is declared, but should not be set yet!!! QVERIFY2(styledItem->getTheme() != theme, "ThemeSettings should not be set yet!"); theme->setName(themeName); // set the style on the item QSignalSpy themeChangeSpy(styledItem, SIGNAL(themeChanged())); styledItem->setTheme(theme); UbuntuTestCase::waitForSignal(&themeChangeSpy); // test on the items for (int i = 0; i < testItems.count(); i++) { QString itemName = testItems[i]; QString themeName = expectedStyleNames[i]; bool success = sameTheme[i]; styledItem = view->findItem(itemName); QCOMPARE(styledItem->getTheme() == theme, success); QCOMPARE(styledItem->getTheme()->name(), themeName); } } void test_reparent_styled_data() { QTest::addColumn("suruStyledItem"); QTest::addColumn("testStyledItem"); QTest::addColumn("testStyledItemThemes"); QTest::addColumn("sourceItemName"); QTest::addColumn("newParentItemName"); QString suru("Ubuntu.Components.Themes.SuruDark"); QString ambiance("Ubuntu.Components.Themes.Ambiance"); QTest::newRow("Move item out of Suru sub-themed") << "firstLevelStyled" << "secondLevelStyled" << (QStringList() << ambiance << suru << ambiance) << "secondLevelStyled" << "firstLevelLoader"; QTest::newRow("Move item into Suru sub-themed") << "firstLevelStyled" << "firstLevelLoaderStyled" << (QStringList() << ambiance << ambiance << suru) << "firstLevelLoader" << "secondLevelStyled"; QTest::newRow("Move dynamic item out of Suru sub-themed") << "firstLevelStyled" << "thirdLevelLoaderStyled" << (QStringList() << ambiance << suru << ambiance) << "secondLevelStyled" << "firstLevelLoader"; } void test_reparent_styled() { QFETCH(QString, suruStyledItem); QFETCH(QString, testStyledItem); QFETCH(QStringList, testStyledItemThemes); QFETCH(QString, sourceItemName); QFETCH(QString, newParentItemName); QScopedPointer view(new ThemeTestCase("TestStyleChange.qml")); UCStyledItemBase *testItem = view->findItem(testStyledItem); QCOMPARE(testItem->getTheme()->name(), testStyledItemThemes[0]); UCTheme *theme = view->findItem("Theme"); theme->setName("Ubuntu.Components.Themes.SuruDark"); UCStyledItemBase *suruItem = view->findItem(suruStyledItem); QSignalSpy themeChangeSpy(suruItem, SIGNAL(themeChanged())); suruItem->setTheme(theme); UbuntuTestCase::waitForSignal(&themeChangeSpy); QCOMPARE(testItem->getTheme()->name(), testStyledItemThemes[1]); // get items and reparent QQuickItem *sourceItem = view->findItem(sourceItemName); QQuickItem *newParentItem = view->findItem(newParentItemName); QVERIFY(sourceItem != newParentItem); QVERIFY(sourceItem->parentItem() != newParentItem); QSignalSpy themeSpy(testItem, SIGNAL(themeChanged())); sourceItem->setParentItem(newParentItem); themeSpy.wait(200); QCOMPARE(testItem->getTheme()->name(), testStyledItemThemes[2]); QCOMPARE(themeSpy.count(), 1); } void test_theme_name() { QScopedPointer view(new ThemeTestCase("DifferentThemes.qml")); UCStyledItemBase *main = qobject_cast(view->rootObject()); QVERIFY(main); UCStyledItemBase *test = view->findItem("firstLevelStyled"); QCOMPARE(main->getTheme()->name(), test->getTheme()->name()); } void test_no_change_in_other_suru_dark() { QScopedPointer view(new ThemeTestCase("SameNamedPaletteSettings.qml")); UCTheme *firstTheme = view->findItem("firstTheme"); UCTheme *secondTheme = view->findItem("secondTheme"); QVERIFY(firstTheme->getPaletteColor("normal", "background") != secondTheme->getPaletteColor("normal", "background")); } void test_keep_palette_value_when_theme_changes() { QScopedPointer view(new ThemeTestCase("ChangePaletteValueWhenParentChanges.qml")); UCTheme *firstTheme = view->findItem("firstTheme"); QCOMPARE(firstTheme->getPaletteColor("normal", "background"), QColor("blue")); // change the theme QSignalSpy themeChaneSpy(view->rootObject(), SIGNAL(themeChanged())); view->setGlobalTheme("Ubuntu.Components.Themes.SuruDark"); UbuntuTestCase::waitForSignal(&themeChaneSpy); QCOMPARE(firstTheme->getPaletteColor("normal", "background"), QColor("blue")); } void test_change_default_palette_in_children_kept_after_child_deletion() { QScopedPointer view(new ThemeTestCase("ChangeDefaultPaletteInChildren.qml")); QQuickItem *loader = view->findItem("loader"); UCStyledItemBase *main = qobject_cast(view->rootObject()); UCTheme *mainSet = main->getTheme(); QQuickItem *item = loader->property("item").value(); QVERIFY(item); QCOMPARE(mainSet->getPaletteColor("normal", "background"), QColor("blue")); // unload component QSignalSpy itemSpy(item, SIGNAL(destroyed())); loader->setProperty("sourceComponent", QVariant()); itemSpy.wait(); // palette stays! QCOMPARE(mainSet->getPaletteColor("normal", "background"), QColor("blue")); } void test_reset_palette_to_theme_default() { QScopedPointer view(new ThemeTestCase("ChangePaletteValueWhenParentChanges.qml")); UCTheme *firstTheme = view->findItem("firstTheme"); QColor prevColor = firstTheme->getPaletteColor("normal", "background"); QVERIFY(prevColor.isValid()); // reset palette QSignalSpy spy(firstTheme, SIGNAL(paletteChanged())); firstTheme->setPalette(NULL); spy.wait(200); QVERIFY(firstTheme->getPaletteColor("normal", "background") != prevColor); } void test_multiple_palette_instances() { QScopedPointer view(new ThemeTestCase("MultiplePaletteInstances.qml")); UCTheme *theme = view->findItem("theme"); QObject *palette1 = view->findItem("palette1"); QObject *palette2 = view->findItem("palette2"); QColor prevColor = theme->getPaletteColor("normal", "background"); // set the first palette QSignalSpy spy(theme, SIGNAL(paletteChanged())); theme->setPalette(palette1); spy.wait(200); QVERIFY(prevColor != theme->getPaletteColor("normal", "background")); QCOMPARE(theme->getPaletteColor("normal", "background"), QColor("blue")); spy.clear(); theme->setPalette(palette2); spy.wait(200); QVERIFY(prevColor != theme->getPaletteColor("normal", "background")); QCOMPARE(theme->getPaletteColor("normal", "background"), QColor("pink")); } void test_dynamic_palette() { QScopedPointer view(new ThemeTestCase("DynamicPalette.qml")); UCTheme *theme = view->findItem("theme"); QQuickItem *loader = view->findItem("paletteLoader"); QVERIFY(theme->getPaletteColor("normal", "background") == QColor("blue")); QSignalSpy spy(loader, SIGNAL(itemChanged())); loader->setProperty("sourceComponent", QVariant()); spy.wait(200); // unloaded palette by Loader should remove palette configuration QVERIFY(theme->getPaletteColor("normal", "background") != QColor("blue")); } void test_invalid_palette_object() { ThemeTestCase::ignoreWarning("InvalidPalette.qml", 22, 20, "QML QtObject: Not a Palette component."); QScopedPointer view(new ThemeTestCase("InvalidPalette.qml")); } void test_invalid_palette_value() { QString url(QUrl::fromLocalFile(QFileInfo("themes/BuggyTheme/Palette.qml").absoluteFilePath()).toEncoded()); QString warning(QString(": QML QQmlEngine: %1:24 Cannot assign to non-existent property \"imaginary\"\n").arg(url)); QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", "./themes"); QScopedPointer view(new ThemeTestCase("SimpleItem.qml")); view->setTheme("BuggyTheme", view->rootObject()); } void test_removing_closest_parent_styled() { qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", ""); qputenv("XDG_DATA_DIRS", "./themes:./themes/TestModule"); QScopedPointer view(new ThemeTestCase("ReparentStyledItemFollowsNewPathOnly.qml")); UCTheme *suruTheme = view->findItem("suruTheme"); UCStyledItemBase *root = static_cast(view->rootObject()); UCStyledItemBase *movableItem = view->findItem("movable"); // verify movableItem's theme QCOMPARE(root->getTheme(), movableItem->getTheme()); // set the theme for root QSignalSpy themeChangeSpy(root, SIGNAL(themeChanged())); root->setTheme(suruTheme); UbuntuTestCase::waitForSignal(&themeChangeSpy); QCOMPARE(root->getTheme(), movableItem->getTheme()); // set the parent item of the test item to 0 QSignalSpy spy(movableItem, SIGNAL(themeChanged())); movableItem->setParentItem(Q_NULLPTR); spy.wait(500); QCOMPARE(spy.count(), 1); QCOMPARE(movableItem->getTheme(), UCTheme::defaultTheme(view->engine())); } void test_reparented_styleditem_special_case() { qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", ""); qputenv("XDG_DATA_DIRS", "./themes:./themes/TestModule"); QScopedPointer view(new ThemeTestCase("ReparentStyledItemFollowsNewPathOnly.qml")); UCStyledItemBase *root = static_cast(view->rootObject()); UCTheme *suruTheme = view->findItem("suruTheme"); UCStyledItemBase *customThemedItem = view->findItem("customThemed"); UCStyledItemBase *movableItem = view->findItem("movable"); // check the themes QCOMPARE(root->getTheme()->name(), QString("Ubuntu.Components.Themes.Ambiance")); QCOMPARE(customThemedItem->getTheme()->name(), QString("CustomTheme")); QCOMPARE(movableItem->getTheme()->name(), QString("Ubuntu.Components.Themes.Ambiance")); // move the movableItem under customThemedItem movableItem->setParentItem(customThemedItem); QCOMPARE(movableItem->getTheme()->name(), QString("CustomTheme")); // set a new theme for the root, and make sure our theme stays the same QSignalSpy themeChangeSpy(root, SIGNAL(themeChanged())); root->setTheme(suruTheme); UbuntuTestCase::waitForSignal(&themeChangeSpy); QCOMPARE(movableItem->getTheme()->name(), QString("CustomTheme")); } void test_theme_versions_data() { QTest::addColumn("document"); QTest::addColumn("testValue"); QTest::newRow("Theming version 1.3") << "StyledItemV13.qml" << "version1.3"; QTest::newRow("App theme versioned") << "StyledItemAppThemeVersioned.qml" << "version1.3"; } void test_theme_versions() { QFETCH(QString, document); QFETCH(QString, testValue); qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", ""); qputenv("XDG_DATA_DIRS", "./themes:./themes/TestModule"); QScopedPointer view(new ThemeTestCase(document)); UCStyledItemBase *styledItem = qobject_cast(view->rootObject()); QVERIFY(UCStyledItemBasePrivate::get(styledItem)->styleItem); QString newProperty(UCStyledItemBasePrivate::get(styledItem)->styleItem->property("newProperty").toString()); QCOMPARE(newProperty, testValue); // NOTE TestTheme resets the theme therefore the theming will look for the tested style under Ambiance theme // which will cause a warning; therefore we mark the warning to be ignored ThemeTestCase::ignoreWarning(document, 19, 1, "QML StyledItem: Warning: Style TestStyle.qml not found in theme Ubuntu.Components.Themes.Ambiance"); } void test_mixed_versions() { ThemeTestCase::ignoreWarning("OtherVersion.qml", 19, 1, "QML StyledItem: Mixing of Ubuntu.Components module versions 1.3 and 1.2 detected!"); QScopedPointer view(new ThemeTestCase("OtherVersion.qml")); QTest::waitForEvents(); UCStyledItemBase *newStyled = static_cast(view->rootObject()); UCStyledItemBase *otherStyled = view->findItem("otherStyled"); QCOMPARE(UCStyledItemBasePrivate::get(newStyled)->styleInstance()->objectName(), QString("OptionSelector13")); QCOMPARE(UCStyledItemBasePrivate::get(otherStyled)->styleInstance()->objectName(), QString("OptionSelector12")); } void test_deprecated_theme() { qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", ""); qputenv("XDG_DATA_DIRS", "./themes:./themes/TestModule:" + m_themesPath.toLatin1()); QScopedPointer view(new ThemeTestCase("DeprecatedTheme.qml")); } void test_style_change_has_precedence() { QScopedPointer view(new ThemeTestCase("StyleOverride.qml")); QQmlComponent *style = view->rootObject()->property("customStyle").value(); QQuickItem *button = view->findItem("TestButton"); button->setProperty("style", QVariant::fromValue(style)); QVERIFY(button->findChild("TestStyle")); } void test_style_kept_when_stylename_changes_data() { QTest::addColumn("styleName"); QTest::newRow("Empty style name") << QString(); QTest::newRow("Any style name") << "Bumblebee"; } void test_style_kept_when_stylename_changes() { QFETCH(QString, styleName); QScopedPointer view(new ThemeTestCase("StyleKept.qml")); QQuickItem *button = view->findItem("TestButton"); button->setProperty("styleName", styleName); QVERIFY(button->findChild("TestStyle")); } void test_style_kept_when_theme_changes() { QScopedPointer view(new ThemeTestCase("StyleKept.qml")); QQuickItem *button = view->findItem("TestButton"); UCTheme *theme = button->property("theme").value(); QVERIFY(theme); theme->setName("Ubuntu.Components.Themes.SuruDark"); QVERIFY(button->findChild("TestStyle")); } void test_style_reset_to_theme_style() { QScopedPointer view(new ThemeTestCase("StyleKept.qml")); UCStyledItemBase *button = view->findItem("TestButton"); UCTheme *theme = button->getTheme(); QVERIFY(theme); QVERIFY(button->findChild("TestStyle")); // reset style property, which should reset style to the theme style UCStyledItemBasePrivate::get(button)->resetStyle(); QQuickItem *styleItem = UCStyledItemBasePrivate::get(button)->styleInstance(); QCOMPARE(QuickUtils::className(styleItem), QString("ButtonStyle")); } void test_stylename_extension_failure() { ThemeTestCase::ignoreWarning("DeprecatedTheme.qml", 19, 1, "QML StyledItem: Warning: Style OptionSelectorStyle.qml.qml not found in theme Ubuntu.Components.Themes.SuruGradient"); QScopedPointer view(new ThemeTestCase("DeprecatedTheme.qml")); view->rootObject()->setProperty("styleName", "OptionSelectorStyle.qml"); } void test_stylehints_errors_data() { QTest::addColumn("document"); QTest::addColumn("row"); QTest::addColumn("col"); QTest::addColumn("xfail"); QTest::newRow("No signals") << "StyleHintsWithSignal.qml" << 26 << 13 << "Signal properties are not supported. \n" \ " onDefaultColorChanged: {} \n" \ " ^"; QTest::newRow("No embedded objects") << "StyleHintsWithObject.qml" << 26 << 26 << "StyleHints does not support creating state-specific objects. \n" \ " anyProperty: QtObject{} \n" \ " ^"; QTest::newRow("StyleHints declared elsewhere") << "StyleHintsElsewhere.qml" << 24 << 5 << "QML StyleHints: StyleHints must be declared in a StyledItem or a derivate of it."; QTest::newRow("Invalid property") << "StyleHintsInvalidProperty.qml" << 25 << 9 << "QML StyleHints: Style 'ButtonStyle' has no property called 'invalidProperty'."; } void test_stylehints_errors() { QFETCH(QString, document); QFETCH(int, row); QFETCH(int, col); QFETCH(QString, xfail); if (!xfail.isEmpty()) { ThemeTestCase::ignoreWarning(document, row, col, xfail); } QScopedPointer view(new ThemeTestCase(document, false)); } void test_stylehints_simple_property() { QScopedPointer view(new ThemeTestCase("SimplePropertyHints.qml")); QQuickItem *button = view->findItem("Button"); QColor color = button->property("color").value(); QCOMPARE(color, QColor("blue")); } void test_stylehints_bindings() { QScopedPointer view(new ThemeTestCase("PropertyBindingHints.qml")); QQuickItem *button = view->findItem("Button"); QColor color = button->property("color").value(); QCOMPARE(color, QColor("blue")); // press the button QPointF pressPt(button->width()/2, button->height()/2); pressPt = view->rootObject()->mapFromItem(button, pressPt); QTest::mousePress(view.data(), Qt::LeftButton, 0, pressPt.toPoint()); color = button->property("color").value(); QCOMPARE(color, QColor("tan")); QTest::mouseRelease(view.data(), Qt::LeftButton, 0, pressPt.toPoint()); } void test_stylehints_multiple_data() { QTest::addColumn("document"); QTest::addColumn("colorProperty"); QTest::addColumn("colorReleased"); QTest::addColumn("colorPressed"); QTest::addColumn("widthProperty"); QTest::addColumn("width"); UCUnits units; QTest::newRow("Same document") << "MoreStyleHints.qml" << "defaultColor" << QColor("brown") << QColor("brown") << "minimumWidth" << units.gu(20); QTest::newRow("Different document") << "GroupPropertyBindingHints.qml" << "gradientProxy.topColor" << QColor("blue") << QColor("tan") << "minimumWidth" << units.gu(20); } void test_stylehints_multiple() { QFETCH(QString, document); QFETCH(QString, colorProperty); QFETCH(QColor, colorReleased); QFETCH(QColor, colorPressed); QFETCH(QString, widthProperty); QFETCH(float, width); QScopedPointer view(new ThemeTestCase(document)); UCStyledItemBase *button = view->findItem("Button"); QQuickItem *styleItem = UCStyledItemBasePrivate::get(button)->styleItem; QVERIFY(styleItem); QQmlProperty qmlProperty(styleItem, colorProperty, qmlContext(styleItem)); QCOMPARE(qmlProperty.read().value(), colorReleased); QCOMPARE(styleItem->property(widthProperty.toUtf8()).toReal(), width); QPointF pressPt(button->width()/2, button->height()/2); pressPt = view->rootObject()->mapFromItem(button, pressPt); QTest::mousePress(view.data(), Qt::LeftButton, 0, pressPt.toPoint()); QColor pressedColor = qmlProperty.read().value(); QTest::mouseRelease(view.data(), Qt::LeftButton, 0, pressPt.toPoint()); QCOMPARE(pressedColor, colorPressed); } void test_derived_theme_fallback_should_use_proper_style_bug1555797() { qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", ""); qputenv("XDG_DATA_DIRS", "./themes:./themes/TestModule"); QQmlEngine engine; UbuntuComponentsPlugin::initializeContextProperties(&engine); QScopedPointer theme(new UCTheme); theme->setName("DerivedTheme"); // get the style URL bool fallback = false; QUrl style = theme->styleUrl("TestStyle.qml", BUILD_VERSION(1, 3), &fallback); QVERIFY(style.toString().endsWith("TestTheme/1.3/TestStyle.qml")); } }; QTEST_MAIN(tst_Subtheming) #include "tst_subtheming.moc" ./tests/unit_x11/tst_subtheming/DynamicPalette.qml0000644000015600001650000000242612700370701022365 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes 1.3 StyledItem { theme.objectName: "MasterTheme" StyledItem { id: styled theme: ThemeSettings { objectName: "theme" } Loader { objectName: "paletteLoader" sourceComponent: paletteComponent onItemChanged: { if (item) { styled.theme.palette = item; } } } } Component { id: paletteComponent Palette { objectName: "palette" normal.background: "blue" } } } ./tests/unit_x11/tst_subtheming/DifferentThemes.qml0000644000015600001650000000250112700370701022530 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { id: main width: units.gu(40) height: units.gu(71) objectName: "mainStyled" theme.name: "Ubuntu.Components.Themes.SuruGradient" Column { anchors.fill: parent StyledItem { objectName: "firstLevelStyled" width: parent.width height: units.gu(20) theme: ThemeSettings { name: parentTheme.name } Item { anchors.fill: parent StyledItem { objectName: "secondLevelStyled" anchors.fill: parent } } } } } ./tests/unit_x11/tst_subtheming/OverrideStyleHints.qml0000644000015600001650000000154412700370701023270 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: units.gu(40) height: units.gu(71) HintedButton { objectName: "Button" StyleHints { minimumWidth: 5 } } } ./tests/unit_x11/tst_subtheming/TestMain.qml0000644000015600001650000000224212700370701021202 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { width: units.gu(40) height: units.gu(71) objectName: "mainStyled" Column { anchors.fill: parent StyledItem { objectName: "firstLevelStyled" width: parent.width height: units.gu(20) Item { anchors.fill: parent StyledItem { objectName: "secondLevelStyled" anchors.fill: parent } } } } } ./tests/unit_x11/tst_subtheming/MultiplePaletteInstances.qml0000644000015600001650000000203312700370701024436 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes 1.3 StyledItem { theme.objectName: "MasterTheme" StyledItem { theme: ThemeSettings { objectName: "theme" } } Palette { objectName: "palette1" normal.background: "blue" } Palette { objectName: "palette2" normal.background: "pink" } } ./tests/unit_x11/tst_subtheming/StyleOverride.qml0000644000015600001650000000263212700370701022261 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: units.gu(40) height: units.gu(40) Button { objectName: "TestButton" text: "PressMe..." } property Component customStyle: Component { Rectangle { objectName: "TestStyle" // FIXME: move these properties to the Style API property color defaultColor: "blue" property Gradient defaultGradient property font defaultFont anchors.fill: styledItem color: defaultColor Label { anchors.fill: parent horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter text: styledItem.text } } } } ./tests/unit_x11/tst_subtheming/StyledItemV13.qml0000644000015600001650000000142312700370701022033 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { id: item theme.name: "themes.CustomTheme" styleName: "TestStyle" } ./tests/unit_x11/tst_subtheming/StyleHintsWithObject.qml0000644000015600001650000000151112700370701023545 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: units.gu(40) height: units.gu(71) Button { StyleHints { anyProperty: QtObject{} } } } ./tests/unit_x11/tst_subtheming/OtherVersion.qml0000644000015600001650000000160012700370701022102 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { width: units.gu(40) height: units.gu(40) theme.name: "Ubuntu.Components.Themes.Ambiance" styleName: "OptionSelectorStyle" StyledItemV12 { objectName: "otherStyled" } } ./tests/unit_x11/tst_subtheming/StyleHintsWithSignal.qml0000644000015600001650000000151312700370701023556 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: units.gu(40) height: units.gu(71) Button { StyleHints { onDefaultColorChanged: {} } } } ./tests/unit_x11/tst_subtheming/StyledItemV12.qml0000644000015600001650000000151312700370701022032 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 StyledItem { id: item width: units.gu(20) height: units.gu(20) style: Theme.createStyleComponent("OptionSelectorStyle.qml", item) } ./tests/unit_x11/tst_subtheming/tst_subtheming.pro0000644000015600001650000000305612700370714022534 0ustar jenkinsjenkinsinclude(../test-include.pri) QT += core-private qml-private quick-private gui-private SOURCES += tst_subtheming.cpp OTHER_FILES += \ TestStyle.qml \ SimpleItem.qml \ themes/CustomTheme/TestStyle.qml \ themes/CustomTheme/Palette.qml \ themes/CustomTheme/parent_theme \ themes/TestModule/TestTheme/1.2/TestStyle.qml \ themes/TestModule/TestTheme/1.3/TestStyle.qml \ themes/TestModule/TestTheme/qmldir \ themes/TestModule/TestTheme/parent_theme \ DynamicAssignment.qml \ ParentChanges.qml \ TestMain.qml \ TestStyleChange.qml \ DifferentThemes.qml \ SameNamedPaletteSettings.qml \ ChangePaletteValueWhenParentChanges.qml \ ChangeDefaultPaletteInChildren.qml \ MultiplePaletteInstances.qml \ DynamicPalette.qml \ InvalidPalette.qml \ ReparentStyledItemFollowsNewPathOnly.qml \ themes/TestModule/TestTheme/1.3/TestStyle.qml \ themes/CustomTheme/1.3/TestStyle.qml \ StyledItemV12.qml \ StyledItemV13.qml \ DeprecatedTheme.qml \ StyledItemAppThemeVersioned.qml \ StyleOverride.qml \ StyleKept.qml \ SimplePropertyHints.qml \ StyleHintsWithSignal.qml \ StyleHintsWithObject.qml \ StyleHintsElsewhere.qml \ StyleHintsInvalidProperty.qml \ PropertyBindingHints.qml \ MoreStyleHints.qml \ GroupPropertyBindingHints.qml \ OverrideStyleHints.qml \ HintedButton.qml \ OtherVersion.qml \ DefaultTheme.qml \ themes/DerivedTheme/parent_theme \ themes/DerivedTheme/1.2/TestStyle.qml \ themes/DerivedTheme/1.3/Palette.qml ./tests/unit_x11/tst_subtheming/StyleKept.qml0000644000015600001650000000255212700370701021406 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: units.gu(40) height: units.gu(40) Button { objectName: "TestButton" text: "PressMe..." style: Rectangle { objectName: "TestStyle" // FIXME: move these properties to the Style API property color defaultColor: "blue" property Gradient defaultGradient property font defaultFont anchors.fill: styledItem color: defaultColor Label { anchors.fill: parent horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter text: styledItem.text } } } } ./tests/unit_x11/tst_subtheming/CustomModule/0000755000015600001650000000000012700370701021363 5ustar jenkinsjenkins./tests/unit_x11/tst_subtheming/CustomModule/TestTheme/0000755000015600001650000000000012700370701023265 5ustar jenkinsjenkins./tests/unit_x11/tst_subtheming/CustomModule/TestTheme/TestStyle.qml0000644000015600001650000000124412700370701025741 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 Item { } ./tests/unit_x11/tst_subtheming/SimpleItem.qml0000644000015600001650000000147712700370701021537 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { id: item theme: ThemeSettings {} property string themeName onThemeNameChanged: theme.name = themeName; } ./tests/unit_x11/tst_subtheming/ReparentStyledItemFollowsNewPathOnly.qml0000644000015600001650000000203712700370701026743 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { width: units.gu(40) height: units.gu(40) ThemeSettings { objectName: "suruTheme" name: "Ubuntu.Components.Themes.SuruDark" } StyledItem { objectName: "customThemed" theme: ThemeSettings { name: "CustomTheme" } } StyledItem { objectName: "movable" } } ./tests/unit_x11/tst_animator/0000755000015600001650000000000012700370716016416 5ustar jenkinsjenkins./tests/unit_x11/tst_animator/tst_animator13.qml0000644000015600001650000000203512700370701021773 0ustar jenkinsjenkins/* * Copyright 2014-2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /** * Test to prevent regressions for bug: https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1338602 * Activity Indicator crashes in QML/Widget mixed applications */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { Flow { anchors.fill: parent Repeater { model: 3 ActivityIndicator { running: true } } } } ./tests/unit_x11/tst_animator/tst_animator.pro0000644000015600001650000000027512700370714021646 0ustar jenkinsjenkinsinclude(../test-include.pri) QT += core-private qml-private quick-private gui-private CONFIG += c++11 SOURCES += \ tst_animator.cpp HEADERS += OTHER_FILES += \ tst_animator.qml ./tests/unit_x11/tst_animator/tst_animator.cpp0000644000015600001650000000400012700370714021616 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /* * Test to prevent regressions for bug: https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1338602 * Activity Indicator crashes in QML/Widget mixed applications */ #include #include #include #include #include #include #include "uctestcase.h" #include "uctheme.h" class Tst_Animator : public QObject { Q_OBJECT private Q_SLOTS: void tst_animatorRegression_data() { QTest::addColumn("filename"); QTest::addColumn("suppressDeprecatedNote"); QTest::newRow("1.1") << QString("tst_animator.qml") << QString("yes"); QTest::newRow("1.3") << QString("tst_animator13.qml") << QString("no"); } void tst_animatorRegression () { QFETCH(QString, filename); QFETCH(QString, suppressDeprecatedNote); UCTheme::previousVersion = 0; qputenv("SUPPRESS_DEPRECATED_NOTE", qPrintable(suppressDeprecatedNote)); QEventLoop l; QScopedPointer w(new UbuntuTestCase(filename)); int countdown = 20; QTimer t; t.setInterval(100); connect(&t,&QTimer::timeout,[&]{ w->setVisible(!w->visibility()); if(--countdown == 0) l.exit(0); }); t.start(); l.exec(); } }; QTEST_MAIN(Tst_Animator) #include "tst_animator.moc" ./tests/unit_x11/tst_animator/tst_animator.qml0000644000015600001650000000351312700370701021631 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /** * Test to prevent regressions for bug: https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1338602 * Activity Indicator crashes in QML/Widget mixed applications */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { Flow { anchors.fill: parent Repeater { model: 3 ActivityIndicator { running: true } } } /* //Qt Equivalent to ActivityIndcator, enable this to test if Qt still has the problem Flow { anchors.fill: parent Repeater { model: 3 Image { id: container smooth: true visible: true fillMode: Image.PreserveAspectFit horizontalAlignment: Image.AlignHCenter verticalAlignment: Image.AlignVCenter source: "../../../src/Ubuntu/Components/Themes/Ambiance/artwork/spinner@8.png" RotationAnimator on rotation { running: true from: 0 to: 360 loops: Animation.Infinite duration: 1000 } } } } */ } ./tests/unit_x11/tst_touchregistry/0000755000015600001650000000000012700370716017517 5ustar jenkinsjenkins./tests/unit_x11/tst_touchregistry/tst_TouchRegistry.cpp0000644000015600001650000010441712700370714023735 0ustar jenkinsjenkins/* * Copyright (C) 2014-2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include using namespace UbuntuGestures; class TouchMemento { public: TouchMemento(const QTouchEvent *touchEvent); Qt::TouchPointStates touchPointStates; QList touchPoints; bool containsTouchWithId(int touchId) const; }; class DummyCandidate : public QQuickItem { Q_OBJECT public: bool event(QEvent *e) override; QSet ownedTouches; QSet lostTouches; QList unownedTouchEvents; }; class tst_TouchRegistry : public QObject { Q_OBJECT public: tst_TouchRegistry() : QObject(0) { } private Q_SLOTS: void initTestCase() {} // will be called before the first test function is executed void cleanupTestCase() {} // will be called after the last test function was executed. void init(); // called right before each and every test function is executed void cleanup(); // called right after each and every test function is executed void requestWithNoCandidates(); void lateCandidateRequestGetsNothing(); void lateCandidateGestOwnershipOnceEarlyCandidateQuits(); void dispatchesTouchEventsToCandidates(); void dispatchesTouchEventsToWatchers(); void keepDispatchingToWatchersAfterLastCandidateGivesUp(); void candidatesAndWatchers_1(); void candidatesAndWatchers_2(); void rejectingTouchfterItsEnd(); void removeOldUndecidedCandidates(); void interimOwnerWontGetUnownedTouchEvents(); void candidateVanishes(); private: TouchRegistry *touchRegistry; }; void tst_TouchRegistry::init() { touchRegistry = TouchRegistry::instance(); } void tst_TouchRegistry::cleanup() { delete touchRegistry; } void tst_TouchRegistry::requestWithNoCandidates() { DummyCandidate candidate; { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointPressed); QTouchEvent touchEvent(QEvent::TouchBegin, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed, touchPoints); touchRegistry->update(&touchEvent); } touchRegistry->requestTouchOwnership(0, &candidate); QVERIFY(candidate.ownedTouches.contains(0)); } void tst_TouchRegistry::lateCandidateRequestGetsNothing() { DummyCandidate earlyCandidate; earlyCandidate.setObjectName("early"); DummyCandidate lateCandidate; lateCandidate.setObjectName("late"); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointPressed); QTouchEvent touchEvent(QEvent::TouchBegin, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed, touchPoints); touchRegistry->update(&touchEvent); } touchRegistry->addCandidateOwnerForTouch(0, &earlyCandidate); touchRegistry->addCandidateOwnerForTouch(0, &lateCandidate); QVERIFY(earlyCandidate.ownedTouches.isEmpty()); QVERIFY(lateCandidate.ownedTouches.isEmpty()); touchRegistry->requestTouchOwnership(0, &lateCandidate); QVERIFY(earlyCandidate.ownedTouches.isEmpty()); QVERIFY(lateCandidate.ownedTouches.isEmpty()); touchRegistry->requestTouchOwnership(0, &earlyCandidate); QVERIFY(earlyCandidate.ownedTouches.contains(0)); QVERIFY(lateCandidate.ownedTouches.isEmpty()); } void tst_TouchRegistry::lateCandidateGestOwnershipOnceEarlyCandidateQuits() { DummyCandidate earlyCandidate; DummyCandidate lateCandidate; { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointPressed); QTouchEvent touchEvent(QEvent::TouchBegin, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed, touchPoints); touchRegistry->update(&touchEvent); } touchRegistry->addCandidateOwnerForTouch(0, &earlyCandidate); touchRegistry->addCandidateOwnerForTouch(0, &lateCandidate); QVERIFY(earlyCandidate.ownedTouches.isEmpty()); QVERIFY(lateCandidate.ownedTouches.isEmpty()); touchRegistry->requestTouchOwnership(0, &lateCandidate); QVERIFY(earlyCandidate.ownedTouches.isEmpty()); QVERIFY(lateCandidate.ownedTouches.isEmpty()); touchRegistry->removeCandidateOwnerForTouch(0, &earlyCandidate); QVERIFY(earlyCandidate.ownedTouches.isEmpty()); QVERIFY(lateCandidate.ownedTouches.contains(0)); } void tst_TouchRegistry::dispatchesTouchEventsToCandidates() { QQuickItem rootItem; DummyCandidate candidate0; candidate0.setObjectName("0"); candidate0.setParentItem(&rootItem); candidate0.setX(1); candidate0.setY(2); DummyCandidate candidate1; candidate1.setObjectName("1"); candidate0.setParentItem(&rootItem); candidate1.setX(3); candidate1.setY(4); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointPressed); touchPoints[0].setRect(QRect(10, 10, 0, 0)); QTouchEvent touchEvent(QEvent::TouchBegin, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed, touchPoints); touchRegistry->update(&touchEvent); } touchRegistry->addCandidateOwnerForTouch(0, &candidate0); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointMoved); touchPoints[0].setRect(QRect(11, 11, 0, 0)); touchPoints.append(QTouchEvent::TouchPoint(1)); touchPoints[1].setState(Qt::TouchPointPressed); touchPoints[1].setRect(QRect(20, 20, 0, 0)); QTouchEvent touchEvent(QEvent::TouchUpdate, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed | Qt::TouchPointMoved, touchPoints); touchRegistry->update(&touchEvent); } // candidate0 should have received an update on the touch he's interested on. QCOMPARE(candidate0.unownedTouchEvents.count(), 1); // make sure only touch 0 is there (i.e. no mention of touch 1) QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints.count(), 1); QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints[0].id(), 0); // Check that the points local coordinates have been mapped to candidate0's coordinate system. QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints[0].rect().x(), 11 - candidate0.x()); QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints[0].rect().y(), 11 - candidate0.y()); touchRegistry->addCandidateOwnerForTouch(1, &candidate1); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointMoved); touchPoints[0].setRect(QRect(12, 12, 0, 0)); touchPoints.append(QTouchEvent::TouchPoint(1)); touchPoints[1].setState(Qt::TouchPointMoved); touchPoints[1].setRect(QRect(21, 21, 0, 0)); QTouchEvent touchEvent(QEvent::TouchUpdate, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed | Qt::TouchPointMoved, touchPoints); touchRegistry->update(&touchEvent); } // candidate0 gets updates only for touch 0 and // candidate1 gets updates only for touch 1 QCOMPARE(candidate0.unownedTouchEvents.count(), 2); QCOMPARE(candidate0.unownedTouchEvents[1].touchPoints.count(), 1); QCOMPARE(candidate0.unownedTouchEvents[1].touchPoints[0].id(), 0); QCOMPARE(candidate1.unownedTouchEvents.count(), 1); QCOMPARE(candidate1.unownedTouchEvents[0].touchPoints.count(), 1); QCOMPARE(candidate1.unownedTouchEvents[0].touchPoints[0].id(), 1); } void tst_TouchRegistry::dispatchesTouchEventsToWatchers() { QQuickItem rootItem; DummyCandidate watcher; watcher.setObjectName("watcher"); watcher.setParentItem(&rootItem); watcher.setX(1); watcher.setY(2); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointPressed); touchPoints[0].setRect(QRect(10, 10, 0, 0)); QTouchEvent touchEvent(QEvent::TouchBegin, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed, touchPoints); touchRegistry->update(&touchEvent); } touchRegistry->addTouchWatcher(0, &watcher); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointMoved); touchPoints[0].setRect(QRect(11, 11, 0, 0)); touchPoints.append(QTouchEvent::TouchPoint(1)); touchPoints[1].setState(Qt::TouchPointPressed); touchPoints[1].setRect(QRect(20, 20, 0, 0)); QTouchEvent touchEvent(QEvent::TouchUpdate, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed | Qt::TouchPointMoved, touchPoints); touchRegistry->update(&touchEvent); } // watcher should have received an update on the touch he's interested on. QCOMPARE(watcher.unownedTouchEvents.count(), 1); // make sure only touch 0 is there (i.e. no mention of touch 1) QCOMPARE(watcher.unownedTouchEvents[0].touchPoints.count(), 1); QCOMPARE(watcher.unownedTouchEvents[0].touchPoints[0].id(), 0); // Check that the points local coordinates have been mapped to watcher's coordinate system. QCOMPARE(watcher.unownedTouchEvents[0].touchPoints[0].rect().x(), 11 - watcher.x()); QCOMPARE(watcher.unownedTouchEvents[0].touchPoints[0].rect().y(), 11 - watcher.y()); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointMoved); touchPoints[0].setRect(QRect(12, 12, 0, 0)); touchPoints.append(QTouchEvent::TouchPoint(1)); touchPoints[1].setState(Qt::TouchPointMoved); touchPoints[1].setRect(QRect(21, 21, 0, 0)); QTouchEvent touchEvent(QEvent::TouchUpdate, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed | Qt::TouchPointMoved, touchPoints); touchRegistry->update(&touchEvent); } // watcher gets updates only for touch 0 QCOMPARE(watcher.unownedTouchEvents.count(), 2); QCOMPARE(watcher.unownedTouchEvents[1].touchPoints.count(), 1); QCOMPARE(watcher.unownedTouchEvents[1].touchPoints[0].id(), 0); } void tst_TouchRegistry::keepDispatchingToWatchersAfterLastCandidateGivesUp() { DummyCandidate item; { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointPressed); QTouchEvent touchEvent(QEvent::TouchBegin, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed, touchPoints); touchRegistry->update(&touchEvent); } touchRegistry->addCandidateOwnerForTouch(0, &item); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointMoved); touchPoints.append(QTouchEvent::TouchPoint(1)); touchPoints[1].setState(Qt::TouchPointPressed); QTouchEvent touchEvent(QEvent::TouchUpdate, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed | Qt::TouchPointMoved, touchPoints); touchRegistry->update(&touchEvent); } QCOMPARE(item.unownedTouchEvents.count(), 1); QCOMPARE(item.unownedTouchEvents[0].touchPoints.count(), 1); QCOMPARE(item.unownedTouchEvents[0].touchPoints[0].id(), 0); item.unownedTouchEvents.clear(); touchRegistry->addTouchWatcher(1, &item); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointMoved); touchPoints.append(QTouchEvent::TouchPoint(1)); touchPoints[1].setState(Qt::TouchPointMoved); QTouchEvent touchEvent(QEvent::TouchUpdate, 0 /* device */, Qt::NoModifier, Qt::TouchPointMoved, touchPoints); touchRegistry->update(&touchEvent); } QCOMPARE(item.unownedTouchEvents.count(), 1); QCOMPARE(item.unownedTouchEvents[0].touchPoints.count(), 2); QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(0)); QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(1)); item.unownedTouchEvents.clear(); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointReleased); touchPoints.append(QTouchEvent::TouchPoint(1)); touchPoints[1].setState(Qt::TouchPointMoved); QTouchEvent touchEvent(QEvent::TouchUpdate, 0 /* device */, Qt::NoModifier, Qt::TouchPointReleased | Qt::TouchPointMoved, touchPoints); touchRegistry->update(&touchEvent); } QCOMPARE(item.unownedTouchEvents.count(), 1); QCOMPARE(item.unownedTouchEvents[0].touchPoints.count(), 2); QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(0)); QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(1)); item.unownedTouchEvents.clear(); touchRegistry->removeCandidateOwnerForTouch(0, &item); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(1)); touchPoints[0].setState(Qt::TouchPointReleased); QTouchEvent touchEvent(QEvent::TouchEnd, 0 /* device */, Qt::NoModifier, Qt::TouchPointReleased, touchPoints); touchRegistry->update(&touchEvent); } QCOMPARE(item.unownedTouchEvents.count(), 1); QCOMPARE(item.unownedTouchEvents[0].touchPoints.count(), 1); QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(1)); item.unownedTouchEvents.clear(); QVERIFY(touchRegistry->m_touchInfoPool.isEmpty()); } /* Regression test that reproduces a problematic scenario that came up during manual testing. It reproduces the interaction between TouchRegistry and a DirectionalDragArea */ void tst_TouchRegistry::candidatesAndWatchers_1() { DummyCandidate item; { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointPressed); QTouchEvent touchEvent(QEvent::TouchBegin, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed, touchPoints); touchRegistry->update(&touchEvent); } touchRegistry->addCandidateOwnerForTouch(0, &item); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointMoved); touchPoints.append(QTouchEvent::TouchPoint(1)); touchPoints[1].setState(Qt::TouchPointPressed); QTouchEvent touchEvent(QEvent::TouchUpdate, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed | Qt::TouchPointMoved, touchPoints); touchRegistry->update(&touchEvent); } touchRegistry->addTouchWatcher(1, &item); touchRegistry->removeCandidateOwnerForTouch(0, &item); touchRegistry->addTouchWatcher(0, &item); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointReleased); touchPoints.append(QTouchEvent::TouchPoint(1)); touchPoints[1].setState(Qt::TouchPointMoved); QTouchEvent touchEvent(QEvent::TouchUpdate, 0 /* device */, Qt::NoModifier, Qt::TouchPointReleased | Qt::TouchPointMoved, touchPoints); touchRegistry->update(&touchEvent); } { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(1)); touchPoints[0].setState(Qt::TouchPointReleased); QTouchEvent touchEvent(QEvent::TouchEnd, 0 /* device */, Qt::NoModifier, Qt::TouchPointReleased, touchPoints); touchRegistry->update(&touchEvent); } QVERIFY(touchRegistry->m_touchInfoPool.isEmpty()); item.unownedTouchEvents.clear(); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointPressed); QTouchEvent touchEvent(QEvent::TouchBegin, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed, touchPoints); touchRegistry->update(&touchEvent); } // Haven't made any subscription for that new touch 0. QCOMPARE(item.unownedTouchEvents.count(), 0); } /* Regression test that reproduces a problematic scenario that came up during manual testing. It reproduces the interaction between TouchRegistry, DirectionalDragArea and a TouchGate. */ void tst_TouchRegistry::candidatesAndWatchers_2() { DummyCandidate directionalDragArea; directionalDragArea.setObjectName("DirectionalDragArea"); DummyCandidate touchGate; touchGate.setObjectName("TouchGate"); // [DDA] 1298 TouchBegin (id:0, state:pressed, scenePos:(147,1023)) { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointPressed); QTouchEvent touchEvent(QEvent::TouchBegin, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed, touchPoints); touchRegistry->update(&touchEvent); } // [TouchRegistry] addCandidateOwnerForTouch id 0 candidate DirectionalDragArea touchRegistry->addCandidateOwnerForTouch(0, &directionalDragArea); // [TouchRegistry] requestTouchOwnership id 0 candidate TouchGate touchRegistry->requestTouchOwnership(0, &touchGate); //[TouchRegistry] got TouchUpdate (id:0, state:moved, scenePos:(147,1023)) (id:1, state:pressed, scenePos:(327,792)) { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointMoved); touchPoints.append(QTouchEvent::TouchPoint(1)); touchPoints[1].setState(Qt::TouchPointPressed); QTouchEvent touchEvent(QEvent::TouchUpdate, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed | Qt::TouchPointMoved, touchPoints); touchRegistry->update(&touchEvent); } // [TouchRegistry] addTouchWatcher id 1 watcher DirectionalDragArea touchRegistry->addTouchWatcher(1, &directionalDragArea); // [TouchRegistry] removeCandidateOwnerForTouch id 0 candidate DirectionalDragArea touchRegistry->removeCandidateOwnerForTouch(0, &directionalDragArea); //[TouchRegistry] sending TouchWonershipEvent(id = 0 gained) to candidate TouchGate QCOMPARE(touchGate.ownedTouches.count(), 1); QVERIFY(touchGate.ownedTouches.contains(0)); // [TouchRegistry] addTouchWatcher id 0 watcher DirectionalDragArea touchRegistry->addTouchWatcher(0, &directionalDragArea); // [TouchRegistry] requestTouchOwnership id 1 candidate TouchGate touchRegistry->requestTouchOwnership(1, &touchGate); //[TouchRegistry] sending TouchWonershipEvent(id = 1 gained) to candidate TouchGate QCOMPARE(touchGate.ownedTouches.count(), 2); QVERIFY(touchGate.ownedTouches.contains(1)); directionalDragArea.unownedTouchEvents.clear(); touchGate.unownedTouchEvents.clear(); //[TouchRegistry] got TouchUpdate (id:0, state:moved, scenePos:(148,1025)) (id:1, state:moved, scenePos:(329,795)) { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointMoved); touchPoints.append(QTouchEvent::TouchPoint(1)); touchPoints[1].setState(Qt::TouchPointMoved); QTouchEvent touchEvent(QEvent::TouchUpdate, 0 /* device */, Qt::NoModifier, Qt::TouchPointMoved, touchPoints); touchRegistry->update(&touchEvent); } //vvvvv DDA Watchers are being ignored from now on vvvvvvv QCOMPARE(directionalDragArea.unownedTouchEvents.count(), 1); QCOMPARE(directionalDragArea.unownedTouchEvents.first().touchPoints.count(), 2); QVERIFY(directionalDragArea.unownedTouchEvents.first().containsTouchWithId(0)); QVERIFY(directionalDragArea.unownedTouchEvents.first().containsTouchWithId(1)); QVERIFY(touchGate.unownedTouchEvents.isEmpty()); directionalDragArea.unownedTouchEvents.clear(); //[TouchRegistry] got TouchUpdate (id:0, state:moved, scenePos:(151,1029)) (id:1, state:released, scenePos:(329,795)) { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointMoved); touchPoints.append(QTouchEvent::TouchPoint(1)); touchPoints[1].setState(Qt::TouchPointReleased); QTouchEvent touchEvent(QEvent::TouchUpdate, 0 /* device */, Qt::NoModifier, Qt::TouchPointMoved | Qt::TouchPointReleased, touchPoints); touchRegistry->update(&touchEvent); } QCOMPARE(directionalDragArea.unownedTouchEvents.count(), 1); QCOMPARE(directionalDragArea.unownedTouchEvents.first().touchPoints.count(), 2); QVERIFY(directionalDragArea.unownedTouchEvents.first().containsTouchWithId(0)); QVERIFY(directionalDragArea.unownedTouchEvents.first().containsTouchWithId(1)); QVERIFY(touchGate.unownedTouchEvents.isEmpty()); directionalDragArea.unownedTouchEvents.clear(); //[TouchRegistry] got TouchEnd (id:0, state:released, scenePos:(157,1034)) { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointReleased); QTouchEvent touchEvent(QEvent::TouchEnd, 0 /* device */, Qt::NoModifier, Qt::TouchPointReleased, touchPoints); touchRegistry->update(&touchEvent); } QCOMPARE(directionalDragArea.unownedTouchEvents.count(), 1); QCOMPARE(directionalDragArea.unownedTouchEvents.first().touchPoints.count(), 1); QVERIFY(directionalDragArea.unownedTouchEvents.first().containsTouchWithId(0)); QVERIFY(touchGate.unownedTouchEvents.isEmpty()); } void tst_TouchRegistry::rejectingTouchfterItsEnd() { DummyCandidate earlyCandidate; DummyCandidate lateCandidate; { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointPressed); QTouchEvent touchEvent(QEvent::TouchBegin, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed, touchPoints); touchRegistry->update(&touchEvent); } touchRegistry->addCandidateOwnerForTouch(0, &earlyCandidate); touchRegistry->addCandidateOwnerForTouch(0, &lateCandidate); QVERIFY(earlyCandidate.ownedTouches.isEmpty()); QVERIFY(lateCandidate.ownedTouches.isEmpty()); touchRegistry->requestTouchOwnership(0, &lateCandidate); QVERIFY(earlyCandidate.ownedTouches.isEmpty()); QVERIFY(lateCandidate.ownedTouches.isEmpty()); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointReleased); QTouchEvent touchEvent(QEvent::TouchEnd, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed, touchPoints); touchRegistry->update(&touchEvent); } QVERIFY(earlyCandidate.ownedTouches.isEmpty()); QVERIFY(lateCandidate.ownedTouches.isEmpty()); touchRegistry->removeCandidateOwnerForTouch(0, &earlyCandidate); QCOMPARE(lateCandidate.ownedTouches.count(), 1); QCOMPARE(lateCandidate.ownedTouches.contains(0), true); // Check that there's no trace left of touch 0 as we no longer need to keep tabs on it. QVERIFY(!touchRegistry->findTouchInfo(0)); } void tst_TouchRegistry::removeOldUndecidedCandidates() { FakeTimerFactory *fakeTimerFactory = new FakeTimerFactory; touchRegistry->setTimerFactory(fakeTimerFactory); DummyCandidate undecidedCandidate; undecidedCandidate.setObjectName("undecided"); DummyCandidate candidateThatWantsTouch; candidateThatWantsTouch.setObjectName("wantsTouch"); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointPressed); QTouchEvent touchEvent(QEvent::TouchBegin, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed, touchPoints); touchRegistry->update(&touchEvent); } touchRegistry->addCandidateOwnerForTouch(0, &undecidedCandidate); touchRegistry->requestTouchOwnership(0, &candidateThatWantsTouch); QVERIFY(undecidedCandidate.ownedTouches.isEmpty()); QVERIFY(undecidedCandidate.lostTouches.isEmpty()); QVERIFY(candidateThatWantsTouch.ownedTouches.isEmpty()); QVERIFY(candidateThatWantsTouch.lostTouches.isEmpty()); // Simulate that enough time has passed to cause the CandidateInactivityTimer to timeout, // making TouchRegistry consider that undecidedCantidate defaulted. fakeTimerFactory->updateTime(10000); QVERIFY(undecidedCandidate.ownedTouches.isEmpty()); QVERIFY(undecidedCandidate.lostTouches.contains(0)); QVERIFY(candidateThatWantsTouch.ownedTouches.contains(0)); QVERIFY(candidateThatWantsTouch.lostTouches.isEmpty()); } /* An item that calls requestTouchOwnership() without first having called addCandidateOwnerForTouch() is assumed to be the interim owner of the touch point, thus there's no point in sending UnownedTouchEvents to him as he already gets proper QTouchEvents from QQuickWindow because he didn't ignore the first QTouchEvent with that touch point. */ void tst_TouchRegistry::interimOwnerWontGetUnownedTouchEvents() { FakeTimerFactory *fakeTimerFactory = new FakeTimerFactory; touchRegistry->setTimerFactory(fakeTimerFactory); DummyCandidate undecidedCandidate; undecidedCandidate.setObjectName("undecided"); DummyCandidate interimOwner; interimOwner.setObjectName("interimOwner"); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointPressed); QTouchEvent touchEvent(QEvent::TouchBegin, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed, touchPoints); touchRegistry->update(&touchEvent); } touchRegistry->addCandidateOwnerForTouch(0, &undecidedCandidate); touchRegistry->requestTouchOwnership(0, &interimOwner); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointMoved); QTouchEvent touchEvent(QEvent::TouchUpdate, 0 /* device */, Qt::NoModifier, Qt::TouchPointMoved, touchPoints); touchRegistry->update(&touchEvent); } QCOMPARE(undecidedCandidate.unownedTouchEvents.count(), 1); QCOMPARE(interimOwner.unownedTouchEvents.count(), 0); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointMoved); QTouchEvent touchEvent(QEvent::TouchUpdate, 0 /* device */, Qt::NoModifier, Qt::TouchPointMoved, touchPoints); touchRegistry->update(&touchEvent); } QCOMPARE(undecidedCandidate.unownedTouchEvents.count(), 2); QCOMPARE(interimOwner.unownedTouchEvents.count(), 0); } /* Regression test for https://bugs.launchpad.net/ubuntu/+source/unity8/+bug/1473492 Bug caused by candidates getting deleted before ownership resolution */ void tst_TouchRegistry::candidateVanishes() { DummyCandidate mainCandidate; DummyCandidate *missingCandidate = new DummyCandidate; { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointPressed); QTouchEvent touchEvent(QEvent::TouchBegin, 0 /* device */, Qt::NoModifier, Qt::TouchPointPressed, touchPoints); touchRegistry->update(&touchEvent); } touchRegistry->addCandidateOwnerForTouch(0, &mainCandidate); touchRegistry->addCandidateOwnerForTouch(0, missingCandidate); { QList touchPoints; touchPoints.append(QTouchEvent::TouchPoint(0)); touchPoints[0].setState(Qt::TouchPointMoved); QTouchEvent touchEvent(QEvent::TouchUpdate, 0 /* device */, Qt::NoModifier, Qt::TouchPointMoved, touchPoints); touchRegistry->update(&touchEvent); } // This candidate suddenly disappears without having removed its candidacy. delete missingCandidate; missingCandidate = nullptr; touchRegistry->requestTouchOwnership(0, &mainCandidate); QVERIFY(mainCandidate.ownedTouches.contains(0)); } ////////////// TouchMemento ////////// TouchMemento::TouchMemento(const QTouchEvent *touchEvent) : touchPointStates(touchEvent->touchPointStates()), touchPoints(touchEvent->touchPoints()) { } bool TouchMemento::containsTouchWithId(int touchId) const { for (int i = 0; i < touchPoints.count(); ++i) { if (touchPoints.at(i).id() == touchId) { return true; } } return false; } ////////////// DummyCandidate ////////// bool DummyCandidate::event(QEvent *e) { if (e->type() == TouchOwnershipEvent::touchOwnershipEventType()) { TouchOwnershipEvent *touchOwnershipEvent = static_cast(e); // NB: Cannot use QVERIFY here because the macro doesn't return a boolean and is // meant for use only directly in the body of a test function if (ownedTouches.contains(touchOwnershipEvent->touchId())) qFatal("Sent ownership event for a touch that is already owned."); if (lostTouches.contains(touchOwnershipEvent->touchId())) qFatal("Sent ownership event for a touch that has already been lost."); if (touchOwnershipEvent->gained()) { ownedTouches.insert(touchOwnershipEvent->touchId()); } else { lostTouches.insert(touchOwnershipEvent->touchId()); } return true; } else if (e->type() == UnownedTouchEvent::unownedTouchEventType()) { UnownedTouchEvent *unownedTouchEvent = static_cast(e); unownedTouchEvents.append(TouchMemento(unownedTouchEvent->touchEvent())); return true; } else { return QObject::event(e); } } QTEST_GUILESS_MAIN(tst_TouchRegistry) #include "tst_TouchRegistry.moc" ./tests/unit_x11/tst_touchregistry/tst_touchregistry.pro0000644000015600001650000000021612700370701024037 0ustar jenkinsjenkinsinclude(../test-include.pri) QT += core-private qml-private quick-private gui-private UbuntuGestures SOURCES += \ tst_TouchRegistry.cpp ./tests/unit_x11/tst_swipearea/0000755000015600001650000000000012700370716016564 5ustar jenkinsjenkins./tests/unit_x11/tst_swipearea/DownwardsLauncher.qml0000644000015600001650000000410012700370714022722 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { function reset() { launcher.y = -launcher.height } Rectangle { id: launcher color: "blue" width: parent.width height: units.gu(15) x: 0 y: followDragArea() function followDragArea() { return swipeArea.distance < height ? -height + swipeArea.distance : 0 } } Rectangle { id: dragAreaRect opacity: swipeArea.dragging ? 0.5 : 0.0 color: "green" anchors.fill: swipeArea } SwipeArea { id: swipeArea objectName: "vpDragArea" height: units.gu(5) direction: SwipeArea.Downwards onDraggingChanged: { if (dragging) { launcher.y = Qt.binding(launcher.followDragArea) } } anchors { left: parent.left right: parent.right top: parent.top } } SwipeArea { id: swipeAreaNoGrab objectName: "vpDragAreaNoGrab" grabGesture: false height: swipeArea.height direction: swipeArea.direction anchors { left: swipeArea.left right: swipeArea.right top: swipeArea.top } } Label { text: "Downwards" anchors.top: parent.top anchors.horizontalCenter: parent.horizontalCenter anchors.topMargin: units.gu(1) } } ./tests/unit_x11/tst_swipearea/tst_swipearea.cpp0000644000015600001650000015250712700370714022152 0ustar jenkinsjenkins/* * Copyright 2015-2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include #include #include #include #include #include #include "private/ucswipearea_p.h" #include "private/ucswipearea_p_p.h" #define protected public #define private public #include #undef protected #undef private #include "GestureTest.h" #include "uctestcase.h" using namespace UbuntuGestures; // Because QSignalSpy(UCSwipeArea, SIGNAL(UCSwipeArea::Status)) simply // doesn't work class StatusSpy : public UCSwipeAreaStatusListener { public: StatusSpy(UCSwipeArea *edgeDragArea) : m_edgeDragArea(edgeDragArea) , m_recognized(false) { UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(m_edgeDragArea); d->addStatusChangeListener(this); } virtual ~StatusSpy() { UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(m_edgeDragArea); d->removeStatusChangeListener(this); } bool recognized() { return m_recognized; } private: void swipeStatusChanged(UCSwipeAreaPrivate::Status, UCSwipeAreaPrivate::Status status) override { m_recognized |= status == UCSwipeAreaPrivate::Recognized; } private: UCSwipeArea *m_edgeDragArea; bool m_recognized; }; /* QQuickMouseArea::canceled() signal is not registered in the meta object system. So using a QSignalSpy to track it won't work. Thus the only way to connect to it is using its method address directly. */ class MouseAreaSpy : public QObject { Q_OBJECT public: MouseAreaSpy(QQuickMouseArea *mouseArea) : canceledCount(0) { connect(mouseArea, &QQuickMouseArea::canceled, this, &MouseAreaSpy::onMouseAreaCanceled); } int canceledCount; private Q_SLOTS: void onMouseAreaCanceled() { ++canceledCount; } }; class tst_UCSwipeArea: public GestureTest { Q_OBJECT public: tst_UCSwipeArea(); private Q_SLOTS: void init() override; // called right before each and every test function is executed void dragWithShortDirectionChange(); void recognitionTimerUsage(); void sceneXAndX(); void sceneYAndY(); void twoFingerTap(); void movingDDA(); void ignoreOldFinger(); void rotated(); void distance(); void distance_data(); void disabledWhileDragging(); void oneFingerDownFollowedByLateSecondFingerDown(); void givesUpWhenLosesTouch(); void threeFingerDrag(); void immediateRecognitionWhenConstraintsDisabled(); void withdrawTouchOwnershipCandidacyIfDisabledDuringRecognition(); void withdrawTouchOwnershipCandidacyIfDisabledDuringRecognition_data(); void gettingTouchOwnershipMakesMouseAreaBehindGetCanceled(); void interleavedTouches(); void makoRightEdgeDrag(); void makoRightEdgeDrag_verticalDownwards(); void makoLeftEdgeDrag_slowStart(); void makoLeftEdgeDrag_movesSlightlyBackwardsOnStart(); void grabGesture(); void grabGestureWithImmediateRecognition(); private: // QTest::touchEvent takes QPoint instead of QPointF and I don't want to // lose precision due to rounding. // Besides, those helper functions lead to more compact code. void sendTouchPress(qint64 timestamp, int id, QPointF pos); void sendTouchUpdate(qint64 timestamp, int id, QPointF pos); void sendTouchRelease(qint64 timestamp, int id, QPointF pos); void sendTouch(qint64 timestamp, int id, QPointF pos, Qt::TouchPointState pointState, QEvent::Type eventType); void passTime(qint64 timeSpanMs); }; tst_UCSwipeArea::tst_UCSwipeArea() : GestureTest(QStringLiteral("tst_swipearea.qml")) { } void tst_UCSwipeArea::init() { GestureTest::init(); // We shouldn't need the three lines below, but a compiz/unity7 // regression means we don't pass the test without them because // the window doesn't have the proper size. Can be removed in the // future if the regression is fixed and tests pass again m_view->resize(m_view->rootObject()->width(), m_view->rootObject()->height()); QTRY_COMPARE(m_view->width(), (int)m_view->rootObject()->width()); QTRY_COMPARE(m_view->height(), (int)m_view->rootObject()->height()); } void tst_UCSwipeArea::sendTouchPress(qint64 timestamp, int id, QPointF pos) { sendTouch(timestamp, id, pos, Qt::TouchPointPressed, QEvent::TouchBegin); } void tst_UCSwipeArea::sendTouchUpdate(qint64 timestamp, int id, QPointF pos) { sendTouch(timestamp, id, pos, Qt::TouchPointMoved, QEvent::TouchUpdate); } void tst_UCSwipeArea::sendTouchRelease(qint64 timestamp, int id, QPointF pos) { sendTouch(timestamp, id, pos, Qt::TouchPointReleased, QEvent::TouchEnd); } void tst_UCSwipeArea::sendTouch(qint64 timestamp, int id, QPointF pos, Qt::TouchPointState pointState, QEvent::Type eventType) { m_fakeTimerFactory->updateTime(timestamp); QTouchEvent::TouchPoint point; point.setState(pointState); point.setId(id); point.setScenePos(pos); point.setPos(pos); QList points; points << point; QTouchEvent touchEvent(eventType, m_device, Qt::NoModifier, Qt::TouchPointPressed, points); QCoreApplication::sendEvent(m_view, &touchEvent); QQuickWindowPrivate *windowPrivate = QQuickWindowPrivate::get(m_view); windowPrivate->flushDelayedTouchEvent(); } void tst_UCSwipeArea::passTime(qint64 timeSpanMs) { qint64 finalTime = m_fakeTimerFactory->timeSource()->msecsSinceReference() + timeSpanMs; m_fakeTimerFactory->updateTime(finalTime); } namespace { QPointF calculateInitialtouchPosition(UCSwipeArea *edgeDragArea) { QPointF localCenter(edgeDragArea->width() / 2., edgeDragArea->height() / 2.); return edgeDragArea->mapToScene(localCenter); } } /* A directional drag should still be recognized if there is a momentaneous, small, change in the direction of a drag. That should be accounted as input noise and therefore ignored. */ void tst_UCSwipeArea::dragWithShortDirectionChange() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hpDragArea"); QVERIFY(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); QPointF initialtouchPosition = calculateInitialtouchPosition(edgeDragArea); QPointF touchPoint = initialtouchPosition; qreal desiredDragDistance = d->distanceThreshold * 2.0; QPointF dragDirectionVector(1.0, 0.0); qreal touchStepDistance = d->distanceThreshold * 0.1f; // make sure we are above maximum time int touchStepTimeMs = d->maxTime / 20. ; QPointF touchMovement = dragDirectionVector * touchStepDistance; QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint()); // Move a bit in the proper direction for (int i=0; i < 3; ++i) { touchPoint += touchMovement; passTime(touchStepTimeMs); QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint()); } // Then a sudden and small movement to the opposite direction touchPoint -= touchMovement*0.2; passTime(touchStepTimeMs*0.2); QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint()); // And then resume movment in the correct direction until it crosses the distance and time // thresholds. do { touchPoint += touchMovement; passTime(touchStepTimeMs); QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint()); } while ((touchPoint - initialtouchPosition).manhattanLength() < desiredDragDistance || m_fakeTimerFactory->timeSource()->msecsSinceReference() < (d->compositionTime * 1.5f)); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized); QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint()); } /* Checks that the recognition timer is started and stopped appropriately. I.e., check that it's running only while gesture recognition is taking place (status == Undecided) */ void tst_UCSwipeArea::recognitionTimerUsage() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hpDragArea"); QVERIFY(edgeDragArea != 0); AbstractTimer *fakeTimer = m_fakeTimerFactory->createTimer(); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(fakeTimer); d->setTimeSource(m_fakeTimerFactory->timeSource()); int timeStepMs = 5; // some arbitrary small value. QPointF initialtouchPosition = calculateInitialtouchPosition(edgeDragArea); QPointF touchPoint = initialtouchPosition; QPointF dragDirectionVector(1.0, 0.0); QPointF touchMovement = dragDirectionVector * (d->distanceThreshold * 0.2f); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); QVERIFY(!fakeTimer->isRunning()); QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint()); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided); QVERIFY(fakeTimer->isRunning()); // Move beyond distance threshold and composition time to ensure recognition while (m_fakeTimerFactory->timeSource()->msecsSinceReference() <= d->compositionTime || (touchPoint - initialtouchPosition).manhattanLength() <= d->distanceThreshold) { QCOMPARE(d->status == UCSwipeAreaPrivate::Undecided, fakeTimer->isRunning()); touchPoint += touchMovement; passTime(timeStepMs); QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint()); } QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized); QVERIFY(!fakeTimer->isRunning()); } /* Checks that it informs the X coordinate of the touch point in local and scene coordinates correctly. */ void tst_UCSwipeArea::sceneXAndX() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hnDragArea"); QVERIFY(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); edgeDragArea->setImmediateRecognition(true); QPointF touchScenePosition(m_view->width() - (edgeDragArea->width()/2.0f), m_view->height()/2.0f); sendTouchPress(0 /* timestamp */, 0 /* id */, touchScenePosition); QSignalSpy touchSpy(edgeDragArea, &UCSwipeArea::touchPositionChanged); touchScenePosition.rx() = m_view->width() / 2; sendTouchUpdate(50 /* timestamp */, 0 /* id */, touchScenePosition); QCOMPARE(touchSpy.count(), 1); QCOMPARE(edgeDragArea->touchPosition().x(), touchScenePosition.x() - edgeDragArea->x()); } /* Checks that it informs the Y coordinate of the touch point in local and scene coordinates correctly. */ void tst_UCSwipeArea::sceneYAndY() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("vnDragArea"); QVERIFY(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); edgeDragArea->setImmediateRecognition(true); QPointF touchScenePosition(m_view->width()/2.0f, m_view->height() - (edgeDragArea->height()/2.0f)); sendTouchPress(0 /* timestamp */, 0 /* id */, touchScenePosition); QSignalSpy touchSpy(edgeDragArea, &UCSwipeArea::touchPositionChanged); touchScenePosition.ry() = m_view->height() / 2; sendTouchUpdate(50 /* timestamp */, 0 /* id */, touchScenePosition); QCOMPARE(touchSpy.count(), 1); QCOMPARE(edgeDragArea->touchPosition().y(), touchScenePosition.y() - edgeDragArea->y()); } /* Regression test for https://bugs.launchpad.net/bugs/1228336 Perform a quick two-finger double-tap and check that UCSwipeArea properly rejects those touch points. In the bug above it got confused and crashed. */ void tst_UCSwipeArea::twoFingerTap() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hpDragArea"); QVERIFY(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); // Make touches evenly spaced along the edgeDragArea QPoint touchAPos(edgeDragArea->width()/2.0f, m_view->height()*0.33f); QPoint touchBPos(edgeDragArea->width()/2.0f, m_view->height()*0.66f); qint64 timeStepMsecs = 5; // some arbitrary, small value // Perform the first two-finger tap // NB: using move() instead of stationary() becasue in the latter you cannot provide // the touch position and therefore it's left with some garbage numbers. QTest::touchEvent(m_view, m_device) .press(0, touchAPos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided); passTime(timeStepMsecs); QTest::touchEvent(m_view, m_device) .move(0, touchAPos) .press(1, touchBPos); // A second touch point appeared during recognition, reject immediately as this // can't be a single-touch gesture anymore. QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); passTime(timeStepMsecs); QTest::touchEvent(m_view, m_device) .release(0, touchAPos) .move(1, touchBPos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); passTime(timeStepMsecs); QTest::touchEvent(m_view, m_device) .release(1, touchBPos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); // Perform the second two-finger tap passTime(timeStepMsecs); QTest::touchEvent(m_view, m_device) .press(0, touchAPos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided); passTime(timeStepMsecs); QTest::touchEvent(m_view, m_device) .move(0, touchAPos) .press(1, touchBPos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); passTime(timeStepMsecs); QTest::touchEvent(m_view, m_device) .release(0, touchAPos) .move(1, touchBPos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); passTime(timeStepMsecs); QTest::touchEvent(m_view, m_device) .release(1, touchBPos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); } /* Tests that gesture recognition works normally even if the UCSwipeArea moves during recognition. This effectively means that we have to do gesture recognition with scene coordinates instead of local item coordinates. */ void tst_UCSwipeArea::movingDDA() { QQuickItem *rightwardsLauncher = m_view->rootObject()->findChild("rightwardsLauncher"); Q_ASSERT(rightwardsLauncher != 0); UCSwipeArea *edgeDragArea = rightwardsLauncher->findChild("hpDragArea"); Q_ASSERT(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); QPointF initialtouchPosition = calculateInitialtouchPosition(edgeDragArea); QPointF touchPoint = initialtouchPosition; qreal desiredDragDistance = d->distanceThreshold * 2.0f; QPointF dragDirectionVector(1.0f, 0.0f); qreal movementStepDistance = d->distanceThreshold * 0.1f; QPointF touchMovement = dragDirectionVector * movementStepDistance; int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance); int movementTimeStepMs = (d->compositionTime * 1.5f) / totalMovementSteps; QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint()); // Move it far ahead along the direction of the gesture // rightwardsLauncher is a parent of our UCSwipeArea. So moving it will move our DDA rightwardsLauncher->setX(rightwardsLauncher->x() + d->distanceThreshold * 5.0f); for (int i = 0; i < totalMovementSteps; ++i) { touchPoint += touchMovement; passTime(movementTimeStepMs); QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint()); } QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized); QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint()); } /* The presence of and old, rejected, touch point lying on the UCSwipeArea shouldn't impede the recognition of a gesture from a new touch point. */ void tst_UCSwipeArea::ignoreOldFinger() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hpDragArea"); Q_ASSERT(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); // Make touches evenly spaced along the edgeDragArea QPoint touch0Pos(edgeDragArea->width()/2.0f, m_view->height()*0.33f); QPoint touch1Pos(edgeDragArea->width()/2.0f, m_view->height()*0.66f); QTest::touchEvent(m_view, m_device).press(0, touch0Pos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided); // leave it lying around for some time passTime(d->maxTime * 10); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); qreal desiredDragDistance = d->distanceThreshold * 2.0f; QPointF dragDirectionVector(1.0f, 0.0f); qreal movementStepDistance = d->distanceThreshold * 0.1f; QPointF touchMovement = dragDirectionVector * movementStepDistance; int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance); int movementTimeStepMs = (d->compositionTime * 1.5f) / totalMovementSteps; QTest::touchEvent(m_view, m_device) .move(0, touch0Pos) .press(1, touch1Pos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided); for (int i = 0; i < totalMovementSteps; ++i) { touch1Pos += touchMovement.toPoint(); passTime(movementTimeStepMs); QTest::touchEvent(m_view, m_device) .move(0, touch0Pos) .move(1, touch1Pos); } QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized); QTest::touchEvent(m_view, m_device) .move(0, touch0Pos) .release(1, touch1Pos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); } /* A Rightwards DDA that is rotated 90 degrees clockwise should recognize gestures that are done downwards in scene coordinates. I.e. the gesture recognition direction should be in local coordinates, not scene coordinates. */ void tst_UCSwipeArea::rotated() { QQuickItem *baseItem = m_view->rootObject()->findChild("baseItem"); baseItem->setRotation(90.); QQuickItem *rightwardsLauncher = m_view->rootObject()->findChild("rightwardsLauncher"); Q_ASSERT(rightwardsLauncher != 0); UCSwipeArea *edgeDragArea = rightwardsLauncher->findChild("hpDragArea"); Q_ASSERT(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); QPointF initialtouchPosition = calculateInitialtouchPosition(edgeDragArea); QPointF touchPoint = initialtouchPosition; qreal desiredDragDistance = d->distanceThreshold * 2.0f; QPointF dragDirectionVector(0.0f, 1.0f); qreal movementStepDistance = d->distanceThreshold * 0.1f; QPointF touchMovement = dragDirectionVector * movementStepDistance; int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance); int movementTimeStepMs = (d->compositionTime * 1.5f) / totalMovementSteps; QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint()); for (int i = 0; i < totalMovementSteps; ++i) { touchPoint += touchMovement; passTime(movementTimeStepMs); QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint()); } QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized); QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint()); } void tst_UCSwipeArea::distance() { QQuickItem *baseItem = m_view->rootObject()->findChild("baseItem"); QFETCH(qreal, rotation); QFETCH(QPointF, dragDirectionVector); baseItem->setRotation(rotation); QQuickItem *rightwardsLauncher = m_view->rootObject()->findChild("rightwardsLauncher"); Q_ASSERT(rightwardsLauncher != 0); UCSwipeArea *edgeDragArea = rightwardsLauncher->findChild("hpDragArea"); Q_ASSERT(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); // to disable the position smoothing so that we can more easily check distance values edgeDragArea->setImmediateRecognition(true); QPointF initialtouchPosition = calculateInitialtouchPosition(edgeDragArea); QPointF touchPoint = initialtouchPosition; qreal desiredDragDistance = d->distanceThreshold * 2.0f; qreal movementStepDistance = d->distanceThreshold * 0.1f; QPointF touchMovement = dragDirectionVector * movementStepDistance; int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance); int movementTimeStepMs = (d->compositionTime * 1.5f) / totalMovementSteps; qint64 timestamp = 0; sendTouchPress(timestamp, 0, touchPoint); for (int i = 0; i < totalMovementSteps; ++i) { touchPoint += touchMovement; timestamp += movementTimeStepMs; sendTouchUpdate(timestamp, 0, touchPoint); } qreal actualDragDistance = ((qreal)totalMovementSteps) * movementStepDistance; // UCSwipeArea::distance() must match the actual drag distance as the // drag was aligned with the gesture direction // NB: qFuzzyCompare(), used internally by QCOMPARE(), is broken. QVERIFY(qAbs(edgeDragArea->distance() - actualDragDistance) < 0.001); timestamp += movementTimeStepMs; sendTouchRelease(timestamp, 0, touchPoint); } void tst_UCSwipeArea::distance_data() { QTest::addColumn("rotation"); QTest::addColumn("dragDirectionVector"); QTest::newRow("not rotated") << 0. << QPointF(1., 0.); QTest::newRow("rotated by 90 degrees") << 90. << QPointF(0., 1.); } /* Regression test for https://bugs.launchpad.net/unity8/+bug/1276122 The bug: If setting "enabled: false" while the UCSwipeArea's (DDA) dragging property is true, the DDA stays in that state and doesn't recover any more. */ void tst_UCSwipeArea::disabledWhileDragging() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hpDragArea"); Q_ASSERT(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); QPointF touchPoint = calculateInitialtouchPosition(edgeDragArea); qreal desiredDragDistance = d->distanceThreshold * 2.0f; QPointF dragDirectionVector(1., 0.); // horizontal positive qreal movementStepDistance = d->distanceThreshold * 0.1f; QPointF touchMovement = dragDirectionVector * movementStepDistance; int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance); int movementTimeStepMs = (d->compositionTime * 1.5f) / totalMovementSteps; QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint()); for (int i = 0; i < totalMovementSteps; ++i) { touchPoint += touchMovement; passTime(movementTimeStepMs); QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint()); } QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized); QCOMPARE(edgeDragArea->dragging(), true); // disable the swipeArea while it's being dragged. edgeDragArea->setEnabled(false); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); QCOMPARE(edgeDragArea->dragging(), false); QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint()); } void tst_UCSwipeArea::oneFingerDownFollowedByLateSecondFingerDown() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hpDragArea"); Q_ASSERT(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); // Disable some constraints we're not interested in d->setMaxTime(60 * 1000); // And ensure others have the values we want d->compositionTime = 60; // Put an item right behind edgeDragArea to receive the touches ignored by it DummyItem *dummyItem = new DummyItem; dummyItem->setParentItem(edgeDragArea->parentItem()); dummyItem->setX(edgeDragArea->x()); dummyItem->setY(edgeDragArea->y()); dummyItem->setZ(edgeDragArea->z() - 1.0); dummyItem->setWidth(edgeDragArea->width()); dummyItem->setHeight(edgeDragArea->height()); // Make touches evenly spaced along the edgeDragArea QPoint touch0Pos(edgeDragArea->width()/2.0f, m_view->height()*0.33f); QPoint touch1Pos(edgeDragArea->width()/2.0f, m_view->height()*0.66f); QTest::touchEvent(m_view, m_device).press(0, touch0Pos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided); // We are now going to be way beyond compositionTime passTime(d->compositionTime*3); QTest::touchEvent(m_view, m_device) .move(0, touch0Pos) .press(1, touch1Pos); // A new touch has come, but as it can't be composed with touch 0, it should be // ignored/rejected by the UCSwipeArea // Therefore the last event received by dummyItem must have both touch points (0 and 1) { TouchMemento &touchMemento = dummyItem->touchEvents.last(); QCOMPARE(touchMemento.touchPoints.count(), 2); QVERIFY(touchMemento.containsTouchWithId(0)); QVERIFY(touchMemento.containsTouchWithId(1)); } passTime(30); QTest::touchEvent(m_view, m_device) .move(0, touch0Pos) .move(1, touch1Pos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided); passTime(5); QTest::touchEvent(m_view, m_device) .release(0, touch0Pos) .move(1, touch1Pos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); passTime(5); QTest::touchEvent(m_view, m_device) .release(1, touch1Pos); // Shouldn't be keepping info about touches that no longer exist or interest us QVERIFY(d->activeTouches.isEmpty()); delete dummyItem; } void tst_UCSwipeArea::givesUpWhenLosesTouch() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hpDragArea"); Q_ASSERT(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); // Disable some constraints we're not interested in d->setMaxTime(60 * 1000); // Put an item right in front of edgeDragArea DummyItem *dummyItem = new DummyItem(edgeDragArea->parentItem()); dummyItem->setX(edgeDragArea->x()); dummyItem->setY(edgeDragArea->y()); dummyItem->setZ(edgeDragArea->z() + 1.0); dummyItem->setWidth(edgeDragArea->width()); dummyItem->setHeight(edgeDragArea->height()); QPoint touchPosition(edgeDragArea->width()/2.0f, m_view->height()/2.0f); dummyItem->touchEventHandler = [&](QTouchEvent *event) { m_touchRegistry->addCandidateOwnerForTouch(0, dummyItem); event->ignore(); }; QTest::touchEvent(m_view, m_device).press(0, touchPosition); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided); m_touchRegistry->requestTouchOwnership(0, dummyItem); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); dummyItem->grabTouchPoints({0}); dummyItem->touchEventHandler = [&](QTouchEvent *event) { event->accept(); }; passTime(5); QTest::touchEvent(m_view, m_device).release(0, touchPosition); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); QVERIFY(d->activeTouches.isEmpty()); } void tst_UCSwipeArea::threeFingerDrag() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hpDragArea"); Q_ASSERT(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); // Disable some constraints we're not interested in d->setMaxTime(60 * 1000); // And ensure others have the values we want d->compositionTime = 60; // Make touches evenly spaced along the edgeDragArea QPoint touch0Pos(edgeDragArea->width()/2.0f, m_view->height()*0.25f); QPoint touch1Pos(edgeDragArea->width()/2.0f, m_view->height()*0.50f); QPoint touch2Pos(edgeDragArea->width()/2.0f, m_view->height()*0.75f); QTest::touchEvent(m_view, m_device) .press(0, touch0Pos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided); passTime(5); QTest::touchEvent(m_view, m_device) .move(0, touch0Pos) .press(1, touch1Pos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); passTime(5); QTest::touchEvent(m_view, m_device) .move(0, touch0Pos) .move(1, touch1Pos) .press(2, touch2Pos); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); passTime(10); QTest::touchEvent(m_view, m_device) .move(0, touch0Pos) .move(1, touch1Pos) .move(2, touch2Pos); passTime(200); QTest::touchEvent(m_view, m_device) .move(0, touch0Pos) .release(1, touch1Pos) .move(2, touch2Pos); passTime(10); QTest::touchEvent(m_view, m_device) .move(0, touch0Pos) .release(2, touch2Pos); passTime(5); QTest::touchEvent(m_view, m_device) .release(0, touch0Pos); // Shouldn't be keepping info about touches that no longer exist or interest us QVERIFY(d->activeTouches.isEmpty()); } /* If all the relevant gesture recognition constraints/parameters have been disabled, it means that the gesture recognition itself has been disabled and UCSwipeArea will therefore work like a simple touch area, merely reporting touch movement. */ void tst_UCSwipeArea::immediateRecognitionWhenConstraintsDisabled() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hpDragArea"); Q_ASSERT(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); // Disable the minimum amount of constraints to ensure immediate recognition d->setDistanceThreshold(0); d->compositionTime = 0; // Put an item right behind edgeDragArea to receive the touches ignored by it DummyItem *dummyItem = new DummyItem; dummyItem->setParentItem(edgeDragArea->parentItem()); dummyItem->setX(edgeDragArea->x()); dummyItem->setY(edgeDragArea->y()); dummyItem->setZ(edgeDragArea->z() - 1.0); dummyItem->setWidth(edgeDragArea->width()); dummyItem->setHeight(edgeDragArea->height()); QPoint touch0Pos(edgeDragArea->width()/2.0f, m_view->height()/2.0f); QSignalSpy pressedSpy(edgeDragArea, &UCSwipeArea::pressedChanged); QCOMPARE(edgeDragArea->pressed(), false); QTest::touchEvent(m_view, m_device).press(0, touch0Pos); // check for immediate recognition QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized); // and it is pressed QCOMPARE(edgeDragArea->pressed(), true); QCOMPARE(pressedSpy.count(), 1); // and therefore it should have immediately grabbed the touch point, // not letting it leak to items behind him. QCOMPARE(dummyItem->touchEvents.count(), 0); } void tst_UCSwipeArea::withdrawTouchOwnershipCandidacyIfDisabledDuringRecognition() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hpDragArea"); Q_ASSERT(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); QPointF touchPoint = calculateInitialtouchPosition(edgeDragArea); // Move less than the minimum needed for the drag gesture recognition qreal desiredDragDistance = d->distanceThreshold * 0.5f; QPointF dragDirectionVector(1., 0.); // horizontal positive qreal movementStepDistance = d->distanceThreshold * 0.1f; QPointF touchMovement = dragDirectionVector * movementStepDistance; int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance); int movementTimeStepMs = (d->compositionTime * 0.8f) / totalMovementSteps; QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint()); for (int i = 0; i < totalMovementSteps; ++i) { touchPoint += touchMovement; passTime(movementTimeStepMs); QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint()); } QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided); // edgeDragArea should be an undecided candidate { auto touchInfo = m_touchRegistry->findTouchInfo(0); QCOMPARE(touchInfo->candidates.size(), 1); QCOMPARE(touchInfo->candidates.at(0).item.data(), edgeDragArea); QCOMPARE(touchInfo->candidates.at(0).state, TouchRegistry::CandidateInfo::Undecided); } // disable the swipeArea while it's still recognizing a possible drag gesture. QFETCH(bool, disable); if (disable) { edgeDragArea->setEnabled(false); } else { edgeDragArea->setVisible(false); } // edgeDragArea should no longer be a candidate { auto touchInfo = m_touchRegistry->findTouchInfo(0); QCOMPARE(touchInfo->candidates.size(), 0); } QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint()); } void tst_UCSwipeArea::withdrawTouchOwnershipCandidacyIfDisabledDuringRecognition_data() { QTest::addColumn("disable"); QTest::newRow("disabled") << true; QTest::newRow("invisible") << false; } void tst_UCSwipeArea::gettingTouchOwnershipMakesMouseAreaBehindGetCanceled() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hpDragArea"); QVERIFY(edgeDragArea != nullptr); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); QQuickMouseArea *mouseArea = m_view->rootObject()->findChild("mouseArea"); QVERIFY(mouseArea != nullptr); MouseAreaSpy mouseAreaSpy(mouseArea); QPointF initialtouchPosition = calculateInitialtouchPosition(edgeDragArea); QPointF touchPoint = initialtouchPosition; qreal desiredDragDistance = d->distanceThreshold * 2; QPointF dragDirectionVector(1.0f, 0.0f); // rightwards qreal movementStepDistance = d->distanceThreshold * 0.1f; QPointF touchMovement = dragDirectionVector * movementStepDistance; int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance); int movementTimeStepMs = (d->compositionTime * 1.5f) / totalMovementSteps; QCOMPARE(mouseArea->pressed(), false); QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint()); // The TouchBegin passes through the UCSwipeArea and reaches the MouseArea behind it, // where it's converted to a MouseEvent by QQuickWindow and sent to the MouseArea which then // accepts it. Making it get pressed. QCOMPARE(mouseArea->pressed(), true); QCOMPARE(mouseAreaSpy.canceledCount, 0); for (int i = 0; i < totalMovementSteps; ++i) { touchPoint += touchMovement; passTime(movementTimeStepMs); QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint()); } // As the UCSwipeArea recognizes the gesture, it grabs the touch from the MouseArea, // which should make the MouseArea get a cancelation event, which will then cause it to // reset its state (going back to "unpressed"/"released"). QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized); QCOMPARE(mouseArea->pressed(), false); QCOMPARE(mouseAreaSpy.canceledCount, 1); QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint()); } void tst_UCSwipeArea::interleavedTouches() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hpDragArea"); QVERIFY(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); QPointF touch0 = edgeDragArea->mapToScene( QPointF(edgeDragArea->width()*0.5, edgeDragArea->height()*0.3)); qreal desiredDragDistance = d->distanceThreshold * 2; QPointF dragDirectionVector(1.0f, 0.0f); // rightwards qreal movementStepDistance = d->distanceThreshold * 0.1f; QPointF touchMovement = dragDirectionVector * movementStepDistance; int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance); int movementTimeStepMs = (d->maxTime * 0.4f) / totalMovementSteps; QTest::touchEvent(m_view, m_device).press(0, touch0.toPoint()); for (int i = 0; i < totalMovementSteps; ++i) { touch0 += touchMovement; passTime(movementTimeStepMs); QTest::touchEvent(m_view, m_device).move(0, touch0.toPoint()); } QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized); QPointF touch1 = edgeDragArea->mapToScene( QPointF(edgeDragArea->width()*0.5, edgeDragArea->height()*0.6)); QTest::touchEvent(m_view, m_device) .move(0, touch0.toPoint()) .press(1, touch1.toPoint()); touch1 += touchMovement; passTime(movementTimeStepMs); QTest::touchEvent(m_view, m_device) .move(0, touch0.toPoint()) .move(1, touch1.toPoint()); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized); QTest::touchEvent(m_view, m_device) .release(0, touch0.toPoint()) .move(1, touch1.toPoint()); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); touch1 += touchMovement; passTime(movementTimeStepMs); QTest::touchEvent(m_view, m_device) .move(1, touch1.toPoint()); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); QPointF touch2 = edgeDragArea->mapToScene( QPointF(edgeDragArea->width()*0.5, edgeDragArea->height()*0.9)); passTime(d->compositionTime + movementTimeStepMs); QTest::touchEvent(m_view, m_device) .move(1, touch1.toPoint()) .press(2, touch2.toPoint()); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided); QCOMPARE(d->touchId, 2); touch2 += touchMovement; passTime(movementTimeStepMs); QTest::touchEvent(m_view, m_device) .move(1, touch1.toPoint()) .move(2, touch2.toPoint()); touch1 += touchMovement; passTime(movementTimeStepMs); QTest::touchEvent(m_view, m_device) .move(1, touch1.toPoint()) .move(2, touch2.toPoint()); passTime(movementTimeStepMs); QTest::touchEvent(m_view, m_device) .release(1, touch1.toPoint()) .move(2, touch2.toPoint()); passTime(movementTimeStepMs); QTest::touchEvent(m_view, m_device) .release(2, touch2.toPoint()); QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch); } /* A valid right-edge drag performed on mako */ void tst_UCSwipeArea::makoRightEdgeDrag() { m_view->resize(768, 1280); QTest::qWait(300); UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hnDragArea"); QVERIFY(edgeDragArea != nullptr); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); StatusSpy *statusSpy = new StatusSpy(edgeDragArea); d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/); sendTouchPress(319744, 0, QPointF(767.001, 719.719)); sendTouchUpdate(319765, 0, QPointF(765.744,729.973)); sendTouchUpdate(319784, 0, QPointF(740.879,752.182)); sendTouchUpdate(319803, 0, QPointF(689.698,795.795)); sendTouchUpdate(319826, 0, QPointF(616.978,856.212)); sendTouchUpdate(319845, 0, QPointF(558.769,906.157)); sendTouchUpdate(319859, 0, QPointF(513.219,945.266)); sendTouchUpdate(319878, 0, QPointF(481.31,975.496)); sendTouchUpdate(319902, 0, QPointF(460.016,997.439)); sendTouchUpdate(319920, 0, QPointF(449.761,1008.6)); sendTouchUpdate(319929, 0, QPointF(445.891,1012.42)); sendTouchUpdate(319947, 0, QPointF(444.884,1013.93)); sendTouchUpdate(319965, 0, QPointF(444.461,1014.35)); sendTouchUpdate(320057, 0, QPointF(444.71,1013.56)); sendTouchUpdate(320138, 0, QPointF(445.434,1013.6)); sendTouchUpdate(320154, 0, QPointF(446.338,1012.98)); sendTouchUpdate(320171, 0, QPointF(447.232,1012.08)); sendTouchRelease(320171, 0, QPointF(447.232,1012.08)); QTRY_COMPARE_WITH_TIMEOUT(statusSpy->recognized(), true, 500); delete statusSpy; } /* A vertical, downwards swipe performed on mako near its right edge. The UCSwipeArea on the right edge must not recognize this gesture. */ void tst_UCSwipeArea::makoRightEdgeDrag_verticalDownwards() { m_view->resize(768, 1280); QTest::qWait(300); UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hnDragArea"); QVERIFY(edgeDragArea != nullptr); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/); StatusSpy *statusSpy = new StatusSpy(edgeDragArea); sendTouchPress(12012445, 26, QPointF(767.001,461.82)); sendTouchUpdate(12012472, 26, QPointF(767.001,462.569)); sendTouchUpdate(12012528, 26, QPointF(767.001,463.334)); sendTouchUpdate(12012546, 26, QPointF(767.001,466.856)); sendTouchUpdate(12012571, 26, QPointF(767.001,473.291)); sendTouchUpdate(12012587, 26, QPointF(767.001,487.31)); sendTouchUpdate(12012604, 26, QPointF(765.364,507.521)); sendTouchUpdate(12012618, 26, QPointF(765.364,507.521)); sendTouchUpdate(12012627, 26, QPointF(762.642,534.317)); sendTouchUpdate(12012655, 26, QPointF(760.846,573.406)); sendTouchUpdate(12012667, 26, QPointF(759.838,625.295)); sendTouchUpdate(12012675, 26, QPointF(758.875,703.207)); sendTouchUpdate(12012696, 26, QPointF(761.52,777.015)); sendTouchUpdate(12012713, 26, QPointF(765.659,835.591)); sendTouchUpdate(12012731, 26, QPointF(766.778,883.206)); sendTouchUpdate(12012748, 26, QPointF(767.001,922.937)); sendTouchUpdate(12012779, 26, QPointF(767.001,967.558)); sendTouchUpdate(12012798, 26, QPointF(767.001,1006.12)); sendTouchUpdate(12012809, 26, QPointF(767.001,1033.1)); sendTouchRelease(12012810, 26, QPointF(767.001,1033.1)); QCOMPARE(statusSpy->recognized(), false); delete statusSpy; } /* A valid left-edge drag performed on mako. This one starts a bit slow than speeds up */ void tst_UCSwipeArea::makoLeftEdgeDrag_slowStart() { m_view->resize(768, 1280); QTest::qWait(300); UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hpDragArea"); QVERIFY(edgeDragArea != nullptr); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/); StatusSpy *statusSpy = new StatusSpy(edgeDragArea); sendTouchPress(4002267, 77, QPointF(0,885.154)); sendTouchUpdate(4002275, 77, QPointF(0,886.214)); sendTouchUpdate(4002311, 77, QPointF(1.09568,887.75)); sendTouchUpdate(4002329, 77, QPointF(3.53647,890.191)); sendTouchUpdate(4002347, 77, QPointF(7.87434,892.879)); sendTouchUpdate(4002366, 77, QPointF(12.3036,895.075)); sendTouchUpdate(4002384, 77, QPointF(15.8885,896.849)); sendTouchUpdate(4002406, 77, QPointF(18.4504,897.88)); sendTouchUpdate(4002420, 77, QPointF(20.2429,898.149)); sendTouchUpdate(4002439, 77, QPointF(20.9945,898.149)); sendTouchUpdate(4002457, 77, QPointF(21.8819,898.149)); sendTouchUpdate(4002480, 77, QPointF(22.7454,897.389)); sendTouchUpdate(4002493, 77, QPointF(23.5456,896.589)); sendTouchUpdate(4002511, 77, QPointF(24.5435,895.031)); sendTouchUpdate(4002529, 77, QPointF(25.4271,892.32)); sendTouchUpdate(4002548, 77, QPointF(26.3145,889.658)); sendTouchUpdate(4002566, 77, QPointF(27.2004,886.999)); sendTouchUpdate(4002584, 77, QPointF(28.035,885.048)); sendTouchUpdate(4002603, 77, QPointF(29.9684,883.167)); sendTouchUpdate(4002620, 77, QPointF(33.3591,881.403)); sendTouchUpdate(4002639, 77, QPointF(44.1017,879.642)); sendTouchUpdate(4002657, 77, QPointF(64.828,878.502)); sendTouchUpdate(4002675, 77, QPointF(87.9486,878.157)); sendTouchUpdate(4002693, 77, QPointF(112.96,877.742)); sendTouchUpdate(4002711, 77, QPointF(138.903,877.157)); sendTouchUpdate(4002729, 77, QPointF(163.204,877.157)); sendTouchUpdate(4002747, 77, QPointF(182.127,877.157)); sendTouchUpdate(4002765, 77, QPointF(194.478,877.657)); sendTouchUpdate(4002785, 77, QPointF(201.474,878.508)); sendTouchUpdate(4002803, 77, QPointF(204.855,879.401)); sendTouchUpdate(4002822, 77, QPointF(206.616,880.281)); sendTouchUpdate(4002839, 77, QPointF(207.115,880.906)); sendTouchUpdate(4002894, 77, QPointF(206.865,881.184)); sendTouchUpdate(4002912, 77, QPointF(206.865,882.143)); sendTouchUpdate(4002930, 77, QPointF(206.865,883.106)); sendTouchUpdate(4002949, 77, QPointF(206.526,883.994)); sendTouchUpdate(4002967, 77, QPointF(205.866,884.88)); sendTouchUpdate(4002985, 77, QPointF(205.866,885.766)); sendTouchUpdate(4003005, 77, QPointF(205.866,886.654)); sendTouchUpdate(4003021, 77, QPointF(205.366,887.537)); sendTouchUpdate(4003039, 77, QPointF(204.592,888.428)); sendTouchUpdate(4003050, 77, QPointF(204.367,888.653)); sendTouchRelease(4003050, 77, QPointF(204.367,888.653)); QCOMPARE(statusSpy->recognized(), true); delete statusSpy; } void tst_UCSwipeArea::makoLeftEdgeDrag_movesSlightlyBackwardsOnStart() { m_view->resize(768, 1280); QTest::qWait(300); UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("hpDragArea"); QVERIFY(edgeDragArea != nullptr); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/); StatusSpy *statusSpy = new StatusSpy(edgeDragArea); sendTouchPress(41097, 24, QPointF(13.9909,827.177)); sendTouchUpdate(41120, 24, QPointF(19.2375,825.677)); sendTouchUpdate(41138, 24, QPointF(18.4057,826.177)); sendTouchUpdate(41161, 24, QPointF(20.1067,825.867)); sendTouchUpdate(41177, 24, QPointF(21.8869,824.977)); sendTouchUpdate(41193, 24, QPointF(24.7603,823.494)); sendTouchUpdate(41211, 24, QPointF(28.3889,821.725)); sendTouchUpdate(41229, 24, QPointF(32.2909,819.955)); sendTouchUpdate(41247, 24, QPointF(38.2251,817.431)); sendTouchUpdate(41266, 24, QPointF(52.4182,814.223)); sendTouchUpdate(41284, 24, QPointF(85.8465,809.483)); sendTouchUpdate(41302, 24, QPointF(126.091,802.741)); sendTouchUpdate(41320, 24, QPointF(153.171,797.977)); sendTouchUpdate(41338, 24, QPointF(170.565,795.077)); sendTouchUpdate(41356, 24, QPointF(178.685,794.101)); sendTouchUpdate(41375, 24, QPointF(183.706,793.225)); sendTouchUpdate(41393, 24, QPointF(186.112,793.19)); sendTouchUpdate(41411, 24, QPointF(187.634,793.19)); sendTouchUpdate(41429, 24, QPointF(188.505,793.19)); sendTouchUpdate(41532, 24, QPointF(187.816,793.19)); sendTouchUpdate(41538, 24, QPointF(186.902,793.19)); sendTouchUpdate(41557, 24, QPointF(186.01,793.19)); sendTouchUpdate(41575, 24, QPointF(185.125,793.444)); sendTouchUpdate(41593, 24, QPointF(184.229,793.69)); sendTouchUpdate(41605, 24, QPointF(183.88,793.69)); sendTouchRelease(41607, 24, QPointF(183.88,793.69)); QCOMPARE(statusSpy->recognized(), true); delete statusSpy; } void tst_UCSwipeArea::grabGesture() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("vpDragArea"); Q_ASSERT(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea)); d->setTimeSource(m_fakeTimerFactory->timeSource()); UCSwipeArea *edgeDragAreaNoGrab = m_view->rootObject()->findChild("vpDragAreaNoGrab"); Q_ASSERT(edgeDragAreaNoGrab != 0); QCOMPARE(edgeDragAreaNoGrab->grabGesture(), false); UCSwipeAreaPrivate *dNoGrab = UCSwipeAreaPrivate::get(edgeDragAreaNoGrab); dNoGrab->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragAreaNoGrab)); dNoGrab->setTimeSource(m_fakeTimerFactory->timeSource()); QPointF touchPoint = calculateInitialtouchPosition(edgeDragArea); qreal desiredDragDistance = d->distanceThreshold * 2.0f; QPointF dragDirectionVector(0., 1.); // vertical positive qreal movementStepDistance = d->distanceThreshold * 0.1f; QPointF touchMovement = dragDirectionVector * movementStepDistance; int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance); int movementTimeStepMs = (d->compositionTime * 1.5f) / totalMovementSteps; qint64 timestamp = 0; sendTouchPress(timestamp, 0, touchPoint); for (int i = 0; i < totalMovementSteps; ++i) { touchPoint += touchMovement; timestamp += movementTimeStepMs; sendTouchUpdate(timestamp, 0, touchPoint); } QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized); QCOMPARE(edgeDragArea->dragging(), true); QCOMPARE((int)dNoGrab->status, (int)UCSwipeAreaPrivate::Recognized); QCOMPARE(edgeDragAreaNoGrab->dragging(), true); // Use a large distance margin because position smoothing makes it hard // to assume high accuracy. The test below using immediateRecognition uses // a smaller margin. // NB: qFuzzyCompare(), used internally by QCOMPARE(), is broken. QVERIFY(qAbs(edgeDragArea->distance() - edgeDragAreaNoGrab->distance()) < 2); timestamp += movementTimeStepMs; sendTouchRelease(timestamp, 0, touchPoint); } void tst_UCSwipeArea::grabGestureWithImmediateRecognition() { UCSwipeArea *edgeDragArea = m_view->rootObject()->findChild("vpDragArea"); Q_ASSERT(edgeDragArea != 0); UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea); UCSwipeArea *edgeDragAreaNoGrab = m_view->rootObject()->findChild("vpDragAreaNoGrab"); Q_ASSERT(edgeDragAreaNoGrab != 0); QCOMPARE(edgeDragAreaNoGrab->grabGesture(), false); UCSwipeAreaPrivate *dNoGrab = UCSwipeAreaPrivate::get(edgeDragAreaNoGrab); edgeDragArea->setImmediateRecognition(true); edgeDragAreaNoGrab->setImmediateRecognition(true); QPointF touchPoint = calculateInitialtouchPosition(edgeDragArea); qreal desiredDragDistance = d->distanceThreshold * 2.0f; QPointF dragDirectionVector(0., 1.); // vertical positive qreal movementStepDistance = d->distanceThreshold * 0.1f; QPointF touchMovement = dragDirectionVector * movementStepDistance; int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance); int movementTimeStepMs = (d->compositionTime * 1.5f) / totalMovementSteps; qint64 timestamp = 0; sendTouchPress(timestamp, 0, touchPoint); for (int i = 0; i < totalMovementSteps; ++i) { touchPoint += touchMovement; timestamp += movementTimeStepMs; sendTouchUpdate(timestamp, 0, touchPoint); } QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized); QCOMPARE(edgeDragArea->dragging(), true); QCOMPARE((int)dNoGrab->status, (int)UCSwipeAreaPrivate::Recognized); QCOMPARE(edgeDragAreaNoGrab->dragging(), true); // NB: qFuzzyCompare(), used internally by QCOMPARE(), is broken. QVERIFY(qAbs(edgeDragArea->distance() - edgeDragAreaNoGrab->distance()) < 0.001); timestamp += movementTimeStepMs; sendTouchRelease(timestamp, 0, touchPoint); } QTEST_MAIN(tst_UCSwipeArea) #include "tst_swipearea.moc" ./tests/unit_x11/tst_swipearea/GestureTest.cpp0000644000015600001650000000702512700370701021544 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "GestureTest.h" #include "uctestcase.h" #include "uctestextras.h" #include #include #include #include #include #include using namespace UbuntuGestures; GestureTest::GestureTest(const QString &qmlFilename) : QObject(), m_device(nullptr), m_view(nullptr), m_qmlFilename(qmlFilename) { } void GestureTest::initTestCase() { if (!m_device) { m_device = new QTouchDevice; m_device->setType(QTouchDevice::TouchScreen); QWindowSystemInterface::registerTouchDevice(m_device); } } void GestureTest::init() { m_view = new UbuntuTestCase(m_qmlFilename, QQuickView::SizeRootObjectToView, true); m_fakeTimerFactory = new FakeTimerFactory; m_touchRegistry = TouchRegistry::instance(); m_touchRegistry->setTimerFactory(m_fakeTimerFactory); m_view->installEventFilter(m_touchRegistry); qApp->processEvents(); } void GestureTest::cleanup() { m_view->removeEventFilter(m_touchRegistry); delete m_touchRegistry; m_touchRegistry = nullptr; // TouchRegistry will take down the timer factory along with him // delete m_fakeTimerFactory; m_fakeTimerFactory = nullptr; delete m_view; m_view = nullptr; // add a small timeout after each run to have a proper cleanup QTest::qWait(400); } ////////////////////////// TouchMemento ///////////////////////////// TouchMemento::TouchMemento(const QTouchEvent *touchEvent) : touchPointStates(touchEvent->touchPointStates()), touchPoints(touchEvent->touchPoints()) { } bool TouchMemento::containsTouchWithId(int touchId) const { for (int i = 0; i < touchPoints.count(); ++i) { if (touchPoints.at(i).id() == touchId) { return true; } } return false; } ////////////////////////// DummyItem ///////////////////////////// DummyItem::DummyItem(QQuickItem *parent) : QQuickItem(parent) { touchEventHandler = defaultTouchEventHandler; mousePressEventHandler = defaultMouseEventHandler; mouseMoveEventHandler = defaultMouseEventHandler; mouseReleaseEventHandler = defaultMouseEventHandler; mouseDoubleClickEventHandler = defaultMouseEventHandler; } void DummyItem::touchEvent(QTouchEvent *event) { touchEvents.append(TouchMemento(event)); touchEventHandler(event); } void DummyItem::mousePressEvent(QMouseEvent *event) { mousePressEventHandler(event); } void DummyItem::mouseMoveEvent(QMouseEvent *event) { mouseMoveEventHandler(event); } void DummyItem::mouseReleaseEvent(QMouseEvent *event) { mouseReleaseEventHandler(event); } void DummyItem::mouseDoubleClickEvent(QMouseEvent *event) { mouseDoubleClickEventHandler(event); } void DummyItem::defaultTouchEventHandler(QTouchEvent *event) { event->accept(); } void DummyItem::defaultMouseEventHandler(QMouseEvent *event) { event->accept(); } ./tests/unit_x11/tst_swipearea/GestureTest.h0000644000015600001650000000527312700370701021214 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #ifndef GESTURETEST_H #endif // GESTURETEST_H #include #include class UbuntuTestCase; class QTouchDevice; namespace UbuntuGestures { class FakeTimerFactory; } class TouchRegistry; // C++ std lib #include /* The common stuff among tests come here */ class TouchMemento { public: TouchMemento(const QTouchEvent *touchEvent); Qt::TouchPointStates touchPointStates; QList touchPoints; bool containsTouchWithId(int touchId) const; }; class DummyItem : public QQuickItem { Q_OBJECT public: DummyItem(QQuickItem *parent = 0); QList touchEvents; std::function touchEventHandler; std::function mousePressEventHandler; std::function mouseMoveEventHandler; std::function mouseReleaseEventHandler; std::function mouseDoubleClickEventHandler; protected: void touchEvent(QTouchEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; private: static void defaultTouchEventHandler(QTouchEvent *event); static void defaultMouseEventHandler(QMouseEvent *event); }; class GestureTest : public QObject { Q_OBJECT public: // \param qmlFilename name of the qml file to be loaded by the QQuickView GestureTest(const QString &qmlFilename); protected Q_SLOTS: void initTestCase(); // will be called before the first test function is executed virtual void init(); // called right before each and every test function is executed virtual void cleanup(); // called right after each and every test function is executed protected: QTouchDevice *m_device; UbuntuTestCase *m_view; TouchRegistry *m_touchRegistry; UbuntuGestures::FakeTimerFactory *m_fakeTimerFactory; QString m_qmlFilename; }; #define GESTURETEST_H ./tests/unit_x11/tst_swipearea/UpwardsLauncher.qml0000644000015600001650000000361612700370701022406 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: root function reset() { launcher.y = Qt.binding(function(){return root.height;}); } Rectangle { id: launcher color: "blue" width: parent.width height: units.gu(15) x: 0 y: root.height function followDragArea() { return swipeArea.distance > -height ? root.height + swipeArea.distance : root.height - height } } Rectangle { id: dragAreaRect opacity: swipeArea.dragging ? 0.5 : 0.0 color: "green" anchors.fill: swipeArea } SwipeArea { id: swipeArea objectName: "vnDragArea" height: units.gu(5) direction: SwipeArea.Upwards onDraggingChanged: { if (dragging) { launcher.y = Qt.binding(launcher.followDragArea) } } anchors { left: parent.left right: parent.right bottom: parent.bottom } } Label { text: "Upwards" anchors.bottom: parent.bottom anchors.horizontalCenter: parent.horizontalCenter anchors.bottomMargin: units.gu(1) } } ./tests/unit_x11/tst_swipearea/tst_swipearea.qml0000644000015600001650000000404112700370701022142 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Test 1.0 Rectangle { width: units.gu(60) height: units.gu(60) color: "white" Binding { target: MouseTouchAdaptor property: "enabled" value: true } MouseArea { id: mouseArea objectName: "mouseArea" anchors.fill: parent onClicked: { hpLauncher.reset() hnLauncher.reset() vpLauncher.reset() vnLauncher.reset() } } Item { id: baseItem objectName: "baseItem" width: parent.width height: parent.height // NB: Do not anchor it as we will move it programmatically from the test RightwardsLauncher { id: hpLauncher; width: parent.width height: parent.height } LeftwardsLauncher { id: hnLauncher; anchors.fill: parent } DownwardsLauncher { id: vpLauncher; anchors.fill: parent } UpwardsLauncher { id: vnLauncher; anchors.fill: parent } } Button { anchors.bottom: parent.bottom anchors.left: parent.left anchors.margins: units.gu(1) text: "rotation: " + baseItem.rotation onClicked: { if (baseItem.rotation === 0.0) { baseItem.rotation = 90.0 } else { baseItem.rotation = 0.0 } } } } ./tests/unit_x11/tst_swipearea/RightwardsLauncher.qml0000644000015600001650000000361012700370701023071 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { objectName: "rightwardsLauncher" function reset() { launcher.x = -launcher.width } Rectangle { id: launcher color: "blue" width: units.gu(15) height: parent.height x: followDragArea() y: 0 function followDragArea() { return swipeArea.distance < width ? -width + swipeArea.distance : 0 } } Rectangle { id: dragAreaRect opacity: swipeArea.dragging ? 0.5 : 0.0 color: "green" anchors.fill: swipeArea } SwipeArea { id: swipeArea objectName: "hpDragArea" // give some room for items to be dynamically stacked right behind him z: 10.0 width: units.gu(5) direction: SwipeArea.Rightwards onDraggingChanged: { if (dragging) { launcher.x = Qt.binding(launcher.followDragArea) } } anchors { left: parent.left top: parent.top bottom: parent.bottom } } Label { text: "Rightwards" anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter anchors.leftMargin: units.gu(1) } } ./tests/unit_x11/tst_swipearea/tst_swipearea.pro0000644000015600001650000000054512700370701022156 0ustar jenkinsjenkinsinclude(../test-include.pri) QT += core-private qml-private quick-private gui-private UbuntuGestures UbuntuGestures_private SOURCES += \ GestureTest.cpp \ tst_swipearea.cpp HEADERS += GestureTest.h OTHER_FILES += \ DownwardsLauncher.qml \ UpwardsLauncher.qml \ LeftwardsLauncher.qml \ RightwardsLauncher.qml \ tst_swipearea.qml ./tests/unit_x11/tst_swipearea/LeftwardsLauncher.qml0000644000015600001650000000360312700370701022710 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: root function reset() { launcher.x = Qt.binding(function(){return root.width;}); } Rectangle { id: launcher color: "blue" width: units.gu(15) height: parent.height x: root.width y: 0 function followDragArea() { return swipeArea.distance > -width ? root.width + swipeArea.distance : root.width - width } } Rectangle { id: dragAreaRect opacity: swipeArea.dragging ? 0.5 : 0.0 color: "green" anchors.fill: swipeArea } SwipeArea { id: swipeArea objectName: "hnDragArea" width: units.gu(5) direction: SwipeArea.Leftwards onDraggingChanged: { if (dragging) { launcher.x = Qt.binding(launcher.followDragArea) } } anchors { right: parent.right top: parent.top bottom: parent.bottom } } Label { text: "Leftwards" anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter anchors.rightMargin: units.gu(1) } } ./tests/unit_x11/add_makecheck.pri0000644000015600001650000000102712700370701017143 0ustar jenkinsjenkins# Do not use CONFIG += testcase that would add a 'make check' because it also # adds a 'make install' that installs the test cases, which we do not want. # Instead add a 'make check' manually. # Xvfb doesn't run on armhf/qemu !contains(QMAKE_HOST.arch,armv7l) { check.target = check check.commands += cd $$_PRO_FILE_PWD_; check.commands += env UITK_TEST_KEEP_RUNNING=1 check.commands += '$${ROOT_SOURCE_DIR}/tests/unit/runtest.sh "$$shadowed($$_PRO_FILE_PWD_)/$${TARGET}" "$$shadowed($$_PRO_FILE_PWD_)/$${TARGET}"'; } ./tests/unit_x11/tst_deprecated_theme_engine/0000755000015600001650000000000012700370701021405 5ustar jenkinsjenkins./tests/unit_x11/tst_deprecated_theme_engine/tst_deprecated_theme_engine.cpp0000644000015600001650000002131412700370701027613 0ustar jenkinsjenkins/* * Copyright 2013-2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include #include #include #include #include "ucdeprecatedtheme.h" #include "uctheme.h" #include "uctestcase.h" #include #include "plugin.h" Q_DECLARE_METATYPE(QList) class ThemeTestCase : public UbuntuTestCase { Q_OBJECT public: ThemeTestCase(const QString& file, QWindow* parent = 0) : UbuntuTestCase(file, QQuickView::SizeViewToRootObject, true, parent) { } ~ThemeTestCase() { // restore theme before quitting if (!rootContext()) { return; } UCDeprecatedTheme *theme = rootContext()->contextProperty("Theme").value(); if (theme) { theme->resetName(); } else { qWarning() << "No theme instance found!"; } } void setTheme(const QString &theme) { rootObject()->setProperty("themeName", theme); QTest::waitForEvents(); } void setStyle(const QString &style) { rootObject()->setProperty("styleDocument", style); QTest::waitForEvents(); } }; class tst_UCDeprecatedTheme : public QObject { Q_OBJECT private: QString m_xdgDataPath; UCDeprecatedTheme *instance(QQmlEngine &engine) { return engine.rootContext()->contextProperty("Theme").value(); } void initDeprecatedTheme(QQmlEngine &engine) { UbuntuComponentsPlugin::initializeContextProperties(&engine); } private Q_SLOTS: void initTestCase(); void cleanupTestCase(); void testNameDefault(); void testNameSet(); void testCreateStyleComponent(); void testCreateStyleComponent_data(); void testThemesRelativePath(); void testThemesRelativePathWithParent(); void testThemesRelativePathWithParentXDGDATA(); void testThemesRelativePathWithParentNoVariablesSet(); void testThemesRelativePathWithParentOneXDGPathSet(); void testNoImportPathSet(); void testBogusImportPathSet(); void testMultipleImportPathsSet(); void testPaletteUsed_bug1549830(); }; void tst_UCDeprecatedTheme::initTestCase() { m_xdgDataPath = QLatin1String(getenv("XDG_DATA_DIRS")); qputenv("SUPPRESS_DEPRECATED_NOTE", "yes"); } void tst_UCDeprecatedTheme::cleanupTestCase() { qputenv("XDG_DATA_DIRS", m_xdgDataPath.toLocal8Bit()); } void tst_UCDeprecatedTheme::testNameDefault() { QQmlEngine engine; initDeprecatedTheme(engine); QCOMPARE(instance(engine)->name(), QString("Ubuntu.Components.Themes.Ambiance")); } void tst_UCDeprecatedTheme::testNameSet() { QTest::ignoreMessage(QtWarningMsg, "Theme not found: \"MyBeautifulTheme\""); QQmlEngine engine; initDeprecatedTheme(engine); instance(engine)->setName("MyBeautifulTheme"); QCOMPARE(instance(engine)->name(), QString("MyBeautifulTheme")); } void tst_UCDeprecatedTheme::testCreateStyleComponent() { QFETCH(QString, styleName); QFETCH(QString, parentName); QFETCH(bool, success); if (parentName == "SimpleItem.qml") QTest::ignoreMessage(QtWarningMsg, "QQmlComponent: Component is not ready"); else if (styleName == "NotExistingTestStyle.qml") ThemeTestCase::ignoreWarning(parentName, 20, 1, "QML Parent: Warning: Style NotExistingTestStyle.qml not found in theme TestModule.TestTheme"); qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", "."); QScopedPointer view(new ThemeTestCase(parentName)); QVERIFY(view); view->setTheme("TestModule.TestTheme"); view->setStyle(styleName); QQmlComponent *style = view->rootObject()->property("style").value(); QCOMPARE(style != NULL, success); } void tst_UCDeprecatedTheme::testCreateStyleComponent_data() { QTest::addColumn("styleName"); QTest::addColumn("parentName"); QTest::addColumn("success"); QTest::newRow("Existing style") << "TestStyle.qml" << "Parent.qml" << true; QTest::newRow("Non existing style") << "NotExistingTestStyle.qml" << "Parent.qml" << false; } void tst_UCDeprecatedTheme::testThemesRelativePath() { qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", "../tst_theme_engine"); QScopedPointer view(new ThemeTestCase("Parent.qml")); QVERIFY(view); view->setTheme("TestModule.TestTheme"); view->setStyle("TestStyle.qml"); QQmlComponent *style = view->rootObject()->property("style").value(); QCOMPARE(style != NULL, true); } void tst_UCDeprecatedTheme::testThemesRelativePathWithParent() { qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", "./themes:./themes/TestModule"); QScopedPointer view(new ThemeTestCase("Parent.qml")); QVERIFY(view); view->setTheme("CustomTheme"); view->setStyle("TestStyle.qml"); QQmlComponent *style = view->rootObject()->property("style").value(); QCOMPARE(style != NULL, true); } void tst_UCDeprecatedTheme::testThemesRelativePathWithParentXDGDATA() { qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", ""); qputenv("XDG_DATA_DIRS", "./themes:./themes/TestModule"); QScopedPointer view(new ThemeTestCase("Parent.qml")); QVERIFY(view); view->setTheme("CustomTheme"); view->setStyle("TestStyle.qml"); QQmlComponent *style = view->rootObject()->property("style").value(); QCOMPARE(style != NULL, true); } void tst_UCDeprecatedTheme::testThemesRelativePathWithParentNoVariablesSet() { ThemeTestCase::ignoreWarning("Parent.qml", 20, 1, "QML Parent: Warning: Style TestStyle.qml not found in theme Ubuntu.Components.Themes.Ambiance"); qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", ""); qputenv("XDG_DATA_DIRS", ""); QScopedPointer view(new ThemeTestCase("Parent.qml")); QVERIFY(view); view->setStyle("TestStyle.qml"); } void tst_UCDeprecatedTheme::testThemesRelativePathWithParentOneXDGPathSet() { qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", ""); qputenv("XDG_DATA_DIRS", "../tst_theme_engine"); QScopedPointer view(new ThemeTestCase("Parent.qml")); QVERIFY(view); view->setTheme("TestModule.TestTheme"); view->setStyle("TestStyle.qml"); QQmlComponent *style = view->rootObject()->property("style").value(); QCOMPARE(style != NULL, true); } void tst_UCDeprecatedTheme::testNoImportPathSet() { if (!QFile(QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath) + "/Ubuntu/Components").exists()) QSKIP("This can only be tested if the UITK is installed"); qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", ""); qputenv("XDG_DATA_DIRS", ""); qputenv("QML2_IMPORT_PATH", ""); QQmlEngine engine; initDeprecatedTheme(engine); QCOMPARE(instance(engine)->name(), QString("Ubuntu.Components.Themes.Ambiance")); } void tst_UCDeprecatedTheme::testBogusImportPathSet() { if (!QFile(QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath) + "/Ubuntu/Components").exists()) QSKIP("This can only be tested if the UITK is installed"); qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", ""); qputenv("XDG_DATA_DIRS", ""); qputenv("QML2_IMPORT_PATH", "/no/plugins/here"); QQmlEngine engine; initDeprecatedTheme(engine); QCOMPARE(instance(engine)->name(), QString("Ubuntu.Components.Themes.Ambiance")); } void tst_UCDeprecatedTheme::testMultipleImportPathsSet() { if (!QFile(QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath) + "/Ubuntu/Components").exists()) QSKIP("This can only be tested if the UITK is installed"); qputenv("UBUNTU_UI_TOOLKIT_THEMES_PATH", ""); qputenv("XDG_DATA_DIRS", ""); qputenv("QML2_IMPORT_PATH", "/no/plugins/here:."); QScopedPointer view(new ThemeTestCase("Parent.qml")); QVERIFY(view); view->setTheme("TestModule.TestTheme"); } void tst_UCDeprecatedTheme::testPaletteUsed_bug1549830() { ThemeTestCase::ignoreWarning("ErroneousPaletteUse.qml", 29, 20, "Unable to assign [undefined] to QColor", 3); QScopedPointer view(new ThemeTestCase("ErroneousPaletteUse.qml")); } QTEST_MAIN(tst_UCDeprecatedTheme) #include "tst_deprecated_theme_engine.moc" ./tests/unit_x11/tst_deprecated_theme_engine/themes/0000755000015600001650000000000012700370701022672 5ustar jenkinsjenkins./tests/unit_x11/tst_deprecated_theme_engine/themes/TestModule/0000755000015600001650000000000012700370701024757 5ustar jenkinsjenkins./tests/unit_x11/tst_deprecated_theme_engine/themes/TestModule/TestTheme/0000755000015600001650000000000012700370701026661 5ustar jenkinsjenkins./tests/unit_x11/tst_deprecated_theme_engine/themes/TestModule/TestTheme/1.2/0000755000015600001650000000000012700370701027161 5ustar jenkinsjenkins./tests/unit_x11/tst_deprecated_theme_engine/themes/TestModule/TestTheme/1.2/TestStyle.qml0000644000015600001650000000132112700370701031631 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components.Themes.Ambiance 0.1 Item { } ./tests/unit_x11/tst_deprecated_theme_engine/themes/TestModule/TestTheme/qmldir0000644000015600001650000000006112700370701030071 0ustar jenkinsjenkinsmodule TestTheme TestStyle 1.0 1.2/TestStyle.qml ./tests/unit_x11/tst_deprecated_theme_engine/themes/CustomTheme/0000755000015600001650000000000012700370701025127 5ustar jenkinsjenkins./tests/unit_x11/tst_deprecated_theme_engine/themes/CustomTheme/TestStyle.qml0000644000015600001650000000131712700370701027604 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import TestTheme 1.0 as Parent Parent.TestStyle { } ./tests/unit_x11/tst_deprecated_theme_engine/themes/CustomTheme/parent_theme0000644000015600001650000000001212700370701027516 0ustar jenkinsjenkinsTestTheme ./tests/unit_x11/tst_deprecated_theme_engine/TestModule/0000755000015600001650000000000012700370701023472 5ustar jenkinsjenkins./tests/unit_x11/tst_deprecated_theme_engine/TestModule/TestTheme/0000755000015600001650000000000012700370701025374 5ustar jenkinsjenkins./tests/unit_x11/tst_deprecated_theme_engine/TestModule/TestTheme/TestStyle.qml0000644000015600001650000000124412700370701030050 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 Item { } ./tests/unit_x11/tst_deprecated_theme_engine/ErroneousPaletteUse.qml0000644000015600001650000000176612700370701026107 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 MainView { width: units.gu(48) height: units.gu(60) Page { title: "Hello, I am blue." // should be darkGrey Label { anchors.centerIn: parent text: "bla" color: Theme.palette.normal.negative // this color does not exist in 1.2 palette } } } ./tests/unit_x11/tst_deprecated_theme_engine/tst_deprecated_theme_engine.pro0000644000015600001650000000070312700370701027630 0ustar jenkinsjenkinsinclude(../test-include.pri) QT += quick-private gui-private qml-private SOURCES += tst_deprecated_theme_engine.cpp OTHER_FILES += \ TestStyle.qml \ TestApp.qml \ Parent.qml \ SimpleItem.qml \ themes/CustomTheme/TestStyle.qml \ themes/CustomTheme/parent_theme \ themes/TestModule/TestTheme/TestStyle.qml \ themes/TestModule/TestTheme/qmldir \ themes/TestModule/TestTheme/parent_theme \ ErroneousPaletteUse.qml ./tests/unit_x11/tst_deprecated_theme_engine/Parent.qml0000644000015600001650000000202712700370701023352 0ustar jenkinsjenkins/* * Copyright 2013-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { id: item property string styleDocument onStyleDocumentChanged: style = Theme.createStyleComponent(styleDocument, item) property string themeName onThemeNameChanged: Theme.name = themeName; // make sure we start with Ambiance theme by invoking resetName() Component.onCompleted: Theme.name = undefined } ./tests/unit_x11/tst_deprecated_theme_engine/SimpleItem.qml0000644000015600001650000000124412700370701024171 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 Item { } ./tests/unit_x11/tst_recreateview/0000755000015600001650000000000012700370701017263 5ustar jenkinsjenkins./tests/unit_x11/tst_recreateview/tst_recreateview.cpp0000644000015600001650000000341612700370701023352 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include #include #include #include class RecreateViewTest : public QObject { Q_OBJECT public: RecreateViewTest() {} private Q_SLOTS: void initTestCase(); void testCase_recreateView(); private: QString m_modulePath; }; void RecreateViewTest::initTestCase() { QString modules(UBUNTU_QML_IMPORT_PATH); QVERIFY(QDir(modules).exists()); m_modulePath = QDir(modules).absolutePath(); } void RecreateViewTest::testCase_recreateView() { QQuickView *view = new QQuickView; view->engine()->addImportPath(m_modulePath); view->setSource(QUrl::fromLocalFile("SimpleApp.qml")); QVERIFY(view->rootObject() != 0); view->show(); QTest::qWaitForWindowExposed(view); delete view; view = new QQuickView; view->engine()->addImportPath(m_modulePath); view->setSource(QUrl::fromLocalFile("SimpleApp.qml")); QVERIFY(view->rootObject() != 0); view->show(); QTest::qWaitForWindowExposed(view); delete view; } QTEST_MAIN(RecreateViewTest) #include "tst_recreateview.moc" ./tests/unit_x11/tst_recreateview/tst_recreateview.pro0000644000015600001650000000020112700370701023355 0ustar jenkinsjenkinsinclude(../test-include.pri) SOURCES += tst_recreateview.cpp DEFINES += SRCDIR=\\\"$$PWD/\\\" OTHER_FILES += \ SimpleApp.qml ./tests/unit_x11/tst_recreateview/SimpleApp.qml0000644000015600001650000000176412700370701021700 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { width: units.gu(48) height: units.gu(60) Component.onCompleted: i18n.domain = "any" Page { title: "Simple page" Button { anchors.centerIn: parent text: "Push me" width: units.gu(15) onClicked: print("Click!") } } } ./tests/unit_x11/tst_serviceproperties/0000755000015600001650000000000012700370701020353 5ustar jenkinsjenkins./tests/unit_x11/tst_serviceproperties/InvalidPropertyWatcher.qml0000644000015600001650000000204112700370701025534 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.3 import Ubuntu.Components 1.1 Item { property alias service: service ServiceProperties { id: service service: "org.freedesktop.Accounts" serviceInterface: "org.freedesktop.Accounts" path: "/org/freedesktop/Accounts" adaptorInterface: "com.ubuntu.touch.AccountsService.Sound" property bool thisIsAnInvalidPropertyToWatch: true } } ./tests/unit_x11/tst_serviceproperties/tst_serviceproperties.pro0000644000015600001650000000030012700370701025535 0ustar jenkinsjenkinsinclude(../test-include.pri) SOURCES += \ tst_serviceproperties.cpp OTHER_FILES += \ IncomingCallVibrateWatcher.qml \ InvalidPropertyWatcher.qml \ InvalidPropertyWatcher2.qml ./tests/unit_x11/tst_serviceproperties/InvalidPropertyWatcher2.qml0000644000015600001650000000212112700370701025615 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.3 import Ubuntu.Components 1.1 Item { property alias service: service ServiceProperties { id: service service: "org.freedesktop.Accounts" serviceInterface: "org.freedesktop.Accounts" path: "/org/freedesktop/Accounts" adaptorInterface: "com.ubuntu.touch.AccountsService.Sound" property bool thisIsAnInvalidPropertyToWatch: true property bool incomingCallVibrate: true } } ./tests/unit_x11/tst_serviceproperties/IncomingCallVibrateWatcher.qml0000644000015600001650000000202612700370701026260 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.3 import Ubuntu.Components 1.1 Item { property alias service: service ServiceProperties { id: service service: "org.freedesktop.Accounts" serviceInterface: "org.freedesktop.Accounts" path: "/org/freedesktop/Accounts" adaptorInterface: "com.ubuntu.touch.AccountsService.Sound" property bool incomingCallVibrate: true } } ./tests/unit_x11/tst_serviceproperties/tst_serviceproperties.cpp0000644000015600001650000002143412700370701025532 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "uctestcase.h" #include "ucserviceproperties.h" #include "ucserviceproperties_p.h" #include #include #include #include class tst_ServiceProperties : public QObject { Q_OBJECT public: tst_ServiceProperties() {} private: QString error; // FIXME use UbuntuTestCase::ignoreWaring in Vivid void ignoreWarning(const QString& fileName, uint line, uint column, const QString& message, uint occurences=1) { for (uint i = 0; i < occurences; i++) { QString url(QUrl::fromLocalFile(QFileInfo(fileName).absoluteFilePath()).toEncoded()); QString warning(QString("%1:%2:%3: %4").arg(url).arg(line).arg(column).arg(message)); QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); } } private Q_SLOTS: void initTestCase() { // check if the connection is possible, otherwise we must skip all tests QScopedPointer test(new UbuntuTestCase("IncomingCallVibrateWatcher.qml")); UCServiceProperties *watcher = static_cast(test->rootObject()->property("service").value()); QVERIFY(watcher); if (watcher->status() == UCServiceProperties::Synchronizing || watcher->status() == UCServiceProperties::Inactive) { QSignalSpy wait(watcher, SIGNAL(statusChanged())); wait.wait(); } if (watcher->status() == UCServiceProperties::ConnectionError) { error = "Skip test: " + watcher->error(); } } void cleanup() { // restore env var setting qputenv("SHOW_SERVICEPROPERTIES_WARNINGS", QByteArray()); } void test_change_property() { if (!error.isEmpty()) { QSKIP(qPrintable(error)); } QScopedPointer test(new UbuntuTestCase("IncomingCallVibrateWatcher.qml")); UCServiceProperties *watcher = static_cast(test->rootObject()->property("service").value()); QVERIFY(watcher); bool backup = watcher->property("incomingCallVibrate").toBool(); UCServicePropertiesPrivate *pWatcher = UCServicePropertiesPrivate::get(watcher); QSignalSpy spy(watcher, SIGNAL(incomingCallVibrateChanged())); pWatcher->testProperty("IncomingCallVibrate", !backup); spy.wait(400); QCOMPARE(spy.count(), 1); QCOMPARE(watcher->property("incomingCallVibrate").toBool(), !backup); // restore value spy.clear(); pWatcher->testProperty("IncomingCallVibrate", backup); spy.wait(400); } void test_environment_variable_data() { QTest::addColumn("value"); QTest::addColumn("warning"); QTest::newRow("empty string, no warning") << QByteArray() << false; QTest::newRow("0 integer, no warning") << QByteArray("0") << false; QTest::newRow("boolean false, no warning") << QByteArray("false") << false; QTest::newRow("boolean FALSE, no warning") << QByteArray("false") << false; QTest::newRow("1 integer, warning") << QByteArray("1") << true; QTest::newRow("boolean true, warning") << QByteArray("true") << true; QTest::newRow("boolean TRUE, warning") << QByteArray("true") << true; QTest::newRow("positive integer, no warning") << QByteArray("5") << false; QTest::newRow("invalid integral value, no warning") << QByteArray("whatever") << false; } void test_environment_variable() { if (!error.isEmpty()) { QSKIP(qPrintable(error)); } QFETCH(QByteArray, value); QFETCH(bool, warning); qputenv("SHOW_SERVICEPROPERTIES_WARNINGS", value); if (warning) { ignoreWarning("InvalidPropertyWatcher.qml", 22, 5, "QML ServiceProperties: No such property 'ThisIsAnInvalidPropertyToWatch'"); } QScopedPointer test(new UbuntuTestCase("InvalidPropertyWatcher.qml")); UCServiceProperties *watcher = static_cast(test->rootObject()->property("service").value()); QVERIFY(watcher); // error should contain the warning QCOMPARE(watcher->property("error").toString(), QString("No such property 'ThisIsAnInvalidPropertyToWatch'")); } void test_invalid_property_data() { QTest::addColumn("warning"); QTest::newRow("Without warning") << false; QTest::newRow("With warning") << true; } void test_invalid_property() { if (!error.isEmpty()) { QSKIP(qPrintable(error)); } QFETCH(bool, warning); qputenv("SHOW_SERVICEPROPERTIES_WARNINGS", warning ? "1" : "0"); if (warning) { ignoreWarning("InvalidPropertyWatcher.qml", 22, 5, "QML ServiceProperties: No such property 'ThisIsAnInvalidPropertyToWatch'"); } QScopedPointer test(new UbuntuTestCase("InvalidPropertyWatcher.qml")); UCServiceProperties *watcher = static_cast(test->rootObject()->property("service").value()); QVERIFY(watcher); // error should contain the warning QCOMPARE(watcher->property("error").toString(), QString("No such property 'ThisIsAnInvalidPropertyToWatch'")); } void test_one_valid_one_invalid_property_data() { QTest::addColumn("warning"); QTest::newRow("Without warning") << false; QTest::newRow("With warning") << true; } void test_one_valid_one_invalid_property() { if (!error.isEmpty()) { QSKIP(qPrintable(error)); } QFETCH(bool, warning); qputenv("SHOW_SERVICEPROPERTIES_WARNINGS", warning ? "1" : "0"); if (warning) { ignoreWarning("InvalidPropertyWatcher2.qml", 22, 5, "QML ServiceProperties: No such property 'ThisIsAnInvalidPropertyToWatch'"); } QScopedPointer test(new UbuntuTestCase("InvalidPropertyWatcher2.qml")); UCServiceProperties *watcher = static_cast(test->rootObject()->property("service").value()); QVERIFY(watcher); // error should contain the wearning QCOMPARE(watcher->property("error").toString(), QString("No such property 'ThisIsAnInvalidPropertyToWatch'")); } void test_change_connection_props_data() { QTest::addColumn("property"); QTest::addColumn("value"); QTest::addColumn("warning"); QTest::newRow("Changing servcie, no warning") << "service" << "anything.else" << false; QTest::newRow("Changing servcie, with warning") << "service" << "anything.else" << true; QTest::newRow("Changing interface, no warning") << "serviceInterface" << "anything.else" << false; QTest::newRow("Changing interface, with warning") << "serviceInterface" << "anything.else" << true; QTest::newRow("Changing adaptor, no warning") << "adaptorInterface" << "anything.else" << false; QTest::newRow("Changing adaptor, with warning") << "adaptorInterface" << "anything.else" << true; } void test_change_connection_props() { QFETCH(QString, property); QFETCH(QString, value); if (!error.isEmpty()) { QSKIP(qPrintable(error)); } QFETCH(bool, warning); qputenv("SHOW_SERVICEPROPERTIES_WARNINGS", warning ? "1" : "0"); if (warning) { ignoreWarning("IncomingCallVibrateWatcher.qml", 22, 5, "QML ServiceProperties: Changing connection parameters forbidden."); } QScopedPointer test(new UbuntuTestCase("IncomingCallVibrateWatcher.qml")); UCServiceProperties *watcher = static_cast(test->rootObject()->property("service").value()); QVERIFY(watcher); // try to change the property watcher->setProperty(property.toLocal8Bit().constData(), value); // error shoudl also have the warning QCOMPARE(watcher->property("error").toString(), QString("Changing connection parameters forbidden.")); } }; QTEST_MAIN(tst_ServiceProperties) #include "tst_serviceproperties.moc" ./tests/unit_x11/unit_x11.pro0000644000015600001650000000067512700370714016112 0ustar jenkinsjenkinsTEMPLATE = subdirs SUBDIRS += tst_components \ tst_ubuntu_shape \ tst_page \ tst_test \ tst_iconprovider \ tst_inversemousearea \ tst_recreateview \ tst_statesaver \ tst_deprecated_theme_engine \ tst_orientation \ tst_layouts \ tst_mousefilters \ tst_animator \ tst_serviceproperties \ tst_subtheming \ tst_swipearea \ tst_touchregistry \ tst_bottomedge \ tst_asyncloader ./tests/unit_x11/tst_statesaver/0000755000015600001650000000000012700370701016757 5ustar jenkinsjenkins./tests/unit_x11/tst_statesaver/NestedDynamics.qml0000644000015600001650000000163512700370701022411 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: 100 height: 100 Column { id: column Loader { id: outerLoader objectName: "outerLoader" StateSaver.properties: "source" } } } ./tests/unit_x11/tst_statesaver/SaveArrays.qml0000644000015600001650000000173512700370701021560 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { property var boolArray: [false, false] property var intArray: [1, 2] property var realArray: [10.1, 20.2] property var stringArray: ["false", "false"] id: testItem objectName: "testItem" StateSaver.properties: "boolArray, intArray, realArray, stringArray" } ./tests/unit_x11/tst_statesaver/ComponentsWithStateSavers.qml0000644000015600001650000000161612700370701024644 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: user width: 100 height: 100 CustomControl { id: component1 objectName: "control1" } CustomControl { id: component2 objectName: "control2" } } ./tests/unit_x11/tst_statesaver/ValidUID.qml0000644000015600001650000000150012700370701021067 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root Item { id: testItem objectName: "testItem" StateSaver.properties: "objectName" } } ./tests/unit_x11/tst_statesaver/SaveObject.qml0000644000015600001650000000147612700370701021527 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { property Item object: Item { objectName: "testObject" } id: testItem StateSaver.properties: "object" } ./tests/unit_x11/tst_statesaver/InvalidUID.qml0000644000015600001650000000146312700370701021426 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { Item { id: testItem objectName: "testItem" StateSaver.properties: "objectName" } } ./tests/unit_x11/tst_statesaver/SavePropertyGroups.qml0000644000015600001650000000161412700370701023337 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Rectangle { id: root property Rectangle propertyGroup: Rectangle { } width: 100 height: 100 objectName: "testItem" StateSaver.properties: "color, border.color, propertyGroup.color" } ./tests/unit_x11/tst_statesaver/RepeaterStates.qml0000644000015600001650000000211712700370701022426 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: 100 height: 100 Column { id: column objectName: "column" Repeater { id: repeater model: 4 Rectangle { id: rect width: root.width height: 20 objectName: "testItem" StateSaver.properties: "height" } } } } ./tests/unit_x11/tst_statesaver/CustomControl.qml0000644000015600001650000000145012700370701022305 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Rectangle { id: control width: 100 height: 50 color: "red" StateSaver.properties: "color" } ./tests/unit_x11/tst_statesaver/SameIdsInDifferentComponents.qml0000644000015600001650000000160012700370701025200 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: 100 height: 100 Loader { id: loader objectName: "testItem" source: "FirstComponent.qml" StateSaver.properties: "source" } } ./tests/unit_x11/tst_statesaver/SecondComponent.qml0000644000015600001650000000151312700370701022570 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: sameRoot Item { id: sameItem objectName: "secondComponent" StateSaver.properties: "objectName" } } ./tests/unit_x11/tst_statesaver/tst_statesaver.pro0000644000015600001650000000131412700370701022553 0ustar jenkinsjenkinsinclude(../test-include.pri) DEFINES += SRCDIR=\\\"$$PWD/\\\" SOURCES += \ tst_statesaver.cpp OTHER_FILES += \ SaveArrays.qml \ SaveSupportedTypes.qml \ ValidUID.qml \ InvalidUID.qml \ ValidGroupProperty.qml \ InvalidGroupProperty.qml \ Dynamic.qml \ TwoDynamics.qml \ DisabledStateSaver.qml \ SaveObject.qml \ FirstComponent.qml \ SecondComponent.qml \ SameIdsInDifferentComponents.qml \ SavePropertyGroups.qml \ ComponentsWithStateSavers.qml \ CustomControl.qml \ ComponentsWithStateSaversNoId.qml \ NestedDynamics.qml \ RepeaterStates.qml \ ListViewItems.qml \ GridViewItems.qml \ NormalAppClose.qml \ SaveEnum.qml ./tests/unit_x11/tst_statesaver/ValidGroupProperty.qml0000644000015600001650000000161712700370701023320 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root Item { id: testItem property var group: QtObject { id: group objectName: "testItem" StateSaver.properties: "objectName" } } } ./tests/unit_x11/tst_statesaver/SaveEnum.qml0000644000015600001650000000140312700370701021213 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Text { id: testItem StateSaver.properties: "horizontalAlignment" } ./tests/unit_x11/tst_statesaver/SaveSupportedTypes.qml0000644000015600001650000000336712700370701023334 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { property int intValue: 100 property bool boolValue: false property real realValue: 123.45 property double doubleValue: 32155.2355 property string string: "component string" property url url: Qt.resolvedUrl("SaveSupportedTypes.qml") property date date: new Date() property point point: Qt.point(10, 10) property rect rect: Qt.rect(0, 0, 20, 20) property size size: Qt.size(20, 30) property color color: "red" property font font: Qt.font({family: "Courrier New"}) property vector2d vector2d: Qt.vector2d(1, 2) property vector3d vector3d: Qt.vector3d(1, 2, 3) property vector4d vector4d: Qt.vector4d(1, 2, 3, 4) property quaternion quaternion: Qt.quaternion(0.5, 1, 2, 3) property matrix4x4 matrix4x4: Qt.matrix4x4(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) id: testItem objectName: "testItem" StateSaver.properties: "intValue, boolValue, realValue, doubleValue, string, url,"+ "date, point, rect, size, time, color, font, vector2d, vector3d, vector4d, quaternion, matrix4x4" } ./tests/unit_x11/tst_statesaver/ComponentsWithStateSaversNoId.qml0000644000015600001650000000157312700370701025420 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: user width: 100 height: 100 CustomControl { objectName: "control1" } CustomControl { id: customControl2 objectName: "control2" } } ./tests/unit_x11/tst_statesaver/FirstComponent.qml0000644000015600001650000000151212700370701022443 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: sameRoot Item { id: sameItem objectName: "firstComponent" StateSaver.properties: "objectName" } } ./tests/unit_x11/tst_statesaver/TwoDynamics.qml0000644000015600001650000000167712700370701021746 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: 100 height: 100 Column { id: column Loader { id: loader source: "ValidUID.qml" } Loader { id: loader2 source: "ValidUID.qml" } } } ./tests/unit_x11/tst_statesaver/SimpleApp.qml0000644000015600001650000000205112700370701021362 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { property var boolArray: [false, false] property var intArray: [1, 2] property var realArray: [10.1, 20.2] property var stringArray: ["false", "false"] id: testItem objectName: "testItem" StateSaver.properties: "boolArray, intArray, realArray, stringArray" Component.onCompleted: UbuntuApplication.applicationName = "SimpleApp" } ./tests/unit_x11/tst_statesaver/NormalAppClose.qml0000644000015600001650000000232412700370701022352 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { property var boolArray: [false, false] property var intArray: [1, 2] property var realArray: [10.1, 20.2] property var stringArray: ["false", "false"] id: testItem objectName: "testItem" StateSaver.properties: "boolArray, intArray, realArray, stringArray" Timer { id: closeTimer interval: 1000 running: false onTriggered: Qt.quit(); } Component.onCompleted: { UbuntuApplication.applicationName = "SimpleApp"; closeTimer.running = true; } } ./tests/unit_x11/tst_statesaver/Dynamic.qml0000644000015600001650000000146312700370701021062 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: 100 height: 100 Loader { id: loader source: "ValidUID.qml" } } ./tests/unit_x11/tst_statesaver/InvalidGroupProperty.qml0000644000015600001650000000157112700370701023646 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root Item { id: testItem property var group: QtObject { objectName: "testItem" StateSaver.properties: "objectName" } } } ./tests/unit_x11/tst_statesaver/DisabledStateSaver.qml0000644000015600001650000000154212700370701023205 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root Item { id: testItem objectName: "testItem" StateSaver.properties: "objectName" StateSaver.enabled: false } } ./tests/unit_x11/tst_statesaver/GridViewItems.qml0000644000015600001650000000203612700370701022215 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: 100 height: 100 GridView { id: listView objectName: "grid" anchors.fill: parent model: 2 delegate: Rectangle { id: listItem objectName: "testItem" width: 20 height: 20 StateSaver.properties: "height" } } } ./tests/unit_x11/tst_statesaver/tst_statesaver.cpp0000644000015600001650000005442412700370701022547 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include #include #include #include #include #include #include #include #include #include #include #include #include "quickutils.h" #include "ucapplication.h" #include #include #include "uctestcase.h" #include #include "plugin.h" #define protected public #define private public #include "ucstatesaver.h" #include "statesaverbackend_p.h" #undef private #undef protected class tst_StateSaverTest : public QObject { Q_OBJECT public: tst_StateSaverTest() {} private: QString m_modulePath; QQmlEngine *engine = nullptr; QQuickView *createView(const QString &file) { UbuntuTestCase* testCase = new UbuntuTestCase(file); return qobject_cast(testCase); } void resetView(QScopedPointer &view, const QString &file) { Q_EMIT StateSaverBackend::instance()->initiateStateSaving(); view.reset(); // Make sure that the state is reloaded from file StateSaverBackend::instance()->m_archive.data()->sync(); view.reset(new UbuntuTestCase(file)); } void resetView(QScopedPointer &view, const QString &file) { Q_EMIT StateSaverBackend::instance()->initiateStateSaving(); view.reset(); // Make sure that the state is reloaded from file StateSaverBackend::instance()->m_archive.data()->sync(); view.reset(createView(file)); } QString stateFile(const QString &appId) { return QString("%1/%2/statesaver.appstate") .arg(QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation)) .arg(appId); } private Q_SLOTS: void initTestCase() { QCoreApplication::setApplicationName("savedstate"); QCoreApplication::setOrganizationName(""); QDir modules (UBUNTU_QML_IMPORT_PATH); QVERIFY(modules.exists()); m_modulePath = modules.absolutePath(); // XDG_RUNTIME_DIR may not be set in a test environment QDir tempDir(QStandardPaths::writableLocation(QStandardPaths::TempLocation)); QString testRuntimeDir(tempDir.filePath("tst_statesaver")); // Remove to guarantee subsequent test runs are consistent QDir(testRuntimeDir).removeRecursively(); // Create manually to avoid wrong ownership tempDir.mkdir("tst_statesaver"); setenv("XDG_RUNTIME_DIR", testRuntimeDir.toUtf8(), 1); } void cleanupTestCase() { } void init() { engine = new QQmlEngine; UbuntuComponentsPlugin::initializeContextProperties(engine); // invoke initialization StateSaverBackend::instance(engine); } void cleanup() { StateSaverBackend::instance()->reset(); delete engine; } void test_SaveArrays() { QScopedPointer view(createView("SaveArrays.qml")); QVERIFY(view); QObject *testItem = view->rootObject(); QVERIFY(testItem); QVariantList boolValues; boolValues << true << true; QVariantList intValues; intValues << 100 << 200; QVariantList realValues; realValues << 123.45 << 678.9; QVariantList stringValues; stringValues << "one" << "two"; testItem->setProperty("boolArray", boolValues); testItem->setProperty("intArray", intValues); testItem->setProperty("realArray", realValues); testItem->setProperty("stringArray", stringValues); resetView(view, "SaveArrays.qml"); QVERIFY(view); testItem = view->rootObject(); QVERIFY(testItem); QCOMPARE(testItem->property("boolArray").value(), boolValues); QCOMPARE(testItem->property("intArray").value(), intValues); QCOMPARE(testItem->property("realArray").value(), realValues); QCOMPARE(testItem->property("stringArray").value(), stringValues); } void test_SaveStructures() { QScopedPointer view(createView("SaveSupportedTypes.qml")); QVERIFY(view); QObject *testItem = view->rootObject(); QVERIFY(testItem); QVariantHash values; values.insert("intValue", 1000); values.insert("boolValue", true); values.insert("realValue", 345.12); values.insert("doubleValue", 65535.33244); values.insert("string", "test string"); values.insert("url", QUrl::fromLocalFile("tst_statesaver.cpp")); values.insert("date", QDateTime::currentDateTime().addDays(5)); values.insert("point", QPoint(100, 100)); values.insert("rect", QRect(100, 100, 200, 200)); values.insert("size", QSize(345, 678)); values.insert("color", QColor("blue")); values.insert("font", QFont("Ubuntu")); values.insert("vector2d", QVector2D(100.0, 200.0)); values.insert("vector3d", QVector3D(100.0, 200.0, 300.0)); values.insert("vector4d", QVector4D(100.0, 200.0, 300.0, 400.0)); values.insert("quaternion", QQuaternion(1, 100.0, 200.0, 300.0)); values.insert("matrix4x4", QMatrix4x4(5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)); QHashIterator i(values); while (i.hasNext()) { i.next(); QVERIFY2(testItem->setProperty(i.key().toLocal8Bit().constData(), i.value()), QString("set %1").arg(i.key()).toLocal8Bit().constData()); } resetView(view, "SaveSupportedTypes.qml"); QVERIFY(view); testItem = view->rootObject(); QVERIFY(testItem); UCStateSaverAttached *stateSaver = qobject_cast(qmlAttachedPropertiesObject(testItem, false)); QVERIFY(stateSaver); QStringList properties = stateSaver->properties().split(','); Q_FOREACH(const QString &property, properties) { QVERIFY2(testItem->property(property.toLocal8Bit().constData()) == values.value(property), QString("verifying %1").arg(property).toLocal8Bit().constData()); } } void test_SaveEnum() { /* This test is important because when saving the value of an enum * property to QSettings, it is deserialized as a string. Setting that * string value to an enum property fails and therefore the state * restoration does not work. * In most cases implicit type conversion from string to the appropriate * type works. */ QScopedPointer view(createView("SaveEnum.qml")); QVERIFY(view); QObject *testItem = view->rootObject(); QVERIFY(testItem); testItem->setProperty("horizontalAlignment", Qt::AlignRight); resetView(view, "SaveEnum.qml"); QVERIFY(view); testItem = view->rootObject(); QVERIFY(testItem); QVERIFY(testItem->property("horizontalAlignment") == Qt::AlignRight); } void test_SavePropertyGroup() { QScopedPointer view(createView("SavePropertyGroups.qml")); QVERIFY(view); QObject *testItem = view->rootObject(); QVERIFY(testItem); QVERIFY(testItem->setProperty("color", QColor("red"))); // set property groups using QQmlProperty QQmlProperty borderColor(testItem, "border.color"); borderColor.write(QColor("green")); QQmlProperty propertyGroup(testItem, "propertyGroup.color"); propertyGroup.write(QColor("blue")); resetView(view, "SavePropertyGroups.qml"); QVERIFY(view); testItem = view->rootObject(); QVERIFY(testItem); QCOMPARE(testItem->property("color"), QVariant(QColor("red"))); // read property groups using QQmlProperty QQmlProperty verifyBorderColor(testItem, "border.color"); QCOMPARE(verifyBorderColor.read(), QVariant(QColor("green"))); QQmlProperty verifyPropertyGroup(testItem, "propertyGroup.color"); QCOMPARE(verifyPropertyGroup.read(), QVariant(QColor("blue"))); } void test_SaveObject() { QScopedPointer view(createView("SaveObject.qml")); QVERIFY(view); QObject *testItem = view->rootObject(); QVERIFY(testItem); QScopedPointer obj(new QQuickItem); obj->setObjectName("internal"); testItem->setProperty("object", QVariant::fromValue(obj.data())); resetView(view, "SaveObject.qml"); QVERIFY(view); testItem = view->rootObject(); QVERIFY(testItem); QVERIFY(testItem->property("object").value() != obj.data()); } void test_ValidUID() { QScopedPointer view(createView("ValidUID.qml")); QVERIFY(view); QObject *testItem = view->rootObject()->findChild("testItem"); QVERIFY(testItem); testItem->setObjectName("updated"); resetView(view, "ValidUID.qml"); QVERIFY(view); testItem = view->rootObject()->findChild("updated"); QVERIFY(testItem); } void test_InvalidUID() { QString filePath(QFileInfo("InvalidUID.qml").absoluteFilePath()); QString objectId(filePath.replace("/", "_") + ":21:5:testItem"); UbuntuTestCase::ignoreWarning("InvalidUID.qml", 20, 1, QString("QML Item: All the parents must have an id.\nState saving disabled for %1, class %2") .arg(objectId).arg("QQuickItem"), 2); QScopedPointer view(new UbuntuTestCase("InvalidUID.qml")); QObject *testItem = view->rootObject()->findChild("testItem"); QVERIFY(testItem); testItem->setObjectName("updated"); resetView(view, "InvalidUID.qml"); QVERIFY(view); testItem = view->rootObject()->findChild("updated"); QVERIFY(testItem == 0); } void test_ValidGroupProperty() { QScopedPointer view(createView("ValidGroupProperty.qml")); QVERIFY(view); QObject *testItem = view->rootObject()->findChild("testItem"); QVERIFY(testItem); testItem->setObjectName("group"); resetView(view, "ValidGroupProperty.qml"); QVERIFY(view); testItem = view->rootObject()->findChild("group"); QVERIFY(testItem); } void test_InvalidGroupProperty() { UbuntuTestCase::ignoreWarning("InvalidGroupProperty.qml", 24, 29, "QML QtObject: Warning: attachee must have an ID. State will not be saved.", 2); QScopedPointer view(new UbuntuTestCase("InvalidGroupProperty.qml")); QObject *testItem = view->rootObject()->findChild("testItem"); QVERIFY(testItem); testItem->setObjectName("group"); resetView(view, "InvalidGroupProperty.qml"); testItem = view->rootObject()->findChild("group"); QVERIFY(testItem == 0); } void test_Dynamic() { QScopedPointer view(createView("Dynamic.qml")); QVERIFY(view); QObject *testItem = view->rootObject()->findChild("testItem"); QVERIFY(testItem); testItem->setObjectName("updated"); resetView(view, "Dynamic.qml"); QVERIFY(view); testItem = view->rootObject()->findChild("updated"); QVERIFY(testItem); } void test_TwoDynamics() { QScopedPointer view(createView("TwoDynamics.qml")); QVERIFY(view); QObject *testItem = view->rootObject()->findChild("testItem"); QVERIFY(testItem); testItem->setObjectName("updated"); resetView(view, "TwoDynamics.qml"); QVERIFY(view); testItem = view->rootObject()->findChild("updated"); QVERIFY(testItem); } void test_DisabledStateSaver() { QScopedPointer view(createView("DisabledStateSaver.qml")); QVERIFY(view); QObject *testItem = view->rootObject()->findChild("testItem"); QVERIFY(testItem); testItem->setObjectName("updated"); resetView(view, "DisabledStateSaver.qml"); QVERIFY(view); testItem = view->rootObject()->findChild("updated"); QVERIFY(testItem == 0); } void test_SameIdsInDifferentComponents() { QScopedPointer view(createView("SameIdsInDifferentComponents.qml")); QVERIFY(view); QObject *testItem = view->rootObject()->findChild("testItem"); QVERIFY(testItem); testItem->setProperty("source", "SecondComponent.qml"); // check if the SecondComponent state saver is enabled QObject *item = testItem->property("item").value(); QVERIFY(item); QObject *innerItem = item->findChild("secondComponent"); UCStateSaverAttached *stateSaver = qobject_cast(qmlAttachedPropertiesObject(innerItem, false)); QVERIFY(stateSaver); QVERIFY(stateSaver->enabled()); resetView(view, "SameIdsInDifferentComponents.qml"); QVERIFY(view); testItem = view->rootObject()->findChild("secondComponent"); QVERIFY(testItem); } void test_ComponentsWithStateSavers() { QScopedPointer view(createView("ComponentsWithStateSavers.qml")); QVERIFY(view); QObject *control1 = view->rootObject()->findChild("control1"); QVERIFY(control1); QObject *control2 = view->rootObject()->findChild("control2"); QVERIFY(control2); UCStateSaverAttached *stateSaver1 = qobject_cast(qmlAttachedPropertiesObject(control1, false)); QVERIFY(stateSaver1); QVERIFY(stateSaver1->enabled()); UCStateSaverAttached *stateSaver2 = qobject_cast(qmlAttachedPropertiesObject(control2, false)); QVERIFY(stateSaver2); QVERIFY(stateSaver2->enabled()); QVERIFY(control1->setProperty("color", QColor("green"))); QVERIFY(control2->setProperty("color", QColor("blue"))); resetView(view, "ComponentsWithStateSavers.qml"); control1 = view->rootObject()->findChild("control1"); QVERIFY(control1); control2 = view->rootObject()->findChild("control2"); QVERIFY(control2); stateSaver1 = qobject_cast(qmlAttachedPropertiesObject(control1, false)); QVERIFY(stateSaver1); QVERIFY(stateSaver1->enabled()); stateSaver2 = qobject_cast(qmlAttachedPropertiesObject(control2, false)); QVERIFY(stateSaver2); QVERIFY(stateSaver2->enabled()); QVERIFY(view); QCOMPARE(control1->property("color"), QVariant(QColor("green"))); QCOMPARE(control2->property("color"), QVariant(QColor("blue"))); } void test_ComponentsWithStateSaversNoId() { UbuntuTestCase::ignoreWarning("ComponentsWithStateSaversNoId.qml", 25, 5, "QML Rectangle: Warning: attachee must have an ID. State will not be saved."); QScopedPointer view(new UbuntuTestCase("ComponentsWithStateSaversNoId.qml")); QObject *control1 = view->rootObject()->findChild("control1"); QVERIFY(control1); QObject *control2 = view->rootObject()->findChild("control2"); QVERIFY(control2); UCStateSaverAttached *stateSaver1 = qobject_cast(qmlAttachedPropertiesObject(control1, false)); QVERIFY(stateSaver1); QVERIFY(stateSaver1->enabled() == false); UCStateSaverAttached *stateSaver2 = qobject_cast(qmlAttachedPropertiesObject(control2, false)); QVERIFY(stateSaver2); QVERIFY(stateSaver2->enabled()); } void test_nestedDynamics() { QScopedPointer view(createView("NestedDynamics.qml")); QVERIFY(view); QObject *topLoader = view->rootObject()->findChild("outerLoader"); QVERIFY(topLoader); topLoader->setProperty("source", "Dynamic.qml"); QTest::waitForEvents(); QObject *testItem = view->rootObject()->findChild("testItem"); QVERIFY(testItem); testItem->setObjectName("updated"); resetView(view, "NestedDynamics.qml"); QVERIFY(view); testItem = view->rootObject()->findChild("updated"); QVERIFY(testItem); } void test_repeaterStates() { QScopedPointer view(createView("RepeaterStates.qml")); QVERIFY(view); QQuickItem *column = view->rootObject()->findChild("column"); QVERIFY(column); QList items = column->childItems(); QCOMPARE(items.count(), 5); // 4 Rectangles + 1 Repeater Q_FOREACH(QQuickItem *item, items) { if (QuickUtils::instance()->className(item) == "QQuickRectangle") { item->setHeight(25); } } resetView(view, "RepeaterStates.qml"); QVERIFY(view); column = view->rootObject()->findChild("column"); QVERIFY(column); items = column->childItems(); QCOMPARE(items.count(), 5); // 4 Rectangles + 1 Repeater Q_FOREACH(QQuickItem *item, items) { if (QuickUtils::instance()->className(item) == "QQuickRectangle") { QCOMPARE(item->height(), 25.0); } } } void test_ListViewItemStates() { QScopedPointer view(createView("ListViewItems.qml")); QVERIFY(view); QQuickItem *list = view->rootObject()->findChild("list"); QVERIFY(list); QQuickItem *contentItem = list->property("contentItem").value(); QVERIFY(contentItem); QList items = contentItem->childItems(); int testItemCount = 0; Q_FOREACH(QQuickItem *item, items) { if (item->objectName() == "testItem") { item->setHeight(25); testItemCount++; } } QCOMPARE(testItemCount, 2); resetView(view, "ListViewItems.qml"); QVERIFY(view); list = view->rootObject()->findChild("list"); QVERIFY(list); contentItem = list->property("contentItem").value(); QVERIFY(contentItem); items = contentItem->childItems(); Q_FOREACH(QQuickItem *item, items) { if (item->objectName() == "testItem") { QCOMPARE(item->height(), 25.0); } } } void test_GridViewItemStates() { QScopedPointer view(createView("GridViewItems.qml")); QVERIFY(view); QQuickItem *list = view->rootObject()->findChild("grid"); QVERIFY(list); QQuickItem *contentItem = list->property("contentItem").value(); QVERIFY(contentItem); QList items = contentItem->childItems(); int testItemCount = 0; Q_FOREACH(QQuickItem *item, items) { if (item->objectName() == "testItem") { item->setHeight(25); testItemCount++; } } QCOMPARE(testItemCount, 2); resetView(view, "GridViewItems.qml"); QVERIFY(view); list = view->rootObject()->findChild("grid"); QVERIFY(list); contentItem = list->property("contentItem").value(); QVERIFY(contentItem); items = contentItem->childItems(); Q_FOREACH(QQuickItem *item, items) { if (item->objectName() == "testItem") { QCOMPARE(item->height(), 25.0); } } } void test_normalAppClose() { QProcess testApp; testApp.start("qmlscene", QStringList() << "-I" << UBUNTU_QML_IMPORT_PATH << "NormalAppClose.qml"); testApp.waitForFinished(); QString fileName = stateFile("NormalAppClose"); QVERIFY(!QFile(fileName).exists()); } void test_SigTerm() { QProcess testApp; testApp.start("qmlscene",QStringList() << "-I" << UBUNTU_QML_IMPORT_PATH << "SimpleApp.qml"); testApp.waitForStarted(); // send SIGTERM signal to the process, use terminate() to do that. testApp.terminate(); testApp.waitForFinished(); QString fileName = stateFile("SimpleApp"); QVERIFY(!QFile(fileName).exists()); } void test_SigInt() { QProcess testApp; testApp.start("qmlscene",QStringList() << "-I" << UBUNTU_QML_IMPORT_PATH << "SimpleApp.qml"); testApp.waitForStarted(); QTest::qWait(1000); // make sure we are not killing the parent QVERIFY(testApp.pid() != QCoreApplication::applicationPid()); // skip tests if the application PID is zero => the child app PID seems to be zero as well if (!testApp.pid()) { // kill child process testApp.close(); QSKIP("This test requires valid PID"); } // send SIGINT ::kill(testApp.pid(), SIGINT); testApp.waitForFinished(); QString fileName = stateFile("SimpleApp"); QVERIFY2(QFile(fileName).exists(), qPrintable(fileName)); // clean the file QFile::remove(fileName); } }; QTEST_MAIN(tst_StateSaverTest) #include "tst_statesaver.moc" ./tests/unit_x11/tst_statesaver/ListViewItems.qml0000644000015600001650000000205012700370701022237 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: 100 height: 100 ListView { id: listView objectName: "list" anchors.fill: parent model: 2 delegate: Rectangle { id: listItem objectName: "testItem" width: parent.width height: 20 StateSaver.properties: "height" } } } ./tests/unit_x11/tst_iconprovider/0000755000015600001650000000000012700370716017307 5ustar jenkinsjenkins./tests/unit_x11/tst_iconprovider/tst_iconprovider.cpp0000644000015600001650000000737612700370714023423 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include #define private public #include "unitythemeiconprovider.h" #undef private class tst_IconProvider : public QObject { Q_OBJECT public: tst_IconProvider() {} private Q_SLOTS: void initTestCase() { qputenv("XDG_DATA_DIRS", SRCDIR); } void test_loadIcon_data() { QTest::addColumn("icon"); QTest::addColumn("requestSize"); QTest::addColumn("resultSize"); QTest::newRow("battery0") << "battery-100-charging" << QSize(-1, -1) << QSize(256, 165); QTest::newRow("battery1") << "battery-100-charging" << QSize(-1, 16) << QSize(24, 16); QTest::newRow("battery2") << "battery-100-charging" << QSize(16, -1) << QSize(16, 10); QTest::newRow("battery3") << "battery-100-charging" << QSize(0, 16) << QSize(24, 16); QTest::newRow("battery4") << "battery-100-charging" << QSize(16, 0) << QSize(16, 10); QTest::newRow("battery5") << "battery-100-charging" << QSize(24, 16) << QSize(24, 16); QTest::newRow("battery6") << "battery-100-charging" << QSize(24, 24) << QSize(24, 15); QTest::newRow("battery7") << "battery-100-charging" << QSize(37, 24) << QSize(37, 24); QTest::newRow("gallery0") << "gallery-app" << QSize(-1, -1) << QSize(512, 512); QTest::newRow("gallery1") << "gallery-app" << QSize(-1, 16) << QSize(16, 16); QTest::newRow("gallery2") << "gallery-app" << QSize(16, -1) << QSize(16, 16); QTest::newRow("gallery3") << "gallery-app" << QSize(0, 16) << QSize(16, 16); QTest::newRow("gallery4") << "gallery-app" << QSize(16, 0) << QSize(16, 16); QTest::newRow("gallery5") << "gallery-app" << QSize(24, 16) << QSize(16, 16); QTest::newRow("gallery6") << "gallery-app" << QSize(24, 24) << QSize(24, 24); } void test_loadIcon() { QFETCH(QString, icon); QFETCH(QSize, requestSize); QFETCH(QSize, resultSize); UnityThemeIconProvider provider("mockTheme"); QSize returnedSize; QPixmap p = provider.requestPixmap(icon, &returnedSize, requestSize); QCOMPARE(p.size(), resultSize); QCOMPARE(returnedSize, resultSize); // Search again to make sure subsequent searches still work p = provider.requestPixmap(icon, &returnedSize, requestSize); QCOMPARE(p.size(), resultSize); QCOMPARE(returnedSize, resultSize); } void test_hicolorLast() { QSize returnedSize; UnityThemeIconProvider provider("mockTheme"); // myapp is in MockTheme3 (white) and hicolor (black) // MockTheme3 one is returned since hicolor is last per spec QPixmap p = provider.requestPixmap("myapp", &returnedSize, QSize(-1, -1)); QVERIFY(!p.isNull()); QCOMPARE(QColor(p.toImage().pixel(0,0)), QColor(Qt::white)); // myapp2 is only in hicolor (black) so that's the one returned p = provider.requestPixmap("myapp2", &returnedSize, QSize(-1, -1)); QVERIFY(!p.isNull()); QCOMPARE(QColor(p.toImage().pixel(0,0)), QColor(Qt::black)); } }; QTEST_MAIN(tst_IconProvider) #include "tst_iconprovider.moc" ./tests/unit_x11/tst_iconprovider/icons/0000755000015600001650000000000012700370716020422 5ustar jenkinsjenkins./tests/unit_x11/tst_iconprovider/icons/mockTheme3/0000755000015600001650000000000012700370714022417 5ustar jenkinsjenkins./tests/unit_x11/tst_iconprovider/icons/mockTheme3/apps/0000755000015600001650000000000012700370716023364 5ustar jenkinsjenkins./tests/unit_x11/tst_iconprovider/icons/mockTheme3/apps/512/0000755000015600001650000000000012700370716023673 5ustar jenkinsjenkins./tests/unit_x11/tst_iconprovider/icons/mockTheme3/apps/512/myapp.png0000644000015600001650000000427312700370714025533 0ustar jenkinsjenkinsPNG  IHDRxsBIT|d pHYs+]IDATx1 0& zv, 3d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A.9tIENDB`./tests/unit_x11/tst_iconprovider/icons/mockTheme3/index.theme0000644000015600001650000000015112700370714024547 0ustar jenkinsjenkins[Icon Theme] Name=MockTheme3 Directories=apps/512 [apps/512] Size=512 Context=Applications Type=Fixed ./tests/unit_x11/tst_iconprovider/icons/mockTheme/0000755000015600001650000000000012700370716022336 5ustar jenkinsjenkins./tests/unit_x11/tst_iconprovider/icons/mockTheme/apps/0000755000015600001650000000000012700370701023273 5ustar jenkinsjenkins./tests/unit_x11/tst_iconprovider/icons/mockTheme/apps/512/0000755000015600001650000000000012700370701023602 5ustar jenkinsjenkins./tests/unit_x11/tst_iconprovider/icons/mockTheme/apps/512/gallery-app.png0000644000015600001650000057565112700370701026550 0ustar jenkinsjenkinsPNG  IHDRxpIDATx@Glv=.8:܆[JmMHQ5Fa~Oz'#?`|$  3-n&X%4M}^J`0̴00 x c}_t]l۶pѦin|ػyi_.9Ѿj 1s?wm ܯW{7`}ϻgTfW3>~G tRVbWw_WO|7s~3տ_ԿW{W߶@r??w[eU?H&X'ޝ%"Q@JȐ$XjH(&󝉋ܞͩ( ܸxf68v~= Gk(x~h֫C+{*L~oLfSEt~j9go>1tzc3sB简=f7әtQ']{IWӕiaͷ8O8(fjV]QW ^Wi^DYIIE?x.&K 9p z^Пh٣2[V- lK%oYAm6ךPϦݙL[>*fҰQKTK;4jD5ZݯL ®4Q$Si FTړ6`ޘ;N`t]?^< Np>, [ ]'Sdꊾޘr@/4MjXHmss"%H݅C[W佅۷FD<"gx@f6qC̸g}(tߟ?ig~0:sSgH/WdCmP~ˁOsOwu4-cq:.#9LR0Hύ{g=nnԁO~!x)2E z ([svԍv)G!'W)J^4еK y}pu#sڋ$)(HW0\SFnnG;6#q"Ł`/l_UG߅s(k\8.KO h7+E_-gWUl_QN Po `^c;֙SYynpĆ?砜 d_(Lhsޅ+p3<&Nrav\/& XK䀠cx}vktfӧo#ֲ=|=*b9o~kky:}vNφ{־߹P\qdSp 9wa;(^(Jʕ~D i 9tl ݿƗ&;7__RHS,H SHk zŖ@.{ߤu +&o_J?~ֺۯ1vҸr : }] ˏ8ه|ϹPN_&"`._T]; uO>񆱟`tWw{ssrumǴs:c Dqi`0 ?:(,(fp(V(D1SL:_ }|qwX{w-pp(6׸ې/ 8%A]sw'D'CmoMAORZv_?c]oS<^pwJ GKp_)WK߅[غtq?Sp +l:ޟ._A zv?{ݽ"\S,Ou1 "aq hk,ݿ+u-Pt(:kY};w:3Rfg{_XQ8Dƈ31y: ܕb%ECb:uZYs;rP\9;cV?N?wr$150M= ]Y4x7op,f0yK?2xݺ ů[oW?$_F8˗ uoϝ*:g_osս[krnw #ʫ|dƱ:ew_cΕ?R/ =^_y9DKƊʓS]DuCYhM'k.ȧK?=Z~Ei$OGToBS v|h{w.?XUpu=gkU=9uv6gxv;,Hܩt™;img"]xv;r#J< Ή=<#ƈCcVD x{6\BU`c3; V ޣ`&ҩ2 w/0\sF@nv,>.8`]@W^fMil"6?r}ĕN_81=bkprF_?]_hߒWnqs f?j}?EK>[#?uyVyY݅Cǩjb EA:IÁ0@$] P@A@۲lǙ[Ɏx5ȲckI{g{SC[tXky~S2k_W >rI2C kS/ \O !ܿԁ=W ~A Y G3W_dƧ!4w $ʁga#IiPϚ E  B~{5;! ׅvBHϟgyA^9'gHo=]'R5r2|x)<ۅ;wk^S9~so=i<(Epz sO[nˣ3m{=|uPX]:(H|וxz@; id;[iw=H]"0ig{MdVR2(*t0yb9߯w]GBWשkQ{ ^j@8w-U&u̙o[]NΎ;O!}מ>Lz$O yw]+`%k; RާwH= m L\$oч}ι pN?t`w绊ך-nw>^ >Ȟ~>FA*_.׊ߚ-ÿ]ѥgתPW!dF~R|}&^xPC"b3>~o}w>c`2> ?^1!jkr} z#@TFFyݶ;^6L=s?B/ =CT珷_j0'>O`aԽɟlϚh D@i~kV߸ /PoB'>4A"7ѯ=+nDxv!zR¸7H i |K߸/U{ƦCA@ `\ڣ_RQ: " Um2`-b߶]`^>&$$ĬNz3;!dc&f#t+o;ϓ;Hpe<:OA󽀞\@{}(ڧUR>BQG9kMovABe "kD5(6fG]QFߎ;/ȋsm$ʿA @{6 _~ۋ?i(Ӟ(ua)GHxU:`GDTMo?rCѾ9:B?CD5~m`k㞜~ݖ} {xtS7G_?0 =~GxU l t? j\P}:n` @l 28`no<F׳ Wu~6PI[_돏M{i Ul7U w{-Z{{j)a|lyb6?>E r3_{{IƼi6 8WNΟ{ ~mik0$AO?q|Y 0bEE_ P;[4POdܯȜFV >o}>*^}E0?K-xECX;1!}"ޣFt?7R炾5HkV#  *`@N~iR]/]&p{DD 4x{:R-¿(R0hI *5@S>UA{}N+Σ&[ڊ~p8 IsDU$zAH9[+п}_{o_k;7S'7 wzC/~1gw%'b@ZS7Aޟ> %>M>zc_*u ײ~? ]4 ??B?k*k=[$MU?NpqI(oO_x@| g{!okth$!$f@NE*BS >uم`fa\$λ9ǿyCQ-r2=뛭m]_@+V 40jts{IPp<֞0Rޙ4*4-f+c 6r50 )Bw˨{^W/(l{xKj~E?o_  <P>B~"KMէ~QiLp?2?s{fz_?O= )3rP5x{F^J~>y=gj aQ ٻKv?0?P|}M}H{䟅=p. D vތ lw5PFM: zbm*ӡy.O^oFSu?Ⱥ+RsR`?];|c^M+(xwrȹ>מÆ[GY  bgP.? kt@־3/>7]ZN[x;: ?}-' TkE>H~6o\=NC Y4AG(`o'oY5No?Z"Q 4' k "o=oc@ &włT|- wB涝ݴ}/XUH!-SM/?OxpZ7 Ԟa yw%|Q?rF$dŽFk{O />D(ID~:3=ʷd? MT/]Ϭ>zσ/9'-q&6~&{ jQa8'EL<d~ѿ?srjWO$N?L ћkEN=ߘW m直ajw\ #K'1u]f V Ea6P\c[ hP_k0:_O軼"b|x \xrou}B 8Wi#ĜϿF ʅ)=\#"T~\KxZyNk V _"} 閿QmB 7ӂ@ A_bGEH hM៻(Xop"A"vӫҿiDߤO$ ,߫{`E~<ĮRt@*La|eϿ&{m@ԇ߾e}_̀4l} j,Y_A x2m8j~=@~aX 5r()Tg]A)̽G ww=%.QȼA\FDUzu2anߟwrC|7 {BEAqO'y-uߋwF \w({ s` ᠮ; Q#O/Y󟢾}H>A/ފJ@ i@mTk ؙsbetS"*XMP}UJBAf=?<|.Q]x߁%Az_kR͏12۟0>~?qef~g|ny&J/cy x6)߿ŏ"HDEPJ/_~aaNn xݿëe`1Mf*WF}aw2 BAcݽ%}ټ~7" _R`K  d_d9RܦU~aЗDSߟ "u:v?z]菞[)H^d7 }VZ7\Z g@W߹I DC?exHhpH 7]PXm87 D4 Q# ɮ@}F9y l mgḶ[$|kVDCqyYG(.{.C}h͖dKY?)IoDn ~\&Oi_& X,)U?:B d@D\]vHjCd~Ium+p+8ϹiW>ϟA{1=YԃoPiu-C߸Js*^y.ֹy^!oӝN={Nf*߼%pF$g~RK"g\h_w:icze0(Z!\W#Oٵ. $aVk`>} I/}|;ZQ@{%]c{3_~ u_ r`PaW߿Z^㾺&m 7y#C"@Yo˓hwB=@0ޙ5?jX ?F@HëkO9jϸkOv?ah׾ɜ0krH߹/@O 1y[|- KD5Д;ܡ_O) ! #6 ,ߓ xCιO?: w$yO{O_ѧz ]0?@+{k/?w#R_h?țg &4,azܻgS>Ok"y+\|FII Ѽqqt7 bCm2H~gߩ\4[7+582/DA8_K_?ɮG˴C>MFȴ0T͡T ɼ5@㿆IPH^9~"2ƣ79٧*3R9Va؈ }3{.}@ ~_4)[ {B 1G1#"y =[\/@ݏD ,<=7D.rο) Yy!Cz&qCAA sO|pWop |>bAFSRK^ |0RPKħ x/%~ j1ܮ:a)]ηt@g?ſ.l@sL,0| ͭC5FI.g8G+r9΋L iyثsEyY8KI%"j7>!&Q{@Z _Of_ٿ[u$|z7O?{IkEo@q}@p:xZuV5xR̷(F '$~H*@0@Z ShP&E/dOEދ?Fgg=| ǟ_}č0mv}_p=3҃5Is6a;//9}Of$37uw1/|Ź*!w|Ds(1F.w8[{ڟ9 = нț?VEq 5sN5ڿ3f<}0kOF:$ofN3guPo8>]7wgf& N<:FxAaQ&mkHRx< a=k+G@; !~Ax܃y4qH^COtzCnL!=uY{ݽV(^èr%'OG~: !?EJ?Y?ܖC$lhw<~q1OVJ+m# CD f*s_?*i^[T.=[A,B?oJT{ڇS t=Ŀl#=Z*/!zw?ƞI~ه~k!@ᝫ-#_O?b RY&t{x/oPF\ ' \St+mzru_<: g0gb=HgoǙK #Db{mWC9y}ߑ띊DEufn(ņbs'O'ŋ#N5OTD=\?YhӳD_ T؟û_ joXb!>ߢo@#"E/7c DZ!{_UgpF@ o O@?EGe}C5]W!"ڣo6.=>!}uͨ_y6 tx޿V!g. ~1oV (+ ~ ~Tzm%C}xkV!+^"tn!`8 h`uu |E n_ޱv'AW^up. DE8*c 6֧+D|;94[1ߙM׾Ev/g3~  hSH"o/G o?] ޴g@cwP0HPY2>!|gJn*(Vg!e?v[v^_}t2 /Do?I% 2;WB@F1}ASɣ3_@?t菞˫?vI }caBH!sa}9wsrN @"}<秒_X??UZR& =?UZ{"{? WAT ^Z oGǟ$ z%vgp|NT& Nɸo?^gNa}5Sw-dzOh-{?f6S>|7 :?1x 9lq L"$m'uNy> y} JS@dJa3;(J[ V/BGE/Uqv&3 =#~!P7S{dpZoj"z@YOhN5g@zqxϸxm_ܶ:vdP ֽ>7@{%#0;_y"0Zh? 珬/{2:{8Z^\>,R'@}/ wu=р6n]9yE0-cݾ=ig ݃V 6^FA^H I2γv~n^'5Y54H{]<" |\/I4Wu][ 4T(v|>7Xߏh !20ת;͋gLs `F5W+ h3:B _{t;P._??zY!?hooGk<́3&׳ {% D?~ zꓡ=޿/_ZlDOGC@src' `<C#וM=YnTk{~EzФS"E߅{5T朝z ^^FVg3+C3LziAlw0 hOu̇%oYwCFr=B 3E <>~-]u=2 SgY Xs1<~k4VC ~է5MYG߀WBy 1$~d)rB@ ڟ*=#*[MgĞ~?vAy P?u.3eu6ixH,q"ο^NVYM,ak3@s }nx/40\w1Zw>wNM\۳Y|iC(BFNJ$"m",]yR#od8' S}+}+M_5gK#3i džzd#+go[G$ uOd@ އǾ]AYqPKſݮ9z?aK-E~&C)LQ [w4V?}ONpa7#Z0V@0? j]_@@Xt|28Йp]7 6+{ȓ\Эw\Po*!} ^q`[T|Ipۓ;LT|BܜX9{AΣq/֞IĉspWŷg^*MURbXHà17ȷo/Q:"mdC =S /`=wܣդ߆"H2я؇O;rkʟi}Ή5ϾB_Z __uᓫמ|~q_DiU0:yսH_}F7sf\ޫ> PǠu!~Q> Q/bTS o=~M"j۳k?=Ȟ=3 @4;o{@{{o_:u!hϕnأt01\$6isVA_>~KC|^v#;ͿE!\һWG|[p_5aX5oo~gу$&]繚LI`h#~K !$D_Ow?iW0ICӉ>C^~ * \ߞ+@27:vk 'PЕk#;DYw| e(OA`kE]4"Bt^3)i# s@JSH&޸,qi.}+n&Qg? gr7.GR1  aR7IFIMxgw*f}0`"yeZ?`&Z$ 7o9U i}׋T wtg'{!@]R37_xݥ)#J)ӆ@&j>g]՛|LL jځ0.j "m|UX՛u:7M3 ~#@U(g/m&=/ uA 8$B_?h }-_>rbS?ܽOB18~dzJ; ='](b,Rg\/0GkC;Y}{L"÷tM 퀂\/ꁓ?`8ïz<|Â66&&g!=~~U3 E*`S0px dnܜ!~mdD y=$}OP!|dÍRà:0pDZ'Suȝ>y{E?׌AI"{go2g_s$No B#oݣh8~&}z`C~"(s{9ν+ ~"kyn}w"Oџa?$~Mh_M#o'33g\SOB=4A2H T?E S_|pN7}s6Sw*ۘU㳗ٟ* Z엎%!c[a&|&?6u' ݙ03@tOt g*!1o "LŻH7|~ ; \ J|?}OVkuivPv?_w?}p5O~ܳv?~5Ϟuo@DNU>*g/Bao]kvp;q-4vOtJ55ZΉc~F -C_N d4@x!?ȟk_q/,Kߕ}ޗg~*.h? C֗NEr:ۿQ^ )yO,cEjc8 /^8og">=뿧=P7OA0P3m Aj"{!+g==o3${N7t/_ذ3#ޟ!{]/SE!=ɲW;]ooQ`@3'k򷷟GPa~Wwgˀ Gc=]yߧߠP_J9-~j=݋п=CgdbaGD>wxC-6bAF)u K~!\N4[$ߣ~3 wj_L˪ey?Ðg/A ??L׊h*_?|lu퉟rv7#}nD ֢@914 P N 4л ~xC,c?~eԯ3!J?[ӯ;@'FGo _]~x"~R p`N?Dݓ 0!8Ӓs~{)jNm#9/WnIsoy\^us]ԗb;5yzO^!~ya"+E !J?dCt_x0H_2cQ#2:=k @~0h@O_+@sO=_뿄hDq Q 鞢?c Ę__V@B}yb> Q_oG78 e0ȳ~rzgV*Qg UunEWZel0S㿴ɫ?<V¸lc6Bދ)Rmx?6Q1/b|WE"ߜvٻms]рPfIit$*Q`ȿ5D{[Nt{Dh=H~*sbo4g?qDX@W䮡Cc{O<!?8*¾ED~&yZ?CwY(E}"u]7G9w\TUoO/B{Q((A?W<&PL1@4 Z 8:: {VCa""4_KwR(@/*Oo@g5/.14Wsʿh? M ^xMxC'#m~:Ga C.>2 ,kw:;tJ}u -3מx ]{ ׿9;Aw7tWMc Adq{&Mmdp0hφRFֹt|P_C* eHz!Ɂ"ʟW=a?@7FUG0D}^:%t <#B{@$}!s&JO<+?}i^ g9Gm-&9gGU s!@>.C't,%_yO?O E-g[<}GOgd?/]}|{I"d a}W: RaZGDlǏ5MȰzEy0Pk7jFvwC,3]4NwY+bWԁY](C|؟mW9}=`Y^xK16 _'ryL}i0+d_M#S[]s*1y*@__uTs ~VrT^O  A#s]!g{w U\u_ ĝ?9B1wϑq tyLCć>!{OxVOo5@  (@[u?}{b<|4ekZwqK˟a9}cφK~b>F IW[>KRNA Zi'3Hb~wW_GWo1EO>?tXNLŸɄR܇s yrȋ!䟤 }m~MIrZ{@Ϻ0k%kfmiOJcCOйrng$pP$_joOmLֿf|0+l1nBe+?<U|oȾ~ q@?y4Wț>~"Z@e(޾wx/PK ^3`_|zRڇV ?݇ Cb>pD@!??&x G ۏȏ~ u,d7@tH\>?&|khz~ϫo0d HBN"p{ϼ~< /ua* k莐z-9\E4 6lC]?AizGonxo΍6f4 bϪv*O}7py{Ƅ7ֹ?nk{>{ N TczV74ُJ5;o?C }?Ā2W@E4? ?vx3O_c;<rL$-@?@PRE q^ {/z7l]wi=貉~Q`ca}=GWϟN[?d.C#̏9.D/Fbp^>oo_׆\xgD?i4od?9&Lz$pY&ҝm3;Zo{N&:?OA9ꀠx.$[7 L%#AD.' I+Ϲ*{`PY*(@Y\hD_fG![ *)_/t/cB^N;B`lYZP{&6_ "xk8=WUu~4E%s_p̀<${.1"vG:gG6?_i Q^>Wke}k_޾,CH~GVf?bO(꽀`_sO"!HN'6f}\G8B1ˆqgw`+ߢ+AEL2鹟w]ā羫'ߙLKNyDs!N}7ww#v2zy^s(LAɽέ8H2>郖VW &? Ǒ BGP;Vp|6-PXRky;IRkA"; U{ R?F Y\G?EDF~u@#9D@"?a[$go)G^ T#{<9c0XM"^ ]j~1G{"x/^ U{"3\ a\'c+uSŏgV| ڿ@ERp>R8jѬOzV^B +.?7)uxs:ARg#"UEn+E|a~Y0S)w]/9^G7ڰvr, ?~ekM?Y[n眿_Gfu'!~ o_ ൎ{e:c@qp -@Ai/**wLhGaW9?5h@xQ(¾qSd? O g"/ܯDh ":|vh(1  'gg: Ǩ."|"v'm3mw#woB?<u\OP, b]sã/Þs̫Y3#?)めE2٤?'6ȿkV VknŃ@x."s \7q2j gdCI}{@n?<Zt>+@h\/)i*K? S%Au YmT?}#$:\(=+/hO/9~RXO,@+ϸ_@jC_ײ2([Vw({YطA_S? @{Y s̃Ʊ Y>Ł gx3lֽ3O IbOeeo*gY|F ~Y8??&u>oΣA-3YǪ}83ٷa7IX2*Z6#@ƃraЛ37} ?uާu5"8@<>'n+8Cꯞ;yLԧk yb1ߞΪ>;?W۟ (ySпj( !@~VT쁈_@ o1:38`uE~hq Q{3ϟpz&O *Aa#=6(i_ ?U5@ܺu[ \YZ4i?~%R Yc CD{yw7 ėX -Bm#}/8߫c+ 7`pϬ a[2讄?|LzZO~ ;}]HBqw +=7@wTD;If<3=zﮣwUkhk+.`{OTq~Ͻ(3zO˰H>'pSת"N`GDGп^(%0fg+&{&7@ RȟjsUAfr /y<"k~.o=4}΄>DR_kV_)x{NyfuT@dLҧyyݫ| tdj:ѕ{ F$ :'~9&3o7ݫp}j!b=s o 32:xWu 2 [{Nw5EtDo1ȁ?w|Z^o$Ag}&dΣ0^3le yahl>qBX! 2>'Rg{p~GNgM_ֿg[ϟkyhᓫW|[?_3`@q1B1(_##@cGx_d}OoΌh}(t=!}ySmG?~T_HЯ !FBh(/ a#;8+<+ooP{s'$_.}b^k"E!ȎUhDxB9kud&l3݊wZm{::9_nɟ4gO@} r1/_{w| /'@o &w7j mT B~}3.:24#@TG_"#f}qŃg\W4L'O d~h #9?y wxVſ @WC\  ?##U6Θ_?]<,pV{s zo+a@޶:ZE؏0Π>;}Vo-D! ~#I @avc q]O "B>=ZMǯOMs_^(m M߿>cVoY0rMblx /^rgJDH8ϔ1Lќ""C"UQ؏k#?m<;D8_}j맞5н?>Yrhߥ?!Gg593"]!?ʡOkyjSyP_55 wnį@V Aݏ?gc@>Zx0_3>>92'_B[oLs߲: ދI^?K?!Kn^gmW^j~֧/A:P?F3zn{V_޿RooX on<{"LE:(LU$: qGVmsT`k] |}Ɍޤ@1]Cθ8o8Biw( o[ODJP@q\mzz"ms 1y| ?3}O~CLkg럞! k3OTߎQcN+0= # XٯW1ۯǏ<~ ut/DLwH{?sF @0_yF˟s+ @[wV ,iM 0a3ϻoH`RTF wyr|Oܱ]0"@ 5"n7ok#|Xsտ$ Kj} a`(TT ~#"_﬋61L~wpz_ x襮o/vi~w)H|j\ӝW$M/k3 "u}/6v:O؞=yG7]3 ?rD|b8ֿ)~`P5^zյ'~@\^W~~#9T{/?Op=@ k1忴O^u؟Qȏa7]$׿D&>4b1 E2߷$b>7 KEgi~m"*߹1#s)?>OZGԡOHD/G!P@QZާ/=th0#+Bu(:`0P/8/_E;iRUH?6}RC&y6<"6"#WƪuGܲ7o;>(he^JxL;t T&ou\& u{~gI܋|l3z&\N R {Higm3B$ y* u)OJi\30Eǿ!<"^yZ+uK#@t_ { #ϯ^'e'#9~BоkךPFKRwM@s??ۧ^>yEoU&q<;<n`\/oS_߶:-"P#/(È 1x_Zb?*#k9Ra@I)}@ݙBxYFzkfD1I;x6ao7)ߟH 9_QG{[psgmqw)(i2ZSDMU߆DKHge:Qo10:2LcU??u?"?u4@K_+a)]ٛ+ҿN$Կ./  tR?}. x28"z!>H_[)߫EJW@^) ?1ƩṿY8_r Q2~-Pf#߅ۯco&b5<22q2j^-dT'^thOď5G`"Z9G~=XwgLE]S(`{ _Vf DyA}}1 ׽?[2LD2xzZ»tr=H~XSswi]~s>uG+* , H:['? M" r~z d.ȳlk`_۰PGl.`0$wfbƀoы9/ (=@h9rʋOᅤ~N@wpPߒ<7So#V3nds6 bյտ9{9aBzBς7j޾Hp*g!  к!n.&TEpȟ?ݽ6O ̟a}r%OzZ,$D7fP@/#@9o'A&//LTA`! t]Q_">\TBӑ <}g;@w{\|sY.M[ٷdo 5$Eʠ"GCOUo:=ȹ'5`[ !%I;Cx07ujl[mig 1}k^Sin~!=ާSTgǻ?v@ƅg_ko ~uVď@"˵./}!@tѾ]ֿq-rߐv?m&zZ!?*;ˀp_k_By"_7(מW{?-|G?_0t^X< g۵57}7>qDa~ nK_5 `( @:O~ v_0Ҿak?9e0 EG=$^!w #<K.@$?@;';CܿWB&C5RJ7oqH<'`yZ>P=H.O0x均5pH/33ޘDHP m[ x^q$sDC~sX 5@xY!~Ix%? 8#$opyζ_>j]:]|hEWrİ0:;FiT{=9W`8ҝ_D`?aQP~u}g!@==V j?@_xU?ZX1B߿s3;T${cP¿5o\DR_xyϙj,C0tppAx >,^pMwBt/V#9$U?#E(vOC~_kj6-[7:"2se0ZKsjP yhoxɷFկusmykbUym/hQę}oC 2Yѝ+'7߿}3:l_-x"M)QR ?7#^N(A/9?t3~YyPHSWi_ _M]0_T~_(5>D៱̯Jwџh @Dw3Ii{{U TyOEgEyφ㚐^JXZOm"@ <{G=!yy"T) yF`*Q'#D~ 6H ˧H޽ih˾ ʑϽ{ΤG=Г($p^?< & 14ůq++Lrܘi[a>/ vN Jر}\ȣn] n?zWCψ;,U}& Y_緣-;90"$w|+4 ?s&BVKr@/?{[_!.sn гj7<yV &~HWw;ãg {0xfO+se E~$~7bXx]s/BFXJ pIpy޺oc+~TC*@2  a{E03"8p0ISeB_h1>={sobЂ?S68wћ@!ڮ "ts0 T)>0P̿؃= &MAxz_uDd*i4AM.]逊Tm@O:qIz緋쯀Q@Xb?t:tGa}1t>:c}r-P#p2ŃB8?@LyՊY-K`g K1 ~A:G4@ ߧ `>,ׂ/ DzܯDĩh}#CVm;HCҿzϸpj׉ "}Ij%kt Bwg${Dz@.(k/~]ҷҺ򘥺FCp{)ۤ/Ϻ@!sVOÉl> k OxۑvHo1 +"NJreP~VHqQ/0'<~gND0, g"a؏/U[`y}g_Mg!쑯0?? oo˓ {5"3oA93@D~i ]{FJȀ= ϲ _5h3c@ X'z[7 OA>K? Ot+yQ!fn* 1ҿ ,u4-򜏶J_@Wܸ}0B)@_?=`>x^#{(LzD jO"']P}F 'sN j~Aޕ[H?e 1ȇ?9S (:A|)=`O?a~P?^?逩/P 6ĬI~E?ĿC1O> "ًˋx-z@Ca?&/d۟^O-~@GXB @:gY@zE~ڗq2+@߸v?$};1_+SלAg&< ( =2_y;qP$~Xq& yw !Ls/0vZ&HyE~c= py=KuV3/;_DkE$ p?ZNnO_p?o|*XݪG~s>$_/%}&56CMCkcNmDL+[q x~]^y}A)~i(BuqAvx-ӨPdbRu_r@ N*]Iru{#'-C=A І "Du6WqH= ŀ,F Lh `B3z_U-ϼB_?3A Q>5 O}m _s]/.qW'Ϟ=~k\ O'"{Mn z[ &}B(+MND߿޵ o?<^[G~ݹKȝsW`*1 x`R7#ka?%@? _#翑2ˬ7A`OH;Pg!>g_}O=R'v; G_5!P@%f+M1} rfA>R;N #ϗ {B ƔޅLw{}Exgl<K nb=dNyw fcrǟzv8"9ދ[/ zI*y( #o1QM'3EQ(i_{؛C3A&~޿+_ra S3~ĭh_kE}O$ `v?;dńU >aSLD t$}+Lt_su?&{ k/рn<5פ60m7OA?UT7!\/`ޗ?0[ȨcEZgEwTy`jQ0M=CzOLr#fu|%RHu \W+bjo/?G>{h# Rgϟs0?א?A2Э~IK_Ϥm x<~#Eg*"` =EzkV_|㫪|~ͽ+: Ad!]3w? 1c@!_v !`BD7on; zkh/bFBzH.D͜_{ ֿ!~ju?R oߜx~Oqº%#Qpi0 (;UhѠ"ٸ(@KvB=A62!ϼ$+c?;Χth-#Ui $21L2_G( DXZ%Sktl;N@]Blo0B2aA!xv=&qA[zه.}ǡBpo e 0^ 9GOΟA@ +įu@޿~H5t}_Ru05!+= Pߞw i 0&k/1ovOL;zݶA O`>e7=򿾶olL>uV@LKC0Rh?#&o]2ɻy Vpg]v@$3(CugTMo9J|׌8MwK^ m<<]xxŸ'őO[kMJ|<ymԳT9.7Q{ zƿx/|?Z0"SFEmدMs_>yNsy/tsF!6Lc#GV?"sR"~W׾}#_ `=7ٛ]Jß@$VܿMSwm0׺ODg3ے?!žMOt70+!3_ hh߹o]Ly?Rcgx/'/ו.McҚ-v>\L Zל*ШVضub q&؟ w{3\7j{Gϊ$BwIџ,~/|ap=T!}zY!J&y*+/s!za׏1zwT#绕 8_z!=B!ˁ4T s_z{n,)6-:*eBGA‹:j΅ *>ϧ />0F:Z1X{<s|ax_~iS9Uy6AtDc¿F>D /_5Nȿ[9rhQE2+UQg#HCްkڟ;S/ߦDN_tBcc CNn3\ >O;@4 {}Z =9(й+ Hc4d|pUV˪,k律fjp5*G#=@-9/\Rn;[t/|Zx<1"t/ " =9u K̽P=a$HȷF^IU_9:fxz0w;~*"KN3isZ^?3xwp׀!w|0{: P𻓰^ 0Rxo׆>qZd ȃb_@LK[ Rx2<WS?pnm D~<}K!+%[WGAR`[r97+U`S'd!9p{=y~X1?}t=ۏ~~* @Em͗w1gu,\'x !<$`$$"N#@N/]ߩ ~DX9zDν!I7g@t }MI`H/<% |ݭ9z~=ǿ%uŋժWE!y*=X[ŒD;/|^=UEBFo0^i ރ!!9 v?zOBMտlSJ`בF׏ b9  }Fw H {OK=0Z-Y`ڐ`ȉHO4{&mu<޿"@/ U<:E4 8n|EQ*0?Bs5^x筂XU0>Xsǡ컟qwK )RG!9O~K XLߎߦO'jaKxS " x(@+O?aLjͻCb<" d_?DŽOտqmh PT땢Ǘ@zI[a辄}qWw@T s_ds?_Az%Q6 L>DtO߿9h&KO:@?į=y]wvY^޻_Lc@k,EK PιF=`Ùм]gM{Zzi?x@V{孼h"6Z߿!.Lk.H?zs`7Ć'<w;=u3Iʝ"`Aīok#]<}xtfGu䇷O?0 (4tMd B1L쐿=Yx'էo|G ~0`QA?/>5k߹bz>]ӪE{7_?/l:/蜦1_ O(;O >'䟠g[E&tȜeeyz5;"SO}8Gδ[_Z&K@ *"@{+T}Fa><Ծ+ F|lo;?7!+>A,}t:?t9"O{o-"s#jOPmi~@͛X!IC!>arP>o0P'p$;K~᫞]̄{ړfoW|6,4@-+{]P)6.b!z?y{gWQY/@iH?? s"CҬMY8߳wʸɞ]P%1/7ta% H_+yncP ~\G vB П-wDX@Ptɿ +=AM5D/\[D<~O_/(d\}} ?y-GO@{&}V_>vOw1j ]k -FKO"{ @*( = h{@]F? =1:ߡ;;wnw}3-'&zNɷ.=|b~LbxA\C1 |J}H_{#Ty cBoZ~}щ_u$Ds)dVǽ7So Ǽ{ UE}%=? )@=֫D=#8K^?]UjOϺ ;uNU7DLfWkn53_zɶ{('4{E(~MuٜGhCexvӆ'3+_mvz~ V}@yB Q#Aoo nK?]߽k%O;߽"tpg +lo9w:?':C)g7oKSGȾ+ L}- ƿ"a ʰ ` @/r}}쯞 G§@p\Ne⟕~п C{.E~ ?!K]Vh ^|5!J@n._7 %ғZ[D;?5y럼hVCsuɈI;d|@=x)~ 3'=9~}g6o91mwkz^ȃdAw{ݴ`}u:FHU*WF /Ǹ_ /_(=,qտ?N<}JT5  gO;\⿊er)7V2r !zf t u^ZMoOmL>]&|El0{@n_RYͣ~aAo=w桷A?KE@Dkܯ2OnRRQc}Tauz~kw7dM^=#gP}550{/~g'a"[_wQTgc--:k]9=tLa@cȣ9z;da #K{^W߅{1{r:6Èb?FA\7 ?7>>'O ҽ{ϓaeo~㗡@]kU /rſV X=g?5g!@E=㌼xC޿l^d/ ^ //y_dy+uBLJs/b<1x/vSOp?+`ԯxg`}}.GV@ &niv@y!;Ѓ~w ?y~_YPm=E Aw_V *Ay)D3; q"^߀'9Gg{u/bcD>)Ed(h ˽)V|`Thp]6y@Uz`;|E"Q. EQ (P:kC?nx{=7jC# P p~ǵL]_w?C$np?2 姜RUP4.q>qE ~,Iy/CL/o_Y`ͣyػP9Y Lw^?/?y 7=/K f;R!u>kq;ߟ])o` z A7[.Z *}u?}~>"s?A9޿ݒU&A/uU{vjw_Uѳ/}~݋ׯuCjDkeC"i7#]@LFE묯/ϼa4j9 .c:_ψ |nN/}UQ^u1Pod_yZQ/9`!x?KqXϧ 5ҠIFD#(Osu[/"뾞+W?LK/yJ1Lor){<ֽH-8>ߪi_Fu(qMC."NJ.@ǺU$oR :d{2}!GA`A $#bp?;xN 򶗯Wc:OJ@2mxvBdKOZWVE&z.pm_5nCu?A?\9o={h[$tP'p&%H~ ݓܲ:A>A?^Z{NtN׵P8W ;঒Na aP !7纅xA#?%Q<<6!׮6T;hqd*6@@𿮅 !@ ߵ:j4"]៘5Ȫ";K~ړFod>0~N@6h $O_+a~Gf;ˏ! +>gL5:ڧϟ(0ޯ?~ȿ (t[VwE х0\#ܿVZ{'UoWW_1.x{,0 Jqt> =ލi zko68 rmz\zc g5Q ;WD7;3 ܟu^}`6o=ߊ)}<3}z9c]^O.ЅD4,[L's?!hY?))/X ߑvOQ`EGH_/,?!־/xV?=C>FH^!)j AOҿLUGF }g/Fzh:m~J')ӚE?Ǽ 6?2C@zf_ZO=0?E|K?؏M5 0ȿHU,{Y\$Ib(Wc ؎~Jx ݹ@b@D'O54Àz~w)H+ڳȼ;ޢ?g$;Qق82^ݸsq(#"{A`Z(pF2O_woVhc;10)L ?03T ]pWמi oC$9Hݞ>yF/C}q ~9d0H߉IC7|)OkQqOBFޏ!Z0M: *][3H "^\HG?ZΧ?Cc V_߄7q5hRfA}AAWxro#}_{~~/Ͻ Ѐ!u<{" P{.-S^s#EF MU&d܆C*K ֎F,6"wߙ .;#|\yYA9@-V> Fju/RT~CSEъڟ 8_Koo]X<׳4RU}# Gq߸' @<|1[iۻg<}O^+'Rm4t SR?*/'kp? /U?[~U^VY ān'{ك<0yWi|[CS1y.:s>Ou ttD:a` a L)VNrqFBxAxSn<|/ۈHoC < o5h}w;k w_ Rh@gۯ~ퟴa8HT#Ǐ`wqn:qO1Lms֑#|'zhU+P7\!?G;gz+=w{>!pY-~ahkRCC zK]CKM?iK1+e8r"o+3C@ҿ[ q&/>wZ2{?+=14ϸ/@j_O>az( PLzE"y"G_`0 hջߏ? 0^~5g?4x_Td(}z?*Kc^=W_d&M8]lvqMqQA7__ig^ KlÛ3T7T({(awyl/3Ͽ cQ}Ƌ .o7BDGF{~z( Mke^P'FXg_;?d/k}jx0G1C~ y_:d) >Vڷ1,0A@! ~qo \P ?fi# !|ae>}^R'ǀ dyH"?jW~όH8soܽUs1 ? jTZ jb餀;l T@4J(V?~AZh߂=':R0h}}~]}"< 1B>D=jQ?u^ b`AG&HykA_f]"q#'EDlfʗH=#o?c<b?ʟ>o_g?M y?"@6.>{hϫ@ /pCI=)- S 3ߡxF?+h NG`mW׳/o=-y~^M@,Qս=rg @y* t<KYG "TCF+3˅6v1<ig!zȹrxPy>; iֲ=}FqŻ&y"m^;؏@@=n"VNu:OtO|C*kT=K6|p{?zw^ƃD%DD^}= סg>?ҏ9ֿG'S2WQn3R#O^?@󧷟>%Ł*Xg0Aop{NtاK_+x_"Ew{fog#@YHA_{c { _+J~~ˠ#K#~&|?y-}Y 1 " __M]Eop},~|q{8{FG`~+:U04d1{3ɨŒ oIL'Q# ߭|@ӋF)/ ]hb4L{؟Sx3_fWKkv{`ITG #@/#g_o_Gb_%cw@’x [ȧ;3.>BM@_t4( GCuT?( "|"g`hNX*|3k£wQ+2Z7ܿ @捎PWU'H<|zFBmoUJO9r/_*!~Lx6ܤ? Cʁw}yN󯔀V5ĭk!pq6)o?hn YUϤ.k' B=F~}C/3pT>#=L`4av~ @@ 8gG_B ?E۟"D? %d0gû7#Hl?Оwi0iǻ=o=Ѿh rHA^lC g ۞W8贄[oT^U!ƙ>?o`.ƣkѠ^=_yQC!=*<ɓiWΛ=)rg1s>߈Du!hwɴA Y@ňUW=w.!cMC71Y\?HFLC{ 3yz#gh]c߸{LcЏ0W?(`?"Wem C_B 3n@&z/ȣ׽V>Cw{S@t~C{Sde `q뛾w`xwh޿/rSc s{(>B呏U st`  t7<ܺz=3g#_ҿo  ȽRAyO{; U~?8a,ɓw> =bO<3ѶY.$A *}p}ſ67b4w#S cb'V9BU5聓)aNe{Kև=Hf}B{/o9I<=c{;QKFdq{&rϭ>3пL^zro d?w_$yM_ζ#&}A޿Zm~EwCπ 2 忹]*Tſηys{Dë'>~xkƙ ޱ[c}x@>v>loz;Ƃ=zaп Iz| r?8 xOb_AЃRG$/^p"s1^FT_շ_D_HIY](j/@(oR`W gs 7ToV/}b?(=du|jE}<7zpFBKbCؘ#3D7Nk?M uL't!뼃 *kt: >;cxt??|TD_({H}3Ƌ28Uk~wxTgx}wRb?o^?"x]WZW<~y摗/9~%O|pu^vW^\.o~o~Z{z3:W~x_[(w~]=hq9*/_&6l$5s!AQž7׏?6@mO~K_J??i/=1O9AޛVԵRuy@כ=g-[ ca*{&s=y)W]^m =Dx<g5x|{:o1CK0) I~y 3ip U` Kw]멾z+B溌K[yNc]+/-՚^> V] *ҞoMUW@G(RzqZhP.A_;D@}? R;_ȹ4n_=g0>8oSAwϼWK_9||FUH X\n n~A-~JWaA&A?~p 7!!z@\>GWa n3y d6 RjB'pP?0Qh..jJp d\ Ts y=sZj~|+}KCujooc!;"į[wei/ &>c' &Zy6X8VU!`'0dY_}M\"HyfLpˣ&yr J10Wu80+8]jOSNq /?4J?:4 OG'Jec9O?2t?F|V"~CEVߡ2?;+f7}nwo+|E׮]B7ƫ ?:[= |Zu< "BA^d{?εCzuď]DT5UqkzW/}(dpO{s` $@osG>gfE1: @/A:sվ JTso;ռy|_#'ѳl-Umd* ω$WC络 N)>r. n|倁̇WX[e Qrm @gD37T0P# f GjpLD3\7H "]_Vq^-220 __m~H c#CvAB @ǵ~BczÄ-#WX`$pay&(l8 ?w߮~b3jsEӏ\?"j !5$ߨ"y?_3M5v GV7 "̻z; 췗^$[ͽP{{Ն8wqin"@(8=^!G $"7f= &ŷ!~3f@M=g0`n0t+?i?{a$] 1R>p:G;اs-;:FU{Q!/C@ տ Wa{B?mn? oAM C7)7fT`^_]:SQmAĩZe$(ʟxuF+)iZ { P$ Rڿt/#~ RoD?&zmeΫ(|0Ss y:E&Aݽhˁ5M]w73TS=ͪ;pwAU{).,Ai0-.+ 5i9OF_;"m~^SPG}#?x wVџ_Z?2d|كk~j 4GۚgVUc2 .ʹӃvO~`uZF6NU5K U@xz"VH#A9zu& ~>i0Dx06q|6Khyg4#}/So?+?}uYp}!E]ɟ|yƅmkŀ٤~=sB@? ρ|cOhAWTp\sfk;¹ і>b\C睹c1t_Qw(̢YuEяSUA&]6>Azx+o ??zK.GAڣ/u~OR91O_d?<?a0}*sHP{W~tuVFd>Uψ/ "J\=gu;P4`J (&kC޷ŀDEW|t?M^ !{g_FzSЫL{/?K޿mk-Kd t򷁠ksԀg=2o?wu@\yew~盬!q ݺ=ɳTw l?N8e;@Gݝ nd"?́C1EM<2T=(@^̄X;[7$~ @ iy]o߹!PX@Eiﴷ]?#U>k\W{!j6콋wgu]H  m_h^zii)Y N)L̢tJ_q\8ĉ/%_d[,YlI(mγQv6LbXk{d>' {''ZDD- t旹OLg+?3OvN ؈;v@!2c|v/s?(!-7,pۆGorR%$Vڝ_j…+c ?k"q~[ߴ|s+E!#3axԿ|@- B#o[gɝU8d-trI>G:_zy +>Y>7W=,|gE65@ɼf~'.uN2>sB-y2}r\;lC"@{9Ј/]izc[Oi'w*!{#KLڿt"ܵF_>dաR[ǐ?ɉZׄ|҂gk/ O{S-;|2_{Jڕec-Q P"AK7r+88Z 'ul~㷉o l_׎_-s13 @aTW34h=?c`7 KIos_=Pgpag q)K3>QgG:V)iw}POǐO"2!߿N@K "ojs= 0ɸH!!| 0OcpĀ1ٯ#$csx)R"VQk֮z%AڀHY }t25諒-0"LhA=;"j$ZbK?}/7]XH`~`P?5n/_k|g72(2u f ?\X'H5>ഩgCy::D"*5{a!H~(g>gp3rN†(}!mTAf(Lȳae!nA!+{iώ&$nZvqX.}=kL5t rK`A?b>' fk 6?H_E h6V/vmR ~sVdk  6UYr^w3ֹa67=:9iX?DO׿Bev (x:N[ݽHfkgW^Zfv^.@&3!۪~jqI{YqT{AӛIWD! Yלv;_[ٴZsႿ%hm])3"gȒAt Df- )~T*|C]gt/&BlcTу5Y+ 75=u˔hj}JQ^6\;Eoi~:~ ƻ1_U'忁* ?xs{ӂ*P^J]9<.x>dG},h*Su@F`Ќz?saNDL?*~Ϳ?{ 8b _x6SKxwCgETx?~h O켷?X;m|!A>|VEs:Nݮ=<HÜtO?uwj" +à_\~ᥐ-f0cuxj_/u}AS 0VG?#Xiz'~/^w[BXi[jPCϊ:1.x~G?xloο']jik#w)H]# s)]N.x)8(x~Ꮝ\Yۻ;Kծ薾%ӻ6_% 0<7}1uf;}H KӴ>lx >/SP0m%eu^)qVKv<Ӡ O\v@~BS;fpx3@L;op i53o=~ ? | hV ^`k_m- "{ 3ǿj0lD6J>kMc7 8/rm xFHP"A]Ӻgh.sw\9Sg]Sf$ƿ;ݦusZ |#n/lSH3%n Ż Qx j\/=߾3cANd (>ҳ/5 /RVAH28ǯ;><=@|,No~@~٠?ۉUO/nD O /Þ?eQMNk_}..9;]`MGOAfG>= ^Ѿ-߈{c[ߦW'N 0?Z? .>ZAb $ *e0VvڋU.QXoKk/ w O,{4`-VG󐵎`u|Mߺ.S2Mlp?{wL'Bj|#ei{\~HG}z~Vv!8 @>K嫇Jdn*[;[b(/Gw;g/! Bj0ww nk>srn"=G[F5cEl[5+ߠV 9`W_?vp,h$ oA@MT PQ`=MXXL:'69|C@& ,z_՝vB/=# ? zYo{-ɸ7m[ A&zWZG4 H67`xsn ]Bmx䏟M1R})}d=wo&AֽUjλZ_7ǻaکY;F;JS=?N'ǿc~}vL1I1'Zii~MoC `pw`kJ_Eg@/$ pQgsj \FWD 2Wv~d,й|F L +>3Hwk %e5Mje0N鲗$N+&>TYseD%gC HaIguq/Y8 H{;r-Zz| 5'm|{b@DAtzN;}+mO`v4q~=x[[Fz?G@ }Ngx˟ /z0yr{gUO_j;C_$ `8X89 *O}yڥ#@+#13bsOMɩݮa7>ݿЭ'K n9`ᡛX=,'3@i3 ϕ)U~N Q_}u0=0ϭ>Um3~/G[gwR~1rpD8! 7q)§|L|< ]U6i'"?V~]D8O@k~G@`~ (S?YR;O\Q_)PM7D?~gfjS.w@،N?|p J"⧴Kf _պ-~dZ uϴsgUF`5Mȇ!wП:40Ox1 ǜvmZ /u-f@#}It~$о]'çDֵfgSHǾ$kDi%Ls} UO>fnuvv xa2PaDޱ%n(\E{nXg>V%@ߡk`K+ l&3DuwuVy0V>836HW Nn?i7׿9+bve * p}p[4M@e.#`8u8կ23^<_<= %>$A~]>.x[BY߷!5~3gMPk + do)ߥ8Ces@u0>'lޅlxߑ~n ?06gwLϧm|-~?Oq^H3^hoߴ{7gC*Az;}~O5TŸ>sA*f;mUהVG3_ L,0st##u[ #@|F9)/>q~G?_5o]FsOX! oA h@eK#$yYW?gp t֠ = ND՝pcã3Sje?{<_uHgPG `so| |濉ygs~kza]'!~2IF]'g ągпǚXhu8蝯 At#w[e'QCZ7[=ݯ vf6`VQ7俧~>? 27ڻOO %m6Ui+:ٯ/¶ֿά!9g8 R_/@6V#po¾i;mmkWU 4J.;o4=80M0De_Ѯ}h6´=M_Y__"@ M_q[r?qșg!ZR|7/S/G?A.g`@j.L@EpkOuwπ *ROwGsq-;X u ėm މ:z S;uoyF< MPZӪ׾ Y[07̱~Z;2p[@\Vjv3ۏ A?. :A3dzv<߈?-IG)` vIW_X @\Z=Qqj(+,aj-Ô#|ۍ HZ* \iVejeȏЎ}{f6xW=?|$p5:&[7={Y AKgp?6Mݿ9LR7MIn2f:;s3΂SZGm3vvϘK^(=s՚,Gyd2u9t&~6̑ZGg{_kN=y-EͻK__k ѾN U*?'oȟ s֙cEds8JSIpj xrGY {*8H X+` /q x0ݿV'C sȟ{@6ĭk܏1ȥe${9,~@J7; `43@WɹvZ EPCjHX umo)܇S+ r7`!  -p;aGE k k {" {BX&O!>D"{*q0eԱ>6#!xʍ}X߉wxV_1|!NZoyߍnO7=2^F/fs쭀[_6M\f* itkt~]n`t?-19(4n?`k>E󿿄3iWۑPJ7kemn>2R[S# ]ծ'Q`#xaڿj!{:jڳ\zG>p(uZ:O IP/4৞线[ϨmPP N lQ'J;p-F " 1א5x۹ מs TÆ $PSW7.{}n3 '0 B3l{|J~:P+POi&RkLQvvn$tvIWꟺ%{ʡoi"MfRm?{'8mf|wZpfQ`^e/VPoDmO @XbA=sύun=-{Yw#$"Xw@'x@@ufc~͏ٟv)X|gp2\P'dzm>|OL(8:?tS o: +ψ0\̖)ݽXgDi@ Bx"A;+A yxEgtqd? gAEiC oG,`)?<~u~"0vms_1c_=xv145ډ޸q&`81Lw7 hYƥ ~ .i> 4hóR\궿F"ܙﲝJF>?2#`3ڝso DR\>tr"Vn Vw:Xs?Cw=,|I_{)džrXG7@_/6%a ؉:E_>0SuH?&3e#l܈]?O80QP?-y y!n. nw  @ >2,%\4q.=X_uv_ =t @F%"Z=oc>$̋A[hYFlss߱y4Э_]|yMYQ:E@8.BtuO42]:#vs97zI}fv &J=у"P b@aU3)oF}xδ @Z?ɏlFoB汓wk(` (XwGn^g?S6sK_=o`KN~[wd܀&.pbF9E ,@xb_&)h:te^9h{%HrV%v YpePO ۙ1~j&|77P. Gk:v9cw(P@u}u翈_ 5s@CG U&Yk^׻som:тSK?jCi9v<]-oz h5L^u?I<| >0 2ߛm$x"+NkK 8[rB7$wH;} ߡ {|Y;ɧݯvXWxC' 1I acS8f͑˟Am _?[ϊo'uwqjc[9L t^l:q@d=m\-th++(=cglNCRo_1sV:1J>0׿"yaHuNnLȠ?!PD5^jfM?vnB?>MW?7\8(~x; E l#qgj]P! +_kl;kz"TG:? xc:g#R+z=xs ~^ +wF?{`jϞ'; ,k?}@〽'x>cѮԿ5w44<n3w>,|o#!A{#[->ReViA'4,_A0!8OǫAsza2~Zkv PkR_C5Gbc}O\@!yo)tbs2s'Y1ot }&2ߑ4}0KD=5+!\P+r,$7I>^dΥcwS>l|y&YJ{FV^PIOs ^_%0yќ/\?`ﶿSԗ@?;# 9]Z3mBH?Gjiz ݿR?Ռ?pjĻM?=L2x~J56;FýF~A \{n2>W<rU?I}9f;w?k^(׿-̩wZa19X8o D_z.S98 A)ޣ~[1p =|,Ilw)tK v?^{j`=Hyt$ز s)Y5g- GQku Ǽp:g~O_& ͅ U/,'(l1>13\o-80Colmk7ׯo`]ñ (Ss@:8v0zFѽ& {q[@_ށhޮ^ϸ@$4u,zQ(W\ nxs*zB@9`m9лx%߲$сk_َncůg `SAг=ؽd@+0_ht?@#`\v gic'ږ!"svV~vCFYPg&`[x_Z-Ǐm^mh/k⿙DKxS2 uwrd/G[0Մӻۮ*_aq AxoCmYpL\{=u Au~,_ Җ n?9*XwGF+^L[s`w*U`7KTdA!H&Y& OwV;{V7V"Ts ^ ZOX R5vA@ʿtXM_ck; ѱ3ޗ8hkϨOS? ){[Y~o:;9Moo;*)B@3z>|Tܻb .}gWJ>ȏsۋ;cyNJfzg8<ڵuZs F9ӏNN\S@9c;|a&]3n@@}]L6x'g E9*rYȰ h3Lַ-t {XA VC䏹7}(QV\#Kν{L[a+b:UDIoX`~w5Eh( }~t {_O2&;_S_#}o4i_0ȝăMvǶ6O=A'^h:6k@-m6@y ғ "_v]pet^gUc1vu/Lv> S7` y.c_v*jA '"3v,7#oY\|' dAR{^_;x):zLlc 9#ԹM{!z㇝9F"k)ώā%vӿGdL@ ox vN&2dLh crt||s{߶Ĺ _RFFM|/myϰx{dN0Tni t,@X""v4^~cà Ϯ@fk$뽚ߏk& t7&@uC~0Ҹ:;OFw:w?vܳ ȿj w,h.X ZOm9/gԾi! 2k((9u>|zπU=D~3I ?J!3v29^g4{`!̪ ~7:&D9z7|B7k?@0Gk@ߏ;~o.op[O6F]w"go@?>"% iWVMo%l{XVVV6qphMrlÁ=,mN,vȂvwk ݵ@k 8-V.hkk@p8Xd3S f?uns,?Z_Kkaۚ"ߎN~o3<(lU'׬_ +V2-{B@KB . ug2p l/Uȿ PϿO\Dn9QoZ/TzúH4'  :kx`.#Hg1qH{z׆}#guN xw,L+cg1`:;rP,t>D܈7 ,ʗK} /rjW['d_@`/V_ gg aIO{o_Du]co}Bݳ _h#w7/4Ze߲jô Ц[kdNqmR н?=i~C.nOܡ@Fـ}ړe,1(T~!hYǏ!߃<3 @2 ~u;ψsgu<^>&*V߇ u{Qrv` )PR羜Df0v .!6G='RF8Kr]w5/.VV`CA@KPGE翻m:Êv z?,+Z6V;6< ]Ј߂p?j |b&Hsk?h}?*/Ս[ '%{o\ k2@ Nh:`Ml+@xN&,$N7Gˏ  r/S; _ ;ϭ 쀹H1w$LxA"Omz~Gws OS!!~h@}_=-nwPnT,3OdOWEZ5kU"R@$ƀ?bLWV,/AJUA>@DF) &W5<HJzT9 dzo?-Ҙbņop P?aқO IW㺚ޗ/ĔݓL_ U9>3:V/ !2X=?+}3cX:?#5IgC~%O4KwfPS`ՙ~vdOmϿZk w-?w?[#` pvKDep6Z6+?;IRV@RُM(iL*'e{=qϖLio0AcI'ky33?1W4 A T S5z;޼F[^-4ldwhZCe0"q~q_}g&?"oo+Sϣ}qf *vy~?_oZoyd~x}s5k:A:}쿕fM_{*(U3\-τׂ 01;Xn-}v9ذr>~)|geot?mk<?[3[?l1y=ѫg= aT ^1t_u AsOnc!ن?gU D:ݝIM4.-- D `*>XzݫFD F@ ;T 9&z.o |]HM$s^Λ ~+}6Wx-9Hb 0pfd] :bHY߼gc}0u"Z߾?ccZMc"D\.O$k}}t˺];Pi*>2vK}`ܞxb46 _ "@mأu<bc,>OS;RI`͂lO=Zd3p ,&?iяL~ZA=孽GHNi߿F5E~ w?")[9R !{ގGi^(d'|6= c p+*54翗u܊! A!GVh0Q\xFA#,O%ϧ_~m$ȥz0e~"f8[f 4mJ1 AB7`nC{IJ"d]ֽ` ω

u,3*4;#Q_ȪP{`0sg#vb(( 1 f@M >}LH {*'ѷ>FO&x_k@O*|'\Idu0w|PE@ǗPƜjNwUV爚~u~Zcw40p~:s\r{sTmsmϋtD_ܻ(v|]Pa6ĵOI(O^Tq1y|/" i-.{4{zݞ4#g$ n)82{U PL<3u˷ 2].4-/:|=L Wuσ@ڀxt'9x g8} g`zF~xOZaϞP?-z?t?~￟{{;̽ 8ZAtoc3ibAԷ&Om`3J*D~|o2c!l@veuKa`"E" uḑ(&?`(,"AbBQYu8\{HHXn-"JU`S ?N}M,~OGK菥h=sLٱLy0=GDh3&[{q p#I r G\^T1?-JF퟈-^/׮fMϿ]d ~`0Z)2VF5n̖U6Ozrk;Npt,yˆ70,+)lZoFY|%+a=*ZU)2 $tǑ?{㎱Gߟ?-Q}z[xvޞe* Z3 a`XGoi럛$oѯG Y gF/?k$ z$eßDp }G?@-Y DY`Ee7)5Zw]#qގe ח5[:E4{b@8 ˡ͛Qx%:OxShO[Sk_|{[==I ԓNo:l{}:,%@^'gg/ZuB vbyin@)w{}om׽'4(Xo#DvW[p}@#ۨPh2~==wL>PuF+` ?ٿZ$_ |% ?3|&9=L~ ~ ޏ}*F v`HH_b T0G"!.Wr5pTL`E*ȺzmA=Uf\%nDi{Uuu=! 1gwop eJ` wy>iя I׃_"M@T}5QSoi 4\|7&(!?97?P~j_y~C/3zg?3@}Fˬ1z$ ^ii?J@Q?^ |9)S_4V_I_A^oF#=/"'0>h_-8)# @ `'IQ@-N~}eOo ?h.  W/w0mH(߀PO{užAy_|? }j-^ _g&yUkxc -8%z]%z#xݷz",zF T'+9!97} >y ^} |qI\QX_u" ^qYɭl@'ϞLtk2zϔ* 7;]Q 8\vr $F B#K G>9jtO}VP`dCbAU$Y1kDOkO{"gkp P@N .(OR(#In~g KצI3^Þ/]_V|<nBfitC:&_!PKp>;дPeK?oL0E8s^>G5f{*O Y\ >c^h !O'_mDD[ďҌ}*&v|Up^eϟ0+_Ls f=Wv`!fIZ)^G  ~tedPIrUUE]V[1` Q`" jU66EIjk@H#~1H'癳3D%D-#=ϖ4kf$s*@T: 8u EVy3C-e[9ss5,ѲE`ݳo=@Qs@'H_Y>Dٻ *ywL%/,m6_N ps"W'aߧ8Գg}0u:_%FD&y 7Y>3Ѧ{~Z6f%m*~ɾ@O #G@¶~X?O޲2>~] >J" ]o2/ H1 ؞&E>2gm 0_F|쏙??-R;{<FpFv`o?3@1' j]\ "`x郡pLX3Mex`D~poSiW2:Nb3Gdch o[~*/(@Cu9Ss2 |WHK 1bFR?~D!B&_XU_5)0Bu8wo3bۧ:{Q *{n;\wEv 9O$& ^mNGX =Oko "2gd\3 õ1OK;ٿWοerGis '\u$ڵ_Y<rF?wwڞ^=ݗfCni?Oam< ?` *n_@] ~ N hCJ@IB.@[˪Wo)Uk+*/m~)[t  ]!^(663'V$Waß5K3Pm]z?$SP 0(SBE>i)sz ?> )qD׳`y=zYtгNʕ:oz U e|H--ֆVO،{WFLTl]/Ol9LE} lV 3{5 W? =KDHnQHB2ѵg 䯱dVOSg6!ԆC3 <Rw6݅q9L?\#_1_o@;PiSQX?P? j40O(`s YO.kE^q'27a1P>)PVz>◐?Y``޻3W٢"Ub4>yD/, L}PFPߪ$X}٩mę"]y@eW,p^~?^+߯32ʆD=Y`&vh¡IUg?i_¿򝥻NJ{~?,o) z'BX#8[ vWFnc=ߟE)8'?U/ *0}to-_}X 8 ? tG#MD5A>(-s/]8oT2:uE8|̙pו/rw7?лw \ n0bb| <4}/H3y_{xzF#2z^7 6yΓ?{XV-T^tI4!17 g%X ok[j~a@Fz6}7JgԵ 8׌r}W3.3(N^Y>۟ٳOM+`%p/(?_Ͼ?ٞ2A%qRAC@ x8%sѷB>s^$luxrPP ȶ B?h8%K@y`g|O'@^U$/*BF@$^ICTv*;id f_#_ NS+z]Y *0o oEմ?Z Vb <vl0s3•z_זo~jߔs 3A@zV\U?_z0ҵ{곧{xIU{ 2wV ~w$$HxBSFY"j9m/eZM2vRɟ=|9YjΔ菥Ewo-U_ZU?LڸLCYhLocTG|}^CbW6v~ ^- _ȟu=G- 1ٷe~g?@?*|?^S x?lDpL;8 i}m @1`*o(;ӧO_ÿ!;方|亲lN {?*OQR/ECrL)+S_("U4!`d#ӟ;xFysC=('}_.0{Du@$Wɼ]+^ rEKekD/Z_b. "Fkk0$f{#fwe-&Ҩ]eͣ${>}@"}H+U AH(e[ߚfP8㢝eIס_zUPC ʴ=#P.342S*i:?QOzɃC!.Ko l׉K>^XL]/l+O)Z+-IA.*'gC/0\?8f}ݹZ1HT=fCvj $*G`u!z8Q?lC8o像>2ǟ-΃-AHͩ28yu!K綾@n To-I/B+4b6տ|+ X1@%Hg;>I8aרSbi R5 `ڝedVn(ͥ'5l^D̗0.7  fݜo8*5$MHJ  =D+Y~uW`F@wW -ֶ?[ۇ?]Ve^qHyec7FTof`@N0r2@s"t䟳/s4kdAYz  zN"䆇3-I$ڿOgKtAz>%9Zߴn|g>nC|**ǟ|R& 9ZSw*@*kdcz-27KTmɻ(0Fm&<߮~yg.$zjmN3gE-0jk/CeUdk;ZZ[ƲE汘et4]dG5YH x7MO`@ݹ0d>$'JBDͻT'ߏZٿVNhLo-[]G' eS8F}@?Es! fAh-`Q sioVo;/Pw7Z.t/!s1ש=p'E@8A<\ '}3*Xo 0zUPVkשk TY6/ʬTN2{}Gߪ,;zˢ#$*Ť eK%4 Hoqz?=E'3mX' \(S_9}u_/rpsBD5ȞJ|cd6S:Kª$/2Hۏ ynuD=2y}-߳~ 1GD(T2+}{]+s&m؋C=eJ`#* 4S$XhI֎9gy%_dN++efKspͱT /W >6 @  _EU:6l<*,l ;!DUy/ֽzAtzL/]ϹdA3/b?zðݵ Qf Ŧ}̮,`iR_%{ ZՂ@^Kd @zsȳf#>]0Cg hn=Uake⶞|:ED$Ӷ_q^,xȉ^AL#P1p Dn軞؊ T74s'| +>_ϭ9R}6%p.|//`@Rhk柫~?~:+ ;vnOy}KH=( X+r&!}0J:y'G~z\ 4saHW/ ~]v^G ?m 38 p?X8*l!pp ݅Re=5 A Xo,{WSN]UsyB _Rk^4aeC-{D?&n  wJi=>}!N t'r6Ipx[`ށs<  Ͽ|{ۄss3"HH0{ۮ=p߀L5b=菈@|i]iҍ ?&!.o8vA*CXzyD%Łsecm~'|Oilo[<\?\tQb ~8?U}{F @0`* `p8VĀ#4BCoU{Pn*vֳC?%]me3Ooӛ4ΙS⿃cʯdLb\/U9g2/siU Ÿ~bM3Z^8 Ux׶A<D̋N^]+?mPȯȷ,3|Ɏ{u?D|JBx_Z;2$uMu3%:osC|b囄|*9߬.P/$}LMS^ى.o=Z p0mAhP,{]eY3F떿ҳigkSۮ_<)G%:wx 58`XkU *IQ8k/'9xlM, Z^Wڞg02[f<{o+,̕ pQZ9?ltn6fJ? ϓP% &?;i=,@?"ls,tSo 2࿴~wM|ItWgѮ yegAE"Tk}GP #%/d"j:Uczi=Y'ij3 wzS@PE|(=ӿ)>O?ӸPځw73w}sgi-@/ D+c0U0BN|$~d eƒǂ3}4,?P+'d8|j`D>+A&s'NmE+@IMg݁=0~=2׈28з̘pgA4a\^kC-^!O" h(#>a|I90g~*۷5Ho> VpgW,I'"k ޿ v|wOW- 2+]Tz/ 6_o{sP &ԁm_E? WD g DXUpCX3qf? ́~*@ݨ#/*3GPcA@xʶq#~'os#ⵗpO<.eyh"cyc\Uj2P9A60H2Ў^-P[{J+zO$o/]N[ $W@gdQIu`@K h W!̚D@oNMK\zr ey-=[ rFǼa e9T&[eA,?˼AnтR,?L:}'a<(pu-h'S^|M` ݧ"_aRܼ-WՁL}N2|WuA,UCki/9e#qʆw 0g2L.`(0B+z>SmM= Lw,2c*%IT'Ѫ≠-U9{k`LXި D&4f<J'~:k%ҿV8;Qx^]?BϪ@d8f@; 4q@@8OV1#v"7*n|\W|x/2IA}OS/տ}AIৱ@&x8VO @,2 }U(<#j 1&pGpKVŦ1J} @p e5E/NS7ڮnη'nE_P՘PS] ֺ߁E@{q0={Y26-8@3 *'^"pc{ 3 3h}Nɜׂ3$Ig:yZ^rRw8ALn!z1+}kn=_Pl&ثn˯knk~ٚǿ|\Ws oR01AɟwhX>5}\rw-/hP L >\e_)^#@Qg`o'HX=4N݊>eAx4kH$}Q 6//s ^A4+) {`#m 8 hzT@\a A%RA>u +G%ceuRY%?$߄E?qr vJ d 'V%@kؕ<۟߷^}NcYF/e?]k`/wOj mI_OP~|S}M}wYx*f@ {@C [G ;^y3_,ςygS`VD .NsO:?:B_Ǻp2yK3l,D(hemz"n4O "z}փ([_hk)ɿ'TPk@>O3  '?E8'.lcQ8QH2 dg] ;ˮwYvT4h)5-H)孧n-׾YN8C'N2[km;/9_> MDHTuZBiV'vG | gVuH{H}$X"x" >>~5{Yp$~Zrz tegnn~/,3 $, ~``6{d˟tmU_X6nD`e'4<ϓH> O<?\߷@fq . :{;> PqR-diDK~nsٹUѿY=B=ϋ [I3 \ލmD0@@΀[s'[D5 *h.fc :vH6[bA"x '@_{Q_k?o)LQF?e3gߟV$ ?!ĮcE2!*+I, vU2p`U@}?]~ORflT"8 <80|:'l.{`{'.s2_7ӵֺx/{ʼfx}2컞~` xfQO ?eeH!xb˻c]0 *A GZLeA`"y# ~&߯ @84<|_#bW^@"@A~yOmG_@ UA`K(A V?`,(p +;NN T6-pmp#7 ')FKQ xSLf߻ׯϿky7+-; Z[[&?ːame4s/;ß>8 M "m,=Tҿ\ڃA@g_s"8QIVYAkmbdl]wqDHB>`R |&U畹y։+gD5󿢐O#!8`eſW;T }=O5%tG厺EozUi𖂷)l?N/ 0 ZIB{? *Ͽ3qOwfWyc;s@hfD@Ro-?Nk)_??- %J@C0d{ z"k yP?,1GK`@A-U*xA0@e( oUvͺlO7/ۑ MdK+MK`*P ~g0@ߞZLۍ*\;;J4aЃ7-Vv?K⿣Yӷ.lT$Pwm1M4V⿘_^{^~R@uя>oA7K_HJP&0LW+_ay{ {Ur֨-?oqUc`$dwl+'rU{_^xjGmG޷^myDBTl">O"1XRυ?Uk{LUY3 !_?xû?E ?I_X-|{︩/TKB> @DiB $zj0HAT*k0&@68 p,ZL &j0 B=/̽)xĖ\yPOqN} 2[O[V؍qʪ˔'fo~ e J) cFnCPQ7BY ;`v'JwmfH@lL?/&4"@"}MeBfB>V%Т޷7Or i^=}UM8-cr9F4ğ+  Hj ar4 /&?/1b'(,X _ e?f[d?)bYЇ56E0;R V@h6䍁"9Z{ WxjW\Y ܽoI9M Ayo&Z{g#`R@L DU h6-."TP hQXhX tЁJ7RF4C9`E |@08 Ё}e7ˬUvDcS_,bQ_J;_lo 2݅̿sJh?˞h 1vuL ǿV=1_ Xϟ?|);`x >e𕌟W[VM GPR/[us_> <׆>rD룀^c隣@ ^Ő[+ȱ `=O}>Ou R.򹬀0ݗxw zX}:Z`뀣j'@cM6.`O| tb&MBxw2ʅ |'*/,T!jDm$TWjdjͤ>רH?M~wp92޿FB D+XJ`ߴGTP0Sh@p C H@0d Z]È 5%g6[d Xb\QA.yOLILAI:?r?έ /[峾]NxU^EϿ=~dQ'ϛ86{/Fɟ>@Yy+:?zYJvP{ `x5!{֝TwWK@+f] ![Wς@)yza<}[|Z¿0t("ŸoCGs[ /U&mW&*ӻb4_y|Eo"uy>K<H쓭/_f7{]Cx>͖X`ߢJ@ 8 OD0{A|@|`0{%7@*5`cl lXCh22zN@j=e'.Dy{Z  [er獭uP(`Jz 6U@;# x˼,ˆ%?)7σ0oEط *#En+\|iI -|7OU&/T[MK P"}=?F4[P툍~ z{cOIGj߱c7OpU{NRR`DT|qO>wg׽?z/m| ?c9HٿuD0xO߃3C%>ҽM[@ w}GmюnOVF_ \0#^eb $Anm?$~Od yflP޿?@= 6U# {X` `4{fws,~L?j V  dEx?oF;FN@ ,ߟ{pa3dеD*Q Q $sA 8 Yhd U4R:D#+AH,/YDVv OgKV6A F 2z; 6Ah&; 4`N~``@3'>w@){;(3㟆ߟ*oWx=X࿃HT3nB7޷YsWُ@w!7ŃG3E*Q$S?8m׿>7}mˤ.߀or# uj_1LPp5îgW={]G,+@u~hMDDAf>dK_/~8?gRaYܘb?M;?[ce?'c^>m2*;`, `[eyfiYD~1*9+q}\֗uFA?,?CNf @"}y$?<1 3볰= $x3.|ܖ0z?zfB%dL8 oDUAT A[݄.dQĹ nbN \;adQ`fB L!ǿ < $p*830 =We}fa/D%p~*k^AcY?{cֿ}f~?@1Oc r?)ê/v P@س_=0Jo[A}f %'=eB5^s&o.wNG-orQ TOscsy^k@L|=?&{FN4xt!<[)ȋLMoo2 ླྀ o?2j3@u-0U6bGޏL"A v\hޤ'bu&{.3^]eb _gR7Z;z uoRW=cfb<e4eW_S{m߉S;\hVZdzyy/-?H ӟ{|ɯ[y'>M m} <o 0 @+H S韄?d>w"9eD({D= f! Pfݡd^=Br ̛"?8\H?Z:ΰ߿56c 4u p&0ZhJā<G++ hL`5#Ja nB :@VP@PGЂav /9@SG(l{鯀o9Kxc}rێR?'v2۟1Ggc;@ @?f$CK4+-.ɒVϟղlOҿR~DϦZ DG*ӠHXX+y ߟ6x8XN1ׂJ>"b=,Ԫ| % z^O7, 4q_?" f[`V ~zN}&e߉@(7A_~ZΡ̘cD3zZ-QxU 1όVJcqM|-h fgPM}݃݃ flwV@@wNo]}H bB@?4&7NT p/\ 5*gE7R*q>7>` ́`@\#քu! Dk6cn'6&@`+x6ATa"<:x+@rkx2ǀ[e}%;IEX@Pw~@Կ>4aY?KaD{cȲ{{A Jk+%5@_e?Ux摻L90Y 6$Y&f5(7WB?;A!>gu}?1nZB&M'U$|2`RWa .'7}=n= ā@c@LD@p){Zv_+~?;c2ToRQ($ 6ɖ;I@X}?'( d@D5 {ti3DsP:v# 2M!$ #[$ā'@ܡ#,nF?h{ᜄ!' )3 i߳Ps_'6Bts5;xdyeݞ @t$rr:# kϣx tS?~?w ߌ"9ʌ??wmb_-{>M|,sY4 b寬 ?HOx> :Ba"JT%l8ZI-1,H^n#@!hEE@o#dU uWS@+pp 77{ף]qFpͿQW{f|Ot4~Z/H/Ѕ+J& 5N5Ǭ/gx/ دeGM?Cqk~[beWj#}Iѯ5i#gి n}&S8h{%dqS \~uOBէ-=޿3ȏz_#r` { Mw*9U WDh|M6A5C!2o]{wPߓ7/@8ƓeT;XGT#~Z)8W77D`Z(f3bd'$yO??'OyL8u[?;Œ?get.}?@5~E w$ ?xu л,鳴 pqV6 H`?* lJ)<A0t(%p Ũ52-Z  0fe%wv[VS$#G* ,;Ȟ+zwgӽA< I GOQJ\s8J1{Q)e (ǿaR_B'jdWDX >sײ޵߫Ј!Qtl D'~9@Z{pfRy2d{k,OGY=ڣG/B٭s㿾G}[Ğ :l\O:~$k 3 o-0}8¹f`0NO_(!*h{?z}_/dN=9,hԌrO>&(g?4}POf?}бE8-:ݕ_=uUHr'*i@=YVFqK3 g;|O(Sc 8Cdk0 0˧%~~D@p2,|[ǏpPenp 0 zT?64  b^OS XZv}Og^]j@彺 vg>UWR EF.VZvj+d]&$R?0&2잍y/K]%AM~ }}8_K˂B~o /_[1~f(w + +od/x[ia]0[{iˋ iS=ڗ, =cL׫ dLA eHAiezAv ~CjJ 8`xlam;j @Epb@@5' ,"=DCc=Cͤ@@E Dtq̾ h+@{Į8gI|E>^Dyhӫ0?Čdw0>A3^oٿWb?``~ \GP{BL>L((ҿ}SX |m}ӤA :́l%~Y'E ",sՙPl1Me56@Z~k[_%y \c0_u:<\A)6Ԃh^L8cA7[%;g{ $ڑSgi;C @.d0-b?5 a:Ɗx1S]Ȏ Sp}y"@l Z8ED=^wD%@v,]緷g!( @4(*'F@bd?$QZ3 2`Y`Y8$R5I}* g;#E_S ߏRHE?(R@@d {XO䏠8꾦5.g-g3>=H;@d"m)E89'h+Nn#rEleugZQ뭈XR3U;--qOYπJǷzυ|v'4` {/~M3b8Փٳg̙3-ֺ`Nvh9ヨ f5!; c}+s m{NmL?,S ~yfh6 *h-A [Ci J@l $AxC7Nޝ*|}; xY:"M{ ^w1 ^$M@ Z>D1_ظ@@RGٟ)B/'ʟH&@_r t󵂃9ϔ[}ӟ"x7lsh ߟu?s< QN."ed#x_{=k8?ߕkb]VVJFF1O A+DzOU%ZN"ve'a{E׼V?XKXcX;r |V`q|{~?V$~ HGW6?:9*N;הF_&?1Ǒ]c-of?D ;K2 j &wIDEzV:e }_KՄ K sPRϐs?]qκ}γv WDτĚ 4 g$x4myZ1ez0U uoj!Nu !N(?_+*w`k U P) d0SPhLb#o5<g 6A1TK@lì$5S_-?@1[ONn$7?`z l**BpdM`M`tU 5g 5jXd\=.Ld-.f=(VS䠠k:no[˳~Z׹kjU_kCA > -G3؇)is"^ (RU,g {0R?\w,~ ;1[d ~y._iӼW  9 dqb#cT:$ -$3 $m V+=$cLd[!7m^ٮ]/*\Ub'>+WjW F"XĭH߿v\ CPЪ:s%~U㝇5PV.]Y;QrTU}:_{ksU(+byã sE_- k׬#@п 6jCREZGd^}281 b cIHHi/E[']xmw2?vzᘾc}[`3`>v 6'|g@{6rÀ]$o.My{PX6@#qI}waZ~:gԇ,[,KV7^V'S(B}ap ȷtc0Dª3=o必D%(`0ܿ_$7+g_|l?\|juV-Txx^ VWAk*T"e4x M^E͕ej"?b@&RVH޻=ߊ+IthB@k`F.@C5T@d0. ,"BGz@ ױ<.+hٞl-IQVZ`NB{ /—9~Ψ` HY!znsu_cﯼ?="5ix+_Mw@Y;1ﲁ?Y DU/{($CyyOBs'Id4d*lDS֣^ji%lѢrz~ya4boFTB* @/ 4Oįyϸ_rwIgKMQAm~ !B,h~u٣xQouկW踣6ݡzES@6 g__0?@AW'_A@. GZP;}\ }XA:E.\8芮6_|P #ᣔ6u˓& <"&oz79ڱ]t~ ҿSq7/XQRuk)į>y"~NF6D7TuH# k<܏=~Xs Yꇞ]й#=Ld0`?Y?QD7!g{]V#}XȞQr.,y# t1ܘT[tH1V w*=F}\TM7$q _zG\~X/ 6yD@UV ~V^hZ)u 7f;{24HG+@0]E…^MOD)u t}zބ:@пouȟK"u*;Dt:z88_8(znn 'o@tP<t{'u_Įci pJ*1'zMMOPEPxoEж8$^^ÂHp ?㿒}j}9@=x7AuÚ+~D1(g=CIF9d<u{1OxQ81 H3h/,? }ou;#_=kC"9$|ߺĿpfՊ9W_K_?U_#h ZD|. 2^7{ h?!Tο=u HN'۫pwr+ ߬UOUNdL/:;Z ۋ[~R];`]zwz<&VT"}r B̀ Zmoa) P:FFA.AV_@Q"K$HlIOw;)g*7ׯN*omUTSh6=xU+P0_T@r:/0ȏ *"?+"A PߝNZQ 1_y]lmY.$Y+wfG=!yg="vwAo8?7Z6OwRݻE/ϿZI"'熀 _yS:SB9oVޝ?^BA?/A1!ԍc쮇uXƃMCz 5 R?džCҹar]{/OŇQc$ "Bk1ZU߸y7 F Ľ E}?v PG憀ӂ`G3:$ODKooyLy^(-#&ǹXO_cW:7V0W6@H;PtM _{(@"9qt4DsBm[}V ^9ݰ}%MB߭tg  /OvWAFhKf;_J{>:/{҅O`Ca:G`Ro?~9?ř$A0I &h<]r/& ?G% >0=\|Cq:31 Ȼsuv;=w$ S ҏSgدz B9!q]?; h5RaHAϽ_ӷig_)ᄏ~ґA-U=߸ }7{;*V;pzU y4 yd|c( ~o\mϞ\1H`_ޘfO^[lh#A{ :@ pYFCSPw?j9ADg@k@FFe4{@@E=٩|?-ߋA^)RtA{{+@JR *M{6ߪQ$H!FFG8pQ/qGtͣ2k n{L 3~ g۳#AD~< *x.MY9o~-=f)ٱG(Q{ޱo `?-ji{vD_/{! =pzyg^Wge߼kgw>~S:.ڢ(@ рūbz+ p~y+/y{m$UϧozK"EE="XzEб]a%U@@oE/Mg*.C#}_kAiE~ϊ:D7roo?ǞNVy_W~g+/~1y"tQ BS싊 ͣɃ9u,8"E&@#'T96u.]tĜFxnN)t7"P7k6@Foρ4~c~~|3:.0̼Q0R~*_vDT?=쮍!{mEr*UxU@Ev)/_OAA<ҥ(y=@CP*@$.bOt yy"~ S@_X'xyױQ# X@Zvj cX"&s֮^^D{ ~ w^ ,b6x'OOy }6p!iͳU5 F67 H`YAgfFȟA?\:[Q!tkkP%^l sǠ|y64aPqo^|?;*8 uh2^ė{. {G^~(&+nQD;{=?~)տ*gm.{ܪzo}Lh^Oz2^}=cݺvqy% vT pkJ7_:: %@/Hy M2t.Au5CsM := wjk(_R@6:!d+R_3W`M&qKmdTt=~#fgw맊_Gp3O8!34 ]2@?z2tw{^B]hCޙ}́_ﴀ.VrQƹ]B̢>401!HoTc>Zx㚅``o*tJ(\Km&Z?c)DΨ`I~tdڏ]Bȝs؋Ŋ 3>$ 罬V>xͫemҚGwg!yGm^ʈB )E!߳nju_:rGBҀzچ/蜾B ܣ]/M2=cx7 @BE'H{tG+N9Ay,u>'< #5E0o1>"p{uDs&"Z ?tW P?'@Չ|1@-SUԤb>*=gf}20x΄&#螯grsG 4S$Hr<*ҍb??A ܋^$#Tqz^@߿>9L{a4 a!RB*%;Yx—!; 0m GU|w@;=^{' )i=|$\R/0~>8`u|_?O}g5 nxv_?7ߪg +84;XF5nVcs-K!p2PpuSh .Xkjއ/D_m0 X:؏h7ԹpG x#+"o7n 'ǮO_US2ƀw ,l#d,t Pq;^5߃.=q_)3"T){9όSh5t(0Ga S]4j%[^W+qwu/>Ꚕnzzv)y"">WWt jd+B ОHzoF1Y?7 A@=y"x' :P/L@=C}El_T!@^~~^q_gf!jz]jZ4H± 0!{Ț7H2g%×z f=xn u5 Z7ANh6Z×sFt0B@Ngx#DCi{ As\ϩ;<k0.M΁M90#)$o_hÑHj͏in cEGfrDmo}|f_"Q^w( pl>;t4ٮR(gSK .5x|Gja¿F< FN+: ]#B-P\/ϯ4p~` 0u'[Uѻ8+!jK߄1k}᭷0ld|!1d:~" ?ܷa&>5Nn@x,-0T7!o;|>X0-:,9!]BrR퇑 >kL[1>m q"@wrm=+w_h ؅¢C;wNK+gO^(' pG%:nЃcU@uGE}Q0? 9uGA~]BQu;}չ$^d{xP{<K!u 8m+@:`$7GABNg{4T<ƃA_r'0HLj_Vޯ)5 !6V :":/,˫B"cܢ]# TE;GOD-{Qݐ;'B_9Iֽ}k=ǻ{ <:w?V޳B@JJu2=ӽcaMV#laNEse"FQEb,ww"Ra{2uEFu+4#ߩO5[M7;C.$TqcO@PRM4 "dt BB@Um@ |0Zኅ/RotZdU(51*HRV((ASWz@g6>4p> )~G/ "DI"\o{ t7< "f{?Pu 2hAx:CykxjS 5$`![xLِQL,`cu-1>CuF1oTYQ.SW?Ӹ߯^޷?h \lxU pX,@lߑ"p8?Ɓ]'OkTa~&y~œ:/"'BA"ƚEȅ6tN@< h` X< 4tn͞=q?}?֣-z}z2rÉ&\E ghV@`dK=7 gu]#`af$饇ky|#^A9}$ b8 u(`EENCCfG#&w(o|߰VB=}[ǭp.u=;wMĿB{;4b۳?ٗ|:1~_ߺOkf* pI nq $/ `C|rxu]/zuM$Z# Qo6<_ǜ7!sM?Ṁ;L^ X :Ճa @xR!i u${oص eo禳HP+xZ CQB0ɟkB%BWA3grDNd|@0R/n+"<Byf3{+R{h!o5>п.~{g<^ŀU'@Č@o#;cO~p_׭]pCQ)_ ۯc {(3# ``Psr~M^pir̤?'!/@V[=v3jq !RHf݀b\ox$}#{_x^"?(r{'&x,пOt},9}냿Q q?ҿc`XEݯ?<PB؈K+ Pϵ޿w$"[kv{*HYww̻A޿~jP2|F@[DjZ'Ÿ\C&Xة=ڋ̯+ kf\Gܿ:'+4HBgvʁdX fZP߻ol=X\ZϤ޻6{as Q+Z2 %y̻8ptmQ _׹ytyH\X98E@kGD0Nk^Ⱦ8{5<~Bn,({Q `$o~!Q D qwjHؾ7 áK!;y߯ז ~Rn<,4@W6=ri(x\ #|oνgJF@=gy T{NCy?R2H"9 ak <WϿ P۴|Vt BFνSE P$HN@G(u~O9 `AX/n??~o'/q{+Oȟ{:yPJ/lbT'(׸?Mt@XfϜ?Ǫ7g^>}>] ' |H9|C$~ABl?0"q.V[|?{I4!Uf :"ݳ<ǐyO<~ \w#wN0l(u;D(ﮗOOwA?5+_flDϴ?>{ъDj <)p. Z!PP@+pE* KׄKΟ,oi "rMc0=USko_u\9"z@ b?Y(\ɾ#`Σ *-R/X!} _ sqoQp( >p"}ώM@Jcaq OPUnH$IF P|'vJF+,k |#xx$RqkyyDt.#>:?$# > \h[s,LZZOo_f>5;/ C79o2Q{y\`ku"< ݏ/XN?U|?+ =`lylV;q\xfN$A]=B=Z5<0*p 08'뛞HZv0Y>Y<{-NzkJgQ|cf_?Qߛ{dC n#\H U@*0|ͣ Dߢ@hqA(B@O4(c$mRDי#{zosޟ AqkYg`NaJDH޿ 3({ 3ZQR #@=[{Ud k3w!Ld{_k/9 HCb UCZMDzYO%] xxfWX<] QD![l-ks =#2*f|k{X&BϟLJ+濼3U:10lK‘'Kk<{ I(+t ~?"ojأ|?njGF{ BB>^|=~BF'^ ϣ_k&'&-. Dypy]! zk;uShܾb?Wc2.oz)Py_J'z& b,!o;.6 °蚂4=2$kNz"S/? o{mؤ@Tڵa!$[G$L B_|h'*¿ӻ˓FB rٳύQ~6;<R@RTEZ?u'-}(!=17b?wvȹ{@=oQ_D<1h`id/Uy5|Y7 :0? B(P{v={!!a<k5^DȻw0h-M?>@Mϼ]m pRsND w, Y#TC8څtcT8ڟP}^w1kk`Z "~W_F=V_޿W To:A4}_< "GNm?H )>wPH x{+_T@wM# acDؤL`Dg@`ko*|Ռƹ=_=iU^аc^MkƄH?f& ,0YџQ@8E U߶Ts%@@?E~8Wk{yI/򶐋ajUٓͽ$ Ήa_o8a~PШ~Pwhw)8ya-D"T#*n?IsxGf_mg_}?C?B ;VKU_(s4;DЪ [w<#x Q$ { kbX?ctϙկu ܍Pĉ wG^7I{БK:H~OpH2x>F@,w,3??+H7^FH>c,l2hwIyTDTCh7zzg=uTsz9JwT<8*DXOd1! '`k6't(p_ou^?!/OOOsI@w>dz}Y/ (:\ń?3dz%@g6) F@{kIwmP>n@φ}o t@̣G4sv?R?{pOB@G*+j(@0:̏' qk \?=`?Z|SQ4 NDmzd.d߯ 9(;[Y$~/Tow>=h}D ,J41"fPrֈ?6>~lsNI!=2t,@䩸cw;Ou@=H wB:8d9D6=hȑ{&S;ϽQog펀6:OtQ`\V5O)w@ =}ƿy"ȑ-5l~*=׳=:0P rHR$ʜ$-'~z"3Njǡ0No1 x'p@[`(}΀޷<~<|k}{5 &oQ &$L!|#O>=Q`HFC56;C{VH  2rhU>=/̈˿x44]!@Ci;NIOh;OiQzgel#Ը8 y[`AqEh qy}/K a0sL1DkLZDmz}`>UP*F}4u?ƻǃ/ܳ b@::?v?i'>`}܏}?u C [~[9F~r~y[zrqw7^yi! 缯}@|9h ]:9ls@O?@D @/p)8a#.c_wjW2Uwg߾w(k6@ PDמt!ȟ=}G zO7"OwL l߄i%t@_!y  8 &t&A-xE{R' NIM96b|#0z'(R ?oE:~֊x/&CqN@ @BL(hG] Rh(`luw)p- 7:O/DT/Tkw>f۟~v_ 8+]&"&D :&Xݏb<'m}?($є@s;~Db?ߡ}j +Y"/ȏ{@<׿@p_^j tQ'X?"K=y~CBAJZAC6l9o{EKcqQ}?-GϿGH1+`=&6cSCџ*EϾT׮kx $0zxӧO4 4< pJŀЃ\U%/DRR?m6t{ =\P*Z/Rȧ=H}2ެt\,O5.#y{n>Q$ޣy+^ i/BzaHh%x#h?>t= !vG_PZ.̿,?xw95P E0M;ICZC&}$ptA|BF."5 ~ϿXE!tĨOx tpl//*_S_WUW?_zbW.%O| o+>ٱ8̟%w/M!e$=θ_<ˆ5 rk&P/Ҏ?SdL@U6/!EEy<0BVѺ܇Iߌ__ٓ}b@*:WĹ<gǀm)K[Ζ@ˠ`f}P!}'[U{{"m=5 ՚H abi4 tNcZo@?}[Ŀr_ mY|\y7{/MQ*#@-N䮜?-B?!cf7C2 bR'3n-N ofON@ju_y:"~gA-&0]vt>oW}+|1 o`xp~\6|z# k}{9Hg" (IϱfQ" y3;쩓"+grS=<rKs q=7wp? R8yjd2|l8G/u|BAV,)2;jS$v}P*r(zNԺ£; 7:޾]O gysK;ӧBW 4@OGg>">? 4lD٧cy(=Q(R^ X~9>w-H ]&QđU A;'Fcl gPw28e3\?mv'fwiܯ*'w{e<'TɊԐ&BP{VG@Wn~eR?},Wh_! {g7gNrď^Yt~i$@@rmyM\#8 cϽUvvwO#0>dO5_]'W#)"߾85v=,J2O4kx(3~ߛPǿm+0J;)X&;FVwL_O/2lOyo;tz/ oFhENVՊ0Ъًl+gt//}Etφ@΍@s=>V1{gZ?Bwtw}Y]WzO `Պ' p p$y<~HnÍ%RŁ{yE Yy` b L[셻X.e<,sg[[~5~ms=5 yǹ4}6^{uo?N>M:ogIk8S?MpN Tdž7TG.WjæoxU #<ީFPsn9į3e;B'=? ~O ?Ct29@c9'MτB\jxOm;0džo9COSWD{$XFBR0_@'e\hDG~SGG֫4wyG?H=yn e0~ųK÷MpC]6:(s \Z`-]K@ަуіEgb P*d1)]5KƗfjΆN7,VvjƜ5Lq?R{r[{mY\hOL?"RR3/ǫ?Ɨ7m;Fmޞ=@ϧ,tޫuV@J;SgT}?&6 '䷹#}Gq :6O}{up}_~uЏjL[P}f+a;y;gF;_ ;Wbw6hU[U?=@MG gچAȜ~hs L@4S%3zK%5ۻ)3c/:Ӭ_kn|PBpmwRCq֙AɿXv^Z:0݉p~TeF Hz :1蕹pD.V_}A=.IDmD)] N@ G(BdѯT{O"9VZhl3;8O&Z&'2HVFȖѬ4]ŋW+)yFuT,q4! B^y-'F3"-q@ _0=1Xo.\F򠠹,F/(m5]qw1ć48Dp+Nc }W`Y85X3qT([t `]"t3-Y˹S 0MZG 4O ~z|ރNQ״futFPaekPD74rݪ2Qpg0ie0Jy ,BK"~Ͽ?Gh:)DeN4KFc1w`fsߌ?1o coۤ 0s6Ȁp_F͞dL7 w].UX)e0!L84t"(LrOVo}ﱾx6~wp5Sv14Ԝ heRuUfƠD,~nhk~] |g"|`Z>@ž~tٿ SpNŸiK ovQQNߩz<>V<^%Kfs>gu }l-D2$Jh;5v+E'"3GXOoTk{37Y+Hp&1.-@"˭1>]yE旺J$P>u~r >iT?%W/q!?~N3@#ȉk,m@,{k 4hp X P;|XNlzNB$h+ \p8`H}POqCɔz(KwV._/##B~w@쿋q?K~ 7ѯ@Oƿ&EX޼و'@?Gn0G8[?pH'@R2K##:u]c)3Os3߹ya@pFW(2h5׽xJj{*Qw>#}L׶,A[ nF44DQXt(g@H%R7JDGk/!-፠G&hDz$m}"{ t?ޕ)y6pϘN2YPQ 0'}0(r1/oW;P?ā2 c}+t+AAA|( [ F5h $ q 18'۟qO[I! |׸z* t#C'r#~$Wsj gg2t@>s'~ak~.-\'T':ߕa;.9_'@ yYJL2׫=bֽ4Cן'3.cRG^,#{]?;\'Ў|42V:{d-Q@?jK֕},7\<N\s}NP`>n*} 0[7?ds` H=u(qO_l;$!z@fGeG2ٹ%u񒀷 Cddv֧" \58(̿!U#&.9*`5:LXZ~NS劍ѳ4^V3gq`g*hI)Pp`S:2W3 {ZoX(eof #c WP=R2@Pv.&l|P4l~B34d K'7}#!LD;Q>đpD旣; &e?y|uld@џޑSU;'O|oh*o?@`⣟RDN@P U8Qf߰<4h#e~E735ȉJ$pNktu7չ4Z]C,P[JGQsߵhjK}_Ʉmq X㯑ߛy K՛29e O>6?ye{v ~#3Ck\wo_9[`akm%[S[.+:Àu ˒uv% {xV#a;mNv'/^ џ_rع4zk'cNY |8kE/u|P儷F]L3ϧu{o׿"+XЏѺǁ=#{=geowKj;~ZJuxd|]4W2#og2>h$B>Cguxz keA7QD 4ކ{8|ƀ޶6,(k}l{y?5Oj!_V.Wލg!Tk$Nk.{uG?Fp 9ih!`I H >?^2oVogOi\7>U= 5LjF\gj `+b` Prn i~_>VqxؾG]=uLqo9V f=fXHRtѽ`![ܣ{^@v^'P~ {A(KG ŌQ ?S۟8G#`:1wjgggyDg:|F 1)G`|8 pxç}"t' V0'q T TտYd)M^4e?F%Q$tPs ,2'y F39^B8}p$ϯoиjTξ|%y @=랄fh zByTpϑYǷ9 \t\qPKCB]L Lx2 /C|zU_ư@ʟ=?dc?&?,?K䙚 8 '6$&d׳!N+A] ('r  k?>FAq@zfD(Z3 zvd"Sǟg;4R!$#˸8B#[}9?mTwG޴a2ZmT7N=MR;L0xGB 4Gf|\1f5w78Zb%gL_ `\С?rczm 7}`P=R] Pȳ"e>mC@pmx$<k}G-P"3*s,iqTyk|d/\?3%hr?dHHm߷\1P =g";0h?jǣ_GU?=D w+&? WY ?gH,@n LV|2y$!F>:YS ^; G#%AF:ϿbL3"} ҡ>h"vQ^Gr)>9Fpʇ{]WXV0^Z6`?U`4N щ @ |8f4Cvo|j[ޣh}AO6r(}_??zGWHxFMhq]'?  /.l_Ճ ң#u1d=܉,' .b.(eƿ À,+~ȵQznXw0~v6>gk{Q4D&?kP.X_dA8'AlnXz]`8&( I0MW@ CZ 1\8'0C˨YDt45)@.њ5og.T#w3#@2lVA>qdžW!| գGz?T pPu-Jc,h qV|d0D#*ֆyMx6SLS# H=; 1bD8G7?F_Z4?=j6@@=[}.'%ʂ?mw0W{;aT3/x?HhS_ >τ9=l)̩?Sfwh {z ƏIre-ׯ>^j.w[-G3/tul2 tV޸!0Kf'_=gw*}/G? ;ލ!>8looWݯ><\8uG qe[gQFTMfs"k/V ԑJr$MU-NT;)p&?uvvNj0vï@bOj">/l? ӡu5d#F4>`{mHY)@[{"Ж7WtxDL-}E\W}bM* ןԽݧ 2XȲ dH/gwWB˘PuyfzaGHcZ:S[,,919u}joQ?g'kb.QZpOI&fR`H@6?fO{(ß#yz?9g%=˨1x}-uZK ǹa3xNmP|;t|oYR5z/x^cgO5zkY$;=3HZoBnŸl3&szvO -+sk_MPL{ Qo7Lדiu`>Ĭ .#xD,:RIN?sϵ;Y̌!d=Jg6 \J. CO<-k6?Wc#Z8 vu'`,x_#}u 4/`kM e6@3am <&qyDn xK= '\Sg` ;JxX)~L[I\1w5Ʒw+cg !09 ^>@[Y3ie39,0x Ve?c!Wuk#edh蒽m3B+Jv;#n h}? aώ,PM/ JF'#蹪 :`tq`HT~VKn[RBXFގF>=(G.y\p P;܀,@pr6R]տtp1\MĿp%~^d qo-( 2.~|=  aW~]H=sϷ8\V>gZ6Hp_\] 2WVd߳W>mppa~y }4޽u{Pj]P^ [t(W XS?+s`Gz)RK4mۿ5}> ?2 & Ł@dN@ȣEP? ,O_lmd=ݓ}D̰N8G{`! H)묭)~:&Sl㞞Af4weAu$p63ٯdh 249V/$@aF0DvXA=7A_ϵK캡wBޓRQ\{DjG++plZ"0rh/$?/ p7mYo<<3L@ti`bHf?ˠ@ wgSa祺P?>[ 1$ƙs˧t.4๑mRT,?]`jX-oIF,-8kLίҽ&k_X7ɀ^}z SgWRDM0x =BU܇[ ,UNm%*HdE8gr ]N !D^]ݿ {DX"IcN@@ ` ?Ds0>?'~ͫo>.0Ò9&H K0{+ |3΁|+Izfy4@/P=s`Yslz m\3_G! pྯQg{@[ziت޾FGÅx ( 5n` *<pH˂?3`/qGs_WOZ׻2`|j8$'΄@2 3Vⷨ{K+ :08叝Tul9㳦qXf>D3kt~6ÞqO9O5`,W.gA}Z݂\>P G俴'%eI!F@h4&CGJ|2eAj_ 3G@Խ3~ݟ%_9N@2:I~mw}30was2g.@ 0mKAA nffQBc?x]~<?2|R}v$+JqۅV"YRߗYX 2ǀƷC~lj OQBYZxy>G'6imOkڍՀ{N^~{h~V^=Q.PrskbDVKwOQkGZ2{q(pGZu^\2O:6PSw|h:~#7Ym/ =p짱1:cvv Ǎ_fh}ߧ,Hib|h,F? `ԞIJ2O*uXXs o5Չեζ1C=|a7\u?Z9 ӟ0/|k/)Y[5F0ACwq$(ω\g% ,k3]v2)VۖY`HFtjR|8uwָ`٪G4uퟬ@DǪzUݽ{6=U7O4ZnD A ;?ν؝J,3U ?14vT 1ru~~@5{@`ѵ6D[׹9e怊YtAw(g-Pj=|clCBλ~1RȩlI4E^Z~s ,kˎr{GPa~|6Z2uҸ_Fi_Tǫoz5&oK5| Q5Nq P5L D6Y18_#8f_~0 O+tG$#C85q q: )*glMۨtU99@~> jϣaUU/>/y/ ^p*gu2G(5<: x a{Ϛ;58\rX߯r-eh^"}Fu_G"_kݤ{yyf?ȌOt@|!-C(y`8)or8aW<nz io:[x!./#Po:KԪV` \ݹm*I{BcvZD, XFs7Qg%d W:%:r@6^W݀_H[Í |g6@B53)yHJ@5?jשF史g wcb_:?9C3`xMt$0<י 㣀'HD_ ydKk4Z43'{͐[)Zrܐ1 VV  7EI7r 鉶"u"&o[(L{ LU 3k/Y?'Rߩ0!s) #;'}K}#+ӟI5<AA(@&82S0h9׵-,r?Uowk&v|x5<+C)Z(^ հw][[K-%Y@W؃4]SE HK ,X9x]QjNkԽ׫qDf/GLJBw!`hzn\j( .tda2p[d~S)@yj2o^b?6Q/C1(@Вth]K>kYڠ2 !M;Vqq\oƿ4>/5S3"v>5_,{Ưu~"=K^s4)brH5Sبd[?&A_Pmooaos>hߙw׫'~'wD 5 yd8G KJ:_ \ &5R}>}1Lݻ5s|;fс?q&fTƮ#MH{ut:4k@^Jw-ܲP̨8ΦwNxܯQ2}L_}=HK㳋@|wvuЈ0|f(}8&kGbd5/%?W>iÚB#;Kdj`ENu&`!J7v`=g6rNmGuvAI3+FӟpiXW[Ob {\(:Xl9;5b i;U3qw,/dAAKzq$

~{y`v2Ȁ0:ч8P-c!d.;sbf‚l}o>A8[ Y"jfr8C@#~Sr&(Yغw2\Qyi5eU(]Qg 7y<F2Cmw/K g2c!wU zJa>7B ed遄`G_fefc/DˉѣGM?gK*TvVpjj+A_V?͢PNQ3rZh /%fHk"pi\%T;=5c[$O+?#00'#?6XGOW=¨S܃ľF%þƞQO\h B; K E p5ef纜FV`>e|;dr` >JNeϾeDAWCiapa8 &QM fЭ%A5>F٦͖CjU[嚷Dhݟ0$qdžVd%HTu(WbǏ1ܤG4Ȥ=~ pϠ y !\rrEjDe\:hv ^4??ꀚw>xGGe#Y9P'HmhuVuXeQU^y=ECk*C%?%]/Fղ/3]f Ԗ@uB\oxz?ߙR/u8sG $0A>C9`N 4A#\ӟk<3ae !v:_?9z+cQ\obx1R=xYO;<SKcgb\p p@p^H P ,}8_;(^%?tB&+pwS@G56_G*Xj} {Xɠ_Omp*}܀k=})qb{$/,#y_grg@RIE=kReuKdsҟf=\V&(L,%栟@[!h1څ!ȗBƴ9wY"qu{` !Xx1!6~[y@N6HJ^t;^gǣ!3^)ϽWu¿ͽj=g@騆^0>UufI4E@K߻6A;:O#~6ڿ E uskps=tWF׍-Qp$`WvJ% {nMm m?cZk43 FuݦP޷ GݾUH# qT9 0>ߊʗa2joF8WZDJZZ?#yEy~8ϧap :*bقaa-!> Nw󹃃٥]92ph u\T-Mhػo*zʥhdݾAV?,!ֿ_AO}BM7: ;x; {~? 8gm;!H{fm s|LB3@#8KpҞwLl/S߿O3%BR޻,]$@re2~/a5fӷ9hY×hGS+M!,1/>Mȍ\8=pΞ2s?PG]kǪ#_Z!5B`keq9H'qY ȹ=?Fy }d$^?NdA(?!׹"F3[vqGn]Gt`1F$ZOc{GO:ޣV2CeO7cOHs;@N {L\KdE;[r`Hb_e;9=XA?& \i=odFj鳽Gʧkx[-teu-:<ZYTH З2z|!%Xaȴ/Mw_sm\Zl?jOԪ=86HGΝ;44~ߠN}{2IB4q.Zcz3?g:Fye[x֜]Hiww@L6FLU`3|fi{T/]W"iq3n?'`BFxfxKT \SYvXmtjR/,ꂺg \ύKlB]=a-hM_4WfcIIO<^ O& ~Z =_EGd͇0LVEr/|:pl! ! J2u@Hag{?S:>ا I<97l0| iv^x. i>>krg~zEaOжyV=S+3exu.G&aRȥ~'wooGY4pwpgs>q h Bѹٻ<{ Jz# z&ϣK3[? J2$ʬ=4Rk8W3Jy *oP(z/2sѵ_: fiA}(#=E=5 h^yDps50Z7+w O C%?CL\3DD$M#r@_ ׭_tO4 Obg3FC"xRpwVSckמ@VY l:A7kccA9Ϟe߄}в-fGu|v f)ࣄzzN5a4]yY #r=׫Y<䒃EfȥopH{w6@3 %ym֞-:{VA gX883C/SP_KSHE{V94`o xo{%t.W.V'n_F |`e=~ (DjIyʷ`Eﲏ;S_y/Y` Qs<d2a-zC 4n5,l7bWɁ:Bt B:qJh#Nv9O;n ܽNV'S6^+ Y#GAJ$i%`vDwp;Lqe&G1q?=;;9sTՉk8=p&[Dy!Go>Xz up]q.̲z;uI%e?w>Sw+U2 ( miF? /dH׾5S.|C^_n+gJz=L~zw<.?S R 9 @NPڃ@%}Bߎ7?pPmnn>ѿ^hw׫3.Dn:1R@(S9(2㌳X2K "hm VaPU ZyA!_gMT?wI0|(Ӡ; c̛,Y2=Q| " 0+2DCNΠD4ZwUٵVUxᄏ9]-Ć7 Pe]FXas՝c͎ߎXC㠺C4_9H҂_]itɡttiq%M>(Rћix% 3̍tzSXjJ}5pu_[ؗN-M{a;'}p'g_&%q̾cS>kYc(GcP1} ј<򯓰S=|kkMSs-ͷ nQLkf M1X'aɘkB'V97ƬQaX6 <{ۋ ,,O˱c80u%,Of5AkWf"q]!v]>{H][ =_ڗ G>]kξct4iG~TNs_u'Gci瞴xޜHupk=῟3>oiﴄs[Y8Úk0cV1=Fvǎޠ/7vunn+vix->siQ; lm&8}7N5DkG.[? /UϜ&7kkx+wcF)ZSotAAMTqY|`Au6ƿ:]X;,g4&&TͨW[3pnB`B9,GQ( W!ۛ >p^2CPP 9c&B'i#̓YYM{Z[5ޯ ԑ-'}ms5M@V.NM}Wa ZNF>`€c+ b?ů!zif%f[_D_2 6 7sh/jw.i񛮴hڠ'U_5{"s'7{+4 ֒u >,Uç j1>-φN@jj|7( gZZy{Pu^h^*,4o}|iWZzebY1_7;qC{?BF-SDM8I+\߸'^&v@c5 Z/?xx oq+iQ%MN.m1ܔ$`䦝lA lC-JD ͎ .~|ApЉ}Wz8ub}*8:ՠeqg,#zmMixz Q[:h|jZa Hd,|_p,k\yYjquk1vuづf,PcЧhŸrq_vVĨ(,oVףa-G` ALl] wM;~s[-iPdKu ~љV~8֞t= 488@ l%iva \ ^ kؠ̑cD͟`֠ ދw7_OvˡѓC5G 7@9Ʊ͢]7@=G]ђB5Y%?8 Kp E\/4~nU+h߭Gv?g2H 8G:pCol.@9?&h历7u|pv ]5{&rg;, xв~bW/ -f0< |nx^-4ai#뀱8sk`} %aibX^\3V ?- UXPbNg @_nA}v~5Vgo׺:! ] 'wv 9Z[z: i ŵv_8 !+x}caF&/cz'|;5뻡ݼx"( i` @{lvtcd f5߰1HC=E bG4wʉ <׭UQ/'qV{iI`ro' !rB ƊU_ .!_/,i,kFo j́/F6a5&PF!,&\:rXA]_ecۆ].f 1Qm{6?wh?vgi `lx}<;hpO(д%돾;Wg.4 >m_4h}5=WS@57+Toт?{)ԙq]8?.X7jƜ0a3DH)G2~(u4 ̍on\C򦿈D Chs ϘpZ{q=SO!~)w<C4`1C lQ '<% 0c ̒@hԃ_U\a1kܘB'fn&NDƥە4?Mڋ?ڎ(S<"n9HXL<0va˰E,ya1dގϻcfxKxb`FyaumHF|A}F1HkGSoԙ% L<{s|{ vhkOO|,mͿfF.ƝĹ'ō_pLVG˒(6|ƤCƿ:mh薷w ˑv ]coVdTH*WԻc@);nrMBNbO<񊯍kjƄёvAz$25?:s `Z O;M|E!PIWIܜ(&50€71p+ىZeu1i)h/7ǐјl  g%bhQm{i!:3S؜{ǝin'cGcXc?w]bFVkB|>ف"0p[vXfNj-x[A!/uT zx+;{'?D܁ߢVA_V51/{`͟+NXSCNbX>&@?W&/xr/j 1OcWj{vqcx<ˇFr7oZRCDa1yC1?UOP^n@ᑻ (*|&>_p qł `G:k +<0(v i\5 Q0# ɁIM`3n7C䁉l쮡bT1a><%+67Nji43G?@eˡy0c`r.xVXiڠ1YfW a~AOIC;Ôqy$\O.V5JFk>)Sހz}a:ȾszFc f8dC~\ZIha p}YNĚ?{WnM* ްZ@%79'{@ IߕONF1m 6nSo6AƈK7āGSg]O.O5?߻NR'SYO @-g _g:>flTR7 i/v6% biSz 6]1Y 5ƄyW/a,{z3(~CJG/2N 5jRՅO$%я!P b,?Vt[n!"Dj?v2"[  ]<ԍEedr-I.v ۖtw]}t}g35[CeD]~I!-n%oNhIh#UB!.Vΐ{IjXKK1w 3mN>/O%]'[~گ>ۏ K@v[ Ђ@ʺ~)_Q2%oCn}7Ib}ӷ2Pqա Ya.K$J"-?YC8D?_PNk_lA|ؖ0ǸJA@9PQ5 7BI|ZM*+zh ^ m*~~BSH&IH{$?j zmjCeXIWF{'o^_prؕ.[m{bn(8{.َu3?+1kHEgXzƐ{}4 $ hc<6B`'H҇:֓{& JoA(q6wߛl Z$86Q uI8V[vVW!;p?̯Џ$5Ϭ_ϧHؑUO nKPU޿eH2 PF$ܯA]7\};=^}UQ`\j`?_-Z8LiFDJU@H  }5*IY乫I ipuMu5̞HO9b[}m I*n\2*[NHNw2Is/&63~fo'+k-xn/kW KK6~ +|7owAvCKU,~\)(6ĎsoHƕZ39r}?-vhVOKÃ#'V}Ч7H N @?D{5~7cެ$!j@ &81$`_[ke? ʀE rf3'bd#w 3K]')lv$ V?|S塏8 ? w$o]޺\Hg6Iا곩ۨMAT4eϑ!i[ +_IR!I BR'^C_y$g&HG4ė;deM>ަ-{v':)/S Q?SF$_(l=jY_ a4^^=}u¶?\^kWQuz7%%~nW evODZWEgaWYϜo|%#P}%iDt_P(8,r #fK%bF;>^ 2C7 "EdslحjRq>z/ :}^bX^)sv.?6 yeygnSNB SH/iOC'L$~a.&% \m|Z4N:>Ů|}쵤F7l>#6}Cm}: @=>փCDd@YY7I|dO$ʬ}G`ԥ-Ǜ0ظps]eE?a*B$;`W׌XKm9}ģo=k kxM훷Ds$p 8T@&Aqprx zTb0%48+93'K @Dc_oF5ls#tQ?AǗ 3~a KK}bq))$[[C}HnK~˰3{!)[R`G?6\}'j=1x?}B藾 J0x1\vqS dIٵˣJ[??'$ Ʒ7I{ YhKPI:c5`?^/ L ; /TOl<1*2{{m'6Z Ai 5j5J+Zi}8;ҷ;:+_swzT߈X+ Y˟̀eP?@b!V/.BO$!x%Ih 0=Ӑ"BD}o;xc[Bff ! A{:хn=-I!n{󽤐\퀭Զ $ SGvҾPO%$˂$J :@R` }:"/:8/6Զ! !ydrf9/}3rͩ6ؖ?$}9sȆ/{-eo4s,fO%+v޺f_R>&,k> B PM~EJ` >gD[ׯI$[e=oRo0Ƞ T ?>%R@XN2bq^pR S!&})5K;yx>2~hՉ@/?$sG{KH?LЏN pX ݸ6>ߑe$ě?;MTea x{ to%b_){r~.6WHR`b/d$NIAm'8w/2X%O8W:rml N J$]eKP9U[lk\;bK%%\_?DYw|m~=.]y:~$v)5Zv_ѯÖb׬ki/CC:ѳ7C6*-`#`O$@x  FvRAv[ljho@O)&{ n|,ΰ bCOySH~:)Bڒ$Ozغ~w%dOн7W[@m*9UЗ~Kz/\x I'AIV_g _E !7{ةc(~ RI$c8U((Pt6?k`Rt C|veI/9$CJ ޵l_7 @KI"ZO5=5ox%y> WH7>!,ܓ?Z~]*RL">^_$x~{cc7 iW=)! @$,'R /K_lB$ ~X;Ad<~~igQg&;s]&Xduy}끐TpDrK9  zG}$K7|+C꣄F8~/7A@t4hÿ!$ AM~HRP ƀc$T?0^j{W7 Ц{²$7$q!/sc鑔`{nKH0a#zSkZŌ8H L7]L͇ӣ2}8f/l3vZKEe~+a%q`uqz FvBN?I7l;0)t6P ]3 zm8A= ˀ8`Y]xN~~DZHJ73ܻC-;׻{ ȯ~o P?GGu@=l~@o4[xH? ®P@ԁm7ր!p>)]1Λ+=WפX珄<~:w~1oj.|(M@a>{50.Z0_ҟD?w@rG7 ̰~ yxLg`TFcf2ᬯxC{mSo)c>RQX<԰N>ۦQ0ȇs lK8&|I ~w`qAwpxӆ] `@hdc5 ֻ (w[Gߊz" e<z'(-U{EB@o/oʐ=׺Ro'dudnPr?}wo"=kL j^@x %GRA,oP:C63@RjΗ% sa0s̹H9 U!b8WM#p=sQ8U;ea.&U>\ 3!q$unn жyb_=矤Ofr.AY,uHXL]zv'$=k,$9,-̎O|=×8˳S6 a~6pA2J?R7D+_Xބ7[2ŻA8 T,DR7>z(dD.kncܩ_<A7=e$uq1~C#'&dpsp6 }_hi(-\#̓:~wse7gb=h!k̹4Vڝ{&Gz>{~Jf ~}2WiK⟸ ߣ~>3ojepB.m?87ko?yJ\Byξԅ7m} Tc W]eT7Y=ٽ>w}EHpKR6y BoQ KM㈁PmX?") ۯvO04&4@|r; u eHphYc t'rzlKS(c&;/ΓgA ;O$hΛ66H}3^?>a0Ջ˝${+Yϐmجoxb}77be\IӒy%:?X%p;&KRVۘydX蓼 _76d~!p YF./i1S.x$7q& ٶSp#G<{ԓР\N{Ϥ.$O2`]]yyzBGfSYݼuKMΧoC>R/2.$ O h \ۧD?pb&NV,Ai5 *?>+tB߷%g}7\ η%| |^ 01/.>a/,퍛+AmD.M ,϶7xhW?С[(l90[T9A @P^W+ ȭ~9bъH&iu%M!N)*{tã {k37`+ /qӾXoA>Zjx[z@wp#P7+-GU_} BɋM6"=aۍ?L8goQߵhq\HH=UK,#BG {է ;ۣ7{ sЮb\J/VOax c9g^zc%_@@o!=H?uYgW @a z泾ș7t{;}0KkXXof$;^?>.&΋^;F1U/q(=? $ox0z`} tLK>~gz84DRҧ.p*0!?pքOؐɿ5}+8(@p(O@2Xo : rx bҋa~[F@Xﴻe.7D,pZC@]iu%8?=w0(u6hpT[V H^01> @]/ñv̝`?i`v0U3;f+d&o?1o&?@>/4 ȫ~-Hϸ7>EB }3Pb~`Tf?ǫ3t``WXgz.|Þ{y+9an&0'R7OPϋe#z hX3` 19⭁ƕ&w"!2^A`p&2n5ѣu śT^w@A>I]%z [oٻ7Q6\71,^* Pc 珆crk#uM0 G0S .$Ǽ,'I߲R?3OyC?qO%i3w_d3ؕ+/4~g7 ) C~i 1lIob0#s|"i@P_u V'C#wqpx/FFA^NT?22 #E< 70YP'vwQoO߁wSw2JD;wa"IW_?|߻"f!/nI=Y[?1aI^@E!qa ~=.8zc NCaQ\6C ɇz4N=A]:+0b:}po&A4*t#V6X$@'fdz 2!p1a N}C wJMcdн/ xt+ ԍ( Ľ{*1 6"VkrGUqʶ|zŸktԑn6>L8nG'QTTR?ܴH!toci?`2o ~ɿsd Hw 瓈#fAbm1_ؿ$=.oP$wx,]eرaZ]su1FNw! ӈy$t[ Kd:cѰ]+9f]ڗ}16FDrϝ|,<ڣ-CPHkG6 N~5}iQb_+(kt6X{m.H2~3~4 r!Th"r@=pQG{ӟ_<_o9OYt\:^pM;@C  K~c&qI! )lنĨPߠ,\FCx(G9$)@Ps⿙;J~8JbY>v5p?Z-v]P:3/;-+|oS1t@oJ|Qb ?;,p|vѕY2d ICpCY> "Z¡IfCLџLr_P+ kq5)ݙ6W}~OЏAk2@K`߄$!GU`HtP62w}NrRT?|}CֈC)?+J_ _; {3Fux>R2(O˳?YtIjے]π[Пf% Ee?o N3&13/_5y1cTӮw;򷭆4p hoa?c"-fd1yk%C0ypK+e2d=0πnItufkn̅A eG$`phvgȏtԘz}Gh_ePr_ӇtL9h(3AnW=9;`@Y#OP~i3h?)#C%|Yo- R@w;?,3r~":ZSga7B8S=ݫLo Y#Kz}2ӿLJ1wBa|9nbpYA_SMػAB;isD,$YK0Ɵ;>zRlt*w͚4n]@~5ҭQr㠿^wcbJdYPG'2t>F}q }7' jG>OeϿkZJq!7Z05G081&gpž@>O@@2bL_ (ßHr, $L#}hV5AθAgs0iwO;xKm2+3N«KX&\1N*fњ޵ta[;'ݥj8wOr:?fW'" wRhbD@oߗ >B4spgEp/CU6鲓~ ҷ=(4@NR{4='<8{: Pu=8) }dűx6 Jia_2{f0k` ('ejj ~ #ބ?H_y<}_z7G7d=h*jhwC^EX}:5kĽ?8 -_";j m+c%%-];3Mw{ͨ`Ϝ 0ؽ2Q=1`E``1r8dwO0֌uuDjC[rh'^́_ >:i݁juskSo 57_d{Ppv-s =)`)3}p>@6@mGJ_#,?q#GtN/SQ^8h?gGHd!'Ŗ'8.%3JR h%wyDAOO0kڮ~|F==ڻ i`b[?Oݹgoi˂9<(!:m-ziܳ3؉f/sjMYA]n_6zOߙj-Buup'`dki; \܉9ܓ_8HvlkR~0am`u={]2rVm@,3ղ68DId4 Gdq pUvthn ̺G>ϋ{  7¿!vF[FY`_žؾrڶ@uz#%U}}'݉.x0Qvه +pTxoSUɑ|K5h'HFWGdvWyc&ρΡE)b Y `'t hz+YG59q (|=IJ։ \)UsE37o_D=I#ktd?]*%UwW@p潛ǣmgV?69 и}N"yV5-=0y ewF@*{xb3)ZD7lB(r>B679gQX믭P78{_[18C"?',n%rpOyq5 @T\f;oSܨs0O?JT|s{>i$0!3Ϝ<ˢGw"{"vmg@gՃIWЎH(3TD+Θ߫OGzg~c7N{`q$}֟ I?ZxDn㞃}I~,D%O`=8g& rqwSC ѿ#~C;pi~sŠs6Fފߟ~fV N/`A"FTKў|G{gjGkD ;gvq$+MӢN;LJGc2:SM @9BdPK8V68o{]5gDGN!LGuO!QNZ2(c4}@h?2׾JHoKnW o~9FЬGBg]`q[qn+ufkY3MԯyH[ǿjqPIL&@gsCAѾt-)s<Ѫſ7|1SlB?ӿ1_kg _IB*M r gsuviQ7e/΢ai @AR^'Z'@ܐ7:?ϵ?u) Z7g+Fjyc~?vy߾V\c pW["qM0d=eў#EFY==]58pFhrO_c+s8w (.u\Hk_xw$1j9H,`ߵ-tutt&ノ3#tE7@!&z~͗sOE Q}H?X~(xY3 Xtd6 ]7)]j^gdBЙ/mթѲ+YI)z/7]x#OmǃY zVO7_>Q_o0Gsየ,@IFͫ(~" `$(:.gp"Y:0'?AhUh~NTL 0q D}f2Y._~$15@YdўNh,Ay跧\;r m~8*k ƿ]@FgÒ]y֏S6nӷs?Iwpb;c?l ^sh;eh~E(}Daa17h,P5@? 9ty\#v#>FwҌh̤D8oH~~p#{`sQZ=Oo\ LÁl n`_Mq 8{Jbvn3|<2jolpvbEh0)N#~= ڢxA{.:UQuiyoJ5_xpƨ_<פm!\q0{5J~  0ߟ"cO2ٽY׻~UۚA0AZ"217i[b #ژh)Hn}O9o РZu/1iGXvv@[#ĽOGg _ywWG]g[(bOCs{b20h9"*>4 U džl^ˮlO'H8;rm—NdSSK98 "l (?Do*ŊOZ~]1dw?NtZ`jÀ <D jp{?0?-ciK) r9E xu_䳽D٢Lz:,"?\1Ǚ\V#{:K@ߚ?5X`low Qx wҷAej oo埽q`t# B y#gn _5Ģe]A;)TN@=YX{yG!޶23=uY_m<~=-~OCçr;=krǕVxU/jK7c@s :u>31ϰ!º-~廈M-o3,{P߹{6S{>͕}$H_@C":WgRPCڥU X~ 0 z2lc?b#N`Z;3׻ݛa%߀00R Fu(J75A[K)l9x>Oy^2l.3WyO-%mo:O_>[ {ACpeq0}i;=/" :.b-0H_i~?pȀ88=n(N#٢PD2A}? #HGE[#><i׬o|ooƿ ;O7@9-0K[AS^݃;< z=kyNڬ]vPmG]7fovpCG_{ ~n7X_0T;̏E.ߩV׻j1"xU&se4տuOg oΕfmg P"}QmqnhLټCM_> `Ss@ |9d*[|jIog)-k<Ā@jf5wk`0sͺHwa?fawv3]W(Dy?%{w?6)Y6h0P8{3k* {+eZY`dƿDD 21w`@!#}Nf>֍C ?Hz7>H-itP7G m`t~w=NB`Oss|ió !?0 d37?#ʗ?v[Y&; Dو>L,\fio3GMp*ѨFUs@` ~#'S4G R#`?> ɓx:9{'7{-' j4wYh[.{k~ ;c}+ 8O]4H~pd}o&ps^[i2hT~p PT~$W0А J#}gX[Жf6}t&?bQ`/Ffv9ߣㄚ]PX8P톲FYV5\w>p)nvb N&-:-4!^=6a߿oa;Fo-r"}5A?AJck,ɆqSyve7p' }ZggtG_Y5uW={` Z-֡> /_yW?L2S'_ e3Z f[; 6z9?doF2h8d ;GL0+q  b~޷s<'/mGgtA' vQ_k bc^nGӅjfqwTH$!6:ɶZ^D,3/wY=%QfV~ʽ.)9=?Li}74)׸^^#n߹/k1׬>94v}~Qh=4|hmm ax\O5W:,l]io/:oܵ}{y\8pqiMh ׿orܜ7WS×1~WnN qc7/Wa9;<_/!X|!"^oEݣZki=>{#k mm><$_O_G\b\i1x) l<Y#N6@d=q1g:uƒƊyUܬqJ4q+OĊ1R1"/S淠 +c|`ל^\"FQs o,ǕSc5qz|S'oW=Mp={?u{ ٙ޸6- |۸OV;FvBMNiӥ~d"a|A/Q K`}$/[?Fy_o3[E} hsD$f &Ly".[Zf&їզMB.FkJ/&HOq` l.'شٔ5ts,_a[Mɬ :^v@"$~ ESeI4ӣ"c_ǿ}v$`ng*O׬a]dKBVHӧ~i |JJ@^I714{c+P\1[D6C9UܦO3w_4?dL:|MOqTş_ȧ 7zG>:{yR-l}pÒf]c7YyѺQTJRah_WMGql'B | @B4./&5xxNpq+N $Nx |^ mS0c#W9K\a͘ c֫~&|C8hC0/I%XxYڣ}ZG_yԒ"TtnT}V}mT_D_~_c6W H7VXBHȄ1X7EkG M艛]8Ba~XR̉K(;GP(6ƌ9H3d-N)3SؙOA DbJh1e(]vdӇ/? @Z}ktmD7I0[@DZ7@yPǹ~dC1U诌f`q^CV @_kPK9Y[k )T?U&bh[b[w$,(f:$F-n3 Ia&7~ $K % V0fͮJJS0'pw ߠ?26}Y{ .*\&܂Jޱ^6$}6TGyշ9xG&n?}GE5^fVzs,ƃB6%y kɔW6y:rMP) 粞M ;^cMݺ&N @|/ ݅^/o$T{P7r6zïWD_LTϙ*z910AǺmՑA&NB;GLu*{K"i刺\[bGt6%^6`1#XN-nGI fHºG˙kזלxc%&[g`_+1W\hlkeZDN* D~*U$ +Eak9WW&E %WZ ϦW(sovϥP6HjVW?$TgIʳ:G%6oMPѱnD7?ZT_B PC_ G՟>ϤscVo%!;Jx5^7w#A҇!i @}Ť!=-J54B[$+5??ߕ~8  F7t1:F R՗~bX*#r*s'&{Y G֡ߞ ~veέ+z0 jr{C}Cc.sQ_[t#y޳A2Ś*Re[P l>Ω8P;HYl/E9/B +`mEĩĽJ+YWT.s{mPZuO_xX&Γ֓y->m^smN@r X#?՟?޾̈́@h]*;O?|?x6l2]@i T'~$_35!ؙ'.o' 1X v $`naM?.  ⟔v>RرV1}<6j7TxXmՏᚹK;&ٲ*<lw!#a[R2+K-`,wϥ(y9Da{:}27|4{˩ӠU> hli]iw(Xt|דh;u?uO*@ٛr? O@J_$"'`LW1L> p9"HWvoCOTV5:5|ezNF_?g0u {Dd-0-mA2˼d1kfj{vB4]W`#"Pg$5g`"F:LQ9e4S G11a_gQ_`^ժe'_?%oeZj`\݉S<]ak~LyY$ov|u%?ɇBmOp)?Gl7i[V `R0 G$'…kMf`NY>ߡ6k[7%z{;Cu ? ƿ$6BAf^Y7"3p*)(./_gcj tIt,\ pXiM\٫PY:fS3M58evMflv2u?6΀Ac;Gsg߿rH"#!ءƟϵ70?j@26؛[ڻeeS"zvrC ū5 9׏K.w'Bs^2kAI~JgZSt2kE?QY_A_?T.k>QZ UmFbfmCB-Z*lyiC}o}>XI C!sm;KK;;(8{亿ѬĜh|M$-Hv%S1ϸGȳ@ooge?/ҳOO !~)sTgLvlB 4˓˾q&A>rS<]?;Z# urws9`.tlOd0Fbb>HD[yuTc*;~N9+)MU"TGkN ̽\*ն`{+_Ӻf%"mM65v{ m9a?Q^}M;i/Uӂ=/W&v(w}ߵAo.)k(71ў slKk~9O߽ >)CGq@ ~97jt뭅l.ΕL ̺dR_NSYDa{&w-sdv h ;1 h 3/Wm*?RT3@ ƺֹF@{=)N{])/ AӅ혺f߯v[]7s֌@3W#ÿi! T-{3/NA]zԾXI7ү#0c~ȐI pNFH9Jz#@?T @H/v)=m~;5d:u@o-exU3xyN=v6kXGD)'\ )r5=0+*M/.cl6svb6a~X /kו *s?9! \ \2=g2pfg)s]>o_Y P}?5ӹ~op95d~%} uG~m V; J%(d6?~p}>_wy4_-Du Q?oH+4ݯ~@wpPg9@N|:EZ蠟{l_@I_?: uH9SԄ`߆uhD:S/oG)muVkrD}ur5v1td˴;;3i3M.8Q!"~o*LRm_D9z?zs{g?Xjxe7(QeC,տ~o•#))mgIt+vFi{ ??q|K-F7מ tg׊PKYf7HMS#-hI(yce4=ۅ6 S]kHMt1&|{{q~lG5uTF5v 6 Ote|'v$YqN ?4C?=Mǔ:=Y@_]I)~"`ljTVJ}&V W|DյMkz:ur>_W:gu @Y!5Q?eOؗrgHɯ+_Dq r%E@&#<Rmv' 8t)m}٢~; V @gh)j-۱/נo0~={W~&/v #uJ?cZ9V{X FDύj!&z/kTC?+?r*C3g~z਴7gicS& ;溝(eq\ԕK7sy;y)o e8w@ }VaH}@ }{OAuv{p`_p?`p_>/_)@fJj͖/30鱓/5{bV>jø_dI 4>U?{ 7?(;Dsiƿγ5G~Y W=s$?Y94E[F<Y ^ @ ~ I5"6Oc~jP2 >ex:ِ QVvmBܸg-T$/:'@\7ҩ|g107C^) 3q?GΑys_K_?zh/9=/Ce[#ۨ?U^kPP) 5~z+RU#vrt0g=1VZ2XgY#3VѴy0XvDE>>5j@_iL4Ku3T Sly*s̖Q8u9:_W#k:O0o7@W뻨w94w/S?>PƠl8m΋/B_s (ͬ}:vN<%SGp\7)p b `pbh\/z7=~ֳHʾ ~rd@5L񷆀je/^pw3YDy9 hߊ^{_]$0)UW =a8 ?Ry?7RH7ڇP}a?"7o#Y/âw_0E[(s_ѿ\{MY3PC/ 9_J3{`(19JS_2X2ptoa] e`.ً)`57,:7ܟ`͇g'45Ϛ~IR`c닰vרdAN5 w"4zܯLZҭۉ9QpvMWҷlpܲB/nDn/;san_h>OgFط6@ cuEӡ蕻MjN33S'24| CUɢ%yiEįEsWDs4ɥl 尟0qP_Nk?{Gp_(ܬ5VM=5WQrD:M)wE5ɼ(׫mHcm 8>m p,^ZGEoawO! @`dhݹt?そ 찚GRT.o <:WU-@?3.F s\f5f>ѽYm%GOJ`[j9P ED@d շzBwq]/rpgq ̩bLnD>K9C.oM`M)[K nuoy _$sKG}/sGp&_5@bĩ_ ;`R8 EȳQ_cL Xg0O'!HB+ $wFI$ fzFB?3/:1_E#t4S};9.~77ڧZ@kEk#yKwen#w|l5}n9 },4kw2б,ڭ!ː{'z*9FND}LJSU{`mu9XKE 0[@Pko#/t?yde#[XUzMۿtg S?3s # b.˟hs]EWcaZJ_oHWPrFJ N@΀[o,/ne Fɡt|VHu.0"!a&h;  _9ʷ_ПS'դ5f(6bN;3<Nj7h/(P ?/γ&if-u챊IJtY#o~_lƟ*~Zpϴϋpe{ $~ /CП-3[zJ"k /֎븖peq%?gXk  ׸_ q_랽goVj0[t#b5@4ao xX-?FǒC2 \ UkV9{OpT!} `r@jT+U@-= y?>$Iw|֚z8O =І,{h+~>`t';2"jFD;HbW 8?s 9%^{2d;D  "埳,;2FP,zl5~7kV}o8"ؤשk lEWcj9n)tօQ,;t?r5v+źDp0댆3eUػ'_$+@t/НOi*T`7d{ύ83w$o?v&m5 KA?t?_}I;0hʗF~.4Bp ߕX"j#y)^Eh5 F$|~:%~QRR@vn6_8x>nT/A3D Uߢ?<;b#?4 }:̎B#Յ1p~N6C|һQ/G6b٘؅<{,Ѐ8Z' 4 GJ$όF럣zNN!@߿}QW ) 6*3ж=qWV[^^%LĿ^Vqݢpr[汭n7aOܢoz[`o Կpo԰?rҏ( \c^ol>֑EMҵEDt֜w,pI^sW~N/BosoO9];Y"/=~Wo_0Vc7$pg-~>_;qlq†%wИ$?9g0E:N.x~@]MZd'4 `HY(1aL-!sDEc8 (B:,] b-omZz] S)þ]w6ଆ;snXWݠ^KX%.Ffv@ZV :wVou)[Djc[E =G} WѮQ¸gu[EM53ӎiYs XF@u@?u?[ߵ+4Q?[pxڷIkX5kF050r%I=/L$-NYS x-!)A'|fϷbL>6OC1utP{x|XT>C_*O2h{t(x%raHX/2* {Koq"qIe'ͳY5Jԁ+ZŏoH =ެoF*ƾoGqrWĿA9R'e{F=@]Ks$1B :4%H:?ȇL?w}uX|Y?M)@WMR$L߀P#fL4WɆĆu㴷?7GN&Jz_zFѼ9mocɋqRfJ'sǛ'ԅ=A{i4e 2]v\?_z}{0O1NK~'7;&iV;buo9y (e쳲"![M-sw 0뒷#w7YП\-HкMob:M]#g(5:sSukV 1#͓7vdjà ~|6wX'}ΆK6[\j76xn\$zޝ3n՛UVC^t;( fG`u&䄀Ja﫟5什QpB@`H5/~ w{[Z [v.+bA;G|{dpYMUW.5?i?_๶Q_Q2+gAO}haYt6|e΢%MDxzAIV-8#<74MCW~>EF+wA:ʷ#3G?Y>;eR߃ZNk(23/53>v(\KW)vΉ#^0MA 'c^'Ɉ Kmh sxLz6yBǶtfx'/'ƽ8u"`,Y׭[1aO7ͺ5[r:n[}a͔'m,n+d[Wc67ƹ~_Qݡڕ% sLF[ :/7矨O?sEH/S{q>,#H7@R@ϟ&h'Dn+׹i͘P㿥FtI}6kMkѴHfpV pH%~5@俠~:5/I:U;=C I}X9|fo_MQ|Z3@]]S]ߝ|(΁wvU&A+΃4Ǒl7v`~v@jϴ_].%SOþhcJQ#Z~M6R5b`_4DFr}\ !7 s?9JnoVw @*ɺH[ xџi%5t> mgvHQwϿ$` Nca#MC@-QyDtQu` ^Crƿi![No~$IJ;Z|.3^g0~2n;2١tv@Tgۇ2u`@gO Ą**ɫd- {t4~L3ߙTF~wUO^hiT2;8?Pǯup1??8}?۾uܿM_ tۍ}e@+~gЏ'9:%Z^m@fDEJWZ5h3?gcԈ#`sAu#r_{~e eGh _?C}1UGD߽~?ZO_`>y3chtR fO`{S00c<yY:^Y-:n˖s;J2`vzm݋=sǔsνqpes[~Mh߳4gfm?m *HuĆ?o=?k_ X'59#Y) <0U2{U|3{[Θf&̜w8;@Iv&[>.!yd5d6?dcO9HW(-u1:QwNO{^mb8tkUFK^[q~W?-10_wlmPgƿb@Fr^NpdQhH\CD@MO9`{?%{ݳ4CD]riOH!禝$6t"_?{w@W "}oŋfU7tw0wT ,F4BI-gy ӬbzLB7rl}f(zX v k< e_X vI9J8$ 8w5;"h=Ҕy (ʗ:^6P RdԬVm O@D+k;/ |j"ta[{=G*a Y UJ_DU?:5VA ;MTʊp9dzg5uN d~j C c WpF_@"eQ$߽k6 )זڬ`aD(Lhh{??]ؽxBQ0kg[p?H҇p39)e|]α Ci4@Qi}7չ דLx!,ЕL8H]vjW4p`Dz՞M7stb?9zo3Vq~ߑs}lh-h/eE2^ ^2پ Bs7HeY폎_X>Njܑ|ѽip?fFC羣~HH6]>~3M358u(;~3L=3]'@+bG8KF4$_qAopݯ3$bdd X3O@ `JC_-5W$mpLqE6Rf܏5{j1E4x)P)?T+h7 ܻxvoɟ}MTT'H3;djO3#49N01Usk/o%.nw=Q4pju >2si?翟t]h?ҐH|V5 ONuS"y  熑{NzfzM?8@MS#kgY5f[8T$ue~]fn"v ^of~>]+;?O{wC " enG41VA@cI*y8WΘRH a詌7O:#H}u6fjo`)0m ?9C2+>~N{sycJ#՛ T;ڳgya$PC8rO} (ߡY2f=̯^o*J/NRsEUjXsvw/Hu۬1?Mob?cb~l@obLp.Y.꺢g X#@-],=?"ԉ$yY"sEL;/H% 6G}LKB@oCt~Р{/G&ۆys[0`ON4y 31 OHWD.C?۵|™*t0&6G.! Yus]YW$3\Ŀ9 GLkǕY>;_/2C4.~aqߨ [Iᦖ*Vך M:m q 8lSb@_ѿk2ߎK7ƿ DLufpOa]u{ tMQ-{d ֌Gԋpe~5c'Ok @ſ\ ࠟu^~v]J`Wg~w=m-nO6n=Y֚p8&)00f2Nqè3;Ϗՙ\;MO,@ Dsb?oݟUxnt|p72ӞuNjoc6?9Ε/"Q٣Hu 6YJvi] U/mbZy뽘"YN0| OY KH2 : n8k\t~W-kd.83±#}E홑Beޓ>В}poh>0_p#1{ },|2> sW)t@'DFHPR[pPxK\s_^ؖxsOӔ,N/쟹cιHKgnʟ c?cؿ;S~ 3%gnB_gnP uIENDB`./tests/unit_x11/tst_iconprovider/icons/mockTheme/index.theme0000644000015600001650000000035012700370714024465 0ustar jenkinsjenkins[Icon Theme] Name=MockTheme Inherits=mockTheme2,mockTheme3 Directories=actions/scalable,apps/512 [actions/scalable] MinSize=9 Size=90 MaxSize=256 Context=Actions Type=Scalable [apps/512] Size=512 Context=Applications Type=Fixed ./tests/unit_x11/tst_iconprovider/icons/mockTheme/actions/0000755000015600001650000000000012700370701023770 5ustar jenkinsjenkins./tests/unit_x11/tst_iconprovider/icons/mockTheme/actions/scalable/0000755000015600001650000000000012700370701025536 5ustar jenkinsjenkins./tests/unit_x11/tst_iconprovider/icons/mockTheme/actions/scalable/battery-100-charging.svg0000644000015600001650000000324612700370701032014 0ustar jenkinsjenkins image/svg+xml ./tests/unit_x11/tst_iconprovider/icons/hicolor/0000755000015600001650000000000012700370714022057 5ustar jenkinsjenkins./tests/unit_x11/tst_iconprovider/icons/hicolor/apps/0000755000015600001650000000000012700370714023022 5ustar jenkinsjenkins./tests/unit_x11/tst_iconprovider/icons/hicolor/apps/512/0000755000015600001650000000000012700370716023333 5ustar jenkinsjenkins./tests/unit_x11/tst_iconprovider/icons/hicolor/apps/512/myapp.png0000644000015600001650000000427312700370714025173 0ustar jenkinsjenkinsPNG  IHDRxsBIT|d pHYs+]IDATx1 & zv e3d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A.|yBPIENDB`./tests/unit_x11/tst_iconprovider/icons/hicolor/apps/512/myapp2.png0000644000015600001650000000427312700370714025255 0ustar jenkinsjenkinsPNG  IHDRxsBIT|d pHYs+]IDATx1 & zv e3d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A 2d @ A.|yBPIENDB`./tests/unit_x11/tst_iconprovider/icons/hicolor/index.theme0000644000015600001650000000015112700370714024207 0ustar jenkinsjenkins[Icon Theme] Name=MockTheme3 Directories=apps/512 [apps/512] Size=512 Context=Applications Type=Fixed ./tests/unit_x11/tst_iconprovider/icons/mockTheme2/0000755000015600001650000000000012700370716022420 5ustar jenkinsjenkins./tests/unit_x11/tst_iconprovider/icons/mockTheme2/index.theme0000644000015600001650000000005612700370714024552 0ustar jenkinsjenkins[Icon Theme] Name=MockTheme2 Inherits=hicolor ./tests/unit_x11/tst_iconprovider/tst_iconprovider.pro0000644000015600001650000000014512700370701023420 0ustar jenkinsjenkinsinclude(../test-include.pri) DEFINES += SRCDIR=\\\"$$PWD/\\\" SOURCES += \ tst_iconprovider.cpp ./tests/unit_x11/tst_page/0000755000015600001650000000000012700370701015512 5ustar jenkinsjenkins./tests/unit_x11/tst_page/tst_page.pro0000644000015600001650000000014712700370701020044 0ustar jenkinsjenkinsinclude(../test-include.pri) QT += gui SOURCES += tst_page.cpp OTHER_FILES += $$system(ls tst_*.qml) ./tests/unit_x11/tst_page/tst_page.cpp0000644000015600001650000000251512700370701020027 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #include #include #include #include #include #include #include "uctestcase.h" class tst_Page : public QObject { Q_OBJECT private: QQuickView *view; public: tst_Page() : view(0) { } private Q_SLOTS: void initTestCase() { } void cleanupTestCase() { } void testAnchorToPage_bug1249386() { QScopedPointer testCase(new UbuntuTestCase("AnchorToPage.qml")); QCOMPARE(testCase->warnings(), 0); } }; QTEST_MAIN(tst_Page) #include "tst_page.moc" ./tests/unit_x11/tst_page/AnchorToPage.qml0000644000015600001650000000156312700370701020544 0ustar jenkinsjenkins/* * Copyright (C) 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { width: units.gu(20) height: units.gu(40) Page { id: page Rectangle { color: "red" anchors.fill: page } } } ./tests/unit_x11/layout_dependency.pri0000644000015600001650000000043712700370701020137 0ustar jenkinsjenkinsLAYOUT_SRC = $$PWD/../../src/Ubuntu/Layouts LAYOUT_BLD = $$shadowed($$PWD)/../../qml/Ubuntu/Layouts INCLUDEPATH += $$LAYOUT_SRC/plugin PRE_TARGETDEPS = $$LAYOUT_BLD/libUbuntuLayouts.so LIBS += -L$$LAYOUT_BLD -lUbuntuLayouts DEFINES += QUICK_TEST_SOURCE_DIR=\"\\\"$$_PRO_FILE_PWD_\\\"\" ./tests/unit_x11/tst_bottomedge/0000755000015600001650000000000012700370716016735 5ustar jenkinsjenkins./tests/unit_x11/tst_bottomedge/LeanActiveRegionChange.qml0000644000015600001650000000225212700370701023730 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: holder width: units.gu(40) height: units.gu(71) BottomEdge { id: bottomEdge hint.text: "Test" objectName: "testItem" contentComponent: Rectangle { width: bottomEdge.width height: bottomEdge.height color: UbuntuColors.silk } BottomEdgeRegion { from: 0.2 to: 0.5 } BottomEdgeRegion { from: 0.5 to: 0.7 } } } ./tests/unit_x11/tst_bottomedge/tst_bottomedge.cpp0000644000015600001650000012013312700370714022462 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include "ucbottomedge.h" #include "ucbottomedgeregion.h" #include "ucbottomedgeregion_p.h" #include "ucbottomedge_p.h" #include "ucbottomedgehint.h" #include "private/ucswipearea_p.h" #include "ucunits.h" #include "ucheader.h" #include "ucaction.h" #include "uctestcase.h" #include "uctestextras.h" #define private public #include "quickutils.h" #include "ucbottomedgestyle.h" #undef private Q_DECLARE_METATYPE(Qt::Key) #define QVERIFY_RETURN(statement, returnValue) \ do {\ if (!QTest::qVerify((statement), #statement, "", __FILE__, __LINE__))\ return returnValue;\ } while (0) class BottomEdgeTestCase : public UbuntuTestCase { Q_OBJECT public: BottomEdgeTestCase(const QString& file, ResizeMode resize = SizeViewToRootObject, bool assertOnFailure = true, QWindow* parent = 0) : UbuntuTestCase(file, resize, assertOnFailure, parent) { // make sure we disable the mouse QuickUtils::instance()->m_mouseAttached = false; // patch all BottomEdges' SwipeArea gesture recognition timer QList list = findChildren(); for (int i = 0; i < list.size(); ++i) { UCBottomEdge *bottomEdge = list[i]; UCSwipeArea *swipeArea = bottomEdge->hint()->swipeArea(); swipeArea->setImmediateRecognition(true); } } ~BottomEdgeTestCase() { // add a small timeout after each run to have a proper cleanup QTest::qWait(400); } UCBottomEdge *testItem(const QString &objectName = "testItem") { return findItem(objectName); } typedef QList RegionList; RegionList *regions(const QString &testItem) { QQmlListProperty qmlRegions(this->testItem(testItem)->regions()); return reinterpret_cast(qmlRegions.data); } UCBottomEdgeRegion *regionAt(const QString &testItem, int index) { QVERIFY_RETURN(regions(testItem), nullptr); QVERIFY_RETURN(regions(testItem)->size() > index, nullptr); return regions(testItem)->at(index); } bool hasContentAutoCollapse(const QString &testItem = "testItem") { UCBottomEdge *bottomEdge = this->testItem(testItem); QQuickItem *contentItem = bottomEdge->contentItem(); if (!contentItem) { return false; } // we do not have the PageHeader in cpp, therefore we need the same workaround we have in the code UCHeader *header = contentItem->findChild(); if (!QuickUtils::inherits(header, "PageHeader")) { return false; } QVariant list(header->property("navigationActions")); QQmlListProperty actions = list.value< QQmlListProperty >(); QList *navigationActions = reinterpret_cast*>(actions.data); if (navigationActions->size() <= 0) { return false; } return (qobject_cast(navigationActions->at(0)) != Q_NULLPTR); } void guToPoints(QList &guMoves) { for (int i = 0; i < guMoves.size(); i++) { guMoves[i] = QPointF(UCUnits::instance()->gu(guMoves[i].x()), UCUnits::instance()->gu(guMoves[i].y())).toPoint(); } } }; class tst_BottomEdge : public QObject { Q_OBJECT QStringList regionObjects; private Q_SLOTS: void initTestCase() { UCTestExtras::registerTouchDevice(); } void init() { regionObjects.clear(); } private Q_SLOTS: void test_defaults() { QScopedPointer test(new BottomEdgeTestCase("Defaults.qml")); QCOMPARE(test->testItem()->height(), test->rootObject()->height()); QCOMPARE(test->testItem()->dragProgress(), 0.0); QCOMPARE(test->testItem()->dragDirection(), UCBottomEdge::Undefined); QCOMPARE(test->testItem()->status(), UCBottomEdge::Hidden); QCOMPARE(test->testItem()->contentUrl(), QUrl()); QVERIFY(!test->testItem()->contentComponent()); QVERIFY(!test->testItem()->contentItem()); QVERIFY(test->regions("testItem")); QCOMPARE(test->regions("testItem")->size(), 1); QCOMPARE(test->regionAt("testItem", 0)->objectName(), QString("default_BottomEdgeRegion")); QCOMPARE(UCBottomEdgeRegionPrivate::get(test->regionAt("testItem", 0))->from, 0.0); QCOMPARE(UCBottomEdgeRegionPrivate::get(test->regionAt("testItem", 0))->to, 1.0); QVERIFY(!test->testItem()->activeRegion()); QVERIFY(!test->testItem()->preloadContent()); } void test_height_moves_when_reparented() { QScopedPointer test(new BottomEdgeTestCase("DifferentSizes.qml")); QQuickItem *newParent = test->rootObject(); QQuickItem *oldParent = test->findItem("oldParent"); UCBottomEdge *testItem = test->testItem(); QSignalSpy spy(testItem, SIGNAL(implicitHeightChanged())); testItem->setParentItem(newParent); UbuntuTestCase::waitForSignal(&spy); // change the implicit height so we are sure we don't get the height change triggered testItem->setImplicitHeight(0); spy.clear(); oldParent->setHeight(20); QEXPECT_FAIL(0, "no implicitHeight change is expected", Continue); QVERIFY(spy.wait(400)); } void test_panel_is_last_item_of_parent() { QScopedPointer test(new BottomEdgeTestCase("LastItem.qml")); QQuickItem *bottomEdgeParent = test->testItem()->parentItem(); UCBottomEdgePrivate *privateTestItem = UCBottomEdgePrivate::get(test->testItem()); QCOMPARE(bottomEdgeParent->childItems().last(), privateTestItem->styleItem); QQuickItem *dynamicItem = test->findItem("dynamicItem"); dynamicItem->setParentItem(bottomEdgeParent); // still the last one QCOMPARE(bottomEdgeParent->childItems().last(), privateTestItem->styleItem); } void test_commit_when_clicked() { QScopedPointer test(new BottomEdgeTestCase("BottomEdgeInItem.qml")); test->testItem()->hint()->setStatus(UCBottomEdgeHint::Locked); UCBottomEdgeHint *hint = test->testItem()->hint(); QTest::mouseClick(test->testItem()->hint()->window(), Qt::LeftButton, 0, UbuntuTestCase::centerOf(hint, true).toPoint()); QTRY_COMPARE_WITH_TIMEOUT(test->testItem()->status(), UCBottomEdge::Committed, 1000); } void test_commit_when_touch_clicked() { QScopedPointer test(new BottomEdgeTestCase("BottomEdgeInItem.qml")); UCBottomEdgeHint *hint = test->testItem()->hint(); // swipe a bit to reveal UCTestExtras::touchDrag(0, hint, QPoint(hint->width() / 2, hint->height()), QPoint(0, -hint->height())); QTRY_COMPARE_WITH_TIMEOUT(hint->status(), UCBottomEdgeHint::Active, 1000); UCTestExtras::touchClick(0, hint, UbuntuTestCase::centerOf(hint).toPoint()); QTRY_COMPARE_WITH_TIMEOUT(test->testItem()->status(), UCBottomEdge::Committed, 1000); } void test_overridden_triggers_bug1524234() { QScopedPointer test(new BottomEdgeTestCase("OverriddenHintTrigger.qml")); test->testItem()->hint()->setStatus(UCBottomEdgeHint::Locked); UCBottomEdgeHint *hint = test->testItem()->hint(); UCAction *action = hint->action(); QSignalSpy actionSpy(action, SIGNAL(triggered(QVariant))); QSignalSpy hintSpy(hint, SIGNAL(triggered(QVariant))); QTest::mouseClick(test->testItem()->hint()->window(), Qt::LeftButton, 0, UbuntuTestCase::centerOf(hint, true).toPoint()); QTRY_COMPARE_WITH_TIMEOUT(test->testItem()->status(), UCBottomEdge::Committed, 1000); QCOMPARE(actionSpy.count(), 0); QCOMPARE(hintSpy.count(), 1); } void test_revealed_when_hint_threshold_passed_data() { QTest::addColumn("withMouse"); QTest::addColumn("lockHint"); QTest::addColumn("xfail"); QTest::newRow("drag with mouse, unlocked hint") << true << false << true; QTest::newRow("drag with mouse, locked hint") << true << true << false; QTest::newRow("drag with touch, unlocked hint") << false << false << false; QTest::newRow("drag with touch, locked hint") << false << true << false; } void test_revealed_when_hint_threshold_passed() { QFETCH(bool, withMouse); QFETCH(bool, lockHint); QFETCH(bool, xfail); QScopedPointer test(new BottomEdgeTestCase("BottomEdgeInItem.qml")); UCBottomEdge *bottomEdge = test->testItem(); UCBottomEdgeStyle *style = UCBottomEdgePrivate::get(bottomEdge)->bottomPanel; QSignalSpy spy(bottomEdge, SIGNAL(statusChanged(UCBottomEdge::Status))); // swipe till we reveal it QPoint from(bottomEdge->width() / 2.0f, bottomEdge->height() - 1); QPoint delta(0, -(2 * style->m_revealThreshold)); if (lockHint) { bottomEdge->hint()->setStatus(UCBottomEdgeHint::Locked); } if (withMouse) { UCTestExtras::mouseDrag(bottomEdge, from, delta, Qt::LeftButton); } else { UCTestExtras::touchDrag(0, bottomEdge, from, delta, 8); } if (xfail) { QEXPECT_FAIL(0, "failure expected", Continue); } QVERIFY(spy.wait(500)); if (xfail) { QCOMPARE(spy.count(), 0); } else { // there must be two state changes here, one Hidden->Revealed, and one Revealed->Hidden QCOMPARE(spy.count(), 2); QList state1 = spy.at(0); QCOMPARE(state1[0].value(), (int)UCBottomEdge::Revealed); QList state2 = spy.at(1); QCOMPARE(state2[0].value(), (int)UCBottomEdge::Hidden); } } void test_commit_when_onethird_passed_data() { QTest::addColumn("withMouse"); QTest::newRow("with mouse") << true; QTest::newRow("with touch") << false; } void test_commit_when_onethird_passed() { QFETCH(bool, withMouse); QScopedPointer test(new BottomEdgeTestCase("BottomEdgeInItem.qml")); UCBottomEdge *bottomEdge = test->testItem(); QPoint from(bottomEdge->width() / 2.0f, bottomEdge->height() - 1); // add some extra space for the touch QPoint delta(0, -(bottomEdge->height() / 3 + UCUnits::instance()->gu(6))); if (withMouse) { bottomEdge->hint()->setStatus(UCBottomEdgeHint::Locked); } // we need to do the swipe in more steps if (withMouse) { UCTestExtras::mouseDrag(bottomEdge, from, delta, Qt::LeftButton, 0, 20); } else { UCTestExtras::touchDrag(0, bottomEdge, from, delta, 20); } QTRY_COMPARE_WITH_TIMEOUT(bottomEdge->status(), UCBottomEdge::Committed, 1000); } void test_collapse_before_onethird_data() { QTest::addColumn("withMouse"); QTest::newRow("with mouse") << true; QTest::newRow("with touch") << false; } void test_collapse_before_onethird() { QFETCH(bool, withMouse); QScopedPointer test(new BottomEdgeTestCase("BottomEdgeInItem.qml")); UCBottomEdge *bottomEdge = test->testItem(); QPoint from(bottomEdge->width() / 2.0f, bottomEdge->height() - 1); QPoint delta(0, -(bottomEdge->height() / 4)); if (withMouse) { bottomEdge->hint()->setStatus(UCBottomEdgeHint::Locked); } // we need to do the swipe in more steps if (withMouse) { UCTestExtras::mouseDrag(bottomEdge, from, delta, Qt::LeftButton, 0, 20); } else { UCTestExtras::touchDrag(0, bottomEdge, from, delta, 20); } QTRY_COMPARE_WITH_TIMEOUT(bottomEdge->status(), UCBottomEdge::Hidden, 1000); } void test_collapse_when_dragged_downwards_data() { // when onethird not passed // when onethird was passed QTest::addColumn("withMouse"); QTest::addColumn< QList >("moves"); QList shortPath, longPath; // upwards for (int i = 0; i < 10; i++) { shortPath << QPoint(0, -3); longPath << QPoint(0, -7); } // downwards for (int i = 0; i < 5; i++) { shortPath << QPoint(0, 2); longPath << QPoint(0, 2); } QTest::newRow("with mouse, onethird not passed") << true << shortPath; QTest::newRow("with touch, onethird not passed") << false << shortPath; QTest::newRow("with mouse, onethird passed") << true << longPath; QTest::newRow("with touch, onethird passed") << false << longPath; } void test_collapse_when_dragged_downwards() { QFETCH(bool, withMouse); QFETCH(QList, moves); QScopedPointer test(new BottomEdgeTestCase("BottomEdgeInItem.qml")); UCBottomEdge *bottomEdge = test->testItem(); test->guToPoints(moves); QPoint from(bottomEdge->width() / 2.0f, bottomEdge->height() - 1); moves.prepend(from); if (withMouse) { bottomEdge->hint()->setStatus(UCBottomEdgeHint::Locked); } if (withMouse) { UCTestExtras::mouseDragWithPoints(bottomEdge, moves, Qt::LeftButton); } else { UCTestExtras::touchDragWithPoints(0, bottomEdge, moves); } QTRY_COMPARE_WITH_TIMEOUT(bottomEdge->status(), UCBottomEdge::Hidden, 1000); } void test_height_less_than_parent() { QScopedPointer test(new BottomEdgeTestCase("ShorterBottomEdge.qml")); UCBottomEdge *bottomEdge = test->testItem(); UCBottomEdgeStyle *style = UCBottomEdgePrivate::get(bottomEdge)->bottomPanel; bottomEdge->commit(); QTRY_COMPARE_WITH_TIMEOUT(bottomEdge->status(), UCBottomEdge::Committed, 1000); QCOMPARE(style->m_panel->y(), bottomEdge->y()); } void test_do_not_overshoot_data() { QTest::addColumn("withMouse"); QTest::newRow("with touch") << false; QTest::newRow("with mouse") << true; } void test_do_not_overshoot() { QFETCH(bool, withMouse); QScopedPointer test(new BottomEdgeTestCase("ShorterBottomEdge.qml")); UCBottomEdge *bottomEdge = test->testItem(); UCBottomEdgeStyle *style = UCBottomEdgePrivate::get(bottomEdge)->bottomPanel; QPoint from(bottomEdge->width() / 2.0f, bottomEdge->height() - 1); QPoint to = from + QPoint(0, -(bottomEdge->parentItem()->height() - 1)); if (withMouse) { bottomEdge->hint()->setStatus(UCBottomEdgeHint::Locked); from = bottomEdge->mapToScene(from).toPoint(); to = bottomEdge->mapToScene(to).toPoint(); QTest::mousePress(bottomEdge->window(), Qt::LeftButton, 0, from, 20); QPoint movePos(from); while (movePos.y() > to.y()) { QTest::mouseMove(bottomEdge->window(), movePos, 20); movePos += QPoint(0, -10); QVERIFY(style->m_panel->y() >= bottomEdge->y()); } QTest::mouseRelease(bottomEdge->window(),Qt::LeftButton, 0, movePos, 20); } else { UCTestExtras::touchPress(0, bottomEdge, from); QPoint movePos(from); while (movePos.y() > to.y()) { QTest::qWait(20); UCTestExtras::touchMove(0, bottomEdge, movePos); movePos += QPoint(0, -10); QVERIFY(style->m_panel->y() >= bottomEdge->y()); } QTest::qWait(20); UCTestExtras::touchRelease(0, bottomEdge, movePos); } } void test_commitStarted_commitCompleted_emitted() { QScopedPointer test(new BottomEdgeTestCase("BottomEdgeInItem.qml")); UCBottomEdge *bottomEdge = test->testItem(); QSignalSpy commitStartedSpy(bottomEdge, SIGNAL(commitStarted())); QSignalSpy commitCompletedSpy(bottomEdge, SIGNAL(commitCompleted())); bottomEdge->commit(); QTRY_COMPARE_WITH_TIMEOUT(commitStartedSpy.count(), 1, 1000); QTRY_COMPARE_WITH_TIMEOUT(commitCompletedSpy.count(), 1, 1000); } void test_collapseStarted_collapseCompleted_emitted() { QScopedPointer test(new BottomEdgeTestCase("BottomEdgeInItem.qml")); UCBottomEdge *bottomEdge = test->testItem(); bottomEdge->commit(); QTRY_COMPARE_WITH_TIMEOUT(bottomEdge->status(), UCBottomEdge::Committed, 1000); // wait few milliseconds before we initiate collapse QTest::qWait(200); QSignalSpy collapseStartedSpy(bottomEdge, SIGNAL(collapseStarted())); QSignalSpy collapseCompletedSpy(bottomEdge, SIGNAL(collapseCompleted())); bottomEdge->collapse(); QTRY_COMPARE_WITH_TIMEOUT(collapseStartedSpy.count(), 1, 1000); QTRY_COMPARE_WITH_TIMEOUT(collapseCompletedSpy.count(), 1, 1000); } void test_collapse_during_commit() { QScopedPointer test(new BottomEdgeTestCase("BottomEdgeInItem.qml")); UCBottomEdge *bottomEdge = test->testItem(); QSignalSpy commitStartedSpy(bottomEdge, SIGNAL(commitStarted())); QSignalSpy commitCompletedSpy(bottomEdge, SIGNAL(commitCompleted())); QSignalSpy collapseStartedSpy(bottomEdge, SIGNAL(collapseStarted())); QSignalSpy collapseCompletedSpy(bottomEdge, SIGNAL(collapseCompleted())); connect(bottomEdge, SIGNAL(commitStarted()), bottomEdge, SLOT(collapse()), Qt::QueuedConnection); bottomEdge->commit(); QTRY_COMPARE_WITH_TIMEOUT(commitStartedSpy.count(), 1, 1000); QTRY_COMPARE_WITH_TIMEOUT(commitCompletedSpy.count(), 0, 1000); QTRY_COMPARE_WITH_TIMEOUT(collapseStartedSpy.count(), 1, 1000); QTRY_COMPARE_WITH_TIMEOUT(collapseCompletedSpy.count(), 1, 1000); } void test_commit_during_collapse() { QScopedPointer test(new BottomEdgeTestCase("BottomEdgeInItem.qml")); UCBottomEdge *bottomEdge = test->testItem(); bottomEdge->commit(); QSignalSpy commitStartedSpy(bottomEdge, SIGNAL(commitStarted())); QSignalSpy commitCompletedSpy(bottomEdge, SIGNAL(commitCompleted())); QSignalSpy collapseStartedSpy(bottomEdge, SIGNAL(collapseStarted())); QSignalSpy collapseCompletedSpy(bottomEdge, SIGNAL(collapseCompleted())); connect(bottomEdge, SIGNAL(collapseStarted()), bottomEdge, SLOT(commit()), Qt::QueuedConnection); bottomEdge->collapse(); QTRY_COMPARE_WITH_TIMEOUT(collapseStartedSpy.count(), 1, 1000); QTRY_COMPARE_WITH_TIMEOUT(collapseCompletedSpy.count(), 0, 1000); QTRY_COMPARE_WITH_TIMEOUT(commitStartedSpy.count(), 1, 1000); QTRY_COMPARE_WITH_TIMEOUT(commitCompletedSpy.count(), 1, 1000); } // region tests void test_region_operations_data() { QTest::addColumn("document"); QTest::addColumn("warning"); QTest::addColumn("xFrom"); QTest::addColumn("xTo"); QTest::addColumn("xName"); QTest::newRow("add through regions property") << "AddCustomRegionUsingRegionsProperty.qml" << QString() << 0.0 << 1.0 << QString("customRegion"); QTest::newRow("add through data property") << "AddCustomRegionUsingDataProperty.qml" << QString() << 0.0 << 1.0 << QString("customRegion"); QTest::newRow("add through Component.onCompleted") << "AddCustomRegionOnCompleted.qml" << QString() << 0.0 << 1.0 << QString("customRegion"); QTest::newRow("add owned by other BottomEdge") << "AddCustomRegionOwnedByOtherBottomEdge.qml" << "QML BottomEdge: Cannot reuse region owned by other BottomEdge components" // we should have the default region still << 0.0 << 1.0 << "default_BottomEdgeRegion"; QTest::newRow("clear") << "ClearCustomRegions.qml" << QString() // we should have the default region back << 0.0 << 1.0 << "default_BottomEdgeRegion"; } void test_region_operations() { QFETCH(QString, document); QFETCH(QString, warning); QFETCH(qreal, xFrom); QFETCH(qreal, xTo); QFETCH(QString, xName); if (!warning.isEmpty()) { UbuntuTestCase::ignoreWarning(document, 26, 5, warning, 1); } QScopedPointer test(new BottomEdgeTestCase(document)); UCBottomEdge *bottomEdge = test->testItem(); UCBottomEdgePrivate *privateBottomEdge = UCBottomEdgePrivate::get(bottomEdge); // the regions has the custom one QCOMPARE(privateBottomEdge->regions.size(), 1); UCBottomEdgeRegion *region = privateBottomEdge->regions[0]; QVERIFY(region); QCOMPARE(UCBottomEdgeRegionPrivate::get(region)->from, xFrom); QCOMPARE(UCBottomEdgeRegionPrivate::get(region)->to, xTo); QCOMPARE(region->objectName(), xName); } void test_active_region_changes() { QScopedPointer test(new BottomEdgeTestCase("LeanActiveRegionChange.qml")); UCBottomEdge *bottomEdge = test->testItem(); QPoint from(bottomEdge->width() / 2.0f, bottomEdge->height() - 5); QPoint to = from + QPoint(0, -(bottomEdge->parentItem()->height() - 1)); QSignalSpy spy(bottomEdge, SIGNAL(activeRegionChanged(UCBottomEdgeRegion*))); UCTestExtras::touchPress(0, bottomEdge, from); QPoint movePos(from); while (movePos.y() > to.y()) { QTest::qWait(20); UCTestExtras::touchMove(0, bottomEdge, movePos); movePos += QPoint(0, -10); } QTest::qWait(20); UCTestExtras::touchRelease(0, bottomEdge, movePos); // we should have had 4 active region changes by now // null -> defaultRegion -> region #0 -> region #1 -> defaultRegion QCOMPARE(spy.count(), 4); } void test_region_signals_emitted_data() { QTest::addColumn("withMouse"); QTest::newRow("with mouse") << true; QTest::newRow("with touch") << false; } void test_region_signals_emitted() { QFETCH(bool, withMouse); QScopedPointer test(new BottomEdgeTestCase("BottomEdgeInItem.qml")); UCBottomEdge *bottomEdge = test->testItem(); UCBottomEdgePrivate *privateBottomEdge = UCBottomEdgePrivate::get(bottomEdge); UCBottomEdgeRegion *region = privateBottomEdge->regions[0]; // change the region so we can get the signals while dragged UCBottomEdgeRegionPrivate::get(region)->from = 0.1; UCBottomEdgeRegionPrivate::get(region)->to = 0.2; QPoint from(bottomEdge->width() / 2.0f, bottomEdge->height() - 5); QPoint delta(0, -(bottomEdge->height() / 3 + UCUnits::instance()->gu(6))); QSignalSpy entered(region, SIGNAL(entered())); QSignalSpy exited(region, SIGNAL(exited())); if (withMouse) { bottomEdge->hint()->setStatus(UCBottomEdgeHint::Locked); } if (withMouse) { UCTestExtras::mouseDrag(bottomEdge, from, delta, Qt::LeftButton, 0); } else { UCTestExtras::touchDrag(0, bottomEdge, from, delta); } QTRY_COMPARE_WITH_TIMEOUT(entered.count(), 1, 500); // exit should not be emitted as the region is not left when committed QTRY_COMPARE_WITH_TIMEOUT(exited.count(), 0, 500); } void test_region_dragEnded_emitted_data() { QTest::addColumn("withMouse"); QTest::newRow("with mouse") << true; QTest::newRow("with touch") << false; } void test_region_dragEnded_emitted() { QFETCH(bool, withMouse); QScopedPointer test(new BottomEdgeTestCase("BottomEdgeInItem.qml")); UCBottomEdge *bottomEdge = test->testItem(); UCBottomEdgePrivate *privateBottomEdge = UCBottomEdgePrivate::get(bottomEdge); UCBottomEdgeRegion *region = privateBottomEdge->regions[0]; QSignalSpy dragEnded(region, SIGNAL(dragEnded())); QPoint from(bottomEdge->width() / 2.0f, bottomEdge->height() - 5); QPoint delta(0, -(bottomEdge->height() / 2.0f)); if (withMouse) { bottomEdge->hint()->setStatus(UCBottomEdgeHint::Locked); UCTestExtras::mouseDrag(bottomEdge, from, delta, Qt::LeftButton, 0); } else { UCTestExtras::touchDrag(0, bottomEdge, from, delta); } UbuntuTestCase::waitForSignal(&dragEnded); } void test_alternative_content_for_default_commit_region() { QScopedPointer test(new BottomEdgeTestCase("AlternateDefaultRegionContent.qml")); UCBottomEdge *bottomEdge = test->testItem(); QPoint from(bottomEdge->width() / 2.0f, bottomEdge->height() - 5); QPoint delta(0, -(bottomEdge->height() / 2)); UCTestExtras::touchDrag(0, bottomEdge, from, delta, 20); QTRY_COMPARE_WITH_TIMEOUT(bottomEdge->status(), UCBottomEdge::Committed, 1000); QCOMPARE(bottomEdge->contentItem()->objectName(), QString("regionContent")); } void test_end_drag_in_region_commits_to_the_region_data() { QTest::addColumn("withMouse"); QTest::newRow("with mouse") << true; QTest::newRow("with touch") << false; } void test_end_drag_in_region_commits_to_the_region() { QFETCH(bool, withMouse); QScopedPointer test(new BottomEdgeTestCase("AlternateDefaultRegionContent.qml")); UCBottomEdge *bottomEdge = test->testItem(); UCBottomEdgePrivate *privateBottomEdge = UCBottomEdgePrivate::get(bottomEdge); UCBottomEdgeRegion *region = privateBottomEdge->regions[0]; UCBottomEdgeStyle *style = UCBottomEdgePrivate::get(bottomEdge)->bottomPanel; // alter default region for testing UCBottomEdgeRegionPrivate::get(region)->to = 0.6; QPoint from(bottomEdge->width() / 2.0f, bottomEdge->height() - 5); QPoint delta(0, -(bottomEdge->height() / 2)); if (withMouse) { bottomEdge->hint()->setStatus(UCBottomEdgeHint::Locked); UCTestExtras::mouseDrag(bottomEdge, from, delta, Qt::LeftButton, 0); } else { UCTestExtras::touchDrag(0, bottomEdge, from, delta, 20); } QTRY_COMPARE_WITH_TIMEOUT(bottomEdge->status(), UCBottomEdge::Committed, 1000); QCOMPARE(bottomEdge->activeRegion(), region); // the top of the committed content should not be the top of the bottom edge QVERIFY(style->m_panel->y() > bottomEdge->y()); } void test_drag_ends_in_uncovered_region_collapses_data() { QTest::addColumn("withMouse"); QTest::newRow("with mouse") << true; QTest::newRow("with touch") << false; } void test_drag_ends_in_uncovered_region_collapses() { QFETCH(bool, withMouse); QScopedPointer test(new BottomEdgeTestCase("UncoveredByRegion.qml")); UCBottomEdge *bottomEdge = test->testItem(); UCBottomEdgePrivate *privateBottomEdge = UCBottomEdgePrivate::get(bottomEdge); UCBottomEdgeRegion *region = privateBottomEdge->regions[0]; QPoint from(bottomEdge->width() / 2.0f, bottomEdge->height() - 1); QPoint to = from + QPoint(0, -(bottomEdge->parentItem()->height() - UCUnits::instance()->gu(10))); // let us know when we are out of the region QSignalSpy exitRegion(region, SIGNAL(exited())); if (withMouse) { bottomEdge->hint()->setStatus(UCBottomEdgeHint::Locked); from = bottomEdge->mapToScene(from).toPoint(); to = bottomEdge->mapToScene(to).toPoint(); QTest::mousePress(bottomEdge->window(), Qt::LeftButton, 0, from, 20); QPoint movePos(from); while (movePos.y() > to.y()) { QTest::mouseMove(bottomEdge->window(), movePos, 20); movePos += QPoint(0, -20); } movePos -= QPoint(0, -20); QTest::mouseRelease(bottomEdge->window(),Qt::LeftButton, 0, movePos, 20); } else { UCTestExtras::touchPress(0, bottomEdge, from); QPoint movePos(from); while (movePos.y() > to.y()) { QTest::qWait(20); UCTestExtras::touchMove(0, bottomEdge, movePos); movePos += QPoint(0, -20); } movePos -= QPoint(0, -20); QTest::qWait(20); UCTestExtras::touchRelease(0, bottomEdge, movePos); } // we should be collapsing! QTRY_COMPARE_WITH_TIMEOUT(bottomEdge->status(), UCBottomEdge::Committed, 1000); } void test_commit_region_content_data() { QTest::addColumn("withMouse"); QTest::newRow("with mouse") << true; QTest::newRow("with touch") << false; } void test_commit_region_content() { QFETCH(bool, withMouse); QScopedPointer test(new BottomEdgeTestCase("AlternateRegionContent.qml")); UCBottomEdge *bottomEdge = test->testItem(); UCBottomEdgePrivate *privateBottomEdge = UCBottomEdgePrivate::get(bottomEdge); UCBottomEdgeRegion *region = privateBottomEdge->regions[0]; // alter region for testing UCBottomEdgeRegionPrivate::get(region)->from = 0.1; UCBottomEdgeRegionPrivate::get(region)->to = 0.8; // and connect commit to dragEnded connect(region, &UCBottomEdgeRegion::dragEnded, bottomEdge, &UCBottomEdge::commit); QPoint from(bottomEdge->width() / 2.0f, bottomEdge->height() - 5); QPoint to = from + QPoint(0, -(bottomEdge->parentItem()->height() - 1)); if (withMouse) { bottomEdge->hint()->setStatus(UCBottomEdgeHint::Locked); from = bottomEdge->mapToScene(from).toPoint(); to = bottomEdge->mapToScene(to).toPoint(); QTest::mousePress(bottomEdge->window(), Qt::LeftButton, 0, from, 20); QPoint movePos(from); while (movePos.y() > to.y() && (bottomEdge->activeRegion() != region)) { QTest::mouseMove(bottomEdge->window(), movePos, 20); movePos += QPoint(0, -10); } QTest::mouseRelease(bottomEdge->window(),Qt::LeftButton, 0, movePos, 20); } else { UCTestExtras::touchPress(0, bottomEdge, from); QPoint movePos(from); while (movePos.y() > to.y() && (bottomEdge->activeRegion() != region)) { QTest::qWait(20); UCTestExtras::touchMove(0, bottomEdge, movePos); movePos += QPoint(0, -10); } QTest::qWait(20); UCTestExtras::touchRelease(0, bottomEdge, movePos); } QTRY_COMPARE_WITH_TIMEOUT(bottomEdge->status(), UCBottomEdge::Committed, 1000); QCOMPARE(bottomEdge->contentItem()->objectName(), QString("regionContent")); } void test_overlapping_regions() { QString document("OverlappingRegions.qml"); UbuntuTestCase::ignoreWarning(document, 34, 9, "QML BottomEdgeRegion: Region intersects the one from index 0 having from: 0.2 and to: 0.5", 1); UbuntuTestCase::ignoreWarning(document, 37, 9, "QML BottomEdgeRegion: Region intersects the one from index 0 having from: 0.2 and to: 0.5", 1); UbuntuTestCase::ignoreWarning(document, 37, 9, "QML BottomEdgeRegion: Region at index 1 contains this region. This region will never activate.", 1); UbuntuTestCase::ignoreWarning(document, 41, 9, "QML BottomEdgeRegion: Region at index 1 contains this region. This region will never activate.", 1); QScopedPointer test(new BottomEdgeTestCase(document)); } void test_region_does_not_activate_when_from_greater_than_to_data() { QTest::addColumn("withMouse"); QTest::newRow("with mouse") << true; QTest::newRow("with touch") << false; } void test_region_does_not_activate_when_from_greater_than_to() { QFETCH(bool, withMouse); QScopedPointer test(new BottomEdgeTestCase("AlternateRegionContent.qml")); UCBottomEdge *bottomEdge = test->testItem(); UCBottomEdgePrivate *privateBottomEdge = UCBottomEdgePrivate::get(bottomEdge); UCBottomEdgeRegion *region = privateBottomEdge->regions[0]; // adjust region data for the test UCBottomEdgeRegionPrivate::get(region)->from = 0.4; UCBottomEdgeRegionPrivate::get(region)->to = 0.2; QPoint from(bottomEdge->width() / 2.0f, bottomEdge->height() - 5); QPoint delta(0, -(bottomEdge->height() / 2.0f)); QSignalSpy activeRegion(bottomEdge, SIGNAL(activeRegionChanged(UCBottomEdgeRegion*))); if (withMouse) { bottomEdge->hint()->setStatus(UCBottomEdgeHint::Locked); UCTestExtras::mouseDrag(bottomEdge, from, delta, Qt::LeftButton, 0, 10); } else { UCTestExtras::touchDrag(0, bottomEdge, from, delta, 10); } QEXPECT_FAIL(0, "region should not activate", Continue); QVERIFY(activeRegion.wait(400)); } void test_autocollapse_navigation_action_on_commit_completed_data() { QTest::addColumn("document"); QTest::newRow("content has PageHeader") << "AutoCollapseInPageHeader.qml"; QTest::newRow("content is Page with PageHeader") << "AutoCollapseInPageWithPageHeader.qml"; } void test_autocollapse_navigation_action_on_commit_completed() { QFETCH(QString, document); QScopedPointer test(new BottomEdgeTestCase(document)); UCBottomEdge *bottomEdge = test->testItem(); BottomEdgeTestCase *testCase = test.data(); connect(bottomEdge, &UCBottomEdge::contentItemChanged, [=]() { QVERIFY(!testCase->hasContentAutoCollapse()); }); connect(bottomEdge, &UCBottomEdge::commitCompleted, [=]() { QVERIFY(testCase->hasContentAutoCollapse()); }); // drag slowly QPoint from(bottomEdge->width() / 2.0f, bottomEdge->height() - 5); QPoint delta(0, -bottomEdge->height()); UCTestExtras::touchDrag(0, bottomEdge, from, delta, 20); } void test_bottomedge_hint_enabled() { QScopedPointer view(new BottomEdgeTestCase("Defaults.qml")); UCBottomEdge *bottomEdge = view->testItem(); QCOMPARE(bottomEdge->isEnabled(), bottomEdge->hint()->isEnabled()); bottomEdge->setEnabled(!bottomEdge->isEnabled()); QCOMPARE(bottomEdge->isEnabled(), bottomEdge->hint()->isEnabled()); } void test_collapse_by_keyboard_data() { QTest::addColumn("key"); QTest::newRow("space") << Qt::Key_Space; QTest::newRow("enter") << Qt::Key_Enter; QTest::newRow("return") << Qt::Key_Return; } void test_collapse_by_keyboard() { QFETCH(Qt::Key, key); QScopedPointer view(new BottomEdgeTestCase("Defaults.qml")); view->rootObject()->forceActiveFocus(); QTRY_COMPARE_WITH_TIMEOUT(view->rootObject()->property("activeFocus").toBool(), true, 1000); UCBottomEdge *bottomEdge = view->testItem(); QTest::keyClick(bottomEdge->hint()->window(), Qt::Key_Tab); QTRY_COMPARE_WITH_TIMEOUT(bottomEdge->hint()->property("activeFocus").toBool(), true, 1000); QTRY_COMPARE_WITH_TIMEOUT(bottomEdge->hint()->property("keyNavigationFocus").toBool(), true, 1000); QTest::keyClick(bottomEdge->hint()->window(), key); QSignalSpy commitCompletedSpy(bottomEdge, SIGNAL(commitCompleted())); QTRY_COMPARE_WITH_TIMEOUT(commitCompletedSpy.count(), 1, 1000); QTest::keyClick(bottomEdge->hint()->window(), Qt::Key_Escape); QSignalSpy collapseCompletedSpy(bottomEdge, SIGNAL(collapseCompleted())); QTRY_COMPARE_WITH_TIMEOUT(collapseCompletedSpy.count(), 1, 1000); } void test_preload_content() { QScopedPointer test(new BottomEdgeTestCase("PreloadedContent.qml")); UCBottomEdge *bottomEdge = test->testItem(); QPoint from(bottomEdge->width() / 2.0f, bottomEdge->height() - 5); QPoint to = from + QPoint(0, -(bottomEdge->parentItem()->height() - 1)); QSignalSpy spy(bottomEdge, SIGNAL(activeRegionChanged(UCBottomEdgeRegion*))); connect(bottomEdge, &UCBottomEdge::contentItemChanged, [=]() { regionObjects.append(bottomEdge->contentItem() ? bottomEdge->contentItem()->objectName() : "NULL"); }); UCTestExtras::touchPress(0, bottomEdge, from); QPoint movePos(from); while (movePos.y() > to.y()) { QTest::qWait(20); UCTestExtras::touchMove(0, bottomEdge, movePos); movePos += QPoint(0, -10); } QTest::qWait(20); UCTestExtras::touchRelease(0, bottomEdge, movePos); // we should have had 4 active region changes by now // null -> defaultRegion -> region #0 -> region #1 -> null QCOMPARE(spy.count(), 4); QCOMPARE(regionObjects.size(), 6); // the first two regions content is the same int i = 0; QCOMPARE(regionObjects[i++], QString("default")); QCOMPARE(regionObjects[i++], QString("default")); QCOMPARE(regionObjects[i++], QString("region1")); QCOMPARE(regionObjects[i++], QString("default")); QCOMPARE(regionObjects[i++], QString("region2")); QCOMPARE(regionObjects[i++], QString("default")); } void test_reset_preload_content() { QScopedPointer test(new BottomEdgeTestCase("PreloadedContent.qml")); UCBottomEdge *bottomEdge = test->testItem(); UCBottomEdgePrivate *d = UCBottomEdgePrivate::get(bottomEdge); for (int i = 0; i < d->regions.size(); i++) { QVERIFY(UCBottomEdgeRegionPrivate::get(d->regions[i])->contentItem); } // set preloadContent: false bottomEdge->setPreloadContent(false); for (int i = 0; i < d->regions.size(); i++) { QVERIFY(!UCBottomEdgeRegionPrivate::get(d->regions[i])->contentItem); } } void test_disabled_content_unloads() { QScopedPointer test(new BottomEdgeTestCase("PreloadedContent.qml")); UCBottomEdge *bottomEdge = test->testItem(); UCBottomEdgePrivate *d = UCBottomEdgePrivate::get(bottomEdge); // disable a region d->regions[0]->setEnabled(false); QVERIFY(!UCBottomEdgeRegionPrivate::get(d->regions[0])->contentItem); // enable it d->regions[0]->setEnabled(true); QTRY_VERIFY_WITH_TIMEOUT(UCBottomEdgeRegionPrivate::get(d->regions[0])->contentItem != nullptr, 1000); } void test_action_triggered_commits() { QScopedPointer test(new BottomEdgeTestCase("BottomEdgeWithAction.qml")); UCBottomEdge *bottomEdge = test->testItem(); UCAction *action = bottomEdge->hint()->action(); QVERIFY(action); // trigger action action->trigger(); QTRY_COMPARE_WITH_TIMEOUT(bottomEdge->status(), UCBottomEdge::Committed, 2000); QVERIFY(bottomEdge->contentItem()); } }; QTEST_MAIN(tst_BottomEdge) #include "tst_bottomedge.moc" ./tests/unit_x11/tst_bottomedge/BottomEdgeWithAction.qml0000644000015600001650000000224712700370714023476 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: holder width: units.gu(40) height: units.gu(71) BottomEdge { id: bottomEdge height: parent.height hint.action: Action { text: "Test Bottom" onTriggered: bottomEdge.commit() } objectName: "testItem" contentComponent: Rectangle { objectName: "default" width: bottomEdge.width height: bottomEdge.height color: UbuntuColors.blue } } } ./tests/unit_x11/tst_bottomedge/ShorterBottomEdge.qml0000644000015600001650000000206712700370701023047 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: holder width: units.gu(40) height: units.gu(71) BottomEdge { id: bottomEdge objectName: "testItem" hint.text: "Test" height: holder.height - units.gu(20) contentComponent: Rectangle { width: holder.width height: bottomEdge.height color: UbuntuColors.green } } } ./tests/unit_x11/tst_bottomedge/AutoCollapseInPageWithPageHeader.qml0000644000015600001650000000236612700370714025676 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(40) height: units.gu(71) Page { header: PageHeader { title: "Main page" } BottomEdge { id: bottomEdge objectName: "testItem" hint.text: "Bottom edge" contentComponent: Page { width: bottomEdge.width height: bottomEdge.height header: PageHeader { title: "Bottom edge content" objectName: "bottomEdgeHeader" } } } } } ./tests/unit_x11/tst_bottomedge/BottomEdgeInItem.qml0000644000015600001650000000175612700370701022612 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: holder width: units.gu(40) height: units.gu(71) BottomEdge { hint.text: "Test" objectName: "testItem" contentComponent: Rectangle { width: holder.width height: holder.height color: UbuntuColors.green } } } ./tests/unit_x11/tst_bottomedge/DifferentSizes.qml0000644000015600001650000000157612700370701022377 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: 100 height: 100 Item { objectName: "oldParent" width: 100 height: 50 BottomEdge { objectName: "testItem" } } } ./tests/unit_x11/tst_bottomedge/LastItem.qml0000644000015600001650000000217112700370701021165 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: 100 height: 100 Item { id: holder width: 100 height: 50 BottomEdge { objectName: "testItem" contentComponent: Item { width: holder.width height: holder.height } } Item { anchors.fill: parent } } Item { objectName: "dynamicItem" anchors.fill: parent } } ./tests/unit_x11/tst_bottomedge/OverriddenHintTrigger.qml0000644000015600001650000000221312700370701023710 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: holder width: units.gu(40) height: units.gu(71) Action { id: testAction objectName: "testAction" text: "Test" function trigger() {} } BottomEdge { hint { action: testAction } objectName: "testItem" contentComponent: Rectangle { width: holder.width height: holder.height color: UbuntuColors.green } } } ./tests/unit_x11/tst_bottomedge/AlternateDefaultRegionContent.qml0000644000015600001650000000270712700370701025373 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: holder width: units.gu(40) height: units.gu(71) BottomEdge { id: bottomEdge hint.text: "Test" objectName: "testItem" contentComponent: Rectangle { objectName: "defaultContent" width: holder.width height: holder.height color: UbuntuColors.green } Component { id: altContent Rectangle { objectName: "regionContent" width: holder.width - units.gu(20) height: holder.height color: UbuntuColors.red } } } Component.onCompleted: { var defaultRegion = bottomEdge.regions[0]; defaultRegion.contentComponent = altContent; } } ./tests/unit_x11/tst_bottomedge/Defaults.qml0000644000015600001650000000143212700370701021211 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: 100 height: 100 BottomEdge { objectName: "testItem" } } ./tests/unit_x11/tst_bottomedge/AddCustomRegionUsingRegionsProperty.qml0000644000015600001650000000163012700370701026573 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: holder width: units.gu(40) height: units.gu(71) BottomEdge { hint.text: "Test" objectName: "testItem" regions: BottomEdgeRegion { objectName: "customRegion" } } } ./tests/unit_x11/tst_bottomedge/AutoCollapseInPageHeader.qml0000644000015600001650000000243512700370714024242 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(40) height: units.gu(71) Page { header: PageHeader { title: "Main page" } BottomEdge { id: bottomEdge objectName: "testItem" hint.text: "Bottom edge" contentComponent: Rectangle { width: bottomEdge.width height: bottomEdge.height color: UbuntuColors.green PageHeader { title: "Bottom edge content" objectName: "bottomEdgeHeader" } } } } } ./tests/unit_x11/tst_bottomedge/OverlappingRegions.qml0000644000015600001650000000215312700370701023260 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: holder width: units.gu(40) height: units.gu(71) BottomEdge { hint.text: "Test" objectName: "testItem" BottomEdgeRegion { from: 0.2 to: 0.5 } BottomEdgeRegion { from: 0.4 } BottomEdgeRegion { from: 0.4 to: 0.6 } BottomEdgeRegion { from: 0.6 } } } ./tests/unit_x11/tst_bottomedge/ClearCustomRegions.qml0000644000015600001650000000202112700370701023205 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: holder width: units.gu(40) height: units.gu(71) BottomEdge { hint.text: "Test" objectName: "testItem" BottomEdgeRegion { to: 0.5 } BottomEdgeRegion { from: 0.5 } Component.onCompleted: { regions = []; } } } ./tests/unit_x11/tst_bottomedge/tst_bottomedge.pro0000644000015600001650000000151112700370714022476 0ustar jenkinsjenkinsinclude(../test-include.pri) QT += core-private qml-private quick-private gui-private UbuntuGestures UbuntuGestures_private UbuntuToolkit SOURCES += \ tst_bottomedge.cpp DISTFILES += \ Defaults.qml \ DifferentSizes.qml \ LastItem.qml \ BottomEdgeInItem.qml \ ShorterBottomEdge.qml \ AlternateRegionContent.qml \ AddCustomRegionUsingRegionsProperty.qml \ AddCustomRegionUsingDataProperty.qml \ AddCustomRegionOnCompleted.qml \ AddCustomRegionOwnedByOtherBottomEdge.qml \ ClearCustomRegions.qml \ AlternateDefaultRegionContent.qml \ OverlappingRegions.qml \ AutoCollapseInPageHeader.qml \ AutoCollapseInPageWithPageHeader.qml \ LeanActiveRegionChange.qml \ UncoveredByRegion.qml \ OverriddenHintTrigger.qml \ PreloadedContent.qml \ BottomEdgeWithAction.qml ./tests/unit_x11/tst_bottomedge/AddCustomRegionUsingDataProperty.qml0000644000015600001650000000161712700370701026043 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: holder width: units.gu(40) height: units.gu(71) BottomEdge { hint.text: "Test" objectName: "testItem" BottomEdgeRegion { objectName: "customRegion" } } } ./tests/unit_x11/tst_bottomedge/AddCustomRegionOwnedByOtherBottomEdge.qml0000644000015600001650000000202112700370701026730 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: holder width: units.gu(40) height: units.gu(71) BottomEdge { hint.text: "Test" objectName: "testItem" regions: [customRegion] } BottomEdge { hint.text: "Other" BottomEdgeRegion { id: customRegion objectName: "customRegion" } } } ./tests/unit_x11/tst_bottomedge/AlternateRegionContent.qml0000644000015600001650000000250112700370701024056 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: holder width: units.gu(40) height: units.gu(71) BottomEdge { hint.text: "Test" objectName: "testItem" contentComponent: Rectangle { objectName: "defaultContent" width: holder.width height: holder.height color: UbuntuColors.green } regions: BottomEdgeRegion { from: 0.2 contentComponent: Rectangle { objectName: "regionContent" width: holder.width - units.gu(20) height: holder.height color: UbuntuColors.red } } } } ./tests/unit_x11/tst_bottomedge/UncoveredByRegion.qml0000644000015600001650000000251512700370701023036 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: holder width: units.gu(40) height: units.gu(71) BottomEdge { id: bottomEdge hint.text: "Test" objectName: "testItem" contentComponent: Rectangle { objectName: "defaultContent" width: holder.width height: holder.height color: UbuntuColors.green } BottomEdgeRegion { to: 0.5 contentComponent: Rectangle { objectName: "regionContent" width: holder.width - units.gu(20) height: holder.height color: UbuntuColors.red } } } } ./tests/unit_x11/tst_bottomedge/PreloadedContent.qml0000644000015600001650000000332612700370714022704 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: holder width: units.gu(40) height: units.gu(71) BottomEdge { id: bottomEdge height: parent.height hint.text: "Test" objectName: "testItem" preloadContent: true contentComponent: Rectangle { objectName: "default" width: bottomEdge.width height: bottomEdge.height color: UbuntuColors.silk } BottomEdgeRegion { from: 0.2 to: 0.5 contentComponent: Rectangle { objectName: "region1" width: bottomEdge.width - units.gu(10) height: bottomEdge.height color: UbuntuColors.red } } BottomEdgeRegion { from: 0.5 to: 0.7 contentComponent: Rectangle { objectName: "region2" width: bottomEdge.width - units.gu(15) height: bottomEdge.height color: UbuntuColors.blue } } } } ./tests/unit_x11/tst_bottomedge/AddCustomRegionOnCompleted.qml0000644000015600001650000000205612700370701024626 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: holder width: units.gu(40) height: units.gu(71) BottomEdge { hint.text: "Test" objectName: "testItem" Component.onCompleted: { var v = []; v.push(customRegion); regions = v; } } BottomEdgeRegion { id: customRegion objectName: "customRegion" } } ./tests/unit_x11/tst_mousefilters/0000755000015600001650000000000012700370701017317 5ustar jenkinsjenkins./tests/unit_x11/tst_mousefilters/FilterFlickable.qml0000644000015600001650000000201112700370701023046 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Flickable { width: units.gu(40) height: units.gu(40) clip: true objectName: "FilterOwner" Mouse.priority: Mouse.BeforeItem contentWidth: content.width contentHeight: content.height Rectangle { id: content width: units.gu(100) height: units.gu(100) color: "green" } } ./tests/unit_x11/tst_mousefilters/FilterInverseTextInput.qml0000644000015600001650000000174312700370701024505 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { width: units.gu(40) height: units.gu(71) TextInput { objectName: "FilterOwner" width: units.gu(30) height: units.gu(4) activeFocusOnPress: true // create InverseMouse filter attached InverseMouse.priority: Mouse.BeforeItem } } ./tests/unit_x11/tst_mousefilters/ForwardToTransparentMouseArea.qml0000644000015600001650000000224712700370701025772 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: units.gu(40) height: units.gu(71) MouseArea { id: topArea objectName: "target" width: units.gu(40) height: units.gu(10) onPressed: mouse.accepted = false onReleased: mouse.accepted = false TextInput { objectName: "FilterOwner" width: units.gu(30) height: units.gu(5) anchors.centerIn: parent Mouse.forwardTo: [topArea] } } } ./tests/unit_x11/tst_mousefilters/FilterInverseTextInputOSKExcluded.qml0000644000015600001650000000172612700370701026541 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { width: units.gu(40) height: units.gu(71) TextInput { objectName: "FilterOwner" width: units.gu(30) height: units.gu(4) activeFocusOnPress: true // create InverseMouse filter attached InverseMouse.enabled: true } } ./tests/unit_x11/tst_mousefilters/InverseAttachedToItem.qml0000644000015600001650000000137712700370701024235 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { width: 100 height: 62 InverseMouse.enabled: true } ./tests/unit_x11/tst_mousefilters/PressAndHoldAndClicked.qml0000644000015600001650000000151712700370701024266 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 TextInput { objectName: "FilterOwner" width: units.gu(10) height: units.gu(5) activeFocusOnPress: true Mouse.onPressAndHold: {} } ./tests/unit_x11/tst_mousefilters/FilterTextInputAfter.qml0000644000015600001650000000157212700370701024133 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 TextInput { objectName: "FilterOwner" width: units.gu(10) height: units.gu(5) activeFocusOnPress: true // create Mouse filter attached Mouse.priority: Mouse.AfterItem } ./tests/unit_x11/tst_mousefilters/ForwardToMouseArea.qml0000644000015600001650000000177012700370701023550 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: units.gu(40) height: units.gu(71) MouseArea { id: other objectName: "target" anchors.fill: parent } TextInput { objectName: "FilterOwner" width: root.width height: units.gu(5) Mouse.forwardTo: [root, other] } } ./tests/unit_x11/tst_mousefilters/InverseHover.qml0000644000015600001650000000235012700370701022451 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: units.gu(40) height: units.gu(71) Rectangle { width: units.gu(30) height: units.gu(10) color: "blue" anchors.horizontalCenter: parent.horizontalCenter // use MouseArea and enable hover events only MouseArea { id: other anchors.fill: parent objectName: "FilterOwner" hoverEnabled: true acceptedButtons: Qt.NoButton // test hover InverseMouse.priority: Mouse.BeforeItem } } } ./tests/unit_x11/tst_mousefilters/ForwardEventChained.qml0000644000015600001650000000255112700370701023717 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: main objectName: "proxy2" width: units.gu(40) height: units.gu(71) Mouse.enabled: true Column { anchors.fill: parent spacing: units.gu(1) Rectangle { id: blueRect objectName: "proxy1" width: parent.width height: units.gu(20) color: "blue" Mouse.forwardTo: [main] } Rectangle { width: parent.width height: units.gu(20) color: "red" MouseArea { objectName: "host" anchors.fill: parent Mouse.forwardTo: [blueRect] } } } } ./tests/unit_x11/tst_mousefilters/FilterSynthesizedEvents.qml0000644000015600001650000000172712700370701024705 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 MouseArea { width: units.gu(40) height: units.gu(40) objectName: "rootMouseArea" MouseArea { signal overlayPressed() objectName: "overlayArea" anchors.fill: parent Mouse.enabled: true Mouse.ignoreSynthesizedEvents: true } } ./tests/unit_x11/tst_mousefilters/PressAndHoldAcceptedEatsClick.qml0000644000015600001650000000154412700370701025600 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 TextInput { objectName: "FilterOwner" width: units.gu(10) height: units.gu(5) activeFocusOnPress: true Mouse.onPressAndHold: {mouse.accepted = true} } ./tests/unit_x11/tst_mousefilters/InverseMouseFilterAttachedToNonItem.qml0000644000015600001650000000137112700370701027061 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { QtObject { InverseMouse.enabled: true } } ./tests/unit_x11/tst_mousefilters/ForwardedEventsToTargetBlocked.qml0000644000015600001650000000202712700370701026073 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: units.gu(40) height: units.gu(71) objectName: "target" Mouse.enabled: true TextInput { objectName: "FilterOwner" width: root.width height: units.gu(5) Mouse.forwardTo: [root] Mouse.priority: Mouse.AfterItem Mouse.onPressed: mouse.accepted = true } } ./tests/unit_x11/tst_mousefilters/ForwardComposedEvents.qml0000644000015600001650000000307612700370701024323 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 FocusScope { id: root width: units.gu(40) height: units.gu(71) Flickable { anchors { fill: parent margins: units.gu(1) } contentWidth: body.width contentHeight: body.height clip: true Rectangle { color: "blue" id: body width: units.gu(100) height: units.gu(100) MouseArea { objectName: "host" anchors.fill: parent Mouse.forwardTo: [proxy] Item { id: proxy objectName: "proxy" anchors.fill: parent Mouse.enabled: true // this threshold does not apply for the forwarded events! Mouse.clickAndHoldThreshold: units.gu(2) } } } } } ./tests/unit_x11/tst_mousefilters/ForwardedMouseEvents.qml0000644000015600001650000000170012700370701024143 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: units.gu(40) height: units.gu(71) objectName: "target" Mouse.enabled: true TextInput { objectName: "FilterOwner" width: root.width height: units.gu(5) Mouse.forwardTo: [root] } } ./tests/unit_x11/tst_mousefilters/FilterInverseTextInputAfter.qml0000644000015600001650000000174212700370701025466 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { width: units.gu(40) height: units.gu(71) TextInput { objectName: "FilterOwner" width: units.gu(30) height: units.gu(4) activeFocusOnPress: true // create InverseMouse filter attached InverseMouse.priority: Mouse.AfterItem } } ./tests/unit_x11/tst_mousefilters/ForwardDblClickToTransparentMouseArea.qml0000644000015600001650000000247612700370701027366 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: units.gu(40) height: units.gu(71) MouseArea { id: topArea objectName: "target" width: units.gu(40) height: units.gu(10) preventStealing: false onPressed: mouse.accepted = false onReleased: mouse.accepted = false onDoubleClicked: mouse.accepted = false TextInput { objectName: "FilterOwner" width: units.gu(30) height: units.gu(5) anchors.centerIn: parent selectByMouse: true text: "This is a test text" Mouse.forwardTo: [topArea] } } } ./tests/unit_x11/tst_mousefilters/tst_mousefilterstest.cpp0000644000015600001650000015652012700370701024347 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include #include #include #include #include #include "ucmouse.h" #include "ucinversemouse.h" #include "ucunits.h" #include "quickutils.h" #include "inversemouseareatype.h" #include "uctestcase.h" #include "uctestextras.h" #include #include template T *attachedFilter(QQuickItem *item, const QString &objectName) { QQuickItem *testItem = item->objectName() == objectName ? item : item->findChild(objectName); if (testItem) { return qobject_cast(qmlAttachedPropertiesObject(testItem, false)); } return 0; } class tst_mouseFilterTest : public QObject { Q_OBJECT public: tst_mouseFilterTest() {} private: struct FilterParams { QString handler; Qt::MouseButton pressedButton; Qt::MouseButtons pressedButtons; QQuickItem *sender; }; QString m_modulePath; FilterParams mouseEventParams; FilterParams mouseEvent2Params; FilterParams mouseEvent3Params; QQuickView * loadTest(const QString &file) { UbuntuTestCase* testCase = new UbuntuTestCase(file); return qobject_cast(testCase); } void mousePressAndHold(QWindow *view, Qt::MouseButton button, Qt::KeyboardModifiers modifiers, const QPoint &point, int delay = DefaultPressAndHoldDelay + 200) { QTest::mousePress(view, button, modifiers, point); QTest::qWait(delay); } bool inputPanelPresent() { return !QuickUtils::instance()->inputMethodProvider().isEmpty(); } QPoint guPoint(qreal guX, qreal guY) { return QPoint(UCUnits::instance()->gu(guX), UCUnits::instance()->gu(guY)); } void preventDblClick() { QTest::qWait(400); } protected Q_SLOTS: void onMouseEvent(QQuickMouseEvent *event, QQuickItem *sender) { mouseEventParams.handler = "EVENT1"; mouseEventParams.sender = sender; mouseEventParams.pressedButton = (Qt::MouseButton)event->button(); mouseEventParams.pressedButtons = (Qt::MouseButtons)event->buttons(); } void onMouseEvent2(QQuickMouseEvent *event, QQuickItem *sender) { mouseEvent2Params.handler = "EVENT2"; mouseEvent2Params.sender = sender; mouseEvent2Params.pressedButton = (Qt::MouseButton)event->button(); mouseEvent2Params.pressedButtons = (Qt::MouseButtons)event->buttons(); } void onMouseEvent3(QQuickMouseEvent *event, QQuickItem *sender) { mouseEvent3Params.handler = "EVENT4"; mouseEvent3Params.sender = sender; mouseEvent3Params.pressedButton = (Qt::MouseButton)event->button(); mouseEvent3Params.pressedButtons = (Qt::MouseButtons)event->buttons(); } private Q_SLOTS: void initTestCase() { UCTestExtras::registerTouchDevice(); QString modules(UBUNTU_QML_IMPORT_PATH); QVERIFY(QDir(modules).exists()); m_modulePath = QDir(modules).absolutePath(); } void cleanupTestCase() { } void testCase_pressedInsideTextInput() { QScopedPointer view(loadTest("FilterTextInput.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); QTest::mouseClick(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::waitForEvents(); QCOMPARE(view->rootObject()->hasFocus(), true); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 0); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_pressedInsideTextInputHandledAfter() { QScopedPointer view(loadTest("FilterTextInputAfter.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); QTest::mouseClick(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::waitForEvents(); QCOMPARE(view->rootObject()->hasFocus(), true); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 0); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_pressedOutsideTextInput() { QScopedPointer view(loadTest("FilterInverseTextInput.qml")); QVERIFY(view); UCInverseMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); QTest::mouseClick(view.data(), Qt::LeftButton, 0, guPoint(10, 10)); QTest::waitForEvents(); QCOMPARE(view->rootObject()->hasFocus(), false); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 0); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_pressedOutsideTextInputAfter() { UbuntuTestCase::ignoreWarning("FilterInverseTextInputAfter.qml", 23, 5, "QML TextInput: Ignoring AfterItem priority for InverseMouse filters."); QScopedPointer view(new UbuntuTestCase("FilterInverseTextInputAfter.qml")); QCOMPARE(view->warnings(), 1); UCInverseMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); QTest::mouseClick(view.data(), Qt::LeftButton, 0, guPoint(10, 10)); QTest::waitForEvents(); QCOMPARE(view->rootObject()->hasFocus(), false); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 0); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_pressedInsideTextInputTolerance() { QScopedPointer view(loadTest("FilterTextInputTolerance.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); QTest::mousePress(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::mouseMove(view.data(), guPoint(2.2, 2.2)); QTest::mouseRelease(view.data(), Qt::LeftButton, 0, guPoint(2.2, 2.2)); QTest::waitForEvents(); QCOMPARE(view->rootObject()->hasFocus(), true); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 1); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_pressedOutsideTextInputTolerance() { QScopedPointer view(loadTest("FilterInverseTextInputTolerance.qml")); QVERIFY(view); UCInverseMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); QTest::mousePress(view.data(), Qt::LeftButton, 0, guPoint(10, 10)); QTest::mouseMove(view.data(), guPoint(10.2, 10.2)); QTest::mouseRelease(view.data(), Qt::LeftButton, 0, guPoint(10.2, 10.2)); QTest::waitForEvents(); QCOMPARE(view->rootObject()->hasFocus(), false); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 1); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_pressedInsideTextInputOutOfTolerance() { QScopedPointer view(loadTest("FilterTextInputTolerance.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); QTest::mousePress(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::mouseMove(view.data(), guPoint(2.7, 2.7)); QTest::mouseRelease(view.data(), Qt::LeftButton, 0, guPoint(2.7, 2.7)); QTest::waitForEvents(); QCOMPARE(view->rootObject()->hasFocus(), true); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 0); QCOMPARE(positionChanged.count(), 1); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_pressedOutsideTextInputOutOfTolerance() { QScopedPointer view(loadTest("FilterInverseTextInputTolerance.qml")); QVERIFY(view); UCInverseMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); QTest::mousePress(view.data(), Qt::LeftButton, 0, guPoint(10, 10)); QTest::mouseMove(view.data(), guPoint(10.6, 10.6)); QTest::mouseRelease(view.data(), Qt::LeftButton, 0, guPoint(10.6, 10.6)); QTest::waitForEvents(); QCOMPARE(view->rootObject()->hasFocus(), false); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 0); QCOMPARE(positionChanged.count(), 1); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_pressedOverOSKExcluded() { QScopedPointer view(loadTest("FilterInverseTextInputOSKExcluded.qml")); QVERIFY(view); UCInverseMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); // focus TextInput QQuickItem *input = view->rootObject()->findChild("FilterOwner"); QVERIFY(input); input->forceActiveFocus(); QCOMPARE(input->hasFocus(), true); // introduce small delay to suppress double clicks preventDblClick(); QTest::mouseClick(view.data(), Qt::LeftButton, 0, guPoint(10, 10)); QTest::waitForEvents(); preventDblClick(); QTest::mouseClick(view.data(), Qt::LeftButton, 0, guPoint(10, 69)); QTest::waitForEvents(); if (!inputPanelPresent()) { QEXPECT_FAIL(0, "No OSK installed", Abort); } QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 0); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_pressAndMovedInsideTextInput() { QScopedPointer view(loadTest("FilterTextInput.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); // make sure we do not get double click because of the previous tests preventDblClick(); QTest::mousePress(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::mouseMove(view.data(), guPoint(2.7, 2.7)); QTest::mouseRelease(view.data(), Qt::LeftButton, 0, guPoint(2.7, 2.7)); QTest::waitForEvents(); QCOMPARE(view->rootObject()->hasFocus(), true); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 1); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_pressAndMovedOutsideTextInputInTolerance() { QScopedPointer view(loadTest("FilterInverseTextInputTolerance.qml")); QVERIFY(view); UCInverseMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); // make sure we do not get double click because of the previous tests preventDblClick(); QTest::mousePress(view.data(), Qt::LeftButton, 0, guPoint(10, 10)); QTest::mouseMove(view.data(), guPoint(10.5, 10.5)); QTest::mouseRelease(view.data(), Qt::LeftButton, 0, guPoint(10.5, 10.5)); QTest::waitForEvents(); QCOMPARE(view->rootObject()->hasFocus(), false); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 1); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_pressAndMovedOutsideTextInputOutTolerance() { QScopedPointer view(loadTest("FilterInverseTextInputTolerance.qml")); QVERIFY(view); UCInverseMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); // make sure we do not get double click because of the previous tests preventDblClick(); QTest::mousePress(view.data(), Qt::LeftButton, 0, guPoint(10, 10)); QTest::mouseMove(view.data(), guPoint(15, 15)); QTest::mouseRelease(view.data(), Qt::LeftButton, 0, guPoint(15, 15)); QTest::waitForEvents(); QCOMPARE(view->rootObject()->hasFocus(), false); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 0); QCOMPARE(positionChanged.count(), 1); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_pressAndHoldDisableClick() { QScopedPointer view(loadTest("PressAndHoldAcceptedEatsClick.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); mousePressAndHold(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::mouseRelease(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::waitForEvents(); QCOMPARE(view->rootObject()->hasFocus(), true); QCOMPARE(pressAndHold.count(), 1); QCOMPARE(clicked.count(), 0); } void testCase_pressAndHoldAndClick() { QScopedPointer view(loadTest("PressAndHoldAndClicked.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); mousePressAndHold(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::mouseRelease(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::waitForEvents(); QCOMPARE(view->rootObject()->hasFocus(), true); QCOMPARE(pressAndHold.count(), 1); QCOMPARE(clicked.count(), 1); } void testCase_doubleClicked() { QSKIP("FIXME: lp#1542215 Flaky test result"); QScopedPointer view(loadTest("DoubleClicked.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QQuickItem *input = view->rootObject(); QVERIFY(input); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy dblClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); QTest::mouseDClick(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::waitForEvents(); QVariant selectedText = input->property("selectedText"); QCOMPARE(input->hasFocus(), true); QVERIFY(selectedText.isValid()); QVERIFY(!selectedText.toString().isEmpty()); // ther emust be one click, the second one should be suppressed // by the doubleClicked() signal being connected at least to signalSpy! QCOMPARE(clicked.count(), 1); QCOMPARE(dblClicked.count(), 1); } void testCase_mouseFilterAttachedToNonItem() { UbuntuTestCase::ignoreWarning("MouseFilterAttachedToNonItem.qml", 21, 5, "QML QtObject: Warning: Mouse filter can only be attached to Items."); QScopedPointer testCase(new UbuntuTestCase("MouseFilterAttachedToNonItem.qml")); QCOMPARE(testCase->warnings(), 1); } void testCase_inverseMouseFilterAttachedToNonItem() { UbuntuTestCase::ignoreWarning("InverseMouseFilterAttachedToNonItem.qml", 21, 5, "QML QtObject: Warning: InverseMouse filter can only be attached to Items."); QScopedPointer testCase(new UbuntuTestCase("InverseMouseFilterAttachedToNonItem.qml")); QCOMPARE(testCase->warnings(), 1); } void testCase_forwardedEventsToItem() { QScopedPointer view(loadTest("ForwardedMouseEvents.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "target"); QVERIFY(filter); QQuickItem *input = view->rootObject()->findChild("FilterOwner"); QVERIFY(input); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); QTest::mouseClick(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::waitForEvents(); QCOMPARE(input->hasFocus(), true); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 0); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_forwardedEventsToItemStopped() { QScopedPointer view(loadTest("ForwardedMouseEventsStopped.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "target"); QVERIFY(filter); QQuickItem *input = view->rootObject()->findChild("FilterOwner"); QVERIFY(input); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); QTest::mouseClick(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::waitForEvents(); QCOMPARE(input->hasFocus(), false); // only the pressed was blocked, the rest of the events land in the proxy QCOMPARE(pressed.count(), 0); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 0); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_forwardedEventsToItemStoppedInForwards() { QScopedPointer view(loadTest("ForwardedEventsStoppedInForwards.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "target"); QVERIFY(filter); QQuickItem *input = view->rootObject()->findChild("FilterOwner"); QVERIFY(input); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); QTest::mouseClick(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::waitForEvents(); QCOMPARE(input->hasFocus(), false); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 0); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_forwardedEventsToTargetBlocked() { QScopedPointer view(loadTest("ForwardedEventsToTargetBlocked.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "target"); QVERIFY(filter); QQuickItem *input = view->rootObject()->findChild("FilterOwner"); QVERIFY(input); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); QTest::mouseClick(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::waitForEvents(); QCOMPARE(input->hasFocus(), true); QCOMPARE(pressed.count(), 0); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 0); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_forwardedEventsToMouseArea() { QScopedPointer view(loadTest("ForwardToMouseArea.qml")); QVERIFY(view); QQuickMouseArea *target = view->rootObject()->findChild("target"); QVERIFY(target); QQuickItem *input = view->rootObject()->findChild("FilterOwner"); QVERIFY(input); QSignalSpy pressed(target, SIGNAL(pressed(QQuickMouseEvent*))); QSignalSpy released(target, SIGNAL(released(QQuickMouseEvent*))); QSignalSpy clicked(target, SIGNAL(clicked(QQuickMouseEvent*))); QSignalSpy positionChanged(target, SIGNAL(positionChanged(QQuickMouseEvent*))); QSignalSpy doubleClicked(target, SIGNAL(doubleClicked(QQuickMouseEvent*))); QSignalSpy pressAndHold(target, SIGNAL(pressAndHold(QQuickMouseEvent*))); QSignalSpy entered(target, SIGNAL(entered())); QSignalSpy exited(target, SIGNAL(exited())); preventDblClick(); QTest::mouseClick(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::waitForEvents(); QCOMPARE(input->hasFocus(), false); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 0); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_forwardedEventsToTransparentMouseArea() { QScopedPointer view(loadTest("ForwardToTransparentMouseArea.qml")); QVERIFY(view); QQuickMouseArea *target = view->rootObject()->findChild("target"); QVERIFY(target); QQuickItem *input = view->rootObject()->findChild("FilterOwner"); QVERIFY(input); QSignalSpy pressed(target, SIGNAL(pressed(QQuickMouseEvent*))); QSignalSpy released(target, SIGNAL(released(QQuickMouseEvent*))); QSignalSpy clicked(target, SIGNAL(clicked(QQuickMouseEvent*))); QSignalSpy positionChanged(target, SIGNAL(positionChanged(QQuickMouseEvent*))); QSignalSpy doubleClicked(target, SIGNAL(doubleClicked(QQuickMouseEvent*))); QSignalSpy pressAndHold(target, SIGNAL(pressAndHold(QQuickMouseEvent*))); QSignalSpy entered(target, SIGNAL(entered())); QSignalSpy exited(target, SIGNAL(exited())); preventDblClick(); QTest::mouseClick(input->window(), Qt::LeftButton, 0, guPoint(10, 7)); QTest::waitForEvents(); QCOMPARE(input->hasFocus(), true); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 0); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); } void testCase_forwardedDblClickToTransparentMouseArea() { QScopedPointer view(loadTest("ForwardDblClickToTransparentMouseArea.qml")); QVERIFY(view); QQuickMouseArea *target = view->rootObject()->findChild("target"); QVERIFY(target); QQuickItem *input = view->rootObject()->findChild("FilterOwner"); QVERIFY(input); QSignalSpy doubleClicked(target, SIGNAL(doubleClicked(QQuickMouseEvent*))); preventDblClick(); QTest::mouseDClick(input->window(), Qt::LeftButton, 0, guPoint(10, 7)); QTest::waitForEvents(); QCOMPARE(input->hasFocus(), true); QVariant selectedText = input->property("selectedText"); QVERIFY(selectedText.isValid()); QVERIFY(selectedText.toString().isEmpty()); QCOMPARE(doubleClicked.count(), 1); } void testCase_forwardedEventsToInverseMouseArea() { QScopedPointer view(loadTest("ForwardToInverseMouseArea.qml")); QVERIFY(view); QQuickItem *target = view->rootObject()->findChild("target"); QVERIFY(target); QQuickItem *input = view->rootObject()->findChild("FilterOwner"); QVERIFY(input); QSignalSpy pressed(target, SIGNAL(pressed(QQuickMouseEvent*))); QSignalSpy released(target, SIGNAL(released(QQuickMouseEvent*))); QSignalSpy clicked(target, SIGNAL(clicked(QQuickMouseEvent*))); QSignalSpy positionChanged(target, SIGNAL(positionChanged(QQuickMouseEvent*))); QSignalSpy doubleClicked(target, SIGNAL(doubleClicked(QQuickMouseEvent*))); QSignalSpy pressAndHold(target, SIGNAL(pressAndHold(QQuickMouseEvent*))); QSignalSpy entered(target, SIGNAL(entered())); QSignalSpy exited(target, SIGNAL(exited())); preventDblClick(); QTest::mouseClick(view.data(), Qt::LeftButton, 0, guPoint(2, 2)); QTest::waitForEvents(); QCOMPARE(input->hasFocus(), true); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 0); QCOMPARE(clicked.count(), 0); QCOMPARE(positionChanged.count(), 0); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 0); } void testCase_filterFlickable() { QScopedPointer view(loadTest("FilterFlickable.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QQuickItem *flickable = view->rootObject(); QVERIFY(flickable); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); QSignalSpy flickStart(flickable, SIGNAL(movementStarted())); preventDblClick(); QTest::mousePress(flickable->window(), Qt::LeftButton, 0, guPoint(5, 5)); for (int i = 0; i < 30; i++) { QTest::mouseMove(flickable->window(), guPoint(5 + i, 5 + i)); } QTest::waitForEvents(); QTest::mouseRelease(flickable->window(), Qt::LeftButton, 0, guPoint(35, 35)); QTest::waitForEvents(); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 30); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); QCOMPARE(flickStart.count(), 1); } void testCase_filterFlickableAfter() { QScopedPointer view(loadTest("FilterFlickableAfter.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QQuickItem *flickable = view->rootObject()->findChild("FilterOwner"); QVERIFY(flickable); QSignalSpy pressed(filter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy released(filter, SIGNAL(released(QQuickMouseEvent*, QQuickItem*))); QSignalSpy clicked(filter, SIGNAL(clicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy doubleClicked(filter, SIGNAL(doubleClicked(QQuickMouseEvent*, QQuickItem*))); QSignalSpy pressAndHold(filter, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); QSignalSpy flickStart(flickable, SIGNAL(movementStarted())); preventDblClick(); QTest::mousePress(flickable->window(), Qt::LeftButton, 0, guPoint(5, 5)); for (int i = 0; i < 30; i++) { QTest::mouseMove(flickable->window(), guPoint(5 + i, 5 + i)); } QTest::mouseRelease(flickable->window(), Qt::LeftButton, 0, guPoint(35, 35)); QTest::waitForEvents(); QCOMPARE(pressed.count(), 1); QCOMPARE(released.count(), 1); QCOMPARE(clicked.count(), 1); QCOMPARE(positionChanged.count(), 30); QCOMPARE(doubleClicked.count(), 0); QCOMPARE(pressAndHold.count(), 0); QCOMPARE(entered.count(), 1); QCOMPARE(exited.count(), 1); QCOMPARE(flickStart.count(), 1); } void testCase_hover() { QScopedPointer view(loadTest("FilterFlickableAfter.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy positionChanged(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); QObject::connect(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*)), this, SLOT(onMouseEvent(QQuickMouseEvent*, QQuickItem*))); QObject::connect(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*)), this, SLOT(onMouseEvent(QQuickMouseEvent*, QQuickItem*))); QObject::connect(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*)), this, SLOT(onMouseEvent2(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); // Note: press inside the filtered area, so entered() exited() positionChanged() will // all receive the pressed button QTest::mousePress(view.data(), Qt::LeftButton, 0, guPoint(5, 5)); QTest::waitForEvents(); QCOMPARE(entered.count(), 1); // when entered(), buttons are the same as when pressed QCOMPARE(mouseEventParams.handler, QString("EVENT1")); QCOMPARE(mouseEventParams.pressedButton, Qt::LeftButton); QTest::mouseMove(view.data(), guPoint(15, 5)); QTest::mouseMove(view.data(), guPoint(25, 5)); QTest::waitForEvents(); QCOMPARE(mouseEvent2Params.handler, QString("EVENT2")); QCOMPARE(mouseEvent2Params.pressedButton, Qt::LeftButton); QTest::mouseRelease(view.data(), Qt::LeftButton, 0, guPoint(35, 5)); QTest::waitForEvents(); QCOMPARE(exited.count(), 1); // when entered(), button is the same when pressed, however buttons // does no longer contains the button pressed QCOMPARE(mouseEventParams.handler, QString("EVENT1")); QCOMPARE(mouseEventParams.pressedButton, Qt::LeftButton); // we have 2 moves, but we get 3 position changes, as the release point differs from the last moved point QCOMPARE(positionChanged.count(), 3); } void testCase_mouseMove() { QScopedPointer view(loadTest("HoverEvent.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy moved(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); QObject::connect(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*)), this, SLOT(onMouseEvent(QQuickMouseEvent*, QQuickItem*))); QObject::connect(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*)), this, SLOT(onMouseEvent(QQuickMouseEvent*, QQuickItem*))); QObject::connect(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*)), this, SLOT(onMouseEvent2(QQuickMouseEvent*, QQuickItem*))); preventDblClick(); // move mouse while entered() triggers int i, x = view->rootObject()->width() / 2; QTest::mousePress(view.data(), Qt::LeftButton, 0, QPoint(x, 0)); for (i = 0; (i < view->rootObject()->height()) && (entered.count() < 1); i++) { QTest::mouseMove(view.data(), QPoint(x, i)); } // Note: as button was pressed outside the filtered area, no button will be reported // by the mouse move. QCOMPARE(mouseEventParams.handler, QString("EVENT1")); QCOMPARE(mouseEventParams.pressedButton, Qt::NoButton); QCOMPARE(mouseEventParams.pressedButtons, Qt::NoButton); // continue to move mouse while exited() triggers while (++i < view->rootObject()->height()) { QTest::mouseMove(view.data(), QPoint(x, i)); if (exited.count() >= 1) { break; } QCOMPARE(mouseEvent2Params.handler, QString("EVENT2")); QCOMPARE(mouseEvent2Params.pressedButton, Qt::NoButton); QCOMPARE(mouseEvent2Params.pressedButtons, Qt::NoButton); } // test if we really exited QCOMPARE(mouseEventParams.handler, QString("EVENT1")); QCOMPARE(mouseEventParams.pressedButton, Qt::NoButton); QCOMPARE(mouseEventParams.pressedButtons, Qt::NoButton); // cleanup QTest::mouseRelease(view.data(), Qt::LeftButton, 0, QPoint(x, i)); } void testCase_hoverEvents() { QScopedPointer view(loadTest("HoverEvent.qml")); QVERIFY(view); UCMouse *filter = attachedFilter(view->rootObject(), "FilterOwner"); QVERIFY(filter); QSignalSpy entered(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*))); QSignalSpy moved(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*))); QSignalSpy exited(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*))); QObject::connect(filter, SIGNAL(entered(QQuickMouseEvent*, QQuickItem*)), this, SLOT(onMouseEvent(QQuickMouseEvent*, QQuickItem*))); QObject::connect(filter, SIGNAL(exited(QQuickMouseEvent*, QQuickItem*)), this, SLOT(onMouseEvent(QQuickMouseEvent*, QQuickItem*))); QObject::connect(filter, SIGNAL(positionChanged(QQuickMouseEvent*, QQuickItem*)), this, SLOT(onMouseEvent2(QQuickMouseEvent*, QQuickItem*))); // move mouse while entered() triggers int i, x = view->rootObject()->width() / 2; for (i = 0; (i < view->rootObject()->height()) && (entered.count() < 1); i++) { QTest::mouseMove(view.data(), QPoint(x, i)); } QCOMPARE(mouseEventParams.handler, QString("EVENT1")); QCOMPARE(mouseEventParams.pressedButton, Qt::NoButton); QCOMPARE(mouseEventParams.pressedButtons, Qt::NoButton); // continue to move mouse while exited() triggers while (++i < view->rootObject()->height()) { QTest::mouseMove(view.data(), QPoint(x, i)); if (exited.count() >= 1) { break; } QCOMPARE(mouseEvent2Params.handler, QString("EVENT2")); QCOMPARE(mouseEvent2Params.pressedButton, Qt::NoButton); QCOMPARE(mouseEvent2Params.pressedButtons, Qt::NoButton); } // test if we really exited QCOMPARE(mouseEventParams.handler, QString("EVENT1")); QCOMPARE(mouseEventParams.pressedButton, Qt::NoButton); QCOMPARE(mouseEventParams.pressedButtons, Qt::NoButton); } void testCase_forwardComposedEventsToProxy() { QScopedPointer test(new UbuntuTestCase("ForwardComposedEvents.qml")); UCMouse *host = attachedFilter(test->rootObject(), "host"); QVERIFY(host); UCMouse *proxy = attachedFilter(test->rootObject(), "proxy"); QVERIFY(proxy); QSignalSpy hostHoldSpy(host, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy proxyHoldSpy(proxy, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); // produce long press // FIXME move this under UbuntuTestCase mousePressAndHold(test.data(), Qt::LeftButton, 0, guPoint(20, 30)); QTest::waitForEvents(); QCOMPARE(hostHoldSpy.count(), 1); QCOMPARE(proxyHoldSpy.count(), 1); // click QTest::mouseRelease(test.data(), Qt::LeftButton, 0, guPoint(20, 30)); QTest::waitForEvents(); } void testCase_forwardComposedEventsToProxy_whenMoved() { QScopedPointer test(new UbuntuTestCase("ForwardComposedEvents.qml")); UCMouse *host = attachedFilter(test->rootObject(), "host"); QVERIFY(host); UCMouse *proxy = attachedFilter(test->rootObject(), "proxy"); QVERIFY(proxy); QSignalSpy hostHoldSpy(host, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); QSignalSpy proxyHoldSpy(proxy, SIGNAL(pressAndHold(QQuickMouseEvent*, QQuickItem*))); // produce long press, but move mouse while in delay // FIXME move this under UbuntuTestCase QTest::mousePress(test.data(), Qt::LeftButton, 0, guPoint(20, 30)); QTest::qWait(DefaultPressAndHoldDelay / 2); for (int i = 1; i <= 4; i++) { QTest::mouseMove(test.data(), guPoint(20 + i, 30 + i)); } QTest::qWait(DefaultPressAndHoldDelay / 2 + 200); QTest::waitForEvents(); QCOMPARE(hostHoldSpy.count(), 0); QCOMPARE(proxyHoldSpy.count(), 0); // click QTest::mouseRelease(test.data(), Qt::LeftButton, 0, guPoint(20, 30)); QTest::waitForEvents(); } void testCase_forwardToChainedItems() { QScopedPointer test(new UbuntuTestCase("ForwardEventChained.qml")); UCMouse *host = attachedFilter(test->rootObject(), "host"); QVERIFY(host); UCMouse *proxy1 = attachedFilter(test->rootObject(), "proxy1"); QVERIFY(proxy1); UCMouse *proxy2 = attachedFilter(test->rootObject(), "proxy2"); QVERIFY(proxy2); QSignalSpy hostPressed(host, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy proxy1Pressed(proxy1, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QSignalSpy proxy2Pressed(proxy2, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QObject::connect(host, SIGNAL(pressed(QQuickMouseEvent*,QQuickItem*)), this, SLOT(onMouseEvent(QQuickMouseEvent*,QQuickItem*))); QObject::connect(proxy1, SIGNAL(pressed(QQuickMouseEvent*,QQuickItem*)), this, SLOT(onMouseEvent2(QQuickMouseEvent*,QQuickItem*))); QObject::connect(proxy2, SIGNAL(pressed(QQuickMouseEvent*,QQuickItem*)), this, SLOT(onMouseEvent3(QQuickMouseEvent*,QQuickItem*))); QTest::mousePress(test.data(), Qt::LeftButton, 0, guPoint(20, 30)); QTest::waitForEvents(); QCOMPARE(hostPressed.count(), 1); QCOMPARE(proxy1Pressed.count(), 1); QCOMPARE(proxy2Pressed.count(), 1); QCOMPARE(mouseEventParams.sender, qobject_cast(host->parent())); QCOMPARE(mouseEvent2Params.sender, qobject_cast(host->parent())); QCOMPARE(mouseEvent3Params.sender, qobject_cast(proxy1->parent())); // click QTest::mouseRelease(test.data(), Qt::LeftButton, 0, guPoint(20, 30)); QTest::waitForEvents(); } void testCase_ignoreSynthesizedEvents() { QScopedPointer test(new UbuntuTestCase("FilterSynthesizedEvents.qml")); QQuickMouseArea *rootMouseArea = qobject_cast(test->rootObject()); QQuickMouseArea* overlayArea = test->findItem("overlayArea"); UCMouse *overlayFilter = attachedFilter(test->rootObject(), "overlayArea"); QCOMPARE(rootMouseArea != Q_NULLPTR, true); QCOMPARE(overlayArea != Q_NULLPTR, true); QCOMPARE(overlayFilter != Q_NULLPTR, true); QSignalSpy areaPressed(rootMouseArea, SIGNAL(pressed(QQuickMouseEvent *))); QSignalSpy overlayAreaPressed(overlayArea, SIGNAL(pressed(QQuickMouseEvent *))); QSignalSpy overlayFilterPressed(overlayFilter, SIGNAL(pressed(QQuickMouseEvent*, QQuickItem*))); QCOMPARE(overlayFilter->property("ignoreSynthesizedEvents").toBool(), true); //we're assuming the priority is set to BeforeItem, the functionality is not priority-dependent anyway, //just the outcome is. QCOMPARE(overlayFilter->priority(), UCMouse::BeforeItem); QCOMPARE(overlayArea->isEnabled(), true); //send a touch event, which will be converted to a synthesized mouse event, since //no item in this QML is handling touch events UCTestExtras::touchPress(0, overlayArea, guPoint(15, 15)); QTest::waitForEvents(); QCOMPARE(areaPressed.count(), 0); QCOMPARE(overlayAreaPressed.count(), 1); QCOMPARE(overlayFilterPressed.count(), 0); UCTestExtras::touchRelease(0, overlayArea, guPoint(15, 15)); QTest::waitForEvents(); overlayFilter->setProperty("ignoreSynthesizedEvents", false); QCOMPARE(overlayFilter->property("ignoreSynthesizedEvents").toBool(), false); UCTestExtras::touchPress(1, overlayArea, guPoint(15, 15)); QTest::waitForEvents(); QCOMPARE(areaPressed.count(), 0); //the filter doesn't accept the pressed event by default QCOMPARE(overlayAreaPressed.count(), 2); QCOMPARE(overlayFilterPressed.count(), 1); UCTestExtras::touchRelease(1, overlayArea, guPoint(15, 15)); QTest::waitForEvents(); overlayArea->setEnabled(false); QCOMPARE(overlayArea->isEnabled(), false); UCTestExtras::touchPress(2, overlayArea, guPoint(15, 15)); QTest::waitForEvents(); //the filter gets the event but its owner is not enabled, so we expect it //to propagate to the area underneath QCOMPARE(areaPressed.count(), 1); QCOMPARE(overlayAreaPressed.count(), 2); QCOMPARE(overlayFilterPressed.count(), 2); UCTestExtras::touchRelease(2, overlayArea, guPoint(15, 15)); QTest::waitForEvents(); } }; QTEST_MAIN(tst_mouseFilterTest) #include "tst_mousefilterstest.moc" ./tests/unit_x11/tst_mousefilters/FilterTextInput.qml0000644000015600001650000000157312700370701023152 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 TextInput { objectName: "FilterOwner" width: units.gu(10) height: units.gu(5) activeFocusOnPress: true // create Mouse filter attached Mouse.priority: Mouse.BeforeItem } ./tests/unit_x11/tst_mousefilters/DoubleClicked.qml0000644000015600001650000000171712700370701022531 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 TextInput { objectName: "FilterOwner" width: units.gu(40) height: units.gu(5) text: "This is a test text"; selectByMouse: true mouseSelectionMode: TextInput.SelectWords // make sure we have the doubleClicked() handled Mouse.onDoubleClicked: {} } ./tests/unit_x11/tst_mousefilters/FilterFlickableAfter.qml0000644000015600001650000000221212700370701024033 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: units.gu(40) height: units.gu(71) Flickable { width: root.width height: units.gu(40) clip: true objectName: "FilterOwner" Mouse.priority: Mouse.AfterItem contentWidth: content.width contentHeight: content.height Rectangle { id: content width: units.gu(100) height: units.gu(100) color: "green" } } } ./tests/unit_x11/tst_mousefilters/ForwardedEventsStoppedInForwards.qml0000644000015600001650000000175412700370701026501 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: units.gu(40) height: units.gu(71) objectName: "target" Mouse.enabled: true Mouse.onPressed: mouse.accepted = true TextInput { objectName: "FilterOwner" width: root.width height: units.gu(5) Mouse.forwardTo: [root] } } ./tests/unit_x11/tst_mousefilters/FilterInverseTextInputTolerance.qml0000644000015600001650000000203512700370701026335 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { width: units.gu(40) height: units.gu(71) TextInput { objectName: "FilterOwner" width: units.gu(30) height: units.gu(4) activeFocusOnPress: true // create InverseMouse filter attached InverseMouse.priority: Mouse.BeforeItem InverseMouse.clickAndHoldThreshold: units.gu(0.5) } } ./tests/unit_x11/tst_mousefilters/Hover.qml0000644000015600001650000000200612700370701021113 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: units.gu(40) height: units.gu(71) MouseArea { id: other objectName: "FilterOwner" width: units.gu(30) height: units.gu(10) anchors.horizontalCenter: parent hoverEnabled: true // test hover Mouse.priority: Mouse.BeforeItem } } ./tests/unit_x11/tst_mousefilters/ForwardToInverseMouseArea.qml0000644000015600001650000000245612700370701025106 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: units.gu(40) height: units.gu(71) Column { TextInput { objectName: "FilterOwner" width: root.width height: units.gu(5) Mouse.forwardTo: [root, other] } Rectangle { width: root.width height: units.gu(15) color: "blue" InverseMouseArea { id: other objectName: "target" anchors.fill: parent onPressed: mouse.accepted = false onReleased: mouse.accepted = false } } } } ./tests/unit_x11/tst_mousefilters/FilterTextInputTolerance.qml0000644000015600001650000000165212700370701025005 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 TextInput { objectName: "FilterOwner" width: units.gu(10) height: units.gu(5) activeFocusOnPress: true // create Mouse filter attached Mouse.priority: Mouse.BeforeItem Mouse.clickAndHoldThreshold: units.gu(0.5) } ./tests/unit_x11/tst_mousefilters/HoverEvent.qml0000644000015600001650000000205312700370701022117 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: units.gu(40) height: units.gu(71) Rectangle { width: units.gu(30) height: units.gu(30) anchors.centerIn: parent color: "blue" MouseArea { objectName: "FilterOwner" anchors.fill: parent hoverEnabled: true Mouse.enabled: true } } } ./tests/unit_x11/tst_mousefilters/AttachedToItem.qml0000644000015600001650000000137012700370701022672 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { width: 100 height: 62 Mouse.enabled: true } ./tests/unit_x11/tst_mousefilters/MouseFilterAttachedToNonItem.qml0000644000015600001650000000136212700370701025525 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { QtObject { Mouse.enabled: true } } ./tests/unit_x11/tst_mousefilters/tst_mousefilters.pro0000644000015600001650000000213612700370701023456 0ustar jenkinsjenkinsinclude(../test-include.pri) QT += quick-private SOURCES += tst_mousefilterstest.cpp DEFINES += SRCDIR=\\\"$$PWD/\\\" OTHER_FILES += \ FilterTextInput.qml \ PressAndHoldAcceptedEatsClick.qml \ PressAndHoldAndClicked.qml \ FilterInverseTextInput.qml \ FilterInverseTextInputOSKExcluded.qml \ AttachedToItem.qml \ InverseAttachedToItem.qml \ MouseFilterAttachedToNonItem.qml \ InverseMouseFilterAttachedToNonItem.qml \ ForwardedMouseEvents.qml \ ForwardToMouseArea.qml \ FilterTextInputAfter.qml \ FilterInverseTextInputAfter.qml \ ForwardedMouseEventsStopped.qml \ ForwardedEventsToTargetBlocked.qml \ ForwardToInverseMouseArea.qml \ FilterFlickable.qml \ FilterFlickableAfter.qml \ Hover.qml \ FilterTextInputTolerance.qml \ FilterInverseTextInputTolerance.qml \ ForwardedEventsStoppedInForwards.qml \ ForwardToTransparentMouseArea.qml \ ForwardDblClickToTransparentMouseArea.qml \ DoubleClicked.qml \ HoverEvent.qml \ ForwardComposedEvents.qml \ ForwardEventChained.qml \ FilterSynthesizedEvents.qml ./tests/unit_x11/tst_mousefilters/ForwardedMouseEventsStopped.qml0000644000015600001650000000175712700370701025516 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: units.gu(40) height: units.gu(71) objectName: "target" Mouse.enabled: true TextInput { objectName: "FilterOwner" width: root.width height: units.gu(5) Mouse.forwardTo: [root] Mouse.onPressed: mouse.accepted = true } } ./tests/unit_x11/add_qmlmakecheck.pri0000644000015600001650000000156212700370701017661 0ustar jenkinsjenkins# Do not use CONFIG += testcase that would add a 'make check' because it also # adds a 'make install' that installs the test cases, which we do not want. # Instead add a 'make check' manually. check.target = check # Xvfb doesn't run on armhf/qemu !contains(QMAKE_HOST.arch,armv7l) { check.commands = "set -e;" for(TEST, TESTS) { _uitk_command = cd $$_PRO_FILE_PWD_; _uitk_command += env UITK_TEST_KEEP_RUNNING=1 _uitk_command += '$${ROOT_SOURCE_DIR}/tests/unit/runtest.sh "$$shadowed($$_PRO_FILE_PWD_)/$${TARGET}" "$${TEST}"'; check.commands += $${_uitk_command} #add a convenience target per TEST file check_name = "check_$${TEST}" check_name = $$replace(check_name, "\.qml", "") check_name = $$replace(check_name, "\.", "_") $${check_name}.target = $${check_name} $${check_name}.commands += $${_uitk_command} QMAKE_EXTRA_TARGETS+=$${check_name} } } ./tests/unit_x11/qmltest-include.pri0000644000015600001650000000020612700370701017530 0ustar jenkinsjenkinsinclude( ../unit/plugin_dependency.pri ) include( add_qmlmakecheck.pri) TEMPLATE = app QT += qml quick qmltest CONFIG += no_keywords ./tests/unit_x11/tst_inversemousearea/0000755000015600001650000000000012700370701020153 5ustar jenkinsjenkins./tests/unit_x11/tst_inversemousearea/SensingAreaError.qml0000644000015600001650000000223612700370701024102 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root objectName: "root" width: units.gu(40) height: units.gu(40) property string log: "" MouseArea { anchors.fill: parent onClicked: root.log = "MA" } Rectangle { width: units.gu(10) height: units.gu(10) anchors.centerIn: parent color: "red" InverseMouseArea { anchors.fill: parent sensingArea: root onClicked: root.log = "IMA" } } } ./tests/unit_x11/tst_inversemousearea/InverseMouseAreaOnTopNoAccept.qml0000644000015600001650000000343512700370701026505 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Rectangle { id: page width: 300 height: 300 color: "lightgray" objectName: "ROOT" Rectangle { id: label objectName: "RECT1" anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top height: 40 width: parent.width color: Qt.rgba(1, 0, 0, 0.4) MouseArea { objectName: "MA1" anchors.fill: parent z: 1 } } Rectangle { anchors.top: label.bottom anchors.topMargin: 20 anchors.horizontalCenter: parent.horizontalCenter height: 60 width: parent.width color: Qt.rgba(0, 0, 1, 0.4) objectName: "RECT2" Button { id: button objectName: "button" x: 20 y: 10 text: "I'm a button, I do nothing." } MouseArea { objectName: "MA2" anchors.fill: parent } InverseMouseArea { objectName: "IMA" anchors.fill: button onPressed: mouse.accepted = false } } } ./tests/unit_x11/tst_inversemousearea/InverseMouseAreaPropagateEvents.qml0000644000015600001650000000164212700370701027136 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { objectName: "root" width: 100 height: 100 InverseMouseArea { objectName: "testObject" anchors.centerIn: parent propagateComposedEvents: true width: 50 height: 50 } } ./tests/unit_x11/tst_inversemousearea/InverseMouseAreaInListView.qml0000644000015600001650000000330612700370701026063 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.0 MainView { id: root width: units.gu(40) height: units.gu(71) property InverseMouseArea ima: null Component { id: editor TextArea { } } Page { title: "Test" ListView { id: list objectName: "ListView" anchors.fill: parent model: 1 delegate: Empty { objectName: "Card" width: parent.width - units.gu(5) anchors.horizontalCenter: parent.horizontalCenter height: units.gu(50) Loader { anchors.fill: parent sourceComponent: editor } InverseMouseArea { id: imaItem objectName: "Test_IMA" anchors.fill: parent topmostItem: true Component.onCompleted: root.ima = imaItem } } } } } ./tests/unit_x11/tst_inversemousearea/InverseMouseAreaInWindow.qml0000644000015600001650000000346512700370701025572 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtQuick.Window 2.0 import Ubuntu.Components 1.1 Item{ id: root property string log: "" // onLogChanged: print("LOG", log) width: units.gu(100) height: units.gu(100) Window { objectName: "isawindow" width: units.gu(50) height: units.gu(50) visible: true Item { id: clickArea objectName: "clickArea" anchors { left: parent.left right: parent.right top: parent.top } height: units.gu(10) Label { anchors.centerIn: parent text: "click me" } } Rectangle { id: rect color: "red" anchors { left: parent.left right: parent.right top: clickArea.bottom bottom: parent.bottom } } InverseMouseArea { objectName: "ima" id: ima anchors.fill: rect onClicked: { root.log = "IMA" rect.color = "green" } } } } ./tests/unit_x11/tst_inversemousearea/InverseMouseAreaDoNotPropagateEvents.qml0000644000015600001650000000164312700370701030103 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { objectName: "root" width: 100 height: 100 InverseMouseArea { objectName: "testObject" anchors.centerIn: parent propagateComposedEvents: false width: 50 height: 50 } } ./tests/unit_x11/tst_inversemousearea/InverseMouseAreaClip.qml0000644000015600001650000000356112700370701024720 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Rectangle { color: "yellow" width: units.gu(70) height: units.gu(70) property InverseMouseArea ima: imaItem Label { anchors { horizontalCenter: parent.horizontalCenter top: parent.top } text: "Root" } Rectangle { color: "green" width: units.gu(50) height: units.gu(50) anchors.centerIn: parent clip: true Label { anchors { horizontalCenter: parent.horizontalCenter top: parent.top } text: "Clipper" } Rectangle { width: units.gu(30) height: units.gu(30) color: "lightgrey" anchors.centerIn: parent Label { anchors { horizontalCenter: parent.horizontalCenter top: parent.top } text: "Inverse mouse area" } InverseMouseArea { id: imaItem objectName: "Test_IMA" anchors.fill: parent topmostItem: true clip: false } } } } ./tests/unit_x11/tst_inversemousearea/InverseMouseAreaOnTop.qml0000644000015600001650000000335712700370701025073 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Rectangle { id: page width: 300 height: 300 color: "lightgray" objectName: "ROOT" Rectangle { id: label objectName: "RECT1" anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top height: 40 width: parent.width color: Qt.rgba(1, 0, 0, 0.4) MouseArea { objectName: "MA1" anchors.fill: parent z: 1 } } Rectangle { anchors.top: label.bottom anchors.topMargin: 20 anchors.horizontalCenter: parent.horizontalCenter height: 60 width: parent.width color: Qt.rgba(0, 0, 1, 0.4) objectName: "RECT2" Button { id: button objectName: "button" x: 20 y: 10 text: "I'm a button, I do nothing." } MouseArea { objectName: "MA2" anchors.fill: parent } InverseMouseArea { objectName: "IMA" anchors.fill: button } } } ./tests/unit_x11/tst_inversemousearea/Defaults.qml0000644000015600001650000000137512700370701022443 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { InverseMouseArea { objectName: "testItem" } } ./tests/unit_x11/tst_inversemousearea/OverlappedMouseArea.qml0000644000015600001650000000245712700370701024601 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: root width: units.gu(50) height: units.gu(50) property string log: "" Item { id: nil width: 0 height: 0 } InverseMouseArea { objectName: "testObject" anchors.fill: nil onClicked: { color.color = "red" root.log = "IMA" // FAIL } } Rectangle { id: color anchors.fill: parent color: "blue" MouseArea { onClicked: { parent.color = "green" root.log = "MA" // PASS } anchors.fill: parent } } } ./tests/unit_x11/tst_inversemousearea/InverseMouseAreaNormalEventStack.qml0000644000015600001650000000217312700370701027247 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { width: 300 height: 300 objectName: "ROOT" Rectangle { x: 10; y: 10 width: 100; height: 100 color: "blue" InverseMouseArea { anchors.fill: parent objectName: "IMA" } } Rectangle { x: 110; y: 10 width: 100; height: 100 color: "red" MouseArea { anchors.fill: parent objectName: "MA" } } } ./tests/unit_x11/tst_inversemousearea/InverseMouseAreaTopmostItem.qml0000644000015600001650000000223212700370701026307 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { width: 300 height: 300 objectName: "ROOT" Rectangle { x: 110; y: 10 width: 100; height: 100 color: "red" MouseArea { anchors.fill: parent objectName: "MA" } } Rectangle { x: 10; y: 10 width: 100; height: 100 color: "blue" InverseMouseArea { anchors.fill: parent objectName: "IMA" topmostItem: true } } } ./tests/unit_x11/tst_inversemousearea/InverseMouseAreaSensingArea.qml0000644000015600001650000000233512700370701026226 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { width: 300 height: 300 MouseArea { objectName: "MA" anchors.fill: parent } Rectangle { id: blueRect width: 200 height: 200 anchors.centerIn: parent color: "blue" Rectangle { width: 100 height: 100 anchors.centerIn: parent color: "red" InverseMouseArea { objectName: "IMA" anchors.fill: parent sensingArea: blueRect } } } } ./tests/unit_x11/tst_inversemousearea/InverseMouseAreaSignals.qml0000644000015600001650000000166412700370701025433 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { width: 300 height: 300 objectName: "ROOT" Rectangle { x: 10 y: 10 width: 100 height: 30 InverseMouseArea { anchors.fill: parent objectName: "IMA" } } } ./tests/unit_x11/tst_inversemousearea/tst_inversemousearea.pro0000644000015600001650000000136212700370701025146 0ustar jenkinsjenkinsinclude(../test-include.pri) QT += quick-private gui-private SOURCES += tst_inversemouseareatest.cpp DEFINES += SRCDIR=\\\"$$PWD/\\\" OTHER_FILES += \ InverseMouseAreaPropagateEvents.qml \ InverseMouseAreaDoNotPropagateEvents.qml \ SensingAreaError.qml \ InverseMouseAreaInWindow.qml \ OverlappedMouseArea.qml \ InverseMouseAreaOnTop.qml \ InverseMouseAreaSignals.qml \ InverseMouseAreaNormalEventStack.qml \ InverseMouseAreaTopmostItem.qml \ InverseMouseAreaSensingArea.qml \ InverseMouseAreaOnTopNoAccept.qml \ Defaults.qml \ InverseMouseAreaInListView.qml \ InverseMouseAreaInPage.qml \ InverseMouseAreaInFlickable.qml \ InverseMouseAreaParentClipped.qml \ InverseMouseAreaClip.qml ./tests/unit_x11/tst_inversemousearea/InverseMouseAreaInFlickable.qml0000644000015600001650000000265012700370701026172 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 MainView { id: root width: units.gu(40) height: units.gu(71) property InverseMouseArea ima: null Page { title: "Test" Flickable { id: list objectName: "ListView" anchors.fill: parent contentHeight: units.gu(100) Rectangle { width: 100 height: 100 anchors.centerIn: parent InverseMouseArea { id: ima objectName: "Test_IMA" anchors.fill: parent topmostItem: true Component.onCompleted: root.ima = ima } } } } } ./tests/unit_x11/tst_inversemousearea/tst_inversemouseareatest.cpp0000644000015600001650000004376512700370701026045 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include #include #include #include #include #include "uctestextras.h" #include "uctestcase.h" #include "inversemouseareatype.h" #include "ucunits.h" #include #define DOUBLECLICK_TIMEOUT 400 using QTest::QTouchEventSequence; class InverseMouseAreaTest : public UbuntuTestCase { Q_OBJECT public: InverseMouseAreaTest(const QString& file) : UbuntuTestCase(file) { setGeometry(0, 0, 240, 320); //add modules folder so we have access to the plugin from QML QStringList imports = engine()->importPathList(); imports.prepend(QDir(UBUNTU_QML_IMPORT_PATH).absolutePath()); engine()->setImportPathList(imports); } }; class tst_InverseMouseAreaTest : public QObject { Q_OBJECT public: tst_InverseMouseAreaTest() {} private: QObjectCleanupHandler eventCleanup; QPoint guPoint(qreal guX, qreal guY) { return QPointF(UCUnits::instance()->gu(guX), UCUnits::instance()->gu(guY)).toPoint(); } protected Q_SLOTS: void capturePressed(QQuickMouseEvent *event) { eventCleanup.add((QObject*)event); } private Q_SLOTS: void initTestCase() { // make sure we have a touch device installed UCTestExtras::registerTouchDevice(); QString modules(UBUNTU_QML_IMPORT_PATH); QVERIFY(QDir(modules).exists()); } void testCase_Defaults() { QScopedPointer quickView(new InverseMouseAreaTest("Defaults.qml")); InverseMouseAreaType *area = quickView->findItem("testItem"); QCOMPARE(area->pressed(), false); QCOMPARE(area->acceptedButtons(), Qt::LeftButton); QCOMPARE(area->pressedButtons(), Qt::NoButton); QCOMPARE(area->propagateComposedEvents(), false); } void testCase_DoNotPropagateEvents() { eventCleanup.clear(); QScopedPointer quickView(new InverseMouseAreaTest("InverseMouseAreaDoNotPropagateEvents.qml")); InverseMouseAreaType *area = quickView->findItem("testObject"); // connect pressed signal to capture mouse object QObject::connect(area, SIGNAL(pressed(QQuickMouseEvent*)), this, SLOT(capturePressed(QQuickMouseEvent*))); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(10, 10)); QTest::waitForEvents(); QVERIFY(eventCleanup.isEmpty()); } void testCase_PropagateEvents() { eventCleanup.clear(); QScopedPointer quickView(new InverseMouseAreaTest("InverseMouseAreaPropagateEvents.qml")); InverseMouseAreaType *area = quickView->findItem("testObject"); // connect pressed signal to capture mouse object QObject::connect(area, SIGNAL(pressed(QQuickMouseEvent*)), this, SLOT(capturePressed(QQuickMouseEvent*))); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(10, 10)); QTest::waitForEvents(); QVERIFY(eventCleanup.isEmpty()); } void testCase_sensingAreaError() { QScopedPointer quickView(new InverseMouseAreaTest("SensingAreaError.qml")); QTest::mouseClick(quickView.data(), Qt::LeftButton, 0, QPoint(20, 20)); QTest::waitForEvents(); QCOMPARE(quickView->rootObject()->property("log").toString(), QString("IMA")); } void testCase_InverseMouseAreInWindow() { QScopedPointer quickView(new InverseMouseAreaTest("InverseMouseAreaInWindow.qml")); QList l = quickView->rootObject()->findChildren("isawindow"); QVERIFY(l.count()); // make sure we have the clickArea present quickView->findItem("clickArea"); QTest::mouseClick(l[0], Qt::LeftButton, 0, QPoint(20, 10)); QTest::waitForEvents(); QCOMPARE(quickView->rootObject()->property("log").toString(), QString("IMA")); } void testCase_OverlappedMouseArea() { QScopedPointer quickView(new InverseMouseAreaTest("OverlappedMouseArea.qml")); QTest::mouseClick(quickView.data(), Qt::LeftButton, 0, QPoint(20, 10)); QTest::waitForEvents(); QCOMPARE(quickView->rootObject()->property("log").toString(), QString("MA")); } void testCase_InverseMouseAreaOnTop() { QScopedPointer quickView(new InverseMouseAreaTest("InverseMouseAreaOnTop.qml")); InverseMouseAreaType *area = quickView->findItem("IMA"); QQuickItem *ma1 = quickView->findItem("MA1"); QQuickItem *ma2 = quickView->findItem("MA2"); QSignalSpy imaSpy(area, SIGNAL(pressed(QQuickMouseEvent*))); QSignalSpy ma1Spy(ma1, SIGNAL(pressed(QQuickMouseEvent*))); QSignalSpy ma2Spy(ma2, SIGNAL(pressed(QQuickMouseEvent*))); // click in the top rectangle, use 800msec delay to prevent dblclick detection QTest::mouseClick(quickView.data(), Qt::LeftButton, 0, QPoint(10, 10), DOUBLECLICK_TIMEOUT); QTest::waitForEvents(); QCOMPARE(ma1Spy.count(), 0); QCOMPARE(ma2Spy.count(), 0); QCOMPARE(imaSpy.count(), 1); imaSpy.clear(); // click in the second rectangle, use 800msec delay to prevent dblclick detection QTest::mouseClick(quickView.data(), Qt::LeftButton, 0, QPoint(10, 65), DOUBLECLICK_TIMEOUT); QTest::waitForEvents(); QCOMPARE(ma1Spy.count(), 0); QCOMPARE(ma2Spy.count(), 0); QCOMPARE(imaSpy.count(), 1); imaSpy.clear(); // click in the button, use 800msec delay to prevent dblclick detection QTest::mouseClick(quickView.data(), Qt::LeftButton, 0, QPoint(25, 85), DOUBLECLICK_TIMEOUT); QTest::waitForEvents(); QCOMPARE(ma1Spy.count(), 0); QCOMPARE(ma2Spy.count(), 1); QCOMPARE(imaSpy.count(), 0); // double click in the second rectangle QSignalSpy imaDSpy(area, SIGNAL(doubleClicked(QQuickMouseEvent*))); QTest::mouseDClick(quickView.data(), Qt::LeftButton, 0, QPoint(10, 65)); QTest::waitForEvents(); // FIXME: this is flaky QCOMPARE(imaDSpy.count(), 1); imaDSpy.clear(); // double click in the first rectangle QTest::mouseDClick(quickView.data(), Qt::LeftButton, 0, QPoint(10, 10)); QTest::waitForEvents(); QCOMPARE(imaDSpy.count(), 1); imaDSpy.clear(); } void testCase_InverseMouseAreaOnTopNoAccept() { QScopedPointer quickView(new InverseMouseAreaTest("InverseMouseAreaOnTopNoAccept.qml")); InverseMouseAreaType *area = quickView->findItem("IMA"); QQuickItem *ma1 = quickView->findItem("MA1"); QQuickItem *ma2 = quickView->findItem("MA2"); QSignalSpy imaSpy(area, SIGNAL(pressed(QQuickMouseEvent*))); QSignalSpy ma1Spy(ma1, SIGNAL(pressed(QQuickMouseEvent*))); QSignalSpy ma2Spy(ma2, SIGNAL(pressed(QQuickMouseEvent*))); QTest::mouseClick(quickView.data(), Qt::LeftButton, 0, QPoint(10, 10), DOUBLECLICK_TIMEOUT); QTest::waitForEvents(); QCOMPARE(ma1Spy.count(), 1); QCOMPARE(ma2Spy.count(), 0); QCOMPARE(imaSpy.count(), 1); ma1Spy.clear(); imaSpy.clear(); QTest::mouseClick(quickView.data(), Qt::LeftButton, 0, QPoint(10, 65), DOUBLECLICK_TIMEOUT); QTest::waitForEvents(); QCOMPARE(ma1Spy.count(), 0); QCOMPARE(ma2Spy.count(), 1); QCOMPARE(imaSpy.count(), 1); ma2Spy.clear(); imaSpy.clear(); QTest::mouseClick(quickView.data(), Qt::LeftButton, 0, QPoint(25, 80), DOUBLECLICK_TIMEOUT); QTest::waitForEvents(); QCOMPARE(ma1Spy.count(), 0); QCOMPARE(ma2Spy.count(), 1); QCOMPARE(imaSpy.count(), 0); // double click should not reach inverse mouse area as onPressed did not accept the events QSignalSpy imaDSpy(area, SIGNAL(doubleClicked(QQuickMouseEvent*))); QTest::mouseDClick(quickView.data(), Qt::LeftButton, 0, QPoint(10, 65)); QCOMPARE(imaDSpy.count(), 0); imaDSpy.clear(); QTest::mouseDClick(quickView.data(), Qt::LeftButton, 0, QPoint(10, 10)); QCOMPARE(imaDSpy.count(), 0); imaDSpy.clear(); } void testCase_InverseMouseAreaOnTopTopmost() { QScopedPointer quickView(new InverseMouseAreaTest("InverseMouseAreaOnTop.qml")); InverseMouseAreaType *area = quickView->findItem("IMA"); area->setProperty("topmostItem", true); QQuickItem *ma2 = quickView->findItem("MA2"); QSignalSpy imaSpy(area, SIGNAL(pressed(QQuickMouseEvent*))); QSignalSpy ma2Spy(ma2, SIGNAL(pressed(QQuickMouseEvent*))); // click on the topmost rectangle QTest::mouseClick(quickView.data(), Qt::LeftButton, 0, QPoint(10, 10), DOUBLECLICK_TIMEOUT); QTest::waitForEvents(); QCOMPARE(ma2Spy.count(), 0); QCOMPARE(imaSpy.count(), 1); imaSpy.clear(); // click on the second rectangle QTest::mouseClick(quickView.data(), Qt::LeftButton, 0, QPoint(10, 65), DOUBLECLICK_TIMEOUT); QTest::waitForEvents(); QCOMPARE(ma2Spy.count(), 0); QCOMPARE(imaSpy.count(), 1); imaSpy.clear(); // click on the button QTest::mouseClick(quickView.data(), Qt::LeftButton, 0, QPoint(25, 85), DOUBLECLICK_TIMEOUT); QTest::waitForEvents(); QCOMPARE(ma2Spy.count(), 1); QCOMPARE(imaSpy.count(), 0); // double click on the second rectangle QSignalSpy imaDSpy(area, SIGNAL(doubleClicked(QQuickMouseEvent*))); QTest::mouseDClick(quickView.data(), Qt::LeftButton, 0, QPoint(10, 65)); QCOMPARE(imaDSpy.count(), 1); imaDSpy.clear(); // double click on the first rectangle QTest::mouseDClick(quickView.data(), Qt::LeftButton, 0, QPoint(10, 10)); QCOMPARE(imaDSpy.count(), 1); imaDSpy.clear(); } void testCase_InverseMouseAreaSignals() { QScopedPointer quickView(new InverseMouseAreaTest("InverseMouseAreaSignals.qml")); InverseMouseAreaType *area = quickView->findItem("IMA"); QSignalSpy pressSpy(area, SIGNAL(pressed(QQuickMouseEvent*))); QSignalSpy releaseSpy(area, SIGNAL(released(QQuickMouseEvent*))); QSignalSpy clickSpy(area, SIGNAL(clicked(QQuickMouseEvent*))); QSignalSpy enteredSpy(area, SIGNAL(entered())); QSignalSpy exitedSpy(area, SIGNAL(exited())); QTest::mouseClick(quickView.data(), Qt::LeftButton, 0, QPoint(5, 5), DOUBLECLICK_TIMEOUT); QCOMPARE(pressSpy.count(), 1); QCOMPARE(releaseSpy.count(), 1); QCOMPARE(clickSpy.count(), 1); QCOMPARE(enteredSpy.count(), 1); QCOMPARE(exitedSpy.count(), 1); QSignalSpy doubleClickSpy(area, SIGNAL(doubleClicked(QQuickMouseEvent*))); QTest::mouseDClick(quickView.data(), Qt::LeftButton, 0, QPoint(5, 5)); QCOMPARE(doubleClickSpy.count(), 1); } void testCase_InverseMouseAreaNormalEventStack() { QScopedPointer quickView(new InverseMouseAreaTest("InverseMouseAreaNormalEventStack.qml")); InverseMouseAreaType *ima = quickView->findItem("IMA"); QQuickItem *ma = quickView->findItem("MA"); QSignalSpy imaSpy(ima, SIGNAL(pressed(QQuickMouseEvent*))); QSignalSpy maSpy(ma, SIGNAL(pressed(QQuickMouseEvent*))); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(15, 15)); QCOMPARE(imaSpy.count(), 0); QCOMPARE(maSpy.count(), 0); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(115, 15)); QCOMPARE(imaSpy.count(), 0); QCOMPARE(maSpy.count(), 1); maSpy.clear(); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(115, 115)); QCOMPARE(imaSpy.count(), 1); QCOMPARE(maSpy.count(), 0); } void testCase_InverseMouseAreaTopmost() { QScopedPointer quickView(new InverseMouseAreaTest("InverseMouseAreaTopmostItem.qml")); InverseMouseAreaType *ima = quickView->findItem("IMA"); QQuickItem *ma = quickView->findItem("MA"); QSignalSpy imaSpy(ima, SIGNAL(pressed(QQuickMouseEvent*))); QSignalSpy maSpy(ma, SIGNAL(pressed(QQuickMouseEvent*))); QSignalSpy imaDblClick(ima, SIGNAL(doubleClicked(QQuickMouseEvent*))); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(15, 15), DOUBLECLICK_TIMEOUT); QCOMPARE(imaSpy.count(), 0); QCOMPARE(maSpy.count(), 0); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(115, 15), DOUBLECLICK_TIMEOUT); QCOMPARE(imaSpy.count(), 1); QCOMPARE(maSpy.count(), 0); imaSpy.clear(); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(115, 115), DOUBLECLICK_TIMEOUT); QCOMPARE(imaSpy.count(), 1); QCOMPARE(maSpy.count(), 0); QTest::mouseDClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(115, 15)); QCOMPARE(imaDblClick.count(), 1); } void testCase_InverseMouseAreaSensingArea() { QScopedPointer quickView(new InverseMouseAreaTest("InverseMouseAreaSensingArea.qml")); InverseMouseAreaType *ima = quickView->findItem("IMA"); QQuickItem *ma = quickView->findItem("MA"); QSignalSpy maSpy(ma, SIGNAL(clicked(QQuickMouseEvent*))); QSignalSpy imaSpy(ima, SIGNAL(clicked(QQuickMouseEvent*))); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(75, 75)); QCOMPARE(maSpy.count(), 0); QCOMPARE(imaSpy.count(), 1); imaSpy.clear(); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(25, 25)); QCOMPARE(maSpy.count(), 1); QCOMPARE(imaSpy.count(), 0); maSpy.clear(); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(175, 175)); QCOMPARE(maSpy.count(), 1); QCOMPARE(imaSpy.count(), 0); } void testCase_InverseMouseAreaSensingAreaChange() { QScopedPointer quickView(new InverseMouseAreaTest("InverseMouseAreaSensingArea.qml")); InverseMouseAreaType *ima = quickView->findItem("IMA"); QQuickItem *ma = quickView->findItem("MA"); QSignalSpy maSpy(ma, SIGNAL(clicked(QQuickMouseEvent*))); QSignalSpy imaSpy(ima, SIGNAL(clicked(QQuickMouseEvent*))); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(75, 75)); QCOMPARE(maSpy.count(), 0); QCOMPARE(imaSpy.count(), 1); imaSpy.clear(); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(25, 25)); QCOMPARE(maSpy.count(), 1); QCOMPARE(imaSpy.count(), 0); maSpy.clear(); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(175, 175)); QCOMPARE(maSpy.count(), 1); QCOMPARE(imaSpy.count(), 0); maSpy.clear(); ima->setProperty("sensingArea", QVariant()); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(75, 75)); QCOMPARE(maSpy.count(), 0); QCOMPARE(imaSpy.count(), 1); imaSpy.clear(); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(25, 25)); QCOMPARE(maSpy.count(), 0); QCOMPARE(imaSpy.count(), 1); imaSpy.clear(); QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, QPoint(175, 175)); QCOMPARE(maSpy.count(), 1); QCOMPARE(imaSpy.count(), 0); } void test_MouseClicksOnHeaderNotSeen_bug1288876_data() { QTest::addColumn("document"); QTest::newRow("InverseMouseArea in a Page") << "InverseMouseAreaInPage.qml"; QTest::newRow("InverseMouseArea with clip") << "InverseMouseAreaClip.qml"; QTest::newRow("InverseMouseArea parent clipped") << "InverseMouseAreaParentClipped.qml"; QTest::newRow("InverseMouseArea in a ListView") << "InverseMouseAreaInListView.qml"; QTest::newRow("InverseMouseArea in a Flickable") << "InverseMouseAreaInFlickable.qml"; } void test_MouseClicksOnHeaderNotSeen_bug1288876() { QFETCH(QString, document); QScopedPointer quickView(new InverseMouseAreaTest(document)); InverseMouseAreaType *ima = quickView->rootObject()->property("ima").value(); QSignalSpy imaSpy(ima, SIGNAL(clicked(QQuickMouseEvent*))); // make sure we click on the header QTest::mouseClick(quickView.data(), Qt::LeftButton, Qt::NoModifier, guPoint(20, 5)); QCOMPARE(imaSpy.count(), 1); imaSpy.clear(); UCTestExtras::touchClick(0, quickView->rootObject(), guPoint(20, 5)); QCOMPARE(imaSpy.count(), 1); } }; QTEST_MAIN(tst_InverseMouseAreaTest) #include "tst_inversemouseareatest.moc" ./tests/unit_x11/tst_inversemousearea/InverseMouseAreaInPage.qml0000644000015600001650000000242112700370701025166 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { id: root width: units.gu(40) height: units.gu(71) property InverseMouseArea ima: imaItem Page { title: "Test" Rectangle { objectName: "Card" width: parent.width - units.gu(5) height: units.gu(50) anchors.centerIn: parent color: "blue" InverseMouseArea { id: imaItem objectName: "Test_IMA" anchors.fill: parent topmostItem: true Component.onCompleted: root.ima = ima } } } } ./tests/unit_x11/tst_inversemousearea/InverseMouseAreaParentClipped.qml0000644000015600001650000000273112700370701026561 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { id: root width: units.gu(40) height: units.gu(71) property InverseMouseArea ima: null Component { id: imaComponent InverseMouseArea { id: ima objectName: "Test_IMA" anchors.fill: parent topmostItem: true Component.onCompleted: root.ima = ima } } Component.onCompleted: loader.sourceComponent = imaComponent Page { title: "Test" Rectangle { objectName: "Card" width: parent.width - units.gu(5) height: units.gu(50) anchors.centerIn: parent color: "teal" clip: true Loader { id: loader anchors.fill: parent } } } } ./tests/unit_x11/tst_components/0000755000015600001650000000000012700370716016771 5ustar jenkinsjenkins./tests/unit_x11/tst_components/tst_listitem_selectmode13.qml0000644000015600001650000001240112700370714024574 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import QtTest 1.0 import Ubuntu.Test 1.3 MainView { applicationName: "testapp.nik90" width: units.gu(100) height: units.gu(75) Page { title: i18n.tr("ListView Bug") UbuntuListView { id: listView ListModel { id: instructionModel ListElement { text: "Let's try to reproduce this listview bug ;)" } ListElement { text: "Step 1: Long press to active multiselect mode" } ListElement { text: "Step 2: Press on any checkbox to select that listitem" } ListElement { text: "Step 3: Now press on the list item of the checkbox you chose in the previous step." } ListElement { text: "Notice how it doesn't select/unselect it despite pressing it" } ListElement { text: "Also notice how when pressing on the listitem in step 3, the selected indice still changes!" } } anchors { fill: parent bottomMargin: parent.height / 2 } clip: true model: instructionModel delegate: ListItem { objectName: "listItem" + index height: units.gu(8) contentItem.anchors { leftMargin: units.gu(2); rightMargin: units.gu(2) } Label { id: label text: modelData anchors.fill: parent wrapMode: Text.WordWrap verticalAlignment: Text.AlignVCenter } onPressAndHold: { ListView.view.ViewItems.selectMode = !ListView.view.ViewItems.selectMode } onClicked: { if (selectMode) { selected = !selected } } } footer: Label { anchors { left: parent.left; leftMargin: units.gu(2) } width: parent.width text: "Selected Indices: " + listView.ViewItems.selectedIndices } } UbuntuListView { id: testView anchors { fill: parent topMargin: parent.height / 2 } clip: true } } Component { id: selectModePreset ListItem { id: litem objectName: "listItem" + index selectMode: true property SignalSpy selectedChangedSpy: SignalSpy { target: litem signalName: "selectedChanged" } } } ListItemTestCase13 { name: "ListItem13.selectMode" when: windowShown function cleanup() { listView.ViewItems.selectMode = false; testView.model = null; testView.delegate = null; wait(200); } function test_select_toggle_breaks_property_binding_bug1469471() { listView.ViewItems.selectMode = true; wait(400); // select through checkbox var listItem = findChild(listView, "listItem0"); verify(listItem); var panel = findChild(listItem, "selection_panel0"); verify(panel); var checkBox = findChild(panel, "listitem_select"); verify(checkBox); // check the box mouseClick(checkBox, 0, 0); compare(checkBox.checked, true); // now toggle selected listItem.selected = !listItem.selected; compare(checkBox.checked, false); } function test_select_mode_turned_on_delegate_on_creation_bug1493882() { testView.delegate = selectModePreset; testView.model = 10; waitForRendering(testView, 500); var item = findChild(testView, "listItem0"); verify(item); var selectPanel = findChild(item, "selection_panel0"); verify(selectPanel, "selection panel not found"); } function test_togle_selded_triggers_one_selectedChanged_bug1493880() { testView.delegate = selectModePreset; testView.model = 10; waitForRendering(testView, 500); var item0 = findChild(testView, "listItem0"); var item1 = findChild(testView, "listItem1"); verify(item0 && item1); // select #0 item0.selected = true; item0.selectedChangedSpy.wait(); compare(item1.selectedChangedSpy.count, 0, "Only the selected item should emit the change signal!"); } } } ./tests/unit_x11/tst_components/tst_components.pro0000644000015600001650000000035012700370701022562 0ustar jenkinsjenkinsTESTS += $$system(ls tst_*.qml) include(../qmltest-include.pri) TARGET = tst_components SOURCES += tst_components.cpp tabsmodel.cpp HEADERS += tabsmodel.h OTHER_FILES += $$system(ls *.qml) OTHER_FILES += $$system(ls AppTheme/*) ./tests/unit_x11/tst_components/tst_ubuntulistview13.qml0000644000015600001650000000572412700370714023661 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.3 import Ubuntu.Components 1.3 Item { width: units.gu(40) height: units.gu(60) ListModel { id: dummyModel Component.onCompleted: { reload(); } function reload() { clear(); for (var i = 0; i < 20; ++i) { dummyModel.append({idx: i}); } } } // timer used to simulate the model refresh Timer { id: refreshTimer interval: 500 onTriggered: { dummyModel.reload(); } } UbuntuListView { id: ubuntuListView anchors.fill: parent clip: true model: dummyModel pullToRefresh { refreshing: refreshTimer.running onRefresh: refreshTimer.restart() } delegate: ListItem { id: expandable Label { text: "item " + index } } } UbuntuTestCase { name: "UbuntuListView" when: windowShown SignalSpy { id: refreshSpy signalName: "onRefresh" } function initTestCase() { tryCompare(dummyModel, "count", 20); } function init() { waitForRendering(ubuntuListView, 1000); } function cleanup() { // scroll the ListView back to top ubuntuListView.positionViewAtIndex(0, ListView.Beginning); refreshSpy.clear(); refreshSpy.target = null; ubuntuListView.pullToRefresh.enabled = false; } function test_0_defaults() { verify(ubuntuListView.hasOwnProperty("pullToRefresh"), "PullToRefresh is missing"); compare(ubuntuListView.pullToRefresh.enabled, false, "PullToRefresh functionality is disabled by default"); } function test_pullToRefresh_manual_refresh() { ubuntuListView.pullToRefresh.enabled = true; refreshSpy.target = ubuntuListView.pullToRefresh var x = ubuntuListView.width / 2; mouseDrag(ubuntuListView, x, units.gu(1), 0, ubuntuListView.height); refreshSpy.wait(); tryCompareFunction(function() { return ubuntuListView.pullToRefresh.refreshing; }, false, 1000); waitForRendering(ubuntuListView, 1000); } } } ./tests/unit_x11/tst_components/tst_pagehead_back_action.qml0000644000015600001650000001311012700370701024437 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 // NOTE: Other parts of the page head API are tested with autopilot in // ubuntuuitoolkit.tests.components.test_header Item { width: units.gu(50) height: units.gu(80) MainView { id: mainView anchors.fill: parent PageStack { id: pageStack Page { id: page1 title: "First page" Button { anchors.centerIn: parent onClicked: pageStack.push(page2) text: "Push page 2" } head { actions: [ Action { iconName: "settings" text: "first" onTriggered: print("Trigger first action") }, Action { iconName: "info" text: "second" onTriggered: print("Trigger second action") }, Action { iconName: "search" text: "third" onTriggered: print("Trigger third action") }, Action { iconName: "appointment" text: "fourth" onTriggered: print("Trigger fourth action") } ] } } Page { id: page2 visible: false title: "Second page" Action { id: customBackAction iconName: "close" text: "Close" onTriggered: print("Triggered custom back action.") } Action { id: invisibleAction visible: false } head { backAction: customBackActionSwitch.checked ? customBackAction : null } Row { anchors.centerIn: parent spacing: units.gu(1) Label { text: "standard" } Switch { id: customBackActionSwitch } Label { text: "custom back action" } } } } Component.onCompleted: { pageStack.push(page1); } } UbuntuTestCase { name: "HeaderBackButton" when: windowShown id: testCase property var back_button property var custom_back_button function initTestCase() { var app_header = findChild(mainView, "MainView_Header"); testCase.back_button = findChild(app_header, "backButton"); testCase.custom_back_button = findChild(app_header, "customBackButton"); waitForHeaderAnimation(mainView); compare(page2.head.backAction, null, "Back action set by default."); compare(back_button.visible, false, "Back button visible with only 1 page on the stack."); compare(custom_back_button.visible, false, "Custom back button visible without custom back action.") } function test_default_back_button() { pageStack.push(page2); waitForHeaderAnimation(mainView); compare(back_button.visible, true, "Back button not visible with 2 pages on stack."); compare(custom_back_button.visible, false, "Showing custom back button without custom back action."); pageStack.pop(); waitForHeaderAnimation(mainView); } function test_custom_back_button() { page2.head.backAction = customBackAction; pageStack.push(page2); waitForHeaderAnimation(mainView); compare(back_button.visible, false, "Default back button visible with custom back action."); compare(custom_back_button.visible, true, "Custom back button invisible with back action."); pageStack.pop(); waitForHeaderAnimation(mainView); page2.head.backAction = null; } function test_no_back_button() { page2.head.backAction = invisibleAction; pageStack.push(page2); waitForHeaderAnimation(mainView); compare(back_button.visible, false, "Default back button visible with invisible custom back action."); compare(custom_back_button.visible, false, "Custom back button visible with invisible custom back action."); pageStack.pop(); waitForHeaderAnimation(mainView); page2.head.backAction = null; } } } ./tests/unit_x11/tst_components/MyExternalPage.qml0000644000015600001650000000153012700370701022362 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Page { title: "Page from QML file" Label { anchors.centerIn: parent text: "This page was created from MyExternalPage.qml." } } ./tests/unit_x11/tst_components/tst_components.cpp0000644000015600001650000000212712700370701022550 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include #include "tabsmodel.h" class Register { public: Register() { qmlRegisterType("TestObjects", 0, 1, "TabsModel"); savedDataDirs = qgetenv("XDG_DATA_DIRS"); qputenv("XDG_DATA_DIRS", "/usr/share"); } ~Register() { qputenv("XDG_DATA_DIRS", savedDataDirs); } private: QByteArray savedDataDirs; }; Register r; QUICK_TEST_MAIN(components) ./tests/unit_x11/tst_components/tst_textinput_common13.qml0000644000015600001650000005367212700370714024171 0ustar jenkinsjenkins/* * Copyright 2014-2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.3 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 Item { id: testMain width: units.gu(40) height: units.gu(50) Component { id: popoverComponent Popover { property var textField: textFieldInPopover Rectangle { anchors.fill: parent color: UbuntuColors.orange } Column { anchors.margins: units.gu(2) Label { text: 'This is a text field in a popover' } TextField { id: textFieldInPopover } Label { text: 'Focus the text field' } } } } Component { id: dialogComponent Dialog { id: dialog property var textField: textFieldInDialog Label { text: 'This is a text field in a dialog' height: units.gu(10) } TextField { id: textFieldInDialog height: units.gu(10) } Label { text: 'Focus the text field' height: units.gu(10) } Button { text: 'Close' onClicked: PopupUtils.close(dialog) } } } Column { spacing: units.gu(1) anchors { topMargin: units.gu(4) top: parent.top } Button { id: popoverButton text: 'Open Popover' onClicked: PopupUtils.open(popoverComponent, popoverButton) } Button { text: 'Open Popover with no target' onClicked: PopupUtils.open(popoverComponent) } Button { id: dialogButton text: 'Open Dialog' onClicked: PopupUtils.open(dialogComponent, dialogButton) } TextField { id: textField } TextField { id: customTextField text: 'Lorem ipsum dolor sit amet' primaryItem: AbstractButton { id: primaryButton height: parent.height width: height Image { anchors.fill: parent anchors.margins: units.gu(0.5) source: 'image://theme/torch-on' } } secondaryItem: AbstractButton { id: secondaryButton height: parent.height width: height Image { anchors.fill: parent anchors.margins: units.gu(0.5) source: 'image://theme/settings' } } } TextArea { id: textArea } TextField { id: password echoMode: TextInput.Password text: 'deadbeef' } } MockKeyboard { Component.onCompleted: UbuntuApplication.inputMethod = this } SignalSpy { id: cursorPositionSpy signalName: "onCursorPositionChanged" } SignalSpy { id: selectionStartSpy signalName: "onSelectionStartChanged" } SignalSpy { id: selectionEndSpy signalName: "onSelectionEndChanged" } SignalSpy { id: selectedTextSpy signalName: "onSelectedTextChanged" } SignalSpy { id: popupSpy signalName: "pressAndHold" } SignalSpy { id: movementXSpy signalName: "onContentXChanged" } SignalSpy { id: movementYSpy signalName: "contentYChanged" } SignalSpy { id: scrollerSpy signalName: "movementEnded" } SignalSpy { id: escapePressedSpy signalName: "escapePressed" } UbuntuTestCase { name: "TextInputCommonTest13" when: windowShown function init() { textField.text = "This is a single line text input called TextField."; textArea.text = "This is a multiline text input component called TextArea. It supports fix size as well as auto-expanding behavior. The content is scrollable only if it exceeds the visible area."; textField.cursorPosition = 0; textArea.cursorPosition = 0; waitForRendering(textField, 500); waitForRendering(textArea, 500); } function cleanup() { textField.focus = false; textArea.focus = false; cursorPositionSpy.clear(); selectionStartSpy.clear(); selectionEndSpy.clear(); selectedTextSpy.clear(); popupSpy.clear(); movementXSpy.clear(); movementYSpy.clear(); cursorRectSpy.clear(); scrollerSpy.clear(); escapePressedSpy.clear(); } function test_context_menu_items_data() { return [ { tag: 'textField with text', input: textField, text: "lalelu", all: true, copy: false }, { tag: 'textField selected', input: textField, text: "lalelu", select: true, all: false, copy: true }, { tag: 'textArea with text', input: textArea, text: "lalelu", all: true, copy: false }, { tag: 'textArea selected', input: textArea, text: "lalelu", select: true, all: false, copy: true }, { tag: 'textField with password', input: password, text: "deadbeef", all: true, copy: false }, ] } function test_context_menu_items(data) { var handler = findChild(data.input, "input_handler"); popupSpy.target = handler; data.input.focus = true; var x = data.input.width / 2; var y = data.input.height / 2; mouseClick(data.input, x, y, Qt.RightButton); popupSpy.wait(); var popover = findChild(testMain, "text_input_contextmenu"); verify(popover, "Cannot retrieve default TextInputPopover"); waitForRendering(popover); if (data.select) { var selectAll = findChildWithProperty(popover, "text", "Select All"); verify(selectAll, "Select All item not found"); mouseClick(selectAll, selectAll.width / 2, selectAll.height / 2); waitForRendering(data.input, 1000); compare(data.input.text, data.input.selectedText, "Not all the text is selected"); } var all = findChildWithProperty(popover, "text", "Select All"); compare(all.visible, data.all, "Select All%1expected".arg(data.all ? " " : " not ")) var copy = findChildWithProperty(popover, "text", "Copy"); compare(copy.visible, data.copy, "Copy%1expected".arg(data.copy ? " " : " not ")) } function test_clear_text_using_popover_data() { return [ {input: textField}, {input: textArea}, ]; } function test_clear_text_using_popover(data) { var handler = findChild(data.input, "input_handler"); popupSpy.target = handler; data.input.focus = true; // invoke popover var x = data.input.width / 2; var y = data.input.height / 2; mouseClick(data.input, x, y, Qt.RightButton); popupSpy.wait(); var popover = findChild(testMain, "text_input_contextmenu"); verify(popover, "Cannot retrieve default TextInputPopover"); waitForRendering(popover); // select all var selectAll = findChildWithProperty(popover, "text", "Select All"); verify(selectAll, "Select All item not found"); mouseClick(selectAll, selectAll.width / 2, selectAll.height / 2); waitForRendering(data.input, 1000); compare(data.input.text, data.input.selectedText, "Not all the text is selected"); // delete with key press keyClick(Qt.Key_Backspace); waitForRendering(data.input, 1000); compare(data.input.text, "", "The text has not been deleted"); // dismiss popover mouseClick(testMain, testMain.width / 2, testMain.height / 2); wait(200); } SignalSpy { id: cursorRectSpy signalName: "cursorRectangleChanged" } function test_input_pageup_pagedown_data() { return [ {tag: "PageUp in TextField", input: textField, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.NoModifier, xfail: false}, {tag: "PageDown in TextField", input: textField, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.NoModifier, xfail: false}, {tag: "PageUp in TextArea", input: textArea, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.NoModifier, xfail: false}, {tag: "PageDown in TextArea", input: textArea, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.NoModifier, xfail: false}, {tag: "Ctrl+PageUp in TextField", input: textField, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.ControlModifier, xfail: true}, {tag: "Ctrl+PageDown in TextField", input: textField, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.ControlModifier, xfail: true}, {tag: "Ctrl+PageUp in TextArea", input: textArea, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.ControlModifier, xfail: true}, {tag: "Ctrl+PageDown in TextArea", input: textArea, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.ControlModifier, xfail: true}, {tag: "Shift+PageUp in TextField", input: textField, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.ShiftModifier, xfail: true}, {tag: "Shift+PageDown in TextField", input: textField, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.ShiftModifier, xfail: true}, {tag: "Shift+PageUp in TextArea", input: textArea, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.ShiftModifier, xfail: true}, {tag: "Shift+PageDown in TextArea", input: textArea, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.ShiftModifier, xfail: true}, {tag: "Alt+PageUp in TextField", input: textField, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.AltModifier, xfail: true}, {tag: "Alt+PageDown in TextField", input: textField, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.AltModifier, xfail: true}, {tag: "Alt+PageUp in TextArea", input: textArea, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.AltModifier, xfail: true}, {tag: "Alt+PageDown in TextArea", input: textArea, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.AltModifier, xfail: true}, ]; } function test_input_pageup_pagedown(data) { var handler = findChild(data.input, "input_handler"); data.input.focus = true; // move the cursor to the end if (data.moveToEnd) { keyClick(Qt.Key_End); waitForRendering(data.input, 500); verify(data.input.cursorPosition > 0, "The cursor wasn't moved"); } cursorRectSpy.target = data.input; keyClick(data.key, data.modifier); waitForRendering(data.input, 500); if (data.xfail) { expectFailContinue(data.tag, "With modifier"); } cursorRectSpy.wait(500); cursorRectSpy.target = null; } function test_scroll_when_not_focused_data() { return [ // dx and dy are in eights of a degree; see QWheelEvent::angleDelta() for more details. {tag: "TextField", input: textField, x: textField.width / 2, y: textField.height / 2, dx: -240, dy: 0}, {tag: "TextArea", input: textArea, x: textField.width / 2, y: textField.height / 2, dx: 0, dy: -240}, ]; } function test_scroll_when_not_focused(data) { var scroller = findChild(data.input, "input_scroller"); scrollerSpy.target = scroller; mouseWheel(data.input, data.x, data.y, data.dx, data.dy); expectFailContinue(data.tag, "Content must not scroll while inactive"); scrollerSpy.wait(500); } function test_scroll_when_focused_data() { return [ // dx and dy are in eights of a degree; see QWheelEvent::angleDelta() for more details. {tag: "TextField", input: textField, x: textField.width / 2, y: textField.height / 2, dx: -480, dy: 0}, {tag: "TextArea", input: textArea, x: textArea.width / 2, y: textArea.height / 2, dx: 0, dy: -480}, ]; } function test_scroll_when_focused(data) { var scroller = findChild(data.input, "input_scroller"); scrollerSpy.target = scroller; // focus component data.input.focus = true; mouseWheel(data.input, data.x, data.y, data.dx, data.dy); waitForRendering(data.input); scrollerSpy.wait(); } function test_rightclick_opens_popover_data() { return [ {tag: "TextField active", input: textField, whenFocused: true}, {tag: "TextArea active" , input: textArea, whenFocused: true}, {tag: "TextField inactive", input: textField, whenFocused: false}, {tag: "TextArea inactive" , input: textArea, whenFocused: false}, ]; } function test_rightclick_opens_popover(data) { var handler = findChild(data.input, "input_handler"); popupSpy.target = handler; if (data.whenFocused) { data.input.focus = true; waitForRendering(data.input); } mouseClick(data.input, data.input.width / 2, data.input.height / 2, Qt.RightButton); waitForRendering(data.input); popupSpy.wait(); verify(data.input.cursorPosition !== 0, "Cursor should be moved to the mouse click position.") // dismiss popover mouseClick(testMain, 0, 0); // add some timeout to get the event buffer cleaned wait(500); } function test_clear_selection_on_click_data() { return [ {tag: "TextField click on selection", input: textField, selectChars: 10, clickPos: Qt.point(10, textField.height / 2)}, {tag: "TextArea click on selection", input: textArea, selectChars: 40, clickPos: Qt.point(20, 20)}, {tag: "TextField click beside selection", input: textField, selectChars: 5, clickPos: Qt.point(textField.width / 2, textField.height / 2)}, {tag: "TextArea click beside selection", input: textArea, selectChars: 1, clickPos: Qt.point(textArea.width / 2, textArea.height / 2)}, ]; } function test_clear_selection_on_click(data) { data.input.focus = true; data.input.select(0, data.selectChars); verify(data.input.selectedText !== "", "No text selected!"); mouseClick(data.input, data.clickPos.x, data.clickPos.y); verify(data.input.selectedText === "", "There is still text selected!"); } function test_select_text_by_mouse_drag_data() { return [ {tag: "TextField", input: textField}, {tag: "TextArea", input: textArea}, ]; } function test_select_text_by_mouse_drag(data) { data.input.focus = true; flick(data.input, 0, 0, data.input.width / 2, data.input.height / 2); waitForRendering(data.input); verify(data.input.selectedText !== "", "There's no text selected!"); } function test_no_caret_when_no_touchscreen_data() { return [ {tag: "TextField", input: textField}, {tag: "TextArea", input: textArea}, ]; } function test_no_caret_when_no_touchscreen(data) { if (TestExtras.touchDevicePresent()) { skip("This test cannot be executed in touch environment"); } data.input.focus = true; waitForRendering(data.input); var cursor = findChild(data.input, "textCursor"); verify(cursor, "Cursor not accessible, FAIL"); verify(cursor.caret, "No caret is set"); compare(cursor.caret.visible, false, "Caret must not be visible!"); } function test_select_text_with_double_click_data() { return [ {tag: "TextField", input: textField}, {tag: "TextArea", input: textArea}, ]; } function test_select_text_with_double_click(data) { data.input.focus = true; waitForRendering(data.input, 500); mouseDoubleClick(data.input, units.gu(1), units.gu(1)); waitForRendering(data.input, 500); expectFail(data.tag, "mouseDoubleClick() fails to trigger") verify(data.input.selectedText != "", "No text selected."); } function test_osk_displaces_popover_data() { return [ { tag: 'popover', component: popoverComponent, target: popoverButton, offScreen: false }, { tag: 'popover', component: popoverComponent, target: null, offScreen: false }, { tag: 'dialog', component: dialogComponent, target: null, offScreen: true }, ] } function test_osk_displaces_popover(data) { var popover = PopupUtils.open(data.component, data.target); waitForRendering(popover); popover.textField.forceActiveFocus(); waitForRendering(popover.textField); // Only get the value here so in case of failure the popover won't get stuck var popoverY = popover.y; // dismiss popover PopupUtils.close(popover); // add some timeout to get the event buffer cleaned wait(500); if (data.offScreen) verify(popoverY < 0, 'Dialog did not shift upwards: %1'.arg(popoverY)); else verify(popoverY >= 0, 'Popover went off-screen: %1'.arg(popoverY)); } function test_osk_shrinks_dialog() { var popover = PopupUtils.open(dialogComponent); waitForRendering(popover); // Original height before showing OSK var originalHeight = popover.height; // Subtract OSK var expectedHeight = originalHeight - UbuntuApplication.inputMethod.keyboardRectangle.height; popover.textField.forceActiveFocus(); waitForRendering(popover.textField); // Only get the value here so in case of failure the popover won't get stuck var foreground = findChild(popover, "dialogForeground") var availableHeight = foreground.height; // dismiss popover PopupUtils.close(popover); // add some timeout to get the event buffer cleaned wait(500); verify(availableHeight <= expectedHeight, 'Dialog did not shrink (%1 > %2)'.arg(availableHeight).arg(expectedHeight)); } function test_secondaryItem_must_not_grab_focus_data() { return [ { tag: 'same', input: textField }, { tag: 'other', input: customTextField }, ]; } function test_secondaryItem_must_not_grab_focus(data) { textField.forceActiveFocus(); compare(textField.focus, true, 'TextField is focused'); var clearButton = findChild(textField, "clear_button") mouseClick(clearButton, clearButton.width/2, clearButton.height/2); waitForRendering(data.input, 500); compare(textField.focus, true, 'TextField no longer focused'); mouseClick(primaryButton, primaryButton.width/2, primaryButton.height/2); waitForRendering(data.input, 500); compare(textField.focus, true, 'TextField no longer focused'); mouseClick(secondaryButton, secondaryButton.width/2, secondaryButton.height/2); waitForRendering(data.input, 500); compare(textField.focus, true, 'TextField no longer focused'); } function test_escape_key_handling_data() { return [ { tag: 'textField', input: textField}, { tag: 'textArea', input: textArea}, ]; } function test_escape_key_handling(data) { escapePressedSpy.target = data.input.parent.Keys popupSpy.target = findChild(data.input, "input_handler"); data.input.focus = true; var x = data.input.width / 2; var y = data.input.height / 2; mouseClick(data.input, x, y, Qt.RightButton); popupSpy.wait(); var popover = findChild(testMain, "text_input_contextmenu"); verify(popover, "Cannot retrieve default TextInputPopover"); waitForRendering(popover); keyClick(Qt.Key_Escape); compare(escapePressedSpy.count, 0); keyClick(Qt.Key_Escape); compare(escapePressedSpy.count, 1); } } } ./tests/unit_x11/tst_components/tst_pageheader.qml0000644000015600001650000004564712700370701022475 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Test 1.0 Rectangle { // Wrap the root Item to work around bug #1504755 which // causes the OverflowPanel to open behind the PageHeader // without this wrapper Item. id: wrapper width: units.gu(100) height: units.gu(70) color: "darkgrey" Rectangle { anchors { top: parent.top bottom: parent.bottom left: parent.left } width: widthSwitch.checked ? parent.width : units.gu(40) color: "white" id: root property real initialHeaderHeight: units.gu(6) property list sectionActions: [ Action { text: "first" }, Action { text: "second" }, Action { text: "third" } ] Rectangle { id: alternativeContents visible: header.contents === alternativeContents objectName: "alternative_contents" anchors.fill: parent color: UbuntuColors.red Label { anchors.centerIn: parent text: "Custom header contents" color: "white" } } property list actionList: [ Action { iconName: "settings" text: "first" onTriggered: print("Trigger first action") objectName: "action1" }, Action { iconName: "info" text: "second" onTriggered: print("Trigger second action") objectName: "two" }, Action { iconName: "search" text: "third" onTriggered: print("Trigger third action") objectName: "three" }, Action { iconName: "appointment" text: "fourth" onTriggered: print("Trigger fourth action") objectName: "four" }, Action { iconName: "attachment" text: "Attach" objectName: "five" }, Action { iconName: "contact" text: "Contact" objectName: "six" }, Action { iconName: "like" text: "Like" objectName: "seven" }, Action { iconName: "lock" text: "Lock" objectName: "eight" } ] Rectangle { id: appendix anchors { left: parent ? parent.left : undefined right: parent ? parent.right : undefined bottom: parent ? parent.bottom : undefined } height: units.gu(4) color: UbuntuColors.orange Label { anchors.centerIn: parent text: "Mock extension" color: "white" } visible: header.extension === appendix } PageHeader { id: header flickable: flickable z:1 title: "Default title" contents: contentsSwitch.checked ? alternativeContents : null sections.actions: sectionsSwitch.checked ? root.sectionActions : [] trailingActionBar.actions: trailingActionsSwitch.checked ? root.actionList : [] navigationActions: leadingActionsSwitch.checked ? root.actionList : [] extension: extensionSwitch.checked ? appendix : null } Flickable { id: flickable anchors { top: header.flickable ? parent.top : header.bottom left: parent.left right: parent.right bottom: parent.bottom } contentHeight: root.height * 2 Grid { id: switchGrid columns: 2 spacing: units.gu(1) anchors { top: parent.top left: parent.left leftMargin: units.gu(5) topMargin: root.initialHeaderHeight } Switch { id: lockedSwitch checked: null === header.flickable function trigger() { if (header.flickable) { header.flickable = null; } else { header.flickable = flickable; } } } Label { text: "header locked" } Switch { id: hiddenSwitch checked: header.exposed function trigger() { header.exposed = !header.exposed; } } Label { text: "header exposed" } Switch { id: leadingActionsSwitch checked: false } Label { text: "leading actions" } Switch { id: trailingActionsSwitch checked: true } Label { text: "trailing actions" } Switch { id: contentsSwitch checked: false } Label { text: "replace title by contents" } Switch { id: sectionsSwitch checked: false } Label { text: "show sections" } Switch { id: extensionSwitch checked: false } Label { text: "extension" } Switch { id: widthSwitch checked: false } Label { text: "Resize with window" } } PageHeader { id: defaultHeader visible: false } } UbuntuTestCase { name: "PageHeader" when: windowShown id: testCase property var style; function initTestCase() { style = header.__styleInstance; } function scroll(dy) { var p = centerOf(flickable); // Use mouseWheel to scroll because mouseDrag is very unreliable // and does not properly handle negative values for dy. mouseWheel(flickable, p.x, p.y, 0, dy); } function scroll_down() { scroll(-2.0*header.height); } function scroll_up() { scroll(header.height); } function wait_for_exposed(exposed, errorMessage) { tryCompare(header, "exposed", exposed, 5000, errorMessage); // wait for the animation to finish: tryCompare(header, "moving", false, 5000, "Header still moving?"); if (exposed) { compare(header.y, 0, errorMessage + " y-value/exposed mismatch for exposed header!"); } else { compare(header.y, -header.height, errorMessage + " y-value/exposed mismatch for hidden header!"); } } // Use this function to prevent copying the color by reference. function color_by_value(color) { return Qt.rgba(color.r, color.g, color.b, color.a); } function test_height() { var divider = findChild(style, "header_divider"); compare(header.height, style.contentHeight + divider.height, "Incorrect initial header height."); var initialHeight = header.height; var sections = header.sections; compare(header.sections.height, 0, "Empty sections has non-0 height."); sections.actions = root.sectionActions; compare(sections.height > 0, true, "Sections with actions has non-positive height."); compare(header.height, style.contentHeight + divider.height + sections.height, "Header with sections has incorrect total height."); sections.actions = []; compare(header.height, initialHeight, "Unsetting sections does not revert the header height."); header.extension = appendix; compare(appendix.height > 0, true, "Extension height is 0."); compare(header.height, initialHeight + appendix.height, "Setting extension does not correctly update header height."); header.extension = null; compare(header.height, initialHeight, "Unsetting extension does not revert the header height."); } function test_background_color() { var background = findChild(style, "header_background"); compare(background.color, style.backgroundColor, "Incorrect initial background color."); var initialColor = color_by_value(style.backgroundColor); var otherColor = "#CCFDAA"; // a random color. style.backgroundColor = otherColor; compare(Qt.colorEqual(background.color, otherColor), true, "Updating style background color does not change the background color."); style.backgroundColor = initialColor; compare(Qt.colorEqual(background.color, initialColor), true, "Reverting the background color failed."); } function test_foreground_color() { var color1 = color_by_value(style.foregroundColor); var bar = header.trailingActionBar; var iconButton = findChild(bar, "action1_button"); var buttonStyle = iconButton.__styleInstance; compare(Qt.colorEqual(buttonStyle.foregroundColor, color1), true, "Button foreground color does not match header foreground color."); var label = findChild(header, "header_title_label"); compare(Qt.colorEqual(label.color, color1), true, "Title color does not match header foreground color."); var color2 = "#FF1ABC"; // a random color. style.foregroundColor = color2; compare(Qt.colorEqual(buttonStyle.foregroundColor, color2), true, "Button foreground color does not match updated header foreground color."); compare(Qt.colorEqual(label.color, color2), true, "Title color does not match updated header foreground color."); style.foregroundColor = color1; // revert to the original color. compare(Qt.colorEqual(buttonStyle.foregroundColor, color1), true, "Button foreground color does not match reverted header foreground color."); compare(Qt.colorEqual(label.color, color1), true, "Title color does not match reverted header foreground color."); } function test_divider_color() { var color1 = color_by_value(style.dividerColor); var divider = findChild(style, "header_divider"); compare(Qt.colorEqual(divider.color, color1), true, "Incorrect divider color."); var color2 = "#ACDC12"; // a random color. style.dividerColor = color2; compare(Qt.colorEqual(divider.color, color2), true, "Incorrect updated divider color."); style.dividerColor = color1; compare(Qt.colorEqual(divider.color, color1), true, "Incorrect reverted divider color."); } function test_title() { compare(defaultHeader.title, "", "Header has a title by default."); var oldTitle = header.title; var titleLabel = findChild(header, "header_title_label"); compare(titleLabel.text, oldTitle, "Incorrect title text."); var newTitle = "Updated title text"; header.title = newTitle; compare(titleLabel.text, newTitle, "Incorrect updated title text."); header.title = oldTitle; compare(titleLabel.text, oldTitle, "Incorrect reverted title text."); } function test_contents() { compare(defaultHeader.contents, null, "Default header contents is not null."); compare(header.contents, null, "Header has contents initially."); var titleLabel = findChild(header, "header_title_label"); compare(titleLabel !== null, true, "No title component loaded."); compare(titleLabel.visible, true, "Title is not visible."); var altParent = alternativeContents.parent; header.contents = alternativeContents; titleLabel = findChild(header, "header_title_label"); compare(titleLabel, null, "Setting contents does not unload title."); var headerContents = findChild(header, "alternative_contents"); compare(headerContents, alternativeContents, "New contents was not re-parented to the header."); compare(altParent !== headerContents.parent, true, "Contents parent was not changed."); header.contents = null; titleLabel = findChild(header, "header_title_label"); compare(titleLabel !== null, true, "No title component loaded after unsetting contents."); compare(titleLabel.visible, true, "Title label invisible after unsetting contents."); headerContents = findChild(header, "alternative_contents"); compare(headerContents, null, "Previous header contents is not removed as a child of header."); compare(alternativeContents.parent, altParent, "Contents parent was not reverted."); } function test_navigationActions() { header.navigationActions = []; compare(header.leadingActionBar.actions, header.navigationActions, "Leading action bar actions does not equal navigationActions initially."); header.navigationActions = root.actionList; compare(header.leadingActionBar.actions, header.navigationActions, "Updating navigationActions does not update leading actions."); header.navigationActions = []; compare(header.leadingActionBar.actions, header.navigationActions, "Reverting navigationActions does not revert leading actions."); header.leadingActionBar.actions = root.actionList; compare(header.navigationActions.length, 0, "Setting leading actions changes navigationActions."); header.leadingActionBar.actions = []; compare(header.navigationActions.length, 0, "Reverting leading actions changes navigationActions."); } function test_sections_visible() { compare(header.sections.visible, false, "Sections is not hidden by default."); header.sections.actions = root.sectionActions; compare(header.sections.visible, true, "Sections is not made visible by setting actions."); header.extension = appendix; compare(header.sections.visible, false, "Sections are not hidden when extension is set."); header.extension = null; compare(header.sections.visible, true, "Sections are not shown when extension is unset."); header.sections.actions = []; compare(header.sections.visible, false, "Sections is not hidden by clearing the actions."); } function wait_for_animation() { // One or more action fading animations with a duration // of UbuntuAnimation.BriskDuration = 333ms. wait(500); } function check_number_of_action_slots(widthGU, numberOfSlots) { var width = units.gu(widthGU); if (wrapper.width < width) { skip("Only for screen at least " + widthGU + " GU wide."); } root.width = width; compare(header.trailingActionBar.numberOfSlots, numberOfSlots, "Header with width " + widthGU + " GU does not have " + numberOfSlots + " action slots."); } function test_number_of_action_slots() { var initialWidth = root.width; // test for the values specified in the UX specs document check_number_of_action_slots(40, 3); check_number_of_action_slots(50, 3); check_number_of_action_slots(60, 4); check_number_of_action_slots(70, 5); check_number_of_action_slots(80, 6); check_number_of_action_slots(90, 6); check_number_of_action_slots(100, 6); root.width = initialWidth; } // The properties of header.sections, header.leadingActionBar and // header.trailingActionBar are tested in tst_sections.qml and tst_actionbar.qml. } } } ./tests/unit_x11/tst_components/MyExternalPageWithNewHeader.qml0000644000015600001650000000156712700370714025017 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Page { header: PageHeader { title: "Page from QML file" } Label { anchors.centerIn: parent text: "This page was created from MyExternalPageWithNewHeader.qml." } } ./tests/unit_x11/tst_components/shape.svg0000644000015600001650000000467012700370701020613 0ustar jenkinsjenkins image/svg+xml ./tests/unit_x11/tst_components/tst_tabs.DEPRECATED_TOOLBAR.qml0000644000015600001650000002030012700370701024075 0ustar jenkinsjenkins/* * Copyright 2012-2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 MainView { id: mainView width: units.gu(50) height: units.gu(80) useDeprecatedToolbar: true Tabs { id: tabs Tab { id: tab1 title: "tab 1" page: Page { id: page1 Button { id: button anchors.centerIn: parent text: "click" } } } Tab { id: tab2 title: "tab 2" page: Page { id: page2 } } Tab { id: tab3 title: "tab 3" page: Page { id: page3 } } Tab { id: tabFlick1 title: "flick" page: Page { Flickable { id: flickable1 anchors.fill: parent } } } Tab { id: tabFlick2 title: "flick 2" page: Page { Flickable { id: flickable2 anchors.fill: parent } } } Tab { id: tabFlickLoader title: "load" page: Loader { id: loader sourceComponent: tabs.selectedTabIndex != 5 ? null : pageComponent } } Tab { id: tabNoFlickLoader title: "loadNoFlick" page: Loader { id: loaderNoFlick anchors { left: parent.left right: parent.right bottom: parent.bottom } // height compes from the loaded Page sourceComponent: tabs.selectedTabIndex === 6 ? pageComponentNoFlick : null } } } Component { id: pageComponent Page { title: "Loaded page" property Flickable flick: loadedFlickable Flickable { id: loadedFlickable anchors.fill: parent contentHeight: 1000 } } } Component { id: pageComponentNoFlick Page { title: "Loaded page without flickable" } } UbuntuTestCase { name: "TabsAPIDeprecatedToolbar" when: windowShown /* FIXME function test_tabsDefaults() { compare(tabs.selectedTabIndex, 0, "The default selectedTabIndex is 0 when Tabs has contents"); compare(tabs.selectedTab, tab1, "The default selectedTab is the first tab"); compare(tabs.currentPage, page1, "The default currentPage is the page of the first tab"); compare(mainView.__propagated.toolbar.tools, page1.tools, "The default tools are the tools of the first tab"); compare(mainView.__propagated.header.contents, tabs.tabBar, "Tabs updates the Header contents"); } */ function test_tabsSetSelectedTab() { var tabArray = [tab1, tab2, tab3]; var pageArray = [page1, page2, page3]; for (var i=0; i < 3; i++) { tabs.selectedTabIndex = i; compare(tabs.selectedTabIndex, i, "Can set selectedTabIndex"); compare(tabs.selectedTab, tabArray[i], "Can update selectedTab by setting selectedTabIndex"); compare(tabs.currentPage, pageArray[i], "Can update currentPage by setting selectedTabIndex"); compare(mainView.__propagated.toolbar.tools, pageArray[i].tools, "Activating a Tab updates the tools of the Toolbar"); for (var j=0; j < 3; j++) { compare(pageArray[j].active, j===i, "Only the page of the selected tab is active"); } } } function test_flickable() { // ensure that the flickable of the header is set to the flickable of the selected tab. tabs.selectedTabIndex = 3; compare(mainView.__propagated.header.flickable, flickable1, "Header flickable correctly initialized"); tabs.selectedTabIndex = 4; compare(mainView.__propagated.header.flickable, flickable2, "Header flickable correctly updated"); tabs.selectedTabIndex = 0; } function test_pageLoader() { tabs.selectedTabIndex = 0; compare(loader.item, null, "Page not loaded when tab is not selected"); tabs.selectedTabIndex = 5; compare(tabs.currentPage, loader, "Selected loader for current page"); compare(loader.item.title, "Loaded page", "Loaded item is a page"); tabs.selectedTabIndex = 0; compare(loader.item, null, "Loaded page was properly unloaded"); } function test_bug1088740() { tabs.selectedTabIndex = 5; compare(mainView.__propagated.header.flickable, loader.item.flick, "Header flickable correctly updated with Loader"); compare(loader.item.flick.contentHeight, 1000, "Header flickable is correct flickable"); tabs.selectedTabIndex = 0; } function test_pageHeightLoaderNoFlick_bug1259917() { tabs.selectedTabIndex = 6; compare(tabs.selectedTab, tabNoFlickLoader, "Tab 6 was selected."); compare(mainView.__propagated.header.flickable, null, "Loaded page without flickable."); compare(loaderNoFlick.item.height, mainView.height - mainView.__propagated.header.height, "Correct height for loaded Page without flickable."); } function test_index() { compare(tab1.index, 0, "tab1 is at 0"); compare(tab2.index, 1, "tab2 is at 1"); compare(tab3.index, 2, "tab3 is at 2"); compare(tabFlick1.index, 3, "tabFlick1 is at 3"); compare(tabFlick2.index, 4, "tabFlick2 is at 4"); compare(tabFlickLoader.index, 5, "tabFlickLoader is at 5"); compare(tabNoFlickLoader.index, 6, "tabNoFlickLoader is at 6"); } function test_deactivateByTimeout() { tabs.tabBar.selectionMode = true; compare(tabs.tabBar.selectionMode, true, "Tab bar can be put into selection mode"); compare(tabs.tabBar.__styleInstance.deactivateTime > 0, true, "There is a positive deactivate time"); wait(tabs.tabBar.__styleInstance.deactivateTime + 500); // add 500 ms margin /* FIXME compare(tabs.tabBar.selectionMode, false, "Tab bar automatically leaves selection mode after a timeout."); */ } function test_deactivateByAppInteraction() { tabs.tabBar.selectionMode = true; tabs.selectedTabIndex = 0; waitForRendering(tabs.tabBar, 400); compare(tabs.tabBar.selectionMode, true, "Tab bar can be put into selection mode"); mouseClick(button, centerOf(button).x, centerOf(button).y); compare(tabs.tabBar.selectionMode, false, "Tab bar deactivated by interacting with the page contents"); } function test_tabBar_pressed() { compare(tabs.tabBar.pressed, false, "Before user interaction, pressed is false"); mousePress(tabs.tabBar, tabs.tabBar.width/2, tabs.tabBar.height/2); compare(tabs.tabBar.pressed, true, "Pressing the tab bar makes pressed true"); mouseRelease(tabs.tabBar, tabs.tabBar.width/2, tabs.tabBar.height/2); compare(tabs.tabBar.pressed, false, "After releasing, pressed is false"); } } } ./tests/unit_x11/tst_components/tst_slotslayout.qml0000644000015600001650000014415012700370701022777 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Andrea Bernabei */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 import Ubuntu.Components.Styles 1.3 import QtQml.Models 2.1 Item { id: main width: units.gu(50) height: units.gu(100) Flickable { anchors.fill: parent Column { id: column Repeater { model: layoutsModel } } } VisualItemModel { id: layoutsModel SlotsLayout { id: layout //these lists define the slots that we expect to be part of the layout //process, and the order in which we expect them to be positioned in the //layout. This is to avoid complicating the layout logic by adding conditions //to the method which tests the position of the slots. If we want to //test that a !visible slot is ignored during the relayout, for instance, //we have to remove it from these lists before we call checkSlotsPosition(layout). //The same applies to changes in the position of a slot. readonly property var leadingSlots: [] readonly property var trailingSlots: [] } ListItemLayout { id: layoutEmpty readonly property var leadingSlots: [] readonly property var trailingSlots: [] } ListItemLayout { id: layoutLabels title.text: "test" subtitle.text: "test2" summary.text: "test3" readonly property var leadingSlots: [] readonly property var trailingSlots: [] } ListItemLayout { id: layoutMultilineLabels title.text: "test \n test" title.maximumLineCount: 2 subtitle.text: "test2 \n test2 \n test2" subtitle.maximumLineCount: 3 summary.text: "test3 \n test3" summary.maximumLineCount: 2 readonly property var leadingSlots: [] readonly property var trailingSlots: [] } ListItemLayout { id: layoutOneLeading readonly property var leadingSlots: [layoutOneLeading_leading1] readonly property var trailingSlots: [] Item { id: layoutOneLeading_leading1; SlotsLayout.position: SlotsLayout.Leading; width: units.gu(3); height: units.gu(2) } } ListItemLayout { id: layoutOneTrailing readonly property var leadingSlots: [] readonly property var trailingSlots: [layoutOneTrailing_trailing1] Item { id: layoutOneTrailing_trailing1; SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(3); height: units.gu(2) } } ListItemLayout { id: layoutOneLeadingOneTrailing readonly property var leadingSlots: [layoutOneLeadingOneTrailing_leading1] readonly property var trailingSlots: [layoutOneLeadingOneTrailing_trailing1] Item { id: layoutOneLeadingOneTrailing_leading1; SlotsLayout.position: SlotsLayout.Leading; width: units.gu(10); height: units.gu(20) } Item { id: layoutOneLeadingOneTrailing_trailing1; SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(1); height: units.gu(5) } } ListItemLayout { id: layoutTwoTrailing readonly property var leadingSlots: [] readonly property var trailingSlots: [layoutTwoTrailing_trailing1, layoutTwoTrailing_trailing2] Item { id: layoutTwoTrailing_trailing1; SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(3); height: units.gu(3) } Item { id: layoutTwoTrailing_trailing2; SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(3); height: units.gu(2) } } ListItemLayout { id: layoutOneLeadingTwoTrailing readonly property var leadingSlots: [layoutOneLeadingTwoTrailing_leading1] readonly property var trailingSlots: [layoutOneLeadingTwoTrailing_trailing1, layoutOneLeadingTwoTrailing_trailing2] Item { id: layoutOneLeadingTwoTrailing_leading1; SlotsLayout.position: SlotsLayout.Leading; width: units.gu(3); height: units.gu(1) } Item { id: layoutOneLeadingTwoTrailing_trailing1; SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(4); height: units.gu(9) } Item { id: layoutOneLeadingTwoTrailing_trailing2; SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(1); height: units.gu(6) } } ListItemLayout { id: layoutCustomSlotsPadding readonly property var leadingSlots: [layoutCustomSlotsPadding_leading1] readonly property var trailingSlots: [layoutCustomSlotsPadding_trailing1, layoutCustomSlotsPadding_trailing2] Item { id: layoutCustomSlotsPadding_leading1; SlotsLayout.position: SlotsLayout.Leading; SlotsLayout.padding.top: units.gu(30) SlotsLayout.padding.bottom: units.gu(2) width: units.gu(6); height: units.gu(3) } Item { id: layoutCustomSlotsPadding_trailing1; SlotsLayout.position: SlotsLayout.Trailing; SlotsLayout.padding.top: units.gu(30) SlotsLayout.padding.bottom: units.gu(2) width: units.gu(1); height: units.gu(7) } Item { id: layoutCustomSlotsPadding_trailing2; SlotsLayout.position: SlotsLayout.Trailing; SlotsLayout.padding { leading: units.gu(4) trailing: units.gu(5) top: units.gu(5) bottom: units.gu(2) } width: units.gu(3); height: units.gu(9) } } ListItemLayout { id: layoutCustomPadding readonly property var leadingSlots: [layoutCustomPadding_leading1] readonly property var trailingSlots: [layoutCustomPadding_trailing1, layoutCustomPadding_trailing2] padding { top: units.gu(1) bottom: units.gu(2) leading: units.gu(3) trailing: units.gu(4) } Item { id: layoutCustomPadding_leading1; SlotsLayout.position: SlotsLayout.Leading; width: units.gu(6); height: units.gu(3) } Item { id: layoutCustomPadding_trailing1; SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(1); height: units.gu(7) } Item { id: layoutCustomPadding_trailing2; SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(3); height: units.gu(9) } } ListItemLayout { id: layoutTestChangeSlotsSize readonly property var leadingSlots: [layoutTestChangeSlotsSize_leading1] readonly property var trailingSlots: [] title.text: "Test" padding { top: units.gu(0) bottom: units.gu(2) } Item { id: layoutTestChangeSlotsSize_leading1; SlotsLayout.position: SlotsLayout.Leading; width: units.gu(10); height: 38.5/*units.gu(3.1222)*/ } } ListItemLayout { id: layoutTestMainSlotSize width: units.gu(40) readonly property var leadingSlots: [] readonly property var trailingSlots: [layoutTestMainSlotSize_trailing1] title.text: "Test" Item { id: layoutTestMainSlotSize_trailing1; SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(1); height: units.gu(3) } } ListItemLayout { id: layoutTestSmallerTopBottomPadding readonly property var leadingSlots: [layoutTestSmallerTopBottomPadding_leading1] readonly property var trailingSlots: [] title.text: "Test" subtitle.text: "test2" summary.text: "test3" Item { id: layoutTestSmallerTopBottomPadding_leading1; SlotsLayout.position: SlotsLayout.Leading; width: units.gu(1); height: Math.max(parent.mainSlot.height, units.gu(4)) } } ListItemLayout { id: layoutTestChangeSlotPosition property var leadingSlots: [layoutTestChangeSlotPosition_leading] property var trailingSlots: [] title.text: "Test" subtitle.text: "test2" summary.text: "test3" Item { id: layoutTestChangeSlotPosition_leading; SlotsLayout.position: SlotsLayout.Leading; width: units.gu(4); height: units.gu(4) } } ListItemLayout { id: layoutTestSlotVisibilityChange property var leadingSlots: [layoutTestSlotVisibilityChange_leading] readonly property var trailingSlots: [] title.text: "Test" subtitle.text: "test2" summary.text: "test3" //it has to be taller than mainSlot, so that when we make the slot invisible we can test //implicitHeight changes Item { id: layoutTestSlotVisibilityChange_leading; SlotsLayout.position: SlotsLayout.Leading; width: units.gu(4); height: parent.mainSlot.height+10 } } ListItemLayout { //let's test if the layout respects SlotsLayout.position even if that doesn't follow //the stacking order id: layoutTestRelativePositioning //these lists hold the slots in the order we want them to be positioned readonly property var leadingSlots: [layoutTestRelativePositioning_leading1] readonly property var trailingSlots: [layoutTestRelativePositioning_trailing2, layoutTestRelativePositioning_trailing1] Item { id: layoutTestRelativePositioning_leading1; SlotsLayout.position: SlotsLayout.Leading-3; width: units.gu(6); height: units.gu(3) } Item { id: layoutTestRelativePositioning_trailing1; SlotsLayout.position: SlotsLayout.Last; width: units.gu(1); height: units.gu(7) } Item { id: layoutTestRelativePositioning_trailing2; SlotsLayout.position: SlotsLayout.Last-2; width: units.gu(3); height: units.gu(9) } } ListItemLayout { id: layoutTestRelativePositioning2 readonly property var leadingSlots: [layoutTestRelativePositioning2_leading1] readonly property var trailingSlots: [layoutTestRelativePositioning2_trailing2, layoutTestRelativePositioning2_trailing1] Item { id: layoutTestRelativePositioning2_leading1; SlotsLayout.position: SlotsLayout.Leading-3; width: units.gu(6); height: units.gu(3) } Item { id: layoutTestRelativePositioning2_trailing1; SlotsLayout.position: SlotsLayout.Trailing+1; width: units.gu(1); height: units.gu(7) } Item { id: layoutTestRelativePositioning2_trailing2; SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(3); height: units.gu(9) } } ListItemLayout { id: layoutTestNullSizeSlots readonly property var leadingSlots: [] property var trailingSlots: [layoutNullSizeSlots_trailing1, layoutNullSizeSlots_trailing2] title.text: "Hello" //we will reset the slot which is taller than mainSlot and test height and positions Item { id: layoutNullSizeSlots_trailing1; SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(5); height: parent.mainSlot.height+20 } Item { id: layoutNullSizeSlots_trailing2; SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(3); height: units.gu(4) } } ListItemLayout { id: layoutTestOverrideVerticalPositioning readonly property var leadingSlots: [] readonly property var trailingSlots: [layoutTestOverrideVerticalPositioning_trailing1, layoutTestOverrideVerticalPositioning_trailing2] title.text: "Hello" //we will reset the slot which is taller than mainSlot and test height and positions Item { id: layoutTestOverrideVerticalPositioning_trailing1; SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(5); height: units.gu(2) } Item { id: layoutTestOverrideVerticalPositioning_trailing2; SlotsLayout.overrideVerticalPositioning: true SlotsLayout.position: SlotsLayout.Trailing; anchors.bottom: parent.bottom width: units.gu(3); height: parent.mainSlot.height+10 } } ListItemLayout { id: layoutTestIgnoreSomeChangesOnMainSlot readonly property var leadingSlots: [layoutTestIgnoreSomeChangesOnMainSlot_leading1] readonly property var trailingSlots: [] title.text: "Hello" //we will reset the slot which is taller than mainSlot and test height and positions Item { id: layoutTestIgnoreSomeChangesOnMainSlot_leading1; SlotsLayout.position: SlotsLayout.Leading; width: units.gu(4) height: parent.mainSlot.height + 50 } } ListItemLayout { id: layoutTestMainSlotAttachedProps readonly property var leadingSlots: [layoutTestMainSlotAttachedProps_leading1] readonly property var trailingSlots: [] title.text: "Hello" //we will reset the slot which is taller than mainSlot and test height and positions Item { id: layoutTestMainSlotAttachedProps_leading1; SlotsLayout.position: SlotsLayout.Leading; width: units.gu(4) height: parent.mainSlot.height + 50 } } ListItemLayout { id: layoutTestDefaultSlotsAttachedProps readonly property var leadingSlots: [] property var trailingSlots: [layoutTestDefaultSlotsAttachedProps_trailing1] Item { id: layoutTestDefaultSlotsAttachedProps_trailing1 } } //UCLabel initially had REVISION 1 around textSize Q_PROPERTY //That breaks initialization of textSize from QML when done on //the UCLabels we created from C++! (changing textSize works from JS, fyi) //This component makes sure we don't break this usecase again in the future ListItemLayout { id: layoutTestCustomTextSizeInitializationFromQml title.text: "Hello" title.textSize: Label.XLarge } } UbuntuTestCase { name: "SlotsLayout" when: windowShown function warningMsg(msg) { return testUtil.callerFile() + ": " + msg } //Visual rule: //when we have at least one slot which is taller than mainSlot and taller than 4GU, //we want the top and bottom padding to be 1GU instead of 2GU property real topBottomPaddingThreshold: units.gu(4) property real smallerTopBottomPadding: units.gu(1) property real tallerTopBottomPadding: units.gu(2) function standardTestsData() { return [ { tag: "Empty", item: layout }, { tag: "Labels", item: layoutLabels }, { tag: "One leading slot", item: layoutOneLeading }, { tag: "One trailing slot", item: layoutOneTrailing }, { tag: "One leading, one trailing slots", item: layoutOneLeadingOneTrailing }, { tag: "Two trailing", item: layoutTwoTrailing }, { tag: "One leading, two trailing slots", item: layoutOneLeadingTwoTrailing }, { tag: "One leading, two trailing slots with custom paddings", item: layoutCustomSlotsPadding }, ] } //This excludes mainSlot and the slots which have overrideVerticalPositioning enabled! function maxSlotsHeight(item) { var maxHeight = 0 var i = 0 for (i = 0; i < item.leadingSlots.length; ++i) { var slot = item.leadingSlots[i] if (!slot.SlotsLayout.overrideVerticalPositioning) { maxHeight = Math.max(slot.height + slot.SlotsLayout.padding.top + slot.SlotsLayout.padding.bottom, maxHeight) } } for (i = 0; i < item.trailingSlots.length; ++i) { var currSlot = item.trailingSlots[i] if (!currSlot.SlotsLayout.overrideVerticalPositioning) { maxHeight = Math.max(currSlot.height + currSlot.SlotsLayout.padding.top + currSlot.SlotsLayout.padding.bottom, maxHeight) } } return maxHeight } function expectedImplicitHeight(item) { var height = maxSlotsHeight(item) if (item.mainSlot !== null) { height = Math.max(height, item.mainSlot.height + item.mainSlot.SlotsLayout.padding.top + item.mainSlot.SlotsLayout.padding.bottom) } return height + item.padding.top + item.padding.bottom } //otherwise center the slots vertically function mustAlignSlotsToTop(item) { if (item.mainSlot === null) { return false } return maxSlotsHeight(item) < (item.mainSlot.height + item.mainSlot.SlotsLayout.padding.top + item.mainSlot.SlotsLayout.padding.bottom) } function useSmallerTopBottomPadding(item) { return !mustAlignSlotsToTop(item) && maxSlotsHeight(item) > topBottomPaddingThreshold } function checkDefaultPadding(item) { if (useSmallerTopBottomPadding(item)) { compare(item.padding.top, smallerTopBottomPadding, "Default smaller top padding") compare(item.padding.bottom, smallerTopBottomPadding, "Default smaller bottom padding") } else { compare(item.padding.top, tallerTopBottomPadding, "Default top padding") compare(item.padding.bottom, tallerTopBottomPadding, "Default bottom padding") } compare(item.padding.leading, units.gu(1), "Default leading padding") compare(item.padding.trailing, units.gu(1), "Default trailing padding") } function checkDefaultWrapping(item) { //we have to use WrapAnywhere because otherwise it will have unexpected behaviour //when used together with ElideRight when the string wraps (it will elide too early). compare(item.title.wrapMode, Label.WrapAnywhere, "Wrong default title wrapMode") compare(item.subtitle.wrapMode, Label.WrapAnywhere, "Wrong default subtitle wrapMode") compare(item.summary.wrapMode, Label.WrapAnywhere, "Wrong default summary wrapMode") compare(item.title.elide, Label.ElideRight, "Wrong default title elide") compare(item.subtitle.elide, Label.ElideRight, "Wrong default subtitle elide") compare(item.summary.elide, Label.ElideRight, "Wrong default summary elide") } function checkImplicitSize(item) { compare(item.implicitHeight, expectedImplicitHeight(item), "Implicit height check") compare(item.implicitWidth, column.width, "Fill parent's width") } //this functions takes a layouts and checks that the slots in the lists //"leadingSlots" and "trailingSlots" are following the visual rules //NOTE: THIS METHOD DOESN'T IGNORE ANY SLOT (because of visibility or similar). //slots which are expected to be ignored by the cpp implementation should be //removed from "leadingSlots" and "trailingSlots" before calling this method function checkSlotsPosition(item) { var slots = [] slots = slots.concat(item.leadingSlots) if (item.mainSlot !== null) { slots = slots.concat(item.mainSlot) } slots = slots.concat(item.trailingSlots) var expectedX = item.padding.leading; var i = 0 for (i = 0; i < slots.length; ++i) { var slot = slots[i] expectedX += slot.SlotsLayout.padding.leading compare(slot.x, expectedX, "Slot's horizontal position") expectedX += slot.width expectedX += slot.SlotsLayout.padding.trailing //mainSlot ignores the value of its overrideVerticalPositioning if (slot.SlotsLayout.overrideVerticalPositioning && slot !== item.mainSlot) { //NOTE: we're assuming the test item doesn't set any custom anchor!! compare(slot.y, 0, "Override vertical positioning: vertical position") } else { if (mustAlignSlotsToTop(item)) { compare(slot.anchors.top, item.top, "Automatic vertical positioning: top anchor, \"aligned to the top\" positioning mode") compare(slot.anchors.topMargin, item.padding.top + slot.SlotsLayout.padding.top, "Automatic vertical positioning: topMargin, \"aligned to the top\" positioning mode") } else { compare(slot.anchors.verticalCenter, item.verticalCenter, "Automatic vertical positioning: verticalCenter anchor, \"vertically centered\" positioning mode ") compare(slot.anchors.verticalCenterOffset, (item.padding.top - item.padding.bottom + slot.SlotsLayout.padding.top - slot.SlotsLayout.padding.bottom) / 2.0, "Automatic vertical positioning: verticalCenterOffset, \"vertically centered\" positioning mode ") } } } } function initTestCase() { // check the coloring of the mainslot labels compare(layoutEmpty.title.color, theme.palette.normal.backgroundText, "wrong title color"); compare(layoutEmpty.subtitle.color, theme.palette.normal.backgroundSecondaryText, "wrong subtitle color"); compare(layoutEmpty.summary.color, theme.palette.normal.backgroundTertiaryText, "wrong summary color"); } function test_contentPadding_data() { return standardTestsData() } function test_contentPadding(data) { checkDefaultPadding(data.item) } function test_implicitSize_data() { return standardTestsData() } function test_implicitSize(data) { checkImplicitSize(data.item) } function test_layout_data(){ return standardTestsData() } function test_layout(data) { checkSlotsPosition(data.item) } function test_customPadding_data(){ return [ { tag: "Custom padding", item: layoutCustomPadding }, ] } function test_customPadding(data) { compare(data.item.padding.top, units.gu(1), "Custom padding top") compare(data.item.padding.bottom, units.gu(2), "Custom padding bottom") compare(data.item.padding.leading, units.gu(3), "Custom padding leading") compare(data.item.padding.trailing, units.gu(4), "Custom padding trailing") compare(data.item.implicitHeight, expectedImplicitHeight(data.item), "Implicit height with custom padding") //trigger relayout var newLeadingSlotHeight = data.item.height + units.gu(2) layoutCustomPadding.leadingSlots[0].height = newLeadingSlotHeight; compare(data.item.leadingSlots[0].height, newLeadingSlotHeight, "Leading slot height update") //check that the padding stays the same, but the height changes compare(data.item.padding.top, units.gu(1), "Custom padding top") compare(data.item.padding.bottom, units.gu(2), "Custom padding bottom") compare(data.item.padding.leading, units.gu(3), "Custom padding leading") compare(data.item.padding.trailing, units.gu(4), "Custom padding trailing") compare(data.item.implicitHeight, newLeadingSlotHeight + data.item.padding.top + data.item.padding.bottom, "Implicit height with custom padding after relayout") compare(expectedImplicitHeight(data.item), newLeadingSlotHeight + data.item.padding.top + data.item.padding.bottom, "expectedImplicitHeight test") //check that slots are still in the right position checkSlotsPosition(data.item) } function test_relayoutAfterChangingSlotsSize() { checkSlotsPosition(layoutTestChangeSlotsSize) layoutTestChangeSlotsSize.leadingSlots[0].width = units.gu(12) compare(layoutTestChangeSlotsSize.leadingSlots[0].width, units.gu(12), "Change slot's width") checkSlotsPosition(layoutTestChangeSlotsSize) layoutTestChangeSlotsSize.leadingSlots[0].height = layoutTestChangeSlotsSize.mainSlot.height compare(layoutTestChangeSlotsSize.leadingSlots[0].height, layoutTestChangeSlotsSize.mainSlot.height, "Change slot's height") compare(layoutTestChangeSlotsSize.implicitHeight, layoutTestChangeSlotsSize.mainSlot.height + layoutTestChangeSlotsSize.padding.top + layoutTestChangeSlotsSize.padding.bottom, "Layout's implicit height check after slot's height change") checkSlotsPosition(layoutTestChangeSlotsSize) checkImplicitSize(layoutTestChangeSlotsSize) } function test_mainSlotSize() { compare(layoutTestMainSlotSize.mainSlot.width, layoutTestMainSlotSize.width - layoutTestMainSlotSize.padding.leading - layoutTestMainSlotSize.padding.trailing - layoutTestMainSlotSize.trailingSlots[0].width - layoutTestMainSlotSize.trailingSlots[0].SlotsLayout.padding.leading - layoutTestMainSlotSize.trailingSlots[0].SlotsLayout.padding.trailing - layoutTestMainSlotSize.mainSlot.SlotsLayout.padding.leading - layoutTestMainSlotSize.mainSlot.SlotsLayout.padding.trailing, "Main slot's width") compare(layoutTestMainSlotSize.mainSlot.height, layoutTestMainSlotSize.title.height, "Main slot's height, title only") layoutTestMainSlotSize.subtitle.text = "Test here" compare(layoutTestMainSlotSize.mainSlot.height, layoutTestMainSlotSize.subtitle.y + layoutTestMainSlotSize.subtitle.height, "Main slot's height, title+subtitle") layoutTestMainSlotSize.summary.text = "Test here" compare(layoutTestMainSlotSize.mainSlot.height, layoutTestMainSlotSize.summary.y + layoutTestMainSlotSize.summary.height, "Main slot's height, title+subtitle+summary") checkSlotsPosition(layoutTestMainSlotSize) } function test_changeSlotPosition() { checkSlotsPosition(layoutTestChangeSlotPosition) layoutTestChangeSlotPosition.leadingSlots[0].SlotsLayout.position = SlotsLayout.Trailing compare(layoutTestChangeSlotPosition.leadingSlots[0].SlotsLayout.position, SlotsLayout.Trailing, "Slot's position change to Trailing") layoutTestChangeSlotPosition.trailingSlots = [layoutTestChangeSlotPosition.leadingSlots[0]] layoutTestChangeSlotPosition.leadingSlots = [] compare(layoutTestChangeSlotPosition.leadingSlots.length, 0, "Change slot's position, leading slots array") compare(layoutTestChangeSlotPosition.trailingSlots.length, 1, "Change slot's position, trailing slots array") checkSlotsPosition(layoutTestChangeSlotPosition) layoutTestChangeSlotPosition.trailingSlots[0].SlotsLayout.position = SlotsLayout.First compare(layoutTestChangeSlotPosition.trailingSlots[0].SlotsLayout.position, SlotsLayout.First, "Slot's position change to First") layoutTestChangeSlotPosition.leadingSlots = [layoutTestChangeSlotPosition.trailingSlots[0]] layoutTestChangeSlotPosition.trailingSlots = [] compare(layoutTestChangeSlotPosition.leadingSlots.length, 1, "Change slot's position, leading slots array") compare(layoutTestChangeSlotPosition.trailingSlots.length, 0, "Change slot's position, trailing slots array") checkSlotsPosition(layoutTestChangeSlotPosition) } function test_slotVisibilityChange() { layoutTestSlotVisibilityChange.leadingSlots[0].visible = false compare(layoutTestSlotVisibilityChange.leadingSlots[0].visible, false, "Slot's visibility, false") var tmpSlot = layoutTestSlotVisibilityChange.leadingSlots[0] layoutTestSlotVisibilityChange.leadingSlots = [] compare(layoutTestSlotVisibilityChange.leadingSlots.length, 0, "Slot's visibility, fake leading slots count") compare(layoutTestSlotVisibilityChange.trailingSlots.length, 0, "Slot's visibility, fake trailing slots count") checkSlotsPosition(layoutTestSlotVisibilityChange) checkImplicitSize(layoutTestSlotVisibilityChange) layoutTestSlotVisibilityChange.leadingSlots = [tmpSlot] layoutTestSlotVisibilityChange.leadingSlots[0].visible = true compare(layoutTestSlotVisibilityChange.leadingSlots[0].visible, true, "Slot's visibility, true") compare(layoutTestSlotVisibilityChange.mainSlot.height < layoutTestSlotVisibilityChange.leadingSlots[0].height, true, "Visibility test, slot's height") checkSlotsPosition(layoutTestSlotVisibilityChange) checkImplicitSize(layoutTestSlotVisibilityChange) } function test_relativePositioning_data(){ return [ { tag: "Relative positioning 1", item: layoutTestRelativePositioning }, { tag: "Relative positioning 2", item: layoutTestRelativePositioning2 } ] } function test_relativePositioning(data) { checkSlotsPosition(data.item) } function test_nullSizeSlots() { compare(layoutTestNullSizeSlots.trailingSlots.length, 2, "Null size slot test, fake trailing slots list") checkSlotsPosition(layoutTestNullSizeSlots) checkImplicitSize(layoutTestNullSizeSlots) layoutTestNullSizeSlots.trailingSlots[0].height = 0 compare(layoutTestNullSizeSlots.trailingSlots[0].height, 0, "Null size slot test, slot's height") //remove that slot from the list of slots we expect to be laid out var tmpSlot = layoutTestNullSizeSlots.trailingSlots[0] layoutTestNullSizeSlots.trailingSlots = [layoutTestNullSizeSlots.trailingSlots[1]] compare(layoutTestNullSizeSlots.trailingSlots.length, 1, "Null size slot test, fake trailing slots list") checkSlotsPosition(layoutTestNullSizeSlots) checkImplicitSize(layoutTestNullSizeSlots) layoutTestNullSizeSlots.trailingSlots[0].width = 0 compare(layoutTestNullSizeSlots.trailingSlots[0].width, 0, "Null size slot test, slot's width") var tmpSlot2 = layoutTestNullSizeSlots.trailingSlots[0] layoutTestNullSizeSlots.trailingSlots = [] compare(layoutTestNullSizeSlots.trailingSlots.length, 0, "Null size slot test, fake trailing slots list") checkSlotsPosition(layoutTestNullSizeSlots) checkImplicitSize(layoutTestNullSizeSlots) //bring the first slot back tmpSlot.height = 300 compare(tmpSlot.height, 300, "Null size slot test, slot's height") layoutTestNullSizeSlots.trailingSlots = [tmpSlot] compare(layoutTestNullSizeSlots.trailingSlots.length, 1, "Null size slot test, fake trailing slots list") checkSlotsPosition(layoutTestNullSizeSlots) checkImplicitSize(layoutTestNullSizeSlots) //bring the second slot back tmpSlot2.width = 22 compare(tmpSlot2.width, 22, "Null size slot test, slot's width") layoutTestNullSizeSlots.trailingSlots = [tmpSlot, tmpSlot2] compare(layoutTestNullSizeSlots.trailingSlots.length, 2, "Null size slot test, fake trailing slots list") checkSlotsPosition(layoutTestNullSizeSlots) checkImplicitSize(layoutTestNullSizeSlots) } function test_overrideVerticalPositioning() { //we expect the component to reset the vertical anchors when overrideVerticalPositioning changes value compare(layoutTestOverrideVerticalPositioning.trailingSlots[1].anchors.bottom, layoutTestOverrideVerticalPositioning.bottom, "Override vertical positioning test, initial slot's bottom anchor") compare(layoutTestOverrideVerticalPositioning.trailingSlots[1].SlotsLayout.overrideVerticalPositioning, true, "Override vertical positioning test, attached-property's initial value") compare(layoutTestOverrideVerticalPositioning.trailingSlots.length, 2, "Override vertical positioning test, fake trailing slots list") layoutTestOverrideVerticalPositioning.trailingSlots[1].SlotsLayout.overrideVerticalPositioning = false compare(layoutTestOverrideVerticalPositioning.trailingSlots[1].SlotsLayout.overrideVerticalPositioning, false, "Override vertical positioning test, attached-property's new value, false") checkSlotsPosition(layoutTestOverrideVerticalPositioning) checkImplicitSize(layoutTestOverrideVerticalPositioning) layoutTestOverrideVerticalPositioning.trailingSlots[1].SlotsLayout.overrideVerticalPositioning = true compare(layoutTestOverrideVerticalPositioning.trailingSlots[1].SlotsLayout.overrideVerticalPositioning, true, "Override vertical positioning test, attached-property's new value, true") checkSlotsPosition(layoutTestOverrideVerticalPositioning) checkImplicitSize(layoutTestOverrideVerticalPositioning) } function test_ignoreSomeChangesOnMainSlot() { compare(layoutTestIgnoreSomeChangesOnMainSlot.leadingSlots.length, 1, "Ignore some changes on main slot test, fake trailing slots list") compare(layoutTestIgnoreSomeChangesOnMainSlot.mainSlot.SlotsLayout.overrideVerticalPositioning, false, "Ignore some changes on main slot test, default override value") //we want main slot to be vertically centered, to check if disabling overrideVerticalPositioning //will cause a change in its position compare(layoutTestIgnoreSomeChangesOnMainSlot.mainSlot.height < maxSlotsHeight(layoutTestIgnoreSomeChangesOnMainSlot), true, "Ignore some changes on main slot test, slot's height") checkSlotsPosition(layoutTestIgnoreSomeChangesOnMainSlot) checkImplicitSize(layoutTestIgnoreSomeChangesOnMainSlot) //this shouldn't trigger a relayout layoutTestIgnoreSomeChangesOnMainSlot.mainSlot.SlotsLayout.overrideVerticalPositioning = true compare(layoutTestIgnoreSomeChangesOnMainSlot.mainSlot.SlotsLayout.overrideVerticalPositioning, true, "Ignore some changes on main slot test, new override value") //let's force a relayout, just to make sure changing overrideVerticalPositioning //didn't have any effect on mainSlot layoutTestIgnoreSomeChangesOnMainSlot.leadingSlots[0].height += 100 checkSlotsPosition(layoutTestIgnoreSomeChangesOnMainSlot) checkImplicitSize(layoutTestIgnoreSomeChangesOnMainSlot) //let's try to force positioning mainSlot *before* a leading slot. This must fail layoutTestIgnoreSomeChangesOnMainSlot.mainSlot.SlotsLayout.position = layoutTestIgnoreSomeChangesOnMainSlot.leadingSlots[0].SlotsLayout.position - 5 compare(layoutTestIgnoreSomeChangesOnMainSlot.mainSlot.SlotsLayout.position, layoutTestIgnoreSomeChangesOnMainSlot.leadingSlots[0].SlotsLayout.position - 5, "Ignore some changes on main slot test, change mainSlot's position") checkSlotsPosition(layoutTestIgnoreSomeChangesOnMainSlot) checkImplicitSize(layoutTestIgnoreSomeChangesOnMainSlot) } function test_changeAttachedPropertiesInMainSlot() { checkSlotsPosition(layoutTestMainSlotAttachedProps) checkImplicitSize(layoutTestMainSlotAttachedProps) var mainSlot = layoutTestMainSlotAttachedProps.mainSlot mainSlot.SlotsLayout.padding.top = 300 compare(layoutTestMainSlotAttachedProps.mainSlot.SlotsLayout.padding.top, 300, "Change mainSlot's attached props test, padding.top") checkSlotsPosition(layoutTestMainSlotAttachedProps) checkImplicitSize(layoutTestMainSlotAttachedProps) mainSlot.SlotsLayout.padding.bottom = 180 compare(mainSlot.SlotsLayout.padding.bottom, 180, "Change mainSlot's attached props test, padding.bottom") checkSlotsPosition(layoutTestMainSlotAttachedProps) checkImplicitSize(layoutTestMainSlotAttachedProps) } function test_defaultSlotsAttachedProps() { var slot = layoutTestDefaultSlotsAttachedProps.trailingSlots[0] compare(slot.SlotsLayout.position, SlotsLayout.Trailing, "Default slots attached props, position") compare(slot.SlotsLayout.overrideVerticalPositioning, false, "Default slots attached props, overrideVerticalPositioning") compare(slot.SlotsLayout.padding.top, 0, "Default slots attached props, padding.top") compare(slot.SlotsLayout.padding.bottom, 0, "Default slots attached props, padding.bottom") compare(slot.SlotsLayout.padding.leading, units.gu(1), "Default slots attached props, padding.leading") compare(slot.SlotsLayout.padding.trailing, units.gu(1), "Default slots attached props, padding.trailing") } function checkLabelsY(listitemlayout) { compare(listitemlayout.title.y, 0, "Default labels positioning, title's y") //we don't care about having the correct Y if the label //is empty or not visible anyway if (listitemlayout.subtitle.text !== "" && listitemlayout.subtitle.visible) { if (listitemlayout.title.text === "" || !listitemlayout.title.visible) { compare(listitemlayout.subtitle.y, 0, "Default labels positioning, subtitle's y") } else { compare(listitemlayout.subtitle.y, listitemlayout.title.y + listitemlayout.title.height + units.dp(2), "Default labels positioning, subtitle's y") } } //we don't care about having the correct Y if the label //is empty or not visible anyway if (listitemlayout.summary.text !== "" && listitemlayout.summary.visible) { if (listitemlayout.subtitle.text === "" || !listitemlayout.subtitle.visible) { if (listitemlayout.title.text === "" || !listitemlayout.title.visible) { compare(listitemlayout.summary.y, 0, "Default labels positioning, summary's y") } else { compare(listitemlayout.summary.y, listitemlayout.title.y + listitemlayout.title.height + units.dp(2), "Default labels positioning, summary's y") } } else { compare(listitemlayout.summary.y, listitemlayout.subtitle.y + listitemlayout.subtitle.height, "Default labels positioning, summary's y") } } } function test_defaultLabelsWrappingAndElide() { checkDefaultWrapping(layoutLabels) } function test_defaultMainSlotHeight() { var titleText = layoutLabels.title.text var subtitleText = layoutLabels.subtitle.text var summaryText = layoutLabels.summary.text compare(titleText.length > 0, true, "Default labels positioning, title length") compare(subtitleText.length > 0, true, "Default labels positioning, subtitle length") compare(summaryText.length > 0, true, "Default labels positioning, summary length") checkLabelsY(layoutLabels) var initialHeight = layoutLabels.mainSlot.height compare(initialHeight, layoutLabels.summary.y + layoutLabels.summary.height, "Default labels positioning, mainSlot's height") //setting text to " " (note, it's NOT empty) should have the same effect as setting it to "blabla" layoutLabels.summary.text = " " compare(layoutLabels.summary.text, " ", "Default labels positioning, summary 1 whitespace text") compare(layoutLabels.mainSlot.height, initialHeight, "Default labels positioning, mainSlot's height") checkLabelsY(layoutLabels) //empty text -> we ignore summary in the height computation layoutLabels.summary.text = "" compare(layoutLabels.summary.text, "", "Default labels positioning, empty summary text") compare(layoutLabels.mainSlot.height, layoutLabels.subtitle.y + layoutLabels.subtitle.height, "Default labels positioning, mainSlot's height") checkLabelsY(layoutLabels) layoutLabels.subtitle.text = "" compare(layoutLabels.subtitle.text, "", "Default labels positioning, empty subtitle text") compare(layoutLabels.mainSlot.height, layoutLabels.title.y + layoutLabels.title.height, "Default labels positioning, mainSlot's height") checkLabelsY(layoutLabels) //all labels are empty now layoutLabels.title.text = "" compare(layoutLabels.title.text, "", "Default labels positioning, empty title text") compare(layoutLabels.subtitle.text, "", "Default labels positioning, empty subtitle text") compare(layoutLabels.summary.text, "", "Default labels positioning, empty summary text") compare(layoutLabels.mainSlot.height, 0, "Default labels positioning, mainSlot's height") checkLabelsY(layoutLabels) //try title and summary, skipping subtitle layoutLabels.title.text = "test" layoutLabels.summary.text = "test" compare(layoutLabels.title.text, "test", "Default labels positioning, empty title text") compare(layoutLabels.subtitle.text, "", "Default labels positioning, empty subtitle text") compare(layoutLabels.summary.text, "test", "Default labels positioning, empty summary text") compare(layoutLabels.mainSlot.height, layoutLabels.summary.y + layoutLabels.summary.height, "Default labels positioning, mainSlot's height") checkLabelsY(layoutLabels) //let's try with summary only layoutLabels.title.text = "" compare(layoutLabels.title.text, "", "Default labels positioning, empty title text") compare(layoutLabels.subtitle.text, "", "Default labels positioning, empty subtitle text") compare(layoutLabels.summary.text, "test", "Default labels positioning, empty summary text") compare(layoutLabels.mainSlot.height, layoutLabels.summary.y + layoutLabels.summary.height, "Default labels positioning, mainSlot's height") checkLabelsY(layoutLabels) //try to set all texts and test positions again layoutLabels.title.text = titleText layoutLabels.subtitle.text = subtitleText layoutLabels.summary.text = summaryText compare(layoutLabels.mainSlot.height, initialHeight, "Default labels positioning, mainSlot's height") checkLabelsY(layoutLabels) } function test_fontsizeChange() { var initialHeight = layoutLabels.mainSlot.height compare(layoutLabels.title.textSize, Label.Medium, "Labels textSize change, default title textsize") compare(layoutLabels.subtitle.textSize, Label.Small, "Labels textSize change, default subtitle textsize") compare(layoutLabels.summary.textSize, Label.Small, "Labels textSize change, default summary textsize") compare(layoutLabels.title.text.length > 0, true, "Default labels positioning, title length") compare(layoutLabels.subtitle.text.length > 0, true, "Default labels positioning, subtitle length") compare(layoutLabels.summary.text.length > 0, true, "Default labels positioning, summary length") compare(layoutLabels.mainSlot.height, layoutLabels.summary.y + layoutLabels.summary.height, "Default labels positioning, main slot height") layoutLabels.title.textSize = Label.XLarge compare(layoutLabels.title.textSize, Label.XLarge, "Labels textSize change, new title textsize") compare(layoutLabels.mainSlot.height, layoutLabels.summary.y + layoutLabels.summary.height, "Default labels positioning, main slot height") layoutLabels.subtitle.textSize = Label.XLarge compare(layoutLabels.subtitle.textSize, Label.XLarge, "Labels textSize change, new subtitle textsize") compare(layoutLabels.mainSlot.height, layoutLabels.summary.y + layoutLabels.summary.height, "Default labels positioning, main slot height") layoutLabels.summary.textSize = Label.XLarge compare(layoutLabels.summary.textSize, Label.XLarge, "Labels textSize change, new summary textsize") compare(layoutLabels.mainSlot.height, layoutLabels.summary.y + layoutLabels.summary.height, "Default labels positioning, main slot height") } Label {id: customMainSlot } function test_warningOnAttemptToChangeListItemLayoutMainSlot() { ignoreWarning(warningFormat(60, 9, "QML ListItemLayout: Setting a different mainSlot on ListItemLayout is not supported. Please use SlotsLayout instead.")) layoutLabels.mainSlot = customMainSlot } Component { id: layoutTestQmlContextComponent ListItemLayout { id: layoutTestQmlContext title.text: "

TEST

" title.textFormat: Text.RichText subtitle.text: "

TEST

" subtitle.textFormat: Text.RichText summary.text: "

TEST

" summary.textFormat: Text.RichText } } //lp#1514173 //this will make the test segfault if there is a regression function test_defaultLabelsQmlContext() { ignoreWarning(warningMsg("QML Label: Cannot open: file:///test.png")) var obj = layoutTestQmlContextComponent.createObject(main) //wait for rendering otherwise we will not get the "cannot find file" warning //because the img is loaded async waitForRendering(obj) compare(obj !== null, true, "QML ListItemLayout: testing labels' QML context.") obj.destroy() } //first version of ListItemLayout anchored subtitle to title's baseline, but that breaks //when title is multiline function test_multilineLabelsPositioning() { compare(layoutMultilineLabels.title.maximumLineCount, 2, "Multiline labels positioning: wrong title maximumLineCount") compare(layoutMultilineLabels.subtitle.maximumLineCount, 3, "Multiline labels positioning: wrong subtitle maximumLineCount") compare(layoutMultilineLabels.summary.maximumLineCount, 2, "Multiline labels positioning: wrong summary maximumLineCount") compare(layoutMultilineLabels.title.lineCount, 2, "Multiline labels positioning: wrong title lineCount") compare(layoutMultilineLabels.subtitle.lineCount, 3, "Multiline labels positioning: wrong subtitle lineCount") compare(layoutMultilineLabels.summary.lineCount, 2, "Multiline labels positioning: wrong summary lineCount") checkLabelsY(layoutMultilineLabels) } } } ./tests/unit_x11/tst_components/tst_pagehead_sections.qml0000644000015600001650000001175412700370701024045 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Test 1.0 Item { width: units.gu(50) height: units.gu(70) MainView { id: mainView anchors.fill: parent Page { id: page title: "Sections" head { sections { actions: [ Action { text: "navy" }, Action { text: "lightblue" }, Action { text: "brown" } ] } actions: [ Action { iconName: "appointment-new" text: "New" }, Action { iconName: "attachment" text: "Attach" }, Action { iconName: "calendar-today" text: "Today" }, Action { iconName: "delete" text: "Delete" } ] } ListView { anchors.fill: parent model: 50 delegate: ListItem { UbuntuShape { id: shape anchors { left: parent.left top: parent.top bottom: parent.bottom margins: units.gu(1) } width: height property int index: page.head.sections.selectedIndex backgroundColor: index >= 0 ? page.head.sections.actions[index].text : "black" } Label { id: label anchors { left: shape.right leftMargin: units.gu(2) verticalCenter: parent.verticalCenter } text: "List item #"+index } } } } } UbuntuTestCase { name: "PageHeadSectionsAPI" when: windowShown id: testCase property var sectionsItem function initTestCase() { compare(mainView.active, true, "MainView always active."); compare(page.active, true, "Single page is active in MainView."); testCase.sectionsItem = findChild(mainView, "headerSectionsItem"); } function init() { page.head.sections.selectedIndex = 0; } function test_number_of_sections() { compare(sectionsItem.model.length, 3, "Number of sections initialization failed."); page.head.sections.model = ["red"]; compare(sectionsItem.model.length, 1, "Number of sections not updated."); page.head.sections.model = ["navy", "lightblue", "brown"]; compare(sectionsItem.model.length, 3, "Number of sections reverted."); // Tests for verifying that itemModel.length equals the amount // of section buttons are in tst_sections.qml. } function check_selected_button(selectedButtonIndex) { compare(sectionsItem.selectedIndex, selectedButtonIndex, "Incorrect button selected."); var button = findChild(sectionsItem, "section_button_"+selectedButtonIndex); verify(button); verify(button.selected); } function test_selected_section() { var sectionsRepeater = findChild(mainView, "page_head_sections_repeater"); check_selected_button(0); page.head.sections.selectedIndex = 2; check_selected_button(2); page.head.sections.selectedIndex = 1; check_selected_button(1); page.head.sections.selectedIndex = 0; check_selected_button(0); } function test_warn_when_too_many_sections() { ignoreWarning("PageHeadSections does not support more than 3 sections. Use PageHeader and Sections instead."); page.head.sections.model = ["red", "orange", "yellow", "green"]; } } } ./tests/unit_x11/tst_components/tst_bottomedgehint.qml0000644000015600001650000002513712700370714023420 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 MainView { id: mainView width: units.gu(40) height: units.gu(71) ListView { id: listView anchors.fill: parent model: 100 delegate: Label { height: units.gu(5) text: "Item #" + index } } BottomEdgeHint { id: bottomEdgeHint property int triggerCount: 0 function trigger(v) { triggerCount++; } } BottomEdgeHint { id: floatingHint anchors.bottom: parent.top } Item { id: floatingItem } UbuntuTestCase { name: "BottomEdgeHint" when: windowShown // FIXME: the criteria must be adjusted when QSystemInfo will report // attached mouses, till then we stick to the touch presence property bool hasMouseAttached: QuickUtils.mouseAttached SignalSpy { id: clickSpy target: bottomEdgeHint signalName: "onClicked" } function initTestCase() { // register test touch device TestExtras.registerTouchDevice(); // FIXME: this test case must be adjusted after we get the QInputDeviceInfo // available to detect attached mouse // the test must be executed before we register touch device if (!hasMouseAttached) { // we don't have mouse attached, so we should be able to lock/unlock compare(bottomEdgeHint.status, BottomEdgeHint.Inactive, "Wrong initial status when no mouse attached"); bottomEdgeHint.status = BottomEdgeHint.Locked; compare(bottomEdgeHint.status, BottomEdgeHint.Locked, "Could not toggle status"); } else { // we have the mouse attached, should not be able to unlock it compare(bottomEdgeHint.status, BottomEdgeHint.Locked, "Wrong initial status when mouse attached"); bottomEdgeHint.status = BottomEdgeHint.Inactive; compare(bottomEdgeHint.status, BottomEdgeHint.Locked, "The bottom edge must not be unlockable as long as mouse is attached!"); } QuickUtils.mouseAttached = !QuickUtils.mouseAttached; // and then turn locked off if possible bottomEdgeHint.status = BottomEdgeHint.Inactive; if (!hasMouseAttached) { compare(bottomEdgeHint.status, BottomEdgeHint.Inactive, "Cannot unlock hint!"); } // defaults compare(bottomEdgeHint.iconName, ""); compare(bottomEdgeHint.text, ""); compare(bottomEdgeHint.width, mainView.width); compare(bottomEdgeHint.height, units.gu(4)); compare(bottomEdgeHint.y, mainView.height - bottomEdgeHint.height); compare(bottomEdgeHint.flickable, null, "No flickable"); compare(clickSpy.count, 0, "The BottomEdgeHint should not have received a click."); compare(bottomEdgeHint.deactivateTimeout, 800, "default deactivationTimeout"); // set the flickable bottomEdgeHint.flickable = listView; } function cleanup() { mainView.forceActiveFocus(); listView.positionViewAtBeginning(); bottomEdgeHint.visible = true; bottomEdgeHint.iconName = ""; bottomEdgeHint.status = BottomEdgeHint.Inactive; clickSpy.clear(); wait(400); } function test_hiding() { var flickDy = listView.height - units.gu(5); flick(listView, centerOf(listView).x, flickDy, centerOf(listView).x, -flickDy, 0, 6); if (hasMouseAttached) { expectFailContinue("", "No hiding when mouse attached"); } tryCompare(bottomEdgeHint, "status", BottomEdgeHint.Hidden); } function test_no_hiding_when_locked() { var flickDy = listView.height - units.gu(10); bottomEdgeHint.status = BottomEdgeHint.Locked; flick(listView, centerOf(listView).x, flickDy, centerOf(listView).x, -flickDy, 0, 6); expectFailContinue("", "No hiding when Locked"); tryCompare(bottomEdgeHint, "status", BottomEdgeHint.Hidden, 500); } function test_clicking_data() { return [ {tag: "when Locked", status: BottomEdgeHint.Locked, statusFail: false, xfail: false}, {tag: "when Active", status: BottomEdgeHint.Active, statusFail: hasMouseAttached, xfail: false}, {tag: "when Inactive", status: BottomEdgeHint.Inactive, statusFail: hasMouseAttached, xfail: !hasMouseAttached}, {tag: "when Hidden", status: BottomEdgeHint.Hidden, statusFail: hasMouseAttached, xfail: !hasMouseAttached}, ]; } function test_clicking(data) { bottomEdgeHint.status = data.status; // states cannot be set when mouse attached if (!data.statusFail) { compare(bottomEdgeHint.status, data.status); } mouseClick(bottomEdgeHint, centerOf(bottomEdgeHint).x, centerOf(bottomEdgeHint).y); if (data.xfail) { expectFailContinue(data.tag, "No click is expected"); } clickSpy.wait(500); } function test_alter_deprecated_state_data() { return [ {tag: "Hidden", status: hasMouseAttached ? BottomEdgeHint.Locked : BottomEdgeHint.Hidden}, {tag: "Visible", status: hasMouseAttached ? BottomEdgeHint.Locked : BottomEdgeHint.Inactive}, ]; } function test_alter_deprecated_state(data) { ignoreWarning(warningFormat(37, 5, "QML BottomEdgeHint: Overloaded 'state' property deprecated, will be removed from 1.3 release. Use 'status' instead.")); bottomEdgeHint.state = data.tag; compare(bottomEdgeHint.status, data.status, "Wrong component status: " + data.status); } function test_anchoring() { compare(floatingHint.anchors.bottom, mainView.top, "Anhors are broken"); floatingHint.parent = floatingItem; compare(floatingHint.anchors.bottom, floatingItem.top, "Anhors are broken after reparenting"); } function test_no_clicking_data() { return [ {tag: "when hidden", property: "visible"}, {tag: "when disabled", property: "enabled"}, ]; } function test_no_clicking(data) { bottomEdgeHint.status = BottomEdgeHint.Locked; bottomEdgeHint[data.property] = false; mouseClick(bottomEdgeHint, centerOf(bottomEdgeHint).x, centerOf(bottomEdgeHint).y); expectFailContinue("", "No click " + data.tag); clickSpy.wait(400); } function test_activate_by_key_data() { return [ {tag: "enter and unlocked", key: Qt.Key_Return, status: BottomEdgeHint.Inactive}, {tag: "return and unlocked", key: Qt.Key_Enter, status: BottomEdgeHint.Inactive}, {tag: "space and unlocked", key: Qt.Key_Space, status: BottomEdgeHint.Inactive}, {tag: "enter and locked", key: Qt.Key_Return, status: BottomEdgeHint.Locked}, {tag: "return and locked", key: Qt.Key_Enter, status: BottomEdgeHint.Locked}, {tag: "space and locked", key: Qt.Key_Space, status: BottomEdgeHint.Locked}, ]; } function test_activate_by_key(data) { switch (data.status) { case BottomEdgeHint.Inactive: QuickUtils.mouseAttached = false; break; case BottomEdgeHint.Locked: QuickUtils.mouseAttached = true; break; default: fail("Unexpected status %1".arg(data.status)); } bottomEdgeHint.status = data.status; bottomEdgeHint.forceActiveFocus(); verify(bottomEdgeHint.activeFocus, "Hint doesn't have the focus"); keyPress(data.key); clickSpy.wait(400); keyRelease(data.key); } // FIXME: must be executed before the test_hiding as flick with mouse affects // the touch drag on ListView for some unknown reason function test_0_touch_gesture() { bottomEdgeHint.text = "Touch Activated"; var gestureStartPoint = Qt.point(centerOf(bottomEdgeHint).x, bottomEdgeHint.height - 1); TestExtras.touchDrag(0, bottomEdgeHint, gestureStartPoint, Qt.point(0, -units.gu(8)), 6); var expectedStatus = hasMouseAttached ? BottomEdgeHint.Locked : BottomEdgeHint.Active; tryCompare(bottomEdgeHint, "status", expectedStatus, 400); // then wait till we get back to Idle expectedStatus = hasMouseAttached ? BottomEdgeHint.Locked : BottomEdgeHint.Inactive; tryCompare(bottomEdgeHint, "status", expectedStatus, 1000); } function test_custom_trigger_on_clicked() { bottomEdgeHint.status = BottomEdgeHint.Locked; var prevCount = bottomEdgeHint.triggerCount; mouseClick(bottomEdgeHint, centerOf(bottomEdgeHint).x, centerOf(bottomEdgeHint).y); clickSpy.wait(500); compare(bottomEdgeHint.triggerCount, prevCount + 1, "Overloaded trigger not called"); } function test_active_focus_on_press_bug1517777() { var testItem = bottomEdgeHint; testItem.status = BottomEdgeHint.Active; testItem.activeFocusOnPress = true; // make sure the test item is not active focus floatingHint.forceActiveFocus(); verify(testItem.status >= BottomEdgeHint.Active); compare(testItem.activeFocus, false, "BottomEdgeHint is focus before the test!"); mouseClick(testItem, centerOf(testItem).x, centerOf(testItem).y); compare(testItem.activeFocus, true, "BottomEdgeHint is not focus"); } } } ./tests/unit_x11/tst_components/tst_textfield.qml0000644000015600001650000004545412700370701022374 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 Item { id: textItem width: units.gu(50); height: units.gu(70) property bool hasOSK: false function reset() { colorTest.focus = false; textField.focus = false; t1.focus = false; t2.focus = false; } Column { TextField { id: colorTest color: colorTest.text.length < 4 ? "#0000ff" : "#00ff00" text: "colorTest" } TextField { id: textField SignalSpy { id: signalSpy target: parent } property int keyPressData property int keyReleaseData Keys.onPressed: keyPressData = event.key Keys.onReleased: keyReleaseData = event.key action: Action { enabled: true name: 'spam' text: 'Spam' } } TextField { id: t1 text: "t1" } TextField { id: t2 text: "t2" } TextField { id: enabledTextField enabled: true text: "enabledTextField" } TextField { id: disabledTextField enabled: false text: "disabledTextField" } TextField { id: longText text: "The orange (specifically, the sweet orange) is the fruit of the citrus species Citrus × ​sinensis in the family Rutaceae." } } UbuntuTestCase { name: "TextFieldAPI" when: windowShown // initialize test objects function init() { textItem.hasOSK = QuickUtils.inputMethodProvider !== "" longText.cursorPosition = 0; } // empty event buffer function cleanup() { colorTest.focus = textField.focus = t1.focus = t2.focus = enabledTextField.focus = longText.focus = false; var scroller = findChild(longText, "input_scroller"); scroller.contentX = 0; wait(200); } function initTestCase() { textField.forceActiveFocus(); compare(textField.focus, true, "TextField is focused"); // clear clipboard Clipboard.clear(); } function test_0_popover() { compare(textField.popover, undefined, "No poppover defined by default."); } function test_0_highlighted() { compare(textField.highlighted, textField.focus, "highlighted is the same as focused"); } function test_0_acceptableInput() { compare(textField.acceptableInput,true,"acceptableInput true by default") } function test_0_activeFocusOnPress() { compare(textField.activeFocusOnPress, true,"activeFocusOnPress true by default") } function test_0_autoScroll() { compare(textField.autoScroll, true,"autoScroll true by default") } function test_0_canPaste() { compare(textField.canPaste, false,"calPaste false when clipboard is empty") } function test_0_canRedo() { compare(textField.canRedo, false,"calRedo false when no data was entered") } function test_0_canUndo() { compare(textField.canUndo, false,"calUndo false when no data entered") } function test_0_contentWidth() { compare(textField.contentWidth, 0,"contentWidth by default") } function test_0_contentHeight() { // line size is the font pixel size + 3 dp skip("This test is flaky, must be checked or removed completely!"); var lineSize = textField.font.pixelSize + units.dp(3) compare(textField.contentHeight, lineSize,"contentHeight by default") } function test_0_cursorDelegate() { verify(textField.cursorDelegate === null, "cursorDelegate not set by default") } function test_0_cursorPosition() { compare(textField.cursorPosition, 0, "cursorPosition 0 by default") } function test_0_cursorRectangle() { compare(textField.cursorRectangle, Qt.rect(0, 0, 0, 0), "cursorRectangle 0 by default") } function test_0_cursorVisible() { compare(textField.cursorVisible, false, "cursorVisible false by default when inactive"); textField.focus = true; compare(textField.cursorVisible, true, "cursorVisible true by default when active"); } function test_0_customSoftwareInputPanel() { compare(textField.customSoftwareInputPanel,null,"customSoftwareInputPanel is null by default") } function test_0_displayText() { compare(textField.displayText, "", "displayText empty by default") } function test_0_echoMode() { compare(textField.echoMode, TextInput.Normal,"echoMode is TextInput.Normal by default") } function test_0_errorHighlight() { compare(textField.errorHighlight, false,"errorHighlight is false by default") textField.errorHighlight = true compare(textField.errorHighlight,true,"set/get") } function test_0_font() { verify((textField.font),"font is set") } function test_0_alignments() { compare(textField.horizontalAlignment, TextInput.AlignLeft, "horizontalAlignmen is Left by default") compare(textField.effectiveHorizontalAlignment, TextInput.AlignLeft, "effectiveHorizontalAlignmen is Left by default") compare(textField.verticalAlignment, TextInput.AlignVCenter, "verticalAlignmen is VCenter by default") } function test_hasClearButton() { compare(textField.hasClearButton, true, "hasClearButton is false by default") textField.hasClearButton = false compare(textField.hasClearButton, false, "set/get") } function test_0_inputMask() { compare(textField.inputMask, "", "inputMask is undefined by default") } function test_0_inputMethodComposing() { compare(textField.inputMethodComposing, false, "inputMethodComposing is false by default") } function test_0_inputMethodHints() { compare(textField.inputMethodHints, Qt.ImhNone, "inputMethodHints is Qt.ImhNone by default") } function test_0_length() { compare(textField.length, 0, "length is 0 by default") } function test_0_maximumLength() { compare(textField.maximumLength, 32767, "maximumLength is 32767 by default") } function test_0_mouseSelectionMode() { compare(textField.mouseSelectionMode, TextInput.SelectCharacters, "mouseSelectionMode default") } function test_0_passwordCharacter() { compare(textField.passwordCharacter, "\u2022", "passwordCharacter default") } function test_0_persistentSelection() { compare(textField.persistentSelection, false, "persistentSelection default") } function test_0_renderType() { compare(textField.renderType, Text.QtRendering, "renderType default") } function test_0_selectByMouse() { compare(textField.selectByMouse, true, "selectByMouse default") } function test_0_placeholderText() { compare(textField.placeholderText, "", "placeholderText is '' by default") } function test_0_primaryItem() { expectFail("","https://bugs.launchpad.net/tavastia/+bug/1076768") compare(textField.primaryItem, undefined, "primaryItem is undefined by default") } function test_0_readOnly() { compare(textField.readOnly, false, "readOnly is false by default") textField.readOnly = true compare(textField.readOnly, true, "set/get") var clearButton = findChild(textField, "clear_button") compare(clearButton.visible, false, "readOnly must not provide a clear button") } function test_0_secondaryItem() { expectFail("","https://bugs.launchpad.net/tavastia/+bug/1076768") compare(textField.secondaryItem, undefined, "secondaryItem is undefined by default") } function test_0_selectedText() { compare(textField.selectedText, "", "selectedText is '' by default") } function test_0_selectionEnd() { compare(textField.selectionEnd, 0, "selectionEnd is 0 by default") } function test_0_selectionStart() { compare(textField.selectionStart, 0, "selectionStart is 0 by default") } function test_0_text() { compare(textField.text, "", "text is '' by default") var newText = "Hello World!" textField.text = newText compare(textField.text, newText, "set/get") } function test_0_validator() { compare(textField.validator, null, "validator is null by default") textField.validator = regExpValidator compare(textField.validator, regExpValidator, "set/get") } function test_validator_and_acceptableInput_with_invalid_value() { textField.validator = null compare(textField.acceptableInput,true,"acceptableInput should be true") textField.validator = regExpValidator textField.text = "012345" compare(textField.acceptableInput,false,"with validator failure the acceptableInput should be false") } function test_0_accepted() { signalSpy.signalName = "accepted"; compare(signalSpy.valid,true,"accepted signal exists") } function test_0_visible() { textField.visible = false; compare(textField.visible, false, "TextField is inactive"); } function test_keyPressAndReleaseFilter() { textField.visible = true; textField.forceActiveFocus(); textField.readOnly = false; textField.keyPressData = 0; textField.keyReleaseData = 0; keyClick(Qt.Key_Control, Qt.NoModifier, 200); compare(textField.keyPressData, Qt.Key_Control, "Key press filtered"); compare(textField.keyReleaseData, Qt.Key_Control, "Key release filtered"); } function test_undo_redo() { textField.readOnly = false; textField.text = ""; textField.focus = true; keyClick(Qt.Key_T); keyClick(Qt.Key_E); keyClick(Qt.Key_S); keyClick(Qt.Key_T); compare(textField.text, "test", "new text"); if (!textField.canUndo) expectFail("", "undo is not allowed in this input"); textField.undo(); compare(textField.text, "", "undone"); textField.redo(); compare(textField.text, "test", "redone"); } function test_getText() { textField.text = "this is a longer text"; compare(textField.getText(0, 10), "this is a ", "getText(0, 10)"); compare(textField.getText(10, 0), "this is a ", "getText(10, 0)"); compare(textField.getText(0), "", "getText(0)"); compare(textField.getText(4, 0), "this", "getText(4, 0)"); } function test_removeText() { textField.text = "this is a longer text"; textField.remove(0, 10); compare(textField.text, "longer text", "remove(0, 10)"); textField.text = "this is a longer text"; textField.remove(10, 0); compare(textField.text, "longer text", "remove(0, 10)"); textField.text = "this is a longer text"; textField.remove(0); compare(textField.text, "this is a longer text", "remove(0)"); textField.text = "this is a longer text"; textField.remove(4, 0); compare(textField.text, " is a longer text", "remove(4, 0)"); textField.text = "this is a longer text"; textField.select(0, 4); textField.remove(); compare(textField.text, "this is a longer text", "select(0, 4) && remove()"); } function test_moveCursorSelection() { textField.text = "this is a longer text"; textField.cursorPosition = 5; textField.moveCursorSelection(9, TextInput.SelectCharacters); compare(textField.selectedText, "is a", "moveCursorSelection from 5 to 9, selecting the text"); } function test_isRightToLeft() { textField.text = "this is a longer text"; compare(textField.isRightToLeft(0), false, "isRightToLeft(0)"); compare(textField.isRightToLeft(0, 0), false, "isRightToLeft(0, 0)"); compare(textField.isRightToLeft(5, 10), false, "isRightToLeft(5, 10)"); } function test_cut() { Clipboard.clear(); textField.readOnly = false; textField.text = "test text"; textField.cursorPosition = textField.text.indexOf("text"); textField.selectWord(); textField.cut(); compare(textField.text, "test ", "Text cut properly"); compare(Clipboard.data.text, "text", "Clipboard has the text cut"); // we should have the "text" only ones var plainTextCount = 0; for (var i in Clipboard.data.formats) { if (Clipboard.data.formats[i] === "text/plain") plainTextCount++; } compare(plainTextCount, 1, "Clipboard is correct"); } function test_paste() { textField.readOnly = false; textField.text = "test"; textField.cursorPosition = textField.text.length; textField.paste(" text"); compare(textField.text, "test text", "Data pasted"); } function test_colorCollisionOnDelegate() { // fixes bug lp:1169601 colorTest.text = "abc"; compare(colorTest.color, "#0000ff", "Color when text length < 4"); colorTest.text = "abcd"; compare(colorTest.color, "#00ff00", "Color when text length >= 4"); } function test_OneActiveFocus() { t1.focus = true; compare(t1.activeFocus, true, "T1 has activeFocus"); compare(t2.activeFocus, false, "T1 has activeFocus"); t2.focus = true; compare(t1.activeFocus, false, "T1 has activeFocus"); compare(t2.activeFocus, true, "T1 has activeFocus"); } // need to make the very first test case, otherwise OSK detection fails on phablet function test_OSK_ShownWhenNextTextFieldIsFocused() { if (!hasOSK) expectFail("", "OSK can be tested only when present"); t1.focus = true; compare(Qt.inputMethod.visible, true, "OSK is shown for the first TextField"); t2.focus = true; compare(Qt.inputMethod.visible, true, "OSK is shown for the second TextField"); } function test_RemoveOSKWhenFocusLost() { if (!hasOSK) expectFail("", "OSK can be tested only when present"); t1.focus = true; compare(Qt.inputMethod.visible, true, "OSK is shown when TextField gains focus"); t1.focus = false; compare(Qt.inputMethod.visible, false, "OSK is hidden when TextField looses focus"); } function test_ReEnabledInput() { textField.forceActiveFocus(); textField.enabled = false; compare(textField.enabled, false, "textField is disabled"); compare(textField.focus, true, "textField is focused"); compare(textField.activeFocus, false, "textField is not active focus"); compare(Qt.inputMethod.visible, false, "OSK removed"); textField.enabled = true; compare(textField.enabled, true, "textField is enabled"); compare(textField.focus, true, "textField is focused"); compare(textField.activeFocus, true, "textField is active focus"); if (!hasOSK) expectFail("", "OSK can be tested only when present"); compare(Qt.inputMethod.visible, true, "OSK shown"); } function test_Trigger() { signalSpy.signalName = 'accepted' textField.enabled = true textField.text = 'eggs' textField.accepted() signalSpy.wait() } function test_ActionInputMethodHints() { // Preset digit only for numbers textField.inputMethodHints = Qt.ImhNone textField.action.parameterType = Action.Integer compare(textField.inputMethodHints, Qt.ImhDigitsOnly) textField.inputMethodHints = Qt.ImhNone textField.action.parameterType = Action.Real compare(textField.inputMethodHints, Qt.ImhDigitsOnly) // No preset for strings textField.inputMethodHints = Qt.ImhNone textField.action.parameterType = Action.String compare(textField.inputMethodHints, Qt.ImhNone) // Never interfere with a manual setting textField.inputMethodHints = Qt.ImhDate textField.action.parameterType = Action.Integer compare(textField.inputMethodHints, Qt.ImhDate) } RegExpValidator { id: regExpValidator regExp: /[a-z]*/ } function test_click_enabled_textfield_must_give_focus() { textField.forceActiveFocus(); compare(enabledTextField.focus, false, 'enabledTextField is not focused'); mouseClick(enabledTextField, enabledTextField.width/2, enabledTextField.height/2); compare(enabledTextField.focus, true, 'enabledTextField is focused'); } function test_click_disabled_textfield_must_not_give_focus() { mouseClick(disabledTextField, disabledTextField.width/2, disabledTextField.height/2); compare(textField.focus, false, 'disabledTextField is not focused'); } } } ./tests/unit_x11/tst_components/tst_optionselector.qml0000644000015600001650000001127712700370701023451 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 import Ubuntu.Test 1.0 MainView { width: 400 height: 400 Column { anchors { left: parent.left right: parent.right } OptionSelector { id: selector text: "TEST" delegate: selectorDelegate model: customModel expanded: true action: { enabled: true name: 'selector' text: 'Selector' parameterType: Action.Integer } } OptionSelectorDelegate { id: testDelegate text: "TEST" subText: "test" iconSource: "../../resources/optionselector/test.png" constrainImage: true } } Component { id: selectorDelegate OptionSelectorDelegate { text: name subText: description iconSource: image constrainImage: true } } ListModel { id: customModel ListElement { name: "Name 1"; description: "Description 1"; image: "../../resources/optionselector/test.png" } ListElement { name: "Name 2"; description: "Description 2"; image: "../../resources/optionselector/test.png" } ListElement { name: "Name 3"; description: "Description 3"; image: "../../resources/optionselector/test.png" } ListElement { name: "Name 4"; description: "Description 4"; image: "../../resources/optionselector/test.png" } } SignalSpy { id: clickedSignal target: selector signalName: "delegateClicked" } SignalSpy { id: triggeredSignal target: selector signalName: "triggered" } SignalSpy { id: expansionSignal target: selector signalName: "expansionCompleted" } UbuntuTestCase { name: "OptionSelectorAPI" when: windowShown function test_expanded() { var listContainer = findChild(selector, "listContainer"); selector.expanded = false; compare(listContainer.currentlyExpanded, false, "expanded should be true if list is an expanded one"); compare(listContainer.state, "collapsed", "state should be collapsed"); selector.expanded = true; compare(listContainer.currentlyExpanded, true, "expanded should be false if list is an expanded one"); compare(listContainer.state, "expanded", "state should be expanded"); } function test_text() { var newText = "Hello World!"; selector.text = newText; compare(selector.text, newText, "set/get"); } function test_0_selectedIndex() { compare(selector.selectedIndex, 0, "selectedIndex is 0 by default"); } function test_model() { selector.delegate = null; selector.model = undefined; var newValues = ["value0","value1","value2","value3"]; selector.model = newValues; compare(selector.model, newValues, "set/get"); selector.model = customModel; selector.delegate = selectorDelegate; } function test_custom_model_delegate() { compare(selector.model, customModel, "Model wasn't set correctly."); compare(selector.delegate, selectorDelegate, "Delegate hasn't been set correctly"); } function test_image_constraint() { var image = findChild(testDelegate, "icon"); compare(image.height, testDelegate.height); } function test_signal() { skip('FIXME: This test doesn\'t pass in CI') mouseClick(selector, 100, 100, Qt.LeftButton); clickedSignal.wait(); expansionSignal.wait(); } function test_triggered() { skip('FIXME: This test doesn\'t pass in CI') mouseClick(selector, 100, 100, Qt.LeftButton); triggeredSignal.wait(); } } } ./tests/unit_x11/tst_components/tst_page_with_header.qml0000644000015600001650000001177012700370701023655 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Test 1.0 MainView { width: units.gu(50) height: units.gu(70) id: root Item { id: invisible visible: false Rectangle { objectName: "my_rectangle" id: myRectangle anchors { left: parent.left right: parent.right } height: units.gu(6) color: UbuntuColors.red } PageHeader { id: myPageHeader objectName: "my_page_header" title: "Page header" trailingActionBar.actions: [ Action { iconName: "settings" text: "First" }, Action { iconName: "info" text: "Second" } ] } } Page { id: page title: "Page with header" header: myPageHeader Column { anchors { left: parent.left right: parent.right top: parent.top topMargin: units.gu(10) leftMargin: units.gu(10) rightMargin: units.gu(10) } height: childrenRect.height Button { anchors { left: parent.left right: parent.right } text: "Page header" onClicked: page.header = myPageHeader } Button { anchors { left: parent.left right: parent.right } text: "Rectangle" onClicked: page.header = myRectangle } Button { anchors { left: parent.left right: parent.right } text: "Null" onClicked: page.header = null } } } UbuntuTestCase { name: "PageWithHeader" when: windowShown id: testCase property var appHeader; function initTestCase() { var pageHeader = findChild(page, "my_page_header"); compare(pageHeader, myPageHeader, "My PageHeader not initialized with Page as its parent."); appHeader = findChild(root, "MainView_Header"); compare(appHeader.visible, false, "AppHeader is not hidden initially when Page.header is set."); } function cleanup() { page.header = myPageHeader; var pageHeader = findChild(page, "my_page_header"); compare(pageHeader, myPageHeader, "PageHeader is not correctly re-parented to the Page when setting Page.header."); compare(myPageHeader.visible, true, "PageHeader is not visible after being re-parented to the Page."); compare(appHeader.visible, false, "AppHeader is not hidden when Page.header is set."); } function test_page_with_no_header() { page.header = null; compare(myPageHeader.parent, invisible, "Header parent is not correctly reverted when unsetting Page.header."); compare(myPageHeader.visible, false, "My PageHeader is still visible after re-parenting it to an invisible Item."); compare(appHeader.visible, true, "AppHeader does not become visible when Page.header is null."); } function test_page_with_alternative_header() { page.header = myRectangle; compare(myPageHeader.parent, invisible, "Header parent not correctly reverted when setting a different Page.header."); compare(myRectangle.parent, page, "Rectangle parent is not correctly set to page after setting it as Page.header."); compare(appHeader.visible, false, "Setting a different Page.header Item shows the AppHeader."); page.header = myPageHeader; compare(myRectangle.parent, invisible, "Rectangle parent is not correctly reverted after unsetting it as Page.header."); // myPageHeader parent is checked in cleanup(). } } } ./tests/unit_x11/tst_components/tst_tabs_empty.DEPRECATED_TOOLBAR.qml0000644000015600001650000000245312700370701025324 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.1 import Ubuntu.Test 1.0 MainView { width: units.gu(50) height: units.gu(100) useDeprecatedToolbar: true Tabs { id: empty } UbuntuTestCase { name: "EmptyTabsDeprecatedToolbar" when: windowShown function test_emptyTabs() { compare(empty.selectedTabIndex, -1, "The default value for selectedTabIndex is -1 when there are no tabs"); compare(empty.selectedTab, null, "The default selected tab is null when there are no tabs"); compare(empty.currentPage, null, "The default currentPage is null when there are no tabs"); } } } ./tests/unit_x11/tst_components/tst_pagehead_contents_width.qml0000644000015600001650000000602312700370701025243 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 Item { width: units.gu(50) height: units.gu(80) MainView { id: mainView anchors.fill: parent Tabs { id: tabs Tab { title: "Search" page: Page { head.contents: TextField { id: searchField anchors { left: parent ? parent.left : undefined right: parent ? parent.right : undefined rightMargin: units.gu(1) } placeholderText: i18n.tr("Search...") } } } Tab { title: "Actions" page: Page { head.actions: [ Action { iconName: "add" }, Action { iconName: "clear" }, Action { iconName: "delete" } ] } } } } UbuntuTestCase { name: "HeaderContents" when: windowShown id: testCase property var head_style function initTestCase() { waitForHeaderAnimation(mainView); } function test_header_contents_width_bug1408481() { var initialWidth = searchField.width; testCase.verify(initialWidth > 0, "Initial width has a positive value."); // Select the tab that has more actions. tabs.selectedTabIndex = 1; waitForHeaderAnimation(mainView); // Now less space is available for the header contents, so that the action buttons fit. testCase.verify(searchField.width < initialWidth, "Contents width is reduced."); // Without this wait(), the test does not reproduce bug 1408481. wait(100); // Select the first tab again: tabs.selectedTabIndex = 0; waitForHeaderAnimation(mainView); // Without actions in tab one, the full width is available again for contents testCase.verify(searchField.width === initialWidth, "Contents width is reset."); } } } ./tests/unit_x11/tst_components/tst_page_size.qml0000644000015600001650000000726312700370701022346 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.3 import QtTest 1.0 import Ubuntu.Components 1.2 Item { width: 300 height: 400 MainView { anchors.fill: parent id: mainView Tabs { id: tabs Tab { title: "Simple page" page: Page { id: page Label { anchors.centerIn: parent text: "simple" } } } Tab { title: "Page with Flickable" page: Page { id: pageWithFlickable Flickable { anchors.fill: parent contentHeight: 1000 Label { anchors.centerIn: parent text: "flickable" } } } } Tab { title: "Loaded page" Component { id: pageComponent Page { Label { anchors.centerIn: parent text: "loaded" } } } page: Loader { id: loader sourceComponent: pageComponent } } } } TestCase { name: "PageSize" when: windowShown id: testCase property real headerHeight; function initTestCase() { testCase.headerHeight = mainView.__propagated.header.height; verify(testCase.headerHeight > 0, "Header has no height."); verify(tabs.selectedTabIndex == 0, "First tab not selected initially."); } function cleanupTestCase() { tabs.selectedTabIndex = 0; } function verify_item_rect(item, x, y, w, h, name) { compare(item.x, x, name + " does not anchor to the left."); compare(item.y, y, name + " does not align with the bottom of the header."); compare(item.width, w, name + " does not align with the main view on the right side."); compare(item.height, h, name + " does not align with the bottom of the main view."); } function test_size_bug1424635() { verify_item_rect(page, 0, testCase.headerHeight, mainView.width, mainView.height - testCase.headerHeight, "Page without flickable"); tabs.selectedTabIndex = 1; verify_item_rect(pageWithFlickable, 0, 0, mainView.width, mainView.height, "Page with flickable"); tabs.selectedTabIndex = 2; verify_item_rect(loader, 0, testCase.headerHeight, mainView.width, mainView.height - testCase.headerHeight, "Page loader"); verify_item_rect(loader.item, 0, 0, mainView.width, loader.height, "Loaded page"); } } } ./tests/unit_x11/tst_components/tst_ubuntulistview11.qml0000644000015600001650000000576112700370701023654 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 Item { width: units.gu(40) height: units.gu(60) ListModel { id: dummyModel Component.onCompleted: { reload(); } function reload() { clear(); for (var i = 0; i < 20; ++i) { dummyModel.append({idx: i}); } } } // timer used to simulate the model refresh Timer { id: refreshTimer interval: 500 onTriggered: { dummyModel.reload(); } } UbuntuListView { id: ubuntuListView anchors.fill: parent clip: true model: dummyModel pullToRefresh { refreshing: refreshTimer.running onRefresh: refreshTimer.restart() } delegate: Standard { id: expandable text: "item " + index } } UbuntuTestCase { name: "UbuntuListView" when: windowShown SignalSpy { id: refreshSpy signalName: "onRefresh" } function initTestCase() { tryCompare(dummyModel, "count", 20); } function init() { waitForRendering(ubuntuListView, 1000); } function cleanup() { // scroll the ListView back to top ubuntuListView.positionViewAtIndex(0, ListView.Beginning); refreshSpy.clear(); refreshSpy.target = null; ubuntuListView.pullToRefresh.enabled = false; } function test_0_defaults() { verify(ubuntuListView.hasOwnProperty("pullToRefresh"), "PullToRefresh is missing"); compare(ubuntuListView.pullToRefresh.enabled, false, "PullToRefresh functionality is disabled by default"); } function test_pullToRefresh_manual_refresh() { ubuntuListView.pullToRefresh.enabled = true; refreshSpy.target = ubuntuListView.pullToRefresh var x = ubuntuListView.width / 2; mouseDrag(ubuntuListView, x, units.gu(1), 0, ubuntuListView.height); refreshSpy.wait(); tryCompareFunction(function() { return ubuntuListView.pullToRefresh.refreshing; }, false, 1000); waitForRendering(ubuntuListView, 1000); } } } ./tests/unit_x11/tst_components/tst_ubuntulistview.qml0000644000015600001650000001627512700370701023514 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.0 import Ubuntu.Components.ListItems 1.0 Item { width: units.gu(40) height: units.gu(60) ListModel { id: dummyModel Component.onCompleted: { for (var i = 0; i < 20; ++i) { dummyModel.append({idx: i}); } } } UbuntuListView { id: ubuntuListView anchors { left: parent.left; top: parent.top; right: parent.right } height: units.gu(20) clip: true model: dummyModel delegate: Expandable { id: expandable objectName: "expandable" + index expandedHeight: contentColumn.height onClicked: ubuntuListView.expandedIndex = index Column { id: contentColumn anchors { left: parent.left; right: parent.right; top: parent.top } Rectangle { anchors { left: parent.left; right: parent.right} id: collapsedRect color: index % 2 == 0 ? "khaki" : "blue" height: expandable.collapsedHeight } Rectangle { anchors { left: parent.left; right: parent.right } height: units.gu(40) color: "orange" } } } } UbuntuTestCase { name: "UbuntuListView" when: windowShown function initTestCase() { tryCompare(dummyModel, "count", 20); } function init() { waitForRendering(ubuntuListView); } function expandItem(item) { var index = ubuntuListView.indexAt(item.x, item.y); ubuntuListView.expandedIndex = index; var targetHeight = Math.min(item.expandedHeight, ubuntuListView.height - item.collapsedHeight); tryCompare(item, "height", targetHeight); waitForRendering(ubuntuListView) } function collapse() { if (ubuntuListView.expandedIndex == -1) { return; } var expandedItem = findChild(ubuntuListView, "expandable" + ubuntuListView.expandedIndex); ubuntuListView.expandedIndex = -1; tryCompare(expandedItem, "height", expandedItem.collapsedHeight); waitForRendering(ubuntuListView); } function test_expandedItem() { var item = findChild(ubuntuListView, "expandable1"); expandItem(item); // expandedItem needs to point to the expanded item compare(ubuntuListView.expandedIndex, 1); // item must be expanded now compare(item.expanded, true); collapse(); // expandedItem must be unset after collapsing compare(ubuntuListView.expandedIndex, -1); } function test_noScrollingNeeded() { var item = findChild(ubuntuListView, "expandable1"); fuzzyCompare(ubuntuListView.mapFromItem(item).y, item.collapsedHeight, .5); expandItem(item); waitForRendering(ubuntuListView); fuzzyCompare(ubuntuListView.mapFromItem(item).y, item.collapsedHeight, .5); } function test_scrollToTop() { ubuntuListView.height = units.gu(30); ubuntuListView.positionViewAtIndex(0, ListView.Beginning) var item = findChild(ubuntuListView, "expandable1"); fuzzyCompare(ubuntuListView.mapFromItem(item).y, item.collapsedHeight, 1); expandItem(item); fuzzyCompare(ubuntuListView.mapFromItem(item).y, 0, .5); } function test_scrollIntoView() { var item = findChild(ubuntuListView, "expandable9"); expandItem(item); waitForRendering(ubuntuListView); // The item must be scrolled upwards, leaving space for one other item at the bottom fuzzyCompare(ubuntuListView.mapFromItem(item).y, ubuntuListView.height - item.collapsedHeight - item.expandedHeight, 1); } function test_collapseByClickingOutside() { // expand item 0 var item = findChild(ubuntuListView, "expandable0"); expandItem(item); // click on item 1 var item1 = findChild(ubuntuListView, "expandable1"); mouseClick(item1, item1.width / 2, item1.height / 2); // make sure item1 is collapsed tryCompare(item, "expanded", false); } function test_dimOthers() { var item = findChild(ubuntuListView, "expandable1"); expandItem(item); for (var i = 0; i < ubuntuListView.contentItem.children.length; ++i) { var childItem = ubuntuListView.contentItem.children[i]; if (childItem.hasOwnProperty("expanded")) { compare(childItem.opacity, childItem.expanded ? 1 : .5) } } } function test_destroyAndRecreateExpanded() { var item = findChild(ubuntuListView, "expandable1"); expandItem(item); // scroll the list to the bottom ubuntuListView.currentIndex = 0; ubuntuListView.positionViewAtIndex(ubuntuListView.count -1, ListView.End); // make sure the item is eventually destroyed tryCompareFunction(function() { return findChild(ubuntuListView, "expandable1") == null;}, true) // scroll the list back up ubuntuListView.positionViewAtIndex(0, ListView.Beginning) // wait until the item is recreated. tryCompareFunction(function() { return findChild(ubuntuListView, "expandable1") != null; }, true); item = findChild(ubuntuListView, "expandable1"); compare(item.expanded, true); } function test_collapseOnClick() { var item = findChild(ubuntuListView, "expandable1"); item.collapseOnClick = true; expandItem(item); compare(ubuntuListView.expandedIndex, 1); mouseClick(item, item.width / 2, item.collapsedHeight / 2); tryCompare(ubuntuListView, "expandedIndex", -1); // restore stuff we've changed item.collapseOnClick = false; } function cleanup() { // Restore listview height ubuntuListView.height = units.gu(60); collapse(); // scroll the ListView back to top ubuntuListView.positionViewAtIndex(0, ListView.Beginning); } } } ./tests/unit_x11/tst_components/tst_expandablescolumn.qml0000644000015600001650000001300312700370701024071 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 Item { width: units.gu(40) height: units.gu(60) ExpandablesColumn { id: expandablesColumn anchors { left: parent.left; top: parent.top; right: parent.right } height: units.gu(60) clip: true Repeater { id: repeater model: 20 delegate: Expandable { id: expandable objectName: "expandable" + index expandedHeight: contentColumn.height onClicked: expanded = !expanded Column { id: contentColumn anchors { left: parent.left; right: parent.right; top: parent.top } Rectangle { anchors { left: parent.left; right: parent.right} id: collapsedRect color: index % 2 == 0 ? "khaki" : "blue" height: expandable.collapsedHeight } Rectangle { anchors { left: parent.left; right: parent.right } height: units.gu(40) color: "orange" } } } } } UbuntuTestCase { name: "ExpandablesColumn" when: windowShown function init() { waitForRendering(expandablesColumn); } function expandItem(item) { item.expanded = true; var targetHeight = Math.min(item.expandedHeight, expandablesColumn.height - item.collapsedHeight); tryCompare(item, "height", targetHeight); } function collapse() { var expandedItem = expandablesColumn.expandedItem; if (expandedItem != undefined) { expandedItem.expanded = false; tryCompare(expandedItem, "height", expandedItem.collapsedHeight); } } function test_expandedItem() { var item = findChild(expandablesColumn, "expandable1"); expandItem(item); // expandedItem needs to point to the expanded item compare(expandablesColumn.expandedItem, item); collapse(); // expandedItem must be unset after collapsing // TODO Once we depend in Qt 5.4 change to // compare(expandablesColumn.expandedItem, null); // We need it this way to have compatibility with Qt 5.3 // and 5.4 since for some reason an alias to a null in Qt 5.3 // has undefined value instead of null verify(expandablesColumn.expandedItem == null); } function test_noScrollingNeeded() { var item = findChild(expandablesColumn, "expandable1"); compare(expandablesColumn.mapFromItem(item).y, item.collapsedHeight); expandItem(item); compare(expandablesColumn.mapFromItem(item).y, item.collapsedHeight); } function test_scrollToTop() { expandablesColumn.height = units.gu(30); var item = findChild(expandablesColumn, "expandable1"); compare(expandablesColumn.mapFromItem(item).y, item.collapsedHeight); expandItem(item); compare(expandablesColumn.mapFromItem(item).y, 0); } function test_scrollIntoView() { var item = findChild(expandablesColumn, "expandable9"); expandItem(item); // The item must be scrolled upwards, leaving space for one other item at the bottom compare(expandablesColumn.mapFromItem(item).y, expandablesColumn.height - item.collapsedHeight - item.expandedHeight); } function test_collapseByClickingOutside() { // expand item 0 var item = findChild(expandablesColumn, "expandable0"); expandItem(item); // click on item 1 var item1 = findChild(expandablesColumn, "expandable1"); mouseClick(item1, item1.width / 2, item1.height / 2); // make sure item1 is collapsed tryCompare(item, "expanded", false); } function test_dimOthers() { var item = findChild(expandablesColumn, "expandable1"); expandItem(item); for (var i = 0; i < repeater.count; ++i) { var isCurrent = (repeater.itemAt(i) === expandablesColumn.expandedItem) compare(repeater.itemAt(i).opacity, isCurrent ? 1 : .5) } } function cleanup() { // Restore listview height expandablesColumn.height = units.gu(60); collapse(); // scroll the column back to top expandablesColumn.flick(0, units.gu(500)); tryCompare(expandablesColumn, "flicking", false); } } } ./tests/unit_x11/tst_components/tst_toggles.qml0000644000015600001650000000454112700370701022040 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 MainView { id: main width: units.gu(40) height: units.gu(71) Column { Switch { id: testSwitch checked: true property bool checkedNow: true onClicked: checkedNow = checked } CheckBox { id: testCheck checked: true property bool checkedNow: true onClicked: checkedNow = checked } } UbuntuTestCase { name: "Toggles13" when: windowShown SignalSpy { id: clickedSpy signalName: "clicked" } function cleanup() { clickedSpy.clear(); clickedSpy.target = null; } function test_toggle_checked_delayed_bug1524234_data() { return [ {tag: "CheckBox", testItem: testCheck, mouse: true}, {tag: "Switch", testItem: testSwitch, mouse: true}, {tag: "CheckBox, space key", testItem: testCheck, key: Qt.Key_Space}, {tag: "Switch, space key", testItem: testSwitch, key: Qt.Key_Space}, ]; } function test_toggle_checked_delayed_bug1524234(data) { data.testItem.checkedNow = data.testItem.checked; data.testItem.forceActiveFocus(); clickedSpy.target = data.testItem; if (data.key) { keyClick(data.key); } else { mouseClick(data.testItem, centerOf(data.testItem).x, centerOf(data.testItem).y); } clickedSpy.wait(400); compare(data.testItem.checkedNow, data.testItem.checked); } } } ./tests/unit_x11/tst_components/tst_multicolumnheader.qml0000644000015600001650000005350612700370701024122 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 MainView { id: root width: units.gu(120) height: units.gu(71) // 2 on desktop, 1 on phone. property int columns: width >= units.gu(80) ? 2 : 1 AdaptivePageLayout { id: layout width: parent.width height: parent.height primaryPage: rootPage Page { id: rootPage title: "Root" Column { anchors { top: parent.top left: parent.left right: parent.right } height: childrenRect.height ListItemWithLabel { text: "Add page left" onClicked: layout.addPageToCurrentColumn(rootPage, leftPage) } ListItemWithLabel { text: "Add page right" onClicked: layout.addPageToNextColumn(rootPage, rightPage) } ListItemWithLabel { text: "Add sections page right" onClicked: layout.addPageToNextColumn(rootPage, sectionsPage) } ListItemWithLabel { text: "Add external page right" onClicked: layout.addPageToNextColumn( rootPage, Qt.resolvedUrl("MyExternalPage.qml")) } ListItemWithLabel { text: "Add page with head contents left" onClicked: layout.addPageToCurrentColumn(rootPage, headContentsPage) } ListItemWithLabel { text: "Add page with head contents right" onClicked: layout.addPageToNextColumn(rootPage, headContentsPage) } ListItemWithLabel { text: "Add page with header left" onClicked: layout.addPageToCurrentColumn(rootPage, pageWithHeader) } ListItemWithLabel { text: "Add page with header right" onClicked: layout.addPageToNextColumn(rootPage, pageWithHeader) } } } Page { id: leftPage title: "First column" Rectangle { anchors { fill: parent margins: units.gu(2) } color: "orange" Button { anchors.centerIn: parent text: "right" onTriggered: layout.addPageToNextColumn(leftPage, rightPage) } } } Page { id: rightPage title: "Second column" Rectangle { anchors { fill: parent margins: units.gu(2) } color: "green" Button { anchors.centerIn: parent text: "Another page!" onTriggered: layout.addPageToCurrentColumn(rightPage, sectionsPage) } } } Page { id: sectionsPage title: "Page with sections" head.sections.model: ["uno", "dos", "tres"] Rectangle { anchors { fill: parent margins: units.gu(2) } color: "blue" } } Page { id: headContentsPage head.contents: Rectangle { id: headRectangle color: UbuntuColors.orange anchors.fill: parent } } Page { id: pageWithHeader header: PageHeader { title: "Page with header" StyleHints { backgroundColor: UbuntuColors.blue foregroundColor: "white" } } Rectangle { anchors { top: pageWithHeader.header.bottom left: parent.left right: parent.right bottom: parent.bottom margins: units.gu(2) } color: UbuntuColors.warmGrey Button { anchors.centerIn: parent text: "Add sections to next column." onTriggered: layout.addPageToNextColumn(pageWithHeader, sectionsPage) } } } } UbuntuTestCase { when: windowShown function resize_single_column_width() { layout.width = units.gu(40); } // resize to use the full window width function resize_full_width() { layout.width = root.width; } function get_number_of_columns() { var body = findChild(layout, "body"); return body.children.length; } // old APL subheader function get_subheader(column) { return findChild(layout, "Header" + column); } // new Page header function get_pageheader(column) { var holder = findChild(layout, "ColumnHolder" + column); if (holder && holder.page && holder.page.hasOwnProperty("header")) { return holder.page.header; } else { return null; } } function get_header(column) { var pageHeader = get_pageheader(column); if (pageHeader) { return pageHeader; } else { return get_subheader(column); } } function get_number_of_headers() { var numHeaders = 0; var header = get_header(0); verify(header !== null, "No header found!"); while (header !== null) { numHeaders++; header = get_header(numHeaders); } return numHeaders; } function get_back_button_visible(column) { var header = get_pageheader(column); var back_button; if (header) { // new PageHeader back_button = findChild(header, "apl_back_action_button"); if (back_button) { // Wait for back_button.visible to match back_button.action.visible waitForRendering(header, 100); } // FIXME TIM: when visibleActions is fixed, only check for back_button return back_button != null && back_button.visible; } else { // old APL subHeader header = get_subheader(column); back_button = findChild(header, "backButton"); return back_button.visible; } } function cleanup() { layout.removePages(rootPage); resize_full_width(); } function test_number_of_headers_equals_number_of_columns_wide() { if (root.columns !== 2) { skip("Only for wide view."); } compare(get_number_of_columns(), 2, "Number of columns is not 2."); compare(get_number_of_headers(), 2, "Number of headers is not 2."); } function test_number_of_headers_equals_number_of_columns_narrow() { if (root.columns !== 1) { resize_single_column_width(); } compare(get_number_of_columns(), 1, "Number of columns is not 1 on narrow screen."); compare(get_number_of_headers(), 1, "Number of headers is not 1 on narrow screen."); } function test_header_configuration_equals_column_page_configuration_wide() { if (root.columns !== 2) { skip("Only for wide view."); } compare(get_number_of_headers(), 2, "Number of headers is not 2 initially."); compare(get_subheader(0).config, rootPage.head, "First column header is not initialized with primaryPage header config."); compare(get_subheader(1).config, null, "Second column header is not initalized with null."); layout.addPageToCurrentColumn(rootPage, leftPage); compare(get_subheader(0).config, leftPage.head, "First column header is not updated properly."); compare(get_subheader(1).config, null, "Second column header is updated when it should not be."); layout.removePages(leftPage); compare(get_subheader(0).config, rootPage.head, "First column header is not reverted properly."); layout.addPageToNextColumn(rootPage, rightPage); compare(get_subheader(0).config, rootPage.head, "First column header is updated when it should not be."); compare(get_subheader(1).config, rightPage.head, "Second column header is not updated properly."); layout.removePages(rightPage); compare(get_subheader(1).config, null, "Second column header is not reverted properly."); } function test_header_configuration_equals_column_page_configuration_narrow() { if (root.columns !== 1) { resize_single_column_width(); } compare(get_number_of_headers(), 1, "Number of headers is not 1."); compare(get_subheader(0).config, rootPage.head, "First column header is not initialized with primaryPage header config."); layout.addPageToCurrentColumn(rootPage, leftPage); compare(get_subheader(0).config, leftPage.head, "Single column header is not updated properly."); layout.removePages(leftPage); compare(get_subheader(0).config, rootPage.head, "Single column header is not reverted properly."); layout.addPageToNextColumn(rootPage, rightPage); compare(get_subheader(0).config, rightPage.head, "Single column header is not updated properly when adding to next column."); layout.removePages(rightPage); compare(get_subheader(0).config, rootPage.head, "Single column header is not reverted properly after adding to next column."); } function test_header_title_for_external_page() { var incubator = layout.addPageToNextColumn(rootPage, Qt.resolvedUrl("MyExternalPage.qml")); var pageLoaded = false; incubator.onStatusChanged = function (status) { pageLoaded = (incubator.object != null); } tryCompareFunction(function() {return pageLoaded}, true, 1000); var n = root.columns === 2 ? 1 : 0 compare(get_subheader(n).config.title, "Page from QML file", "Adding external Page does not update the header title."); } function test_subheader_height() { // contentHeight + divider height var baseHeight = units.gu(6) + units.dp(1); var withSectionsHeight = baseHeight + units.gu(4); var n = get_number_of_headers(); var i; for (i = 0; i < n; i++) { compare(get_header(i).height, baseHeight, "Header " + i + " height is not initialized correctly."); } layout.addPageToNextColumn(rootPage, rightPage); for (i = 0; i < n; i++) { compare(get_header(i).height, baseHeight, "Header " + i + " height is incorrect after adding Page."); } layout.removePages(rightPage); layout.addPageToNextColumn(rootPage, sectionsPage); for (i = 0; i < n; i++) { compare(get_header(i).height, withSectionsHeight, "Header " + i + " height is incorrect after adding single Page with sections."); } layout.removePages(sectionsPage); for (i = 0; i < n; i++) { compare(get_header(i).height, baseHeight, "Header " + i + " height is not correctly reverted after removing Page with sections."); } } function test_pageheader_height() { if (root.columns !== 2) { skip("Only for wide view."); } // baseHeight was checked in test_subheader_height(). var baseHeight = get_header(0).height; layout.addPageToCurrentColumn(rootPage, pageWithHeader); compare(pageWithHeader.header.height, baseHeight, "Page header height does not match the base header height."); layout.addPageToNextColumn(pageWithHeader, sectionsPage); // withSectionsHeight was checked in test_subheader_height(). var withSectionsHeight = get_header(1).height; compare(withSectionsHeight > baseHeight, true, "Header with sections is not higher than header without sections."); compare(pageWithHeader.header.height, withSectionsHeight, "Page header does not adapt its height to header with sections in other column."); layout.removePages(sectionsPage); compare(pageWithHeader.header.height, baseHeight, "Page header height is not reverted when header with sections is removed from next column."); } function test_back_button_wide() { // FIXME: When we remove support for the old subHeader and all // pages use a PageHeader, the repeated tests for PageHeader below // can be removed. if (root.columns !== 2) { skip("Only for wide view."); } // A is the first column, B is the second column. // A:i, B:j = i pages in A, j pages in B. // primary page has no back button // A:1, B:0 compare(get_back_button_visible(0), false, "Back button is visible for primary page."); layout.addPageToCurrentColumn(rootPage, leftPage); // A:2, B:0 compare(get_back_button_visible(0), true, "Adding page 2 to column A does not show back button."); layout.removePages(leftPage); // A:1, B:0 compare(get_back_button_visible(0), false, "Removing page 2 from column A does not hide back button."); //// repeat the test for PageHeader //// layout.addPageToCurrentColumn(rootPage, pageWithHeader); compare(get_back_button_visible(0), true, "Adding page with header to column A does not show back button."); layout.removePages(pageWithHeader); compare(get_back_button_visible(0), false, "Removing page with header from column A does not hide back button."); //// done //// //// first test right column for PageHeader //// layout.addPageToNextColumn(rootPage, pageWithHeader); compare(get_back_button_visible(0), false, "Adding page with header to column B shows back button in column A."); compare(get_back_button_visible(1), false, "Adding page with header to column B shows back button in column B."); layout.removePages(pageWithHeader); layout.addPageToNextColumn(rootPage, rightPage); layout.addPageToNextColumn(rightPage, pageWithHeader); compare(get_back_button_visible(0), false, "Adding second page (with header) to column B shows back button in column A."); compare(get_back_button_visible(1), true, "Adding second page (with header) to column B hides back button in column B."); layout.removePages(pageWithHeader); //// done //// layout.addPageToNextColumn(rootPage, rightPage); // A:1, B:1 compare(get_back_button_visible(0), false, "Adding page 1 to column B shows back button in column A."); compare(get_back_button_visible(1), false, "Adding page 1 to column B shows back button in column B."); layout.addPageToCurrentColumn(rootPage, leftPage); // A:2, B:0 compare(get_back_button_visible(0), true, "Adding page 2 to column A not show back button when column B has a page."); layout.removePages(leftPage); // A:1, B:0 layout.addPageToNextColumn(rootPage, rightPage); layout.addPageToCurrentColumn(rightPage, sectionsPage); // A:1, B:2 compare(get_back_button_visible(0), false, "Adding page 2 to column B shows back button in column A."); compare(get_back_button_visible(1), true, "Adding page 2 to column B does not show back button in column B."); layout.addPageToCurrentColumn(rootPage, leftPage); // A:2, B:0 layout.addPageToNextColumn(leftPage, rightPage); layout.addPageToCurrentColumn(rightPage, sectionsPage); compare(get_back_button_visible(0), true, "Adding page 2 to column A does not show back button in column A when column B has 2 pages."); compare(get_back_button_visible(1), true, "Adding page 2 to column A hides back button in column B."); layout.removePages(sectionsPage); // A:2, B:1 compare(get_back_button_visible(0), true, "Removing page 2 from column B hides back button in column A."); compare(get_back_button_visible(1), false, "Removing page 2 from column B does not hide back button when column A has 2 pages."); } function test_back_button_narrow() { if (root.columns !== 1) { resize_single_column_width(); } compare(get_back_button_visible(0), false, "Back button is visible for primary page."); layout.addPageToCurrentColumn(rootPage, leftPage); compare(get_back_button_visible(0), true, "No back button visible with two pages in single column."); layout.removePages(leftPage); compare(get_back_button_visible(0), false, "Back button remains visible after removing second page from column."); layout.addPageToNextColumn(rootPage, rightPage); compare(get_back_button_visible(0), true, "No back button visible after pushing to next column when viewing single column."); layout.removePages(rightPage); compare(get_back_button_visible(0), false, "Back button remains visible after removing page from following column."); } function test_head_contents_visible_bug1488922() { layout.addPageToCurrentColumn(rootPage, headContentsPage); // The bug occurred when the style for the subheader was unset // after a short delay, so wait before testing Page.head.contents.parent. wait(100); compare(headRectangle.visible, true, "Head contents not visible in current column."); compare(headRectangle.parent == null, false, "Head contents has no parent in current column."); layout.removePages(headContentsPage); layout.addPageToNextColumn(rootPage, headContentsPage); wait(100); compare(headRectangle.visible, true, "Head contents not visible in next column."); compare(headRectangle.parent == null, false, "Head contents has no parent in next column."); layout.removePages(headContentsPage); } function test_page_header_disables_apl_subheader() { layout.addPageToCurrentColumn(rootPage, pageWithHeader); var subHeader = get_subheader(0); compare(subHeader.visible, false, "Adding a Page with header does not hide the column's subHeader."); layout.addPageToCurrentColumn(pageWithHeader, sectionsPage); subHeader = get_subheader(0); compare(subHeader.visible, true, "Adding a Page without header does not reveal the column's subHeader."); layout.removePages(sectionsPage); subHeader = get_subheader(0); compare(subHeader.visible, false, "Going back to Page with header does not hide the column's subHeader."); if (root.columns > 1) { layout.addPageToNextColumn(pageWithHeader, sectionsPage); subHeader = get_subheader(0); compare(subHeader.visible, false, "Adding Page without header to next column shows subHeader in first column."); subHeader = get_subheader(1); compare(subHeader.visible, true, "Adding Page without header to next column does not show subHeader in next column"); } } } } ./tests/unit_x11/tst_components/tst_dialer.qml0000644000015600001650000001311012700370701021624 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Pickers 1.0 Item { id: root width: 200 height: 200 Dialer { id: noHands } Dialer { id: oneHand DialerHand { id: hand } } Dialer { DialerHand { id: overlayHand Label { id: overlayItem text: overlayHand.value } } } SignalSpy { id: spy } TestCase { id: testCase name: "DialerAPI" when: windowShown function test_0_Dialer_minimumValue() { compare(noHands.minimumValue, 0.0, "noHands.minimumValue"); compare(oneHand.minimumValue, 0.0, "oneHand.minimumValue"); } function test_0_Dialer_maximumValue() { compare(noHands.maximumValue, 360.0, "noHands.maximumValue"); compare(oneHand.maximumValue, 360.0, "oneHand.maximumValue"); } function test_0_Dialer_size() { compare(noHands.size, units.gu(32), "noHands.size"); compare(oneHand.size, units.gu(32), "oneHand.size"); } function test_0_Dialer_handSpace() { compare(noHands.handSpace, units.gu(6.5), "noHands.handSpace"); compare(oneHand.handSpace, units.gu(6.5), "oneHand.handSpace"); } function test_0_Dialer_centerItem() { verify(noHands.centerItem !== undefined, "noHands.centerItem"); verify(oneHand.centerItem !== undefined, "oneHand.centerItem"); } function test_0_Dialer_centerContent() { verify(noHands.centerContent !== undefined, "noHands.centerContent"); verify(oneHand.centerContent !== undefined, "oneHand.centerContent"); } function test_0_Dialer_hands() { verify(noHands.hands !== undefined, "hoHands.hands is defined"); compare(noHands.hands.length, 0, "noHands.hands.length"); compare(oneHand.hands.length, 1, "noHands.hands.length"); compare(oneHand.hands[0], hand, "noHands.hands[0] == hand"); } function test_0_DialerHand_value() { compare(hand.value, 0.0, "hand.value"); } function test_0_DialerHand_hand_height() { verify(hand.hand.height !== 0.0, "hand.hand.height"); } function test_0_DialerHand_hand_width() { verify(hand.hand.width !== 0.0, "hand.hand.width"); } function test_0_DialerHand_hand_draggable() { compare(hand.hand.draggable, true, "hand.hand.draggable"); } function test_0_DialerHand_hand_visible() { compare(hand.hand.visible, true, "hand.hand.visible"); } function test_0_DialerHand_hand_toCenterItem() { compare(hand.hand.toCenterItem, false, "hand.hand.toCenterItem"); } function test_0_DialerHand_index() { compare(hand.index, 0, "hand.index"); } function test_0_DialerHand_dialer() { compare(hand.dialer, oneHand, "hand.dialer"); } function test_0_DialerHand_overlay() { verify(hand.overlay !== undefined, "hand.overlay"); } function test_DialerHand_valueChange() { spy.clear(); spy.signalName = "onHandUpdated"; spy.target = oneHand; hand.value = 100; compare(hand.value, 100, "hand.value changed"); tryCompare(spy, "count", 1); } function test_DialerHand_hand_toCenterItem_Change() { hand.hand.toCenterItem = true; compare(hand.hand.toCenterItem, true, "hand.hand.toCenterItem changed"); } function test_DialerHand_hand_draggable_Change() { hand.hand.draggable = false; compare(hand.hand.draggable, false, "hand.hand.draggable changed"); } function test_DialerHand_handSizeChange() { var prevHeight = hand.hand.height; hand.hand.height = units.gu(10); verify(hand.hand.height !== prevHeight, "hand.hand.height"); compare(hand.hand.height, units.gu(10), "hand.hand.height changed"); var prevWidth = hand.hand.width; hand.hand.width = units.gu(10); verify(hand.hand.width !== prevWidth, "hand.hand.width"); compare(hand.hand.width, units.gu(10), "hand.hand.width changed"); } function test_OverlayHand_visible() { overlayHand.hand.visible = false; compare(overlayItem.visible, true, "overLayItem.visible"); } function test_OverlayHand_rotation() { overlayHand.value = 50; compare(overlayItem.rotation, 0.0, "overLayItem.rotation"); } function test_OverlayHand_valueChange() { overlayHand.value = 70; compare(overlayItem.text, "70", "overLayItem.text"); } } } ./tests/unit_x11/tst_components/tst_listitem_selectmode.qml0000644000015600001650000001262612700370701024435 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 import QtTest 1.0 import Ubuntu.Test 1.0 MainView { applicationName: "testapp.nik90" width: units.gu(100) height: units.gu(75) Page { title: i18n.tr("ListView Bug") UbuntuListView { id: listView ListModel { id: instructionModel ListElement { text: "Let's try to reproduce this listview bug ;)" } ListElement { text: "Step 1: Long press to active multiselect mode" } ListElement { text: "Step 2: Press on any checkbox to select that listitem" } ListElement { text: "Step 3: Now press on the list item of the checkbox you chose in the previous step." } ListElement { text: "Notice how it doesn't select/unselect it despite pressing it" } ListElement { text: "Also notice how when pressing on the listitem in step 3, the selected indice still changes!" } } anchors { fill: parent bottomMargin: parent.height / 2 } clip: true model: instructionModel delegate: ListItem { objectName: "listItem" + index height: units.gu(8) contentItem.anchors { leftMargin: units.gu(2); rightMargin: units.gu(2) } Label { id: label text: modelData anchors.fill: parent wrapMode: Text.WordWrap verticalAlignment: Text.AlignVCenter } onPressAndHold: { ListView.view.ViewItems.selectMode = !ListView.view.ViewItems.selectMode } onClicked: { if (selectMode) { selected = !selected } } } footer: Label { anchors { left: parent.left; leftMargin: units.gu(2) } width: parent.width text: "Selected Indices: " + listView.ViewItems.selectedIndices } } UbuntuListView { id: testView anchors { fill: parent topMargin: parent.height / 2 bottomMargin: notInView.height } clip: true } // for bug1514928 ListItem { id: notInView selected: true } } Component { id: selectModePreset ListItem { id: litem objectName: "listItem" + index selectMode: true property SignalSpy selectedChangedSpy: SignalSpy { target: litem signalName: "selectedChanged" } } } ListItemTestCase { name: "ListItem.selectMode" when: windowShown function cleanup() { listView.ViewItems.selectMode = false; testView.model = null; testView.delegate = null; wait(200); } function test_select_toggle_breaks_property_binding_bug1469471() { listView.ViewItems.selectMode = true; wait(400); // select through checkbox var listItem = findChild(listView, "listItem0"); verify(listItem); var panel = findChild(listItem, "selection_panel0"); verify(panel); var checkBox = findChild(panel, "listitem_select"); verify(checkBox); // check the box mouseClick(checkBox, 0, 0); compare(checkBox.checked, true); // now toggle selected listItem.selected = !listItem.selected; compare(checkBox.checked, false); } function test_select_mode_set_in_listview_delegate_bug1493882() { testView.delegate = selectModePreset; testView.model = 10; waitForRendering(testView, 500); var item = findChild(testView, "listItem0"); verify(item); var selectPanel = findChild(item, "selection_panel0"); verify(selectPanel, "selection panel not found"); } function test_toggle_selected_triggers_one_selectedChanged_bug1493880() { testView.delegate = selectModePreset; testView.model = 10; waitForRendering(testView, 500); var item0 = findChild(testView, "listItem0"); var item1 = findChild(testView, "listItem1"); verify(item0 && item1); // select #0 item0.selected = true; item0.selectedChangedSpy.wait(); compare(item1.selectedChangedSpy.count, 0, "Only the selected item should emit the change signal!"); } } } ./tests/unit_x11/tst_components/tst_pagehead_visible.qml0000644000015600001650000003252212700370701023647 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Test 1.0 Item { width: units.gu(50) height: units.gu(70) MainView { id: mainView width: units.gu(50) height: units.gu(70) PageStack { id: stack Component.onCompleted: stack.push(page) Page { id: page title: "Auto-hide" head { actions: Action { iconName: "like" text: "Like" } } Flickable { id: flickable anchors.fill: parent contentHeight: units.gu(200) Rectangle { color: "green" opacity: 0.3 anchors { left: parent.left right: parent.right top: parent.top } height: units.gu(2) } Grid { id: switchGrid columns: 2 spacing: units.gu(1) anchors { top: parent.top left: parent.left leftMargin: units.gu(5) topMargin: units.gu(15) } Switch { id: lockedSwitch checked: page.head.locked function trigger() { page.head.locked = !page.head.locked; print("set page.head.locked to "+page.head.locked) } } Label { text: "header locked" } Switch { id: visibleSwitch checked: page.head.visible function trigger() { page.head.visible = !page.head.visible; print("set page.head.visible to "+page.head.visible) } } Label { text: "header visible" } } Button { anchors { horizontalCenter: parent.horizontalCenter top: switchGrid.bottom topMargin: units.gu(5) } text: "Push page" onTriggered: stack.push(noHeaderPage) } } } Page { id: noHeaderPage visible: false title: "No header visible." head { visible: false locked: true } Column { anchors.centerIn: parent spacing: units.gu(1) Label { text: "Page with no header." } Button { text: "Back" onClicked: stack.pop() } Button { text: "Next" onClicked: stack.push(otherPage) } } } Page { id: otherPage title: "On stack" visible: false Label { anchors.centerIn: parent text: "Stacked" } } Page { id: titleLessPage visible: false } } } UbuntuTestCase { name: "HeaderLockedVisible" when: windowShown id: testCase property var header function initTestCase() { testCase.header = findChild(mainView, "MainView_Header"); } function init() { page.head.visible = true; page.head.locked = false; otherPage.head.visible = true; otherPage.head.locked = false; wait_for_visible(true, "Header is not visible initially."); compare(stack.currentPage, page, "Wrong Page on PageStack initially."); compare(page.head.locked, false, "Header is not locked initially."); } function scroll(dy) { var p = centerOf(mainView); // Use mouseWheel to scroll because mouseDrag is very unreliable // and does not properly handle negative values for dy. mouseWheel(mainView, p.x, p.y, 0, 2*dy); } function scroll_down() { scroll(-header.height); } function scroll_up() { scroll(header.height); } function wait_for_visible(visible, errorMessage) { waitForHeaderAnimation(mainView); compare(stack.currentPage.head.visible, visible, errorMessage); var mismatchMessage = " Page.head.visible does not match header visibility."; if (visible) { compare(header.y, 0, errorMessage + mismatchMessage); } else { compare(header.y, -header.height, errorMessage + mismatchMessage); } } function test_set_visible_to_hide_and_show() { // FIXME: Don't skip the test on i386/ amd64, bug #1541385 if(TestExtras.cpuArchitecture() != "arm") skip("This test is flaky on non-arm right now."); page.head.visible = false; wait_for_visible(false, "Cannot hide unlocked header by setting visible to false."); page.head.visible = true; wait_for_visible(true, "Cannot show unlocked header by setting visible to true."); page.head.locked = true; page.head.visible = false; wait_for_visible(false, "Cannot hide locked header by setting visible to false."); page.head.visible = true; wait_for_visible(true, "Cannot show locked header by setting visible to true."); } function test_scroll_when_unlocked_updates_visible() { // FIXME: Don't skip the test on i386/ amd64, bug #1541385 if(TestExtras.cpuArchitecture() != "arm") skip("This test is flaky on non-arm right now."); scroll_down(); wait_for_visible(false, "Scrolling down does not hide header."); scroll_up(); wait_for_visible(true, "Scrolling up does not show header."); } function test_scroll_when_locked_does_not_update_visible() { // FIXME: Don't skip the test on i386/ amd64, bug #1541385 if(TestExtras.cpuArchitecture() != "arm") skip("This test is flaky on non-arm right now."); // Note that with a locked header, scrolling up and down does not // cause the header to move, so the wait_for_visible() calls below // will return almost instantly. page.head.locked = true; scroll_down(); wait_for_visible(true, "Scrolling down hides locked header."); scroll_up(); wait_for_visible(true, "Scrolling up hides locked header."); page.head.visible = false; waitForHeaderAnimation(mainView); scroll_down(); wait_for_visible(false, "Scrolling down shows locked header."); scroll_up(); wait_for_visible(false, "Scrolling up shows locked header."); } function test_locking_updates_visible() { // locked = false, visible = true. page.head.locked = true; wait_for_visible(true, "Locking hides header."); page.head.locked = false; wait_for_visible(true, "Unlocking hides header."); page.head.locked = true; page.head.visible = false; waitForHeaderAnimation(mainView); // When the flickable is scrolled to the top, unlocking the header must show // the header because you cannot scroll more up to reveal it: page.head.locked = false; wait_for_visible(true, "Unlocking header when flickable is at Y beginning "+ "does not show header."); scroll_down(); wait_for_visible(false, "Scrolling down does not hide header."); page.head.locked = true; wait_for_visible(false, "Locking shows header."); // When flickable is scrolled down, unlocking header does not show header // because the user can scroll up to reveal it: page.head.locked = false; wait_for_visible(false, "Unlocking shows header when flickable is not at " + "Y beginning."); } function test_activate_page_shows_header() { page.head.visible = false; waitForHeaderAnimation(mainView); // Header becomes visible when new Page becomes active: stack.push(otherPage); wait_for_visible(true, "Pushing page on stack does not show header."); // Header becomes visible when Page with previously hidden header // becomes active: stack.pop(); wait_for_visible(true, "Activating unlocked Page does not make header visible."); } function test_activate_hides_locked_hidden_header() { otherPage.head.locked = true; otherPage.head.visible = false; stack.push(otherPage); wait_for_visible(false, "Pushing Page with locked hidden header shows header."); compare(otherPage.head.locked, true, "Pushing Page unlocks header."); compare(page.head.locked, false, "Pushing Page locks previous header."); stack.pop(); wait_for_visible(true, "Popping to a Page with unlocked header does not show header."); compare(otherPage.head.locked, true, "Popping Page unlocks previous header."); compare(page.head.locked, false, "Popping Page locks header."); } function test_hidden_locked_header_stays_hidden() { page.head.locked = true; page.head.visible = false; waitForHeaderAnimation(mainView); stack.push(otherPage); waitForHeaderAnimation(mainView); stack.pop(); wait_for_visible(false, "Popping to a Page with locked hidden header shows header."); } function test_page_with_no_title_on_pagestack_has_back_button_bug1402054() { page.head.visible = false; waitForHeaderAnimation(mainView); stack.push(titleLessPage); wait_for_visible(true, "Page with no title hides the header."); var backButton = findChild(testCase.header, "backButton"); verify(null !== backButton, "Header has no back button."); compare(backButton.visible, true, "Page with no title hides the back button."); var center = centerOf(backButton); mouseClick(backButton, center.x, center.y); waitForHeaderAnimation(mainView); compare(stack.depth, 1, "Clicking back button of page with no title does not "+ "pop the page from the PageStack."); } function test_disable_buttons_when_animating_header_bug1478147() { stack.push(noHeaderPage); stack.push(otherPage); waitForHeaderAnimation(mainView); var backButton = findChild(testCase.header, "backButton"); var center = centerOf(backButton); mouseMove(backButton, center.x, center.y); // Click the back button to pop the stack and go back to // noHeaderPage. This hides the header: mouseClick(backButton, center.x, center.y); // Second click, which does not generate an event because animating // of the header must disable its buttons: mouseClick(backButton, center.x, center.y); waitForHeaderAnimation(mainView); // Compare the titles instead of the pages directly to avoid getting // a "Maximum call stack size exceeded." exception. compare(stack.currentPage.title, noHeaderPage.title, "Back button in animating header was clicked."); stack.pop(); // noHeaderPage waitForHeaderAnimation(mainView); } } } ./tests/unit_x11/tst_components/tst_pagehead_with_listview_header.qml0000644000015600001650000000537312700370701026427 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 Item { width: units.gu(50) height: units.gu(80) id: root property real listViewHeaderHeight: units.gu(5) MainView { id: mainViewHeader anchors.fill: parent Page { id: page title: "listview" ListView { anchors.fill: parent id: listView header: Rectangle { color: "red" width: parent.width height: root.listViewHeaderHeight } model: 500 delegate: Label { text: "number " +index } } } Item { // Wrapping the Page inside this Item should not // affect the header alignment, see bug #1261907. anchors.fill: parent id: wrappingItem Page { id: wrappedPage title: "listview" ListView { anchors.fill: parent id: wrappedListView header: Rectangle { color: "red" width: parent.width height: root.listViewHeaderHeight } model: 500 delegate: Label { text: "number " +index } } } } } TestCase { name: "HeaderAlignment" when: windowShown function test_ListViewHeaderAlignment_bug1202277() { compare(listView.contentY, -root.listViewHeaderHeight - mainViewHeader.__propagated.header.height, "ListView header is aligned with the MainView header"); } function test_WrappedListViewHeaderAlignment_bug1261907() { compare(wrappedListView.contentY, -root.listViewHeaderHeight - mainViewHeader.__propagated.header.height, "ListView header inside wrapped Page is aligned with the MainView header"); } } } ./tests/unit_x11/tst_components/tst_tabs_with_repeater.DEPRECATED_TOOLBAR.qml0000644000015600001650000002054212700370701027027 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.1 import Ubuntu.Test 1.0 MainView { id: testCase width: units.gu(50) height: units.gu(100) useDeprecatedToolbar: true ListModel { id: inputModel Component.onCompleted: { append({ "name": "tab 1" }); insert(0, { "name": "tab 0" }); append({ "name": "tab 3" }); insert(2, { "name": "tab 2" }); } } Tabs { id: tabsWithRepeater Repeater { objectName: "tabsRepeater" id: tabsRepeater model: inputModel Tab { title: name } } } Tabs { id: repeaterTabs Repeater { objectName: "repeater" id: repeater Tab { title: modelData } } } Tabs { id: twoRepeaters Repeater { objectName: "firstRepeater" id: firstRepeater model: inputModel Tab { title: name } } Repeater { objectName: "secondRepeater" id: secondRepeater model: testCase.listModel Tab { title: modelData } } } property var listModel: ["tab #0", "tab #1", "tab #2", "tab #3"]; Tabs { id: twinRepeaters ListModel { id: twinModel Component.onCompleted: { append({ "name": "twintab 1" }); insert(0, { "name": "twintab 0" }); append({ "name": "twintab 3" }); insert(2, { "name": "twintab 2" }); } } Repeater { objectName: "tabsRepeater" id: twinRepeater1 model: twinModel Tab { title: name } } Repeater { objectName: "tabsRepeater" id: twinRepeater2 model: twinModel Tab { title: name } } } UbuntuTestCase { name: "TabsWithRepeaterDeprecatedToolbar" when: windowShown /* The following testcases are all related to bug #1253804 */ function test_tabOrder_bug1253804() { // FIXME bug #1541386 if(TestExtras.openGLflavor() == "opengles2" && (TestExtras.cpuArchitecture() == "i386" || TestExtras.cpuArchitecture() == "x86_64") ) skip("This test fails on x86_64 and i386 with GLES."); var tabsModel = tabsWithRepeater.__model; compare(tabsRepeater.count, inputModel.count, "Incorrect number of tabs in Tabs"); compare(tabsModel.count, tabsRepeater.count, "Incorrect number of tabs in TabBar"); for (var i=0; i < tabsModel.count; i++) { compare(tabsModel.get(i).title, inputModel.get(i).name, "Tab titles don't match for index "+i); } //shufle inputModel.move(1, 2, 1); inputModel.move(3, 0, 1); inputModel.move(1, 3, 1); // wait few miliseconds wait(50); for (i=0; i < tabsModel.count; i++) { compare(tabsModel.get(i).title, inputModel.get(i).name, "Tab titles after shuffling don't match for index "+i); } // set it to null tabsRepeater.model = null; compare(tabsWithRepeater.__model.count, 0, "There are still tabs left after repeater model is reset"); } function test_repeaterTabs() { repeater.model = inputModel; var tabsModel = repeaterTabs.__model; compare(repeater.count, inputModel.count, "Incorrect number of tabs in Tabs"); compare(tabsModel.count, repeater.count, "Incorrect number of tabs in TabBar"); for (var i=0; i < tabsModel.count; i++) { compare(tabsModel.get(i).title, inputModel.get(i).name, "Tab titles don't match for index "+i); } // clear repeaterTabs repeater.model = null; compare(repeaterTabs.__model.count, 0, "There are still tabs left after repeater model is reset"); } function test_repeaterTabs_arrayAsModel() { repeater.model = testCase.listModel; var tabsModel = repeaterTabs.__model; compare(repeater.count, testCase.listModel.length, "Incorrect number of tabs in Tabs"); compare(tabsModel.count, repeater.count, "Incorrect number of tabs in TabBar"); for (var i=0; i < tabsModel.count; i++) { compare(tabsModel.get(i).title, testCase.listModel[i], "Tab titles don't match for index "+i); } // shuffling elements in an array is not detectable in Repeater var x = testCase.listModel[1]; testCase.listModel[1] = testCase.listModel[0]; testCase.listModel[0] = x; expectFailContinue("", "Array changes are not detected by repeaters"); compare(tabsModel.get(0).title, testCase.listModel[0], "Tab titles don't match for index 0"); expectFailContinue("", "Array changes are not detected by repeaters"); compare(tabsModel.get(1).title, testCase.listModel[1], "Tab titles don't match for index 0"); // clear repeaterTabs repeater.model = null; compare(repeaterTabs.__model.count, 0, "There are still tabs left after repeater model is reset"); } function test_twoRepeaters() { var tabsModel = twoRepeaters.__model; var secondRepeaterModel = secondRepeater.model; compare(tabsModel.count, firstRepeater.count + secondRepeater.count, "Incorrect number of tabs in TabBar"); for (var i = 0; i < firstRepeater.count; i++) { compare(tabsModel.get(i).title, inputModel.get(i).name, "Tab titles don't match for index "+i); } for (i = firstRepeater.count; i < firstRepeater.count + secondRepeater.count; i++) { compare(tabsModel.get(i).title, secondRepeaterModel[i - firstRepeater.count], "Tab titles don't match for index "+i); } } function test_twinRepeaters() { var tabsModel = twinRepeaters.__model; compare(twinRepeater1.count, twinModel.count, "Incorrect number of tabs in the first repeater"); compare(twinRepeater2.count, twinModel.count, "Incorrect number of tabs in the second repeater"); compare(tabsModel.count, twinRepeater1.count + twinRepeater2.count, "Incorrect number of tabs in TabBar"); for (var j = 0; j < 2; j++) { for (var i = 0; i < twinModel.count; i++) { var index = j * twinModel.count + i; compare(tabsModel.get(index).title, twinModel.get(i).name, "Tab titles don't match for Tabs index " + index); } } //shuffle twinModel.move(1, 2, 1); twinModel.move(3, 0, 1); twinModel.move(1, 3, 1); // wait few miliseconds till Tabs update is realized wait(50); /* FIXME for (var j = 0; j < 2; j++) { for (var i = 0; i < twinModel.count; i++) { var index = j * twinModel.count + i; compare(tabsModel.get(index).title, twinModel.get(i).name, "Tab titles don't match for Tabs index " + index); } } */ // set it to null twinRepeater1.model = null; twinRepeater2.model = null; compare(twinRepeaters.__model.count, 0, "There are still tabs left after repeater model is reset"); } } } ./tests/unit_x11/tst_components/tst_listitem13.qml0000644000015600001650000015471112700370714022403 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.3 import Ubuntu.Components 1.3 import Ubuntu.Components.Styles 1.3 import QtQml.Models 2.1 Item { id: main width: units.gu(50) height: units.gu(100) Action { id: stockAction iconName: "torch-on" objectName: "stockAction" text: 'Switch lights on' } ListItemActions { id: leading actions: [ Action { iconName: "starred" text: 'Bookmark' objectName: "leading_1" }, Action { iconName: "edit" text: 'Edit' objectName: "leading_2" onTriggered: text = 'Edit Again' }, Action { iconName: "camcorder" text: 'Record' objectName: "leading_3" } ] } ListItemActions { id: trailing actions: [ stockAction, ] } ListItemActions { id: actionsDefault } ListModel { id: objectModel function reset() { clear(); for (var i = 0; i < 25; i++) { append({data: i}); } } Component.onCompleted: reset() } Component { id: customDelegate Rectangle { width: units.gu(10) color: "green" objectName: "custom_delegate" } } Column { id: testColumn width: parent.width ListItem { id: defaults width: parent.width } ListItem { id: highlightTest } ListItem { id: clickedConnected onClicked: {} onPressAndHold: {} } ListItem { id: testItem width: parent.width color: "blue" leadingActions: leading trailingActions: trailing Label { id: bodyItem anchors.fill: parent text: "Data" } } ListItem { id: controlItem Button { id: button objectName: "button_in_list" anchors.centerIn: parent text: "Button" } } ListView { id: listView width: parent.width height: units.gu(28) clip: true model: objectModel ViewItems.selectMode: false LayoutMirroring.childrenInherit: true delegate: ListItem { objectName: "listItem" + index color: "lightgray" leadingActions: leading trailingActions: trailing Label { text: "Data: " + modelData + " @" + index } } } Flickable { id: testFlickable width: parent.width height: units.gu(21) ListView { id: nestedListView width: parent.width height: units.gu(28) clip: true model: 10 delegate: ListItem { objectName: "listItem" + index leadingActions: leading } } } Flickable { id: flickable width: parent.width height: units.gu(14) clip: true contentHeight: column.height Column { id: column width: parent.width Repeater { model: 10 ListItem { objectName: "listItem" + index color: "lightgreen" } } } } } ListItemTestCase13 { id: testCase name: "ListItem13API" when: windowShown SignalSpy { id: movingSpy signalName: "contentMovementEnded" } SignalSpy { id: highlightedSpy signalName: "highlightedChanged" target: testItem } SignalSpy { id: clickSpy signalName: "clicked" target: testItem; } SignalSpy { id: actionSpy signalName: "onTriggered" } SignalSpy { id: flickableSpy signalName: "movementStarted" } SignalSpy { id: dropSpy signalName: "stopped" } function initTestCase() { TestExtras.registerTouchDevice(); waitForRendering(main); } function cleanup() { listView.model = objectModel; testItem.action = null; testItem.contentItem.anchors.margins = 0; testItem.selected = false; testColumn.ViewItems.selectMode = false; waitForRendering(testItem.contentItem, 200); controlItem.selected = false; waitForRendering(controlItem.contentItem, 200); movingSpy.clear(); highlightedSpy.clear(); clickSpy.clear(); actionSpy.clear(); pressAndHoldSpy.clear(); buttonSpy.clear(); flickableSpy.clear(); listView.interactive = true; listView.ViewItems.selectMode = false; listView.ViewItems.dragMode = false; // make sure we collapse mouseClick(defaults, 0, 0) movingSpy.target = null; movingSpy.clear(); flickableSpy.target = null; flickableSpy.clear(); trailing.delegate = null; listView.positionViewAtBeginning(); // keep additional timeout for proper cleanup wait(200); } function test_0_defaults() { verify(defaults.contentItem !== null, "Defaults is null"); compare(defaults.color, "#000000", "Transparent by default"); compare(defaults.highlightColor, theme.palette.selected.background, "theme.palette.selected.background color by default") compare(defaults.highlighted, false, "Not highlighted by default"); compare(defaults.divider.visible, true, "divider is visible by default"); compare(defaults.divider.anchors.leftMargin, 0, "divider's left margin is 0"); compare(defaults.divider.anchors.rightMargin, 0, "divider's right margin is 0"); var mappedDividerPos = defaults.mapFromItem(defaults.divider, defaults.divider.x, defaults.divider.y); compare(mappedDividerPos.x, 0, "divider's left anchor is wrong"); compare(mappedDividerPos.x + defaults.divider.width, defaults.width, "divider's right anchor is wrong"); compare(defaults.divider.height, units.dp(1), "divider's thickness is wrong"); compare(defaults.divider.colorFrom, theme.palette.normal.base, "colorFrom differs."); compare(defaults.divider.colorTo, theme.palette.normal.base, "colorTo differs."); compare(defaults.action, null, "No action by default."); compare(defaults.style, null, "Style is loaded upon first use."); compare(defaults.__styleInstance, null, "__styleInstance must be null."); compare(defaults.selected, false, "Not selected by default"); compare(defaults.selectMode, false, "Not selectable by default"); compare(testColumn.ViewItems.selectMode, false, "The parent attached property is not selectable by default"); compare(testColumn.ViewItems.selectedIndices.length, 0, "No item is selected by default"); compare(listView.ViewItems.dragMode, false, "Drag mode is off on ListView"); compare(actionsDefault.delegate, null, "ListItemActions has no delegate set by default."); compare(actionsDefault.actions.length, 0, "ListItemActions has no actions set."); } Component { id: customStyle; ListItemStyle {} } function test_children_in_content_item() { compare(bodyItem.parent, testItem.contentItem, "Content is not in the right holder!"); } function test_highlightedChanged_on_click() { highlightedSpy.target = testItem; mousePress(testItem, testItem.width / 2, testItem.height / 2); highlightedSpy.wait(); mouseRelease(testItem, testItem.width / 2, testItem.height / 2); } function test_highlightedChanged_on_tap() { highlightedSpy.target = testItem; TestExtras.touchPress(0, testItem, centerOf(testItem)); highlightedSpy.wait(); TestExtras.touchRelease(0, testItem, centerOf(testItem)); // local cleanup, wait few msecs to suppress double tap wait(400); } function test_clicked_on_mouse() { clickSpy.target = testItem; mouseClick(testItem, testItem.width / 2, testItem.height / 2); clickSpy.wait(); } function test_clicked_on_tap() { clickSpy.target = testItem; TestExtras.touchClick(0, testItem, centerOf(testItem)); clickSpy.wait(); } SignalSpy { id: visibleSpy signalName: "visibleChanged" } function test_context_menu() { mouseClick(testItem, testItem.width / 2, testItem.height / 2, Qt.RightButton); wait(1000); compare(testItem.highlighted, true, "List item didn't highlight on right-click"); var context_menu = findChild(main, "listItemContextMenu"); verify(context_menu, "Context menu didn't open on right-click"); waitForRendering(context_menu); var edit = findChildWithProperty(context_menu, "text", "Edit"); verify(edit, "Context menu has no 'Edit' item"); visibleSpy.target = context_menu; mouseClick(edit, edit.width / 2, edit.height / 2); compare(edit.text, 'Edit Again', "Item wasn't triggered'"); visibleSpy.wait() } function test_no_click_when_swiped() { var item = findChild(listView, "listItem0"); clickSpy.target = item; clickSpy.clear(); swipe(item, centerOf(item).x, centerOf(item).y, units.gu(20), 0); // click over the contentItem movingSpy.target = item; mouseClick(item.contentItem, 1, 1); compare(clickSpy.count, 0, "No click() should be emitted on a swiped in ListItem."); movingSpy.wait(); } function test_no_pressAndHold_when_swiped() { var item = findChild(listView, "listItem0"); pressAndHoldSpy.target = item; pressAndHoldSpy.clear(); swipe(item, centerOf(item).x, centerOf(item).y, units.gu(20), 0); // press and hold movingSpy.target = item; mouseLongPress(item.contentItem, 1, 1); mouseRelease(item.contentItem, 1, 1); mouseRelease(item.contentItem, 1, 1); compare(pressAndHoldSpy.count, 0, "No pressAndHold() should be emitted on a swiped in ListItem."); movingSpy.wait(); } function test_release_outside() { var listItem = defaults; clickSpy.target = listItem; clickSpy.clear(); highlightedSpy.target = listItem; highlightedSpy.clear(); mousePress(listItem, listItem.width / 2, listItem.height / 2); highlightedSpy.wait(); mouseMove(listView, 0, 0, 100); mouseRelease(listView, 0, 0); highlightedSpy.wait(); compare(clickSpy.count, 0, "Click must be suppressed when releasing outside of item"); } function test_vertical_listview_move_cancels_highlight_data() { return [ {tag: "With touch", mouse: false}, {tag: "With mouse", mouse: true}, ]; } function test_vertical_listview_move_cancels_highlight(data) { var listItem = findChild(listView, "listItem0"); verify(listItem, "Cannot find listItem0"); clickSpy.target = listItem; clickSpy.clear(); highlightedSpy.target = listItem; highlightedSpy.clear(); // convert positions and use the listView to move var pos = listView.mapFromItem(listItem, listItem.width / 2, 0); if (data.mouse) { // provide slow move mousePress(listView, pos.x, pos.y); highlightedSpy.wait(); for (var i = 1; i < 4; i++) { pos.y += i * units.gu(0.5); mouseMove(listView, pos.x, pos.y, 100); } compare(listItem.highlighted, false, "highlighted still!"); mouseRelease(listView, pos.x, pos.y, undefined, undefined, 100); } else { // convert pos to point otherwise touch functions will get (0,0) points!!! var pt = Qt.point(pos.x, pos.y); TestExtras.touchPress(0, listView, pt); highlightedSpy.wait(); for (i = 1; i < 4; i++) { pt.y += i * units.gu(0.5); TestExtras.touchMove(0, listView, pt); wait(100); } compare(listItem.highlighted, false, "highlighted still!"); TestExtras.touchRelease(0, listView, pt); } compare(clickSpy.count, 0, "Click must be suppressed when releasing outside of item"); } function test_background_height_change_on_divider_visible() { // make sure the testItem's divider is shown testItem.divider.visible = true; var margins = testItem.contentItem.anchors.topMargin + testItem.contentItem.anchors.bottomMargin; compare(testItem.contentItem.height, testItem.height - margins - testItem.divider.height, "ListItem's background height must be less than the item itself."); testItem.divider.visible = false; waitForRendering(testItem.contentItem); compare(testItem.contentItem.height, testItem.height - margins, "ListItem's background height must be the same as the item itself."); testItem.divider.visible = true; } function test_tug_actions_data() { var item = findChild(listView, "listItem0"); return [ {tag: "Trailing, mouse", item: item, pos: centerOf(item), dx: -units.gu(20), positiveDirection: false, mouse: true}, {tag: "Leading, mouse", item: item, pos: centerOf(item), dx: units.gu(20), positiveDirection: true, mouse: true}, {tag: "Trailing, touch", item: item, pos: centerOf(item), dx: -units.gu(20), positiveDirection: false, mouse: false}, {tag: "Leading, touch", item: item, pos: centerOf(item), dx: units.gu(20), positiveDirection: true, mouse: false}, ]; } function test_tug_actions(data) { listView.positionViewAtBeginning(); if (data.mouse) { swipe(data.item, data.pos.x, data.pos.y, data.dx, 0); } else { tug(data.item, data.pos.x, data.pos.y, data.dx, 0); } if (data.positiveDirection) { verify(data.item.contentItem.x > 0, data.tag + " actions did not show up"); } else { verify(data.item.contentItem.x < 0, data.tag + " actions did not show up"); } // dismiss rebound(data.item); } function test_tug_ignored_on_right_button() { listView.positionViewAtBeginning(); var item = findChild(listView, "listItem0"); movingSpy.target = item; flick(item, centerOf(item).x, centerOf(item).y, units.gu(20), 0, 0, 0, Qt.RightButton, undefined, 100); compare(movingSpy.count, 0, "Action panel should not budge!") } function test_rebound_when_pressed_outside_or_clicked_data() { var item0 = findChild(listView, "listItem0"); var item1 = findChild(listView, "listItem1"); return [ {tag: "Click on an other Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item1, mouse: true}, {tag: "Click on the same Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item0, mouse: true}, {tag: "Tap on an other Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item1, mouse: false}, {tag: "Tap on the same Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item0, mouse: false}, ]; } function test_rebound_when_pressed_outside_or_clicked(data) { listView.positionViewAtBeginning(); if (data.mouse) { swipe(data.item, data.pos.x, data.pos.y, data.dx, 0); } else { tug(data.item, data.pos.x, data.pos.y, data.dx, 0); } verify(data.item.contentItem.x != 0, "The component wasn't tugged!"); // dismiss rebound(data.clickOn, data.item) } function test_listview_not_interactive_while_tugged_data() { var item0 = findChild(listView, "listItem0"); var item1 = findChild(listView, "listItem1"); return [ {tag: "Trailing", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item1, mouse: true}, {tag: "Leading", item: item0, pos: centerOf(item0), dx: units.gu(20), clickOn: item0.contentItem, mouse: true}, {tag: "Trailing", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item1, mouse: false}, {tag: "Leading", item: item0, pos: centerOf(item0), dx: units.gu(20), clickOn: item0.contentItem, mouse: false}, ]; } function test_listview_not_interactive_while_tugged(data) { listView.positionViewAtBeginning(); flickableSpy.target = listView; compare(listView.interactive, true, "ListView is not interactive"); if (data.mouse) { swipe(data.item, data.pos.x, data.pos.y, data.dx, units.gu(5)); } else { tug(data.item, data.pos.x, data.pos.y, data.dx, units.gu(5)); } // animation should no longer be running! compare(flickableSpy.count, 0, "Flickable moved!"); // check if it snapped in verify(data.item.contentItem.x != 0.0, "Not snapped in!!"); // dismiss rebound(data.clickOn, data.item); fuzzyCompare(data.item.contentItem.x, data.item.contentItem.anchors.leftMargin, 0.1, "Not snapped out!!"); } function test_visualized_actions_data() { var listItem0 = findChild(listView, "listItem0"); var listItem1 = findChild(listView, "listItem1"); return [ {tag: "Leading actions", item: listItem0, leading: true, expected: ["leading_1", "leading_2", "leading_3"]}, {tag: "Trailing actions", item: listItem0, leading: false, expected: ["stockAction"]}, ]; } function test_visualized_actions(data) { swipe(data.item, centerOf(data.item).x, centerOf(data.item).y, data.leading ? units.gu(20) : -units.gu(20), 0); // check if the action is visible var panel = panelItem(data.item, data.leading); verify(panel, "Panel not visible"); for (var i in data.expected) { var actionItem = findChild(panel, data.expected[i]); verify(actionItem, data.expected[i] + " action not found"); } // dismiss rebound(data.item); } function test_listitem_margins_data() { var item = findChild(listView, "listItem1"); return [ {tag: "leading", item: item, dx: units.gu(10), leading: true}, {tag: "trailing", item: item, dx: -units.gu(10), leading: false} ]; } function test_listitem_margins(data) { data.item.contentItem.anchors.margins = units.gu(1); swipe(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0); var panel = panelItem(data.item, data.leading); verify(panel && panel.visible, "Panel not visible."); // cleanup rebound(data.item); compare(data.item.contentItem.x, units.gu(1), "contentItem.x differs from margin"); data.item.contentItem.anchors.margins = 0; } function test_selecting_action_rebounds_data() { var item0 = findChild(listView, "listItem0"); return [ {tag: "With mouse", item: item0, pos: centerOf(item0), dx: units.gu(20), leading: true, select: "leading_1", mouse: true}, {tag: "With touch", item: item0, pos: centerOf(item0), dx: units.gu(20), leading: true, select: "leading_1", mouse: false}, ] } function test_selecting_action_rebounds(data) { listView.positionViewAtBeginning(); if (data.mouse) { swipe(data.item, data.pos.x, data.pos.y, data.dx, 0); } else { tug(data.item, data.pos.x, data.pos.y, data.dx, 0); } verify(data.item.contentItem.x > 0, "Not snapped in!"); var panel = panelItem(data.item, data.leading); verify(panel, "panelItem not found"); var selectedAction = findChild(panel, data.select); verify(selectedAction, "Cannot select action " + data.select); // dismiss movingSpy.target = data.item; if (data.mouse) { mouseClick(selectedAction, centerOf(selectedAction).x, centerOf(selectedAction).y); } else { TestExtras.touchClick(0, selectedAction, centerOf(selectedAction)); } movingSpy.wait(); fuzzyCompare(data.item.contentItem.x, data.item.contentItem.anchors.leftMargin, 0.1, "Content not snapped out"); } function test_custom_trailing_delegate() { trailing.delegate = customDelegate; listView.positionViewAtBeginning(); var item = findChild(listView, "listItem0"); movingSpy.target = item; swipeNoWait(item, centerOf(item).x, centerOf(item).y, -units.gu(20), 0); var panel = panelItem(item, false); verify(panel, "Panel is not visible"); var custom = findChild(panel, "custom_delegate"); verify(custom, "Custom delegate not in use"); movingSpy.wait(); // cleanup rebound(item); } // execute as last so we make sure we have the panel created function test_snap_data() { var listItem = findChild(listView, "listItem0"); verify(listItem, "ListItem cannot be found"); return [ // the list snaps out if the panel is dragged in > overshoot GU (hardcoded for now) {tag: "Snap out leading", item: listItem, dx: units.gu(2), snapIn: false}, {tag: "Snap in leading", item: listItem, dx: units.gu(6), snapIn: true}, {tag: "Snap out trailing", item: listItem, dx: -units.gu(2), snapIn: false}, {tag: "Snap in trailing", item: listItem, dx: -units.gu(6), snapIn: true}, ]; } function test_snap(data) { swipe(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0); waitForRendering(data.item.contentItem, 400); if (data.snapIn) { verify(data.item.contentItem.x != 0.0, "Not snapped to be visible"); // cleanup rebound(data.item); } else { tryCompareFunction(function() { return data.item.contentItem.x; }, data.item.contentItem.anchors.leftMargin, 1000, "Not snapped back"); } } function test_snap_gesture_data() { var listItem = findChild(listView, "listItem0"); var front = Qt.point(listItem.contentItem.anchors.leftMargin + units.gu(1), listItem.height / 2); var rear = Qt.point(listItem.width - (listItem.contentItem.anchors.rightMargin + units.gu(1)), listItem.height / 2); return [ // the first dx must be big enough to drag the panel in, it is always the last dx value // which decides the snap direction {tag: "Snap out, leading", item: listItem, grabPos: front, dx: [units.gu(10), -units.gu(3)], snapIn: false}, {tag: "Snap in, leading", item: listItem, grabPos: front, dx: [units.gu(10), -units.gu(1), units.gu(1.5)], snapIn: true}, // have less first dx as the trailing panel is shorter {tag: "Snap out, trailing", item: listItem, grabPos: rear, dx: [-units.gu(5), units.gu(2)], snapIn: false}, {tag: "Snap in, trailing", item: listItem, grabPos: rear, dx: [-units.gu(5), units.gu(1), -units.gu(1.5)], snapIn: true}, ]; } function test_snap_gesture(data) { // performe the moves movingSpy.target = data.item; var pos = data.grabPos; mousePress(data.item, pos.x, pos.y); for (var i in data.dx) { var dx = data.dx[i]; mouseMoveSlowly(data.item, pos.x, pos.y, data.dx[i], 0, 5, 100); pos.x += data.dx[i]; } mouseRelease(data.item, pos.x, pos.y); movingSpy.wait(); if (data.snapIn) { // the contenTitem must be dragged in (snapIn) verify(data.item.contentItem.x != 0.0, "Not snapped in!"); // dismiss rebound(data.item); } else { fuzzyCompare(data.item.contentItem.x, data.item.contentItem.anchors.leftMargin, 0.1, "Not snapped out!"); } } function test_verify_action_value_data() { listView.positionViewAtBeginning(); var item0 = findChild(listView, "listItem0"); var item1 = findChild(listView, "listItem1"); return [ // testItem is the child item @index 3 in the topmost Column. {tag: "Standalone item, child index 3", item: testItem, result: 3}, {tag: "ListView, item index 0", item: item0, result: 0}, {tag: "ListView, item index 1", item: item1, result: 1}, ]; } function test_verify_action_value(data) { // tug actions in swipe(data.item, 1, centerOf(data.item).y, units.gu(40), 0); wait(2000); verify(data.item.contentItem.x != data.item.contentItem.anchors.leftMargin, "Not snapped in"); var panel = panelItem(data.item, "Leading"); var action = findChild(panel, "leading_2"); verify(action, "actions panel cannot be reached"); // we test the action closest to the list item's contentItem actionSpy.target = data.item.leadingActions.actions[1]; // select the action movingSpy.target = data.item; mouseClick(action, centerOf(action).x, centerOf(action).y); movingSpy.wait(); // check the action param actionSpy.wait(); // SignalSpy.signalArguments[0] is an array of arguments, where the index is set as index 0 var param = actionSpy.signalArguments[0]; compare(param[0], data.result, "Action parameter differs"); } function test_highlight_data() { return [ {tag: "No actions", item: highlightTest, x: centerOf(highlightTest).x, y: centerOf(highlightTest).y, pressed: false}, {tag: "Leading/trailing actions", item: testItem, x: centerOf(testItem).x, y: centerOf(testItem).y, pressed: true}, {tag: "Active component content", item: controlItem, x: units.gu(1), y: units.gu(1), pressed: true}, {tag: "Center of active component content", item: controlItem, x: centerOf(controlItem).x, y: centerOf(controlItem).y, pressed: false}, {tag: "clicked() connected", item: clickedConnected, x: centerOf(clickedConnected).x, y: centerOf(clickedConnected).y, pressed: true}, ]; } function test_highlight(data) { highlightedSpy.target = data.item; mouseClick(data.item, data.x, data.y); if (data.pressed) { highlightedSpy.wait(); } else { compare(highlightedSpy.count, 0, "Should not be highlighted!"); } } SignalSpy { id: pressAndHoldSpy signalName: "pressAndHold" } SignalSpy { id: buttonSpy signalName: "clicked" target: button } function test_pressandhold_suppress_click() { var center = centerOf(testItem); pressAndHoldSpy.target = testItem; clickSpy.target = testItem; clickSpy.clear(); mouseLongPress(testItem, center.x, center.y); mouseRelease(testItem, center.x, center.y); pressAndHoldSpy.wait(); compare(clickSpy.count, 0, "Click must be suppressed when long pressed"); } function test_pressandhold_not_emitted_when_swiped() { var center = centerOf(testItem); pressAndHoldSpy.target = testItem; // move mouse slowly from left to right, the swipe threshold is 1.5 GU!!!, // so any value less than that will emit pressAndHold mouseMoveSlowly(testItem, center.x, center.y, units.gu(2), 0, 10, 100); mouseRelease(testItem, center.x + units.gu(1), center.y); compare(pressAndHoldSpy.count, 0, "pressAndHold should not be emitted!"); // make sure we have collapsed item rebound(testItem); } function test_pressandhold_not_emitted_when_pressed_over_active_component() { var press = centerOf(button); pressAndHoldSpy.target = controlItem; mouseLongPress(button, press.x, press.y); compare(pressAndHoldSpy.count, 0, "") mouseRelease(button, press.x, press.y); } function test_click_on_button_suppresses_listitem_click() { buttonSpy.target = button; clickSpy.target = controlItem; mouseClick(button, centerOf(button).x, centerOf(button).y); buttonSpy.wait(); compare(clickSpy.count, 0, "ListItem clicked() must be suppressed"); } function test_pressandhold_connected_causes_highlight() { highlightedSpy.target = clickedConnected; mouseLongPress(clickedConnected, centerOf(clickedConnected).x, centerOf(clickedConnected).y); highlightedSpy.wait(); mouseRelease(clickedConnected, centerOf(clickedConnected).x, centerOf(clickedConnected).y); } function test_listitem_blocks_ascendant_flickables() { var listItem = findChild(nestedListView, "listItem0"); verify(listItem, "Cannot find test item"); flickableSpy.target = testFlickable; // tug leading swipe(listItem, centerOf(listItem).x, centerOf(listItem).y, listItem.width / 2, 0); // check if interactive got changed expectFailContinue("", "Flickable should not move."); flickableSpy.wait(200); // cleanup!!! rebound(listItem); } function test_action_type_set() { stockAction.parameterType = Action.None; compare(stockAction.parameterType, Action.None, "No parameter type for stockAction!"); testItem.action = stockAction; compare(stockAction.parameterType, Action.Integer, "No parameter type for stockAction!"); } function test_action_triggered_on_clicked() { testItem.action = stockAction; actionSpy.target = stockAction; mouseClick(testItem, centerOf(testItem).x, centerOf(testItem).y); actionSpy.wait(); } function test_action_suppressed_on_longpress() { testItem.action = stockAction; actionSpy.target = stockAction; clickSpy.target = testItem; pressAndHoldSpy.target = testItem; mouseLongPress(testItem, centerOf(testItem).x, centerOf(testItem).y); mouseRelease(testItem, centerOf(testItem).x, centerOf(testItem).y); pressAndHoldSpy.wait(); compare(clickSpy.count, 0, "Click must be suppressed."); compare(actionSpy.count, 0, "Action triggered must be suppressed"); } function test_select_indices_updates_selected_items() { listView.ViewItems.selectedIndices = [0,1,2]; toggleSelectMode(listView, true); for (var i in listView.ViewItems.selectedIndices) { var index = listView.ViewItems.selectedIndices[i]; var listItem = findChild(listView, "listItem" + index); compare(listItem.selected, true, "ListItem at index " + index + " is not selected!"); } toggleSelectMode(listView, false); listView.ViewItems.selectedIndices = []; } function test_toggle_selectMode_data() { return [ {tag: "When not selected", index: 0, selected: false}, {tag: "When selected", index: 0, selected: true}, ] } function test_toggle_selectMode(data) { var listItem = findChild(listView, "listItem" + data.index) verify(listItem, "Cannot get test item"); listItem.selected = data.selected; toggleSelectMode(listView, true); // testItem is the 4th child, so index is 3 verify(findChild(listItem, "selection_panel" + data.index), "Cannot find selection panel"); compare(listItem.contentItem.enabled, true, "contentItem is not disabled."); } SignalSpy { id: selectedSpy signalName: "selectedChanged" } function test_toggle_selected_data() { return [ // item = , clickOk: , offsetX|Y: {tag: "Click over selection", selectableHolder: testColumn, item: controlItem, clickOn: "listitem_select", offsetX: units.gu(0.5), offsetY: units.gu(0.5), xfail: false}, {tag: "Click over contentItem", selectableHolder: testColumn, item: controlItem, clickOn: "ListItemHolder", offsetX: units.gu(0.5), offsetY: units.gu(0.5), xfail: true}, {tag: "Click over control", selectableHolder: testColumn, item: controlItem, clickOn: "button_in_list", offsetX: units.gu(0.5), offsetY: units.gu(0.5), xfail: true}, ]; } function test_toggle_selected(data) { // make test item selectable first, so the panel is created toggleSelectMode(data.selectableHolder, true); // get the control to click on var clickOn = findChild(data.item, data.clickOn); verify(clickOn, "control to be clicked on not found"); // click on the selection and check selected changed selectedSpy.target = data.item; selectedSpy.clear(); mouseClick(clickOn, data.offsetX, data.offsetY); if (data.xfail) { expectFail(data.tag, "Clicking anywhere else but selection panel should not toggle selection state!"); } selectedSpy.wait(); } SignalSpy { id: selectedIndicesSpy signalName: "selectedIndicesChanged" target: listView.ViewItems } function test_selectedIndices_change() { // move to the end of the view listView.positionViewAtEnd(); var listItem = findChild(listView, "listItem" + (listView.count - 1)); verify(listItem, "Cannot get tested list item"); toggleSelectMode(listView, true, false); selectedSpy.target = listItem; selectedSpy.clear(); listItem.selected = true; selectedSpy.wait(); selectedIndicesSpy.wait(); } function test_no_tug_when_selectable() { movingSpy.target = testItem; toggleSelectMode(testColumn, true); // try to tug leading movingSpy.clear(); swipeNoWait(testItem, centerOf(testItem).x, centerOf(testItem).y, units.gu(10), 0); compare(movingSpy.count, 0, "No tug allowed when in selection mode"); } function test_selectable_and_click() { toggleSelectMode(testColumn, true); clickSpy.target = testItem; mouseClick(testItem, centerOf(testItem).x, centerOf(testItem).y); clickSpy.wait(); } function test_selectable_and_pressandhold() { toggleSelectMode(testColumn, true); pressAndHoldSpy.target = testItem; mouseLongPress(testItem, centerOf(testItem).x, centerOf(testItem).y); mouseRelease(testItem, centerOf(testItem).x, centerOf(testItem).y); pressAndHoldSpy.wait(); } function test_proper_attached_properties_data() { return [ {tag: "Attached to ListView", item: listView}, {tag: "Attached to Column in Flickable", item: column}, ]; } function test_proper_attached_properties(data) { var listItem = findChild(data.item, "listItem0"); verify(listItem, "ListItem not found!"); toggleSelectMode(data.item, true); // check if the selection mode was activated by looking after the first selection panel var panel = findChild(listItem, "selection_panel0"); // turn off selection mode so we have a proper cleanup toggleSelectMode(data.item, true); verify(panel, "Selection panel not found, wrong attached property target?"); } function test_dragmode_availability_data() { return [ {tag: "Attached to Column", item: testColumn, lookupOn: testItem, xfail: true}, {tag: "Attached to ListView", item: listView, lookupOn: findChild(listView, "listItem0"), xfail: false}, ]; } function test_dragmode_availability(data) { if (data.xfail) { ignoreWarning(warningFormat(85, 5, "QML Column: Dragging mode requires ListView")); } data.item.ViewItems.dragMode = true; wait(400); var panel = findChild(data.lookupOn, "drag_panel0"); if (data.xfail) { expectFailContinue(data.tag, "There should be no drag handler shown!") } verify(panel, "No drag handler found!"); } function test_drag_data() { return [ // note: Live mode adds an extra drop event when the mouse/touch is released {tag: "Live 0->1 OK", live: true, from: 0, to: 1, count: 1, dropCount: 1, accept: true, indices:[1,0,2,3,4]}, {tag: "Live 0->2 OK", live: true, from: 0, to: 2, count: 2, dropCount: 1, accept: true, indices:[1,2,0,3,4]}, {tag: "Live 0->3 OK", live: true, from: 0, to: 3, count: 3, dropCount: 1, accept: true, indices:[1,2,3,0,4]}, {tag: "Live 3->0 OK", live: true, from: 3, to: 0, count: 3, dropCount: 1, accept: true, indices:[3,0,1,2,4]}, // do not accept moves {tag: "Live 0->1 NOK", live: true, from: 0, to: 1, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, {tag: "Live 0->2 NOK", live: true, from: 0, to: 2, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, {tag: "Live 0->3 NOK", live: true, from: 0, to: 3, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, {tag: "Live 3->0 NOK", live: true, from: 3, to: 0, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, // non-live updates {tag: "Drop 0->1 OK", live: false, from: 0, to: 1, count: 1, dropCount: 1, accept: true, indices:[1,0,2,3,4]}, {tag: "Drop 0->2 OK", live: false, from: 0, to: 2, count: 1, dropCount: 1, accept: true, indices:[1,2,0,3,4]}, {tag: "Drop 0->3 OK", live: false, from: 0, to: 3, count: 1, dropCount: 1, accept: true, indices:[1,2,3,0,4]}, {tag: "Drop 3->0 OK", live: false, from: 3, to: 0, count: 1, dropCount: 1, accept: true, indices:[3,0,1,2,4]}, // do not accept moves {tag: "Drop 0->1 NOK", live: false, from: 0, to: 1, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, {tag: "Drop 0->2 NOK", live: false, from: 0, to: 2, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, {tag: "Drop 0->3 NOK", live: false, from: 0, to: 3, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, {tag: "Drop 3->0 NOK", live: false, from: 3, to: 0, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, ]; } function test_drag(data) { var moveCount = 0; var dropCount = 0; function liveUpdate(event) { if (event.status == ListItemDrag.Started) { return; } if (event.status == ListItemDrag.Moving) { if (data.accept) { moveCount++; listView.model.move(event.from, event.to, 1); } event.accept = data.accept; } if (event.status == ListItemDrag.Dropped) { dropCount++; event.accept = data.accept; } } function singleDrop(event) { if (event.status == ListItemDrag.Dropped) { dropCount++; if (data.accept) { moveCount++; listView.model.move(event.from, event.to, 1); } event.accept = data.accept; } else if (event.status == ListItemDrag.Moving) { event.accept = false; } } objectModel.reset(); waitForRendering(listView); listView.positionViewAtBeginning(); var func = data.live ? liveUpdate : singleDrop; listView.ViewItems.dragUpdated.connect(func); // enter drag mode toggleDragMode(listView, true); drag(listView, data.from, data.to); compare(moveCount, data.count, "Move did not happen or more than one item was moved"); compare(dropCount, data.dropCount, "Dropped amount differs"); // compare array indices for (var i in data.indices) { compare(listView.model.get(i).data, data.indices[i], "data at index " + i + " is not the expected one"); } // cleanup listView.ViewItems.dragUpdated.disconnect(func); toggleDragMode(listView, false); } // preconditions: // the first 2 items cannot be dragged anywhere, nothing can be dropped in this area // the 3-> items can be interchanged in between, cannot be dragged outside function test_drag_restricted_data() { return [ {tag: "[0,1] locked, drag 0->1 NOK", from: 0, to: 1, count: 0, indices: [0,1,2,3,4]}, {tag: "[0,1] locked, drag 1->2 NOK", from: 1, to: 2, count: 0, indices: [0,1,2,3,4]}, {tag: "[0,1] locked, drag 2->1 NOK", from: 2, to: 1, count: 0, indices: [0,1,2,3,4]}, {tag: "[0,1] locked, drag 2->0 NOK", from: 2, to: 0, count: 0, indices: [0,1,2,3,4]}, // drag {tag: "[0,1] locked, drag 2->3 OK", from: 2, to: 3, count: 1, indices: [0,1,3,2,4]}, ]; } function test_drag_restricted(data) { var moveCount = 0; function updateHandler(event) { if (event.status == ListItemDrag.Started) { if (event.from < 2) { event.accept = false; } else { event.minimumIndex = 2; } } else if (event.status == ListItemDrag.Moving) { listView.model.move(event.from, event.to, 1); moveCount++; } } objectModel.reset(); waitForRendering(listView); listView.positionViewAtBeginning(); listView.ViewItems.dragUpdated.connect(updateHandler); // enter drag mode toggleDragMode(listView, true); drag(listView, data.from, data.to); compare(moveCount, data.count, "Move did not happen or more than one item was moved"); // compare array indices for (var i in data.indices) { compare(listView.model.get(i).data, data.indices[i], "data at index " + i + " is not the expected one"); } // cleanup listView.ViewItems.dragUpdated.disconnect(updateHandler); toggleDragMode(listView, false); } function test_drag_keeps_selected_indexes_data() { return [ {tag: "[0,1,2] selected, move 0->3, live", selected: [0,1,2], from: 0, to: 3, expected: [0,1,3], live: true}, {tag: "[1,2] selected, move 3->2, live", selected: [1,2], from: 3, to: 2, expected: [1,3], live: true}, {tag: "[1,2] selected, move 0->3, live", selected: [1,2], from: 0, to: 3, expected: [0,1], live: true}, {tag: "[1,2] selected, move 3->0, live", selected: [1,2], from: 3, to: 0, expected: [2,3], live: true}, // non-live updates {tag: "[0,1,2] selected, move 0->3, non-live", selected: [0,1,2], from: 0, to: 3, expected: [0,1,3], live: false}, {tag: "[1,2] selected, move 3->2, non-live", selected: [1,2], from: 3, to: 2, expected: [1,3], live: false}, {tag: "[1,2] selected, move 0->3, non-live", selected: [1,2], from: 0, to: 3, expected: [0,1], live: false}, {tag: "[1,2] selected, move 3->0, non-live", selected: [1,2], from: 3, to: 0, expected: [2,3], live: false}, ]; } function test_drag_keeps_selected_indexes(data) { function updateHandler(event) { if (event.status == ListItemDrag.Started) { return; } if (data.live || event.status == ListItemDrag.Dropped) { listView.model.move(event.from, event.to, 1); } else { event.accept = false; } } objectModel.reset(); waitForRendering(listView); listView.ViewItems.selectedIndices = data.selected; listView.ViewItems.dragUpdated.connect(updateHandler); toggleDragMode(listView, true); drag(listView, data.from, data.to); listView.ViewItems.dragUpdated.disconnect(updateHandler); toggleDragMode(listView, false); // NOTE: the selected indexes order is arbitrar and cannot be predicted by the test // therefore we check the selected indexes presence in the expected list. compare(listView.ViewItems.selectedIndices.length, data.expected.length, "The selected indexes and expected list size differs"); for (var i = 0; i < listView.ViewItems.selectedIndices.length; i++) { var index = data.expected.indexOf(listView.ViewItems.selectedIndices[i]); verify(index >= 0, "Index " + listView.ViewItems.selectedIndices[i] + " is not expected to be selected!"); } } // must run this immediately after the defaults are checked otherwise drag handler connected check will fail function test_1_warn_missing_dragUpdated_signal_handler() { ignoreWarning(warningFormat(121, 9, "QML ListView: ListView has no ViewItems.dragUpdated() signal handler implemented. No dragging will be possible.")); toggleDragMode(listView, true); drag(listView, 0, 1); toggleDragMode(listView, true); } DelegateModel { id: delegateModel delegate: ListItem { objectName: "listItem" + index Label { text: modelData } } } ObjectModel { id: objectModel2 Repeater { model: 3 ListItem { objectName: "listItem" + index Label { text: modelData } } } } function test_warn_model_data() { var list = [1,2,3,4,5,6,7,8,9,10]; return [ {tag: "number", model: 20, warning: "Dragging is only supported when using a QAbstractItemModel, ListModel or list."}, {tag: "list", model: list, warning: ""}, {tag: "ListModel", model: objectModel, warning: ""}, {tag: "DelegateModel with number", model: delegateModel, modelModel: 20, warning: "Dragging is only supported when using a QAbstractItemModel, ListModel or list."}, {tag: "DelegateModel with list", model: delegateModel, modelModel: list, warning: ""}, {tag: "DelegateModel with ListModel", model: delegateModel, modelModel: objectModel, warning: ""}, {tag: "ObjectModel", model: objectModel2, warning: ""}, ]; } function test_warn_model(data) { function dummyFunc() {} if (data.warning !== "") { ignoreWarning(warningFormat(121, 9, "QML ListView: " + data.warning)); } listView.model = data.model; if (typeof data.modelModel !== "undefined") { listView.model.model = data.modelModel; } waitForRendering(listView, 500); listView.ViewItems.dragUpdated.connect(dummyFunc); toggleDragMode(listView, true); toggleDragMode(listView, false); listView.ViewItems.dragUpdated.disconnect(dummyFunc); } function test_rtl_actions_data() { return [ {tag: "Leading actions", item: "listItem0", leading: true, expected: ["leading_1", "leading_2", "leading_3"]}, {tag: "Trailing actions", item: "listItem0", leading: false, expected: ["stockAction"]}, ]; } function test_rtl_actions(data) { listView.LayoutMirroring.enabled = true; waitForRendering(listView, 500); var listItem = findChild(listView, data.item); swipe(listItem, centerOf(listItem).x, centerOf(listItem).y, data.leading ? -units.gu(20) : units.gu(20), 0); // check if the action is visible var panel = panelItem(listItem, data.leading); verify(panel, "Panel not visible"); for (var i in data.expected) { var actionItem = findChild(panel, data.expected[i]); verify(actionItem, data.expected[i] + " action not found"); } // dismiss rebound(listItem); listView.LayoutMirroring.enabled = false; waitForRendering(listView, 500); } function test_rtl_selection_panel_position() { listView.LayoutMirroring.enabled = true; waitForRendering(listView, 500); toggleSelectMode(listView, true); // get the panel var listItem = findChild(listView, "listItem0"); verify(listItem, "ListItem cannot be found"); var panel = findChild(listView, "selection_panel0"); verify(panel, "Selection panel not found."); verify(listItem.mapFromItem(panel, panel.x, panel.y).x > centerOf(listItem).x, "Panel is not in its proper place!"); toggleSelectMode(listView, false); listView.LayoutMirroring.enabled = false; waitForRendering(listView, 500); } function test_rtl_drag_panel_position() { listView.LayoutMirroring.enabled = true; waitForRendering(listView, 500); toggleDragMode(listView, true); // get the panel var listItem = findChild(listView, "listItem0"); verify(listItem, "ListItem cannot be found"); var panel = findChild(listView, "drag_panel0"); verify(panel, "Drag panel not found."); verify(listItem.mapFromItem(panel, panel.x, panel.y).x < centerOf(listItem).x, "Panel is not in its proper place!"); toggleDragMode(listView, false); listView.LayoutMirroring.enabled = false; waitForRendering(listView, 500); } function test_listitem_actions_width_bug1465582_data() { return [ {tag: "leading", dx: units.gu(5), action: "leading_1"}, {tag: "trailing", dx: -units.gu(5), action: "stockAction"}, ]; } function test_listitem_actions_width_bug1465582(data) { var height = testItem.height; testItem.height = units.gu(15); swipe(testItem, centerOf(testItem).x, centerOf(testItem).y, data.dx); var icon = findChild(testItem, data.action); verify(icon); compare(icon.width, units.gu(6), "icon width should be the same no matter of the height set"); rebound(testItem); // restore height testItem.height = height; } } } ./tests/unit_x11/tst_components/tst_theming.qml0000644000015600001650000000354712700370701022034 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.3 import Ubuntu.Test 1.0 MainView { id: mainView width: units.gu(50) height: units.gu(10) UbuntuTestCase { when: windowShown SignalSpy { id: themeSpy signalName: "paletteChanged" target: Theme } function cleanup() { themeSpy.clear(); } function test_backgroundcolor_change_data() { return [ {tag: "Light color", oldTheme: "Ubuntu.Components.Themes.SuruDark", newTheme: "Ubuntu.Components.Themes.Ambiance", color: "white"}, {tag: "Dark color", oldTheme: "Ubuntu.Components.Themes.Ambiance", newTheme: "Ubuntu.Components.Themes.SuruDark", color: "blue"}, ]; } function test_backgroundcolor_change(data) { if (data.oldTheme !== mainView.theme.name) { mainView.theme.name = data.oldTheme; themeSpy.wait(); } // change color; themeSpy.clear(); mainView.backgroundColor = data.color; themeSpy.wait(); compare(mainView.theme.name, data.newTheme, "Theme not chnaged"); } } } ./tests/unit_x11/tst_components/tst_listitems13_standard.qml0000644000015600001650000001204712700370701024435 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem Item { width: 400 height: 400 Rectangle { id: testItem } AbstractButton { id: testControl visible: false } ListItem.Standard { id: listItemStandard anchors.fill: parent } TestCase { name: "ListItemsStandardAPI" when: windowShown function test_clickToTrigger_bug1527811() { compare(listItemTriggeredSpy.valid, true, "triggered signal exists") var listItemTriggeredCount = listItemTriggeredSpy.count mouseMove(listItemStandard, 10, 10) mouseClick(listItemStandard, 10, 10, Qt.LeftButton) compare(listItemTriggeredSpy.count, listItemTriggeredCount + 1, "Clicking the list item triggers it") } function test_fallbackIconSource() { expectFail("","https://bugs.launchpad.net/tavastia/+bug/1076762") compare(listItemStandard.fallbackIconSource,undefined,"fallbackIconSource is not set by default") } function test_control() { listItemStandard.control = testControl compare(listItemStandard.control,testControl,"set/get") listItemStandard.control = null compare(listItemStandard.control, null, "unset") } function test_clicked() { compare(listItemClickedSpy.valid, true, "clicked signal exists") compare(controlClickedSpy.valid, true, "control has clicked signal") var listItemClickedCount = listItemClickedSpy.count var controlClickedCount = controlClickedSpy.count mouseMove(listItemStandard, 10, 10) mouseClick(listItemStandard, 10, 10, Qt.LeftButton) listItemClickedCount++; compare(listItemClickedSpy.count, listItemClickedCount, "List item clicked triggered") listItemStandard.control = testControl; mouseMove(listItemStandard, 10, 10) mouseClick(listItemStandard, 10, 10, Qt.LeftButton) compare(listItemStandard.control, testControl, "control can be set") listItemClickedCount++; compare(controlClickedSpy.count, controlClickedCount, "Control clicked triggered") compare(listItemClickedSpy.count, listItemClickedCount, "List item clicked not triggered when there is a control") listItemStandard.control = null; } function test_bug1166982_disabled_control_clicked() { var controlClickedCount = controlClickedSpy.count listItemStandard.control = testControl testControl.enabled = false mouseMove(listItemStandard, 10, 10) mouseClick(listItemStandard, 10, 10, Qt.LeftButton) compare(controlClickedSpy.count, controlClickedCount, "Control clicked not triggered with disabled control") testControl.enabled = true listItemStandard.control = null } function test_icon() { ignoreWarning("WARNING: ListItems.Standard.icon is DEPRECATED. Use iconName and iconSource instead.") compare(listItemStandard.icon,undefined,"icon is not set by default") // test with url var newIcon = Qt.resolvedUrl("../../../examples/ubuntu-ui-toolkit-gallery/small_avatar.png") listItemStandard.icon = newIcon compare(listItemStandard.icon,newIcon,"set/get from url") } function test_iconFrame() { compare(listItemStandard.iconFrame,true,"iconFrame is true by default") } function test_progression() { compare(listItemStandard.progression,false,"progression is false by default") } function test_text() { compare(listItemStandard.text,"","text is '' by default") var newText = "Hello World!" listItemStandard.text = newText compare(listItemStandard.text,newText,"set/get") } SignalSpy { id: listItemClickedSpy target: listItemStandard signalName: "clicked" } SignalSpy { id: controlClickedSpy target: testControl signalName: "clicked" } SignalSpy { id: listItemTriggeredSpy target: listItemStandard signalName: "triggered" } } } ./tests/unit_x11/tst_components/tst_adaptivepagelayout.qml0000644000015600001650000005160312700370714024271 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 MainView { id: root width: units.gu(120) height: units.gu(71) // 2 on desktop, 1 on phone. property int columns: width >= units.gu(80) ? 2 : 1 Column { anchors.fill: parent AdaptivePageLayout { id: layout width: parent.width height: parent.height / 2 primaryPage: page1 Page { id: page1 objectName: header.title header: PageHeader { title: "Page1" } Column { anchors.centerIn: parent width: childrenRect.width Button { text: "Page 2 left" onTriggered: layout.addPageToCurrentColumn(page1, page2) } Button { text: "Page 3 right" onTriggered: layout.addPageToNextColumn(page1, page3); } } } Page { id: page2 objectName: header.title header: PageHeader { title: "Page2" } } Page { id: page3 objectName: header.title header: PageHeader { title: "Page3" } } Page { id: page4 objectName: header.title header: PageHeader { title: "Page4" } } } AdaptivePageLayout { id: defaults width: parent.width height: parent.height / 2 Page { id: otherPage1 objectName: header.title header: PageHeader { title: "Page1" } } Page { id: otherPage2 objectName: header.title header: PageHeader { title: "Page2" } } Page { id: otherPage3 objectName: header.title header: PageHeader { title: "Page3" } } } } Component { id: pageComponent Page { objectName: header.title header: PageHeader { title: "DynamicPage" } signal deleted() Component.onDestruction: deleted() } } UbuntuTestCase { id: testCase when: windowShown signal pageLoaded() SignalSpy { id: loadedSpy target: testCase signalName: "pageLoaded" } SignalSpy { id: primaryPageSpy signalName: "primaryPageChanged" } SignalSpy { id: deletedSpy1 signalName: "deleted" } SignalSpy { id: deletedSpy2 signalName: "deleted" } function resize_single_column() { layout.width = units.gu(40); } // resize to use the full window width function resize_multiple_columns() { layout.width = root.width; } function getColumnHolder(apl, column) { verify(apl.columns > column); return findChild(apl, "ColumnHolder" + column); } function getPageWrapper(apl, page) { verify(apl.__d); return apl.__d.getWrapper(page); } function findPageFromLayout(apl, objectName) { var body = findChild(apl, "body"); verify(body); return findChild(body, objectName); } function cleanup() { page1.header.title = "Page1"; page2.header.title = "Page2"; page3.header.title = "Page3"; page4.header.title = "Page4"; loadedSpy.clear(); primaryPageSpy.clear(); primaryPageSpy.target = null; resize_multiple_columns(); layout.removePages(layout.primaryPage); defaults.primaryPage = null; // restore binding on column number root.columns = Qt.binding(function () {return root.width >= units.gu(80) ? 2 : 1}); // restore async layout.asynchronous = true; wait(200); } function initTestCase() { compare(defaults.primaryPage, null, "primaryPage not null by default"); compare(defaults.primaryPageSource, undefined, "primaryPageSource not set by default"); compare(defaults.layouts.length, 0, "no layouts by default"); compare(defaults.columns, columns, columns + " column(s) as default"); compare(defaults.asynchronous, true, "default page loading is asynchronous"); verify(page1.active, "Page1 is not active but should be! Bug(1535241)"); verify(!page2.active, "Page2 is active but should not be! Bug(1535241)"); } function test_change_primaryPage() { defaults.primaryPage = otherPage1; defaults.addPageToCurrentColumn(defaults.primaryPage, otherPage2); defaults.primaryPage = otherPage3; verify(!findPageFromLayout(defaults, "Page2"), "Page2 still in the view!"); } function test_add_page_when_source_page_not_in_stack() { ignoreWarning("sourcePage must be added to the view to add new page."); layout.addPageToCurrentColumn(page2, page3); ignoreWarning("sourcePage must be added to the view to add new page."); layout.addPageToNextColumn(page2, page3); } function test_add_page_with_null_sourcePage() { ignoreWarning("No sourcePage specified. Page will not be added.") layout.addPageToCurrentColumn(null, page1); ignoreWarning("No sourcePage specified. Page will not be added.") layout.addPageToNextColumn(null, page2); } function test_add_same_page_twice() { layout.addPageToCurrentColumn(page1, page2); layout.addPageToCurrentColumn(page2, page3); ignoreWarning("Cannot add a Page that was already added."); layout.addPageToCurrentColumn(page3, page2); ignoreWarning("Cannot add a Page that was already added."); layout.addPageToNextColumn(page3, page2); } function test_page_visible() { // Two columns on desktop, one on phone compare(page1.visible, true, "Primary page not initially visible."); compare(page2.visible, false, "Page 2 visible before it was added."); compare(page3.visible, false, "Page 3 visible before it was added."); layout.addPageToCurrentColumn(page1, page2); compare(page1.visible, false, "Page still visible after adding new page in current column."); compare(page2.visible, true, "Page invisible after adding it to current column."); layout.addPageToNextColumn(page2, page3); if (root.columns === 2) { compare(page2.visible, true, "Page in first column became invisible after adding to next column."); } else { // root.columns === 1 compare(page2.visible, false, "Page in single column still visible after adding page to next column."); } compare(page3.visible, true, "Page invisible after adding it to next column."); // One column resize_single_column(); compare(page3.visible, true, "Top page in last column invisible when resizing to one column."); compare(page2.visible, false, "Top page in first column visible when resizing to one column."); layout.removePages(page3); compare(page3.visible, false, "Page 3 visible after it was removed."); compare(page2.visible, true, "New top page in single column not visible."); layout.removePages(page1); compare(page1.visible, true, "Primary page not visible in single column."); compare(page2.visible, false, "Page 2 visible while it is not added."); layout.addPageToNextColumn(page1, page4); compare(page1.visible, false, "Page remains visible after adding to next column in single column view."); compare(page4.visible, true, "Page added to next column with single column view is not visible."); // Two columns on desktop, one on phone resize_multiple_columns(); if (root.columns === 2) { compare(page1.visible, true, "Page in left column did not become visible when switching to multi-column view."); compare(page4.visible, true, "Page in right column became invisible when switching to multi-column view."); } } function test_add_to_current_prunes_next() { layout.addPageToNextColumn(page1, page2); compare(page2.visible, true, "Adding page to next column does not show that page."); layout.addPageToCurrentColumn(page1, page3); compare(page2.visible, false, "Adding page to current column does not clear next column."); layout.removePages(page3); compare(page2.visible, false, "Removing page from first column shows previous page in next column."); } function test_add_to_next_first_prunes_next() { layout.addPageToNextColumn(page1, page2); layout.addPageToNextColumn(page1, page3); layout.removePages(page3); compare(page2.visible, false, "Adding page to next column did not prune that column."); } function test_add_page_to_current_does_not_prune_current() { layout.addPageToCurrentColumn(page1, page2); layout.addPageToCurrentColumn(page2, page3); layout.removePages(page3); compare(page2.visible, true, "Adding page to current column pruned that column."); } function test_add_page_to_current_data() { return [ {tag: "Synchronously to current column", func: "addPageToCurrentColumn", page: page2, params: {}, sync: true}, {tag: "Synchronously to current column, with params", func: "addPageToCurrentColumn", page: page2, params: {title: "Altered title"}, sync: true}, {tag: "Synchronously to next column", func: "addPageToNextColumn", page: page2, params: {}, sync: true}, {tag: "Synchronously to next column, with params", func: "addPageToNextColumn", page: page2, params: {title: "Altered title"}, sync: true}, {tag: "Asynchronously to current column", func: "addPageToCurrentColumn", page: pageComponent, params: {}, sync: false}, {tag: "Asynchronously to current column, with params", func: "addPageToCurrentColumn", page: pageComponent, params: {title: "Altered title"}, sync: false}, {tag: "Asynchronously to next column", func: "addPageToNextColumn", page: pageComponent, params: {}, sync: false}, {tag: "Asynchronously to next column, with params", func: "addPageToNextColumn", page: pageComponent, params: {title: "Altered title"}, sync: false}, ] } function test_add_page_to_current(data) { var incubator = layout[data.func](layout.primaryPage, data.page, data.params); compare((incubator == null), data.sync); if (incubator) { compare(incubator.status, Component.Loading, "The incubator status is not Component.Loading, but " + incubator.status); // for cleanup, we must wait till the page is added, so we can do proper cleanup incubator.onStatusChanged = function (status) { // test params for (var param in data.params) { compare(incubator.object[param], data.params[param], "parameter '" + param + "' values do not match"); } testCase.pageLoaded(); layout.removePages(layout.primaryPage); } // make sure we wait enough to let additional tests to complete loadedSpy.wait(1500); } } function test_forced_synchronous_loading_bug1540449_data() { return [ {tag: "To current column", func: "addPageToCurrentColumn", page: pageComponent, expectedTitle: "DynamicPage"}, {tag: "To next column", func: "addPageToNextColumn", page: pageComponent, expectedTitle: "DynamicPage"}, ]; } function test_forced_synchronous_loading_bug1540449(data) { layout[data.func](layout.primaryPage, data.page); waitForRendering(layout, 400); var wrapper = getPageWrapper(layout, layout.primaryPage); verify(wrapper); var testColumn = MathUtils.clamp(wrapper.column + (data.func == "addPageToCurrentColumn" ? 0 : 1), 0, layout.columns - 1); var testHolder = getColumnHolder(layout, testColumn); compare(testHolder.pageWrapper.object.header.title, data.expectedTitle, "page not found"); } function test_asynchronous_page_loading_incubator_forcecompletion() { var incubator = layout.addPageToCurrentColumn(layout.primaryPage, pageComponent); verify(incubator, "Page added synchronously!"); compare(incubator.status, Component.Loading, "Incubator in different state"); incubator.forceCompletion(); compare(incubator.status, Component.Ready, "Incubator not completed"); verify(incubator.object, "Page object not set"); } SignalSpy { id: widthSpy signalName: "widthChanged" } SignalSpy { id: heightSpy signalName: "heightChanged" } function test_hidden_page_keeps_geometry_bug1492343() { widthSpy.target = heightSpy.target = layout.primaryPage; layout.addPageToCurrentColumn(layout.primaryPage, page2); expectFailContinue("", "no width change expected"); widthSpy.wait(400); expectFailContinue("", "no height change expected"); heightSpy.wait(400); } SignalSpy { id: pageLoadedSpy signalName: "pageLoaded" } function test_old_page_disappears_when_new_one_ready_bug1499178_data() { return [ {tag: "CurrentColumn, wide", width: units.gu(120), nextColumn: false, page: pageComponent, sourcePage: layout.primaryPage}, {tag: "CurrentColumn, narrow", width: units.gu(40), nextColumn: false, page: pageComponent, sourcePage: layout.primaryPage}, {tag: "NextColumn, wide", intermediatePage: page2, width: units.gu(120), nextColumn: true, page: pageComponent, sourcePage: layout.primaryPage}, {tag: "NextColumn, narrow", intermediatePage: page2, width: units.gu(40), nextColumn: true, page: pageComponent, sourcePage: layout.primaryPage}, ]; } function test_old_page_disappears_when_new_one_ready_bug1499178(data) { layout.width = data.width; var wrapper = getPageWrapper(layout, data.sourcePage); verify(wrapper); var testColumn = MathUtils.clamp(wrapper.column + (data.nextColumn ? 1 : 0), 0, layout.columns - 1); var testHolder = getColumnHolder(layout, testColumn); verify(testHolder); if (data.intermediatePage) { layout.addPageToNextColumn(data.sourcePage, data.intermediatePage); } var testPage = testHolder.pageWrapper.object; var prevPageActive = false; var incubator = data.nextColumn ? layout.addPageToNextColumn(data.sourcePage, data.page) : layout.addPageToCurrentColumn(data.sourcePage, data.page); verify(incubator); compare(testHolder.pageWrapper.object, testPage); incubator.onStatusChanged = function (status) { if (status == Component.Ready) { prevPageActive = testHolder.pageWrapper.object == testPage; testCase.pageLoaded(); } } loadedSpy.wait(2500); verify(prevPageActive); } function test_primaryPageSource_bug1499179_data() { return [ {tag: "Component", test: pageComponent}, {tag: "Document", test: Qt.resolvedUrl("MyExternalPageWithNewHeader.qml")}, ]; } function test_primaryPageSource_bug1499179(data) { primaryPageSpy.target = defaults; defaults.primaryPageSource = data.test; primaryPageSpy.wait(); } function test_change_primaryPageSource_data() { return [ {tag: "Component", test: pageComponent, nextValue: Qt.resolvedUrl("MyExternalPageWithNewHeader.qml")}, {tag: "Document", test: Qt.resolvedUrl("MyExternalPageWithNewHeader.qml"), nextValue: pageComponent}, ]; } function test_change_primaryPageSource(data) { primaryPageSpy.target = defaults; verify(defaults.primaryPage == null); verify(defaults.primaryPageSource == undefined); defaults.primaryPageSource = data.test; primaryPageSpy.wait(400); // add some pages defaults.addPageToCurrentColumn(defaults.primaryPage, otherPage2); // then replace the primaryPageSource primaryPageSpy.clear(); defaults.primaryPageSource = data.nextValue; primaryPageSpy.wait(400); // look after page2 verify(!findPageFromLayout(defaults, "Page2"), "Page2 still in the view!"); } function test_primaryPageSource_precedence_over_primaryPage() { primaryPageSpy.target = defaults; defaults.primaryPage = otherPage1; primaryPageSpy.wait(400); // now set a value to primaryPageSource primaryPageSpy.clear(); defaults.primaryPageSource = pageComponent; primaryPageSpy.wait(400); } function test_primaryPage_change_clears_primaryPageSource() { primaryPageSpy.target = defaults; defaults.primaryPageSource = pageComponent; primaryPageSpy.wait(400); compare(defaults.primaryPage.header.title, "DynamicPage", "DynamicPage not set as primaryPage"); // now set a value to primaryPage primaryPageSpy.clear(); defaults.primaryPage = otherPage1; primaryPageSpy.wait(400); compare(defaults.primaryPageSource, undefined, "primaryPageSource must be cleared"); } function test_add_page_to_next_column_doesnt_delete_prev_column_content_bug1544745() { var incubator = layout.addPageToNextColumn(layout.primaryPage, pageComponent); verify(incubator); verify(incubator.status != Component.Error); var newPage = null; if (incubator.status == Component.Loading) { incubator.forceCompletion(); newPage = incubator.object; } else if (incubator.status == Component.Ready) { newPage = incubator.object; } deletedSpy1.target = newPage; // add one page on top of the page on second column incubator = layout.addPageToCurrentColumn(newPage, pageComponent); verify(incubator); newPage = null; if (incubator.status == Component.Loading) { incubator.forceCompletion(); newPage = incubator.object; } else if (incubator.status == Component.Ready) { newPage = incubator.object; } deletedSpy2.target = newPage; // add a new page relative to the primary page to the next column // this should remove the previously added two pages incubator = layout.addPageToNextColumn(layout.primaryPage, pageComponent); verify(incubator); incubator.forceCompletion(); deletedSpy1.wait(500); deletedSpy2.wait(500); } } } ./tests/unit_x11/tst_components/tst_toolbaritems.qml0000644000015600001650000001064112700370701023076 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 Item { width: 200 height: 200 MainView { id: mainView anchors.fill: parent PageStack { id: pageStack0 } Page { id: page0 tools: ToolbarItems { id: emptyToolbarItems } } Page { id: page1 tools: toolbarItems ToolbarItems { id: toolbarItems ToolbarButton { id: button } } } } TestCase { name: "ToolbarItemsAPI" when: windowShown function initTestCase() { compare(toolbarItems.pageStack, null, "pageStack initially null"); compare(toolbarItems.locked, false, "toolbar items unlocked with children"); compare(emptyToolbarItems.locked, true, "toolbar items unlocked without visible children"); compare(toolbarItems.back === undefined, false, "back item set by default"); compare(toolbarItems.back.hasOwnProperty("text"), true, "back item has text property"); compare(toolbarItems.back.hasOwnProperty("visible"), true, "back item has visible property"); } function test_opened() { compare(toolbarItems.opened, true, "Toolbar items opened when page is first loaded"); toolbarItems.opened = false; compare(toolbarItems.opened, false, "Toolbar items can be closed"); toolbarItems.opened = true; compare(toolbarItems.opened, true, "Toolbar items can be opened"); } function test_locked() { compare(emptyToolbarItems.locked, true, "Toolbar items initially locked for empty toolbar"); compare(toolbarItems.locked, false, "Toolbar items initially unlocked for non-empty toolbar"); toolbarItems.locked = true; compare(toolbarItems.locked, true, "Toolbar items can be locked"); toolbarItems.locked = false; compare(toolbarItems.locked, false, "Toolbar items can be unlocked"); } function test_back() { compare(pageStack0.depth, 0, "pageStack is empty by default"); compare(page0.tools.back.visible, false, "back item not visible without pageStack"); compare(page0.tools.pageStack, null, "back.pageStack null by default"); pageStack0.push(page0); compare(pageStack0.depth, 1, "pageStack.depth == 1 after pushing one page"); compare(page0.tools.pageStack, pageStack0, "pushing a page updates the pageStack of tools item"); compare(page0.tools.back.visible, false, "back item not visible with only one page on the stack"); pageStack0.push(page1); compare(pageStack0.depth, 2, "pageStack.depth == 2 after pushing two pages"); compare(page1.tools.pageStack, pageStack0, "pushing a page updates the pageStack of tools item"); compare(page1.tools.back.visible, true, "back item visible with two pages on the stack"); pageStack0.pop(); compare(pageStack0.depth, 1, "pageStack.depth == 1 after popping second page"); compare(page0.tools.back.visible, false, "back item not visible with only one page on the stack"); pageStack0.pop(); compare(pageStack0.depth, 0, "pageStack is empty after popping both pages"); } function test_visible() { compare(toolbarItems.visible, true, "Toolbar items are visible when in toolbar"); mainView.useDeprecatedToolbar = false; compare(toolbarItems.visible, false, "Toolbar items are invisible when not using deprecated toolbar"); mainView.useDeprecatedToolbar = true; } } } ./tests/unit_x11/tst_components/tst_expandable.qml0000644000015600001650000001036712700370701022502 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 Item { width: units.gu(40) height: units.gu(60) ExpandablesColumn { id: expandablesColumn anchors { left: parent.left; top: parent.top; right: parent.right } height: units.gu(60) Expandable { id: expandable expandedHeight: contentColumn.height onClicked: expanded = !expanded Column { id: contentColumn anchors { left: parent.left; right: parent.right; top: parent.top } Rectangle { anchors { left: parent.left; right: parent.right} id: collapsedRect color: "khaki" height: expandable.collapsedHeight } Rectangle { anchors { left: parent.left; right: parent.right } height: units.gu(40) color: "orange" } } } } UbuntuTestCase { name: "Expandable" when: windowShown function test_expanding_collapsing() { waitForRendering(expandable); // expand it and make sure it eventually reaches the expandedHeight expandable.expanded = true; tryCompare(expandable, "height", contentColumn.height); // Item's flickable must not be interactive when the full expandedHeight fits var flickable = findInvisibleChild(expandable, "__expandableContentFlickable"); compare(flickable.interactive, false); // collapse it and make sure it eventually reaches the collapsedHeight expandable.expanded = false; tryCompare(expandable, "height", expandable.collapsedHeight); } function test_maxExpandingHeight() { // resize the column to something smaller expandablesColumn.height = units.gu(30); // Item's flickable must not be interactive when collapsed var flickable = findInvisibleChild(expandable, "__expandableContentFlickable"); compare(flickable.interactive, false); expandable.expanded = true; tryCompare(expandable, "height", expandablesColumn.height - expandable.collapsedHeight); // Now that we're expanded and don't fit into the parent, flicking must be enabled compare(flickable.interactive, true); } function test_restoreCollapsingFlickable() { // resize the column to something smaller expandablesColumn.height = units.gu(30); expandable.expanded = true; tryCompare(expandable, "height", expandablesColumn.height - expandable.collapsedHeight); var flickable = findInvisibleChild(expandable, "__expandableContentFlickable"); flickable.flick(0, -units.gu(500)) tryCompare(flickable, "flicking", false); // contentY should be off the grid now verify(flickable.contentY != 0); // Now collapse and make sure that the contentY ends up again at 0 expandable.expanded = false; tryCompare(expandable, "height", expandable.collapsedHeight); compare(flickable.contentY, 0); } function cleanup() { // Restore listview height expandablesColumn.height = units.gu(60); // restore collapsed state expandable.expanded = false; tryCompare(expandable, "height", expandable.collapsedHeight); } } } ./tests/unit_x11/tst_components/tst_picker.qml0000644000015600001650000002526012700370701021652 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Pickers 1.0 Item { id: testSuite width: units.gu(40) height: units.gu(71) Flow { anchors.fill: parent Picker { objectName: "linear" id: linearShort circular: false model: objectModel delegate: PickerDelegate { Label {text: modelData} } } Picker { objectName: "linear" id: linearLong circular: false model: longerModel delegate: PickerDelegate { Label {text: modelData} } } Picker { objectName: "objectModelled" id: objectModelled model: objectModel selectedIndex: 2 delegate: PickerDelegate { Label {text: modelData} } } Picker { objectName: "simpleModelled" id: simpleModelled model: emptyModel selectedIndex: 2 delegate: PickerDelegate { Label {text: modelData} } } Picker { objectName: "picker" id: picker } Picker { id: linearDynPicker objectName: "linearDynPicker" model: dynamicModel circular: false delegate: PickerDelegate { Label {text: modelData} } } Picker { id: circularDynPicker objectName: "circularDynPicker" model: dynamicModel circular: true delegate: PickerDelegate { Label { text: modelData ? modelData : "" } } } } ListModel { id: emptyModel } ListModel { id: dynamicModel Component.onCompleted: reset() function reset() { clear(); for (var i = 0; i < 100; i++) { append({"label": "line" + i}); } } } ListModel { id: objectModel ListElement { label: "line1" } ListElement { label: "line2" } ListElement { label: "line3" } } ListModel { id: longerModel ListElement { label: "line1" } ListElement { label: "line2" } ListElement { label: "line3" } ListElement { label: "line4" } ListElement { label: "line5" } ListElement { label: "line6" } } SignalSpy { id: spy } UbuntuTestCase { id: testCase name: "PickerAPI" when: windowShown function waitPickerScrolling() { wait(600); } function getPickerList(item, linear) { return findChild(item, (linear) ? "Picker_Linear" : "Picker_WrapAround"); } function test_0_circular() { compare(picker.circular, true, "default circular"); } function test_0_model() { compare(picker.model, undefined, "default model"); } function test_0_delegate() { compare(picker.delegate, null, "default delegate"); } function test_0_selectedIndex() { compare(picker.selectedIndex, 0, "default selectedIndex"); } function test_1_runtimeModel() { picker.model = emptyModel; compare(picker.selectedIndex, 0, "selectedIndex gets 0"); } function test_1_selectedIndexForEmptyModel() { compare(simpleModelled.selectedIndex, 0, "empty modelled picker selectedIndex is 0"); } function test_1_selectedIndexForObjectModel() { compare(objectModelled.selectedIndex, 2, "model containing data, picker.selectedIndex"); } function test_2_updateModel() { picker.selectedIndex = 1; spy.clear(); spy.signalName = "onSelectedIndexChanged"; spy.target = picker; picker.model = []; tryCompare(spy, "count", 1); } function test_2_updateModel2() { objectModelled.selectedIndex = 1; spy.clear(); spy.signalName = "onSelectedIndexChanged"; spy.target = objectModelled; objectModelled.model = []; tryCompare(spy, "count", 1); } function test_4_clickMovesSelection_Long() { spy.clear(); spy.signalName = "onSelectedIndexChanged"; spy.target = linearLong; mouseClick(linearLong, units.gu(1), units.gu(1)); tryCompare(spy, "count", 0); mouseClick(linearLong, units.gu(1), units.gu(18)); tryCompare(spy, "count", 1); } function test_3_clickMovesSelection_Short() { spy.clear(); spy.signalName = "onSelectedIndexChanged"; spy.target = linearShort; mouseClick(linearShort, units.gu(1), units.gu(1)); tryCompare(spy, "count", 0); mouseClick(linearShort, units.gu(1), units.gu(18)); tryCompare(spy, "count", 1); } function test_5_clickMovesSelection_Long() { spy.clear(); spy.signalName = "onSelectedIndexChanged"; linearLong.circular = true; spy.target = linearLong; mouseClick(linearLong, units.gu(1), units.gu(1)); waitPickerScrolling(); tryCompare(spy, "count", 1); mouseClick(linearLong, units.gu(1), units.gu(18)); waitPickerScrolling(); tryCompare(spy, "count", 2); } function test_6_pickerCircularChange() { var expectedList = picker.circular ? "Picker_WrapAround" : "Picker_Linear"; verify(findChild(picker, expectedList) !== undefined, "Picker must use " + expectedList); picker.circular = !picker.circular; expectedList = picker.circular ? "Picker_WrapAround" : "Picker_Linear"; verify(findChild(picker, expectedList) !== undefined, "circular changed, Picker must use " + expectedList); } function test_7_modelCropping() { var selected = 50; linearDynPicker.selectedIndex = selected; circularDynPicker.selectedIndex = selected; waitPickerScrolling(); var linearList = getPickerList(linearDynPicker, true); var circularList = getPickerList(circularDynPicker, false); selected = 40; dynamicModel.remove(selected, dynamicModel.count - selected); waitPickerScrolling(); compare(linearList.count, selected, "bad removal from linearList") compare(linearDynPicker.selectedIndex, selected - 1, "bad index of linearList"); compare(circularList.count, selected , "bad removal from circularList") compare(circularDynPicker.selectedIndex, selected - 1, "bad index of circularList"); // remove from the middle selected = 10; dynamicModel.remove(selected, 10); waitPickerScrolling(); compare(linearList.count, 30, "bad removal from linearList") compare(linearDynPicker.selectedIndex, 29, "bad index of linearList"); compare(circularList.count, 30, "bad removal from circularList") compare(circularDynPicker.selectedIndex, 29, "bad index of circularList"); // move selection in front and remove from after linearDynPicker.selectedIndex = 10; circularDynPicker.selectedIndex = 10; dynamicModel.remove(20, 10); waitPickerScrolling(); compare(linearList.count, 20, "bad removal from linearList") compare(linearDynPicker.selectedIndex, 10, "bad index of linearList"); compare(circularList.count, 20, "bad removal from circularList") compare(circularDynPicker.selectedIndex, 10, "bad index of circularList"); // remove 6 items around selectedIndex dynamicModel.remove(5, 6); waitPickerScrolling(); compare(linearList.count, 14, "bad removal from linearList") compare(linearDynPicker.selectedIndex, 4, "bad index of linearList"); compare(circularList.count, 14, "bad removal from circularList") compare(circularDynPicker.selectedIndex, 4, "bad index of circularList"); } function test_8_modelReset() { var linearList = getPickerList(linearDynPicker, true); var circularList = getPickerList(circularDynPicker, false); dynamicModel.reset(); waitPickerScrolling(); compare(linearList.currentIndex, 0, "linear picker's itemList selection not reset"); compare(circularList.currentIndex, 0, "circular picker's itemList selection not reset"); compare(linearDynPicker.selectedIndex, 0, "linear picker's selection not reset"); compare(circularDynPicker.selectedIndex, 0, "circular picker's selection not reset"); } function test_9_modelClear() { var linearList = getPickerList(linearDynPicker, true); var circularList = getPickerList(circularDynPicker, false); dynamicModel.clear(); waitPickerScrolling(); compare(linearList.currentIndex, -1, "linear picker's itemList selection not reset"); expectFailContinue("", "PathView issue: https://bugreports.qt-project.org/browse/QTBUG-35400"); compare(circularList.currentIndex, -1, "circular picker's itemList selection not reset"); compare(linearDynPicker.selectedIndex, -1, "linear picker's selection not reset"); expectFailContinue("", "PathView issue: https://bugreports.qt-project.org/browse/QTBUG-35400"); compare(circularDynPicker.selectedIndex, -1, "circular picker's selection not reset"); } } } ./tests/unit_x11/tst_components/tst_shortcuts.qml0000644000015600001650000001571712700370701022441 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 Item { id: root width: 400 height: 600 // actions must be either assigned to an active ActionContext or to an ActionItem to activate shortcuts ActionContext { id: context active: true Action { id: action } Action { id: other shortcut: 'Ctrl+G' } } TestUtil { id: util } UbuntuTestCase { id: testCase name: "Shortcuts" when: windowShown function initTestCase() { } function init() { context.active = true; spy.target = action; } function cleanup() { spy.clear(); shortcutSpy.clear(); } SignalSpy { id: spy signalName: 'triggered' target: action } function ignoreQMLWarning(message) { ignoreWarning(util.callerFile() + message); } function test_shortcut_triggered_data() { return [ { tag: 'Multiple modifiers and letter', shortcut: 'Ctrl+Shift+Alt+A', key: Qt.Key_A, mod: Qt.ControlModifier + Qt.ShiftModifier + Qt.AltModifier }, { tag: 'Modifier and letter', shortcut: 'Ctrl+A', key: Qt.Key_A, mod: Qt.ControlModifier }, { tag: 'Single letter', shortcut: 'E', key: Qt.Key_E, mod: Qt.NoModifier }, { tag: 'StandardKey', shortcut: StandardKey.Copy, key: Qt.Key_C, mod: Qt.ControlModifier } ]; } function test_shortcut_triggered(data) { action.shortcut = data.shortcut; spy.clear(); keyClick(data.key, data.mod); spy.wait(); } function test_shortcut_invalid_data() { return [ { tag: 'Typo', shortcut: 'Ctr+F' }, { tag: 'Number', shortcut: 1234567890 }, { tag: "Empty string", shortcut: "" } ]; } function test_shortcut_invalid(data) { ignoreQMLWarning(':31:9: QML Action: Invalid shortcut: '); action.shortcut = data; } function test_shortcut_duplicate() { ignoreQMLWarning(':34:9: QML Action: Ambiguous shortcut: Ctrl+G'); action.shortcut = other.shortcut; keyClick(Qt.Key_G, Qt.ControlModifier); } SignalSpy { id: shortcutSpy signalName: "shortcutChanged" } function test_shortcut_reset_bug1518420() { shortcutSpy.target = action; action.shortcut = "Ctrl+A"; shortcutSpy.wait(200); shortcutSpy.clear(); action.shortcut = undefined; shortcutSpy.wait(200); shortcutSpy.target = null; } function test_mnemonic_data() { return [ {tag: "HW keyboard, valid 'C&all'", kbd: true, text: "C&all", displayText: "Call", key: Qt.Key_A, xfail: false}, {tag: "HW keyboard, valid '&Save & Exit", kbd: true, text: "&Save & Exit", displayText: "Save & Exit", key: Qt.Key_S, xfail: false}, {tag: "HW keyboard, valid 'Hide &Seek'", kbd: true, text: "Hide&Seek", displayText: "HideSeek", key: Qt.Key_S, xfail: false}, {tag: "HW keyboard, valid 'Save & Exit'", kbd: true, text: "Save & Exit", displayText: "Save Exit", key: Qt.Key_Space, xfail: false}, {tag: "HW keyboard, valid 'Paste &&&Proceed'", kbd: true, text: "Paste &&&Proceed", displayText: "Paste &&Proceed", key: Qt.Key_P, xfail: false}, {tag: "HW keyboard, valid 'Cut &$'", kbd: true, text: "Cut &$", displayText: "Cut $", key: Qt.Key_Dollar, xfail: false}, {tag: "HW keyboard, valid 'At &@'", kbd: true, text: "At &@", displayText: "At @", key: Qt.Key_At, xfail: false}, {tag: "HW keyboard, valid '&_'", kbd: true, text: "&_", displayText: "_", key: Qt.Key_Underscore, xfail: false}, {tag: "HW keyboard, invalid '&&Call'", kbd: true, text: "&&Call", displayText: "&&Call", key: Qt.Key_Asterisk, xfail: true}, {tag: "HW keyboard, invalid 'Jump &'", kbd: true, text: "Jump &", displayText: "Jump &", key: Qt.Key_Asterisk, xfail: true}, {tag: "HW keyboard, invalid '&&'", kbd: true, text: "&&", displayText: "&&", key: Qt.Key_Asterisk, xfail: true}, {tag: "no HW keyboard", kbd: false, text: "&Call", displayText: "Call", key: Qt.Key_C, xfail: false}, ]; } function test_mnemonic(data) { QuickUtils.keyboardAttached = data.kbd; action.text = data.text; if (!data.kbd && QuickUtils.keyboardAttached) { skip("Cannot test this case: " + data.tag); } compare(action.text, data.displayText); // shortcut keyClick(data.key, Qt.AltModifier); if (data.xfail) { expectFail(data.tag, "invalid mnemonic"); } spy.wait(200); } SignalSpy { id: textSpy target: action signalName: "textChanged" } function test_mnemonic_displaytext() { QuickUtils.keyboardAttached = false; if (QuickUtils.keyboardAttached) { skip("the test needs to be able to detach the keyboard"); } action.text = "&Call"; textSpy.clear(); QuickUtils.keyboardAttached = true; if (!QuickUtils.keyboardAttached) { skip("the test needs to be able to attach the keyboard"); } textSpy.wait(200); } function test_contextual_action_shortcut_data() { return [ {tag: "Active context", active: true, xfail: false}, {tag: "Inactive context", active: false, xfail: true}, ]; } function test_contextual_action_shortcut(data) { context.active = data.active; spy.target = other; spy.clear(); keyClick(Qt.Key_G, Qt.ControlModifier); if (data.xfail) { expectFailContinue("", "No shortcut fires"); } spy.wait(200); } } } ./tests/unit_x11/tst_components/ScrollbarTestCase.qml0000644000015600001650000002627312700370714023073 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Andrea Bernabei */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Test 1.0 UbuntuTestCase { when: windowShown //every test will assign the current view component (that is dynamically created) to this var //so that the cleanup() will destroy it (thus releasing mouse etc) even when a test fails midway property var currComponent: null //side == false -> set contentHeight //side == true -> set contentWidth function setVeryLongContentItem(flickable, style, side) { if (!side) { flickable.contentHeight = flickable.height * 10 + 1 } else { flickable.contentWidth = flickable.width * 10 + 1 } //NOTE: THE TESTS ARE ASSUMING THAT WE DO THIS CHECK HERE //we have the check here because we want veryLongContentItem to be true //even, for instance, when we're checking a horizontal scrollbar and the very //long side is the height (so that when you have vert and hor scrollbars their //you can't have that one is in indicator style while the other is in thumb style) compare(style.veryLongContentItem, true, "Wrong veryLongContentItem value.") } function addContentMargins(flickable) { //note, these are content margins, not anchor margins flickable.topMargin = units.gu(2) flickable.bottomMargin = units.gu(3) flickable.leftMargin = units.gu(4) flickable.rightMargin = units.gu(5) compare(flickable.topMargin, units.gu(2), "Wrong topMargin") compare(flickable.bottomMargin, units.gu(3), "Wrong bottomMargin") compare(flickable.leftMargin, units.gu(4), "Wrong leftMargin") compare(flickable.rightMargin, units.gu(5), "Wrong rightMargin") } //this assumes we're not dealing with dynamic originX/Y //but it takes content margins into account function setContentPositionToTopLeft(flickable) { flickable.contentX = -flickable.leftMargin flickable.contentY = -flickable.topMargin } function setContentPositionToTopRight(flickable) { flickable.contentX = flickable.contentWidth + flickable.rightMargin - flickable.width flickable.contentY = -flickable.topMargin } function setContentPositionToBottomLeft(flickable) { flickable.contentX = -flickable.leftMargin flickable.contentY = flickable.contentHeight + flickable.bottomMargin - flickable.height } function setContentPositionToBottomRight(flickable) { flickable.contentX = flickable.contentWidth + flickable.rightMargin - flickable.width flickable.contentY = flickable.contentHeight + flickable.bottomMargin - flickable.height } function findInListProperty(listProperty, objectName) { for (var i = 0; i < listProperty.length; ++i) { if (listProperty[i].objectName === objectName) return listProperty[i] } return null } function setupSignalSpy(spy, target, signalName) { spy.clear() //reset signalName otherwise it will look for the old signalName in the new target spy.signalName = "" spy.target = target spy.signalName = signalName } function warningMsg(msg) { return testUtil.callerFile() + ": " + msg } //to promote code reuse function dragThumbForwardAndCheckPos_noRelease(scrollbar, flickable, firstStep, secondStep) { verify(scrollbar !== undefined, "Scrollbar reference must be valid.") verify(flickable !== undefined, "Flickable reference must be valid.") var thumb = getThumb(scrollbar) var style = scrollbar.__styleInstance var contentXBackup = flickable.contentX var contentYBackup = flickable.contentY compare(style.isScrollable, true, "Item is assumed to be scrollable.") setupSignalSpy(signalSpy, thumb, style.isVertical ? "onYChanged" : "onXChanged") mousePress(thumb, 0, 0) mouseMove(thumb, (style.isVertical ? 0 : firstStep), (style.isVertical ? firstStep : 0)) mouseMove(thumb, (style.isVertical ? 0 : secondStep), (style.isVertical ? secondStep : 0)) signalSpy.wait() if (style.isVertical) { verify(flickable.contentY !== contentYBackup, "Check that mouse drag changed contentY." ) compare(flickable.contentX, contentXBackup, "Vertical thumb drag must not change contentX") } else { verify(flickable.contentX !== contentXBackup, "Check that mouse drag changed contentX." ) compare(flickable.contentY, contentYBackup, "Horizontal thumb drag must not change contentY") } } //check that the view moves by the amount defined in the styling //i.e. a small amount when clicking on steppers or arrow hw keys //and a bigger amount when clicking on the trough or PageUp/Down function checkScrolling(flickable, oldContentX, oldContentY, style, longScrolling, direction, msgPrefix) { var verticalScrolling = style.isVertical var scrollingRatio = longScrolling ? style.longScrollingRatio : style.shortScrollingRatio var sizeProp = verticalScrolling ? flickable.height : flickable.width var directionFactor = direction < 0 ? -1 : 1 var newContentProp = (verticalScrolling ? oldContentY : oldContentX) + directionFactor * sizeProp * scrollingRatio var contentPropName = verticalScrolling ? "contentY" : "contentX" var nonScrollingPropName = verticalScrolling ? "contentX" : "contentY" var errorMsg = msgPrefix + ": wrong " + contentPropName + "." tryCompare(flickable, contentPropName, newContentProp, 5000, errorMsg) wait(150) compare(flickable[contentPropName], newContentProp, errorMsg) //the other scrolling property should not be affected compare(flickable[nonScrollingPropName], (verticalScrolling ? oldContentX : oldContentY), msgPrefix + ": " + nonScrollingPropName + " should have not changed.") } function checkNoContentPositionChange(msgPrefix, flickable, expectedContentX, expectedContentY) { compare(flickable.contentX, expectedContentX, msgPrefix + " handling: unexpected contentX change.") compare(flickable.contentY, expectedContentY, msgPrefix + " handling: unexpected contentY change.") } function getScrollbarUtils(scrollbar) { var utils = findInvisibleChild(scrollbar.__styleInstance, "scrollbarUtils") verify(utils !== null, "Returning a valid reference to scrollbarUtils.") return utils } function findChildAndCheckValidInstance(object, childObjectName) { var obj = findChild(object, childObjectName) verify(obj !== null, "Returning a valid reference to the object with objectName " + childObjectName + ".") return obj } //move mouse over the scrollbar and wait for the transition to steppers style to complete function triggerSteppersMode(scrollbar) { var steppersTransition = findInListProperty(scrollbar.__styleInstance.transitions, "anythingToThumbSteppersTransition") verify(steppersTransition !== null, "Valid steppers transition instance found.") //trigger steppers style and wait for the transition to complete tryCompare(scrollbar.__styleInstance, "state", "hidden") mouseMove(scrollbar, 0, 0) tryCompare(steppersTransition, "running", true) tryCompare(scrollbar.__styleInstance, "state", "steppers") tryCompare(steppersTransition, "running", false) //This is hackish, but there doesn't seem to be a way around. //We have to wait for the Flow component to pick up the changes on steppers size //(which are now appearing due to the move to "steppers" state). A wait(0) will //force it to wait for the next event loop, where Flow will have already updated //the position of its children. wait(0) } //check that the scrollbar is using the hinting logic function checkHinting(scrollbar) { tryCompare(scrollbar.__styleInstance, "__hinting", true) tryCompare(scrollbar.__styleInstance, "state", scrollbar.__styleInstance.veryLongContentItem ? "thumb" : "indicator") tryCompare(scrollbar.__styleInstance, "opacity", scrollbar.__styleInstance.overlayOpacityWhenShown) } //make sure the scrollbar is now scrollable function checkScrollableAndHidden(scrollbar) { tryCompare(scrollbar.__styleInstance, "isScrollable", true) tryCompare(scrollbar.__styleInstance, "state", "hidden") tryCompare(scrollbar.__styleInstance, "opacity", scrollbar.__styleInstance.overlayOpacityWhenHidden) } //make sure that the scrollbar is in the state it should be in //when the item is not scrollable //tryCompare is needed to avoid checking the properties before the related bindings are evaluated function checkNonScrollableState(scrollbar) { tryCompare(scrollbar.__styleInstance, "isScrollable", false) tryCompare(scrollbar.__styleInstance, "state", "") tryCompare(scrollbar.__styleInstance, "opacity", scrollbar.__styleInstance.overlayOpacityWhenHidden) } //defines how far the mouse has to be from the scrollbar before the drag is reset and temporarily disabled function dragResetThreshold(scrollbar) { return scrollbar.__styleInstance.troughThicknessSteppersStyle * 10 } function clickInTheMiddle(item, button, modifiers, delay) { mouseClick(item, item.width/2, item.height/2, button, modifiers, delay) } //Centralize object lookups to avoid problems when changing object names function getFirstStepper(scrollbar) { return findChildAndCheckValidInstance(scrollbar.__styleInstance, "firstStepper") } function getSecondStepper(scrollbar) { return findChildAndCheckValidInstance(scrollbar.__styleInstance, "secondStepper") } function getTrough(scrollbar) { return findChildAndCheckValidInstance(scrollbar.__styleInstance, "trough") } function getThumb(scrollbar) { return findChildAndCheckValidInstance(scrollbar.__styleInstance, "interactiveScrollbarThumb") } function getThumbArea(scrollbar) { return findChildAndCheckValidInstance(scrollbar.__styleInstance, "thumbArea") } function getScrollAnimation(scrollbar) { var anim = findInvisibleChild(scrollbar.__styleInstance, "scrollAnimation") verify(anim !== null, "Returning a valid reference to scrollAnimation.") return anim } } ./tests/unit_x11/tst_components/tst_sections.qml0000644000015600001650000004621612700370714022234 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 Rectangle { id: root width: units.gu(60) height: units.gu(75) color: "white" property list actionList: [ Action { text: "action 0"; onTriggered: label.text = "First action triggered."; }, Action { text: "action 1"; onTriggered: label.text = "Second action triggered."; }, Action { text: "action 2"; onTriggered: label.text = "Third action triggered."; } ] property var stringList: [ "string zero", "string one", "string two" ] property var longStringList: [ "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty" ] Column { id: column anchors { left: parent.left right: parent.right top: parent.top margins: units.gu(2) } spacing: units.gu(2) Sections { // Not used in the tests below, but added here to // verify that the Actions can be defined directly // inside the list of actions. actions: [ Action { text: "inline action 0" }, Action { text: "inline action 1" } ] width: parent.width } Rectangle { anchors { left: parent.left right: parent.right margins: units.gu(2) } color: UbuntuColors.blue height: units.gu(5) Label { id: label anchors.centerIn: parent text: "No action triggered." color: "white" } } Sections { id: enabledSections actions: root.actionList width: parent.width // set width > implicitWidth to test for bug 1551356 below. } Sections { id: disabledSections actions: root.actionList enabled: false } Sections { id: noSelectionSections actions: root.actionList selectedIndex: -1 } Sections { id: enabledStringSections model: root.stringList } Sections { id: disabledStringSections model: root.stringList enabled: false } Sections { id: selectedIndexSections property bool action0Triggered: false; property bool action1Triggered: false; property bool action2Triggered: false; property Action action0: Action { text: "action0" onTriggered: selectedIndexSections.action0Triggered = true; } property Action action1: Action { text: "action1 (selected)" onTriggered: selectedIndexSections.action1Triggered = true; } property Action action2: Action { text: "action2" onTriggered: selectedIndexSections.action2Triggered = true; } actions: [action0, action1, action2] selectedIndex: 1 } Sections { id: scrollingSections model: root.longStringList width: parent.width } } UbuntuTestCase { id: testCase name: "SectionsApi" when: windowShown function initTestCase() { // The initially selected actions must be triggered. compare(label.text, "First action triggered.", "The first action was not triggered automatically."); compare(selectedIndexSections.action0Triggered, false, "Action 0 was triggered with selectedIndex: 1."); compare(selectedIndexSections.action1Triggered, true, "Action 1 was not automatically triggered with selectedIndex: 1."); } function init() { enabledSections.actions = root.actionList; enabledSections.model = root.actionList; enabledSections.selectedIndex = 0; disabledSections.selectedIndex = 0; enabledStringSections.selectedIndex = 0; disabledStringSections.selectedIndex = 0; label.text = "No action triggered." wait_for_animation(enabledSections); } function wait_for_animation(sections) { var listView = findChild(sections, "sections_listview"); if (!listView.moving) { // wait for potential animation to start wait(100); } tryCompare(listView, "moving", false, 2000); } function get_number_of_section_buttons(sections) { var listview = findChild(sections, "sections_listview"); return listview.count; } // return the index of the selected section button, // or -1 if no selected section button is found. function get_selected_section_button_index(sections) { var n = get_number_of_section_buttons(sections); var button; for (var i=0; i < n; i++) { button = findChild(sections, "section_button_"+i); if (button.selected) { return i; } } return -1; } function get_selected_section_button_text(sections) { var index = get_selected_section_button_index(sections); if (index < 0) return "BUTTON NOT FOUND."; var button = findChild(sections, "section_button_label_"+index); return button.text; } function click_section_button(sections, sectionName) { var index = -1; var object; for (index = 0; index < sections.model.length; index++) { object = sections.model[index]; // object may be a string or an Action if (object.hasOwnProperty("text")) { if (object.text === sectionName) { break; } } else { if (object === sectionName) { break; } } } verify(index >= 0, "Button with name \'"+sectionName+"\' not found."); var button = findChild(sections, "section_button_"+index); mouseClick(button, button.width/2, button.height/2); } function check_selected_section(sections, index, name) { var v = sections.selectedIndex; compare(v, index, "selectedIndex " + v + " does not match " + index); v = get_selected_section_button_index(sections); compare(v, index, "selected button index " + v + " does not match " + index); if (v === -1) return; var w = get_selected_section_button_text(sections); compare(w, name, "selected button text \'" + w + "\' does not match \'" + name + "\'"); } // in each test function below, test the desired behavior // for both enabledSections and disabledSections. function test_0_first_section_initially_selected_actions_enabled() { check_selected_section(enabledSections, 0, "action 0"); } function test_0_first_section_initially_selected_actions_disabled() { check_selected_section(disabledSections, 0, "action 0"); } function test_0_first_section_initially_selected_strings_enabled() { check_selected_section(enabledStringSections, 0, "string zero"); } function test_0_first_section_initially_selected_strings_disabled() { check_selected_section(disabledStringSections, 0, "string zero"); } function test_0_no_selected_section_initalization() { check_selected_section(noSelectionSections, -1, ""); } function test_number_of_section_buttons() { var n = root.actionList.length; compare(get_number_of_section_buttons(enabledSections), n, "Showing incorrect number of sections."); compare(get_number_of_section_buttons(disabledSections), n, "Showing incorrect number of disabled sections.") } function test_click_to_select_section_and_trigger_action() { var index = 2; var name = "action 2"; click_section_button(enabledSections, name); wait_for_animation(enabledSections); check_selected_section(enabledSections, index, name); var text = "Third action triggered."; compare(label.text, text, "Action for clicked button not triggered."); } function test_click_disabled_section_action() { var index = 2; var name = "action 2"; click_section_button(disabledSections, name); wait_for_animation(disabledSections); // first button should still be selected: index = 0; name = "action 0"; check_selected_section(disabledSections, index, name); var text = "No action triggered."; compare(label.text, text, "Clicking disabled button triggered something."); } function test_click_to_select_section_string() { var index = 2; var name = "string two"; click_section_button(enabledStringSections, name); wait_for_animation(enabledStringSections); check_selected_section(enabledStringSections, index, name); } function test_click_disabled_section_string() { var name = "string two"; click_section_button(disabledStringSections, name); wait_for_animation(disabledStringSections); // first button should still be selected: var index = 0; name = "string zero"; check_selected_section(disabledStringSections, index, name); } function test_set_selectedIndex_to_select_section_and_trigger_action_enabled() { var index = 1; var name = "action 1"; enabledSections.selectedIndex = index; wait_for_animation(enabledSections); check_selected_section(enabledSections, index, name); var text = "Second action triggered."; compare(label.text, text, "Changing selected index did not trigger action."); } function test_set_selectedIndex_to_select_section_and_trigger_action_disabled() { var index = 2; var name = "action 2"; disabledSections.selectedIndex = index; wait_for_animation(disabledSections); check_selected_section(disabledSections, index, name); var text = "Third action triggered."; compare(label.text, text, "Changing selected index for disabled Sections " + "did not trigger action."); } function test_set_selectedIndex_to_select_section_string_enabled() { var index = 1; var name = "string one"; enabledStringSections.selectedIndex = index; wait_for_animation(enabledStringSections); check_selected_section(enabledStringSections, index, name); } function test_set_selectedIndex_to_select_section_string_disabled() { var index = 2; var name = "string two"; disabledStringSections.selectedIndex = index; check_selected_section(disabledStringSections, index, name); } function test_selectedIndex_when_model_changes_bug1513933() { enabledSections.model = ["1", "2", "3"]; enabledSections.selectedIndex = 2; enabledSections.model = ["1", "2"]; wait_for_animation(enabledSections); compare(enabledSections.selectedIndex, 0, "Changing the model does not set the selected index to 0."); check_selected_section(enabledSections, 0, "1"); enabledSections.model = []; wait_for_animation(enabledSections); compare(enabledSections.selectedIndex, -1, "Setting an empty model does not set the selected index to -1."); enabledSections.model = ["1", "2", "3"]; wait_for_animation(enabledSections); compare(enabledSections.selectedIndex, 0, "Setting a non-empty model does not set the selected index to 0."); check_selected_section(enabledSections, 0, "1"); } function test_model_changes_triggers_action_0() { selectedIndexSections.action0Triggered = false; selectedIndexSections.action1Triggered = false; selectedIndexSections.action2Triggered = false; var originalActions = selectedIndexSections.actions; selectedIndexSections.actions = [ selectedIndexSections.action0, selectedIndexSections.action2 ] wait_for_animation(selectedIndexSections); compare(selectedIndexSections.action0Triggered, true, "Changing the model does not trigger the first action."); compare(selectedIndexSections.action1Triggered, false, "Changing the model triggers the second action."); compare(selectedIndexSections.action2Triggered, false, "Changing the model triggers the third action."); selectedIndexSections.actions = originalActions; wait_for_animation(selectedIndexSections); } SignalSpy { id: contentXChangedSpy signalName: "contentXChanged" } function test_click_disabled_scroll_button_bug1551356() { var listView = findChild(enabledSections, "sections_listview"); var icon = findChild(enabledSections, "left_scroll_icon"); contentXChangedSpy.target = listView; contentXChangedSpy.clear(); compare(listView.contentX, 0.0, "listView is not at the leftmost position initially."); mouseClick(icon, icon.width/2, icon.height/2); wait(200); // give the listview ample time to scroll compare(contentXChangedSpy.count, 0, "listView moved when clicking disabled scroll button."); contentXChangedSpy.clear(); contentXChangedSpy.target = null; } SignalSpy { id: animationStartedSpy signalName: "started" } function test_press_release_on_different_icons() { var leftIcon = findChild(scrollingSections, "left_scroll_icon"); var rightIcon = findChild(scrollingSections, "right_scroll_icon"); var animation = findInvisibleChild(scrollingSections, "sections_scroll_animation"); animationStartedSpy.target = animation; compare(leftIcon.width, rightIcon.width, "Scroll icons are not the same width."); compare(leftIcon.height, rightIcon.height, "Scroll icons are not the same height."); var w = leftIcon.width / 2; var h = leftIcon.height / 2; mouseMove(leftIcon, w, h); mousePress(leftIcon, w, h); mouseMove(rightIcon, w, h); mouseRelease(rightIcon, w, h); wait(200); compare(animationStartedSpy.count, 0, "Clicked signal came after pressing left icon and releasing on right icon."); mousePress(rightIcon, w, h); mouseMove(leftIcon, w, h); mouseRelease(leftIcon, w, h); wait(200); compare(animationStartedSpy.count, 0, "Clicked signal came after pressing right icon and releasing on left icon."); animationStartedSpy.target = null; } function test_keyboard_navigation_data() { return [ { tag: "actions", item: enabledSections, initialButton: root.actionList[0].text, initialIndex: 0 }, { tag: "strings", item: enabledStringSections, initialButton: root.stringList[0], initialIndex: 0 }, { tag: "scrolling", item: scrollingSections, initialButton: root.longStringList[0], initialIndex: 0 } ]; } function test_keyboard_navigation(data) { var sections = data.item; var initialButtonName = data.initialButton; click_section_button(sections, initialButtonName); wait_for_animation(sections); compare(sections.selectedIndex, data.initialIndex, "Clicking the initial button does not select section "+data.initialIndex); var numberOfSections = sections.model.length; var i = sections.selectedIndex; // Sections has focus because it was just clicked on, // so we can use keyboard navigation. while (i < numberOfSections - 1) { i++; keyClick(Qt.Key_Right); wait_for_animation(sections); compare(sections.selectedIndex, i, "Could not navigate to index " + i + " using right key."); } // Navigated to the last section. Right key should do nothing now. keyClick(Qt.Key_Right); wait_for_animation(sections); compare(sections.selectedIndex, i, "Using right key navigates beyond the last section."); while (i > 0) { i--; keyClick(Qt.Key_Left); wait_for_animation(sections); compare(sections.selectedIndex, i, "Could not navigate back to index " + i + " using left key."); } // Navigated back to the beginning. Left key should do nothing now. keyClick(Qt.Key_Left); wait_for_animation(sections); compare(sections.selectedIndex, i, "Using left key navigates beyond the first section."); } } } ./tests/unit_x11/tst_components/tst_contextual_actions.qml0000644000015600001650000002342212700370701024301 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 Item { width: units.gu(40) height: units.gu(71) Loader { id: testLoader anchors.fill: parent } Component { id: inactiveActionContextInChain Item { anchors.fill: parent ActionContext { active: true } Item { anchors.fill: parent ActionContext { objectName: "testContext" active: true } ActionItem { objectName: "testActionItem" action: Action { text: "Test" shortcut: 'Ctrl+T' } } } } } Component { id: ambiguiousShortcutsInSameContext Item { ActionContext { active: true } Column { ActionItem { action: Action { shortcut: "Ctrl+T" } } ActionItem { action: Action { shortcut: "Ctrl+T" } } } } } Component { id: ambiguiousShortcutsInDifferentContexts Item { id: root anchors.fill: parent ActionContext { active: true } Row { Item { width: root.width / 2 height: root.height ActionContext { active: true } ActionItem { action: Action { shortcut: "Ctrl+T" } } } Item { width: root.width / 2 height: root.height ActionContext { active: true } ActionItem { action: Action { shortcut: "Ctrl+T" } } } } } } Component { id: onePopupContextActive Item { PopupContext { objectName: "popup1" active: true } PopupContext { objectName: "popup2" } PopupContext { objectName: "popup3" } } } Component { id: popupTest MainView { id: main anchors.fill: parent applicationName: "testApp" property Popover popover: null Button { id: button objectName: "mainButton" anchors.centerIn: parent action: Action { objectName: "mainAction" text: "Test &button" shortcut: "Ctrl+T" } onClicked: main.popover = PopupUtils.open(popup, button) } Component { id: popup Popover { contentWidth: units.gu(30) contentHeight: units.gu(30) Button { objectName: "popupButton" action: Action { objectName: "popupAction" text: "Test &button" shortcut: "Ctrl+T" } } } } } } Component { id: dialogTest MainView { id: main anchors.fill: parent applicationName: "testApp" property Dialog popover: null Button { id: button objectName: "mainButton" anchors.centerIn: parent action: Action { objectName: "mainAction" text: "Test &button" shortcut: "Ctrl+T" } onClicked: main.popover = PopupUtils.open(dialog) } Component { id: dialog Dialog { contentWidth: units.gu(30) contentHeight: units.gu(30) Button { objectName: "popupButton" action: Action { objectName: "popupAction" text: "Test &button" shortcut: "Ctrl+T" } } } } } } UbuntuTestCase { name: "ContextualActions" when: windowShown SignalSpy { id: triggeredSpy signalName: "triggered" } function createTest(component) { testLoader.sourceComponent = component; tryCompareFunction(function() { return testLoader.item != null }, true, 1000); waitForRendering(testLoader.item); wait(200) return testLoader.item; } function cleanup() { testLoader.sourceComponent = null; triggeredSpy.target = null; triggeredSpy.clear(); wait(200); } function test_inactive_actioncontext_in_chain() { var item = createTest(inactiveActionContextInChain); var testContext = findInvisibleChild(item, "testContext"); verify(testContext); var testActionItem = findInvisibleChild(item, "testActionItem"); verify(testActionItem); testContext.active = true; triggeredSpy.target = testActionItem.action; keyPress(Qt.Key_T, Qt.ControlModifier); triggeredSpy.wait(200); testContext.active = false; triggeredSpy.clear(); keyPress(Qt.Key_T, Qt.ControlModifier); expectFailContinue("", "No trigger when a context is inactive"); triggeredSpy.wait(200); } function test_ambiguous_actions_when_multiple_contexts_active_data() { return [ {tag: "within same ActionContext", test: ambiguiousShortcutsInSameContext, message: warningFormat(66, 29, "QML Action: Ambiguous shortcut: Ctrl+T")}, {tag: "within different ActionContexts", test: ambiguiousShortcutsInDifferentContexts, message: warningFormat(107, 33, "QML Action: Ambiguous shortcut: Ctrl+T")}, ]; } function test_ambiguous_actions_when_multiple_contexts_active(data) { var test = createTest(data.test); ignoreWarning(data.message); keyClick(Qt.Key_T, Qt.ControlModifier); } function test_one_popup_context_active() { var test = createTest(onePopupContextActive); var popup1 = findInvisibleChild(test, "popup1"); var popup2 = findInvisibleChild(test, "popup2"); var popup3 = findInvisibleChild(test, "popup3"); verify(popup1); verify(popup2); verify(popup3); verify(popup1.active); verify(!popup2.active); verify(!popup3.active); // activate popup2 popup2.active = true; verify(!popup1.active); verify(popup2.active); verify(!popup3.active); // activate popup2 popup3.active = true; verify(!popup1.active); verify(!popup2.active); verify(popup3.active); // deactivate popup3, popup2 should be re-activated popup3.active = false; verify(!popup1.active); verify(popup2.active); } function test_popovers_data() { return [ {tag: "Popup", component: popupTest}, {tag: "Dialog", component: dialogTest}, ]; } function test_popovers(data) { var test = createTest(data.component); var mainButton = findChild(test, "mainButton"); verify(mainButton); triggeredSpy.target = mainButton.action; keyClick(Qt.Key_T, Qt.ControlModifier); triggeredSpy.wait(200); mouseClick(mainButton, centerOf(mainButton).x, centerOf(mainButton).y); tryCompareFunction(function() { return test.popover != null;}, true, 1000); // trigger the action triggeredSpy.clear(); keyClick(Qt.Key_T, Qt.ControlModifier); expectFailContinue(data.tag, "Popup is active now"); triggeredSpy.wait(200); var actionItem = findChild(test.popover, "popupButton"); verify(actionItem); triggeredSpy.target = actionItem.action; triggeredSpy.clear(); keyClick(Qt.Key_B, Qt.AltModifier); triggeredSpy.wait(200); } } } ./tests/unit_x11/tst_components/ListItemTestCase13.qml0000644000015600001650000001256412700370714023044 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.3 import Ubuntu.Components 1.3 /* * Common test case functions for ListItem. A CPO for unit tests. */ UbuntuTestCase { when: windowShown SignalSpy { id: signalSpy } // set up the spy component for an item and a signal function setupSpy(item, signalName) { if (item.hasOwnProperty("leadingActions")) { signalSpy.target = item; signalSpy.signalName = signalName; signalSpy.clear(); } } // wait on the previosuly set up spy function spyWait(timeout) { if (timeout == undefined) { timeout = 500; } if (signalSpy.target) { signalSpy.wait(timeout); signalSpy.clear(); signalSpy.target = null; } else { wait(timeout); } } // rebounds a ListItem function rebound(item, watchTarget) { if (watchTarget === undefined) { watchTarget = item; } if (watchTarget.contentItem.x != watchTarget.contentItem.anchors.leftMargin) { mouseClick(item, 1, 1); tryCompareFunction(function() { return watchTarget.contentItem.x == watchTarget.contentItem.anchors.leftMargin; }, true, 500); } } // delayed swipe, gives few millisecond timeout between each move // so Repeater has time to create the panel actions in style function swipe(item, x, y, dx, dy) { setupSpy(item, "contentMovementEnded"); flick(item, x, y, dx, dy, 0, 0, undefined, undefined, 100); spyWait(); } function swipeNoWait(item, x, y, dx, dy) { flick(item, x, y, dx, dy, 0, 0, undefined, undefined, 100); } // touch swipes function swipeTouch(touchId, item, x, y, dx, dy) { setupSpy(item, "contentMovementEnded"); flickTouch(touchId, item, x, y, dx, dy, 0, 100); spyWait(); } function swipeTouchNoWait(touchId, item, x, y, dx, dy) { flickTouch(touchId, item, x, y, dx, dy, 0, 100); } function tug(item, x, y, dx, dy) { setupSpy(item, "contentMovementEnded"); TestExtras.touchDrag(0, item, Qt.point(x, y), Qt.point(dx, dy)); spyWait(); } function tugNoWait(item, x, y, dx, dy) { TestExtras.touchDrag(0, item, Qt.point(x, y), Qt.point(dx, dy)); } // returns the leading or trailing panel item function panelItem(item, leading) { return findInvisibleChild(item, (leading ? "ListItemPanelLeading" : "ListItemPanelTrailing")); } function toggleSelectMode(view, enabled, scrollToTop) { if (view.hasOwnProperty("positionViewAtBeginning") && scrollToTop) { // use the topmost listItem to wait for rendering completion view.positionViewAtBeginning(); } var listItem = findChild(view, "listItem0"); verify(listItem); view.ViewItems.selectMode = enabled; // waitForRendering aint seems to be reliable here, so we wait ~400 msecs wait(400); } function toggleDragMode(view, enabled) { // use the topmost listItem to wait for rendering completion view.positionViewAtBeginning(); var listItem = findChild(view, "listItem0"); verify(listItem); view.ViewItems.dragMode = enabled; // waitForRendering aint seems to be reliable here, so we wait ~400 msecs wait(400); } function drag(view, from, to) { var dragArea = findChild(view, "drag_area"); verify(dragArea, "Cannot locate drag area"); // grab the source item view.positionViewAtBeginning(from,ListView.Beginning); var panel = findChild(view, "drag_panel" + from); verify(panel, "Cannot locate source panel"); var dragPos = dragArea.mapFromItem(panel, centerOf(panel).x, centerOf(panel).y); // move the mouse var dy = Math.abs(to - from) * panel.height + units.gu(1); dy *= (to > from) ? 1 : -1; mousePress(dragArea, dragPos.x, dragPos.y); wait(100); var draggedItem = findChild(view.contentItem, "DraggedListItem"); if (draggedItem) { setupSpy(draggedItem.__styleInstance.dropAnimation, "stopped"); } // use 10 steps to be sure the move is properly detected by the drag area mouseMoveSlowly(dragArea, dragPos.x, dragPos.y, 0, dy, 10, 100); // drop it, needs two mouse releases, this generates the Drop event also mouseRelease(dragArea, dragPos.x, dragPos.y + dy); // needs one more mouse release mouseRelease(dragArea, dragPos.x, dragPos.y + dy); spyWait(); } function expand(item, expand) { item.expansion.expanded = expand; wait(400); } } ./tests/unit_x11/tst_components/tst_hide_chrome.qml0000644000015600001650000001063612700370701022644 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 Item { width: units.gu(50) height: units.gu(80) MainView { id: mainView anchors.fill: parent Tabs { id: tabs Tab { id: tab1 title: "tab 1" page: Page { id: page1 Button { id: button anchors.centerIn: parent text: "click" } tools: ToolbarItems { ToolbarButton { id: toolbarButton text: "something" } } } } Tab { id: tab2 title: "tab 2" page: Page { id: page2 } } } } TestCase { name: "HideChrome" when: windowShown id: testCase function cleanup() { // clean buffers waitForRendering(mainView, 500); } function openToolbar() { var toolbar = mainView.__propagated.toolbar; toolbar.open(); compare(toolbar.opened, true, "Cannot open toolbar using open()"); wait(UbuntuAnimation.FastDuration); // wait for the open animation to finish return toolbar; } function setTabBarSelectionMode(newSelectionMode) { var tabBar = tabs.tabBar; var header = mainView.__propagated.header; compare(tabBar, header.__styleInstance.__tabBar, "TabBar is not the active header contents"); header.show(); tabBar.selectionMode = newSelectionMode; compare(tabBar.selectionMode, newSelectionMode, "Failed to set the tab bar selection mode"); return tabBar; } function test_tabBar_press_closes_toolbar_bug1223600() { testCase.setTabBarSelectionMode(false); var toolbar = testCase.openToolbar(); testCase.mousePress(tabs.tabBar); compare(toolbar.opened, false, "Activating TabBar did not close toolbar"); testCase.mouseRelease(tabs.tabBar); testCase.setTabBarSelectionMode(false); } function test_toolbar_press_closes_tabBar_bug1223606 () { var tabBar = testCase.setTabBarSelectionMode(true); var toolbar = testCase.openToolbar(); testCase.mouseClick(toolbarButton, toolbarButton.width/2, toolbarButton.height/2, Qt.LeftButton); compare(tabBar.selectionMode, false, "Clicking a toolbar button does not disable tab bar selection mode"); toolbar.open(); testCase.setTabBarSelectionMode(true); testCase.mousePress(toolbar, toolbar.width/2, toolbar.height/2, Qt.LeftButton); compare(tabBar.selectionMode, false, "Pressing the toolbar does not disable tab bar selection mode"); testCase.mouseRelease(toolbar, toolbar.width/2, toolbar.height/2, Qt.LeftButton); toolbar.close(); testCase.setTabBarSelectionMode(true); testCase.mousePress(mainView, mainView.width/2, mainView.height - toolbar.triggerSize/2, Qt.LeftButton); compare(tabBar.selectionMode, false, "Triggering the toolbar hint does not disable tab selection mode"); testCase.mouseRelease(mainView, mainView.width/2, mainView.height - toolbar.triggerSize/2, Qt.LeftButton); } } } ./tests/unit_x11/tst_components/tst_alarms.qml0000644000015600001650000002623212700370701021654 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 Item { id: root width: units.gu(40) height: units.gu(71) Alarm { id: testAlarm } AlarmModel { id: testModel } ListView { id: roleTest model: testModel delegate: Item { height: units.gu(7) objectName: "roleItem" property var roleModel: model property bool roleEnabled: model.enabled property string roleMessage: message property var roleDate: date property int roleType: type property int roleDaysOfWeek: daysOfWeek property url roleSound: sound Label { text: model.date + model.message + model.sound + model.type + model.daysOfWeek + model.enabled } } } property Alarm workAlarm: testAlarm UbuntuTestCase { id: testCase name: "AlarmAPI" when: windowShown SignalSpy { id: modelSpy signalName: "modelReset" target: testModel } function clean() { var i = 0; modelSpy.signalName = "rowsRemoved"; while (i < testModel.count) { var alarm = testModel.get(i); // tests start with "test" string if (alarm.message.search("test") == 0) { alarm.cancel(); modelSpy.wait(); modelSpy.clear(); i = 0; } else { i++; } } } function normalizeDate(date) { return new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), 0); } function initTestCase() { // AlarmModel initiates a fetch, wait till that one completes modelSpy.wait(); clean(); } function cleanupTestCase() { clean(); } function init() { modelSpy.clear(); } function cleanup() { // clear the added test alarm clean(); } function test_createOneTimeFail() { testAlarm.reset(); testAlarm.date = new Date(); testAlarm.save(); compare(testAlarm.error, Alarm.EarlyDate, 'alarm date must be greater than the current time'); } function test_createOneTimePass() { testAlarm.reset(); testAlarm.message = "test" var dt = new Date(); dt.setMinutes(dt.getMinutes() + 10); testAlarm.date = dt; modelSpy.signalName = "rowsInserted"; testAlarm.save(); modelSpy.wait(); compare(testAlarm.error, Alarm.NoError, 'alarm date must be greater than the current time'); } function test_repeating_AutoDetect() { testAlarm.reset(); testAlarm.message = "test" testAlarm.date = new Date(); testAlarm.type = Alarm.AutoDetect; modelSpy.signalName = "rowsInserted"; testAlarm.save(); modelSpy.wait(); compare(testAlarm.error, Alarm.NoError, 'repating AutoDetect alarm'); } function test_repeating_Daily() { testAlarm.reset(); testAlarm.message = "test" testAlarm.date = new Date(); testAlarm.type = Alarm.Daily; modelSpy.signalName = "rowsInserted"; testAlarm.save(); modelSpy.wait(); compare(testAlarm.error, Alarm.NoError, 'repating Daily alarm'); } function test_repeating_givenDay() { testAlarm.reset(); testAlarm.message = "test" testAlarm.date = new Date(); testAlarm.type = Alarm.Repeating; testAlarm.daysOfWeek = Alarm.Monday; modelSpy.signalName = "rowsInserted"; testAlarm.save(); modelSpy.wait(); compare(testAlarm.error, Alarm.NoError, 'repating on a given day alarm'); } function test_repeating_moreDays() { testAlarm.reset(); testAlarm.message = "test" testAlarm.date = new Date(); testAlarm.type = Alarm.Monday | Alarm.Friday; modelSpy.signalName = "rowsInserted"; testAlarm.save(); modelSpy.wait(); compare(testAlarm.error, Alarm.NoError, 'repating on multiple days alarm'); } function test_setAlarmObject_WrongRecurence() { testAlarm.reset(); testAlarm.message = "test"; var dt = new Date(); dt.setMinutes(dt.getMinutes() + 10); testAlarm.date = dt; testAlarm.type = Alarm.OneTime; testAlarm.daysOfWeek = Alarm.Monday | Alarm.Tuesday; testAlarm.save(); compare(testAlarm.error, Alarm.OneTimeOnMoreDays, 'repating on multiple days alarm'); } function test_cancel_Fail() { testAlarm.reset(); testAlarm.cancel(); compare(testAlarm.error, Alarm.InvalidEvent, "cannot cancel an unregistered alarm"); } function test_cancel_Pass() { testAlarm.reset(); testAlarm.message = "test"; testAlarm.type = Alarm.OneTime; var dt = new Date(); dt.setMinutes(dt.getMinutes() + 10); testAlarm.date = dt; modelSpy.signalName = "rowsInserted"; testAlarm.save(); modelSpy.wait(); modelSpy.clear(); modelSpy.signalName = "rowsRemoved" testAlarm.cancel(); modelSpy.wait(); compare(testAlarm.error, Alarm.NoError, "alarm canceled"); } function test_updateAlarm_sameType_data() { var date = new Date(); date.setMinutes(date.getMinutes() + 10); return [ {tag: "LaterDate", referenceDate: date, addMinutes: 10}, {tag: "EarlierDate", referenceDate: date, addMinutes: -5}, ]; } function test_updateAlarm_sameType(data) { var date = data.referenceDate; testAlarm.reset(); testAlarm.message = "test"; testAlarm.type = Alarm.OneTime; testAlarm.date = date; modelSpy.signalName = "rowsInserted"; testAlarm.save(); modelSpy.wait(); compare(testAlarm.error, Alarm.NoError, "fist alarm added"); date.setMinutes(date.getMinutes() + data.addMinutes); testAlarm.date = date; modelSpy.clear(); // watch dataChanged, as there should be no event around it modelSpy.signalName = "dataChanged"; testAlarm.save(); modelSpy.wait(); } function test_updateAlarm_differentType() { testAlarm.reset(); testAlarm.message = "test"; testAlarm.type = Alarm.OneTime; var dt = new Date(); dt.setMinutes(dt.getMinutes() + 10); testAlarm.date = dt; modelSpy.signalName = "rowsInserted"; testAlarm.save(); modelSpy.wait(); compare(testAlarm.error, Alarm.NoError, "fist alarm added"); testAlarm.type = Alarm.Repeating; modelSpy.clear(); modelSpy.signalName = "dataChanged"; testAlarm.save(); modelSpy.wait(); } function test_0_modelRoles() { testAlarm.reset(); testAlarm.message = "test"; var dt = new Date(); dt.setMinutes(dt.getMinutes() + 10); testAlarm.date = dt; testAlarm.type = Alarm.Repeating; testAlarm.daysOfWeek = Alarm.Monday; modelSpy.signalName = "rowsInserted"; testAlarm.save(); modelSpy.wait(); waitForRendering(roleTest); verify(testModel.count > 0, "alarm added"); var item = findChild(roleTest, "roleItem"); verify(item, "has children"); verify(item.roleModel !== undefined, "model is defined"); verify(item.roleEnabled !== undefined, "enabled is defined"); verify(item.roleMessage !== undefined, "message is defined"); verify(item.roleDate !== undefined, "date is defined"); verify(item.roleType !== undefined, "type is defined"); verify(item.roleDaysOfWeek !== undefined, "daysOfWeek is defined"); verify(item.roleSound !== undefined, "sound is defined"); } // guarding bug #1401883 // changed alarm data retrieved from model, when used in bindings, resets the // model data function test_model_role_binding_bug1401883_data() { var dt1 = new Date(); dt1.setMinutes(dt1.getMinutes() + 2); var dt2 = new Date(dt1); dt2.setMinutes(dt2.getMinutes() + 2); return [ {tag: "Message", role: "message", firstValue: "test", updatedValue: "test_other"}, {tag: "Enabled", role: "enabled", firstValue: true, updatedValue: false}, {tag: "Date", role: "date", firstValue: dt1, updatedValue: dt2}, {tag: "Type", role: "type", firstValue: Alarm.Daily, updatedValue: Alarm.OneTime}, ]; } function test_model_role_binding_bug1401883(data) { // create a new test alarm and make sure we set the mandatory fields testAlarm.reset(); var dt = new Date(); dt.setMinutes(dt.getMinutes() + 1); testAlarm.date = dt; testAlarm.message = "test"; testAlarm[data.role] = data.firstValue; modelSpy.signalName = "rowsInserted"; modelSpy.clear(); testAlarm.save(); modelSpy.wait(); waitForRendering(roleTest); // change the date var alarmData = testModel.get(0); modelSpy.signalName = "dataChanged"; modelSpy.clear(); alarmData[data.role] = data.updatedValue; alarmData.save(); modelSpy.wait(500); if (data.role === "date") { compare(normalizeDate(testModel.get(0).date), normalizeDate(data.updatedValue), "Date differs"); } else { compare(testModel.get(0)[data.role], data.updatedValue, data.tag + " differs"); } } } } ./tests/unit_x11/tst_components/tst_abstractbutton13.qml0000644000015600001650000004131512700370714023603 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.3 import Ubuntu.Components 1.3 Item { width: units.gu(40) height: units.gu(71) Column { AbstractButton { id: absButton width: units.gu(10) height: units.gu(10) } AbstractButton { id: absLongTap width: units.gu(10) height: width onPressAndHold: {} } AbstractButton { id: suppressTrigger width: units.gu(10) height: width function trigger() {} } Item { // have enough space for the test subject width: units.gu(10) height: units.gu(10) AbstractButton { id: buttonWithSensing anchors.centerIn: parent } } Rectangle { color: "red" width: units.gu(10) height: units.gu(10) AbstractButton { id: increasedSensing anchors.centerIn: parent width: units.gu(4) height: units.gu(4) sensingMargins { left: units.gu(2) right: units.gu(2) top: units.gu(2) bottom: units.gu(2) } style: Item { anchors.fill: parent Rectangle { color: "blue" parent: styledItem.__mouseArea anchors.fill: parent } } } } AbstractButton { id: suppressTrigger2 width: units.gu(10) height: width function trigger(v) {} } AbstractButton { id: suppressTrigger3 width: units.gu(10) height: width function trigger(v) { triggered(v) } } Loader { id: loader width: units.gu(10) height: units.gu(10) sourceComponent: AbstractButton { objectName: "dynamic"} property bool click: false property bool longPress: false } } Connections { id: test target: loader.item onClicked: loader.click = true onPressAndHold: loader.longPress = true } Action { id: action1 property int triggerCount: 0 onTriggered: triggerCount++ } Action { id: override function trigger() {} } SignalSpy { id: signalSpy target: absButton signalName: "clicked" } SignalSpy { id: pressAndHoldSpy target: absLongTap signalName: "pressAndHold" } SignalSpy { id: triggeredSpy signalName: "triggered" } UbuntuTestCase { name: "AbstractButtonAPI" when: windowShown function cleanup() { buttonWithSensing.sensingMargins.left = 0; buttonWithSensing.sensingMargins.top = 0; buttonWithSensing.sensingMargins.right = 0; buttonWithSensing.sensingMargins.bottom = 0; buttonWithSensing.sensingMargins.all = 0; buttonWithSensing.width = 0; buttonWithSensing.height = 0; signalSpy.target = absButton; signalSpy.clear(); signalSpy.target = absButton; triggeredSpy.clear(); loader.click = false; loader.longPress = false; } function initTestCase() { compare(buttonWithSensing.sensingMargins.left, 0); compare(buttonWithSensing.sensingMargins.right, 0); compare(buttonWithSensing.sensingMargins.top, 0); compare(buttonWithSensing.sensingMargins.bottom, 0); compare(buttonWithSensing.sensingMargins.all, 0); } function test_action() { compare(absButton.action, null,"Action is null by default") absButton.action = action1 compare(absButton.action, action1, "Action can be set") var numTriggers = action1.triggerCount triggeredSpy.target = absButton.action; mouseClick(absButton, centerOf(absButton).x, centerOf(absButton).y); triggeredSpy.wait(500); compare(action1.triggerCount, numTriggers+1, "Button clicked triggers action") absButton.action = null } function test_custom_trigger_function_data() { return [ {tag: "parameterless trigger", testItem: suppressTrigger}, {tag: "parameted trigger", testItem: suppressTrigger2}, ]; } function test_custom_trigger_function(data) { data.testItem.action = action1; triggeredSpy.target = action1; mouseClick(data.testItem, centerOf(data.testItem).x, centerOf(data.testItem).y); compare(triggeredSpy.count, 0, "Trigger should be overridden"); } function test_custom_trigger_overrides_triggered_bug1524234_data() { return [ {tag: "parameterless trigger", testItem: suppressTrigger, action: action1, triggeredWatch: action1, triggeredCount: 0 }, {tag: "parameted trigger", testItem: suppressTrigger2, action: action1, triggeredWatch: action1, triggeredCount: 0 }, {tag: "button trigger fired", testItem: suppressTrigger3, action: action1, triggeredWatch: suppressTrigger3, triggeredCount: 1 }, {tag: "action trigger fired", testItem: suppressTrigger3, action: action1, triggeredWatch: action1, triggeredCount: 1 }, {tag: "action trigger overridden", testItem: suppressTrigger3, action: override, triggeredWatch: override, triggeredCount: 0 }, ]; } function test_custom_trigger_overrides_triggered_bug1524234(data) { data.testItem.action = data.action; triggeredSpy.target = data.triggeredWatch; signalSpy.target = data.testItem; data.testItem.forceActiveFocus(); keyClick(Qt.Key_Space); signalSpy.wait(200); compare(triggeredSpy.count, data.triggeredCount); } // fixing bugs 1365471 and 1458028 function test_no_pressAndHold_connected_clicks_bug1365471_bug1458028() { signalSpy.target = absButton; mouseLongPress(absButton, centerOf(absButton).x, centerOf(absButton).y); mouseRelease(absButton, centerOf(absButton).x, centerOf(absButton).y); signalSpy.wait(); } // fixing bugs 1365471 and 1458028 function test_pressAndHold_connected_suppresses_clicks_bug1365471_bug1458028() { function testFunc() {} signalSpy.target = absButton; absLongTap.pressAndHold.connect(testFunc); mouseLongPress(absLongTap, centerOf(absLongTap).x, centerOf(absLongTap).y); absLongTap.pressAndHold.disconnect(testFunc); pressAndHoldSpy.wait(); mouseRelease(absLongTap, centerOf(absLongTap).x, centerOf(absLongTap).y); compare(signalSpy.count, 0, "click() must be suppressed when pressAndHold handler is implemented"); } function test_pressAndHold_emitted_on_connections_bug1495554() { mouseLongPress(loader.item, centerOf(loader.item).x, centerOf(loader.item).y); mouseRelease(loader.item, centerOf(loader.item).x, centerOf(loader.item).y); compare(loader.click, false, "clicked should not be emitted"); compare(loader.longPress, true, "pressAndHold not captured by Connection"); } function test_clicked_emitted_on_connections_bug1495554() { mouseClick(loader.item, centerOf(loader.item).x, centerOf(loader.item).y); compare(loader.click, true, "clicked not captured by Connection"); } function test_sensing_area_data() { return [ // margins is [left, top, right, bottom] {tag: "zero size, no margins, click in visual", sizeGU: [0, 0], clickGU: [0, 0], sensingGU: [4, 4]}, {tag: "zero size, no margins, click in sensing", sizeGU: [0, 0], clickGU: [4, 4], sensingGU: [4, 4]}, {tag: "zero size, 1GU margins, click in visual", sizeGU: [0, 0], marginsGU: [1, 1, 1, 1], clickGU: [0, 0], sensingGU: [4, 4]}, {tag: "zero size, 1GU margins, click in sensing", sizeGU: [0, 0], marginsGU: [1, 1, 1, 1], clickGU: [4, 4], sensingGU: [4, 4]}, {tag: "zero size, 3GU margins horizontal, click in sensing", sizeGU: [0, 0], marginsGU: [3, 0, 3, 0], clickGU: [4, 4], sensingGU: [6, 4]}, {tag: "zero size, 3GU margins vertical, click in sensing", sizeGU: [0, 0], marginsGU: [0, 3, 0, 3], clickGU: [4, 4], sensingGU: [4, 6]}, {tag: "zero size, 3GU margins around, click in sensing", sizeGU: [0, 0], marginsGU: [3, 3, 3, 3], clickGU: [4, 4], sensingGU: [6, 6]}, {tag: "3x3GU size, no margins, click in visual", sizeGU: [3, 3], clickGU: [0, 0], sensingGU: [4, 4]}, {tag: "3x3GU size, no margins, click in sensing", sizeGU: [3, 3], clickGU: [4, 4], sensingGU: [4, 4]}, {tag: "3x3GU size, 1GU margins, click in visual", sizeGU: [3, 3], marginsGU: [1, 1, 1, 1], clickGU: [0, 0], sensingGU: [5, 5]}, {tag: "3x3GU size, 1GU margins, click in sensing", sizeGU: [3, 3], marginsGU: [1, 1, 1, 1], clickGU: [4, 4], sensingGU: [5, 5]}, {tag: "3x3GU size, 3GU margins horizontal, click in sensing", sizeGU: [3, 3], marginsGU: [3, 0, 3, 0], clickGU: [4, 4], sensingGU: [9, 4]}, {tag: "3x3GU size, 3GU margins vertical, click in sensing", sizeGU: [3, 3], marginsGU: [0, 3, 0, 3], clickGU: [4, 4], sensingGU: [4, 9]}, {tag: "3x3GU size, 3GU margins around, click in sensing", sizeGU: [3, 3], marginsGU: [3, 3, 3, 3], clickGU: [4, 4], sensingGU: [9, 9]}, {tag: "5x5GU size, no margins, click in visual", sizeGU: [5, 5], clickGU: [0, 0], sensingGU: [5, 5]}, {tag: "5x5GU size, no margins, click in sensing", sizeGU: [5, 5], clickGU: [4, 4], sensingGU: [5, 5]}, {tag: "5x5GU size, 1GU margins, click in visual", sizeGU: [5, 5], marginsGU: [1, 1, 1, 1], clickGU: [0, 0], sensingGU: [7, 7]}, {tag: "5x5GU size, 1GU margins, click in sensing", sizeGU: [5, 5], marginsGU: [1, 1, 1, 1], clickGU: [4, 4], sensingGU: [7, 7]}, {tag: "5x5GU size, 3GU margins horizontal, click in sensing", sizeGU: [5, 5], marginsGU: [3, 0, 3, 0], clickGU: [4, 4], sensingGU: [11, 5]}, {tag: "5x5GU size, 3GU margins vertical, click in sensing", sizeGU: [5, 5], marginsGU: [0, 3, 0, 3], clickGU: [4, 4], sensingGU: [5, 11]}, {tag: "5x5GU size, 3GU margins around, click in sensing", sizeGU: [5, 5], marginsGU: [3, 3, 3, 3], clickGU: [4, 4], sensingGU: [11, 11]}, {tag: "zero size, no margins, click out of sensing area", sizeGU: [0, 0], clickGU: [5, 5], sensingGU: [4, 4], fail: true}, {tag: "2x2GU size, no margins, click out of sensing area", sizeGU: [2, 2], clickGU: [5, 5], sensingGU: [4, 4], fail: true}, {tag: "4x4GU size, no margins, click out of sensing area", sizeGU: [4, 4], clickGU: [5, 5], sensingGU: [4, 4], fail: true}, {tag: "2x2GU size, 1GU margins around, click out of sensing area", sizeGU: [2, 2], marginsGU: [1, 1, 1, 1], clickGU: [5, 5], sensingGU: [4, 4], fail: true}, {tag: "4x4GU size, 1GU margins around, click out of sensing area", sizeGU: [4, 4], marginsGU: [1, 1, 1, 1], clickGU: [6.1, 6.1], sensingGU: [6, 6], fail: true}, // test margins.all {tag: "zero size, 5GU margins.all, click in sensing area", sizeGU: [0, 0], marginsAll: units.gu(5), clickGU: [5, 5], sensingGU: [10, 10]}, {tag: "2x2 size, 2GU margins.all, click in sensing area", sizeGU: [2, 2], marginsAll: units.gu(2), clickGU: [6, 6], sensingGU: [6, 6]}, {tag: "zero size, 5GU margins.all, click out of sensing area", sizeGU: [0, 0], marginsAll: units.gu(5), clickGU: [10.1, 10.1], sensingGU: [10, 10], fail: true}, {tag: "2x2 size, 2GU margins.all, click out of sensing area", sizeGU: [2, 2], marginsAll: units.gu(2), clickGU: [6.1, 6.1], sensingGU: [6, 6], fail: true}, // test negative margins {tag: "zero size, -1GU margins.all, click in sensing area", sizeGU: [0, 0], marginsAll: -units.gu(1), clickGU: [4, 4], sensingGU: [4, 4]}, {tag: "2x2 size, -1GU margins.all, click in sensing area", sizeGU: [2, 2], marginsAll: -units.gu(1), clickGU: [4, 4], sensingGU: [4, 4]}, {tag: "zero size, -1GU margins horizontal, click in sensing area", sizeGU: [0, 0], marginsGU: [-1, 0, -1, 0], clickGU: [4, 4], sensingGU: [4, 4]}, {tag: "zero size, -1GU margins vertical, click in sensing area", sizeGU: [0, 0], marginsGU: [0, -1, 0, -1], clickGU: [4, 4], sensingGU: [4, 4]}, {tag: "2x2 size, -1GU margins horizontal, click in sensing area", sizeGU: [2, 2], marginsGU: [-1, 0, -1, 0], clickGU: [4, 4], sensingGU: [4, 4]}, {tag: "2x2 size, -1GU margins vertical, click in sensing area", sizeGU: [2, 2], marginsGU: [0, -1, 0, -1], clickGU: [4, 4], sensingGU: [4, 4]}, {tag: "4x4 size, -1GU margins.all, click in sensing area", sizeGU: [4, 4], marginsAll: -units.gu(1), clickGU: [4, 4], sensingGU: [4, 4]}, {tag: "4x4 size, -1GU margins horizontal, click in sensing area", sizeGU: [4, 4], marginsGU: [-1, 0, -1, 0], clickGU: [4, 4], sensingGU: [4, 4]}, {tag: "4x4 size, -1GU margins vertical, click in sensing area", sizeGU: [4, 4], marginsGU: [0, -1, 0, -1], clickGU: [4, 4], sensingGU: [4, 4]}, // bigger size than minimum, decrease sensing area {tag: "5x5 size, -1GU margins.all, click in sensing area", sizeGU: [5, 5], marginsAll: -units.gu(1), clickGU: [4, 4], sensingGU: [4, 4]}, {tag: "5x5 size, -1GU margins horizontal, click in sensing area", sizeGU: [5, 5], marginsGU: [-1, 0, -1, 0], clickGU: [4, 5], sensingGU: [4, 5]}, {tag: "5x5 size, -1GU margins vertical, click in sensing area", sizeGU: [5, 5], marginsGU: [0, -1, 0, -1], clickGU: [5, 4], sensingGU: [5, 4]}, ]; } function test_sensing_area(data) { signalSpy.target = buttonWithSensing; buttonWithSensing.objectName = data.tag; buttonWithSensing.width = units.gu(data.sizeGU[0]); buttonWithSensing.height = units.gu(data.sizeGU[1]); if (data.marginsGU) { buttonWithSensing.sensingMargins.left = units.gu(data.marginsGU[0]); buttonWithSensing.sensingMargins.top = units.gu(data.marginsGU[1]); buttonWithSensing.sensingMargins.right = units.gu(data.marginsGU[2]); buttonWithSensing.sensingMargins.bottom = units.gu(data.marginsGU[3]); } else if (data.marginsAll) { buttonWithSensing.sensingMargins.all = data.marginsAll; } if (data.sensingGU) { compare(buttonWithSensing.__mouseArea.width, units.gu(data.sensingGU[0]), "unexpected horizontal sensing size"); compare(buttonWithSensing.__mouseArea.height, units.gu(data.sensingGU[1]), "unexpected vertical sensing size"); } if (data.fail) { expectFailContinue(data.tag, "no signal"); } mouseClick(buttonWithSensing.__mouseArea, units.gu(data.clickGU[0]), units.gu(data.clickGU[1])); signalSpy.wait(500); } function test_predeclared_sensing_area() { var point = centerOf(increasedSensing.parent); // move the point to the edge of the sensing area point.x -= increasedSensing.sensingMargins.left; point.y -= increasedSensing.sensingMargins.top; // click signalSpy.target = increasedSensing; mouseClick(increasedSensing.parent, point.x, point.y); signalSpy.wait(500); } } } ./tests/unit_x11/tst_components/tst_datepicker13.qml0000644000015600001650000006420512700370714022662 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.3 import Ubuntu.Components 1.3 import Ubuntu.Components.Pickers 1.3 Item { id: testSuite width: units.gu(40) height: units.gu(71) Component { id: testComponent DatePicker { width: testSuite.width } } Loader { id: pickerLoader asynchronous: false width: parent.width } UbuntuTestCase { name: "DatePicker13API" when: windowShown readonly property DatePicker picker: pickerLoader.item function init() { pickerLoader.sourceComponent = testComponent; tryCompareFunction(function(){return pickerLoader.status}, Loader.Ready); waitPickerMoving(); } function cleanup() { pickerLoader.sourceComponent = undefined; } function waitPickerMoving() { waitForRendering(picker); tryCompareFunction(function(){return picker.moving}, false); } function getPickerLabel(picker, name) { var pickerItem = findChild(picker, name); var pickerCurrent = findChild(pickerItem, "Picker_ViewLoader"); // note: find Label, Picker's label uses medium font size. The lookup must be changed // if the fontSize is changed! var pickerLabel = findChildWithProperty(pickerCurrent.item.currentItem, "fontSize", "medium"); verify(pickerLabel, ("Label of %1 not accessible").arg(name)); return pickerLabel; } function getPickerModel(picker, name) { var pickerItem = findInvisibleChild(picker, name); return pickerItem ? pickerItem.model : undefined; } function setHMS(date, h, m, s) { date.setHours(h); date.setMinutes(m); date.setSeconds(s); return date; } function initTestCase() { pickerLoader.sourceComponent = testComponent; tryCompareFunction(function(){return pickerLoader.status}, Loader.Ready); compare(picker.mode, "Years|Months|Days", "default mode"); var date = (new Date()).midnight(); compare(picker.date, date, "default mode"); compare(picker.year, date.getFullYear(), "default year"); compare(picker.month, date.getMonth(), "default month"); compare(picker.day, date.getDate(), "default day"); compare(picker.week, date.getWeek(), "default week"); compare(picker.hours, date.getHours(), "default hour"); compare(picker.minutes, date.getMinutes(), "default minute"); compare(picker.seconds, date.getSeconds(), "default second"); var endDate = Date.prototype.midnight.call(new Date()); endDate.setFullYear(endDate.getFullYear() + 50); compare(picker.minimum, picker.date, "default minimum is same as date property"); compare(picker.maximum, endDate, "default maximum is a 50 years window"); compare(picker.locale, Qt.locale(), "default locale is the same as system locale"); } function test_1_changeModeYM() { var newMode = "Years|Months"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeMD() { var newMode = "Days|Months"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeYD() { ignoreWarning('Invalid DatePicker mode: Years|Days') var newMode = "Years|Days"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; // no rendering is expected, no need to wait var positioner = findChild(picker, "PickerRow_Positioner"); expectFailContinue("", "Invalid mode"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeY() { var newMode = "Years"; var pickerCount = 1 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeM() { var newMode = "Months"; var pickerCount = 1 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeD() { var newMode = "Days"; var pickerCount = 1 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeHMS() { var newMode = "Hours|Minutes|Seconds"; var pickerCount = 3 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeHM() { var newMode = "Hours|Minutes"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeMS() { var newMode = "Minutes|Seconds"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeHS() { ignoreWarning('Invalid DatePicker mode: Hours|Seconds') var newMode = "Hours|Seconds"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); expectFailContinue("", "cannot set mode to Hours|Minutes"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeH() { var newMode = "Hours"; var pickerCount = 1 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeMinute() { var newMode = "Minutes"; var pickerCount = 1 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeS() { var newMode = "Seconds"; var pickerCount = 1 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeYMDHMS() { ignoreWarning('Date and Time picking not allowed at the same time.') var newMode = "Years|Months|Days|Hours|Minutes|Seconds"; var pickerCount = 6 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); expectFailContinue("", "cannot combine date and time pickers"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeYH() { ignoreWarning('Date and Time picking not allowed at the same time.') var newMode = "Years|Hours"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); expectFailContinue("", "cannot combine date and time pickers"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeUnhandled() { ignoreWarning('Unhandled mode flag: Whatever. Mode will not be set!') var newMode = "Years|Whatever"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; // no rendering is expected, no need to wait var positioner = findChild(picker, "PickerRow_Positioner"); expectFailContinue("", "unhandled mode flag should not pass"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeLocale() { var prevLocale = picker.locale; var locale = Qt.locale("hu_HU"); picker.minimum = new Date(2012, 11, 1); picker.date = new Date(2012, 11, 1); picker.locale = Qt.locale("hu_HU"); waitPickerMoving(); var label = getPickerLabel(picker, "PickerRow_MonthPicker"); compare(label.text, locale.monthName(picker.date.getMonth(), Locale.LongFormat), "locale for month wrong"); label = getPickerLabel(picker, "PickerRow_DayPicker"); var dayModel = getPickerModel(picker, "PickerRow_DayPicker"); compare(label.text, dayModel.text(picker.date.getDate() - 1, testSuite.width), "locale for day name wrong"); } function test_1_changeMinimumBeforeDate() { var date = new Date(picker.date); var originalDate = new Date(date); date.setFullYear(date.getFullYear() - 1); date.setDate(1); picker.minimum = date; // no rendering is expected, so no need to wait var year = getPickerLabel(picker, "PickerRow_YearPicker"); compare(year.text, originalDate.getFullYear().toString(), "year differs"); var month = getPickerLabel(picker, "PickerRow_MonthPicker"); compare(month.text, picker.locale.monthName(originalDate.getMonth(), Locale.LongFormat), "month differs"); var day = getPickerLabel(picker, "PickerRow_DayPicker"); var dayModel = getPickerModel(picker, "PickerRow_DayPicker"); compare(day.text, dayModel.text(originalDate.getDate() - 1), "day differs"); } function test_1_changeMaximumAfterDate() { var date = new Date(picker.date); var originalDate = new Date(date); date.setFullYear(date.getFullYear() + 1); date.setDate(1); picker.maximum = date; waitPickerMoving(); var year = getPickerLabel(picker, "PickerRow_YearPicker"); compare(year.text, originalDate.getFullYear().toString(), "year differs"); var month = getPickerLabel(picker, "PickerRow_MonthPicker"); compare(month.text, picker.locale.monthName(originalDate.getMonth(), Locale.LongFormat), "month differs"); var day = getPickerLabel(picker, "PickerRow_DayPicker"); var dayModel = getPickerModel(picker, "PickerRow_DayPicker"); compare(day.text, dayModel.text(originalDate.getDate() - 1), "day differs"); } // make infinite function test_1_changeMinimumInvalid() { picker.minimum = Date.prototype.getInvalidDate.call(); // no rendering is expected compare(picker.minimum, picker.date, "invalid minimum hasn't been adjusted to date"); } // make infinite function test_1_changeMaximumInvalid() { picker.maximum = Date.prototype.getInvalidDate.call(); waitPickerMoving(); // check if the year picker model is autoExtending var yearModel = getPickerModel(picker, "PickerRow_YearPicker"); compare(yearModel.autoExtend, true, "the year picker is not auto-extending one"); } function test_1_changeDate() { var date = new Date(); date.setFullYear(picker.date.getFullYear() + 2); date.setMonth(5); date.setDate(21); picker.date = date; picker.mode = "Years|Months|Days"; waitPickerMoving(); var yearLabel = getPickerLabel(picker, "PickerRow_YearPicker", date.getFullYear()); var monthLabel = getPickerLabel(picker, "PickerRow_MonthPicker"); var monthModel = getPickerModel(picker, "PickerRow_MonthPicker"); var dayLabel = getPickerLabel(picker, "PickerRow_DayPicker"); var dayModel = getPickerModel(picker, "PickerRow_DayPicker"); compare(yearLabel.text, date.getFullYear().toString(), "different year value"); compare(monthLabel.text, monthModel.text(date.getMonth()), "different month value"); compare(dayLabel.text, dayModel.text(date.getDate() - 1), "different day value"); } function test_1_changeDateToNextMonth() { picker.minimum = new Date(2013, 9, 1); picker.date = new Date(2013, 09, 31); picker.locale = Qt.locale("hu_HU") waitPickerMoving(); // click on the month picker to set the next month var monthPicker = findChild(picker, "PickerRow_MonthPicker"); var monthCurrent = findChild(monthPicker, "Picker_ViewLoader"); var my = monthPicker.y + (monthPicker.height / 2) + monthCurrent.item.currentItem.height; var mx = monthPicker.x + monthPicker.width / 2; mouseClick(picker, mx, my); waitPickerMoving(); var yearLabel = getPickerLabel(picker, "PickerRow_YearPicker"); var monthLabel = getPickerLabel(picker, "PickerRow_MonthPicker"); var monthModel = getPickerModel(picker, "PickerRow_MonthPicker"); var dayLabel = getPickerLabel(picker, "PickerRow_DayPicker"); var dayModel = getPickerModel(picker, "PickerRow_DayPicker"); compare(yearLabel.text, "2013", "different year value"); // November compare(monthLabel.text, monthModel.text(10), "different month value"); // the 30th compare(dayLabel.text, dayModel.text(29), "different day value"); // set it back my = monthPicker.y + (monthPicker.height / 2) - monthCurrent.item.currentItem.height; mouseClick(picker, mx, my); waitPickerMoving(); compare(yearLabel.text, "2013", "different year value"); // October monthLabel = getPickerLabel(picker, "PickerRow_MonthPicker"); compare(monthLabel.text, monthModel.text(9), "different month value"); // the 30th dayLabel = getPickerLabel(picker, "PickerRow_DayPicker"); compare(dayLabel.text, dayModel.text(29), "different day value"); } function test_2_disabledYear() { var date = new Date(2013, 4, 1); var minDate = new Date(2013, 0, 1); var maxDate = new Date(2013, 11, 31); picker.minimum = minDate; picker.maximum = maxDate; waitPickerMoving(); picker.date = date; waitPickerMoving(); var yearPicker = findChild(picker, "PickerRow_YearPicker"); compare(yearPicker.enabled, false, "year picker should be disabled"); } function test_2_disabledYearAndMonth() { var date = new Date(2013, 11, 1); var minDate = new Date(2013, 11, 1); var maxDate = new Date(2013, 11, 31); picker.minimum = minDate; picker.maximum = maxDate; picker.date = date; waitPickerMoving(); var yearPicker = findChild(picker, "PickerRow_YearPicker"); compare(yearPicker.enabled, false, "year picker should be disabled"); var monthPicker = findChild(picker, "PickerRow_MonthPicker"); compare(monthPicker.enabled, false, "month picker should be disabled"); } function test_2_linearDayPicker() { var date = new Date(2013, 11, 1); var minDate = new Date(2013, 11, 2); var maxDate = new Date(2013, 11, 31); picker.minimum = minDate; picker.maximum = maxDate; picker.date = date; var yearPicker = findChild(picker, "PickerRow_YearPicker"); compare(yearPicker.enabled, false, "year picker should be disabled"); var monthPicker = findChild(picker, "PickerRow_MonthPicker"); compare(monthPicker.enabled, false, "month picker should be disabled"); var dayPickerModel = getPickerModel(picker, "PickerRow_DayPicker"); expectFailContinue("", "day picker is always circular"); compare(dayPickerModel.circular, false, "day picker should be linear"); } function test_3_changeHours() { picker.mode = "Hours|Minutes|Seconds"; waitPickerMoving(); var date = new Date(picker.date); date.setHours((date.getHours() + 10) % 24); picker.date = date; waitPickerMoving(); var hoursLabel = getPickerLabel(picker, "PickerRow_HoursPicker"); verify(hoursLabel, "hour label undefined"); compare(hoursLabel.text, ("00" + date.getHours()).slice(-2), "hours differ"); var minutesLabel = getPickerLabel(picker, "PickerRow_MinutesPicker"); verify(minutesLabel, "minutes label undefined"); compare(minutesLabel.text, ("00" + date.getMinutes()).slice(-2), "minutes differ"); var secondsLabel = getPickerLabel(picker, "PickerRow_SecondsPicker"); verify(secondsLabel, "seconds label undefined"); compare(secondsLabel.text, ("00" + date.getSeconds()).slice(-2), "seconds differ"); } function test_3_changeMinutes() { picker.mode = "Hours|Minutes|Seconds"; var date = new Date(picker.date); date.setMinutes((date.getMinutes() + 40) % 60); picker.date = date; waitPickerMoving(); var hoursLabel = getPickerLabel(picker, "PickerRow_HoursPicker"); verify(hoursLabel, "hour label undefined"); compare(hoursLabel.text, ("00" + date.getHours()).slice(-2), "hours differ"); var minutesLabel = getPickerLabel(picker, "PickerRow_MinutesPicker"); verify(minutesLabel, "minutes label undefined"); compare(minutesLabel.text, ("00" + date.getMinutes()).slice(-2), "minutes differ"); var secondsLabel = getPickerLabel(picker, "PickerRow_SecondsPicker"); verify(secondsLabel, "seconds label undefined"); compare(secondsLabel.text, ("00" + date.getSeconds()).slice(-2), "seconds differ"); } function test_3_changeSeconds() { picker.mode = "Hours|Minutes|Seconds"; var date = new Date(picker.date); date.setSeconds((date.getSeconds() + 50) % 60); picker.date = date; waitPickerMoving(); var hoursLabel = getPickerLabel(picker, "PickerRow_HoursPicker"); verify(hoursLabel, "hour label undefined"); compare(hoursLabel.text, ("00" + date.getHours()).slice(-2), "hours differ"); var minutesLabel = getPickerLabel(picker, "PickerRow_MinutesPicker"); verify(minutesLabel, "minutes label undefined"); compare(minutesLabel.text, ("00" + date.getMinutes()).slice(-2), "minutes differ"); var secondsLabel = getPickerLabel(picker, "PickerRow_SecondsPicker"); verify(secondsLabel, "seconds label undefined"); compare(secondsLabel.text, ("00" + date.getSeconds()).slice(-2), "seconds differ"); } function test_4_changeMinimumBeforeDateHMS() { picker.mode = "Hours|Minutes|Seconds"; var date = new Date(picker.date); var originalDate = new Date(date); date.setFullYear(date.getFullYear() - 1); date.setDate(1); picker.minimum = date; waitPickerMoving(); var hoursLabel = getPickerLabel(picker, "PickerRow_HoursPicker"); verify(hoursLabel, "hour label undefined"); compare(hoursLabel.text, ("00" + originalDate.getHours()).slice(-2), "hours differ"); var minutesLabel = getPickerLabel(picker, "PickerRow_MinutesPicker"); verify(minutesLabel, "minutes label undefined"); compare(minutesLabel.text, ("00" + originalDate.getMinutes()).slice(-2), "minutes differ"); var secondsLabel = getPickerLabel(picker, "PickerRow_SecondsPicker"); verify(secondsLabel, "seconds label undefined"); compare(secondsLabel.text, ("00" + originalDate.getSeconds()).slice(-2), "seconds differ"); } function test_4_changeMaximumAfterDateHMS() { picker.mode = "Hours|Minutes|Seconds"; var date = new Date(picker.date); var originalDate = new Date(date); date.setFullYear(date.getFullYear() + 1); date.setDate(1); picker.maximum = date; waitPickerMoving(); var hoursLabel = getPickerLabel(picker, "PickerRow_HoursPicker"); verify(hoursLabel, "hour label undefined"); compare(hoursLabel.text, ("00" + originalDate.getHours()).slice(-2), "hours differ"); var minutesLabel = getPickerLabel(picker, "PickerRow_MinutesPicker"); verify(minutesLabel, "minutes label undefined"); compare(minutesLabel.text, ("00" + originalDate.getMinutes()).slice(-2), "minutes differ"); var secondsLabel = getPickerLabel(picker, "PickerRow_SecondsPicker"); verify(secondsLabel, "seconds label undefined"); compare(secondsLabel.text, ("00" + originalDate.getSeconds()).slice(-2), "seconds differ"); } function test_4_disabledHour() { picker.mode = "Hours|Minutes|Seconds"; var date = setHMS(new Date(), 12, 10, 45); var minDate = setHMS(new Date(), 12, 0, 0); var maxDate = setHMS(new Date(), 12, 59, 59); picker.minimum = minDate; picker.maximum = maxDate; waitPickerMoving(); picker.date = date; var hoursPicker = findChild(picker, "PickerRow_HoursPicker"); compare(hoursPicker.enabled, false, "hours picker should be disabled"); } function test_4_disabledHoursAndMinutes() { picker.mode = "Hours|Minutes|Seconds"; var date = setHMS(new Date(), 12, 10, 45); var minDate = setHMS(new Date(), 12, 10, 0); var maxDate = setHMS(new Date(), 12, 10, 59); picker.minimum = minDate; picker.maximum = maxDate; picker.date = date; waitPickerMoving(); var hoursPicker = findChild(picker, "PickerRow_HoursPicker"); compare(hoursPicker.enabled, false, "hours picker should be disabled"); var minutesPicker = findChild(picker, "PickerRow_MinutesPicker"); compare(minutesPicker.enabled, false, "minutes picker should be disabled"); } function test_4_linearSecondsPicker() { // skip the test temporaily // https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1315241 skip("Disabled due to flakyness on ppc64el target"); picker.mode = "Hours|Minutes|Seconds"; var date = setHMS(new Date(), 12, 10, 45); var minDate = setHMS(new Date(), 12, 10, 1); var maxDate = setHMS(new Date(), 12, 10, 59); picker.minimum = minDate; picker.maximum = maxDate; picker.date = date; waitPickerMoving(); var hoursPicker = findChild(picker, "PickerRow_HoursPicker"); compare(hoursPicker.enabled, false, "hours picker should be disabled"); var minutesPicker = findChild(picker, "PickerRow_MinutesPicker"); compare(minutesPicker.enabled, false, "minutes picker should be disabled"); var secondsPickerModel = getPickerModel(picker, "PickerRow_SecondsPicker"); tryCompare(secondsPickerModel, "resetting", false); tryCompare(secondsPickerModel, "count", maxDate.getSeconds() - minDate.getSeconds() + 1); compare(secondsPickerModel.circular, false, "day picker should be linear"); } } } ./tests/unit_x11/tst_components/tst_textinput_touch.qml0000644000015600001650000003172212700370701023643 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 Item { id: testMain width: units.gu(40) height: units.gu(71) Column { spacing: units.gu(1) Label { text: "Text fields are awesome" width: parent.width height: units.gu(10) verticalAlignment: Text.AlignVCenter } TextField { id: textField text: "This is a single line text input called TextField." } Label { text: "Text areas are even more amazing" width: parent.width height: units.gu(5) verticalAlignment: Text.AlignVCenter } TextArea { id: textArea text: "This is a multiline text input component called TextArea. It supports fix size as well as auto-expanding behavior. The content is scrollable only if it exceeds the visible area." } Flickable { id: outerFlicker width: parent.width height: units.gu(20) clip: true contentWidth: autoSizeTextArea.width contentHeight: autoSizeTextArea.height TextArea { id: autoSizeTextArea autoSize: true maximumLineCount: 0 text: "1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1" } } TextField { id: emptyTextField text: "" } TextArea { id: emptyTextArea text: "" } } UbuntuTestCase { name: "TextInputTouchTests" when: windowShown SignalSpy { id: popupSpy signalName: "pressAndHold" } SignalSpy { id: flickerSpy signalName: "movementEnded" } function guPoint(x, y) { return Qt.point(units.gu(x), units.gu(y)); } function initTestCase() { TestExtras.registerTouchDevice(); } function init() { textField.cursorPosition = 0; textArea.cursorPosition = 0; emptyTextField.cursorPosition = 0; emptyTextArea.cursorPosition = 0; } function cleanup() { textField.cursorPosition = 1; textArea.cursorPosition = 1; textField.focus = false; textArea.focus = false; emptyTextField.focus = false; emptyTextArea.focus = false; autoSizeTextArea.focus = false; popupSpy.target = null; popupSpy.clear(); flickerSpy.target = null; flickerSpy.clear(); // provide few milliseconds to cleanup waitForRendering(textField, 500); waitForRendering(textArea, 500); } function test_has_caret_when_touchscreen_data() { return [ {tag: "TextField", input: textField}, {tag: "TextArea", input: textArea}, ]; } function test_has_caret_when_touchscreen(data) { data.input.focus = true; waitForRendering(data.input); var cursor = findChild(data.input, "textCursor"); verify(cursor, "Cursor not accessible, FAIL"); verify(cursor.caret, "No caret is set"); compare(cursor.caret.visible, true, "Caret is not visible"); } function test_do_not_activate_on_pressed_data() { return [ {tag: "TextField", input: textField}, {tag: "TextArea", input: textArea}, ]; } function test_do_not_activate_on_pressed(data) { TestExtras.touchPress(0, data.input, centerOf(data.input)); compare(data.input.focus, false, "Input must not be focused on press"); // cleanup TestExtras.touchRelease(0, data.input, centerOf(data.input)); } function test_activate_on_released_data() { return [ {tag: "TextField", input: textField}, {tag: "TextArea", input: textArea}, ]; } function test_activate_on_released(data) { TestExtras.touchClick(0, data.input, centerOf(data.input)); compare(data.input.focus, true, "Input must be focused on release"); } function test_select_text_on_doubletap_data() { return [ {tag: "TextField", input: textField}, {tag: "TextArea", input: textArea}, ]; } function test_select_text_on_doubletap(data) { data.input.focus = true; TestExtras.touchDoubleClick(0, data.input, guPoint(1, 1)); waitForRendering(data.input); verify(data.input.selectedText !== "", "No text selected!"); } function test_longtap_when_inactive_has_no_effect_data() { return [ {tag: "TextField", input: textField}, {tag: "TextArea", input: textArea}, ]; } function test_longtap_when_inactive_has_no_effect(data) { TestExtras.touchLongPress(0, data.input, guPoint(1, 1)); waitForRendering(data.input, 500); verify(!data.input.focus, "Text input must not get focused"); verify(data.input.selectedText === "", "There shouldn't be any text selected"); // cleanup TestExtras.touchRelease(0, data.input, guPoint(1, 1)); } function test_select_text_longtap_when_active_data() { return [ {tag: "TextField", input: textField}, {tag: "TextArea", input: textArea}, ]; } function test_select_text_longtap_when_active(data) { if(TestExtras.openGLflavor() == "opengles2" && TestExtras.cpuArchitecture() != "arm") skip("This test doesn't pass with OpenGLES other than arm"); TestExtras.touchClick(0, data.input, centerOf(data.input)); popupSpy.target = findChild(data.input, "input_handler"); TestExtras.touchLongPress(0, data.input, guPoint(1, 1)); waitForRendering(data.input, 500); popupSpy.wait(); verify(data.input.selectedText !== "", "There should be text selected!"); // cleanup TestExtras.touchRelease(0, data.input, guPoint(1, 1)); // dismiss popover TestExtras.touchClick(0, testMain, 0, 0); } function test_longtap_when_empty_data() { return [ {tag: "TextField", input: emptyTextField}, ]; } function test_longtap_when_empty(data) { TestExtras.touchClick(0, data.input, centerOf(data.input)); wait(500); popupSpy.target = findChild(data.input, "input_handler"); TestExtras.touchLongPress(0, data.input, guPoint(1, 1)); waitForRendering(data.input, 500); popupSpy.wait(); compare(popupSpy.count, 1, "Copy/paste popup should be displayed."); // cleanup TestExtras.touchRelease(0, data.input, guPoint(1, 1)); // dismiss popover TestExtras.touchClick(0, testMain, 0, 0); waitForRendering(data.input, 500); } function test_long_tap_on_selected_text_data() { return [ {tag: "TextField", input: textField}, {tag: "TextArea", input: textArea}, ]; } function test_long_tap_on_selected_text(data) { data.input.focus = true; data.input.selectWord(); var selectedText = data.input.selectedText; verify(selectedText !== "", "No text selected!"); popupSpy.target = findChild(data.input, "input_handler"); TestExtras.touchLongPress(0, data.input, guPoint(4, 2)); waitForRendering(data.input, 500); popupSpy.wait(); compare(data.input.selectedText, selectedText, "Text selection should be the same!"); // cleanup TestExtras.touchRelease(0, data.input, guPoint(2, 2)); // dismiss popover TestExtras.touchClick(0, testMain, guPoint(0, 0)); } function test_drag_cursor_handler_data() { return [ {tag: "TextField", input: textField, delta: guPoint(10, 0)}, {tag: "TextArea", input: textArea, delta: guPoint(10, 4)}, ]; } function test_drag_cursor_handler(data) { data.input.focus = true; data.input.cursorPosition = 0; var caret = findChild(data.input, "input_handler").cursorPositionCursor; verify(caret, "Caret \"" + data.cursorName + "\" cannot be found!"); var cursorPosition = data.input.cursorPosition; TestExtras.touchDrag(0, caret, centerOf(caret), data.delta); waitForRendering(data.input, 500); verify(cursorPosition !== data.input.cursorPosition, "Cursor not moved!"); } function test_select_text_by_dragging_cursor_handler_data() { return [ {tag: "TextField", input: textField, initialCursorPosition: 0, cursorName: "selectionEnd", delta: guPoint(10, 0)}, {tag: "TextArea", input: textArea, initialCursorPosition: 0, cursorName: "selectionEnd", delta: guPoint(10, 5)}, {tag: "TextField(end)", input: textField, initialCursorPosition: 48, cursorName: "selectionStart", delta: guPoint(-10, 0)}, {tag: "TextArea(end)", input: textArea, initialCursorPosition: 50, cursorName: "selectionStart", delta: guPoint(-20, -5)}, ]; } function test_select_text_by_dragging_cursor_handler(data) { data.input.focus = true; data.input.cursorPosition = data.initialCursorPosition; data.input.selectWord(); verify(data.input.selectedText !== "", "No word selected initially!"); var selectedText = data.input.selectedText; var caret = findChild(data.input, "input_handler")[data.cursorName + "Cursor"]; verify(caret, "Caret \"" + data.cursorName + "\" cannot be found!"); // The caret may not receive events right away sleep(500) TestExtras.touchDrag(0, caret, centerOf(caret), data.delta); verify(data.input.selectedText !== "", "Selection cleared!"); verify(data.input.selectedText != selectedText, "Selection did not change"); } function test_z_scroll_when_tap_dragged_data() { return [ {tag: "TextField", input: textField, withSelectedText: false, from: guPoint(2, 2), delta: guPoint(10, 0)}, {tag: "TextArea", input: textArea, withSelectedText: false, from: guPoint(2, 2), delta: guPoint(10, 4)}, {tag: "TextField(selected)", input: textField, withSelectedText: true, from: guPoint(2, 2), delta: guPoint(10, 0)}, {tag: "TextArea(selected)", input: textArea, withSelectedText: true, from: guPoint(2, 2), delta: guPoint(10, 4)}, ]; } function test_z_scroll_when_tap_dragged(data) { data.input.focus = true; data.input.cursorPosition = data.input.text.length; flickerSpy.target = findChild(data.input, "input_scroller"); var selectedText = ""; if (data.withSelectedText) { data.input.selectWord(); selectedText = data.input.selectedText; } waitForRendering(data.input, 200); TestExtras.touchDrag(0, data.input, data.from, data.delta); waitForRendering(data.input, 200); flickerSpy.wait(); compare(selectedText, data.input.selectedText, "Text selection differs!"); } function test_0_drag_autosizing_textarea_drags_parent_flickable_data() { return [ {tag: "when inactive", focused: false }, ]; } function test_0_drag_autosizing_textarea_drags_parent_flickable(data) { flickerSpy.target = outerFlicker; autoSizeTextArea.focus = data.focused; var editor = findChild(autoSizeTextArea, "text_input"); TestExtras.touchDrag(0, editor, guPoint(0, 0), guPoint(0, 40)); flickerSpy.wait(); } } } ./tests/unit_x11/tst_components/tst_icon13.qml0000644000015600001650000001136412700370714021475 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Components 1.3 import Ubuntu.Test 1.3 Item { width: units.gu(50) height: units.gu(50) Row { anchors.centerIn: parent height: units.gu(10) width: childrenRect.width Icon { // Fails to load the icon when suru-icon-theme or libqt5svg5 are // not installed. This causes a warning and rejection // by jenkins continuous integration. name: "add" height: parent.height width: height } Icon { // Fails when the icon is becoming invisible when non-atomic updates // cause sourceSize.width or sourceSize.height to be 0 before other // properties are updated. id: icon width: visible ? units.gu(10) : 0 height: width name: "search" } Icon { id: icon2 width: units.gu(10) height: width } Icon { // Regression test for bug #1371509 // Will print "QML QQuickImage: Failed to get image from provider" when broken. id: icon3 width: units.gu(10) height: width source: Qt.resolvedUrl("tst_icon-select.png") } } UbuntuTestCase { name: "Icon" when: windowShown SignalSpy { id: shaderSpy signalName: 'onStatusChanged' } function cleanup() { icon2.name = ""; } function initTestCase() { compare(icon.asynchronous, false, "asynchronous default value differs"); } function test_updateIconSize_bug1349769() { icon.visible = false; // causes "QML Image: Failed to get image from provider: image://theme/search" // warning when sourceSize.width or sourceSize.height becomes 0 while // while still trying to render the icon. Tests will pass with the warning, but // the MR is rejected by jenkins continuous integration. } function test_name() { icon2.name = "search"; var image = findChild(icon2, "image"); compare(image.source, "image://theme/search", "Source of the image should be image://theme/{name}."); } function test_source() { icon2.name = "search"; icon2.source = "/usr/share/icons/suru/actions/scalable/edit-find.svg"; var image = findChild(icon2, "image"); compare(image.source, "file:///usr/share/icons/suru/actions/scalable/edit-find.svg", "Source of the image should equal icon2.source."); } function test_keyColor() { icon.visible = true; var image = findChild(icon, "image"); var shader = findChild(icon, "shader"); shaderSpy.target = shader; compare(icon.name, 'search'); compare(shader.visible, false); compare(shader.status, ShaderEffect.Uncompiled) icon.color = UbuntuColors.orange; shaderSpy.wait(); compare(shader.log, '') // https://bugreports.qt.io/browse/QTBUG-49713 // status may be Error with no log even if successful verify(shader.status !== ShaderEffect.Uncompiled) compare(shader.keyColorOut, icon.color); compare(shader.visible, true); compare(shader.source, image); icon.keyColor = UbuntuColors.purple; compare(shader.keyColorIn, icon.keyColor); // Unsetting the icon name should disable the shader icon.name = ''; compare(icon.source, ''); compare(shader.visible, false); // Let's get back to a valid source icon.name = 'search'; compare(shader.visible, true); compare(shader.source, image); // Unsetting the keyColor should also disable the shader icon.color = Qt.rgba(0.0, 0.0, 0.0, 0.0); compare(shader.visible, false); } } } ./tests/unit_x11/tst_components/tst_scrollbar.qml0000644000015600001650000014220412700370714022362 0ustar jenkinsjenkins/* * Copyright 2015-2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Andrea Bernabei */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 import Ubuntu.Components.Styles 1.3 import QtQml.Models 2.1 Item { id: main width: units.gu(50) height: units.gu(100) Component { id: flickableComp Item { id: item width: units.gu(20) height: units.gu(30) property alias flickable: freshFlickable property alias scrollbar: freshScrollbar property alias content: content property alias scrollbarAlignment: freshScrollbar.align //Don't change this to a ListView, this usecase has to be simple, //we don't want the difficulties added by ListView, i.e. delegates //size estimation, dynamic contentWidth/Height, etc Flickable { id: freshFlickable anchors.fill: parent contentHeight: content.height contentWidth: content.width clip: true Rectangle { id: content width: units.gu(40) //make this much taller than the flickable to avoid timing issues when //detecting if the flickable is flicking in the tests height: units.gu(200) color: "blue" } } Scrollbar { id: freshScrollbar flickableItem: parent.flickable } } } SignalSpy { id: signalSpy } SignalSpy { id: anotherSignalSpy } Flickable { anchors.fill: parent Column { id: column Repeater { model: layoutsModel } } } VisualItemModel { id: layoutsModel Item { width: childrenRect.width height: childrenRect.height Flickable { id: flickable_bottomAlign_anchors } Scrollbar { id: scrollbar_bottomAlign_anchors flickableItem: flickable_bottomAlign_anchors align: Qt.AlignBottom } Flickable { id: flickable_topAlign_anchors } Scrollbar { id: scrollbar_topAlign_anchors flickableItem: flickable_topAlign_anchors align: Qt.AlignBottom } Flickable { id: flickable_leadingAlign_anchors } Scrollbar { id: scrollbar_leadingAlign_anchors flickableItem: flickable_leadingAlign_anchors align: Qt.AlignLeading } Flickable { id: flickable_trailingAlign_anchors } Scrollbar { id: scrollbar_trailingAlign_anchors flickableItem: flickable_trailingAlign_anchors align: Qt.AlignTrailing } Flickable { id: defaultValuesFlickable } Scrollbar { id: defaultValuesScrollbar flickableItem: defaultValuesFlickable } //Items used for values sanity checks Flickable { id: flickableSanityCheck width: units.gu(30) height: units.gu(40) Rectangle { id: contentSanityCheck width: units.gu(20) height: units.gu(30) color: "yellow" } } Scrollbar { id: scrollbarSanityCheck flickableItem: flickableSanityCheck } } } ScrollbarTestCase { name: "Scrollbar" function getFreshFlickable(alignment) { var wrapper = flickableComp.createObject(column, { scrollbarAlignment: alignment } ) verify(wrapper !== null, "Error: dynamic item creation failed.") compare(wrapper.scrollbar.align, alignment, "getFreshFlickable: wrong alignment.") currComponent = wrapper return currComponent } function cleanup() { if (currComponent) { currComponent.destroy() currComponent = null } gc() } function init_data() { return [ { tag: "vertical scrollbar", alignment: Qt.AlignTrailing }, { tag: "horizontal scrollbar", alignment: Qt.AlignBottom } ] } function clickOnStepperAndCheckNoContentPositionChange(msgPrefix, itemToClickOn, flickable, expectedContentX, expectedContentY) { clickInTheMiddle(itemToClickOn) wait(150) checkNoContentPositionChange(msgPrefix, flickable, expectedContentX, expectedContentY) } //NOTE: this does not test that the properties have the correct value, just that //their values is not out of range (so it only applies to numeric values or enums) function performStyleSanityCheck(scrollbar) { var style = scrollbar.__styleInstance /***************************************************** * STYLING PROPERTIES * *****************************************************/ verify(style.minimumSliderSize >= 0, "Sanity check: invalid property value.") verify(style.overlayOpacityWhenShown > 0, "Sanity check: invalid property value.") verify(style.overlayOpacityWhenHidden >= 0, "Sanity check: invalid property value.") verify(style.troughThicknessSteppersStyle > 0, "Sanity check: invalid property value.") verify(style.troughThicknessThumbStyle > 0, "Sanity check: invalid property value.") verify(style.troughThicknessIndicatorStyle > 0, "Sanity check: invalid property value.") verify(style.sliderRadius >= 0, "Sanity check: invalid property value.") verify(style.thumbThickness > 0, "Sanity check: invalid property value.") verify(style.indicatorThickness > 0, "Sanity check: invalid property value.") verify(style.scrollbarThicknessAnimation.duration >= 0, "Sanity check: invalid property value.") verify(style.scrollbarFadeInAnimation.duration >= 0, "Sanity check: invalid property value.") verify(style.scrollbarFadeOutAnimation.duration >= 0, "Sanity check: invalid property value.") verify(style.scrollbarFadeOutPause >= 0, "Sanity check: invalid property value.") verify(style.scrollbarCollapsePause >= 0, "Sanity check: invalid property value.") verify(style.shortScrollingRatio > 0, "Sanity check: invalid property value.") verify(style.longScrollingRatio > 0, "Sanity check: invalid property value.") verify(style.hintingStyle === 'thumb' || style.hintingStyle === 'indicator', "Sanity check: invalid property value.") verify(style.thumbsExtremesMargin >= 0, "Sanity check: invalid property value.") /***************************************************** * HELPER PROPERTIES * *****************************************************/ var slider = getThumb(scrollbar) var trough = getTrough(scrollbar) verify(!!style.thumb, "Sanity check: invalid property value.") verify(!!style.trough, "Sanity check: invalid property value.") //flickable helper properties verify(!!style.flickableItem, "Sanity check: invalid property value.") /***************************************************** * INTERNAL PROPERTIES AND FUNCTIONS * *****************************************************/ var thumbArea = getThumbArea(scrollbar) var scrollAnimation = getScrollAnimation(scrollbar) verify(style.nonOverlayScrollbarMargin >= 0, "Sanity check: invalid property value.") verify(style.touchDragStartMargin >= 0, "Sanity check: invalid property value.") verify(style.dragThreshold >= 0, "Sanity check: invalid property value.") } function test_bottomAlign_anchors() { compare(scrollbar_bottomAlign_anchors.flickableItem, flickable_bottomAlign_anchors, "wrong flickableItem") compare(scrollbar_bottomAlign_anchors.anchors.left, scrollbar_bottomAlign_anchors.flickableItem.left, "left anchor") compare(scrollbar_bottomAlign_anchors.anchors.right, scrollbar_bottomAlign_anchors.flickableItem.right, "right anchor") compare(scrollbar_bottomAlign_anchors.anchors.bottom, scrollbar_bottomAlign_anchors.flickableItem.bottom, "bottom anchor") //we can't check that the top anchor is not anchored } function test_topAlign_anchors() { compare(scrollbar_topAlign_anchors.flickableItem, flickable_topAlign_anchors, "wrong flickableItem") compare(scrollbar_topAlign_anchors.anchors.left, scrollbar_topAlign_anchors.flickableItem.left, "left anchor") compare(scrollbar_topAlign_anchors.anchors.right, scrollbar_topAlign_anchors.flickableItem.right, "right anchor") compare(scrollbar_topAlign_anchors.anchors.top, scrollbar_topAlign_anchors.flickableItem.top, "top anchor") } function test_leadingAlign_anchors() { compare(scrollbar_leadingAlign_anchors.flickableItem, flickable_leadingAlign_anchors, "wrong flickableItem") compare(scrollbar_leadingAlign_anchors.anchors.left, scrollbar_leadingAlign_anchors.flickableItem.left, "left anchor") compare(scrollbar_leadingAlign_anchors.anchors.bottom, scrollbar_leadingAlign_anchors.flickableItem.bottom, "bottom anchor") compare(scrollbar_leadingAlign_anchors.anchors.top, scrollbar_leadingAlign_anchors.flickableItem.top, "top anchor") } function test_trailingAlign_anchors() { compare(scrollbar_trailingAlign_anchors.flickableItem, flickable_trailingAlign_anchors, "wrong flickableItem") compare(scrollbar_trailingAlign_anchors.anchors.right, scrollbar_trailingAlign_anchors.flickableItem.right, "right anchor") compare(scrollbar_trailingAlign_anchors.anchors.bottom, scrollbar_trailingAlign_anchors.flickableItem.bottom, "bottom anchor") compare(scrollbar_trailingAlign_anchors.anchors.top, scrollbar_trailingAlign_anchors.flickableItem.top, "top anchor") } function test_indicatorStyleWhileFlicking_shortContent(data) { var freshTestItem = getFreshFlickable(data.alignment) var flickable = freshTestItem.flickable var scrollbar = freshTestItem.scrollbar compare(scrollbar.__styleInstance.veryLongContentItem, false, "Scrollable item should be short.") //The final "1" is a workaround to bug #1549256 flick(flickable, 2, 2, -units.gu(10), -units.gu(10), undefined, undefined, undefined, undefined, 1) tryCompare(flickable, "moving", true, 5000, "Flickable not moving after simulating a flick.") compare(scrollbar.__styleInstance.state, "indicator", "Wrong style while flicking.") //we don't set it up before because the hinting feature already changes the state setupSignalSpy(anotherSignalSpy, scrollbar.__styleInstance, "stateChanged") //wait for the flickable to stop tryCompare(flickable, "moving", false, 5000, "Flickable still moving after timeout.") anotherSignalSpy.wait() compare(anotherSignalSpy.count, 1, "State unchanged after Flickable stopped moving.") compare(scrollbar.__styleInstance.state, "hidden", "Wrong style after the item stopped moving.") } function test_thumbStyleWhileFlicking_veryLongContent(data) { var freshTestItem = getFreshFlickable(data.alignment) var flickable = freshTestItem.flickable var scrollbar = freshTestItem.scrollbar setupSignalSpy(signalSpy, scrollbar.__styleInstance, "veryLongContentItemChanged") setVeryLongContentItem(flickable, scrollbar.__styleInstance, false) signalSpy.wait() compare(scrollbar.__styleInstance.veryLongContentItem, true, "Very long content item not detected") //The final "1" is a workaround to bug #1549256 flick(flickable, 2, 2, -units.gu(10), -units.gu(10), undefined, undefined, undefined, undefined, 1) tryCompare(flickable, "moving", true, 5000, "Flickable not moving after simulating a flick.") compare(scrollbar.__styleInstance.state, "thumb", "Wrong style while flicking a very long item") setupSignalSpy(anotherSignalSpy, scrollbar.__styleInstance, "stateChanged") //wait for the flickable to stop tryCompare(flickable, "moving", false, 5000, "Flickable still moving after timeout.") anotherSignalSpy.wait() compare(anotherSignalSpy.count, 1, "State unchanged after Flickable stopped moving.") compare(scrollbar.__styleInstance.state, "hidden", "Wrong style after a the item stopped moving.") } function test_scrollingWithContentMargins(data) { var freshTestItem = getFreshFlickable(data.alignment) var flickable = freshTestItem.flickable var scrollbar = freshTestItem.scrollbar var style = freshTestItem.scrollbar.__styleInstance var scrollbarUtils = getScrollbarUtils(scrollbar) //to make sure that it's only scrolling in the direction it should var notScrollingProperty = scrollbarUtils.propContent === "contentX" ? "contentY" : "contentX" addContentMargins(flickable) style.scrollToBeginning(false) compare(flickable[notScrollingProperty], 0, "ContentX changed when it shouldn't") compare(flickable[scrollbarUtils.propContent], style.isVertical ? -flickable.topMargin : -flickable.leftMargin, "Wrong beginning contentY") style.scrollToEnd(false) compare(flickable[notScrollingProperty], 0, "ContentX changed when it shouldn't") compare(flickable[scrollbarUtils.propContent], style.isVertical ? flickable.contentHeight + flickable.bottomMargin - flickable[scrollbarUtils.propSize] : flickable.contentWidth + flickable.rightMargin - flickable[scrollbarUtils.propSize], "Wrong end contentY") //contentHeight+top+bottom is the max you can scroll anyway, so it's //safe to use it, and the scrollbar should go to returnToBounds() if it goes beyond var maxScrolling = style.totalContentSize style.scrollBy(-maxScrolling, false) compare(flickable[notScrollingProperty], 0, "ContentX changed when it shouldn't") compare(flickable[scrollbarUtils.propContent], style.isVertical ? -flickable.topMargin : -flickable.leftMargin, "scrollBy: wrong contentY after scrolling to the beginning") style.scrollBy(maxScrolling, false) compare(flickable[notScrollingProperty], 0, "ContentX changed when it shouldn't") compare(flickable[scrollbarUtils.propContent], style.isVertical ? flickable.contentHeight + flickable.bottomMargin - flickable[scrollbarUtils.propSize] : flickable.contentWidth + flickable.rightMargin - flickable[scrollbarUtils.propSize], "scrollBy: wrong contentY after scrolling to the end") //we can only scroll up now var oldContentProp = flickable[scrollbarUtils.propContent] style.scrollBy(-units.gu(1), false) compare(flickable[scrollbarUtils.propContent], oldContentProp - units.gu(1), "scrollBy: wrong contentY after scrolling by +1GU") style.scrollBy(units.gu(1), false) compare(flickable[scrollbarUtils.propContent], oldContentProp, "scrollBy: wrong contentY after scrolling by -1GU") } function test_showSteppers(data) { var freshTestItem = getFreshFlickable(data.alignment) var flickable = freshTestItem.flickable var scrollbar = freshTestItem.scrollbar var steppersTransition = findInListProperty(scrollbar.__styleInstance.transitions, "indicatorToThumbSteppersTransition") verify(steppersTransition !== null, "Could not find transition object") setupSignalSpy(signalSpy, scrollbar.__styleInstance, "stateChanged") setupSignalSpy(anotherSignalSpy, steppersTransition, "runningChanged") //show steppers on mouse move mouseMove(scrollbar, 0, 0) signalSpy.wait() compare(signalSpy.count, 1, "Mouse move doesn't trigger state change") anotherSignalSpy.wait() compare(anotherSignalSpy.count, 1, "Mouse move doesn't trigger state transition") compare(scrollbar.__styleInstance.state, "steppers", "Mouse move doesn't trigger steppers state.") var firstStepper = getFirstStepper(scrollbar) var secondStepper = getSecondStepper(scrollbar) var trough = getTrough(scrollbar) compare(trough.visible, true, "Trough not visible in steppers state") compare(firstStepper.visible, true, "First stepper not visible in steppers state") compare(secondStepper.visible, true, "Second stepper not visible in steppers state") anotherSignalSpy.wait() compare(anotherSignalSpy.count, 2, "State transition does not complete.") compare(steppersTransition.running, false, "State transition does not stop.") if (scrollbar.__styleInstance.isVertical) { compare(trough.width, scrollbar.__styleInstance.troughThicknessSteppersStyle, "Wrong trough thickness in steppers style") } else { compare(trough.height, scrollbar.__styleInstance.troughThicknessSteppersStyle, "Wrong trough thickness in steppers style") } } function test_dragThumb(data) { var freshTestItem = getFreshFlickable(data.alignment) var flickable = freshTestItem.flickable var scrollbar = freshTestItem.scrollbar var thumb = getThumb(scrollbar) var thumbArea = getThumbArea(scrollbar) var trough = getTrough(scrollbar) var style = freshTestItem.scrollbar.__styleInstance var scrollbarUtils = getScrollbarUtils(scrollbar) addContentMargins(flickable) setContentPositionToTopLeft(flickable) triggerSteppersMode(scrollbar) if (style.isVertical) { mouseDrag(thumb, thumb.width/2, thumb.height/2, 0, trough.height) compare(flickable[scrollbarUtils.propContent], flickable.contentHeight + flickable.bottomMargin - flickable.height, "Vertical thumb mouse drag: wrong contentProp after dragging to the end") var sceneThumbY = thumb.mapToItem(column).y //Cannot use mouseDrag here, because the thumb is at the end of the trough. //mouseDrag uses //mouseMove(item, x + util.dragThreshold + 1, y + util.dragThreshold + 1, delay, button) //to trigger the drag, but in our case that cannot work because the scrollbar is at //the end of the trough, hence cannot move to its //bottom (vertical scrollbar) or to its right (in the case of the horiz scrollbar) mousePress(thumb, thumb.width/2, thumb.height/2) mouseMove(thumb, thumb.width/2, 0 ) mouseMove(thumb, thumb.width/2, -sceneThumbY) mouseRelease(thumb, 0, 0) compare(flickable[scrollbarUtils.propContent], -flickable.topMargin, "Vertical thumb mouse drag: wrong contentProp after dragging to the beginning") } else { mouseDrag(thumb, thumb.width/2, thumb.height/2, trough.width, 0) compare(flickable[scrollbarUtils.propContent], flickable.contentWidth + flickable.rightMargin - flickable.width, "Horizontal thumb mouse drag: wrong contentProp after dragging to the end") var sceneThumbX = thumb.mapToItem(column).x //Can't use mouseDrag here, read above to know why mousePress(thumb, thumb.width/2, thumb.height/2) mouseMove(thumb, 0, thumb.height/2 ) mouseMove(thumb, -sceneThumbX, thumb.height/2) mouseRelease(thumb, 0, 0) compare(flickable[scrollbarUtils.propContent], -flickable.leftMargin, "Horizontal thumb mouse drag: wrong contentProp after dragging to the beginning") } } function test_hinting_data() { return [ //ownSide here is the side the scrollable cares about, i.e. height for vert scrollbar {tag: "vertical scrollbar, no scrollable side, short content item", alignment: Qt.AlignTrailing, scrollableHorizontally: false, scrollableVertically: false, veryLong: false }, {tag: "horizontal scrollbar, no scrollable side, short content item", alignment: Qt.AlignBottom, scrollableHorizontally: false, scrollableVertically: false, veryLong: false }, {tag: "vertical scrollbar, horizontal side scrollable, short content item", alignment: Qt.AlignTrailing, scrollableHorizontally: true, scrollableVertically: false, veryLong: false }, {tag: "horizontal scrollbar, horizontal side scrollable, short content item", alignment: Qt.AlignBottom, scrollableHorizontally: true, scrollableVertically: false, veryLong: false }, {tag: "vertical scrollbar, vertical side scrollable, short content item", alignment: Qt.AlignTrailing, scrollableHorizontally: false, scrollableVertically: true, veryLong: false }, {tag: "horizontal scrollbar, vertical side scrollable, short content item", alignment: Qt.AlignBottom, scrollableHorizontally: false, scrollableVertically: true, veryLong: false }, {tag: "vertical scrollbar, both sides scrollable, short content item", alignment: Qt.AlignTrailing, scrollableHorizontally: true, scrollableVertically: true, veryLong: false }, {tag: "horizontal scrollbar, both sides scrollable, short content item", alignment: Qt.AlignBottom, scrollableHorizontally: true, scrollableVertically: true, veryLong: false }, {tag: "vertical scrollbar, no scrollable side, long content item", alignment: Qt.AlignTrailing, scrollableHorizontally: false, scrollableVertically: false, veryLong: true }, {tag: "horizontal scrollbar, no scrollable side, long content item", alignment: Qt.AlignBottom, scrollableHorizontally: false, scrollableVertically: false, veryLong: true }, {tag: "vertical scrollbar, horizontal side scrollable, long content item", alignment: Qt.AlignTrailing, scrollableHorizontally: true, scrollableVertically: false, veryLong: true }, {tag: "horizontal scrollbar, horizontal side scrollable, long content item", alignment: Qt.AlignBottom, scrollableHorizontally: true, scrollableVertically: false, veryLong: true }, {tag: "vertical scrollbar, vertical side scrollable, long content item", alignment: Qt.AlignTrailing, scrollableHorizontally: false, scrollableVertically: true, veryLong: true }, {tag: "horizontal scrollbar, vertical side scrollable, long content item", alignment: Qt.AlignBottom, scrollableHorizontally: false, scrollableVertically: true, veryLong: true }, {tag: "vertical scrollbar, both sides scrollable, long content item", alignment: Qt.AlignTrailing, scrollableHorizontally: true, scrollableVertically: true, veryLong: true }, {tag: "horizontal scrollbar, both sides scrollable, long content item", alignment: Qt.AlignBottom, scrollableHorizontally: true, scrollableVertically: true, veryLong: true }, ]; } //test that the scrollbar is shown on contentHeight/width changes function test_hinting(data) { var freshTestItem = getFreshFlickable(data.alignment) var flickable = freshTestItem.flickable var scrollbar = freshTestItem.scrollbar var style = freshTestItem.scrollbar.__styleInstance //we'll add it 1gu to simulate a change that doesn't make it become scrollable //so we need to make sure adding 1gu doesn't make it scrollable verify(flickable.width > units.gu(5), "Flickable width assumption is satisfied.") verify(flickable.height > units.gu(5), "Flickable height assumption is satisfied.") flickable.contentWidth = units.gu(2) flickable.contentHeight = units.gu(2) checkNonScrollableState(scrollbar) if (data.scrollableHorizontally) { if (data.veryLong) { setVeryLongContentItem(flickable, style, true) tryCompare(style, "veryLongContentItem", true, 5000, "Hinting: veryLongContentItem should be true.") } else { flickable.contentWidth = flickable.width + units.gu(1) } if (!style.isVertical) { checkHinting(scrollbar) //wait for the hinting to finish checkScrollableAndHidden(scrollbar) } else { //make sure the scrollbar was not affected by the size change of the opposite side checkNonScrollableState(scrollbar) } } if (data.scrollableVertically) { if (data.veryLong) { setVeryLongContentItem(flickable, style, false) tryCompare(style, "veryLongContentItem", true, 5000, "Hinting: veryLongContentItem should be true.") } else { flickable.contentHeight = flickable.height + units.gu(1) } if (style.isVertical) { checkHinting(scrollbar) checkScrollableAndHidden(scrollbar) } else { //Only make sure that the horiz scrollbar is not scrollable IF //we didn't previously also make the horizontal side scrollable if (!data.scrollableHorizontally) { checkNonScrollableState(scrollbar) } } } //try changing contentHeight flickable.contentHeight += units.gu(1) if (style.isVertical && data.scrollableVertically) { checkHinting(scrollbar) checkScrollableAndHidden(scrollbar) } else if (!style.isVertical && data.scrollableHorizontally) { compare(style.state, "hidden", "Wrong state.") } else { checkNonScrollableState(scrollbar) } flickable.contentWidth += units.gu(1) if (!style.isVertical && data.scrollableHorizontally) { checkHinting(scrollbar) checkScrollableAndHidden(scrollbar) } else if (style.isVertical && data.scrollableVertically) { compare(style.state, "hidden", "Wrong state.") } else { checkNonScrollableState(scrollbar) } } function test_minimumSliderSize(data) { var freshTestItem = getFreshFlickable(data.alignment) var flickable = freshTestItem.flickable var scrollbar = freshTestItem.scrollbar var trough = getTrough(scrollbar) var thumb = getThumb(scrollbar) var style = freshTestItem.scrollbar.__styleInstance var minSize = style.minimumSliderSize verify(trough !== null, "Could not find the trough.") verify(thumb !== null, "Could not find the thumb.") if (style.isVertical) { //ignore margins etc, just go for an upper bound flickable.contentHeight = flickable.height * (flickable.height / minSize) + units.gu(100) compare(thumb.height, minSize, "Thumb does not respect the minimum size.") } else { flickable.contentWidth = flickable.width * (flickable.width / minSize) + units.gu(100) compare(thumb.width, minSize, "Thumb does not respect the minimum size.") } } function test_scrollingRatioValuesSanityCheck() { var freshTestItem = getFreshFlickable(Qt.AlignTrailing) var style = freshTestItem.scrollbar.__styleInstance verify(style.shortScrollingRatio > 0, true, "Short scrolling ratio must be > 0.") verify(style.longScrollingRatio > 0, true, "Short scrolling ratio must be > 0.") verify(style.shortScrollingRatio <= style.longScrollingRatio, true, "Short scrolling ratio is higher than long scrolling ratio.") } // NOTE: ANY FAILURE COMING AFTER MOUSEPRESS WILL LEAVE THE MOUSE IN A DIRTY STATE! // (QQuickWindow's mouseGrabberItem is not reset) // OTHER TESTS WILL FAIL JUST BECAUSE THIS TEST HAS NOT CALLED MOUSERELEASE! // I REPORTED https://bugreports.qt.io/browse/QTBUG-51193 TO GET THIS FIXED function test_resetDragWhenMouseIsVeryFarFromTheThumb(data) { var freshTestItem = getFreshFlickable(data.alignment) var flickable = freshTestItem.flickable var scrollbar = freshTestItem.scrollbar var thumb = getThumb(scrollbar) var style = freshTestItem.scrollbar.__styleInstance compare(style.isScrollable, true, "Item is assumed to be scrollable.") triggerSteppersMode(scrollbar) var contentXBackup = flickable.contentX var contentYBackup = flickable.contentY //coords of the 2 mouse move used to simulate a drag var firstStep = units.gu(5) var secondStep = units.gu(10) var releaseCoord = units.gu(11) mousePress(thumb, 0, 0) mouseMove(thumb, (style.isVertical ? 0 : firstStep), (style.isVertical ? firstStep : 0)) mouseMove(thumb, (style.isVertical ? 0 : secondStep), (style.isVertical ? secondStep : 0)) var newContentX = flickable.contentX var newContentY = flickable.contentY if (style.isVertical) { verify(newContentY !== contentYBackup, "Check that mouse drag changed contentY." ) } else { verify(newContentX !== contentXBackup, "Check that mouse drag changed contentX." ) } mouseMove(thumb, (style.isVertical ? dragResetThreshold(scrollbar)+1 : secondStep), (style.isVertical ? secondStep : dragResetThreshold(scrollbar)+1)) //check that it goes back to the pre-drag content position, as if the drag never started checkNoContentPositionChange("Mouse drag reset", flickable, contentXBackup, contentYBackup) //go back to the old position mouseMove(thumb, (style.isVertical ? 0 : secondStep), (style.isVertical ? secondStep : 0)) //resume the drag by moving at least 1 px (scrollbar should have 0 drag threshold) mouseMove(thumb, (style.isVertical ? 0 : secondStep + style.dragThreshold + 1), (style.isVertical ? secondStep + style.dragThreshold + 1 : 0)) //NOTE: now the thumb has moved, adding another mouseMove here will use //coordinates relative to the NEW position! mouseMove(thumb, (style.isVertical ? 0 : -(style.dragThreshold + 1)), (style.isVertical ? -(style.dragThreshold + 1) : 0)) //check that it goes back to the pre-drag content position, as if the drag never started checkNoContentPositionChange("Mouse drag reset", flickable, contentXBackup, contentYBackup) //test that we resume dragging if (style.isVertical) { verify(newContentY !== contentYBackup, "Check that mouse drag changed contentY." ) } else { verify(newContentX !== contentXBackup, "Check that mouse drag changed contentX." ) } //try moving the other way //FIXME: I'M USING +7 BECAUSE THE LOGIC USES (mouse.x - thumbArea.x) //AND HERE WE START AT 5px AND THEN MOVE BY 10x + 1 //THE LOGIC HAS TO USE A DIFFERENT CONDITION mouseMove(thumb, (style.isVertical ? -(dragResetThreshold(scrollbar) + 7) : secondStep), (style.isVertical ? secondStep : -(dragResetThreshold(scrollbar) + 7))) //check that it goes back to the pre-drag content position, as if the drag never started checkNoContentPositionChange("Mouse drag reset", flickable, contentXBackup, contentYBackup) mouseRelease(thumb, (style.isVertical ? -(dragResetThreshold(scrollbar) + 7) : secondStep), (style.isVertical ? secondStep : -(dragResetThreshold(scrollbar) + 7))) } function test_actionSteppers_data() { return [ {tag:"Content item with margins and vertical scrollbar", addContentMargins: true, alignment: Qt.AlignTrailing}, {tag:"Content item and vertical scrollbar", addContentMargins: false, alignment: Qt.AlignTrailing}, {tag:"Content item with margins and horizontal scrollbar", addContentMargins: true, alignment: Qt.AlignBottom}, {tag:"Content item and horizontal scrollbar", addContentMargins: false, alignment: Qt.AlignBottom} ]; } function test_actionSteppers(data) { var freshTestItem = getFreshFlickable(data.alignment) var flickable = freshTestItem.flickable var scrollbar = freshTestItem.scrollbar var trough = getTrough(scrollbar) var thumb = getThumb(scrollbar) var firstStepper = getFirstStepper(scrollbar) var secondStepper = getSecondStepper(scrollbar) var style = freshTestItem.scrollbar.__styleInstance var minSize = style.minimumSliderSize if (data.addContentMargins) { addContentMargins(flickable) } triggerSteppersMode(scrollbar) setContentPositionToTopLeft(flickable) var contentXBackup = flickable.contentX var contentYBackup = flickable.contentY clickOnStepperAndCheckNoContentPositionChange("First stepper", firstStepper, flickable, contentXBackup, contentYBackup) //NOTE: mouseClick(secondStepper, 0, 0) would trigger firstStepper, because //the logic uses contains(point) that also counts the edges! //(the code uses if firstStepper.contains else if secondStepper.contains //so it stops at the first branch) clickInTheMiddle(secondStepper) checkScrolling(flickable, contentXBackup, contentYBackup, style, false, 1, "Second stepper, first click") contentXBackup = flickable.contentX contentYBackup = flickable.contentY //do it once more clickInTheMiddle(secondStepper) checkScrolling(flickable, contentXBackup, contentYBackup, style, false, 1, "Second stepper, second click") setContentPositionToBottomRight(flickable) contentXBackup = flickable.contentX contentYBackup = flickable.contentY clickOnStepperAndCheckNoContentPositionChange("Second stepper", secondStepper, flickable, contentXBackup, contentYBackup) clickInTheMiddle(firstStepper) checkScrolling(flickable, contentXBackup, contentYBackup, style, false, -1, "First stepper, first click") contentXBackup = flickable.contentX contentYBackup = flickable.contentY //do it once more clickInTheMiddle(firstStepper) checkScrolling(flickable, contentXBackup, contentYBackup, style, false, -1, "First stepper, second click") } function test_defaultStylingValues() { var scrollbar = defaultValuesScrollbar var style = scrollbar.__styleInstance /***************************************************** * STYLING PROPERTIES * *****************************************************/ compare(style.interactive, style.isMouseConnected || style.veryLongContentItem, "Wrong styling property default value.") compare(style.minimumSliderSize, units.gu(3), "Wrong styling property default value.") compare(style.overlay, !style.alwaysOnScrollbars, "Wrong styling property default value.") compare(style.overlayOpacityWhenShown, 1.0, "Wrong styling property default value.") compare(style.overlayOpacityWhenHidden, 0.0, "Wrong styling property default value.") compare(style.troughThicknessSteppersStyle, units.dp(14), "Wrong styling property default value.") compare(style.troughThicknessThumbStyle, units.dp(14), "Wrong styling property default value.") compare(style.troughThicknessIndicatorStyle, units.dp(9), "Wrong styling property default value.") compare(style.troughColorThumbStyle, theme.palette.normal.foreground, "Wrong styling property default value.") compare(style.troughColorSteppersStyle, theme.palette.normal.foreground, "Wrong styling property default value.") compare(style.sliderColor, theme.palette.normal.foregroundText, "Wrong styling property default value.") compare(style.sliderRadius, units.dp(3), "Wrong styling property default value.") compare(style.thumbThickness, units.gu(1), "Wrong styling property default value.") compare(style.indicatorThickness, units.dp(3), "Wrong styling property default value.") compare(style.scrollbarThicknessAnimation.duration, UbuntuAnimation.SnapDuration, "Wrong styling property default value.") compare(style.scrollbarFadeInAnimation.duration, UbuntuAnimation.SlowDuration, "Wrong styling property default value.") compare(style.scrollbarFadeOutAnimation.duration, UbuntuAnimation.SlowDuration, "Wrong styling property default value.") compare(style.scrollbarFadeOutPause, 3000, "Wrong styling property default value.") compare(style.scrollbarCollapsePause, 1000, "Wrong styling property default value.") compare(style.shortScrollingRatio, 0.1, "Wrong styling property default value.") compare(style.longScrollingRatio, 0.9, "Wrong styling property default value.") compare(style.hintingStyle, style.veryLongContentItem ? 'thumb' : 'indicator', "Wrong styling property default value.") compare(style.thumbsExtremesMargin, units.dp(4), "Wrong styling property default value.") /***************************************************** * HELPER PROPERTIES * *****************************************************/ var slider = getThumb(scrollbar) var trough = getTrough(scrollbar) compare(style.thumb, slider, "Wrong styling property default value.") compare(style.trough, trough, "Wrong styling property default value.") compare(style.isScrollable, scrollbar.__private.scrollable && style.pageSize > 0.0 && style.contentSize > 0.0 && style.totalContentSize > style.pageSize, "Wrong styling property default value.") compare(style.isVertical, (scrollbar.align === Qt.AlignLeading) || (scrollbar.align === Qt.AlignTrailing), "Wrong styling property default value.") compare(style.frontAligned, scrollbar.align === Qt.AlignLeading, "Wrong styling property default value.") compare(style.rearAligned, scrollbar.align === Qt.AlignTrailing, "Wrong styling property default value.") compare(style.topAligned, scrollbar.align === Qt.AlignTop, "Wrong styling property default value.") compare(style.bottomAligned, scrollbar.align === Qt.AlignBottom, "Wrong styling property default value.") //flickable helper properties compare(style.flickableItem, scrollbar.flickableItem, "Wrong styling property default value.") compare(style.pageSize, (style.isVertical) ? (scrollbar.flickableItem.height) : (scrollbar.flickableItem.width), "Wrong styling property default value.") compare(style.contentSize, (style.isVertical) ? scrollbar.flickableItem.contentHeight : scrollbar.flickableItem.contentWidth, "Wrong styling property default value.") compare(style.leadingContentMargin, style.isVertical ? scrollbar.flickableItem.topMargin : scrollbar.flickableItem.leftMargin, "Wrong styling property default value.") compare(style.trailingContentMargin, style.isVertical ? scrollbar.flickableItem.bottomMargin : scrollbar.flickableItem.rightMargin, "Wrong styling property default value.") compare(style.totalContentSize, style.contentSize + style.leadingContentMargin + style.trailingContentMargin, "Wrong styling property default value.") /***************************************************** * INTERNAL PROPERTIES AND FUNCTIONS * *****************************************************/ var thumbArea = getThumbArea(scrollbar) var scrollAnimation = getScrollAnimation(scrollbar) compare(style.__recursionGuard, false, "Wrong styling property default value.") compare(style.__disableStateBinding, false, "Wrong styling property default value.") compare(style.__hinting, false, "Wrong styling property default value.") compare(style.draggingThumb, thumbArea.drag.active || slider.mouseDragging || slider.touchDragging, "Wrong styling property default value.") compare(style.thumbStyleFlag, style.veryLongContentItem && (scrollbar.flickableItem.moving || scrollAnimation.running), "Wrong styling property default value.") compare(style.veryLongContentItem, scrollbar.flickableItem && style.initialized && ((scrollbar.flickableItem.contentHeight > scrollbar.flickableItem.height * 10) || (scrollbar.flickableItem.contentWidth > scrollbar.flickableItem.width * 10)), "Wrong styling property default value.") compare(style.isMouseConnected, true, "Wrong styling property default value.") compare(style.nonOverlayScrollbarMargin, style.troughThicknessSteppersStyle, "Wrong styling property default value.") compare(style.useSteppers, true, "Wrong styling property default value.") compare(style.touchDragStartMargin, units.gu(2), "Wrong styling property default value.") compare(style.dragThreshold, units.dp(2), "Wrong styling property default value.") compare(style.alwaysOnScrollbars, scrollbar.__alwaysOnScrollbars, "Wrong styling property default value.") } //just a few tests to ensure the key variables don't get out of range values //NOTE: this does not test that the properties have the correct value, just that //their values is not out of range (so it only applies to numeric values) function test_sanityCheckStylingVariables() { flickableSanityCheck.contentHeight = contentSanityCheck.height flickableSanityCheck.contentWidth = contentSanityCheck.width performStyleSanityCheck(scrollbarSanityCheck) flickableSanityCheck.contentHeight = -contentSanityCheck.height flickableSanityCheck.contentWidth = -contentSanityCheck.width performStyleSanityCheck(scrollbarSanityCheck) flickableSanityCheck.topMargin = units.gu(1) flickableSanityCheck.leftMargin = units.gu(2) flickableSanityCheck.rightMargin = units.gu(3) flickableSanityCheck.bottomMargin = units.gu(4) performStyleSanityCheck(scrollbarSanityCheck) flickableSanityCheck.topMargin = -units.gu(1) flickableSanityCheck.leftMargin = -units.gu(2) flickableSanityCheck.rightMargin = -units.gu(3) flickableSanityCheck.bottomMargin = -units.gu(4) performStyleSanityCheck(scrollbarSanityCheck) } //Test that Scrollbar defaults to Flickable.topMargin/bottomMargin (content margins) //as its ANCHORS margins function test_topBottomMargins(data) { var freshTestItem = getFreshFlickable(data.alignment) var flickable = freshTestItem.flickable var scrollbar = freshTestItem.scrollbar compare(scrollbar.__styleInstance.isScrollable, true, "The view is not scrollable.") compare(scrollbar.__styleInstance.alwaysOnScrollbars, false, "This test assumes overlay scrollbars (if you need to change this, fix the expected margins).") compare(scrollbar.anchors.topMargin, flickable.topMargin, "Wrong anchors.topMargin.") compare(scrollbar.anchors.bottomMargin, flickable.bottomMargin, "Wrong anchors.bottomMargin.") flickable.topMargin = units.gu(1) compare(scrollbar.anchors.topMargin, units.gu(1), "Wrong anchors.topMargin.") compare(scrollbar.anchors.bottomMargin, flickable.bottomMargin, "Wrong anchors.bottomMargin.") flickable.bottomMargin = units.gu(3) compare(scrollbar.anchors.topMargin, units.gu(1), "Wrong anchors.topMargin.") compare(scrollbar.anchors.bottomMargin, units.gu(3), "Wrong anchors.bottomMargin.") flickable.topMargin = 0 flickable.bottomMargin = units.gu(6) compare(scrollbar.anchors.topMargin, 0, "Wrong anchors.topMargin.") compare(scrollbar.anchors.bottomMargin, units.gu(6), "Wrong anchors.bottomMargin.") } //check that we don't output lots of warnings when the flickable item becomes null //(it could happen while transitioning values or before the Binding applies and similar situations) function test_noWarningsWhenFlickableIsNull() { var freshTestItem = getFreshFlickable(Qt.AlignTrailing) var flickable = freshTestItem.flickable var scrollbar = freshTestItem.scrollbar verify(scrollbar.flickableItem !== null, "Check that Scrollbar is linked to a Flickable.") scrollbar.flickableItem = null //This test will always pass if run with qmltestrunner, unfortunately there's no way //using TestCase to do "if (testOutputsWarnings) --> fail", but the SDK test script //will fail if this test outputs warnings, which is what we want } } } ./tests/unit_x11/tst_components/tst_captions.qml0000644000015600001650000001115212700370701022210 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.2 import QtQuick.Layouts 1.1 Item { width: units.gu(40) height: units.gu(71) Column { width: parent.width ListItem { RowLayout { anchors.fill: parent Captions { id: defaults } } } ListItem { RowLayout { anchors.fill: parent Captions { id: testCaptions } } } } UbuntuTestCase { name: "CaptionsAPI" when: windowShown function test_0_defaults() { compare(defaults.captionStyle, Ubuntu.TitleCaptionStyle, "Default preset is 'titles'"); compare(defaults.height, 0, "default height is 0"); compare(defaults.width, 0, "default width is 0") compare(defaults.spacing, units.gu(0.5), "default spacing failure"); compare(defaults.visible, false, "default should be invisible") compare(defaults.Layout.alignment, Qt.AlignVCenter | Qt.AlignLeft, "center vertically and left horizontally by default"); } function test_captions_data() { return [ {tag: "caption, title.fontSize", captionStyle: Ubuntu.TitleCaptionStyle, label: "title", property: "fontSize", value: "medium"}, {tag: "caption, title.horizontalAlignment", captionStyle: Ubuntu.TitleCaptionStyle, label: "title", property: "horizontalAlignment", value: Text.AlignLeft}, {tag: "caption, title.elide", captionStyle: Ubuntu.TitleCaptionStyle, label: "title", property: "elide", value: Text.ElideRight}, {tag: "caption, subtitle.fontSize", captionStyle: Ubuntu.TitleCaptionStyle, label: "subtitle", property: "fontSize", value: "small"}, {tag: "caption, subtitle.horizontalAlignment", captionStyle: Ubuntu.TitleCaptionStyle, label: "subtitle", property: "horizontalAlignment", value: Text.AlignLeft}, {tag: "caption, subtitle.maximumLineCount", captionStyle: Ubuntu.TitleCaptionStyle, label: "subtitle", property: "maximumLineCount", value: 2}, {tag: "caption, subtitle.wrapMode", captionStyle: Ubuntu.TitleCaptionStyle, label: "subtitle", property: "wrapMode", value: Text.Wrap}, {tag: "caption, subtitle.elide", captionStyle: Ubuntu.TitleCaptionStyle, label: "subtitle", property: "elide", value: Text.ElideRight}, {tag: "summary, title.fontSize", captionStyle: Ubuntu.SummaryCaptionStyle, label: "title", property: "fontSize", value: "small"}, {tag: "summary, title.horizontalAlignment", captionStyle: Ubuntu.SummaryCaptionStyle, label: "title", property: "horizontalAlignment", value: Text.AlignRight}, {tag: "summary, title.elide", captionStyle: Ubuntu.SummaryCaptionStyle, label: "title", property: "elide", value: Text.ElideNone}, {tag: "summary, subtitle.fontSize", captionStyle: Ubuntu.SummaryCaptionStyle, label: "subtitle", property: "fontSize", value: "small"}, {tag: "summary, subtitle.horizontalAlignment", captionStyle: Ubuntu.SummaryCaptionStyle, label: "subtitle", property: "horizontalAlignment", value: Text.AlignRight}, {tag: "summary, subtitle.maximumLineCount", captionStyle: Ubuntu.SummaryCaptionStyle, label: "subtitle", property: "maximumLineCount", value: 1}, {tag: "summary, subtitle.wrapMode", captionStyle: Ubuntu.SummaryCaptionStyle, label: "subtitle", property: "wrapMode", value: Text.NoWrap}, {tag: "summary, subtitle.elide", captionStyle: Ubuntu.SummaryCaptionStyle, label: "subtitle", property: "elide", value: Text.ElideNone}, ]; } function test_captions(data) { testCaptions.captionStyle = data.captionStyle; compare(testCaptions[data.label][data.property], data.value, data.tag + " values differ"); } } } ./tests/unit_x11/tst_components/tst_stress_alarmmodel.qml0000644000015600001650000000500712700370701024112 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.2 MainView { width: units.gu(40) height: units.gu(71) AlarmModel { id: model } Alarm { id: testAlarm } UbuntuTestCase { name: "AlarmModelStressTest" when: windowShown SignalSpy { id: modelSpy signalName: "modelReset" target: model } property string testAlarmMessage: "test_" function createAlarm(pattern, idx) { testAlarm.reset(); testAlarm.message = pattern + idx; var dt = new Date(); dt.setMinutes(dt.getMinutes() + 10); testAlarm.date = dt; modelSpy.signalName = "rowsInserted"; testAlarm.save(); modelSpy.wait(); } function clearTestAlarms(pattern) { var i = 0; modelSpy.signalName = "rowsRemoved"; while (i < model.count) { var alarm = model.get(i); // this will fail if get() returns NULL if (alarm.message.indexOf(pattern) == 0) { alarm.cancel(); modelSpy.wait(); modelSpy.clear(); i = 0; } else { i++; } } } // need to create a huge amount of alarms then cleanone part of it function initTestCase() { for (var i = 0; i < 20; i++) { createAlarm(testAlarmMessage, i) } for (var i = 0; i < 40; i++) { createAlarm("testAlarm_", i) } } function cleanupTestCase() { clearTestAlarms(testAlarmMessage); } function test_remove_alarms() { clearTestAlarms("testAlarm_"); } } } ./tests/unit_x11/tst_components/tst_scrollbar_header.qml0000644000015600001650000003243712700370714023700 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Andrea Bernabei */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 import Ubuntu.Components.Styles 1.3 import QtQml.Models 2.1 Item { id: main width: units.gu(50) height: units.gu(100) Component { id: flickableComp Item { id: item width: units.gu(20) height: units.gu(30) property alias flickable: freshFlickable property alias scrollbar: freshScrollbar property alias content: content property alias scrollbarAlignment: freshScrollbar.align //Don't change this to a ListView, this usecase has to be simple, //we don't want the difficulties added by ListView, i.e. delegates //size estimation, dynamic contentWidth/Height, etc Flickable { id: freshFlickable anchors.fill: parent contentHeight: content.height contentWidth: content.width clip: true Rectangle { id: content width: units.gu(40) //make this much taller than the flickable to avoid timing issues when //detecting if the flickable is flicking in the tests height: units.gu(200) color: "blue" } } Scrollbar { id: freshScrollbar flickableItem: parent.flickable } } } SignalSpy { id: signalSpy } SignalSpy { id: anotherSignalSpy } Flickable { anchors.fill: parent Column { id: column Repeater { model: layoutsModel } } } VisualItemModel { id: layoutsModel Item { width: childrenRect.width height: childrenRect.height Flickable { id: randomFlickable } //complex PageHeader example taken from the PageHeader tutorial //https://developer.ubuntu.com/en/blog/2016/02/24/pageheader-tutorial/ MainView { id: mainView_movingHeaderTest width: units.gu(50) height: units.gu(80) clip: true property alias page: pageItem property alias standardHeader: standardHeaderItem property alias editHeader: editHeaderItem Page { id: pageItem header: standardHeaderItem Flickable { id: flickable_movingHeaderTest anchors.fill: parent //just make sure the scrollbar is scrollable contentHeight: mainView_movingHeaderTest.height * 2 contentWidth: mainView_movingHeaderTest.width * 2 Label { text: "Use the icons in the header." visible: standardHeaderItem.visible } } Scrollbar { id: scrollbar_movingHeaderTest flickableItem: flickable_movingHeaderTest } PageHeader { id: standardHeaderItem visible: pageItem.header === standardHeaderItem title: "Default title" flickable: flickable_movingHeaderTest trailingActionBar.actions: [ Action { iconName: "edit" text: "Edit" onTriggered: pageItem.header = editHeaderItem } ] } PageHeader { id: editHeaderItem visible: pageItem.header === editHeaderItem flickable: flickable_movingHeaderTest property Component delegate: Component { AbstractButton { id: button action: modelData width: label.width + units.gu(4) height: parent.height Rectangle { color: UbuntuColors.slate opacity: 0.1 anchors.fill: parent visible: button.pressed } Label { anchors.centerIn: parent id: label text: action.text font.weight: text === "Confirm" ? Font.Normal : Font.Light } } } leadingActionBar { anchors.leftMargin: 0 actions: Action { text: "Cancel" iconName: "close" onTriggered: pageItem.header = standardHeaderItem } delegate: editHeaderItem.delegate } trailingActionBar { anchors.rightMargin: 0 actions: Action { text: "Confirm" iconName: "tick" onTriggered: pageItem.header = standardHeaderItem } delegate: editHeaderItem.delegate } extension: Toolbar { anchors { left: parent.left right: parent.right bottom: parent.bottom } trailingActionBar.actions: [ Action { iconName: "bookmark-new" }, Action { iconName: "add" }, Action { iconName: "edit-select-all" }, Action { iconName: "edit-copy" }, Action { iconName: "select" } ] leadingActionBar.actions: Action { iconName: "delete" text: "delete" onTriggered: print("Delete action triggered") } } } } } } } ScrollbarTestCase { name: "Scrollbar" function getMovingHeaderView() { var wrapper = movingHeaderHandlingItem.createObject(column) verify(wrapper !== null, "Error: dynamic item creation failed.") currComponent = wrapper return currComponent } function cleanup() { if (currComponent) { currComponent.destroy() currComponent = null } gc() } function checkScrollbarPositionRelativeToPage(scrollbar, page, expectedY, msgPrefix) { compare(scrollbar.mapToItem(page).y, expectedY, msgPrefix + ": Scrollbar does not start below the header.") } function test_handlingOfMovingHeader_data() { return [ { tag: "Standard header", header: standardHeaderItem }, { tag: "Edit header (with extensions)", header: editHeaderItem }, //Setting header to null means using the old header, and: //- We don't support this behaviour when using the old header //- There is no API to get the height of the old header, so we can't test it //{ tag: "Null header", header: null } ] } function test_handlingOfMovingHeader(data) { var page = pageItem var header = data.header page.header = header console.log(page.header, header.flickable) //make sure the currently tested header is the one driving the flickable changes //FIXME: this should not be needed after #1560458 is fixed header.flickable = null header.flickable = flickable_movingHeaderTest compare(page.header, header, "Handling of moving header: wrong header.") compare(scrollbar_movingHeaderTest.__styleInstance.isVertical, true, "Scrollbar is not vertical.") compare(scrollbar_movingHeaderTest.__styleInstance.isScrollable, true, "Scrollbar is not scrollable.") //don't do the rest of the checks on the null header, just check that it's aligning with the old header implementation //(page.head.contents.height) if (data.header === null) { checkScrollbarPositionRelativeToPage(scrollbar_movingHeaderTest, page, page.head.contents.height, data.tag) return } else { header.flickable = flickable_movingHeaderTest compare(header.flickable, flickable_movingHeaderTest, "Wrong PageHeader flickable.") checkScrollbarPositionRelativeToPage(scrollbar_movingHeaderTest, page, page.header.height, data.tag) } var tmpHeaderHeight = header.height page.header.height += units.gu(1) //make sure the header actually has a different height now verify(scrollbar_movingHeaderTest.height !== tmpHeaderHeight, "Header height changed value.") checkScrollbarPositionRelativeToPage(scrollbar_movingHeaderTest, page, page.header.height, data.tag + ", after changing height") //now link the header to a null flickable and check that scrollbar is covered //the header (yes, we're checking that it creates bad UX, because we're expecting the //developer to set the anchors accordingly so that we don't need to add inter-components //dependencies. The test Page does not handle this on purpose, so the header //should cover the scrollbar) header.flickable = null compare(header.flickable, null, "Wrong PageHeader flickable.") expectFailContinue("Standard header", "Waiting on Header bug #1560458") checkScrollbarPositionRelativeToPage(scrollbar_movingHeaderTest, page, 0, data.tag) //reassign the correct flickable and check again header.flickable = flickable_movingHeaderTest compare(header.flickable, flickable_movingHeaderTest, "Wrong PageHeader flickable.") checkScrollbarPositionRelativeToPage(scrollbar_movingHeaderTest, page, page.header.height, data.tag + ", scrollbar") header.visible = false compare(header.visible, false, "Header visibility did not change, should have been false.") expectFailContinue("", "Waiting on Header bug #1560458") checkScrollbarPositionRelativeToPage(scrollbar_movingHeaderTest, page, 0, data.tag + ", invisible header") header.visible = true compare(header.visible, true, "Header visibility did not change, should have been true.") checkScrollbarPositionRelativeToPage(scrollbar_movingHeaderTest, page, page.header.height, data.tag + ", visible header") //even if the header has opacity 0, we should still take it into account. This is a standard in //QtQuick, you don't ignore a component just because opacity is 0, as that is also used for animations header.opacity = 0.0 compare(header.opacity, 0.0, "Header opacity did not change, should have been 0.") checkScrollbarPositionRelativeToPage(scrollbar_movingHeaderTest, page, page.header.height, data.tag + ", 0.0 header opacity") header.opacity = 1.0 compare(header.opacity, 1.0, "Header opacity did not change, should have been 1.") checkScrollbarPositionRelativeToPage(scrollbar_movingHeaderTest, page, page.header.height, data.tag + ", 1.0 header opacity") } } } ./tests/unit_x11/tst_components/tst_tabs_with_repeater.qml0000644000015600001650000002012112700370701024237 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.1 import Ubuntu.Test 1.0 MainView { id: testCase width: units.gu(50) height: units.gu(100) useDeprecatedToolbar: false ListModel { id: inputModel Component.onCompleted: { append({ "name": "tab 1" }); insert(0, { "name": "tab 0" }); append({ "name": "tab 3" }); insert(2, { "name": "tab 2" }); } } Tabs { id: tabsWithRepeater Repeater { objectName: "tabsRepeater" id: tabsRepeater model: inputModel Tab { title: name } } } Tabs { id: repeaterTabs Repeater { objectName: "repeater" id: repeater Tab { title: modelData } } } Tabs { id: twoRepeaters Repeater { objectName: "firstRepeater" id: firstRepeater model: inputModel Tab { title: name } } Repeater { objectName: "secondRepeater" id: secondRepeater model: testCase.listModel Tab { title: modelData } } } property var listModel: ["tab #0", "tab #1", "tab #2", "tab #3"]; Tabs { id: twinRepeaters ListModel { id: twinModel Component.onCompleted: { append({ "name": "twintab 1" }); insert(0, { "name": "twintab 0" }); append({ "name": "twintab 3" }); insert(2, { "name": "twintab 2" }); } } Repeater { objectName: "tabsRepeater" id: twinRepeater1 model: twinModel Tab { title: name } } Repeater { objectName: "tabsRepeater" id: twinRepeater2 model: twinModel Tab { title: name } } } UbuntuTestCase { name: "TabsWithRepeaterNewHeader" when: windowShown /* The following testcases are all related to bug #1253804 */ function test_tabOrder_bug1253804() { var tabsModel = tabsWithRepeater.__model; compare(tabsRepeater.count, inputModel.count, "Incorrect number of tabs in Tabs"); compare(tabsModel.count, tabsRepeater.count, "Incorrect number of tabs in TabBar"); for (var i=0; i < tabsModel.count; i++) { compare(tabsModel.get(i).title, inputModel.get(i).name, "Tab titles don't match for index "+i); } //shufle inputModel.move(1, 2, 1); inputModel.move(3, 0, 1); inputModel.move(1, 3, 1); // wait few miliseconds wait(50); for (i=0; i < tabsModel.count; i++) { compare(tabsModel.get(i).title, inputModel.get(i).name, "Tab titles after shuffling don't match for index "+i); } // set it to null tabsRepeater.model = null; compare(tabsWithRepeater.__model.count, 0, "There are still tabs left after repeater model is reset"); } function test_repeaterTabs() { repeater.model = inputModel; var tabsModel = repeaterTabs.__model; compare(repeater.count, inputModel.count, "Incorrect number of tabs in Tabs"); compare(tabsModel.count, repeater.count, "Incorrect number of tabs in TabBar"); for (var i=0; i < tabsModel.count; i++) { compare(tabsModel.get(i).title, inputModel.get(i).name, "Tab titles don't match for index "+i); } // clear repeaterTabs repeater.model = null; compare(repeaterTabs.__model.count, 0, "There are still tabs left after repeater model is reset"); } function test_repeaterTabs_arrayAsModel() { repeater.model = testCase.listModel; var tabsModel = repeaterTabs.__model; compare(repeater.count, testCase.listModel.length, "Incorrect number of tabs in Tabs"); compare(tabsModel.count, repeater.count, "Incorrect number of tabs in TabBar"); for (var i=0; i < tabsModel.count; i++) { compare(tabsModel.get(i).title, testCase.listModel[i], "Tab titles don't match for index "+i); } // shuffling elements in an array is not detectable in Repeater var x = testCase.listModel[1]; testCase.listModel[1] = testCase.listModel[0]; testCase.listModel[0] = x; expectFailContinue("", "Array changes are not detected by repeaters"); compare(tabsModel.get(0).title, testCase.listModel[0], "Tab titles don't match for index 0"); expectFailContinue("", "Array changes are not detected by repeaters"); compare(tabsModel.get(1).title, testCase.listModel[1], "Tab titles don't match for index 0"); // clear repeaterTabs repeater.model = null; compare(repeaterTabs.__model.count, 0, "There are still tabs left after repeater model is reset"); } function test_twoRepeaters() { var tabsModel = twoRepeaters.__model; var secondRepeaterModel = secondRepeater.model; compare(tabsModel.count, firstRepeater.count + secondRepeater.count, "Incorrect number of tabs in TabBar"); for (var i = 0; i < firstRepeater.count; i++) { compare(tabsModel.get(i).title, inputModel.get(i).name, "Tab titles don't match for index "+i); } for (i = firstRepeater.count; i < firstRepeater.count + secondRepeater.count; i++) { compare(tabsModel.get(i).title, secondRepeaterModel[i - firstRepeater.count], "Tab titles don't match for index "+i); } } function test_twinRepeaters() { var tabsModel = twinRepeaters.__model; compare(twinRepeater1.count, twinModel.count, "Incorrect number of tabs in the first repeater"); compare(twinRepeater2.count, twinModel.count, "Incorrect number of tabs in the second repeater"); compare(tabsModel.count, twinRepeater1.count + twinRepeater2.count, "Incorrect number of tabs in TabBar"); for (var j = 0; j < 2; j++) { for (var i = 0; i < twinModel.count; i++) { var index = j * twinModel.count + i; compare(tabsModel.get(index).title, twinModel.get(i).name, "Tab titles don't match for Tabs index " + index); } } //shuffle twinModel.move(1, 2, 1); twinModel.move(3, 0, 1); twinModel.move(1, 3, 1); // wait few miliseconds till Tabs update is realized wait(50); /* FIXME for (var j = 0; j < 2; j++) { for (var i = 0; i < twinModel.count; i++) { var index = j * twinModel.count + i; compare(tabsModel.get(index).title, twinModel.get(i).name, "Tab titles don't match for Tabs index " + index); } } */ // set it to null twinRepeater1.model = null; twinRepeater2.model = null; compare(twinRepeaters.__model.count, 0, "There are still tabs left after repeater model is reset"); } } } ./tests/unit_x11/tst_components/tabsmodel.h0000644000015600001650000000232012700370701021103 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #ifndef TABSMODEL_H #define TABSMODEL_H #include #include class TabsModel : public QAbstractListModel { Q_OBJECT Q_PROPERTY(int count READ rowCount NOTIFY countChanged); public: TabsModel(); int rowCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex&, int) const; QHash roleNames() const; Q_INVOKABLE void append(const QString &title); Q_INVOKABLE QVariantMap get(int index); Q_SIGNALS: void countChanged(); private: QStringList m_list; }; #endif ./tests/unit_x11/tst_components/tst_slider.qml0000644000015600001650000000767112700370701021665 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 MainView { width: units.gu(40) height: units.gu(71) Column { anchors { fill: parent margins: units.gu(1) } UbuntuListView { id: listView width: parent.width height: units.gu(20) clip: true model: 10 delegate: Standard { control: Slider { objectName: "testSlider" + index } } } UbuntuListView { id: listView2 width: parent.width height: units.gu(20) clip: true model: 10 delegate: Slider { objectName: "testSlider" + index } } Flickable { id: flickable width: parent.width height: units.gu(20) clip: true contentHeight: column.height Column { id: column width: parent.width height: childrenRect.height Repeater { model: 10 Standard { control: Slider { objectName: "testSlider" + index } } } } } Flickable { id: flickable2 width: parent.width height: units.gu(20) clip: true contentHeight: column2.height Column { id: column2 width: parent.width height: childrenRect.height Repeater { model: 10 Slider { objectName: "testSlider" + index } } } } } UbuntuTestCase { name: "SliderAPI" when: windowShown SignalSpy { id: flickSpy signalName: "onMovementStarted" } function cleanup() { flickSpy.target = null; flickSpy.clear(); } function test_slider_blocks_flickable_data() { return [ {tag: "ListView with Slider in ListItem", flickable: listView}, {tag: "ListView with Slider alone", flickable: listView2}, {tag: "Flickable with Column of Slider in ListItem", flickable: flickable}, {tag: "Flickable with Column of Slider alone", flickable: flickable2}, ]; } function test_slider_blocks_flickable(data) { flickSpy.target = data.flickable; var slider = findChild(data.flickable, "testSlider1"); verify(slider, "cannot find test slider in " + data.tag); var sliderPos = slider.mapToItem(data.flickable, units.gu(10), 0); mouseDrag(data.flickable, sliderPos.x, sliderPos.y, units.gu(20), units.gu(20)); waitForRendering(data.flickable, 200); compare(flickSpy.count, 0, "The Flickable should not move while Slider is active."); compare(data.flickable.interactive, true, "The Flickable aint got back to interactive mode."); } } } ./tests/unit_x11/tst_components/tst_listitems_itemselector.qml0000644000015600001650000001036412700370701025170 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 as ListItem import Ubuntu.Test 1.0 Item { width: 400 height: 400 Column { anchors { left: parent.left right: parent.right } ListItem.ItemSelector { id: selector text: "TEST" delegate: selectorDelegate model: customModel } OptionSelectorDelegate { id: testDelegate text: "TEST" subText: "test" iconSource: "../../resources/optionselector/test.png" constrainImage: true } } Column { anchors.left: parent.left anchors.right: parent.right ListItem.ItemSelector { id: expandedSelector text: i18n.tr("Return results from:") model: [i18n.tr("Phone only"), i18n.tr("Phone and Internet")] expanded: true } } Component { id: selectorDelegate OptionSelectorDelegate { text: name subText: description iconSource: image constrainImage: true } } ListModel { id: customModel ListElement { name: "Name 1"; description: "Description 1"; image: "../../resources/optionselector/test.png" } ListElement { name: "Name 2"; description: "Description 2"; image: "../../resources/optionselector/test.png" } ListElement { name: "Name 3"; description: "Description 3"; image: "../../resources/optionselector/test.png" } ListElement { name: "Name 4"; description: "Description 4"; image: "../../resources/optionselector/test.png" } } UbuntuTestCase { name: "ItemSelectorAPI" when: windowShown function test_expanded() { var listContainer = findChild(selector, "listContainer"); selector.expanded = false; compare(listContainer.currentlyExpanded, false, "expanded should be true if list is an expanded one"); compare(listContainer.state, "collapsed", "state should be collapsed"); selector.expanded = true; compare(listContainer.currentlyExpanded, true, "expanded should be false if list is an expanded one"); compare(listContainer.state, "expanded", "state should be expanded"); } function test_text() { var newText = "Hello World!"; selector.text = newText; compare(selector.text, newText, "set/get"); } function test_0_selectedIndex() { compare(selector.selectedIndex, 0, "selectedIndex is 0 by default"); } function test_model() { selector.delegate = null; selector.model = undefined; var newValues = ["value0","value1","value2","value3"]; selector.model = newValues; compare(selector.model, newValues, "set/get"); selector.model = customModel; selector.delegate = selectorDelegate } function test_custom_model_delegate() { compare(selector.model, customModel, "Model wasn't set correctly."); compare(selector.delegate, selectorDelegate, "Delegate hasn't been set correctly"); } function test_image_constraint() { var image = findChild(testDelegate, "icon"); compare(image.height, testDelegate.height); } function test_expandedSelector() { verify(expandedSelector.containerHeight > 0, "Expanded ItemSelector height negative"); } } } ./tests/unit_x11/tst_components/tst_datepicker.qml0000644000015600001650000006420012700370701022505 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Pickers 1.0 Item { id: testSuite width: units.gu(40) height: units.gu(71) Component { id: testComponent DatePicker { width: testSuite.width } } Loader { id: pickerLoader asynchronous: false width: parent.width } UbuntuTestCase { name: "DatePickerAPI" when: windowShown readonly property DatePicker picker: pickerLoader.item function init() { pickerLoader.sourceComponent = testComponent; tryCompareFunction(function(){return pickerLoader.status}, Loader.Ready); waitPickerMoving(); } function cleanup() { pickerLoader.sourceComponent = undefined; } function waitPickerMoving() { waitForRendering(picker); tryCompareFunction(function(){return picker.moving}, false); } function getPickerLabel(picker, name) { var pickerItem = findChild(picker, name); var pickerCurrent = findChild(pickerItem, "Picker_ViewLoader"); // note: find Label, Picker's label uses medium font size. The lookup must be changed // if the fontSize is changed! var pickerLabel = findChildWithProperty(pickerCurrent.item.currentItem, "fontSize", "medium"); verify(pickerLabel, ("Label of %1 not accessible").arg(name)); return pickerLabel; } function getPickerModel(picker, name) { var pickerItem = findInvisibleChild(picker, name); return pickerItem ? pickerItem.model : undefined; } function setHMS(date, h, m, s) { date.setHours(h); date.setMinutes(m); date.setSeconds(s); return date; } function test_0_mode() { compare(picker.mode, "Years|Months|Days", "default mode"); } function test_0_date() { var date = (new Date()).midnight(); compare(picker.date, date, "default mode"); compare(picker.year, date.getFullYear(), "default year"); compare(picker.month, date.getMonth(), "default month"); compare(picker.day, date.getDate(), "default day"); compare(picker.week, date.getWeek(), "default week"); compare(picker.hours, date.getHours(), "default hour"); compare(picker.minutes, date.getMinutes(), "default minute"); compare(picker.seconds, date.getSeconds(), "default second"); } function test_0_minimum_maximum() { var endDate = Date.prototype.midnight.call(new Date()); endDate.setFullYear(endDate.getFullYear() + 50); compare(picker.minimum, picker.date, "default minimum is same as date property"); compare(picker.maximum, endDate, "default maximum is a 50 years window"); } function test_0_locale() { compare(picker.locale, Qt.locale(), "default locale is the same as system locale"); } function test_1_changeModeYM() { var newMode = "Years|Months"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeMD() { var newMode = "Days|Months"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeYD() { ignoreWarning('Invalid DatePicker mode: Years|Days') var newMode = "Years|Days"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; // no rendering is expected, no need to wait var positioner = findChild(picker, "PickerRow_Positioner"); expectFailContinue("", "Invalid mode"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeY() { var newMode = "Years"; var pickerCount = 1 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeM() { var newMode = "Months"; var pickerCount = 1 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeD() { var newMode = "Days"; var pickerCount = 1 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeHMS() { var newMode = "Hours|Minutes|Seconds"; var pickerCount = 3 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeHM() { var newMode = "Hours|Minutes"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeMS() { var newMode = "Minutes|Seconds"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeHS() { ignoreWarning('Invalid DatePicker mode: Hours|Seconds') var newMode = "Hours|Seconds"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); expectFailContinue("", "cannot set mode to Hours|Minutes"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeH() { var newMode = "Hours"; var pickerCount = 1 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeMinute() { var newMode = "Minutes"; var pickerCount = 1 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeS() { var newMode = "Seconds"; var pickerCount = 1 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeYMDHMS() { ignoreWarning('Date and Time picking not allowed at the same time.') var newMode = "Years|Months|Days|Hours|Minutes|Seconds"; var pickerCount = 6 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); expectFailContinue("", "cannot combine date and time pickers"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeYH() { ignoreWarning('Date and Time picking not allowed at the same time.') var newMode = "Years|Hours"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; waitPickerMoving(); var positioner = findChild(picker, "PickerRow_Positioner"); expectFailContinue("", "cannot combine date and time pickers"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeModeUnhandled() { ignoreWarning('Unhandled mode flag: Whatever. Mode will not be set!') var newMode = "Years|Whatever"; var pickerCount = 2 + 1; // +1 is the Repeater picker.mode = newMode; // no rendering is expected, no need to wait var positioner = findChild(picker, "PickerRow_Positioner"); expectFailContinue("", "unhandled mode flag should not pass"); compare(positioner.children.length, pickerCount, "invalid amount of pickers"); } function test_1_changeLocale() { var prevLocale = picker.locale; var locale = Qt.locale("hu_HU"); picker.minimum = new Date(2012, 11, 1); picker.date = new Date(2012, 11, 1); picker.locale = Qt.locale("hu_HU"); waitPickerMoving(); var label = getPickerLabel(picker, "PickerRow_MonthPicker"); compare(label.text, locale.monthName(picker.date.getMonth(), Locale.LongFormat), "locale for month wrong"); label = getPickerLabel(picker, "PickerRow_DayPicker"); var dayModel = getPickerModel(picker, "PickerRow_DayPicker"); compare(label.text, dayModel.text(picker.date.getDate() - 1, testSuite.width), "locale for day name wrong"); } function test_1_changeMinimumBeforeDate() { var date = new Date(picker.date); var originalDate = new Date(date); date.setFullYear(date.getFullYear() - 1); date.setDate(1); picker.minimum = date; // no rendering is expected, so no need to wait var year = getPickerLabel(picker, "PickerRow_YearPicker"); compare(year.text, originalDate.getFullYear().toString(), "year differs"); var month = getPickerLabel(picker, "PickerRow_MonthPicker"); compare(month.text, picker.locale.monthName(originalDate.getMonth(), Locale.LongFormat), "month differs"); var day = getPickerLabel(picker, "PickerRow_DayPicker"); var dayModel = getPickerModel(picker, "PickerRow_DayPicker"); compare(day.text, dayModel.text(originalDate.getDate() - 1), "day differs"); } function test_1_changeMaximumAfterDate() { var date = new Date(picker.date); var originalDate = new Date(date); date.setFullYear(date.getFullYear() + 1); date.setDate(1); picker.maximum = date; waitPickerMoving(); var year = getPickerLabel(picker, "PickerRow_YearPicker"); compare(year.text, originalDate.getFullYear().toString(), "year differs"); var month = getPickerLabel(picker, "PickerRow_MonthPicker"); compare(month.text, picker.locale.monthName(originalDate.getMonth(), Locale.LongFormat), "month differs"); var day = getPickerLabel(picker, "PickerRow_DayPicker"); var dayModel = getPickerModel(picker, "PickerRow_DayPicker"); compare(day.text, dayModel.text(originalDate.getDate() - 1), "day differs"); } // make infinite function test_1_changeMinimumInvalid() { picker.minimum = Date.prototype.getInvalidDate.call(); // no rendering is expected compare(picker.minimum, picker.date, "invalid minimum hasn't been adjusted to date"); } // make infinite function test_1_changeMaximumInvalid() { picker.maximum = Date.prototype.getInvalidDate.call(); waitPickerMoving(); // check if the year picker model is autoExtending var yearModel = getPickerModel(picker, "PickerRow_YearPicker"); compare(yearModel.autoExtend, true, "the year picker is not auto-extending one"); } function test_1_changeDate() { var date = new Date(); date.setFullYear(picker.date.getFullYear() + 2); date.setMonth(5); date.setDate(21); picker.date = date; picker.mode = "Years|Months|Days"; waitPickerMoving(); var yearLabel = getPickerLabel(picker, "PickerRow_YearPicker", date.getFullYear()); var monthLabel = getPickerLabel(picker, "PickerRow_MonthPicker"); var monthModel = getPickerModel(picker, "PickerRow_MonthPicker"); var dayLabel = getPickerLabel(picker, "PickerRow_DayPicker"); var dayModel = getPickerModel(picker, "PickerRow_DayPicker"); compare(yearLabel.text, date.getFullYear().toString(), "different year value"); compare(monthLabel.text, monthModel.text(date.getMonth()), "different month value"); compare(dayLabel.text, dayModel.text(date.getDate() - 1), "different day value"); } function test_1_changeDateToNextMonth() { picker.minimum = new Date(2013, 9, 1); picker.date = new Date(2013, 09, 31); picker.locale = Qt.locale("hu_HU") waitPickerMoving(); // click on the month picker to set the next month var monthPicker = findChild(picker, "PickerRow_MonthPicker"); var monthCurrent = findChild(monthPicker, "Picker_ViewLoader"); var my = monthPicker.y + (monthPicker.height / 2) + monthCurrent.item.currentItem.height; var mx = monthPicker.x + monthPicker.width / 2; mouseClick(picker, mx, my); waitPickerMoving(); var yearLabel = getPickerLabel(picker, "PickerRow_YearPicker"); var monthLabel = getPickerLabel(picker, "PickerRow_MonthPicker"); var monthModel = getPickerModel(picker, "PickerRow_MonthPicker"); var dayLabel = getPickerLabel(picker, "PickerRow_DayPicker"); var dayModel = getPickerModel(picker, "PickerRow_DayPicker"); compare(yearLabel.text, "2013", "different year value"); // November compare(monthLabel.text, monthModel.text(10), "different month value"); // the 30th compare(dayLabel.text, dayModel.text(29), "different day value"); // set it back my = monthPicker.y + (monthPicker.height / 2) - monthCurrent.item.currentItem.height; mouseClick(picker, mx, my); waitPickerMoving(); compare(yearLabel.text, "2013", "different year value"); // October monthLabel = getPickerLabel(picker, "PickerRow_MonthPicker"); compare(monthLabel.text, monthModel.text(9), "different month value"); // the 30th dayLabel = getPickerLabel(picker, "PickerRow_DayPicker"); compare(dayLabel.text, dayModel.text(29), "different day value"); } function test_2_disabledYear() { var date = new Date(2013, 4, 1); var minDate = new Date(2013, 0, 1); var maxDate = new Date(2013, 11, 31); picker.minimum = minDate; picker.maximum = maxDate; waitPickerMoving(); picker.date = date; waitPickerMoving(); var yearPicker = findChild(picker, "PickerRow_YearPicker"); compare(yearPicker.enabled, false, "year picker should be disabled"); } function test_2_disabledYearAndMonth() { var date = new Date(2013, 11, 1); var minDate = new Date(2013, 11, 1); var maxDate = new Date(2013, 11, 31); picker.minimum = minDate; picker.maximum = maxDate; picker.date = date; waitPickerMoving(); var yearPicker = findChild(picker, "PickerRow_YearPicker"); compare(yearPicker.enabled, false, "year picker should be disabled"); var monthPicker = findChild(picker, "PickerRow_MonthPicker"); compare(monthPicker.enabled, false, "month picker should be disabled"); } function test_2_linearDayPicker() { var date = new Date(2013, 11, 1); var minDate = new Date(2013, 11, 2); var maxDate = new Date(2013, 11, 31); picker.minimum = minDate; picker.maximum = maxDate; picker.date = date; var yearPicker = findChild(picker, "PickerRow_YearPicker"); compare(yearPicker.enabled, false, "year picker should be disabled"); var monthPicker = findChild(picker, "PickerRow_MonthPicker"); compare(monthPicker.enabled, false, "month picker should be disabled"); var dayPickerModel = getPickerModel(picker, "PickerRow_DayPicker"); expectFailContinue("", "day picker is always circular"); compare(dayPickerModel.circular, false, "day picker should be linear"); } function test_3_changeHours() { picker.mode = "Hours|Minutes|Seconds"; waitPickerMoving(); var date = new Date(picker.date); date.setHours((date.getHours() + 10) % 24); picker.date = date; waitPickerMoving(); var hoursLabel = getPickerLabel(picker, "PickerRow_HoursPicker"); verify(hoursLabel, "hour label undefined"); compare(hoursLabel.text, ("00" + date.getHours()).slice(-2), "hours differ"); var minutesLabel = getPickerLabel(picker, "PickerRow_MinutesPicker"); verify(minutesLabel, "minutes label undefined"); compare(minutesLabel.text, ("00" + date.getMinutes()).slice(-2), "minutes differ"); var secondsLabel = getPickerLabel(picker, "PickerRow_SecondsPicker"); verify(secondsLabel, "seconds label undefined"); compare(secondsLabel.text, ("00" + date.getSeconds()).slice(-2), "seconds differ"); } function test_3_changeMinutes() { picker.mode = "Hours|Minutes|Seconds"; var date = new Date(picker.date); date.setMinutes((date.getMinutes() + 40) % 60); picker.date = date; waitPickerMoving(); var hoursLabel = getPickerLabel(picker, "PickerRow_HoursPicker"); verify(hoursLabel, "hour label undefined"); compare(hoursLabel.text, ("00" + date.getHours()).slice(-2), "hours differ"); var minutesLabel = getPickerLabel(picker, "PickerRow_MinutesPicker"); verify(minutesLabel, "minutes label undefined"); compare(minutesLabel.text, ("00" + date.getMinutes()).slice(-2), "minutes differ"); var secondsLabel = getPickerLabel(picker, "PickerRow_SecondsPicker"); verify(secondsLabel, "seconds label undefined"); compare(secondsLabel.text, ("00" + date.getSeconds()).slice(-2), "seconds differ"); } function test_3_changeSeconds() { picker.mode = "Hours|Minutes|Seconds"; var date = new Date(picker.date); date.setSeconds((date.getSeconds() + 50) % 60); picker.date = date; waitPickerMoving(); var hoursLabel = getPickerLabel(picker, "PickerRow_HoursPicker"); verify(hoursLabel, "hour label undefined"); compare(hoursLabel.text, ("00" + date.getHours()).slice(-2), "hours differ"); var minutesLabel = getPickerLabel(picker, "PickerRow_MinutesPicker"); verify(minutesLabel, "minutes label undefined"); compare(minutesLabel.text, ("00" + date.getMinutes()).slice(-2), "minutes differ"); var secondsLabel = getPickerLabel(picker, "PickerRow_SecondsPicker"); verify(secondsLabel, "seconds label undefined"); compare(secondsLabel.text, ("00" + date.getSeconds()).slice(-2), "seconds differ"); } function test_4_changeMinimumBeforeDateHMS() { picker.mode = "Hours|Minutes|Seconds"; var date = new Date(picker.date); var originalDate = new Date(date); date.setFullYear(date.getFullYear() - 1); date.setDate(1); picker.minimum = date; waitPickerMoving(); var hoursLabel = getPickerLabel(picker, "PickerRow_HoursPicker"); verify(hoursLabel, "hour label undefined"); compare(hoursLabel.text, ("00" + originalDate.getHours()).slice(-2), "hours differ"); var minutesLabel = getPickerLabel(picker, "PickerRow_MinutesPicker"); verify(minutesLabel, "minutes label undefined"); compare(minutesLabel.text, ("00" + originalDate.getMinutes()).slice(-2), "minutes differ"); var secondsLabel = getPickerLabel(picker, "PickerRow_SecondsPicker"); verify(secondsLabel, "seconds label undefined"); compare(secondsLabel.text, ("00" + originalDate.getSeconds()).slice(-2), "seconds differ"); } function test_4_changeMaximumAfterDateHMS() { picker.mode = "Hours|Minutes|Seconds"; var date = new Date(picker.date); var originalDate = new Date(date); date.setFullYear(date.getFullYear() + 1); date.setDate(1); picker.maximum = date; waitPickerMoving(); var hoursLabel = getPickerLabel(picker, "PickerRow_HoursPicker"); verify(hoursLabel, "hour label undefined"); compare(hoursLabel.text, ("00" + originalDate.getHours()).slice(-2), "hours differ"); var minutesLabel = getPickerLabel(picker, "PickerRow_MinutesPicker"); verify(minutesLabel, "minutes label undefined"); compare(minutesLabel.text, ("00" + originalDate.getMinutes()).slice(-2), "minutes differ"); var secondsLabel = getPickerLabel(picker, "PickerRow_SecondsPicker"); verify(secondsLabel, "seconds label undefined"); compare(secondsLabel.text, ("00" + originalDate.getSeconds()).slice(-2), "seconds differ"); } function test_4_disabledHour() { picker.mode = "Hours|Minutes|Seconds"; var date = setHMS(new Date(), 12, 10, 45); var minDate = setHMS(new Date(), 12, 0, 0); var maxDate = setHMS(new Date(), 12, 59, 59); picker.minimum = minDate; picker.maximum = maxDate; waitPickerMoving(); picker.date = date; var hoursPicker = findChild(picker, "PickerRow_HoursPicker"); compare(hoursPicker.enabled, false, "hours picker should be disabled"); } function test_4_disabledHoursAndMinutes() { picker.mode = "Hours|Minutes|Seconds"; var date = setHMS(new Date(), 12, 10, 45); var minDate = setHMS(new Date(), 12, 10, 0); var maxDate = setHMS(new Date(), 12, 10, 59); picker.minimum = minDate; picker.maximum = maxDate; picker.date = date; waitPickerMoving(); var hoursPicker = findChild(picker, "PickerRow_HoursPicker"); compare(hoursPicker.enabled, false, "hours picker should be disabled"); var minutesPicker = findChild(picker, "PickerRow_MinutesPicker"); compare(minutesPicker.enabled, false, "minutes picker should be disabled"); } function test_4_linearSecondsPicker() { // skip the test temporaily // https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1315241 skip("Disabled due to flakyness on ppc64el target"); picker.mode = "Hours|Minutes|Seconds"; var date = setHMS(new Date(), 12, 10, 45); var minDate = setHMS(new Date(), 12, 10, 1); var maxDate = setHMS(new Date(), 12, 10, 59); picker.minimum = minDate; picker.maximum = maxDate; picker.date = date; waitPickerMoving(); var hoursPicker = findChild(picker, "PickerRow_HoursPicker"); compare(hoursPicker.enabled, false, "hours picker should be disabled"); var minutesPicker = findChild(picker, "PickerRow_MinutesPicker"); compare(minutesPicker.enabled, false, "minutes picker should be disabled"); var secondsPickerModel = getPickerModel(picker, "PickerRow_SecondsPicker"); tryCompare(secondsPickerModel, "resetting", false); tryCompare(secondsPickerModel, "count", maxDate.getSeconds() - minDate.getSeconds() + 1); compare(secondsPickerModel.circular, false, "day picker should be linear"); } } } ./tests/unit_x11/tst_components/tst_imageprovider.qml0000644000015600001650000000661112700370701023231 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 import Ubuntu.Test 1.0 Item { width: units.gu(50) height: units.gu(100) Column { Image { id: test width: units.gu(20) height: units.gu(20) source: "/usr/share/icons/ubuntu-mobile/actions/scalable/add.svg" visible: source != "" } Image { id: bindingTest width: units.gu(20) height: units.gu(20) visible: source != "" } } UbuntuTestCase { name: "ImageExtension" when: windowShown SignalSpy { id: sourceChangeSpy signalName: "sourceChanged" } SignalSpy { id: visibleChangedSpy signalName: "visibleChanged" } function cleanup() { sourceChangeSpy.clear(); visibleChangedSpy.clear(); } // tests adjusted to reproduce bug #1401920 function test_sourceChanged_bug1401920_data() { return [ {tag: "Bitmap file", file: 'tst_icon-select.png'}, {tag: "Bitmap file(18gu)", gu: 18, file: 'tst_icon-select.png'}, {tag: "Bitmap with fragment", file: 'tst_icon-select.png#' + Date.now()}, {tag: "Bitmap with fragment(18gu)", gu: 18, file: 'PageHeaderBaseDividerBottom@18.png#' + Date.now()}, {tag: "Bitmap file with gu", file: 'tst_icon-select@18.png'}, {tag: "Bitmap file with gu(18gu)", gu: 18, file: 'PageHeaderBaseDividerBottom@18.png'}, {tag: "Bitmap with gu/ fragment", file: 'tst_icon-select@18.png#' + Date.now()}, {tag: "Bitmap with gu/ fragment(18gu)", gu: 18, file: 'PageHeaderBaseDividerBottom@18.png#' + Date.now()}, {tag: "Scalable file", file: 'battery-100-charging.svg'}, {tag: "Scalable file(18gu)", gu: 18, file: 'shape.svg'}, {tag: "Scalable with fragment", file: 'shape.svg#' + Date.now()}, {tag: "Scalable with fragment(18gu)", gu: 18, file: 'battery-100-charging.svg#' + Date.now()}, ]; } function test_sourceChanged_bug1401920(data) { units.gridUnit = data.gu ? data.gu : 8; sourceChangeSpy.target = test; test.source = Qt.resolvedUrl(data.file); sourceChangeSpy.wait(400); compare(test.source, Qt.resolvedUrl(data.file)); } function test_sourceNOTIFYable() { /* Test source through visible to cover NOTIFYable errors */ visibleChangedSpy.target = bindingTest; bindingTest.source = Qt.resolvedUrl('battery-100-charging.svg'); visibleChangedSpy.wait(); } } } ./tests/unit_x11/tst_components/tst_popover.qml0000644000015600001650000001316212700370701022065 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.2 import Ubuntu.Components.Popups 1.0 MainView { id: main width: units.gu(50) height: units.gu(71) Rectangle { id: rect y: main.height / 2 height: units.gu(10) width: height MouseArea { id: whiteSpace anchors.fill: parent acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton } Button { id: pressMe anchors.top: parent.top text: "Press me" onClicked: { testCase.resetPositions(); var popover = PopupUtils.open(popoverComponent, pressMe); popoverSpy.target = testCase.findChild(popover, "popover_foreground"); popoverSpy.clear(); pressMe.parent.height = units.gu(25) pressMe.anchors.top = parent.bottom } } Button { id: pushMe anchors.bottom: parent.bottom text: "Push me" onClicked: { testCase.resetPositions(); var popover = PopupUtils.open(popoverComponent, pushMe); popoverSpy.target = testCase.findChild(popover, "popover_foreground"); popoverSpy.clear(); rect.y = main.height / 10 } } } Label { id: other text: "Ignore me" anchors.centerIn: parent } // spy to listen on the popover foreground's hideCompleted() signal SignalSpy { id: popoverSpy signalName: "hideCompleted" } SignalSpy { id: whiteSpy signalName: "clicked" target: whiteSpace } Component { id: popoverComponent Popover { objectName: "popover" Rectangle { width: units.gu(20) height: units.gu(20) color: "blue" } } } UbuntuTestCase { id: testCase name: "PopoverTests" when: windowShown function resetPositions() { pressMe.parent.height = units.gu(10) rect.y = main.height / 2 } function cleanup() { resetPositions() popoverSpy.target = null; popoverSpy.clear(); waitForRendering(main, 500); } function test_dismiss_on_click_data() { return [ {button: Qt.LeftButton}, {button: Qt.MiddleButton}, {button: Qt.RightButton}, ]; } function test_dismiss_on_click(data) { mouseClick(pressMe, pressMe.width / 2, pressMe.height / 2); waitForRendering(pressMe); verify(popoverSpy.target !== null, "The popover did not open"); // dismiss mouseClick(main, 10, 10, data.button); popoverSpy.wait(); } function test_popover_consumes_clicks_bug1488540_data() { return [ { tag: 'Left-click', button: Qt.LeftButton }, { tag: 'Right-click', button: Qt.RightButton }, { tag: 'Middle-click', button: Qt.MiddleButton }, ] } function test_popover_consumes_clicks_bug1488540(data) { mouseClick(pressMe, pressMe.width / 2, pressMe.height / 2); waitForRendering(pressMe); verify(popoverSpy.target !== null, "The popover did not open"); var popover = popoverSpy.target; // Click in the popover, the rectangle doesn't handle clicks whiteSpy.clear(); mouseClick(popover, popover.width / 2, popover.height / 2, data.button); // dismiss mouseClick(main, 10, 10, Qt.LeftButton); popoverSpy.wait(); // Did the click reach through the popover foreground? compare(whiteSpy.count, 0, 'Click passed through popover foreground!'); } function test_popover_follows_pointerTarget_bug1199502_data() { return [ { tag: "Moving pointerTarget", button: pressMe, dir: "down", y: 318 }, // FIXME: { tag: "Moving parent", button: pushMe, dir: "up", y: 142.8 }, // https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1427557 ] } function test_popover_follows_pointerTarget_bug1199502(data) { mouseClick(data.button, data.button.width / 2, data.button.height / 2); waitForRendering(data.button); var dir = popoverSpy.target.direction var popoverY = popoverSpy.target.y // dismiss mouseClick(main, 10, 10, Qt.LeftButton); popoverSpy.wait(); // ensure popover was next to caller compare(dir, data.dir, "Popover arrow is wrong") compare(popoverY, data.y, "Popover isn't pointing at the caller") } } } ./tests/unit_x11/tst_components/tst_picker13.qml0000644000015600001650000002736212700370714022027 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.3 import Ubuntu.Components 1.3 import Ubuntu.Components.Pickers 1.3 Item { id: testSuite width: units.gu(40) height: units.gu(71) Component { id: linearShort Picker { objectName: "linear" circular: false model: objectModel delegate: PickerDelegate { Label {text: modelData} } } } Component { id: linearLong Picker { objectName: "linear" circular: false model: longerModel delegate: PickerDelegate { Label {text: modelData} } } } Component { id: objectModelled Picker { objectName: "objectModelled" model: objectModel selectedIndex: 2 delegate: PickerDelegate { Label {text: modelData} } } } Component { id: simpleModelled Picker { objectName: "simpleModelled" model: emptyModel selectedIndex: 2 delegate: PickerDelegate { Label {text: modelData} } } } Component { id: linearDynPicker Picker { objectName: "linearDynPicker" model: dynamicModel circular: false delegate: PickerDelegate { Label {text: modelData} } } } Component { id: circularDynPicker Picker { objectName: "circularDynPicker" model: dynamicModel circular: true delegate: PickerDelegate { Label { text: modelData ? modelData : "" } } } } Component { id: defaultPicker Picker { } } Loader { id: pickerLoader asynchronous: false } ListModel { id: emptyModel } ListModel { id: dynamicModel Component.onCompleted: reset() function reset() { clear(); for (var i = 0; i < 100; i++) { append({"label": "line" + i}); } } } ListModel { id: objectModel ListElement { label: "line1" } ListElement { label: "line2" } ListElement { label: "line3" } } ListModel { id: longerModel ListElement { label: "line1" } ListElement { label: "line2" } ListElement { label: "line3" } ListElement { label: "line4" } ListElement { label: "line5" } ListElement { label: "line6" } } SignalSpy { id: spy signalName: "onSelectedIndexChanged" } UbuntuTestCase { id: testCase name: "Picker13API" when: windowShown function testPicker(component) { pickerLoader.sourceComponent = component; tryCompareFunction(function(){return pickerLoader.status}, Loader.Ready); waitForRendering(pickerLoader.item); tryCompareFunction(function(){return pickerLoader.item.moving}, false); return pickerLoader.item; } function waitPickerScrolling(picker) { tryCompareFunction(function(){return picker.moving}, false); } function getPickerList(picker) { return findChild(picker, picker.circular ? "Picker_WrapAround" : "Picker_Linear"); } function cleanup() { pickerLoader.sourceComponent = null; dynamicModel.reset(); spy.clear(); spy.target = null; } function initTestCase() { var picker = testPicker(defaultPicker); compare(picker.circular, true, "default circular"); compare(picker.model, undefined, "default model"); compare(picker.delegate, null, "default delegate"); compare(picker.selectedIndex, 0, "default selectedIndex"); compare(picker.itemHeight, units.gu(4), "default itemHeight"); compare(picker.__styleInstance.highlightThickness, units.gu(5), "default highlight thickness"); } function test_selectedIndex_data() { return [ {tag: "Runtime model", picker: defaultPicker, model: emptyModel, expectedIndex: 0}, {tag: "Empty modelled", picker: simpleModelled, expectedIndex: 0}, {tag: "Object modelled", picker: objectModelled, expectedIndex: 2}, ]; } function test_selectedIndex(data) { var picker = testPicker(data.picker); if (data.nmodel) { picker.model = data.model; } compare(picker.selectedIndex, data.expectedIndex, "unexpected selectedIndex"); } function test_updateModel_data() { return [ {tag: "Empty picker", picker: defaultPicker}, {tag: "Object modelled picker", picker: objectModelled}, ]; } function test_updateModel(data) { var picker = testPicker(data.picker); picker.selectedIndex = 1; spy.target = picker; picker.model = []; spy.wait(); } function test_clickMovesSelection_data() { return [ {tag: "Linear long", component: linearLong, circular: false, firstClick: 0, secondClick: 1}, {tag: "Circular long", component: linearLong, circular: true, firstClick: 1, secondClick: 2}, {tag: "Linear short", component: linearShort, circular: false, firstClick: 0, secondClick: 1}, {tag: "Circular short", component: linearShort, circular: true, firstClick: 0, secondClick: 1}, ]; } function test_clickMovesSelection(data) { var picker = testPicker(data.component); spy.target = picker; picker.circular = data.circular; mouseClick(picker, units.gu(1), units.gu(1)); tryCompare(spy, "count", data.firstClick); mouseClick(picker, units.gu(1), units.gu(18)); tryCompare(spy, "count", data.secondClick); } function test_pickerCircularChange() { var picker = testPicker(defaultPicker); var expectedList = picker.circular ? "Picker_WrapAround" : "Picker_Linear"; verify(findChild(picker, expectedList) !== undefined, "Picker must use " + expectedList); picker.circular = !picker.circular; expectedList = picker.circular ? "Picker_WrapAround" : "Picker_Linear"; verify(findChild(picker, expectedList) !== undefined, "circular changed, Picker must use " + expectedList); } function test_modelCropping_data() { return [ {tag: "Linear, selected @50, remove from 40", component: linearDynPicker, selected: 50, remove: 40, removeCount: dynamicModel.count - 40, count: 40, expected: 39 }, {tag: "Linear, selected @50, remove 50", component: linearDynPicker, selected: 50, remove: 50, removeCount: 1, count: dynamicModel.count - 1, expected: 49 }, {tag: "Linear, selected @50, remove 10 from 45", component: linearDynPicker, selected: 50, remove: 45, removeCount: 10, count: dynamicModel.count - 10, expected: 44 }, {tag: "Linear, selected @50, remove 10 from 51", component: linearDynPicker, selected: 50, remove: 51, removeCount: 10, count: dynamicModel.count - 10, expected: 50 }, {tag: "Circular, selected @50, remove from 40", component: circularDynPicker, selected: 50, remove: 40, removeCount: dynamicModel.count - 40, count: 40, expected: 39 }, {tag: "Circular, selected @50, remove 50", component: circularDynPicker, selected: 50, remove: 50, removeCount: 1, count: dynamicModel.count - 1, expected: 49 }, {tag: "Circular, selected @50, remove 10 from 45", component: circularDynPicker, selected: 50, remove: 45, removeCount: 10, count: dynamicModel.count - 10, expected: 44 }, {tag: "Circular, selected @50, remove 10 from 51", component: circularDynPicker, selected: 50, remove: 51, removeCount: 10, count: dynamicModel.count - 10, expected: 50 }, ] } function test_modelCropping(data) { var picker = testPicker(data.component); picker.selectedIndex = data.selected; waitPickerScrolling(picker); var list = getPickerList(picker); picker.model.remove(data.remove, data.removeCount); waitPickerScrolling(picker); compare(list.count, data.count, "bad removal from list"); compare(picker.selectedIndex, data.expected, "bad index of " + data.tag); } function test_modelReset_data() { return [ {tag: "Linear", picker: linearDynPicker}, {tag: "Circular", picker: circularDynPicker}, ]; } function test_modelReset(data) { var picker = testPicker(data.picker); var list = getPickerList(picker); picker.model.reset(); waitPickerScrolling(picker); compare(list.currentIndex, 0, "picker's itemList selection not reset"); compare(picker.selectedIndex, 0, "picker's selection not reset"); } function test_modelClear_data() { return [ {tag: "Linear", picker: linearDynPicker}, {tag: "Circular", picker: circularDynPicker}, ]; } function test_modelClear(data) { var picker = testPicker(data.picker); var list = getPickerList(picker); picker.model.clear(); if (data.tag == "Linear") { // picker's ListView needs some events to be processed before it gets the final value for currentIndex waitForRendering(list, 500); } waitPickerScrolling(picker); if (data.tag == "Circular") { expectFailContinue(data.tag, "PathView issue: https://bugreports.qt-project.org/browse/QTBUG-35400"); } compare(list.currentIndex, -1, "picker's itemList selection not reset"); if (data.tag == "Circular") { expectFailContinue(data.tag, "PathView issue: https://bugreports.qt-project.org/browse/QTBUG-35400"); } compare(picker.selectedIndex, -1, "picker's selection not reset"); } function test_itemHeight_data() { return [ {tag: "Linear", picker: linearDynPicker, itemHeight: units.gu(6)}, {tag: "Circular", picker: circularDynPicker, itemHeight: units.gu(6)}, ]; } function test_itemHeight(data) { var picker = testPicker(data.picker); picker.itemHeight = data.itemHeight; compare(picker.__styleInstance.highlightThickness, picker.itemHeight + units.gu(1)); } } } ./tests/unit_x11/tst_components/tst_bug1510919.qml0000644000015600001650000000435212700370701021723 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import QtTest 1.0 import Ubuntu.Test 1.0 MainView { width: units.gu(40) height: units.gu(71) Column { CheckBox { id: checkBox } Switch { id: switchBox } } UbuntuTestCase { name: "CheckAndSwitch" when: windowShown SignalSpy { id: clickSpy signalName: "clicked" } function cleanup() { clickSpy.target = null; clickSpy.clear(); checkBox.checked = false; switchBox.checked = false; } function initTestCase() { TestExtras.registerTouchDevice(); } function test_checked_in_sync_with_clicked_data() { return [ {tag: "CheckBox with touch", item: checkBox, touch: true}, {tag: "CheckBox with mouse", item: checkBox, touch: false}, {tag: "Switch with touch", item: switchBox, touch: true}, {tag: "Switch with mouse", item: switchBox, touch: false}, ]; } function test_checked_in_sync_with_clicked(data) { var checked = data.item.checked; clickSpy.target = data.item; if (data.touch) { TestExtras.touchClick(0, data.item, centerOf(data.item)); } else { mouseClick(data.item, centerOf(data.item).x, centerOf(data.item).y); } clickSpy.wait(500); compare(data.item.checked, !checked, "checked property shoudl be altered!"); } } } ./tests/unit_x11/tst_components/tst_icon.qml0000644000015600001650000001116212700370701021321 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 import Ubuntu.Test 1.0 Item { width: units.gu(50) height: units.gu(50) Row { anchors.centerIn: parent height: units.gu(10) width: childrenRect.width Icon { // Fails to load the icon when suru-icon-theme or libqt5svg5 are // not installed. This causes a warning and rejection // by jenkins continuous integration. name: "add" height: parent.height width: height } Icon { // Fails when the icon is becoming invisible when non-atomic updates // cause sourceSize.width or sourceSize.height to be 0 before other // properties are updated. id: icon width: visible ? units.gu(10) : 0 height: width name: "search" } Icon { id: icon2 width: units.gu(10) height: width } Icon { // Regression test for bug #1371509 // Will print "QML QQuickImage: Failed to get image from provider" when broken. id: icon3 width: units.gu(10) height: width source: Qt.resolvedUrl("tst_icon-select.png") } } UbuntuTestCase { name: "Icon" when: windowShown SignalSpy { id: shaderSpy signalName: 'onStatusChanged' } function cleanup() { icon2.name = ""; } function test_updateIconSize_bug1349769() { icon.visible = false; // causes "QML Image: Failed to get image from provider: image://theme/search" // warning when sourceSize.width or sourceSize.height becomes 0 while // while still trying to render the icon. Tests will pass with the warning, but // the MR is rejected by jenkins continuous integration. } function test_name() { icon2.name = "search"; var image = findChild(icon2, "image"); compare(image.source, "image://theme/search", "Source of the image should be image://theme/{name}."); } function test_source() { icon2.name = "search"; icon2.source = "/usr/share/icons/suru/actions/scalable/edit-find.svg"; var image = findChild(icon2, "image"); compare(image.source, "file:///usr/share/icons/suru/actions/scalable/edit-find.svg", "Source of the image should equal icon2.source."); } function test_keyColor() { icon.visible = true; var image = findChild(icon, "image"); var shader = findChild(icon, "shader"); shaderSpy.target = shader; compare(icon.name, 'search'); compare(shader.visible, false); compare(shader.status, ShaderEffect.Uncompiled) icon.color = UbuntuColors.orange; shaderSpy.wait(); compare(shader.log, '') // https://bugreports.qt.io/browse/QTBUG-49713 // status may be Error with no log even if successful verify(shader.status !== ShaderEffect.Uncompiled) compare(shader.keyColorOut, icon.color); compare(shader.visible, true); compare(shader.source, image); icon.keyColor = UbuntuColors.purple; compare(shader.keyColorIn, icon.keyColor); // Unsetting the icon name should disable the shader icon.name = ''; compare(icon.source, ''); compare(shader.visible, false); // Let's get back to a valid source icon.name = 'search'; compare(shader.visible, true); compare(shader.source, image); // Unsetting the keyColor should also disable the shader icon.color = Qt.rgba(0.0, 0.0, 0.0, 0.0); compare(shader.visible, false); } } } ./tests/unit_x11/tst_components/ListItemWithLabel.qml0000644000015600001650000000163512700370701023031 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 ListItem { property alias text: label.text Label { id: label anchors { left: parent.left leftMargin: units.gu(2) verticalCenter: parent.verticalCenter } } } ./tests/unit_x11/tst_components/tst_pagehead_presets.qml0000644000015600001650000000526712700370701023705 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 Item { width: units.gu(50) height: units.gu(80) MainView { id: mainView anchors.fill: parent useDeprecatedToolbar: false Page { id: page title: "Page title" head.actions: [ Action { objectName: "selectAction" text: "Select all" iconName: "select" onTriggered: { if (page.head.preset === "") { page.head.preset = "select"; } else { page.head.preset = ""; } } } ] } } UbuntuTestCase { name: "HeaderSelectionPreset" when: windowShown id: testCase property var action_button function initTestCase() { testCase.action_button = findChild(mainView, "selectAction_header_button"); compare(action_button.visible, true, "Header action button is not visible."); compare(page.head.preset, "", "Default header preset is not empty string."); } function test_default_preset() { var label = findChild(action_button, "selectAction_header_button_label"); compare(label, null, "Header button label defined in default header."); var title = findChild(mainView, "header_title_label"); compare(title.visible, true, "No title visible with default preset."); } function test_select_preset() { page.head.preset = "select"; var label = findChild(action_button, "selectAction_header_button_label"); compare(label.visible, true, "Header button has no visible label in selection mode."); var title = findChild(mainView, "header_title_label"); compare(title.visible, false, "Title visible in select preset."); page.head.preset = ""; } } } ./tests/unit_x11/tst_components/tst_listitem_focus.qml0000644000015600001650000004652212700370714023436 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 import QtQuick.Window 2.2 Item { id: main width: units.gu(40) height: units.gu(71) property Item activeFocusItem: Window.activeFocusItem Rectangle { id: topItem objectName: "topItem" activeFocusOnTab: true width: parent.width height: units.gu(2) } Loader { id: testLoader anchors { fill: parent topMargin: topItem.height } } Component { id: simpleListItem ListItem { objectName: "simple" + index property int itemIndex: index } } Component { id: listItemWithContent ListItem { id: listItem objectName: "withContent" + index property int itemIndex: index Row { spacing: units.gu(1) CheckBox { objectName: "checkbox" + listItem.itemIndex } Switch { objectName: "switch" + listItem.itemIndex } Button { objectName: "button" + listItem.itemIndex; text: "test" } } leadingActions: ListItemActions { actions: Action { iconName: "delete" } } trailingActions: ListItemActions { actions: Action { iconName: "edit" } } } } Component { id: listView ListView { model: 10 } } Component { id: generic Column { spacing: units.gu(1) Repeater { model: 2 delegate: listItemWithContent } Repeater { model: 2 delegate: simpleListItem } } } ListItemTestCase13 { name: "ListItemFocus" when: windowShown function loadTest(component) { testLoader.sourceComponent = component; tryCompare(testLoader, "status", Loader.Ready); return testLoader.item; } function cleanup() { testLoader.sourceComponent = null; wait(200); } function init() { topItem.forceActiveFocus(Qt.TabFocusReason); } function initTestCase() { TestExtras.registerTouchDevice(); } // Tab/Backtab focuses the First ListItem in a ListView function test_focusing_listview_focuses_first_item_data() { return [ {tag: "Tab, no content", preFocus: topItem, delegate: simpleListItem, key: Qt.Key_Tab, focusItem: "simple0"}, {tag: "Tab, with content", preFocus: topItem, delegate: listItemWithContent, key: Qt.Key_Tab, focusItem: "withContent0"}, {tag: "Backtab, no content", preFocus: topItem, delegate: simpleListItem, key: Qt.Key_Backtab, focusItem: "simple0"}, {tag: "Backtab, with content", preFocus: topItem, delegate: listItemWithContent, key: Qt.Key_Backtab, focusItem: "withContent0"}, ]; } function test_focusing_listview_focuses_first_item(data) { var test = loadTest(listView); test.delegate = data.delegate; waitForRendering(test, 500); data.preFocus.forceActiveFocus(); verify(data.preFocus.activeFocus); keyClick(data.key); var listItem = findChild(test, data.focusItem); verify(listItem); tryCompare(listItem, "activeFocus", true, 500, "Focus hasn't been gained by the ListItem"); verify(listItem.keyNavigationFocus); } // vertical key navigation in ListView between ListItems function test_focus_and_navigate_in_listview_data() { return [ {tag: "No content", delegate: simpleListItem, key: Qt.Key_Down, keyTimes: 3, focusItems: ["simple1", "simple2", "simple3"]}, {tag: "With content", delegate: listItemWithContent, key: Qt.Key_Down, keyTimes: 3, focusItems: ["withContent1", "withContent2", "withContent3"]}, ]; } function test_focus_and_navigate_in_listview(data) { var test = loadTest(listView); test.delegate = data.delegate; waitForRendering(test, 500); keyClick(Qt.Key_Tab); for (var i = 0; i < data.keyTimes; i++) { keyClick(data.key); var item = findChild(test, data.focusItems[i]); verify(item); tryCompare(item, "activeFocus", true, 500, "Focus hasn't been gained by the ListItem"); verify(item.keyNavigationFocus, "failure on key navigation on " + data.focusItems[i]); } } // vertical navigation updates ListView.currentItem (as well as currentIndex) function test_focus_and_navigate_in_listview_updates_currentItem_data() { return [ {tag: "No content", delegate: simpleListItem, key: Qt.Key_Down, keyTimes: 3, focusItems: ["simple1", "simple2", "simple3"]}, {tag: "With content", delegate: listItemWithContent, key: Qt.Key_Down, keyTimes: 3, focusItems: ["withContent1", "withContent2", "withContent3"]}, ]; } function test_focus_and_navigate_in_listview_updates_currentItem(data) { var test = loadTest(listView); test.delegate = data.delegate; waitForRendering(test, 500); keyClick(Qt.Key_Tab); for (var i = 0; i < data.keyTimes; i++) { keyClick(data.key); var item = findChild(test, data.focusItems[i]); verify(item); tryCompare(item, "activeFocus", true, 500, "Focus hasn't been gained by the ListItem"); verify(item.keyNavigationFocus, "failure on key navigation on " + data.focusItems[i]); compare(test.currentItem, item); compare(test.currentIndex, item.itemIndex); } } // re-focusing ListView will focus on the last focused item function test_refocus_listview_on_last_focused_item_data() { return [ {tag: "No content", delegate: simpleListItem, key: Qt.Key_Down, keyTimes: 3, focusItems: ["simple1", "simple2", "simple3"]}, {tag: "With content", delegate: listItemWithContent, key: Qt.Key_Down, keyTimes: 3, focusItems: ["withContent1", "withContent2", "withContent3"]}, ]; } function test_refocus_listview_on_last_focused_item(data) { var test = loadTest(listView); test.delegate = data.delegate; waitForRendering(test, 500); // focus on ListView and focus the 3rd item test.forceActiveFocus(); test.currentIndex = 2; waitForRendering(test, 400); verify(!test.currentItem.keyNavigationFocus, "Focus frame shown for the item"); // focus away keyClick(Qt.Key_Tab); waitForRendering(test, 400); // then focus back keyClick(Qt.Key_Backtab); waitForRendering(test, 400); tryCompare(test.currentItem, "activeFocus", true, 500, "Focus hasn't been gained by the ListItem"); verify(test.currentItem.keyNavigationFocus, "Focus frame not shown for the item"); } // Tab/Backtab focuses, next Tab/Backtab focuses out of ListItem in a ListView function test_tab_backtab_navigates_away_of_listview_data() { return [ {tag: "Tab, simple", preFocus: topItem, delegate: simpleListItem, key: Qt.Key_Tab}, {tag: "Tab, with content", preFocus: topItem, delegate: listItemWithContent, key: Qt.Key_Tab}, {tag: "BackTab, simple", preFocus: topItem, delegate: simpleListItem, key: Qt.Key_Backtab}, {tag: "BackTab, with content", preFocus: topItem, delegate: listItemWithContent, key: Qt.Key_Backtab}, ]; } function test_tab_backtab_navigates_away_of_listview(data) { var test = loadTest(listView); test.delegate = data.delegate; waitForRendering(test, 500); data.preFocus.forceActiveFocus(); verify(data.preFocus.activeFocus); // the first tab focuses the ListView and its first child keyClick(data.key); tryCompare(test, "activeFocus", true, 500, "Focus hasn't been gained bythe ListItem"); // the second tab should leave the ListView keyClick(data.key); tryCompare(test, "activeFocus", false, 500, "Focus hasn't been lost by the ListItem"); } // testing Tab/Backtab navigation when in a generic item function test_tab_navigation_when_not_in_listview_data() { return [ {tag: "Tabs", firstFocus: topItem, key: Qt.Key_Tab, focusItems: ["withContent0", "checkbox0", "switch0", "button0" , "withContent1", "checkbox1", "switch1", "button1"]}, {tag: "Backtabs", firstFocus: topItem, key: Qt.Key_Backtab, focusItems: ["simple1", "simple0" , "button1", "switch1", "checkbox1", "withContent1"]}, ]; } function test_tab_navigation_when_not_in_listview(data) { var test = loadTest(generic); data.firstFocus.forceActiveFocus(); for (var i = 0; i < data.focusItems.length; i++) { keyClick(data.key); compare(main.activeFocusItem.objectName, data.focusItems[i], "Unexpected focused item"); } } // focus frame should not be shown function test_mouse_or_tap_focus_doesnt_show_focusframe_data() { return [ {tag: "Focus with mouse", mouse: true}, {tag: "Focus with touch", mouse: false}, ]; } function test_mouse_or_tap_focus_doesnt_show_focusframe(data) { var test = loadTest(listView); test.delegate = simpleListItem; waitForRendering(test, 500); var item = findChild(test, "simple3"); verify(item); if (data.mouse) { mouseClick(item, centerOf(item).x, centerOf(item).y); } else { TestExtras.touchClick(0, item, centerOf(item)); } verify(!item.keyNavigationFocus, "Focus frame must not be shown!"); } // focus with mouse, then press Tab/Backtab, then mouse function test_focus_with_mouse_and_tab() { var test = loadTest(listView); test.delegate = simpleListItem; waitForRendering(test, 500); var listItem0 = findChild(test, "simple0"); verify(listItem0); var listItem1 = findChild(test, "simple1"); verify(listItem1); var listItem2 = findChild(test, "simple2"); verify(listItem2); // click on first mouseClick(listItem0, centerOf(listItem0).x, centerOf(listItem0).y); verify(listItem0.activeFocus, "Not focused"); } function test_horizontal_navigation_between_listitem_children_with_tabstop_data() { return [ {tag: "in ListView, rightwards", test: listView, focusItem: "withContent1", key: Qt.Key_Right, focus: ["checkbox1", "switch1", "button1", "withContent1"]}, {tag: "in ListView, leftwards", test: listView, focusItem: "withContent1", key: Qt.Key_Left, focus: ["button1", "switch1", "checkbox1", "withContent1"]}, {tag: "in generic, rightwards", test: generic, focusItem: "withContent1", key: Qt.Key_Right, focus: ["checkbox1", "switch1", "button1", "withContent1"]}, {tag: "in generic, leftwards", test: listView, focusItem: "withContent1", key: Qt.Key_Left, focus: ["button1", "switch1", "checkbox1", "withContent1"]}, ]; } function test_horizontal_navigation_between_listitem_children_with_tabstop(data) { var test = loadTest(data.test); if (test.hasOwnProperty("delegate")) { test.delegate = listItemWithContent; waitForRendering(test, 500); } var item = findChild(test, data.focusItem); verify(item); item.forceActiveFocus(); tryCompare(item, "activeFocus", true, 500, "Focus hasn't been gained by the ListItem"); for (var i = 0; i < data.focus.length; i++) { keyClick(data.key); tryCompare(main.activeFocusItem, "objectName", data.focus[i]); } } // executes a combination of tab/navigation keys/backtab sequence function test_pattern_data() { return [ {tag: "Tabs in ListView", test: listView, delegate: listItemWithContent, testPlan: [ {key: Qt.Key_Tab, focus: "withContent0"}, {key: Qt.Key_Tab, focus: "topItem"}, {key: Qt.Key_Backtab, focus: "withContent0"}, ]}, {tag: "Tab and navigate in ListView", test: listView, delegate: listItemWithContent, testPlan: [ {key: Qt.Key_Tab, focus: "withContent0"}, {key: Qt.Key_Down, focus: "withContent1"}, {key: Qt.Key_Left, focus: "button1"}, {key: Qt.Key_Left, focus: "switch1"}, {key: Qt.Key_Down, focus: "withContent2"}, {key: Qt.Key_Right, focus: "checkbox2"}, {key: Qt.Key_Right, focus: "switch2"}, {key: Qt.Key_Down, focus: "withContent3"}, {key: Qt.Key_Down, focus: "withContent4"}, {key: Qt.Key_Backtab, focus: "topItem"}, {key: Qt.Key_Tab, focus: "withContent4"}, ]}, {tag: "Tab and navigate in generic", test: generic, testPlan: [ {key: Qt.Key_Tab, focus: "withContent0"}, {key: Qt.Key_Down, focus: "withContent0"}, {key: Qt.Key_Left, focus: "button0"}, {key: Qt.Key_Left, focus: "switch0"}, {key: Qt.Key_Down, focus: "switch0"}, {key: Qt.Key_Right, focus: "button0"}, {key: Qt.Key_Right, focus: "withContent0"}, {key: Qt.Key_Down, focus: "withContent0"}, {key: Qt.Key_Down, focus: "withContent0"}, {key: Qt.Key_Backtab, focus: "topItem"}, {key: Qt.Key_Tab, focus: "withContent0"}, ]}, {tag: "Mixed Tab and navigate keys in generic", test: generic, testPlan: [ {key: Qt.Key_Tab, focus: "withContent0"}, {key: Qt.Key_Tab, focus: "checkbox0"}, {key: Qt.Key_Tab, focus: "switch0"}, {key: Qt.Key_Right, focus: "button0"}, {key: Qt.Key_Right, focus: "withContent0"}, {key: Qt.Key_Tab, focus: "checkbox0"}, {key: Qt.Key_Left, focus: "withContent0"}, {key: Qt.Key_Left, focus: "button0"}, {key: Qt.Key_Tab, focus: "withContent1"}, ]}, ]; } function test_pattern(data) { var test = loadTest(data.test); if (test.hasOwnProperty("delegate") && data.delegate) { test.delegate = data.delegate; waitForRendering(test, 500); } for (var i = 0; i < data.testPlan.length; i++) { var plan = data.testPlan[i]; keyClick(plan.key); tryCompare(main.activeFocusItem, "activeFocus", true, 200, "Focus not set for " + plan.focus); compare(main.activeFocusItem.objectName, plan.focus); if (main.activeFocusItem.hasOwnProperty("keyNavigationFocus")) { verify(main.activeFocusItem.keyNavigationFocus); } } } function test_do_not_focus_on_actions_data() { return [ {tag: "leading actions revealed", test: listView, focusItem: "withContent1", leading: true, swipeDx: units.gu(10), key: Qt.Key_Left, focus: ["button1", "switch1", "checkbox1", "withContent1"]}, {tag: "trailing actions revealed", test: listView, focusItem: "withContent1", leading: false, swipeDx: -units.gu(10), key: Qt.Key_Left, focus: ["button1", "switch1", "checkbox1", "withContent1"]}, ] } function test_do_not_focus_on_actions(data) { var test = loadTest(data.test); if (test.hasOwnProperty("delegate")) { test.delegate = listItemWithContent; waitForRendering(test, 500); } var item = findChild(test, data.focusItem); verify(item); item.forceActiveFocus(); tryCompare(item, "activeFocus", true, 500, "Focus hasn't been gained by the ListItem"); // swipe in swipe(item, data.leading ? 1 : item.width - 1, centerOf(item).y, data.swipeDx, 0); // compare for (var i = 0; i < data.focus.length; i++) { keyClick(data.key); tryCompare(main.activeFocusItem, "objectName", data.focus[i]); } } SignalSpy { id: upKeySpy signalName: "upPressed" } SignalSpy { id: downKeySpy signalName: "downPressed" } function test_do_not_eat_up_down_key_events_in_listview_bug1554447() { var test = loadTest(listView); test.delegate = listItemWithContent; waitForRendering(test, 500); upKeySpy.target = test.Keys; downKeySpy.target = test.Keys; test.forceActiveFocus(); // test up test.positionViewAtBeginning(); keyClick(Qt.Key_Up); upKeySpy.wait(500); // test down test.positionViewAtEnd(); keyClick(Qt.Key_Down); downKeySpy.wait(500); // test both up and down in the middle upKeySpy.clear(); downKeySpy.clear(); test.positionViewAtIndex(test.count / 2, ListView.Center); keyClick(Qt.Key_Up); upKeySpy.wait(500); keyClick(Qt.Key_Down); downKeySpy.wait(500); } } } ./tests/unit_x11/tst_components/MockKeyboard.qml0000644000015600001650000000401412700370701022047 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Object { id: inputMethod function show() { visible = true; } function commit() { } property bool visible: false property rect keyboardRectangle: Qt.rect(0, 0, 0, units.gu(20)) Rectangle { x: parent.x y: parent.height - height width: parent.width height: inputMethod.keyboardRectangle.height visible: inputMethod.visible parent: QuickUtils.rootItem(inputMethod) color: UbuntuColors.silk opacity: 0.5 // Always on top, even modal Dialog overlay z: 100 Flow { anchors.fill: parent anchors.margins: units.dp(2) Repeater { model: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', 'z', 'x', 'c', 'v', ' ', 'b', 'n', 'm', ',', '.' ] Button { text: modelData color: UbuntuColors.blue height: (parent.height - units.dp(2)) / 4 width: (parent.width - units.dp(2)) / 10 } } } MouseArea { anchors.fill: parent onClicked: parent.forceActiveFocus(Qt.MouseFocusReason) } } } ./tests/unit_x11/tst_components/tst_styleditem.qml0000644000015600001650000000723412700370701022561 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 Item { width: units.gu(50) height: units.gu(100) Column { anchors.fill: parent StyledItem { id: passiveScope objectName: "passiveScope" width: units.gu(50) height: units.gu(20) Rectangle { width: height height: units.gu(10) color: "red" anchors.centerIn: parent StyledItem { objectName: "in_passive_scope" activeFocusOnPress: true anchors.fill: parent } } } StyledItem { id: activeScope objectName: "activeScope" width: units.gu(50) height: units.gu(20) activeFocusOnPress: true Rectangle { width: height height: units.gu(10) color: "green" anchors.centerIn: parent StyledItem { objectName: "in_active_scope" activeFocusOnPress: true anchors.fill: parent } } } StyledItem { id: activeScope1 objectName: "activeScope" width: units.gu(50) height: units.gu(20) activeFocusOnPress: true Rectangle { width: height height: units.gu(10) color: "green" anchors.centerIn: parent StyledItem { objectName: "in_active_scope" activeFocusOnPress: true anchors.fill: parent MouseArea { focus: true objectName: "mouseArea" anchors.fill: parent } } } } } UbuntuTestCase { name: "StyledItemAPI" when: windowShown function test_scope_focusing_data() { return [ {tag: "main scope is passive", mainScope: passiveScope, innerScope: "in_passive_scope", focusing: false}, {tag: "main scope is active", mainScope: activeScope, innerScope: "in_active_scope", focusing: true}, {tag: "MouseArea as child, gaining", mainScope: activeScope1, innerScope: "mouseArea", focusing: true}, ]; } function test_scope_focusing(data) { var innerScope = findChild(data.mainScope, data.innerScope); verify(innerScope, "Cannot reach inner scope!"); var center = centerOf(innerScope); mouseClick(innerScope, center.x, center.y); if (!data.focusing) { expectFailContinue(data.tag, "inner scope should not focus either."); } compare(innerScope.activeFocus, true, "Inner scope is not focused"); } } } ./tests/unit_x11/tst_components/tst_adaptivepagelayout_configuration.qml0000644000015600001650000002133012700370701027206 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 import QtQuick.Layouts 1.1 MainView { id: root width: units.gu(120) height: units.gu(71) property list dynamicLayout: [ PageColumnsLayout { when: layout.width >= units.gu(80) PageColumn { maximumWidth: units.gu(30) preferredWidth: units.gu(25) } PageColumn { fillWidth: true } PageColumn { preferredWidth: units.gu(20) fillWidth: true } }, PageColumnsLayout { when: layout.width >= units.gu(30) PageColumn { maximumWidth: units.gu(30) preferredWidth: units.gu(25) } PageColumn { fillWidth: true } }, PageColumnsLayout { when: true PageColumn { fillWidth: true minimumWidth: units.gu(20) } } ] property list dynamicLayoutWrongOrder: [ PageColumnsLayout { when: layout.width >= units.gu(30) PageColumn { maximumWidth: units.gu(30) preferredWidth: units.gu(25) } PageColumn { fillWidth: true } }, PageColumnsLayout { when: layout.width >= units.gu(80) PageColumn { maximumWidth: units.gu(30) preferredWidth: units.gu(25) } PageColumn { fillWidth: true } PageColumn { preferredWidth: units.gu(20) fillWidth: true } }, PageColumnsLayout { when: true PageColumn { fillWidth: true minimumWidth: units.gu(20) } } ] AdaptivePageLayout { id: layout width: parent.width height: parent.height primaryPage: page1 layouts: PageColumnsLayout { id: defaultLayout when: layout.width >= units.gu(60) PageColumn { minimumWidth: units.gu(40) maximumWidth: units.gu(40) } PageColumn { fillWidth: true } } Page { id: page1 title: "Page1" Column { anchors.centerIn: parent width: childrenRect.width Button { text: "Page 2 left" onTriggered: layout.addPageToCurrentColumn(page1, page2) } Button { text: "Page 3 right" onTriggered: layout.addPageToNextColumn(page1, page3); } } } Page { id: page2 title: "Page2" } Page { id: page3 title: "Page3" } Page { id: page4 title: "Page4" } } UbuntuTestCase { when: windowShown function cleanup() { layout.layouts = defaultLayout; layout.width = root.width; waitForRendering(layout, 400); } function test_columns_data() { return [ {tag: "one column", width: units.gu(59), columns: 1}, {tag: "two columns", width: units.gu(60), columns: 2}, ]; } function test_columns(data) { layout.width = data.width; compare(layout.columns, data.columns, "the number of columns is wrong"); } function test_update_layout_data() { return [ {tag: "2 columns, proper order", width: units.gu(30), layout: dynamicLayout, columns: 2}, {tag: "3 columns, proper order", width: units.gu(80), layout: dynamicLayout, columns: 3}, {tag: "1 column, proper order", width: units.gu(29), layout: dynamicLayout, columns: 1}, {tag: "2 columns, wrong order", width: units.gu(30), layout: dynamicLayoutWrongOrder, columns: 2}, {tag: "2 columns, wrong order", width: units.gu(80), layout: dynamicLayoutWrongOrder, columns: 2}, {tag: "1 column, wrong order", width: units.gu(29), layout: dynamicLayout, columns: 1}, ]; } function test_update_layout(data) { layout.layouts = data.layout; layout.width = data.width; waitForRendering(layout); compare(layout.columns, data.columns, "wrong columns in dynamic layout"); } function test_sizes_data() { return [ {tag: "1 column sizes, default layout", width: units.gu(50), layout: defaultLayout, columns: 1, minimumWidths: [units.gu(40)], maximumWidths: [Number.POSITIVE_INFINITY], preferredWidths: [units.gu(40)], fillWidths: [true]}, {tag: "2 column sizes, default layout", width: units.gu(60), layout: defaultLayout, columns: 2, minimumWidths: [units.gu(40), 0], maximumWidths: [units.gu(40), Number.POSITIVE_INFINITY], preferredWidths: [units.gu(40), 0], fillWidths: [false, true]}, {tag: "2 column sizes, custom layout", width: units.gu(30), layout: dynamicLayout, columns: 2, minimumWidths: [0, 0], maximumWidths: [units.gu(30), Number.POSITIVE_INFINITY], preferredWidths: [units.gu(25), 0], fillWidths: [false, true]}, {tag: "3 column sizes, custom layout", width: units.gu(80), layout: dynamicLayout, columns: 3, minimumWidths: [0, 0, 0], maximumWidths: [units.gu(30), Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY], preferredWidths: [units.gu(25), 0, units.gu(20)], fillWidths: [false, true, true]}, {tag: "1 column sizes, custom layout", width: units.gu(29), layout: dynamicLayout, columns: 1, minimumWidths: [units.gu(20)], maximumWidths: [Number.POSITIVE_INFINITY], preferredWidths: [units.gu(20)], fillWidths: [true]}, ]; } function test_sizes(data) { layout.layouts = data.layout; layout.width = data.width; waitForRendering(layout); compare(layout.columns, data.columns, "columns mismatch"); for (var i = 0; i < data.columns; i++) { var holder = findChild(layout, "ColumnHolder" + i); verify(holder, "Column #" + i + " not found"); compare(holder.Layout.minimumWidth, data.minimumWidths[i], "minimum width mismatch for column #" + i); compare(holder.Layout.maximumWidth, data.maximumWidths[i], "maximum width mismatch for column #" + i); compare(holder.Layout.preferredWidth, data.preferredWidths[i], "preferred width mismatch for column #" + i); compare(holder.Layout.fillWidth, data.fillWidths[i], "fillWidth mismatch for column #" + i); } } function test_z_resize_data() { return [ {tag: "not resizable", layout: defaultLayout, width: units.gu(60), move: units.gu(40), preResizeWidth: units.gu(40), postResizeWidth: units.gu(40)}, {tag: "resizable to maximum", layout: dynamicLayout, width: units.gu(60), move: units.gu(40), preResizeWidth: units.gu(25), postResizeWidth: units.gu(30)}, ]; } function test_z_resize(data) { layout.layouts = data.layout; layout.width = data.width; waitForRendering(layout); // drag divider var holder = findChild(layout, "ColumnHolder0"); verify(holder); var divider = findChild(holder, "Divider"); verify(divider); mouseDrag(divider, centerOf(divider).x, centerOf(divider).y, data.move, 0); fuzzyCompare(holder.Layout.preferredWidth, data.postResizeWidth, 0.5, "resizing error"); } } } ./tests/unit_x11/tst_components/tst_combobutton.qml0000644000015600001650000002434512700370701022733 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 Item { width: units.gu(40) height: units.gu(71) Column { ComboButton { id: combo } ComboButton { id: rectCombo onClicked: expanded = false Rectangle { id: rect width: parent.width height: units.gu(40) gradient: Gradient { GradientStop { position: 0.0 color: "red" } GradientStop { position: 0.5 color: "green" } GradientStop { position: 1.0 color: "blue" } } } } ComboButton { id: columnCombo expandedHeight: -1 Column { id: column anchors { left: parent.left right: parent.right } height: childrenRect.height Repeater { model: 5 Rectangle { width: parent.width height: units.gu(5) color: Qt.rgba(Math.random(1), Math.random(1), Math.random(1), 1); } } } } ComboButton { id: longCombo expandedHeight: units.gu(40) Rectangle { id: longRect height: units.gu(10) color: "cyan" } } ComboButton { id: listCombo ListView { id: list model: 20 height: listCombo.comboListHeight delegate: Standard { text: modelData } } } } SignalSpy { id: spy } UbuntuTestCase { name: "ComboButton" when: windowShown function cleanup() { rectCombo.expanded = columnCombo.expanded = longCombo.expanded = listCombo.expanded = false; spy.clear(); spy.signalName = ""; spy.target = undefined; } function test_0_defaults() { compare(combo.expanded, false, "not expanded by default"); compare(combo.collapsedHeight, combo.implicitHeight, "collapsedHeight is implicitHeight"); compare(combo.expandedHeight, combo.collapsedHeight + units.gu(19.5), "expanded height default"); var lheight = combo.expandedHeight - combo.collapsedHeight - combo.__styleInstance.comboListMargin; compare(combo.comboListHeight, lheight, "comboListHeight default"); compare(combo.comboList.length, 0, "comboList is empty"); verify(combo.font === Qt.font({family: "Ubuntu", pixelSize: FontUtils.sizeToPixels("medium")}), "Default font differs."); verify(combo.dropdownColor === combo.__styleInstance.defaultDropdownColor, "Default dropdown color differs"); } function test_dropdownColor() { rectCombo.dropdownColor = rectCombo.expanded ? "red" : "green"; rectCombo.expanded = false; var dropdownFace = findChild(rectCombo, "combobutton_dropdown_visuals"); verify(dropdownFace, "Dropdown button visuals cannot be reached"); verify(dropdownFace.color === rectCombo.dropdownColor, "Dropdon color when collapsed wrong"); rectCombo.expanded = true; waitForRendering(rectCombo); verify(dropdownFace.color === rectCombo.dropdownColor, "Dropdon color when expanded wrong"); } function test_comboListWidth() { var comboListHolder = findChild(rectCombo, "combobutton_combolist"); compare(rect.width, comboListHolder.width, "rectCombo list content width is not adjusted"); comboListHolder = findChild(columnCombo, "combobutton_combolist"); compare(column.width, comboListHolder.width, "columnCombo list content width is not adjusted"); comboListHolder = findChild(longCombo, "combobutton_combolist"); compare(longRect.width, comboListHolder.width, "longCombo list content width is not adjusted"); comboListHolder = findChild(listCombo, "combobutton_combolist"); compare(list.width, comboListHolder.width, "listCombo list content width is not adjusted"); } function test_expandRectComboThroughProperty() { rectCombo.expanded = true; waitForRendering(rectCombo); var comboListPanel = findChild(rectCombo, "combobutton_combopanel"); tryCompareFunction(function() { return comboListPanel.opacity}, 1.0); } function test_expandRectComboThroughClick() { var dropDown = findChild(rectCombo, "combobutton_dropdown"); mouseClick(dropDown, dropDown.width / 2, dropDown.height / 2); waitForRendering(rectCombo); compare(rectCombo.expanded, true, "combo is not expanded"); var comboListPanel = findChild(rectCombo, "combobutton_combopanel"); tryCompareFunction(function() { return comboListPanel.opacity}, 1.0); } function test_autoCollapse() { var dropDown = findChild(rectCombo, "combobutton_dropdown"); var comboListPanel = findChild(rectCombo, "combobutton_combopanel"); mouseClick(dropDown, dropDown.width / 2, dropDown.height / 2); waitForRendering(rectCombo); compare(rectCombo.expanded, true, "combo is not expanded"); tryCompareFunction(function() { return comboListPanel.opacity}, 1.0); mouseClick(rectCombo, rectCombo.width / 2, rectCombo.collapsedHeight / 2); waitForRendering(rectCombo); compare(rectCombo.expanded, false, "combo is not collapsed"); tryCompareFunction(function() { return comboListPanel.opacity}, 0.0); } function test_flickRectCombo() { // skip the test temporarily due to flakyness on powerpc target // https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1315244 skip("The test is flaky on powerpc target"); var dropDown = findChild(rectCombo, "combobutton_dropdown"); var comboListPanel = findChild(rectCombo, "combobutton_combopanel"); var comboList = findChild(rectCombo, "combobutton_combolist"); mouseClick(dropDown, dropDown.width / 2, dropDown.height / 2); waitForRendering(rectCombo); tryCompareFunction(function() { return comboListPanel.opacity}, 1.0); verify(comboList.height > rectCombo.expandedHeight); // comboList flicker is the combolist parent's parent var comboListFlicker = findChild(rectCombo, "combobutton_contentflicker"); compare(comboListFlicker.interactive, true, "combo list holder must be interactive"); // drag the rectangle, the Flickable should be moving var x = comboListFlicker.width / 2; var y = comboListFlicker.height / 2; var dy = comboListFlicker.height / 6; spy.target = comboListFlicker; spy.signalName = "onMovementEnded"; mouseDrag(comboList, x, y, 0, -dy); waitForRendering(comboListFlicker); spy.wait(); } function test_autoExpandHeight() { var comboListPanel = findChild(columnCombo, "combobutton_combopanel"); var comboList = findChild(columnCombo, "combobutton_combolist"); columnCombo.expanded = true; waitForRendering(columnCombo); tryCompareFunction(function() { return comboListPanel.opacity}, 1.0); var comboListFlicker = findChild(columnCombo, "combobutton_contentflicker"); compare(comboListFlicker.interactive, false, "combo list holder must not be interactive"); compare(comboListFlicker.height, columnCombo.comboListHeight, "combo list height differs from the holder height"); } function test_emptyComboExpanded() { var comboListPanel = findChild(combo, "combobutton_combopanel"); var comboList = findChild(combo, "combobutton_combolist"); combo.expanded = true; waitForRendering(combo); waitForRendering(comboListPanel); tryCompareFunction(function() { return comboListPanel.opacity}, 0.0, 1000); } function test_longCombo() { var comboListPanel = findChild(longCombo, "combobutton_combopanel"); var comboList = findChild(longCombo, "combobutton_combolist"); longCombo.expanded = true; waitForRendering(longCombo); waitForRendering(comboListPanel); tryCompareFunction(function() { return comboListPanel.opacity}, 1.0); verify(comboListPanel.height < longCombo.expandedHeight); } function test_listCombo() { var comboListPanel = findChild(listCombo, "combobutton_combopanel"); var comboList = findChild(listCombo, "combobutton_combolist"); listCombo.expanded = true; waitForRendering(listCombo); waitForRendering(comboListPanel); tryCompareFunction(function() { return comboListPanel.opacity}, 1.0); compare(list.height, comboList.height, "list and comboList height differs"); } } } ./tests/unit_x11/tst_components/tst_tabbar.qml0000644000015600001650000001710712700370701021631 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 import TestObjects 0.1 Item { id: root width: units.gu(40) height: units.gu(71) TabBar { id: bar anchors.top: parent.top width: parent.width } TabBar { id: bar2 // anchor to bottom not to occlude the first TabBar anchors.bottom: parent.bottom width: parent.width model: invalidModel } ListView { anchors { fill: parent topMargin: bar.height } orientation: Qt.Horizontal currentIndex: bar.selectedIndex model: pages delegate: Rectangle { width: ListView.view.width height: ListView.view.height Label { anchors.centerIn: parent text: title fontSize: "x-large" } color: Qt.rgba(Math.random(0.5), Math.random(1), Math.random(0.5), 1) } } ListModel { id: pages property int selectedIndex: 0 ListElement { title: "Tab 1" } ListElement { title: "Tab 2" } ListElement { title: "Tab 3" } ListElement { title: "Tab 4" } ListElement { title: "Tab 5" } } ListModel { id: invalidModel property int selectedIndex: 0 ListElement { fruit: "Pear" } } ListModel { id: invalidModelTab property int selectedIndex: 0 ListElement { tab: "Pear" } } Item { id: myTab property string title: "Pear" } ListModel { id: validModelTab property int selectedIndex: count > 0 ? 0 : -1 } ListModel { id: emptyModelWillBeInvalid property int selectedIndex: count > 0 ? 0 : -1 } ListModel { id: emptyModel property int selectedIndex: count > 0 ? 0 : -1 } TabsModel { id: pagesCpp property int selectedIndex: count > 0 ? 0 : -1 } Label { id: textSizer text: "Tab 9" visible: false } TestCase { name: "TabBarAPI" when: windowShown // API test function test_0_tabsItem() { // deprecated } function test_0_model() { compare(bar.model, null, "model default is undefined"); } function test_0_selectionMode() { compare(bar.selectionMode, true, "default selectionMode"); } function test_0_selectedIndex() { compare(bar.selectedIndex, -1, "default selectedIndex"); } function test_0_alwaysSelectionMode() { compare(bar.alwaysSelectionMode, false, "default alwaysSelectionMode"); } function test_0_animate() { compare(bar.animate, true, "default animate"); } function test_1_modelSet() { bar.model = pages; compare(bar.model, pages); compare(bar.selectedIndex, 0, "selectedIndex defaults to 0 when model is defined"); } function test_2_tabSelection_data() { // sync textSizer with style settings textSizer.fontSize = bar.__styleInstance.headerFontSize; textSizer.font.weight = bar.__styleInstance.headerFontWeight; var tabWidth = units.gu(2) + textSizer.paintedWidth + bar.__styleInstance.headerTextLeftMargin + bar.__styleInstance.headerTextRightMargin; return [ {"position": tabWidth, "selectedIndex": 1}, {"position": tabWidth, "selectedIndex": 2}, {"position": tabWidth, "selectedIndex": 3}, {"position": tabWidth, "selectedIndex": 4}, {"position": tabWidth, "selectedIndex": 0}, {"position": tabWidth, "selectedIndex": 1}, {"position": tabWidth, "selectedIndex": 2}, {"position": tabWidth, "selectedIndex": 3}, {"position": tabWidth, "selectedIndex": 4}, {"position": 2 * tabWidth, "selectedIndex": 1}, {"position": 2 * tabWidth, "selectedIndex": 3}, {"position": 2 * tabWidth, "selectedIndex": 0}, ]; } function test_2_tabSelection(data) { bar.model = pages; compare(bar.model, pages); if (bar.selectionMode) { // wait till the TabBar goes off from selection mode, with an extra threshold wait(bar.__styleInstance.deactivateTime + 500); } // activate tab compare(bar.selectionMode, false, "TabBar is not yet in selection mode"); mouseClick(root, units.gu(2), units.gu(2)); wait(bar.__styleInstance.headerTextFadeDuration); // wait to show the selections compare(bar.selectionMode, true, "TabBar is in selection mode"); // select the next tab mouseClick(root, data.position, units.gu(2)); compare(bar.selectionMode, false, "TabBar is no longer in selection mode"); // wait till the selection mode goes off by waiting ~1 second wait(bar.__styleInstance.headerTextFadeDuration); compare(bar.selectedIndex, data.selectedIndex, "the next tab is selected"); } function test_invalidModel() { bar.model = invalidModel; compare(bar.model, null, "the model has to be null when setting an invalid model"); } function test_invalidModelTab() { bar.model = invalidModelTab; compare(bar.model, null, "the model has to be null when setting an invalid model"); } function test_invalidModelTab2() { compare(bar2.model, null, "the model has to be null when setting an invalid model"); } function test_validModelTab() { bar.model = validModelTab; compare(bar.model, validModelTab); validModelTab.append({tab: myTab}); compare(bar.model, validModelTab); } function test_invalidModelEmptyAtTheBeginning() { bar.model = emptyModelWillBeInvalid; compare(bar.model, emptyModelWillBeInvalid); emptyModelWillBeInvalid.append({fruit: "Pear"}); compare(bar.model, null, "the model has to be null when setting an invalid model"); } function test_addTabAfterShownQML() { bar.model = emptyModel; compare(bar.model, emptyModel); compare(bar.selectedIndex, -1); emptyModel.append({title:"Title 1"}); compare(bar.selectedIndex, 0); } function test_addTabAfterShownCpp() { bar.model = pagesCpp; compare(bar.model, pagesCpp); compare(bar.selectedIndex, -1); pagesCpp.append("Title 1"); compare(bar.selectedIndex, 0); } } } ./tests/unit_x11/tst_components/tst_label_extras.qml0000644000015600001650000000550012700370714023041 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.3 import Ubuntu.Components 1.3 Item { id: main width: units.gu(40) height: units.gu(70) Component { id: labelWithButton Label { text: "Something" Button { objectName: "childButton" text: "Something else" onClicked: visible = false } } } Component { id: testLabel Label { text: "Hello Dolly!" } } Component { id: labelModel ListView { anchors.fill: parent model: [ "Lorem ipsum dolor sit amet" ] enabled: false delegate: Label { id: ubuntuIdLabel objectName: "ubuntuIdLabel" text: modelData elide: Text.ElideRight property string email: modelData } } } Loader { id: testLoader } UbuntuTestCase { name: "Label13Extras" when: windowShown function loadTest(component) { testLoader.sourceComponent = component; tryCompare(testLoader, "status", Loader.Ready, 1000); verify(testLoader.item); return testLoader.item; } function cleanup() { testLoader.sourceComponent = null; waitForRendering(main, 400); } function test_label_with_button_bug1503901() { // this should SEGFAULT on error! loadTest(labelWithButton); } function test_label_color_changes_even_with_same_value_as_default_bug1555784() { var test = loadTest(testLabel); // override the text color with the same as the default test.color = theme.palette.normal.backgroundText; // change the color of the palette theme.palette.normal.backgroundText = UbuntuColors.blue; verify(test.color != theme.palette.normal.backgroundText); } function test_label_destruction_crash_bug1560044() { var test = loadTest(labelModel); testLoader.sourceComponent = null; } } } ./tests/unit_x11/tst_components/tst_scrollview.qml0000644000015600001650000011543112700370714022572 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Andrea Bernabei */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 import Ubuntu.Components.Styles 1.3 import QtQml.Models 2.1 Item { id: main width: units.gu(50) height: units.gu(100) Component { id: scrollViewComp Item { id: root //make sure that the item is smaller than the window otherwise we won't be able //to position the mouse on the scrollbar width: units.gu(40) height: units.gu(30) property alias scrollview: freshScrollView property alias content: content //tests will manually enable this property property bool innerItemConsumesKeyEvents: false Keys.enabled: true //Don't change this to a ListView, this usecase has to be simple, //we don't want the difficulties added by ListView, i.e. delegates //size estimation, dynamic contentWidth/Height, etc ScrollView { id: freshScrollView anchors.fill: parent clip: true StyledItem { id: content width: units.gu(100) //make this much taller than the flickable to avoid timing issues when //detecting if the flickable is flicking in the tests height: units.gu(200) activeFocusOnPress: true Keys.enabled: true Keys.onPressed: { if (event.key === Qt.Key_PageDown && root.innerItemConsumesKeyEvents) { event.accepted = true } } } } } } Component { id: nestedScrollViewComp Item { id: root width: main.width - units.gu(5) height: units.gu(50) property alias innerScrollView: innerScrollView property alias scrollview: freshScrollView property alias content: content Keys.enabled: true //Don't change this to a ListView, this usecase has to be simple, //we don't want the difficulties added by ListView, i.e. delegates //size estimation, dynamic contentWidth/Height, etc ScrollView { id: freshScrollView anchors.fill: parent clip: true Rectangle { id: content width: units.gu(50) //make this much taller than the flickable to avoid timing issues when //detecting if the flickable is flicking in the tests height: units.gu(200) color: "blue" ScrollView { id: innerScrollView //make sure that the inner view is completely visible in the root item width: root.width / 2 height: root.height / 2 Rectangle { width: innerScrollView.width + units.gu(2) height: innerScrollView.height + units.gu(2) color: "yellow" } } } } } } Component { id: nonScrollableTestViewComp Item { id: root width: main.width - units.gu(5) height: units.gu(50) property alias scrollview: freshScrollView property alias content: content ScrollView { id: freshScrollView anchors.fill: parent clip: true Rectangle { id: content //make sure that it's not scrollable width: freshScrollView.width / 2 height: freshScrollView.height / 2 color: "blue" } } } } Component { id: styledScrollbarComp Scrollbar { StyleHints { sliderColor: UbuntuColors.green } } } Component { id: changeDefaultScrollbarPropsComp Item { id: root width: units.gu(30) height: units.gu(50) property alias scrollview: freshScrollView ScrollView { id: freshScrollView anchors.fill: parent clip: true //This is what this whole component is about horizontalScrollbar.align: Qt.AlignTop Rectangle { id: content //make sure that it's not scrollable width: freshScrollView.width / 2 height: freshScrollView.height / 2 color: "blue" } } } } SignalSpy { id: signalSpy } SignalSpy { id: anotherSignalSpy } SignalSpy { id: ultimateSignalSpy } Flickable { anchors.fill: parent Column { id: column } } ScrollbarTestCase { name: "ScrollView" //another ref to an object we want to destroy in cleanup() property var anotherDynamicComp: null function getFreshScrollView() { var wrapper = scrollViewComp.createObject(column) verify(wrapper !== null, "Error: dynamic item creation failed.") currComponent = wrapper return wrapper } function getHorizontalScrollbar(scrollView) { var scrollbar = findChild(scrollView, "horizontalScrollbar") verify(scrollbar !== null, "Could not find horizontal scrollbar.") return scrollbar } function getVerticalScrollbar(scrollView) { var scrollbar = findChild(scrollView, "verticalScrollbar") verify(scrollbar !== null, "Could not find vertical scrollbar.") return scrollbar } function focusScrollView(scrollview) { mouseClick(scrollview, 0, 0) tryCompare(scrollview, "focus", true, 5000, "Key events propagation: scrollview not focused.") tryCompare(scrollview, "activeFocus", true, 5000, "Key events propagation: scrollview not focused.") } function sendKeyAndCheckItHasNoEffect(keyName, keyCode, flickable, expectedContentX, expectedContentY) { keyClick(keyCode) wait(150) checkNoContentPositionChange(keyName + " key", flickable, expectedContentX, expectedContentY) } function cleanup() { if (currComponent) { currComponent.destroy() currComponent = null } if (anotherDynamicComp) { anotherDynamicComp.destroy() anotherDynamicComp = null } gc() } function test_veryLongContentItemIsTrueEvenWhenOnlyOneSideIsVeryLong_data() { return [ { tag: "OnlyHeight", setHeight: true, setWidth: false }, { tag: "OnlyWidth", setHeight: false, setWidth: true }, { tag: "Both", setHeight: true, setWidth: true } ] } //this is to ensure that we have a consistent style for the scrollbars. //Even if only one side of the item is very long, we want both hor and vert scrollbars //to use thumb style, for instance. //The test that veryLongContentItem will trigger thumb style is inside tst_scrollbars.qml function test_veryLongContentItemIsTrueEvenWhenOnlyOneSideIsVeryLong(data) { var freshTestItem = getFreshScrollView() var scrollview = freshTestItem.scrollview var horizontalScrollbar = getHorizontalScrollbar(scrollview) var verticalScrollbar = getVerticalScrollbar(scrollview) scrollview.flickableItem.contentWidth = scrollview.flickableItem.width + 1 scrollview.flickableItem.contentHeight = scrollview.flickableItem.height + 1 compare(horizontalScrollbar.__styleInstance.veryLongContentItem, false, "Horizontal scrollbar: veryLongContentItem should be false.") compare(verticalScrollbar.__styleInstance.veryLongContentItem, false, "Vertical scrollbar: veryLongContentItem should be false.") //we call it twice just because we centralized the check on veryLongContentItem inside that method if (data.setHeight) { setVeryLongContentItem(scrollview.flickableItem, horizontalScrollbar.__styleInstance, false) setVeryLongContentItem(scrollview.flickableItem, verticalScrollbar.__styleInstance, false) //make it long enough to avoid timing issues with the flickable stopping before we manage //to check the variables if (!data.setWidth) scrollview.flickableItem.contentWidth = scrollview.flickableItem.width * 4 } if (data.setWidth) { setVeryLongContentItem(scrollview.flickableItem, horizontalScrollbar.__styleInstance, true) setVeryLongContentItem(scrollview.flickableItem, verticalScrollbar.__styleInstance, true) if (!data.setHeight) scrollview.flickableItem.contentHeight = scrollview.flickableItem.height * 4 } //The final "1" is a workaround to bug #1549256 flick(scrollview.flickableItem, 20, 20, -units.gu(10), -units.gu(10), undefined, undefined, undefined, undefined, 1) tryCompare(scrollview.flickableItem, "moving", true, 5000, "Flickable not moving after simulating a flick.") //NOTE: this becomes FLAKY if you move the mouse inside the window the test is being rendered on //because the mouse moves interfere with the flicking tryCompare(horizontalScrollbar.__styleInstance, "state", "thumb", 5000, "Horizontal scrollbar: wrong style while flicking.") tryCompare(verticalScrollbar.__styleInstance, "state", "thumb", 5000, "Vertical scrollbar: wrong style while flicking.") //we don't set it up before because the hinting feature already changes the style to thumb //at the beginning setupSignalSpy(anotherSignalSpy, horizontalScrollbar.__styleInstance, "stateChanged") setupSignalSpy(ultimateSignalSpy, verticalScrollbar.__styleInstance, "stateChanged") //wait for the flickable to stop tryCompare(scrollview.flickableItem, "moving", false, 5000, "Flickable still moving after timeout.") compare(horizontalScrollbar.__styleInstance.state, "hidden", "Horizontal scrollbar: wrong style after the item stopped moving.") compare(verticalScrollbar.__styleInstance.state, "hidden", "Vertical scrollbar: wrong style after the item stopped moving.") } function test_keyEventsPropagation() { var freshTestItem = getFreshScrollView() var scrollview = freshTestItem.scrollview var horizontalScrollbar = getHorizontalScrollbar(scrollview) var verticalScrollbar = getVerticalScrollbar(scrollview) //focus the scrollview focusScrollView(scrollview) compare(scrollview.Keys.enabled, true, "Key events propagation: scrollview key handling not enabled.") setupSignalSpy(signalSpy, scrollview.Keys, "onPressed") setupSignalSpy(anotherSignalSpy, freshTestItem.Keys, "onPressed") keyClick(Qt.Key_Home) signalSpy.wait() compare(signalSpy.count, 1, "Key events propagation: scrollview did not receive the key event.") keyClick(Qt.Key_End) signalSpy.wait() compare(signalSpy.count, 2, "Key events propagation: scrollview did not receive the key event.") keyClick(Qt.Key_PageDown) signalSpy.wait() compare(signalSpy.count, 3, "Key events propagation: scrollview did not receive the key event.") keyClick(Qt.Key_PageUp) signalSpy.wait() compare(signalSpy.count, 4, "Key events propagation: scrollview did not receive the key event.") setupSignalSpy(signalSpy, scrollview.Keys, "onLeftPressed") keyClick(Qt.Key_Left) signalSpy.wait() compare(signalSpy.count, 1, "Key events propagation: scrollview did not receive the left key event.") setupSignalSpy(signalSpy, scrollview.Keys, "onRightPressed") keyClick(Qt.Key_Right) signalSpy.wait() compare(signalSpy.count, 1, "Key events propagation: scrollview did not receive the right key event.") setupSignalSpy(signalSpy, scrollview.Keys, "onUpPressed") keyClick(Qt.Key_Up) signalSpy.wait() compare(signalSpy.count, 1, "Key events propagation: scrollview did not receive the up key event.") setupSignalSpy(signalSpy, scrollview.Keys, "onDownPressed") keyClick(Qt.Key_Down) signalSpy.wait() compare(signalSpy.count, 1, "Key events propagation: scrollview did not receive the down key event.") //Check that the parent has not received any event so far. compare(anotherSignalSpy.count, 0, "Key events propagation: parent should have not received any event.") //Fire random keys and make sure we're letting the rest of the keys propagate to the parent. keyClick(Qt.Key_A) anotherSignalSpy.wait() keyClick(Qt.Key_N) anotherSignalSpy.wait() keyClick(Qt.Key_P) anotherSignalSpy.wait() keyClick(Qt.Key_Return) anotherSignalSpy.wait() compare(anotherSignalSpy.count, 4, "Key events propagation: parent did not receive the right number of key events.") } function test_arrowKeys_scrollableView_data() { return [ {tag: "Scrollable", addContentMargins: false}, {tag: "ScrollableWithContentMargins", addContentMargins: true}, ] } function test_arrowKeys_scrollableView(data) { var testComp = scrollViewComp.createObject(column) verify(testComp !== null, "Error: dynamic item creation failed.") //make sure cleanup() deletes the dynamic object if a test fails currComponent = testComp var scrollview = testComp.scrollview var flickable = testComp.scrollview.flickableItem var horizontalScrollbar = getHorizontalScrollbar(scrollview) var verticalScrollbar = getVerticalScrollbar(scrollview) var horizontalScrollbarStyle = horizontalScrollbar.__styleInstance var verticalScrollbarStyle = verticalScrollbar.__styleInstance if (data.addContentMargins) { addContentMargins(flickable) } //doublecheck that we have enough room to make at least //a long scroll (like pgUp/pgDown) in both directions //This is an assumption of the coming tests verify(flickable.contentWidth + flickable.leftMargin + flickable.rightMargin > flickable.width * horizontalScrollbarStyle.longScrollingRatio, "Content width must allow a long scrolling action.") verify(flickable.contentHeight + flickable.topMargin + flickable.bottomMargin > flickable.height * horizontalScrollbarStyle.longScrollingRatio, "Content height must allow a long scrolling action.") focusScrollView(testComp.scrollview) setContentPositionToTopLeft(flickable) var contentXBackup = flickable.contentX var contentYBackup = flickable.contentY //************ITEM POSITIONED AT THE TOP LEFT CORNER************* //(Left/Up/PageUp/Home should not have any effect) sendKeyAndCheckItHasNoEffect("Left", Qt.Key_Left, flickable, contentXBackup, contentYBackup) sendKeyAndCheckItHasNoEffect("Up", Qt.Key_Up, flickable, contentXBackup, contentYBackup) sendKeyAndCheckItHasNoEffect("PageUp", Qt.Key_PageUp, flickable, contentXBackup, contentYBackup) sendKeyAndCheckItHasNoEffect("Home", Qt.Key_Home, flickable, contentXBackup, contentYBackup) //Key_Right should work as intended when the item is at the top left keyClick(Qt.Key_Right) checkScrolling(flickable, contentXBackup, contentYBackup, horizontalScrollbarStyle, false, 1, "Right key") //reset the position of the content and test another key setContentPositionToTopLeft(flickable) contentXBackup = flickable.contentX contentYBackup = flickable.contentY //Key_Down should work as intended keyClick(Qt.Key_Down) checkScrolling(flickable, contentXBackup, contentYBackup, verticalScrollbarStyle, false, 1, "Down key") //reset the position of the content and test another key setContentPositionToTopLeft(flickable) contentXBackup = flickable.contentX contentYBackup = flickable.contentY keyClick(Qt.Key_PageDown) checkScrolling(flickable, contentXBackup, contentYBackup, verticalScrollbarStyle, true, 1, "PageDown key") //reset the position of the content and test another key setContentPositionToTopLeft(flickable) contentXBackup = flickable.contentX contentYBackup = flickable.contentY keyClick(Qt.Key_End) //check that Key_End scrolls to the bottom var newContentY = flickable.contentHeight + flickable.bottomMargin - flickable.height tryCompare(flickable, "contentY", newContentY, 5000, "End key handling: wrong contentY.") wait(150) compare(flickable.contentY, newContentY, "End key handling: wrong contentY.") compare(flickable.contentX, contentXBackup, "End key must not change contentX.") //************ITEM POSITIONED AT THE TOP RIGHT CORNER************* //(Right/Up/PageUp/Home should have no effect) //Note: leftMargin is not considered here, because when you have leftMargin != 0, //contentX = 0 aligns to the beginning of the content, not to the beginning of leftMargin. //This also means that aligning content to the left means setting contentX = -leftMargin flickable.contentY = -flickable.topMargin flickable.contentX = flickable.contentWidth + flickable.rightMargin - flickable.width contentXBackup = flickable.contentX contentYBackup = flickable.contentY sendKeyAndCheckItHasNoEffect("Right", Qt.Key_Right, flickable, contentXBackup, contentYBackup) sendKeyAndCheckItHasNoEffect("Up", Qt.Key_Up, flickable, contentXBackup, contentYBackup) sendKeyAndCheckItHasNoEffect("PageUp", Qt.Key_PageUp, flickable, contentXBackup, contentYBackup) sendKeyAndCheckItHasNoEffect("Home", Qt.Key_Home, flickable, contentXBackup, contentYBackup) //Key_Left should work as intended keyClick(Qt.Key_Left) checkScrolling(flickable, contentXBackup, contentYBackup, horizontalScrollbarStyle, false, -1, "Left key") //We don't retest PgDown/End/Down //************ITEM POSITIONED AT THE BOTTOM LEFT CORNER************* //Left/Down/PageDown/End should have no effect setContentPositionToBottomLeft(flickable) contentXBackup = flickable.contentX contentYBackup = flickable.contentY compare(flickable.contentX, -flickable.leftMargin, "Item not positioned at the bottom left corner.") sendKeyAndCheckItHasNoEffect("Left", Qt.Key_Left, flickable, contentXBackup, contentYBackup) sendKeyAndCheckItHasNoEffect("Down", Qt.Key_Down, flickable, contentXBackup, contentYBackup) sendKeyAndCheckItHasNoEffect("PageDown", Qt.Key_PageDown, flickable, contentXBackup, contentYBackup) sendKeyAndCheckItHasNoEffect("End", Qt.Key_End, flickable, contentXBackup, contentYBackup) //Key_Up instead should work as intended keyClick(Qt.Key_Up) checkScrolling(flickable, contentXBackup, contentYBackup, verticalScrollbarStyle, false, -1, "Up key") //Reposition at the bottom left corner and test PageUp setContentPositionToBottomLeft(flickable) contentXBackup = flickable.contentX contentYBackup = flickable.contentY keyClick(Qt.Key_PageUp) checkScrolling(flickable, contentXBackup, contentYBackup, verticalScrollbarStyle, true, -1, "PageUp key") setContentPositionToBottomLeft(flickable) contentXBackup = flickable.contentX contentYBackup = flickable.contentY newContentY = -flickable.topMargin keyClick(Qt.Key_Home) tryCompare(flickable, "contentY", newContentY, 5000, "Home key handling: wrong contentY.") wait(150) compare(flickable.contentY, newContentY, "Home key handling: wrong contentY.") compare(flickable.contentX, contentXBackup, "Home key must not change contentX.") } function test_arrowKeys_nonScrollableView_data() { return [ {tag: "NonScrollable", addContentMargins: false}, {tag: "NonScrollableWithContentMargins", addContentMargins: true} ] } function test_arrowKeys_nonScrollableView(data) { var testComp = nonScrollableTestViewComp.createObject(column) verify(testComp !== null, "Successfully created test object.") //make sure cleanup() deletes the dynamic object if a test fails currComponent = testComp var scrollview = testComp.scrollview var flickable = testComp.scrollview.flickableItem var horizontalScrollbar = getHorizontalScrollbar(scrollview) var style = horizontalScrollbar.__styleInstance if (data.addContentMargins) { addContentMargins(flickable) } var oldContentX = flickable.contentX var oldContentY = flickable.contentY //make sure the content is not scrollable verify(flickable.contentWidth + flickable.leftMargin + flickable.rightMargin < flickable.width, "The content must be non scrollable.") verify(flickable.contentHeight + flickable.topMargin + flickable.bottomMargin < flickable.height, "The content must be non scrollable.") compare(style.isScrollable, false, "Scrollbar thinks the content is scrollable when it is not.") sendKeyAndCheckItHasNoEffect("Right", Qt.Key_Right, flickable, oldContentX, oldContentY) sendKeyAndCheckItHasNoEffect("Left", Qt.Key_Left, flickable, oldContentX, oldContentY) sendKeyAndCheckItHasNoEffect("Up", Qt.Key_Up, flickable, oldContentX, oldContentY) sendKeyAndCheckItHasNoEffect("Down", Qt.Key_Down, flickable, oldContentX, oldContentY) sendKeyAndCheckItHasNoEffect("PageUp", Qt.Key_PageUp, flickable, oldContentX, oldContentY) sendKeyAndCheckItHasNoEffect("PageDown", Qt.Key_PageDown, flickable, oldContentX, oldContentY) sendKeyAndCheckItHasNoEffect("Home", Qt.Key_Home, flickable, oldContentX, oldContentY) sendKeyAndCheckItHasNoEffect("End", Qt.Key_End, flickable, oldContentX, oldContentY) } function test_escKey_data() { return [ { tag: "Vertical scrollbar", vertical: true }, { tag: "Horizontal scrollbar", vertical: false } ] } function test_escKey(data) { var firstTestItem = getFreshScrollView() var scrollview = firstTestItem.scrollview var flickable = scrollview.flickableItem var horizontalScrollbar = getHorizontalScrollbar(scrollview) var verticalScrollbar = getVerticalScrollbar(scrollview) var style = horizontalScrollbar.__styleInstance focusScrollView(scrollview) triggerSteppersMode(data.vertical ? verticalScrollbar : horizontalScrollbar) var contentXBackup = flickable.contentX var contentYBackup = flickable.contentY dragThumbForwardAndCheckPos_noRelease( (data.vertical ? verticalScrollbar : horizontalScrollbar), flickable, units.gu(5), units.gu(10)) setupSignalSpy(signalSpy, scrollview.Keys, "onPressed") keyClick(Qt.Key_Escape) signalSpy.wait() compare(signalSpy.count, 1, "Wrong number of signals fired after pressing Esc.") checkNoContentPositionChange("Escape key", flickable, contentXBackup, contentYBackup) mouseRelease(style.isVertical ? getThumb(verticalScrollbar) : getThumb(horizontalScrollbar), (style.isVertical ? 0 : units.gu(12)), (style.isVertical ? units.gu(12) : 0)) } function test_noFlickeringWhenUsingArrowKeysWhileDraggingThumb_data() { return [ { tag: "Vertical scrollbar", vertical: true }, { tag: "Horizontal scrollbar", vertical: false } ] } //Test that any running scrolling animation is stopped when the user drags the thumb //to avoid conflicts and flickering function test_noFlickeringWhenUsingArrowKeysWhileDraggingThumb(data) { var firstTestItem = getFreshScrollView() var scrollview = firstTestItem.scrollview var flickable = scrollview.flickableItem var scrollbar = data.vertical ? getVerticalScrollbar(scrollview) : getHorizontalScrollbar(scrollview) var style = scrollbar.__styleInstance var scrollAnimation = getScrollAnimation(scrollbar) var thumb = getThumb(scrollbar) focusScrollView(scrollview) triggerSteppersMode(scrollbar) dragThumbForwardAndCheckPos_noRelease(scrollbar, flickable, units.gu(5), units.gu(10)) var contentXBackup = flickable.contentX var contentYBackup = flickable.contentY setupSignalSpy(signalSpy, scrollview.Keys, data.vertical ? "onDownPressed" : "onRightPressed") setupSignalSpy(anotherSignalSpy, scrollAnimation, "onRunningChanged") keyClick(data.vertical ? Qt.Key_Down : Qt.Key_Right) signalSpy.wait() compare(signalSpy.count, 1, "Wrong number of signals fired after pressing Esc.") anotherSignalSpy.wait() compare(scrollAnimation.running, true, "Scroll animation not running after using an arrow key.") //Move once again, this time while the animation is running setupSignalSpy(signalSpy, thumb, style.isVertical ? "onYChanged" : "onXChanged") mouseMove(thumb, (style.isVertical ? 0 : units.gu(11)), (style.isVertical ? units.gu(11) : 0)) signalSpy.wait() compare(scrollAnimation.running, false, "Scroll animation must stop after dragging the thumb.") mouseRelease(thumb, (style.isVertical ? 0 : units.gu(12)), (style.isVertical ? units.gu(12) : 0)) } function test_scrollbarsPositioning_data() { return [ { tag: "Not scrollable", scrollableHorizontally: false, scrollableVertically: false }, { tag: "Horizontally scrollable", scrollableHorizontally: true, scrollableVertically: false } , { tag: "Vertically scrollable", scrollableHorizontally: false, scrollableVertically: true }, { tag: "Both scrollable", scrollableHorizontally: true, scrollableVertically: true } ] } function test_scrollbarsPositioning(data) { var firstTestItem = getFreshScrollView() var scrollview = firstTestItem.scrollview var flickable = scrollview.flickableItem var horizontalScrollbar = getHorizontalScrollbar(scrollview) var verticalScrollbar = getVerticalScrollbar(scrollview) var horStyle = horizontalScrollbar.__styleInstance var verStyle = verticalScrollbar.__styleInstance var viewport = scrollview.viewport //make it not scrollable flickable.contentHeight = flickable.height flickable.contentWidth = flickable.width tryCompare(horStyle, "isScrollable", false) tryCompare(verStyle, "isScrollable", false) if (data.scrollableHorizontally) { flickable.contentWidth = flickable.width + 1 tryCompare(horStyle, "isScrollable", true) } if (data.scrollableVertically) { flickable.contentHeight = flickable.height + 1 tryCompare(verStyle, "isScrollable", true) } compare(verticalScrollbar.anchors.top, viewport.anchors.top, "Horizontal scrollbar: wrong top anchors.") compare(verticalScrollbar.anchors.bottom, viewport.anchors.bottom, "Horizontal scrollbar: wrong bottom anchors.") //TODO: TEST THAT LEFT ANCHOR IS UNDEFINED. THIS REQUIRES A CUSTOM C++ METHOD //THAT WE CURRENTLY DO NOT HAVE compare(verticalScrollbar.anchors.right, viewport.anchors.right, "Horizontal scrollbar: wrong right anchors.") compare(verticalScrollbar.anchors.topMargin, 0, "Horizontal scrollbar: wrong topMargin.") compare(verticalScrollbar.anchors.rightMargin, 0, "Horizontal scrollbar: wrong rightMargin.") //TODO: TEST THAT TOP ANCHOR IS UNDEFINED. THIS REQUIRES A CUSTOM C++ METHOD //THAT WE CURRENTLY DO NOT HAVE compare(horizontalScrollbar.anchors.bottom, viewport.anchors.bottom, "Horizontal scrollbar: wrong bottom anchors.") compare(horizontalScrollbar.anchors.left, viewport.anchors.left, "Horizontal scrollbar: wrong left anchors.") compare(horizontalScrollbar.anchors.right, viewport.anchors.right, "Horizontal scrollbar: wrong right anchors.") compare(horizontalScrollbar.anchors.bottomMargin, 0, "Horizontal scrollbar: wrong bottomMargin.") compare(horizontalScrollbar.anchors.leftMargin, 0, "Horizontal scrollbar: wrong leftMargin.") //check they're not overlapping if (data.scrollableHorizontally && data.scrollableVertically) { compare(verticalScrollbar.anchors.bottomMargin, horStyle.troughThicknessSteppersStyle, "Vertical scrollbar: wrong bottom margin.") compare(horizontalScrollbar.anchors.rightMargin, verStyle.troughThicknessSteppersStyle, "Horizontal scrollbar: wrong right margin.") } } function test_transferFocusFromOneScrollViewToAnother() { var firstTestItem = getFreshScrollView() var secondTestItem = getFreshScrollView() var firstScrollView = firstTestItem.scrollview var secondScrollView = secondTestItem.scrollview //make sure cleanup() deletes the dynamic object if a test fails currComponent = firstTestItem anotherDynamicComp = secondTestItem //wait until the column correctly lays out the new scrollview waitForRendering(secondTestItem) setupSignalSpy(signalSpy, firstScrollView.Keys, "onDownPressed") setupSignalSpy(anotherSignalSpy, secondScrollView.Keys, "onDownPressed") //focus the scrollview focusScrollView(firstScrollView) //check that the other one is not in focus compare(secondScrollView.focus, false, "Key events propagation: second scrollview should not be focused.") compare(secondScrollView.activeFocus, false, "Key events propagation: second scrollview should not be focused.") keyClick(Qt.Key_Down) signalSpy.wait() compare(signalSpy.count, 1, "Key events propagation: first scrollview did not receive the down key event.") compare(anotherSignalSpy.count, 0, "Key events propagation: key event delivered to the wrong scrollview.") focusScrollView(secondScrollView) //check that the other one is now not in focus compare(firstScrollView.focus, false, "Key events propagation: scrollview still focused.") compare(firstScrollView.activeFocus, false, "Key events propagation: scrollview still focused.") keyClick(Qt.Key_Down) anotherSignalSpy.wait() compare(signalSpy.count, 1, "Key events propagation: key event delivered to the wrong scrollview.") compare(anotherSignalSpy.count, 1, "Key events propagation: second scrollview did not receive the key event.") } function test_transferFocusToAndFromInnerScrollView() { var outerScrollViewComp = nestedScrollViewComp.createObject(column) verify(outerScrollViewComp !== null, "Error: dynamic item creation failed.") currComponent = outerScrollViewComp var outerScrollView = outerScrollViewComp.scrollview var innerScrollView = outerScrollViewComp.innerScrollView focusScrollView(innerScrollView) //ScrollView will get activeFocus as well because it is a FocusScope compare(outerScrollView.focus, true, "Outer ScrollView focus should be true.") compare(outerScrollView.activeFocus, true, "Outer ScrollView did not get active focus.") mouseClick(innerScrollView, innerScrollView.width + 1, 0) expectFail("", "FIXME: nested ScrollView doesn't lose focus.") compare(innerScrollView.activeFocus, false, "Inner ScrollView focus is still focused after clicking on the outer ScrollView.") compare(outerScrollView.activeFocus, true, "Outer ScrollView does not have activeFocus after clicking on the outer ScrollView.") } //Test that a child can override key events that would otherwise be handled by ScrollView //AND //Test that key events not consumed by the children will be handled by the parent ScrollView function test_childCanOverrideKeyHandling() { var outerScrollViewComp = getFreshScrollView() var outerScrollView = outerScrollViewComp.scrollview var innerItem = outerScrollViewComp.content outerScrollViewComp.innerItemConsumesKeyEvents = true compare(innerItem.Keys.enabled, true, "Inner item does not handle key events.") mouseClick(innerItem, 0, 0) compare(innerItem.focus, true, "Inner item does not have focus.") compare(innerItem.activeFocus, true, "Inner item does not have active focus.") setupSignalSpy(signalSpy, innerItem.Keys, "onPressed") setupSignalSpy(anotherSignalSpy, outerScrollView.Keys, "onPressed") //PageDown should be handled by the child keyClick(Qt.Key_PageDown) signalSpy.wait() compare(signalSpy.count, 1, "Inner item failed to override key handling.") compare(anotherSignalSpy.count, 0, "Outer ScrollView received a key event.") //PageUp should be handled by the outer ScrollView because the child doesn't handle it keyClick(Qt.Key_PageUp) signalSpy.wait() anotherSignalSpy.wait() compare(signalSpy.count, 2, "Inner item is not propagating key events as expected.") compare(anotherSignalSpy.count, 1, "Outer ScrollView did received the key event.") } //Test that it's still possible to customize scrollbars even when using ScrollView function test_styling() { var firstTestItem = getFreshScrollView() var scrollview = firstTestItem.scrollview //the null parent is intentional, ScrollView should handle that var styledScrollbar = styledScrollbarComp.createObject(null) verify(!!styledScrollbar, "Check that the dynamically created object is valid.") anotherDynamicComp = styledScrollbar scrollview.verticalScrollbar = styledScrollbar compare(scrollview.verticalScrollbar.__styleInstance.sliderColor, UbuntuColors.green, "Wrong slider colour.") } function test_changeDefaultScrollbarProps() { var firstTestItem = getFreshScrollView() var scrollview = firstTestItem.scrollview //try changing values of a scrollbar which is inside ScrollView and check that it works compare(scrollview.horizontalScrollbar.align, Qt.AlignBottom, "The initial alignment is not the expected one.") scrollview.horizontalScrollbar.align = Qt.AlignTop compare(scrollview.horizontalScrollbar.align, Qt.AlignTop, "Wrong updated alignment.") //try changing a scrollbar property directly in the component definition (i.e. using QML, not JS) var anotherTestScenario = changeDefaultScrollbarPropsComp.createObject(column) verify(!!anotherTestScenario, "Check that the dynamically created object is valid.") anotherDynamicComp = anotherTestScenario compare(anotherTestScenario.scrollview.horizontalScrollbar.align, Qt.AlignTop, "Wrong default alignment.") } } } ./tests/unit_x11/tst_components/tst_textarea.qml0000644000015600001650000004340712700370701022215 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 as ListItem Item { id: main width: units.gu(50); height: units.gu(100) property bool hasOSK: false Column { TextArea { id: textArea SignalSpy { id: signalSpy target: parent } property int keyPressData property int keyReleaseData Keys.onPressed: keyPressData = event.key Keys.onReleased: keyReleaseData = event.key } TextArea { id: colorTest color: colorTest.text.length < 4 ? "#0000ff" : "#00ff00" } TextEdit { id: textEdit } ListItem.Empty { id: listItem height: 200 anchors.left: parent.left anchors.right: parent.right SignalSpy { id: listItemSpy signalName: "clicked" target: listItem } TextArea { id: input anchors.fill: parent Component.onCompleted: forceActiveFocus() } } TextArea { id: t1 objectName: "t1" } TextArea { id: t2 objectName: "t2" } TextArea { id: longText text: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book." } } UbuntuTestCase { name: "TextAreaAPI" when: windowShown function init() { main.hasOSK = QuickUtils.inputMethodProvider !== "" } function cleanup() { textArea.focus = colorTest.focus = textEdit.focus = input.focus = t1.focus = t2.focus = longText.focus = false; longText.cursorPosition = 0; var scroller = findChild(longText, "input_scroller"); scroller.contentY = 0; scroller.contentX = 0; textArea.text = ""; textArea.textFormat = TextEdit.PlainText; input.textFormat = TextEdit.PlainText; input.text = ""; input.cursorPosition = 0; // empty event buffer wait(200); } function test_activate() { textArea.forceActiveFocus(); compare(textArea.activeFocus, true, "TextArea is active"); } // TextEdit shared properties function test_0_activeFocusOnPress() { compare(textArea.activeFocusOnPress,textEdit.activeFocusOnPress,"TextArea.activeFocusOnPress is same as TextEdit.activeFocusOnPress") } function test_0_canPaste() { compare(textArea.canPaste,textEdit.canPaste,"TextArea.canPaste is same as TextEdit.canPaste") } function test_0_canRedo() { compare(textArea.canRedo,textEdit.canRedo,"TextArea.canRedo is same as TextEdit.canRedo") } function test_0_canUndo() { compare(textArea.canUndo,textEdit.canUndo,"TextArea.canUndo is same as TextEdit.canUndo") } function test_0_color() { compare(textArea.color,textEdit.color,"TextArea.color is same as TextEdit.canUndo") } function test_0_cursorDelegate() { verify(textArea.cursorDelegate === null, "TextArea.cursorDelegate is not null") } function test_0_cursorPosition() { compare(textArea.cursorPosition,textEdit.cursorPosition,"TextArea.cursorPosition is same as TextEdit.cursorPosition") } function test_0_cursorRectangle() { compare(textArea.cursorRectangle,textEdit.cursorRectangle,"TextArea.cursorRectangle is same as TextEdit.cursorRectangle") } function test_0_cursorVisible() { compare(textArea.cursorVisible,textEdit.cursorVisible,"TextArea.cursorVisible is same as TextEdit.cursorVisible") } function test_0_effectiveHorizontalAlignment() { compare(textArea.effectiveHorizontalAlignment,textEdit.effectiveHorizontalAlignment,"TextArea.effectiveHorizontalAlignment is same as TextEdit.effectiveHorizontalAlignment") } function test_0_font() { compare(textArea.font,textEdit.font,"TextArea.font is same as TextEdit.font") } function test_0_horizontalAlignment() { compare(textArea.horizontalAlignment,textEdit.horizontalAlignment,"TextArea.horizontalAlignment is same as TextEdit.horizontalAlignment") } function test_0_inputMethodComposing() { compare(textArea.inputMethodComposing,textEdit.inputMethodComposing,"TextArea.inputMethodComposing is same as TextEdit.inputMethodComposing") } function test_0_inputMethodHints() { compare(textArea.inputMethodHints,textEdit.inputMethodHints,"TextArea.inputMethodHints is same as TextEdit.inputMethodHints") } function test_0_length() { compare(textArea.length,textEdit.length,"TextArea.length is same as TextEdit.length") } function test_0_lineCount() { compare(textArea.lineCount,textEdit.lineCount,"TextArea.lineCount is same as TextEdit.lineCount") } function test_0_mouseSelectionMode() { compare(textArea.mouseSelectionMode, TextEdit.SelectWords,"TextArea.mouseSelectionMode is SelectWords") } function test_0_persistentSelection() { compare(textArea.persistentSelection,textEdit.persistentSelection,"TextArea.persistentSelection is same as TextEdit.persistentSelection") } function test_0_readOnly() { compare(textArea.readOnly,textEdit.readOnly,"TextArea.readOnly is same as TextEdit.readOnly") textArea.text = "ab"; textArea.cursorPosition = 1; textArea.textFormat = TextEdit.PlainText; keyClick(Qt.Key_Return); compare("ab", textArea.text, "No split occurred in plain area"); textArea.textFormat = TextEdit.RichText; keyClick(Qt.Key_Return); compare(textArea.text.indexOf("
"), -1, "No split occurred in rich area"); } function test_0_renderType() { compare(textArea.renderType,textEdit.renderType,"TextArea.renderType is same as TextEdit.renderType") } function test_0_selectByMouse() { compare(textArea.selectByMouse,true,"TextArea.selectByMouse is true") } function test_0_selectedText() { compare(textArea.selectedText,textEdit.selectedText,"TextArea.selectedText is same as TextEdit.selectedText") } function test_0_selectedTextColor() { compare(textArea.selectedTextColor,textEdit.selectedTextColor,"TextArea.selectedTextColor is same as TextEdit.selectedTextColor") } function test_0_selectionColor() { compare(textArea.selectionColor,textEdit.selectionColor,"TextArea.selectionColor is same as TextEdit.selectionColor") } function test_0_selectionEnd() { compare(textArea.selectionEnd,textEdit.selectionEnd,"TextArea.selectionEnd is same as TextEdit.selectionEnd") } function test_0_selectionStart() { compare(textArea.selectionStart,textEdit.selectionStart,"TextArea.selectionStart is same as TextEdit.selectionStart") } function test_0_text() { compare(textArea.text,textEdit.text,"TextArea.text is same as TextEdit.text") } function test_0_textFormat() { compare(textArea.textFormat,textEdit.textFormat,"TextArea.textFormat is same as TextEdit.textFormat") } function test_0_verticalAlignment() { compare(textArea.verticalAlignment,textEdit.verticalAlignment,"TextArea.verticalAlignment is same as TextEdit.verticalAlignment") } function test_0_wrapMode() { compare(textArea.wrapMode,TextEdit.Wrap,"TextArea.wrapMode is TextEdit.Wrap") } // TextArea specific properties function test_0_highlighted() { compare(textArea.highlighted, textArea.focus, "highlighted is the same as focused"); } function test_0_contentHeight() { verify(textArea.contentHeight > 0, "contentHeight over 0 units on default") var newValue = 200; textArea.contentHeight = newValue; compare(textArea.contentHeight,newValue,"set/get"); } function test_0_contentWidth() { var style = findChild(textArea, "textarea_style"); compare(textArea.contentWidth, units.gu(30) - 2 * style.frameSpacing, "contentWidth is the implicitWidth - 2 times the frame size on default") var newValue = 200; textArea.contentWidth = newValue; compare(textArea.contentWidth,newValue,"set/get"); } function test_placeholderText() { compare(textArea.placeholderText,"","placeholderText is '' on default") var newValue = "Hello Placeholder"; textArea.placeholderText = newValue; compare(textArea.placeholderText,newValue,"set/get"); } function test_autoSize() { compare(textArea.autoSize,false,"TextArea.autoSize is set to false"); var newValue = true; textArea.autoSize = newValue; compare(textArea.autoSize, newValue,"set/get"); } function test_0_baseUrl() { expectFail("","TODO") compare(textArea.baseUrl,"tst_textarea.qml","baseUrl is QML file instantiating the TextArea item on default") } function test_displayText() { compare(textArea.displayText,"","displayText is '' on default") var newValue = "Hello Display Text"; try { textArea.displayText = newValue; compare(false,true,"Unable to set value as it is read-only"); } catch (e) { compare(true,true,"Unable to set value as it is read-only"); } } function test_0_popover() { compare(textArea.popover, undefined, "Uses default popover"); } function test_maximumLineCount() { compare(textArea.maximumLineCount,5,"maximumLineCount is 0 on default") var newValue = 10; textArea.maximumLineCount = newValue; compare(textArea.maximumLineCount,newValue,"set/get"); } function test_0_visible() { textArea.visible = false; compare(textArea.activeFocus, false, "TextArea is inactive"); } // functions function test_copy() { textArea.copy(); } function test_cut() { Clipboard.clear(); textArea.readOnly = false; textArea.text = "test text"; textArea.cursorPosition = textArea.text.indexOf("text"); textArea.selectWord(); textArea.cut(); compare(textArea.text, "test ", "Text cut properly"); compare(Clipboard.data.text, "text", "Clipboard contains cut text"); // we should have the "text" only ones var plainTextCount = 0; for (var i in Clipboard.data.formats) { if (Clipboard.data.formats[i] === "text/plain") plainTextCount++; } compare(plainTextCount, 1, "Clipboard is correct"); } function test_deselect() { textArea.deselect(); } function test_getFormattedText() { textArea.getFormattedText(0,0); } function test_getText() { textArea.getText(0,0); } function test_insert() { textArea.insert(0,"Hello"); } function test_isRightToLeft() { textArea.isRightToLeft(0,0); } function test_moveCursorSelection() { textArea.moveCursorSelection(0,0); } function test_paste() { textArea.readOnly = false; textArea.text = "test"; textArea.cursorPosition = textArea.text.length; textArea.paste(" text"); compare(textArea.text, "test text", "Data pasted"); } function test_positionAt() { textArea.positionAt(0,1); } function test_positionToRectangle() { textArea.positionToRectangle(0); } function test_redo() { textArea.redo(); } function test_remove() { textArea.remove(0,0); } function test_select() { textArea.select(0,0); } function test_selectAll() { textArea.selectAll(); } function test_selectWord() { textArea.selectWord(); } function test_undo() { textArea.undo(); } // signals function test_linkActivated() { signalSpy.signalName = "linkActivated"; compare(signalSpy.valid,true,"linkActivated signal exists") } // filters function test_keyPressAndReleaseFilter() { textArea.visible = true; textArea.forceActiveFocus(); textArea.readOnly = false; textArea.keyPressData = 0; textArea.keyReleaseData = 0; keyClick(Qt.Key_T, Qt.NoModifier, 100); compare(textArea.keyPressData, Qt.Key_T, "Key press filtered"); compare(textArea.keyReleaseData, Qt.Key_T, "Key release filtered"); } function test_TextAreaInListItem_EnterCaptured() { input.forceActiveFocus(); input.textFormat = TextEdit.PlainText; input.text = ""; keyClick(Qt.Key_T); keyClick(Qt.Key_E); keyClick(Qt.Key_S); keyClick(Qt.Key_T); keyClick(Qt.Key_Enter); compare(input.text, "test\n", "Keys"); } function test_TextAreaInListItem_EnterDoesNotProduceClick() { input.forceActiveFocus(); input.textFormat = TextEdit.PlainText; input.text = ""; listItemSpy.clear(); keyClick(Qt.Key_Enter); tryCompare(listItemSpy, "count", 0, 100); } function test_colorCollisionOnDelegate() { // fixes bug lp:1169601 colorTest.text = "abc"; compare(colorTest.color, "#0000ff", "Color when text length < 4"); colorTest.text = "abcd"; compare(colorTest.color, "#00ff00", "Color when text length >= 4"); } function test_OneActiveFocus() { t1.focus = true; compare(t1.activeFocus, true, "T1 has activeFocus"); compare(t2.activeFocus, false, "T1 has activeFocus"); t2.focus = true; compare(t1.activeFocus, false, "T1 has activeFocus"); compare(t2.activeFocus, true, "T1 has activeFocus"); } function test_OSK_ShownWhenNextTextAreaIsFocused() { if (!hasOSK) expectFail("", "OSK can be tested only when present"); t1.focus = true; compare(Qt.inputMethod.visible, true, "OSK is shown for the first TextArea"); t2.focus = true; compare(Qt.inputMethod.visible, true, "OSK is shown for the second TextArea"); } function test_RemoveOSKWhenFocusLost() { if (!hasOSK) expectFail("", "OSK can be tested only when present"); t1.focus = true; compare(Qt.inputMethod.visible, true, "OSK is shown when TextArea gains focus"); t1.focus = false; compare(Qt.inputMethod.visible, false, "OSK is hidden when TextArea looses focus"); } function test_ReEnabledInput() { textArea.forceActiveFocus(); textArea.enabled = false; compare(textArea.enabled, false, "textArea is disabled"); compare(textArea.focus, true, "textArea is focused"); compare(textArea.activeFocus, false, "textArea is not active focus"); compare(Qt.inputMethod.visible, false, "OSK removed"); textArea.enabled = true; compare(textArea.enabled, true, "textArea is enabled"); compare(textArea.focus, true, "textArea is focused"); compare(textArea.activeFocus, true, "textArea is active focus"); if (!hasOSK) expectFail("", "OSK can be tested only when present"); compare(Qt.inputMethod.visible, true, "OSK shown"); } function test_TextareaInListItem_RichTextEnterCaptured() { textArea.text = "a
b"; textArea.textFormat = TextEdit.RichText; input.forceActiveFocus(); input.textFormat = TextEdit.RichText; input.text = "ab"; input.cursorPosition = 1; keyClick(Qt.Key_Return); compare(input.text, textArea.text, "Formatted text split"); } } } ./tests/unit_x11/tst_components/tst_popups_dialog13.qml0000644000015600001650000000266112700370714023412 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.3 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 MainView { id: main width: units.gu(40) height: units.gu(71) UbuntuTestCase { id: test name: "Popups.Dialog" when: windowShown property bool dialogDestroyed: false function test_dismiss_dialog_on_esc_bug1523833() { var dlg = PopupUtils.open(dialog); waitForRendering(dlg); dlg.Component.destruction.connect(function() { test.dialogDestroyed = true }); keyClick(Qt.Key_Escape); tryCompare(test, "dialogDestroyed", true, 500, "Dialog not destroyed"); } } Component { id: dialog Dialog { title: "Ahoj" } } } ./tests/unit_x11/tst_components/tst_slider13.qml0000644000015600001650000001326212700370714022026 0ustar jenkinsjenkins/* * Copyright 2014-2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.3 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.0 MainView { width: units.gu(40) height: units.gu(71) Column { anchors { fill: parent margins: units.gu(1) } UbuntuListView { id: listView width: parent.width height: units.gu(20) clip: true model: 10 delegate: Standard { control: Slider { objectName: "testSlider" + index } } } UbuntuListView { id: listView2 width: parent.width height: units.gu(20) clip: true model: 10 delegate: Slider { objectName: "testSlider" + index } } Flickable { id: flickable width: parent.width height: units.gu(20) clip: true contentHeight: column.height Column { id: column width: parent.width height: childrenRect.height Repeater { model: 10 Standard { control: Slider { objectName: "testSlider" + index } } } } } Flickable { id: flickable2 width: parent.width height: units.gu(20) clip: true contentHeight: column2.height Column { id: column2 width: parent.width height: childrenRect.height Repeater { model: 10 Slider { objectName: "testSlider" + index } } } } } UbuntuTestCase { name: "SliderAPI" when: windowShown SignalSpy { id: valueSpy signalName: "onValueChanged" } SignalSpy { id: flickSpy signalName: "onMovementStarted" } function cleanup() { flickSpy.target = null; flickSpy.clear(); } function test_slider_blocks_flickable_data() { return [ {tag: "ListView with Slider in ListItem", flickable: listView}, {tag: "ListView with Slider alone", flickable: listView2}, {tag: "Flickable with Column of Slider in ListItem", flickable: flickable}, {tag: "Flickable with Column of Slider alone", flickable: flickable2}, ]; } function test_slider_blocks_flickable(data) { flickSpy.target = data.flickable; var slider = findChild(data.flickable, "testSlider1"); verify(slider, "cannot find test slider in " + data.tag); var sliderPos = slider.mapToItem(data.flickable, units.gu(10), 0); mouseDrag(data.flickable, sliderPos.x, sliderPos.y, units.gu(20), units.gu(20)); waitForRendering(data.flickable, 200); compare(flickSpy.count, 0, "The Flickable should not move while Slider is active."); compare(data.flickable.interactive, true, "The Flickable aint got back to interactive mode."); } function test_arrows_move_slider_data() { return [ {tag: "Left", key: Qt.Key_Left, to: -0.2, min: -10, max: 10}, {tag: "Left from left third", key: Qt.Key_Left, from: -5, to: -5.2, min: -10, max: 10}, {tag: "Left(live)", key: Qt.Key_Left, to: -0.2, min: -10, max: 10, live: true}, {tag: "Right", key: Qt.Key_Right, to: 0.2, min: -10, max: 10}, {tag: "Right from right third", key: Qt.Key_Right, from: 5, to: 5.2, min: -10, max: 10}, {tag: "Right(live)", key: Qt.Key_Right, from: 0, to: 0.2, min: -10, max: 10, live: true}, // No movement expected while holding modifiers {tag: "^Left", key: Qt.Key_Left, mod: Qt.ControlModifier, min: -10, max: 10}, {tag: "^Right", key: Qt.Key_Right, mod: Qt.ControlModifier, min: -10, max: 10}, ]; } function test_arrows_move_slider(data) { var from = data.from ? data.from : 0; var to = data.to ? data.to : from; var slider = findChild(listView, "testSlider1"); verify(slider, "cannot find test slider in " + data.tag); slider.minimumValue = data.min; slider.maximumValue = data.max; slider.value = from; slider.forceActiveFocus(); compare(slider.activeFocus, true, "Slider didn't gain focus!"); valueSpy.target = slider; valueSpy.clear(); keyPress(data.key, data.mod); if (to != from) valueSpy.wait(); compare(slider.value, to, "Slider has the wrong value!"); } } } ./tests/unit_x11/tst_components/tst_focus.qml0000644000015600001650000003216312700370714021520 0ustar jenkinsjenkins/* * Copyright 2014-2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 import Ubuntu.Components.Pickers 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem import Ubuntu.Components.Popups 1.3 Item { id: main width: units.gu(50); height: units.gu(100) property bool hasOSK: false Flow { anchors { fill: parent margins: units.gu(0.5) } spacing: units.gu(1) UbuntuListView { id: listView width: units.gu(50) height: units.gu(20) clip: true model: 10 delegate: ListItem.Standard { text: "Whatever" } } Button { id: dummy } TextField { id: textField text: "This is a text field with some text handling focus" primaryItem: MouseArea { id: textFieldPrimaryItem height: parent.height width: height } secondaryItem: TextField { id: textFieldSecondaryItem height: parent.height width: height } } TextArea { id: textArea text: "This is a text area with some text handling focus" } Item { BottomEdgeHint { id: bottomEdgeHint } } Button { id: button text: "Press me" } CheckBox { id: checkbox } Switch { id: switchbox } Slider { id: slider } Button { id: dummy2 } ActionBar { id: actions actions: [ Action { iconName: 'share' objectName: 'actionBarShare' }, Action { iconName: 'starred' } ] } Picker { id: picker model: 10 } Picker { id: roundPicker model: 10 circular: true } Button { id: pickerPanel property date date: new Date() text: Qt.formatDateTime(date, "yyyy/MMMM") onClicked: PickerPanel.openDatePicker(pickerPanel, "date", "Years|Months") } Button { id: disabledButton text: 'Disabled' enabled: false width: units.gu(20) height: units.gu(6) } ComboButton { id: comboButton Rectangle { height: comboButton.comboListHeight color: "blue" } } Button { id: popoverTest text: "Popovers" property var popover property Component popoverComponent onClicked: { popover = PopupUtils.open(popoverComponent) } } } Component { id: dialogComponent Dialog { id: dialog title: "TestDialog" Button { text: "close" onClicked: PopupUtils.close(dialog) } } } Component { id: popoverComponent Popover { id: popover contentWidth: units.gu(20) contentHeight: item.height ListItem.Standard { id: item text: "close" onClicked: PopupUtils.close(popover) } } } UbuntuTestCase { name: "FocusingTests" when: windowShown SignalSpy { id: buttonTriggerSpy signalName: "onTriggered" } SignalSpy { id: popupCloseSpy signalName: "onDestruction" } SignalSpy { id: textFieldPrimaryItemClickedSpy target: textFieldPrimaryItem signalName: "onClicked" } function initTestCase() { main.hasOSK = QuickUtils.inputMethodProvider !== "" textField.forceActiveFocus(); } function cleanup() { // empty event buffer wait(200); popupCloseSpy.clear(); popupCloseSpy.target = null; } function test_tab_focus_data() { return [ // (Shift)Tab via keyboard {tag: "TextField", from: dummy, to: textField, key: Qt.Key_Tab}, {tag: "TextField(back)", from: textField, to: dummy, key: Qt.Key_Backtab}, {tag: "TextArea", from: textField, to: textArea, key: Qt.Key_Tab}, {tag: "TextArea(back)", from: textArea, to: textField, key: Qt.Key_Backtab}, {tag: "BottomEdgeHint", from: textArea, to: bottomEdgeHint, key: Qt.Key_Tab}, {tag: "BottomEdgeHint(back)", from: bottomEdgeHint, to: textArea, key: Qt.Key_Backtab}, {tag: "Button", from: bottomEdgeHint, to: button, key: Qt.Key_Tab}, {tag: "Button(back)", from: button, to: bottomEdgeHint, key: Qt.Key_Backtab}, {tag: "CheckBox", from: checkbox, to: switchbox, key: Qt.Key_Tab}, {tag: "CheckBox", from: switchbox, to: checkbox, key: Qt.Key_Backtab}, {tag: "Switch", from: switchbox, to: slider, key: Qt.Key_Tab}, {tag: "Switch(back)", from: slider, to: switchbox, key: Qt.Key_Backtab}, {tag: "Slider", from: slider, to: dummy2, key: Qt.Key_Tab}, {tag: "Slider(back)", from: dummy2, to: slider, key: Qt.Key_Backtab}, /* FIXME: Figure out how to test ActionBar delegate focus {tag: "ActionBar", from: 'actionBarShare_button', to: picker, key: Qt.Key_Tab}, {tag: "ActionBar(back)", from: picker, to: 'actionBarShare_button', key: Qt.Key_Backtab}, */ // Left click/ tap {tag: "TextField(click)", from: dummy, to: textField, key: Qt.LeftButton}, {tag: "TextArea(click)", from: dummy, to: textArea, key: Qt.LeftButton}, // FIXME: lp#1368390: Buttons shouldn't grab input focus on click {tag: "Button(click)", from: dummy, to: button, key: Qt.LeftButton}, {tag: "CheckBox(click)", from: dummy, to: checkbox, key: Qt.LeftButton}, {tag: "Switch(click)", from: dummy, to: switchbox, key: Qt.LeftButton}, {tag: "Slider(click)", from: dummy, to: slider, key: Qt.LeftButton}, ]; } function test_tab_focus(data) { data.from.focus = true; verify(data.from.enabled, "Source component is invalid"); verify(data.to.enabled, "Target component is invalid"); verify(data.from.activeFocus, "Source component is not focused - focus is on %1" .arg(String(window.activeFocusItem).split("(")[0])); if (data.key == Qt.LeftButton) { verify(data.to.activeFocusOnPress, "Target doesn't take focus on click"); mouseClick(data.to, centerOf(data.to).x, centerOf(data.to).y); } else { verify(data.to.activeFocusOnTab, "Target doesn't take keyboard focus"); keyClick(data.key); } waitForRendering(data.to, 500); verify(!data.from.activeFocus, "Source component still keeps focus"); verify(data.to.activeFocus, "Target component is not focused - focus is on %1" .arg(String(window.activeFocusItem).split("(")[0])); } function test_hide_osk_when_pickerpanel_opens() { if (!main.hasOSK) { skip("This functionality can be tested with OSK only."); } textField.forceActiveFocus(); verify(textField.focus, "TextField is not focused"); verify(Qt.inputMethod.visible, "OSK is hidden"); mouseClick(pickerPanel, centerOf(pickerPanel).x, centerOf(pickerPanel).y); verify(!Qt.inputMethod.visible, "OSK is visible still!"); // remove panel/popover mouseClick(main, 0, 0); } function test_textfield_clear_button_keeps_focus() { textField.forceActiveFocus(); var text = textField.text; var clearButton = findChild(textField, "clear_button"); verify(clearButton, "clearButton is not accessible!"); var center = centerOf(clearButton); mouseClick(clearButton, center.x, center.y); compare(textField.text, "", "Text had not been cleared?"); compare(textField.focus, true, "Focus had been stolen from text input"); //restore textField.text = text; } function test_textfield_primary_and_secondary_items_keeps_focus() { textFieldPrimaryItemClickedSpy.clear(); textField.forceActiveFocus(); verify(textField.activeFocus); verify(!textFieldSecondaryItem.activeFocusOnPress); var center = centerOf(textFieldPrimaryItem); mouseClick(textFieldPrimaryItem, center.x, center.y); compare(textFieldPrimaryItemClickedSpy.count, 1); verify(textField.activeFocus); verify(!textFieldPrimaryItem.activeFocus); center = centerOf(textFieldSecondaryItem); mouseClick(textFieldSecondaryItem, center.x, center.y); verify(textField.activeFocus); verify(!textFieldSecondaryItem.activeFocus); } function test_combo_button_dropdown_focuses_component() { textField.forceActiveFocus(); var dropdownButton = findChild(comboButton, "combobutton_dropdown"); verify(dropdownButton, "dropdown button is not accessible?"); var center = centerOf(dropdownButton); mouseClick(dropdownButton, center.x, center.y); waitForRendering(comboButton); // FIXME: lp#1368390: Buttons shouldn't grab input focus on click compare(dropdownButton.focus, true, "Dropdown button hasn't got focused!"); compare(comboButton.focus, true, "ComboButton hasn't been focused!"); comboButton.expanded = false; waitForRendering(comboButton); } function test_popover_refocus_data() { return [ {tag: "Dialog", component: dialogComponent}, {tag: "Popover", component: popoverComponent}, ]; } function test_popover_refocus(data) { popoverTest.popoverComponent = data.component; var center = centerOf(popoverTest); mouseClick(popoverTest, center.x, center.y); verify(popoverTest.popover !== undefined, "No popover created"); waitForRendering(popoverTest.popover); verify(!popoverTest.focus, "Button focus not lost."); var foreground = findChild(popoverTest.popover, "popover_foreground"); verify(foreground, "Popover foreground not ready"); verify(foreground.focus, "Popover focus not gained. Focus went to %1".arg(window.activeFocusItem)); popupCloseSpy.target = popoverTest.popover.Component; var closeButton = findChildWithProperty(popoverTest.popover, "text", "close"); verify(closeButton, "Close button not accessible"); center = centerOf(closeButton); mouseClick(closeButton, center.x, center.y); verify(!popoverTest.focus, "Button focus not lost."); popupCloseSpy.wait(); verify(popoverTest.focus, "Button focus not restored."); } function test_button_trigger_via_keyboard_data() { return [ {tag: "Enter", key: Qt.Key_Enter}, {tag: "Return", key: Qt.Key_Return}, {tag: "Space", key: Qt.Key_Space}, ]; } function test_button_trigger_via_keyboard(data) { buttonTriggerSpy.target = button; button.forceActiveFocus(); keyClick(data.key); waitForRendering(button); buttonTriggerSpy.wait(); } function test_disabled_component_does_not_focus() { verify(disabledButton.activeFocusOnPress, "Disabled component doesn't take focus on click"); mousePress(disabledButton, centerOf(disabledButton).x, centerOf(disabledButton).y); compare(disabledButton.focus, false, "Disabled component shoudl not focus"); } } } ./tests/unit_x11/tst_components/tst_actionitem.qml0000644000015600001650000001652612700370701022536 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 Item { id: main width: units.gu(20) height: units.gu(20) property bool customVisible: true property bool customEnabled: true ActionItem { id: item1 SignalSpy { id: signalSpy target: parent } } Component { id: dynamicItem ActionItem { action: action1 } } Component { id: dynamicItem2 ActionItem { action: action1 visible: customVisible enabled: customEnabled } } Action { id: action1 objectName: "action1" text: "actionText" iconSource: "imageURL" } Action { id: action2 objectName: "action2" } Loader { id: loader asynchronous: false } TestCase { id: testCase when: windowShown name: "ActionItemAPI" SignalSpy { id: triggerSpy target: action1 signalName: "triggered" } function initTestCase() { compare(item1.action, null, "action is null by default") compare(item1.text, "", "text is empty string set by default") compare(item1.iconSource, "", "iconSource is empty string by default") compare(item1.iconName, "", "iconSource is empty string by default") } function cleanup() { loader.sourceComponent = null; item1.action = null; action1.visible = true; action1.enabled = true; action2.visible = true; action2.enabled = true; main.customEnabled = true; main.customVisible = true; triggerSpy.clear(); } function test_action() { compare(item1.action, null,"Action is null by default") item1.action = action1 compare(item1.action, action1, "Action can be set") compare(item1.text, action1.text, "text is automatically set to action text") compare(item1.iconSource, action1.iconSource, "iconSource is automatically set to action iconSource") item1.triggered(null) triggerSpy.wait(400); } // NOTE: This test must be run AFTER test_action(), otherwise setting the action will // not update the text function test_text() { compare(item1.text, "", "text is empty string by default") var newText = "new text" item1.text = newText compare(item1.text, newText, "text can be set") item1.text = "" compare(item1.text, "", "text can be unset") } // NOTE: This test must be run AFTER test_action(), otherwise setting the action will // will not update the iconSource function test_iconSource() { compare(item1.iconSource, "", "iconSource is empty string by default") var newIconSource = Qt.resolvedUrl("../../../examples/ubuntu-ui-toolkit-gallery/small_avatar.png") item1.iconSource = newIconSource compare(item1.iconSource, newIconSource, "iconSource can be set") item1.iconSource = "" compare(item1.iconSource, "", "iconSource can be unset") } // NOTE: This test must be run AFTER test_action(), otherwise setting the action will // will not update the iconName function test_iconName() { compare(item1.iconName, "", "iconName is empty string by default") var newIconName = "compose" item1.iconName = newIconName compare(item1.iconName, newIconName, "iconName can be set") item1.iconName = "" compare(item1.iconName, "", "iconName can be unset") } function test_signal_triggered() { signalSpy.signalName = "triggered"; compare(signalSpy.valid,true,"triggered signal exists") } function test_default_bindings_visible_enabled_data() { return [ {tag: "visible", property: "visible"}, {tag: "enabled", property: "enabled"}, ]; } function test_default_bindings_visible_enabled(data) { item1.action = action1; action1[data.property] = false; compare(item1[data.property], action1[data.property], "The item1 and action1 '" + data.property + "' value differs"); } function test_custom_bindings_visible_enabled_bug1495408_data() { return [ {tag: "visible", component: dynamicItem, property: "visible"}, {tag: "enabled", component: dynamicItem, property: "enabled"}, {tag: "visible binding", component: dynamicItem2, property: "visible", customProperty: "customVisible"}, {tag: "enabled binding", component: dynamicItem2, property: "enabled", customProperty: "customEnabled"}, ]; } function test_custom_bindings_visible_enabled_bug1495408(data) { loader.sourceComponent = data.component; var item = loader.item; compare(item[data.property], action1[data.property], "The item and action1 '" + data.property + "' value differs"); if (data.customProperty) { main[data.customProperty] = false; } else { item[data.property] = false; } // change the action so the internal bindings are updated item.action = action2; expectFail(data.tag, "default binding must be broken"); compare(item[data.property], item.action[data.property], "The item's and action's '" + data.property + "' value is the same"); } function test_custom_bindings_visible_enabled_reparenting_bug1495408_data() { return [ {tag: "visible binding", component: dynamicItem2, property: "visible"}, {tag: "enabled binding", component: dynamicItem2, property: "enabled"}, ]; } function test_custom_bindings_visible_enabled_reparenting_bug1495408(data) { loader.sourceComponent = dynamicItem2; var item = loader.item; compare(item[data.property], item.action[data.property], "The item and item.action '" + data.property + "' value differs"); // then reparent item.parent = item1; // change the action property item.action[data.property] = false; expectFail(data.tag, "default binding must be broken"); compare(item[data.property], item.action[data.property], "The item and action2 '" + data.property + "' value is the same"); } } } ./tests/unit_x11/tst_components/battery-100-charging.svg0000644000015600001650000000324612700370701023241 0ustar jenkinsjenkins image/svg+xml ./tests/unit_x11/tst_components/tst_pulltorefresh_listview.qml0000644000015600001650000001135712700370701025223 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 Item { id: testMain width: units.gu(40) height: units.gu(71) ListView { id: listView anchors.fill: parent model: ListModel { Component.onCompleted: { for (var i = 0; i < 50; i++) { append({text: "Item #" + i}); } } } delegate: Label { height: units.gu(5) text: modelData } Timer { id: completeRefresh interval: 200 } focus: true highlightFollowsCurrentItem: true highlight: Item {} PullToRefresh { id: refresh objectName: "pulltorefresh" onRefresh: completeRefresh.restart() refreshing: completeRefresh.running } } UbuntuTestCase { name: "PullToRefreshAPI" when: windowShown SignalSpy { id: stateSpy signalName: "onStateChanged" target: refresh.__styleInstance } SignalSpy { id: releaseToRefreshSpy signalName: "releaseToRefreshChanged" target: refresh } function init() { listView.positionViewAtIndex(0, ListView.Beginning) } function cleanup() { waitForRendering(refresh, 500); // wait till refresh returns to idle tryCompareFunction(function() {return refresh.__styleInstance.state}, "idle", 1000); stateSpy.clear(); releaseToRefreshSpy.clear(); } function test_0_api_defaults() { compare(refresh.target, listView, "The target must be the parent or sibling"); compare(refresh.offset, 0, "The component should be at offset 0"); compare(refresh.releaseToRefresh, false, "The component must be inactive"); verify(refresh.content !== null, "Default content"); compare(refresh.refreshing, false, "The component is not refreshing"); verify(refresh.hasOwnProperty("refreshing"), "No refreshing signal defined"); // style check verify(refresh.__styleInstance.hasOwnProperty("defaultContent"), "Wrong style used, has no defaultContent defined"); verify(refresh.__styleInstance.hasOwnProperty("activationThreshold"), "Wrong style used, has no activationThreshold defined"); verify(refresh.__styleInstance.hasOwnProperty("releaseToRefresh"), "Wrong style used, has no releaseToRefresh defined"); } function test_pull_data() { var h = refresh.__styleInstance.activationThreshold; return [ {tag: "no refresh", height: h, xfail: true}, {tag: "refresh", height: 4 * h, xfail: false}, ]; } function test_pull(data) { var x = listView.width / 2; var y = units.gu(5); var height = data.height; flick(listView, x, y, 0, data.height); if (data.xfail) { expectFailContinue(data.tag, "No refresh should be triggered"); } releaseToRefreshSpy.wait(500); if (data.xfail) { expectFailContinue(data.tag, "No refresh should be triggered"); } compare(refresh.__styleInstance.state, "refreshing", "The refresh control is in " + refresh.__styleInstance.state + " state"); } function test_automatic_refresh_animation() { completeRefresh.restart(); stateSpy.wait(500); compare(refresh.__styleInstance.state, "refreshing", "Not refreshing!"); } function test_no_refresh_animation_when_list_not_on_top() { // scroll down so the list will not be at top listView.positionViewAtIndex(10, ListView.Beginning) completeRefresh.restart(); expectFailContinue("no refresh when not on top", ""); stateSpy.wait(500); compare(refresh.__styleInstance.state, "", "Not refreshing!"); } } } ./tests/unit_x11/tst_components/tst_pagehead_hidden.qml0000644000015600001650000000327312700370701023446 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 Item { width: 400 height: 600 MainView { anchors.fill: parent id: mainView Page { id: page title: "Invisible title" head { visible: false locked: true } Label { text: "Top of the page" anchors { top: parent.top } } } } UbuntuTestCase { id: testCase name: "PageNoHeader" when: windowShown function get_header_visible() { var header = findChild(mainView, "MainView_Header"); return (header.y !== -header.height) } function test_header_hidden() { compare(get_header_visible(), false, "Header is not hidden."); } function test_page_height() { compare(page.height, mainView.height, "Page height does not match MainView height."); } } } ./tests/unit_x11/tst_components/tabsmodel.cpp0000644000015600001650000000271312700370701021444 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "tabsmodel.h" TabsModel::TabsModel() { } int TabsModel::rowCount(const QModelIndex &parent) const { if (parent.isValid()) return 0; return m_list.count(); } QVariant TabsModel::data(const QModelIndex &index, int role) const { if (role == Qt::DisplayRole) { return m_list[index.row()]; } return QVariant(); } void TabsModel::append(const QString &title) { const int count = m_list.count(); beginInsertRows(QModelIndex(), count, count); m_list << title; endInsertRows(); Q_EMIT countChanged(); } QVariantMap TabsModel::get(int index) { QVariantMap res; res.insert("title", m_list[index]); return res; } QHash TabsModel::roleNames() const { QHash roles; roles[Qt::DisplayRole] = "title"; return roles; } ./tests/unit_x11/tst_components/AppTheme/0000755000015600001650000000000012700370701020466 5ustar jenkinsjenkins./tests/unit_x11/tst_components/AppTheme/Palette.qml0000644000015600001650000000150612700370701022601 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes.SuruDark 1.3 as Suru Suru.Palette { normal.background: "#A21E1C" normal.backgroundText: "lightblue" } ./tests/unit_x11/tst_components/AppTheme/parent_theme0000644000015600001650000000004212700370701023060 0ustar jenkinsjenkinsUbuntu.Components.Themes.SuruDark ./tests/unit_x11/tst_components/tst_pagehead_sections_bug1511839.qml0000644000015600001650000000525112700370701025451 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Test 1.0 MainView { id: mainView width: units.gu(30) height: units.gu(60) Component { id: pageComponent Page { id: page title: i18n.tr("The Page") head.sections.model: ["one","two","three"] head.sections.selectedIndex: -1 } } PageStack { id: stack } Component.onCompleted: { stack.push(pageComponent) } UbuntuTestCase { id: testCase name: "Page.head.sections" when: windowShown property var sectionsItem function initTestCase() { testCase.sectionsItem = findChild(mainView, "headerSectionsItem"); verify(testCase.sectionsItem); } function verifySelectedSection(index, isSelected, message) { var button = findChild(sectionsItem, "section_button_" + index); verify(button); if (message == undefined) { message = ""; } compare(button.selected, isSelected, message); } function test_bug1511839() { for (var i = 0; i < stack.currentPage.head.sections.model.length; i++) { verifySelectedSection(i, false, "Section " + i + " is selected."); } } function test_selected_section_data() { return [ {tag: "none selected", selIndex: -1, selected: [false, false, false]}, {tag: "0 selected", selIndex: 0, selected: [true, false, false]}, {tag: "1 selected", selIndex: 1, selected: [false, true, false]}, {tag: "2 selected", selIndex: 2, selected: [false, false, true]}, ]; } function test_selected_section(data) { stack.currentPage.head.sections.selectedIndex = data.selIndex; for (var i = 0; i < stack.currentPage.head.sections.model.length; i++) { verifySelectedSection(i, data.selected[i]); } } } } ./tests/unit_x11/tst_components/tst_deprecatedtoolbar.qml0000644000015600001650000001325112700370701024055 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 Item { width: units.gu(50) height: units.gu(80) MainView { anchors.fill: parent id: mainView Page { id: page title: "test page" Label { anchors.centerIn: parent text: "testing the toolbar" } tools: ToolbarItems { id: toolbarItems ToolbarButton { id: toolbarButton text: "action1" } } } ToolbarItems { id: lockedTools ToolbarButton { text: "locked" } locked: true opened: true } } TestCase { name: "ToolbarAPI" when: windowShown function initTestCase() { compare(page.tools, toolbarItems, "Page tools are set initially"); compare(page.__propagated, mainView.__propagated, "propagated property is propagated from mainView to page") compare(mainView.__propagated.toolbar.tools, toolbarItems, "Toolbar tools are set to page tools initially"); compare(toolbarItems.opened, true, "Toolbar is opened initially"); compare(toolbarItems.locked, false, "Toolbar is initially not locked"); } function test_opened() { mainView.__propagated.toolbar.open() compare(mainView.__propagated.toolbar.opened, true, "Toolbar can be made opened"); mainView.__propagated.toolbar.close(); compare(mainView.__propagated.toolbar.opened, false, "Toolbar can be made closed"); page.tools.opened = true; compare(mainView.__propagated.toolbar.opened, true, "Toolbar can be made opened by setting page.tools.opened"); page.tools.opened = false; compare(mainView.__propagated.toolbar.opened, false, "Toolbar can be made closed by setting page.tools.opened to false"); } function test_hideTimeout_bug1249031() { compare(mainView.__propagated.toolbar.hideTimeout, 5000, "Toolbar hide timeout is initially 5 seconds."); mainView.__propagated.toolbar.open(); compare(mainView.__propagated.toolbar.opened, true, "Toolbar can be made opened"); wait(mainView.__propagated.toolbar.hideTimeout + 500); // add 500 ms margin compare(mainView.__propagated.toolbar.opened, false, "Toolbar automatically closes after timeout"); // now, wait in total more than hideTimeout, but less than 2*hideTimeout, // and have user interaction half-way to verify that the interaction // resets the timer and the toolbar is not closed. mainView.__propagated.toolbar.open(); wait(0.6*mainView.__propagated.toolbar.hideTimeout); mouseClick(toolbarButton, toolbarButton.width/2, toolbarButton.height/2); wait(0.6*mainView.__propagated.toolbar.hideTimeout); compare(mainView.__propagated.toolbar.opened, true, "Interacting with toolbar contents resets the hide timer"); // verify that the timer is still running by waiting a bit longer: wait(0.6*mainView.__propagated.toolbar.hideTimeout); compare(mainView.__propagated.toolbar.opened, false, "Interacting with the toolbar contents does not stop the timer") } function test_locked() { compare(mainView.__propagated.toolbar.tools.locked, false, "Toolbar initially not locked"); mainView.__propagated.toolbar.locked = true; compare(mainView.__propagated.toolbar.locked, true, "Toolbar can be locked"); mainView.__propagated.toolbar.locked = false; compare(mainView.__propagated.toolbar.locked, false, "Toolbar can be unlocked"); page.tools.locked = true; compare(mainView.__propagated.toolbar.locked, true, "Toolbar can be locked by setting page.tools.locked"); page.tools.locked = false; compare(mainView.__propagated.toolbar.locked, false, "Toolbar can be unlocked by setting page.tools.locked to false"); } function test_bug1192673() { toolbarItems.opened = false; mainView.__propagated.toolbar.open(); compare(toolbarItems.opened, true, "opening the toolbar updates toolbarItems.opened"); toolbarItems.opened = false; compare(mainView.__propagated.toolbar.opened, false, "setting toolbarActions.opened to false closes the toolbar"); } function test_dont_hide_locked_toolbar_bug1248759() { page.tools = lockedTools; compare(mainView.__propagated.toolbar.tools.locked, true, "Setting locked tools locks the toolbar"); wait(mainView.__propagated.toolbar.hideTimeout + 500); compare(mainView.__propagated.toolbar.opened, true, "Don't auto-hide locked toolbar after timeout"); // revert original tools for other tests: page.tools = toolbarItems; } } } ./tests/unit_x11/tst_components/tst_listitem_actions_breaks_selectmode.qml0000644000015600001650000001112012700370701027470 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 import QtTest 1.0 import Ubuntu.Test 1.0 MainView { id: main width: units.gu(40) height: units.gu(71) ListModel { id: testModel ListElement { text: "a" } ListElement { text: "b" } ListElement { text: "c" } ListElement { text: "d" } ListElement { text: "e" } } ListItemActions { id: itemActions actions: [ Action { iconName: "edit" } ] } ListView { id: testView anchors { left: parent.left right: parent.right } height: main.height / 2 clip: true model: testModel delegate: ListItem { objectName: "listItem" + index trailingActions: itemActions onPressAndHold: selectMode = !selectMode Label { anchors.centerIn: parent text: model.text } } } ListView { id: testView2 anchors { top: testView.bottom left: parent.left right: parent.right } height: main.height / 2 clip: true model: testModel delegate: ListItem { objectName: "listItem" + index leadingActions: itemActions onPressAndHold: selectMode = !selectMode Label { anchors.centerIn: parent text: model.text } } } UbuntuTestCase { when: windowShown // delayed swipe, gives few millisecond timeout between each move // so Repeater has time to create the panel actions in style function swipe(item, x, y, dx, dy) { flick(item, x, y, dx, dy, 0, 0, undefined, undefined, 100); } function cleanup() { testView.ViewItems.selectMode = false; testView2.ViewItems.selectMode = false; wait(400); } function test_long_press_after_swipe_breaks_selectmode_bug1468100_data() { return [ {tag: "leading", view: testView, dx: units.gu(10)}, {tag: "trailing", view: testView2, dx: -units.gu(10)}, ] } function test_long_press_after_swipe_breaks_selectmode_bug1468100(data) { var listItem = findChild(data.view, "listItem2"); verify(listItem); swipe(listItem, centerOf(listItem).x, centerOf(listItem).y, data.dx, 0); wait(200); // press and hold to activate select mode mouseLongPress(listItem, centerOf(listItem).x, centerOf(listItem).y); mouseRelease(listItem, centerOf(listItem).x, centerOf(listItem).y); wait(200); compare(listItem.selectMode, true, "selectMode not turned on"); } function test_long_press_on_other_after_swipe_breaks_selectmode_bug1468100_data() { return [ {tag: "leading", view: testView, dx: units.gu(10)}, {tag: "trailing", view: testView2, dx: -units.gu(10)}, ] } function test_long_press_on_other_after_swipe_breaks_selectmode_bug1468100(data) { var listItem = findChild(data.view, "listItem2"); verify(listItem); var otherListItem = findChild(data.view, "listItem0"); verify(otherListItem); swipe(listItem, centerOf(listItem).x, centerOf(listItem).y, data.dx, 0); wait(200); // long press on otherListItem mouseLongPress(otherListItem, centerOf(otherListItem).x, centerOf(otherListItem).y); mouseRelease(otherListItem, centerOf(otherListItem).x, centerOf(otherListItem).y); wait(200); compare(listItem.selectMode, true, "selectMode not turned on on swiped"); } } } ./tests/unit_x11/tst_components/tst_textinput_common.qml0000644000015600001650000004603112700370701024010 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.2 import Ubuntu.Components.Popups 1.0 Item { id: testMain width: units.gu(40) height: units.gu(50) Component { id: popoverComponent Popover { property var textField: textFieldInPopover Rectangle { anchors.fill: parent color: UbuntuColors.orange } Column { anchors.margins: units.gu(2) Label { text: 'This is a text field in a popover' } TextField { id: textFieldInPopover } Label { text: 'Focus the text field' } } } } Component { id: dialogComponent Dialog { id: dialog property var textField: textFieldInDialog Label { text: 'This is a text field in a dialog' height: units.gu(10) } TextField { id: textFieldInDialog height: units.gu(10) } Label { text: 'Focus the text field' height: units.gu(10) } Button { text: 'Close' onClicked: PopupUtils.close(dialog) } } } Column { spacing: units.gu(1) anchors { topMargin: units.gu(4) top: parent.top } Button { id: popoverButton text: 'Open Popover' onClicked: PopupUtils.open(popoverComponent, popoverButton) } Button { text: 'Open Popover with no target' onClicked: PopupUtils.open(popoverComponent) } Button { id: dialogButton text: 'Open Dialog' onClicked: PopupUtils.open(dialogComponent, dialogButton) } TextField { id: textField } TextArea { id: textArea } TextField { id: password echoMode: TextInput.Password text: 'deadbeef' } } MockKeyboard { Component.onCompleted: UbuntuApplication.inputMethod = this } SignalSpy { id: cursorPositionSpy signalName: "onCursorPositionChanged" } SignalSpy { id: selectionStartSpy signalName: "onSelectionStartChanged" } SignalSpy { id: selectionEndSpy signalName: "onSelectionEndChanged" } SignalSpy { id: selectedTextSpy signalName: "onSelectedTextChanged" } SignalSpy { id: popupSpy signalName: "pressAndHold" } SignalSpy { id: movementXSpy signalName: "onContentXChanged" } SignalSpy { id: movementYSpy signalName: "contentYChanged" } SignalSpy { id: scrollerSpy signalName: "movementEnded" } UbuntuTestCase { name: "TextInputCommonTest" when: windowShown function init() { textField.text = "This is a single line text input called TextField."; textArea.text = "This is a multiline text input component called TextArea. It supports fix size as well as auto-expanding behavior. The content is scrollable only if it exceeds the visible area."; textField.cursorPosition = 0; textArea.cursorPosition = 0; waitForRendering(textField, 500); waitForRendering(textArea, 500); } function cleanup() { textField.focus = false; textArea.focus = false; cursorPositionSpy.clear(); selectionStartSpy.clear(); selectionEndSpy.clear(); selectedTextSpy.clear(); popupSpy.clear(); movementXSpy.clear(); movementYSpy.clear(); cursorRectSpy.clear(); scrollerSpy.clear(); } function test_context_menu_items_data() { return [ { tag: 'textField with text', input: textField, text: "lalelu", all: true, copy: false }, { tag: 'textField selected', input: textField, text: "lalelu", select: true, all: false, copy: true }, { tag: 'textArea with text', input: textArea, text: "lalelu", all: true, copy: false }, { tag: 'textArea selected', input: textArea, text: "lalelu", select: true, all: false, copy: true }, { tag: 'textField with password', input: password, text: "deadbeef", all: true, copy: false }, ] } function test_context_menu_items(data) { var handler = findChild(data.input, "input_handler"); popupSpy.target = handler; data.input.focus = true; var x = data.input.width / 2; var y = data.input.height / 2; mouseClick(data.input, x, y, Qt.RightButton); popupSpy.wait(); var popover = findChild(testMain, "text_input_contextmenu"); verify(popover, "Cannot retrieve default TextInputPopover"); waitForRendering(popover); if (data.select) { var selectAll = findChildWithProperty(popover, "text", "Select All"); verify(selectAll, "Select All item not found"); mouseClick(selectAll, selectAll.width / 2, selectAll.height / 2); waitForRendering(data.input, 1000); compare(data.input.text, data.input.selectedText, "Not all the text is selected"); } var all = findChildWithProperty(popover, "text", "Select All"); compare(all.visible, data.all, "Select All%1expected".arg(data.all ? " " : " not ")) var copy = findChildWithProperty(popover, "text", "Copy"); compare(copy.visible, data.copy, "Copy%1expected".arg(data.copy ? " " : " not ")) } function test_clear_text_using_popover_data() { return [ {input: textField}, {input: textArea}, ]; } function test_clear_text_using_popover(data) { var handler = findChild(data.input, "input_handler"); popupSpy.target = handler; data.input.focus = true; // invoke popover var x = data.input.width / 2; var y = data.input.height / 2; mouseClick(data.input, x, y, Qt.RightButton); popupSpy.wait(); var popover = findChild(testMain, "text_input_contextmenu"); verify(popover, "Cannot retrieve default TextInputPopover"); waitForRendering(popover); // select all var selectAll = findChildWithProperty(popover, "text", "Select All"); verify(selectAll, "Select All item not found"); mouseClick(selectAll, selectAll.width / 2, selectAll.height / 2); waitForRendering(data.input, 1000); compare(data.input.text, data.input.selectedText, "Not all the text is selected"); // delete with key press keyClick(Qt.Key_Backspace); waitForRendering(data.input, 1000); compare(data.input.text, "", "The text has not been deleted"); // dismiss popover mouseClick(testMain, testMain.width / 2, testMain.height / 2); wait(200); } SignalSpy { id: cursorRectSpy signalName: "cursorRectangleChanged" } function test_input_pageup_pagedown_data() { return [ {tag: "PageUp in TextField", input: textField, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.NoModifier, xfail: false}, {tag: "PageDown in TextField", input: textField, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.NoModifier, xfail: false}, {tag: "PageUp in TextArea", input: textArea, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.NoModifier, xfail: false}, {tag: "PageDown in TextArea", input: textArea, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.NoModifier, xfail: false}, {tag: "Ctrl+PageUp in TextField", input: textField, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.ControlModifier, xfail: true}, {tag: "Ctrl+PageDown in TextField", input: textField, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.ControlModifier, xfail: true}, {tag: "Ctrl+PageUp in TextArea", input: textArea, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.ControlModifier, xfail: true}, {tag: "Ctrl+PageDown in TextArea", input: textArea, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.ControlModifier, xfail: true}, {tag: "Shift+PageUp in TextField", input: textField, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.ShiftModifier, xfail: true}, {tag: "Shift+PageDown in TextField", input: textField, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.ShiftModifier, xfail: true}, {tag: "Shift+PageUp in TextArea", input: textArea, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.ShiftModifier, xfail: true}, {tag: "Shift+PageDown in TextArea", input: textArea, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.ShiftModifier, xfail: true}, {tag: "Alt+PageUp in TextField", input: textField, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.AltModifier, xfail: true}, {tag: "Alt+PageDown in TextField", input: textField, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.AltModifier, xfail: true}, {tag: "Alt+PageUp in TextArea", input: textArea, moveToEnd: true, key: Qt.Key_PageUp, modifier: Qt.AltModifier, xfail: true}, {tag: "Alt+PageDown in TextArea", input: textArea, moveToEnd: false, key: Qt.Key_PageDown, modifier: Qt.AltModifier, xfail: true}, ]; } function test_input_pageup_pagedown(data) { var handler = findChild(data.input, "input_handler"); data.input.focus = true; // move the cursor to the end if (data.moveToEnd) { keyClick(Qt.Key_End); waitForRendering(data.input, 500); verify(data.input.cursorPosition > 0, "The cursor wasn't moved"); } cursorRectSpy.target = data.input; keyClick(data.key, data.modifier); waitForRendering(data.input, 500); if (data.xfail) { expectFailContinue(data.tag, "With modifier"); } cursorRectSpy.wait(500); cursorRectSpy.target = null; } function test_scroll_when_not_focused_data() { return [ // dx and dy are in eights of a degree; see QWheelEvent::angleDelta() for more details. {tag: "TextField", input: textField, x: textField.width / 2, y: textField.height / 2, dx: -240, dy: 0}, {tag: "TextArea", input: textArea, x: textField.width / 2, y: textField.height / 2, dx: 0, dy: -240}, ]; } function test_scroll_when_not_focused(data) { var scroller = findChild(data.input, "input_scroller"); scrollerSpy.target = scroller; mouseWheel(data.input, data.x, data.y, data.dx, data.dy); expectFailContinue(data.tag, "Content must not scroll while inactive"); scrollerSpy.wait(500); } function test_scroll_when_focused_data() { return [ // dx and dy are in eights of a degree; see QWheelEvent::angleDelta() for more details. {tag: "TextField", input: textField, x: textField.width / 2, y: textField.height / 2, dx: -480, dy: 0}, {tag: "TextArea", input: textArea, x: textArea.width / 2, y: textArea.height / 2, dx: 0, dy: -480}, ]; } function test_scroll_when_focused(data) { var scroller = findChild(data.input, "input_scroller"); scrollerSpy.target = scroller; // focus component data.input.focus = true; mouseWheel(data.input, data.x, data.y, data.dx, data.dy); waitForRendering(data.input); scrollerSpy.wait(); } function test_rightclick_opens_popover_data() { return [ {tag: "TextField active", input: textField, whenFocused: true}, {tag: "TextArea active" , input: textArea, whenFocused: true}, {tag: "TextField inactive", input: textField, whenFocused: false}, {tag: "TextArea inactive" , input: textArea, whenFocused: false}, ]; } function test_rightclick_opens_popover(data) { var handler = findChild(data.input, "input_handler"); popupSpy.target = handler; if (data.whenFocused) { data.input.focus = true; waitForRendering(data.input); } mouseClick(data.input, data.input.width / 2, data.input.height / 2, Qt.RightButton); waitForRendering(data.input); popupSpy.wait(); verify(data.input.cursorPosition !== 0, "Cursor should be moved to the mouse click position.") // dismiss popover mouseClick(testMain, 0, 0); // add some timeout to get the event buffer cleaned wait(500); } function test_clear_selection_on_click_data() { return [ {tag: "TextField click on selection", input: textField, selectChars: 10, clickPos: Qt.point(10, textField.height / 2)}, {tag: "TextArea click on selection", input: textArea, selectChars: 40, clickPos: Qt.point(20, 20)}, {tag: "TextField click beside selection", input: textField, selectChars: 5, clickPos: Qt.point(textField.width / 2, textField.height / 2)}, {tag: "TextArea click beside selection", input: textArea, selectChars: 1, clickPos: Qt.point(textArea.width / 2, textArea.height / 2)}, ]; } function test_clear_selection_on_click(data) { data.input.focus = true; data.input.select(0, data.selectChars); verify(data.input.selectedText !== "", "No text selected!"); mouseClick(data.input, data.clickPos.x, data.clickPos.y); verify(data.input.selectedText === "", "There is still text selected!"); } function test_select_text_by_mouse_drag_data() { return [ {tag: "TextField", input: textField}, {tag: "TextArea", input: textArea}, ]; } function test_select_text_by_mouse_drag(data) { data.input.focus = true; flick(data.input, 0, 0, data.input.width / 2, data.input.height / 2); waitForRendering(data.input); verify(data.input.selectedText !== "", "There's no text selected!"); } function test_no_caret_when_no_touchscreen_data() { return [ {tag: "TextField", input: textField}, {tag: "TextArea", input: textArea}, ]; } function test_no_caret_when_no_touchscreen(data) { if (TestExtras.touchDevicePresent()) { skip("This test cannot be executed in touch environment"); } data.input.focus = true; waitForRendering(data.input); var cursor = findChild(data.input, "textCursor"); verify(cursor, "Cursor not accessible, FAIL"); verify(cursor.caret, "No caret is set"); compare(cursor.caret.visible, false, "Caret must not be visible!"); } function test_select_text_with_double_click_data() { return [ {tag: "TextField", input: textField}, {tag: "TextArea", input: textArea}, ]; } function test_select_text_with_double_click(data) { data.input.focus = true; waitForRendering(data.input, 500); mouseDoubleClick(data.input, units.gu(1), units.gu(1)); waitForRendering(data.input, 500); expectFail(data.tag, "mouseDoubleClick() fails to trigger") verify(data.input.selectedText != "", "No text selected."); } function test_osk_displaces_popover_data() { return [ { tag: 'popover', component: popoverComponent, target: popoverButton, offScreen: false }, { tag: 'popover', component: popoverComponent, target: null, offScreen: false }, { tag: 'dialog', component: dialogComponent, target: dialogButton, offScreen: true }, ] } function test_osk_displaces_popover(data) { var popover = PopupUtils.open(data.component, data.target); waitForRendering(popover); popover.textField.forceActiveFocus(); waitForRendering(popover.textField); // Only get the value here so in case of failure the popover won't get stuck var popoverY = popover.y; // dismiss popover PopupUtils.close(popover); // add some timeout to get the event buffer cleaned wait(500); if (data.offScreen) verify(popoverY < 0, 'Dialog did not shift upwards: %1'.arg(popoverY)); else verify(popoverY >= 0, 'Popover went off-screen: %1'.arg(popoverY)); } function test_osk_shrinks_dialog() { var popover = PopupUtils.open(dialogComponent, dialogButton); waitForRendering(popover); // Original height before showing OSK var originalHeight = popover.height; // Subtract OSK var expectedHeight = originalHeight - UbuntuApplication.inputMethod.keyboardRectangle.height; popover.textField.forceActiveFocus(); waitForRendering(popover.textField); // Only get the value here so in case of failure the popover won't get stuck var foreground = findChild(popover, "dialogForeground") var availableHeight = foreground.height; // dismiss popover PopupUtils.close(popover); // add some timeout to get the event buffer cleaned wait(500); verify(availableHeight <= expectedHeight, 'Dialog did not shrink (%1 > %2)'.arg(availableHeight).arg(expectedHeight)); } } } ./tests/unit_x11/tst_components/ListItemTestCase.qml0000644000015600001650000001205212700370701022664 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.2 /* * Common test case functions for ListItem. A CPO for unit tests. */ UbuntuTestCase { when: windowShown SignalSpy { id: signalSpy } // set up the spy component for an item and a signal function setupSpy(item, signalName) { if (item.hasOwnProperty("leadingActions")) { signalSpy.target = item; signalSpy.signalName = signalName; signalSpy.clear(); } } // wait on the previosuly set up spy function spyWait(timeout) { if (timeout == undefined) { timeout = 500; } if (signalSpy.target) { signalSpy.wait(timeout); signalSpy.clear(); signalSpy.target = null; } else { wait(timeout); } } // rebounds a ListItem function rebound(item, watchTarget) { if (watchTarget === undefined) { watchTarget = item; } if (watchTarget.contentItem.x != watchTarget.contentItem.anchors.leftMargin) { mouseClick(item, 1, 1); tryCompareFunction(function() { return watchTarget.contentItem.x == watchTarget.contentItem.anchors.leftMargin; }, true, 500); } } // delayed swipe, gives few millisecond timeout between each move // so Repeater has time to create the panel actions in style function swipe(item, x, y, dx, dy) { setupSpy(item, "contentMovementEnded"); flick(item, x, y, dx, dy, 0, 0, undefined, undefined, 100); spyWait(); } function swipeNoWait(item, x, y, dx, dy) { flick(item, x, y, dx, dy, 0, 0, undefined, undefined, 100); } function tug(item, x, y, dx, dy) { setupSpy(item, "contentMovementEnded"); TestExtras.touchDrag(0, item, Qt.point(x, y), Qt.point(dx, dy)); spyWait(); } function tugNoWait(item, x, y, dx, dy) { TestExtras.touchDrag(0, item, Qt.point(x, y), Qt.point(dx, dy)); } // returns the leading or trailing panel item function panelItem(item, leading) { return findInvisibleChild(item, (leading ? "ListItemPanelLeading" : "ListItemPanelTrailing")); } function toggleSelectMode(view, enabled, scrollToTop) { if (view.hasOwnProperty("positionViewAtBeginning") && scrollToTop) { // use the topmost listItem to wait for rendering completion view.positionViewAtBeginning(); } var listItem = findChild(view, "listItem0"); verify(listItem); view.ViewItems.selectMode = enabled; // waitForRendering aint seems to be reliable here, so we wait ~400 msecs wait(400); } function toggleDragMode(view, enabled) { // use the topmost listItem to wait for rendering completion view.positionViewAtBeginning(); var listItem = findChild(view, "listItem0"); verify(listItem); view.ViewItems.dragMode = enabled; // waitForRendering aint seems to be reliable here, so we wait ~400 msecs wait(400); } function drag(view, from, to) { var dragArea = findChild(view, "drag_area"); verify(dragArea, "Cannot locate drag area"); // grab the source item view.positionViewAtBeginning(from,ListView.Beginning); var panel = findChild(view, "drag_panel" + from); verify(panel, "Cannot locate source panel"); var dragPos = dragArea.mapFromItem(panel, centerOf(panel).x, centerOf(panel).y); // move the mouse var dy = Math.abs(to - from) * panel.height + units.gu(1); dy *= (to > from) ? 1 : -1; mousePress(dragArea, dragPos.x, dragPos.y); wait(100); var draggedItem = findChild(view.contentItem, "DraggedListItem"); if (draggedItem) { setupSpy(draggedItem.__styleInstance.dropAnimation, "stopped"); } // use 10 steps to be sure the move is properly detected by the drag area mouseMoveSlowly(dragArea, dragPos.x, dragPos.y, 0, dy, 10, 100); // drop it, needs two mouse releases, this generates the Drop event also mouseRelease(dragArea, dragPos.x, dragPos.y + dy); // needs one more mouse release mouseRelease(dragArea, dragPos.x, dragPos.y + dy); spyWait(); } function expand(item, expand) { item.expansion.expanded = expand; wait(400); } } ./tests/unit_x11/tst_components/tst_page11.qml0000644000015600001650000001435112700370701021452 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 Item { width: 200 height: 200 Action { id: action0 } Flickable { id: testFlickable } MainView { anchors.fill: parent id: mainView Page { id: page Flickable { id: pageFlickable anchors.fill: parent contentHeight: column.height Column { id: column Repeater { model: 100 Label { text: "line "+index } } } } } } TestCase { name: "Page11API" when: windowShown function initTestCase() { compare(page.title, "", "is not set by default") compare(page.__propagated, mainView.__propagated, "page propagated equals mainView propagated") compare(page.__propagated.header, mainView.__propagated.header, "page header equals mainView header") compare(page.__propagated.header.title, page.title, "header title is same as page title") compare(page.__propagated.header.visible, false, "header is not visible initially because there is no title") compare(page.actions.length, 0, "page actions list empty by default") } function test_0_noHeader_bug1162028_bug1161910() { compare(mainView.__propagated.header.title, "", "no header title by default") compare(mainView.__propagated.header.visible, false, "header is hidden when title is not set") compare(page.height, mainView.height, "page uses full height when there is no header") } function test_title() { var newTitle = "Hello World!" page.title = newTitle compare(page.title, newTitle, "can set/get") page.title = "" compare(page.title, "", "can unset") } function test_header() { var newTitle = "Hello header!" page.title = newTitle compare(mainView.__propagated.header.title, newTitle, "header title updated by changing page title") compare(mainView.__propagated.header.visible, true, "header is visible when title is set") compare(mainView.__propagated.header.height > 0, true, "header has a height when title is set") page.title = "" compare(mainView.__propagated.header.title, "", "header title unset by unsetting page title") compare(mainView.__propagated.header.visible, false, "header is hidden when title is unset") } function test_tools() { compare(mainView.__propagated.toolbar.tools, page.tools, "Page updates toolbar tools"); } function test_active() { compare(page.active, true, "Page is active by default"); } function test_pageStack() { compare(page.pageStack, null, "is not set by default") } function test_actions() { // FIXME: Check the contents of page.actions. This is currently not // possible because ActionContext.actions does not support it, // so changes to ActionContext are needed. page.actions = [action0]; compare(page.actions.length, 1, "Actions can be added to page actions"); page.actions = []; compare(page.actions.length, 0, "Page action list can be cleared"); } function test_flickable_bug1200642_bug1192591() { compare(page.flickable, pageFlickable, "page flickable is correctly detected"); compare(page.__propagated.header.flickable, pageFlickable, "header flickable is correctly detected"); // bug 1200642 FAIL page.flickable = testFlickable; compare(page.flickable, testFlickable, "flickable can be set"); compare(page.__propagated.header.flickable, testFlickable, "updating page flickable updates header flickable"); page.flickable = null; compare(page.flickable, null, "flickable can be unset"); compare(page.__propagated.header.flickable, null, "unsetting page flickable unsets header flickable"); } function test_flickableY_bug1201452() { var pageTitle = "Hello bug!"; page.title = pageTitle; var header = page.__propagated.header; compare(header.visible, true, "header is visible when title is set") compare(header.height > 0, true, "header has a height when title is set") var headerHeight = header.height var flickableY = 150; page.flickable.contentY = flickableY; compare(page.flickable.contentY, flickableY, "flickable.contentY can be set"); compare(page.flickable.topMargin, headerHeight, "topMargin of the flickable equals header height"); page.title = ""; compare(header.visible, false, "header is hidden when title is unset") compare(page.flickable.topMargin, 0, "topMargin becomes 0 because header is hidden"); // used to be headerHeight compare(page.flickable.contentY, flickableY + headerHeight, "contentY is updated when header is made invisible to compensate for the change in topMargin"); page.title = pageTitle; compare(page.flickable.contentY, flickableY, "Making header visible again does not reset flickable.contentY"); compare(page.flickable.topMargin, headerHeight, "topMargin is updated when header becomes visible.") } } } ./tests/unit_x11/tst_components/tst_quickutils.qml0000644000015600001650000000362212700370714022574 0ustar jenkinsjenkins/* * Copyright 2012-2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Components 1.3 Item { id: root width: units.gu(40) height: units.gu(40) Column { id: focusGroup Item { objectName: "unfocusableFirst" } Repeater { model: 5 Item { objectName: index == 0 ? "first" : (index == 4 ? "last" : "item" + index) activeFocusOnTab: true } } Item { objectName: "unfocusableLast" } } TestCase { id: test name: "QuickUtilsAPI" when: windowShown function test_rootItem() { compare(QuickUtils.rootItem(test) != 0, true, "Root item is not null"); } function test_className() { compare(QuickUtils.className(test), "TestCase", "className for TestCase"); compare(QuickUtils.className(root), "QQuickItem", "className for Item"); } function test_firstFocusableChild() { compare(QuickUtils.firstFocusableChild(focusGroup).objectName, "first"); } function test_lastFocusableChild() { compare(QuickUtils.lastFocusableChild(focusGroup).objectName, "last"); } } } ./tests/unit_x11/tst_components/tst_tabs_empty.qml0000644000015600001650000000244412700370701022543 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.1 import Ubuntu.Test 1.0 MainView { width: units.gu(50) height: units.gu(100) useDeprecatedToolbar: false Tabs { id: empty } UbuntuTestCase { name: "EmptyTabsNewHeader" when: windowShown function test_emptyTabs() { compare(empty.selectedTabIndex, -1, "The default value for selectedTabIndex is -1 when there are no tabs"); compare(empty.selectedTab, null, "The default selected tab is null when there are no tabs"); compare(empty.currentPage, null, "The default currentPage is null when there are no tabs"); } } } ./tests/unit_x11/tst_components/tst_listitem.qml0000644000015600001650000015142512700370701022232 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.2 import Ubuntu.Components.Styles 1.2 import QtQml.Models 2.1 Item { id: main width: units.gu(50) height: units.gu(100) Action { id: stockAction iconName: "torch-on" objectName: "stockAction" text: 'Switch lights on' } ListItemActions { id: leading actions: [ Action { iconName: "starred" text: 'Bookmark' objectName: "leading_1" }, Action { iconName: "edit" text: 'Edit' objectName: "leading_2" onTriggered: text = 'Edit Again' }, Action { iconName: "camcorder" text: 'Record' objectName: "leading_3" } ] } ListItemActions { id: trailing actions: [ stockAction, ] } ListItemActions { id: actionsDefault } ListModel { id: objectModel function reset() { clear(); for (var i = 0; i < 25; i++) { append({data: i}); } } Component.onCompleted: reset() } Component { id: customDelegate Rectangle { width: units.gu(10) color: "green" objectName: "custom_delegate" } } Column { id: testColumn width: parent.width ListItem { id: defaults width: parent.width } ListItem { id: highlightTest } ListItem { id: clickedConnected onClicked: {} onPressAndHold: {} } ListItem { id: testItem width: parent.width color: "blue" leadingActions: leading trailingActions: trailing Label { id: bodyItem anchors.fill: parent text: "Data" } } ListItem { id: controlItem Button { id: button objectName: "button_in_list" anchors.centerIn: parent text: "Button" } } ListView { id: listView width: parent.width height: units.gu(28) clip: true model: objectModel ViewItems.selectMode: false LayoutMirroring.childrenInherit: true delegate: ListItem { objectName: "listItem" + index color: "lightgray" leadingActions: leading trailingActions: trailing Label { text: "Data: " + modelData + " @" + index } } } Flickable { id: testFlickable width: parent.width height: units.gu(21) ListView { id: nestedListView width: parent.width height: units.gu(28) clip: true model: 10 delegate: ListItem { objectName: "listItem" + index leadingActions: leading } } } Flickable { id: flickable width: parent.width height: units.gu(14) clip: true contentHeight: column.height Column { id: column width: parent.width Repeater { model: 10 ListItem { objectName: "listItem" + index color: "lightgreen" } } } } } ListItemTestCase { id: testCase name: "ListItemAPI" when: windowShown SignalSpy { id: movingSpy signalName: "contentMovementEnded" } SignalSpy { id: highlightedSpy signalName: "highlightedChanged" target: testItem } SignalSpy { id: clickSpy signalName: "clicked" target: testItem; } SignalSpy { id: actionSpy signalName: "onTriggered" } SignalSpy { id: flickableSpy signalName: "movementStarted" } SignalSpy { id: dropSpy signalName: "stopped" } function initTestCase() { TestExtras.registerTouchDevice(); waitForRendering(main); } function cleanup() { listView.model = objectModel; testItem.action = null; testItem.contentItem.anchors.margins = 0; testItem.selected = false; testColumn.ViewItems.selectMode = false; waitForRendering(testItem.contentItem, 200); controlItem.selected = false; waitForRendering(controlItem.contentItem, 200); movingSpy.clear(); highlightedSpy.clear(); clickSpy.clear(); actionSpy.clear(); pressAndHoldSpy.clear(); buttonSpy.clear(); flickableSpy.clear(); listView.interactive = true; listView.ViewItems.selectMode = false; listView.ViewItems.dragMode = false; // make sure we collapse mouseClick(defaults, 0, 0) movingSpy.target = null; movingSpy.clear(); flickableSpy.target = null; flickableSpy.clear(); trailing.delegate = null; listView.positionViewAtBeginning(); // keep additional timeout for proper cleanup wait(200); } function test_0_defaults() { verify(defaults.contentItem !== null, "Defaults is null"); compare(defaults.color, "#000000", "Transparent by default"); compare(defaults.highlightColor, theme.palette.selected.background, "theme.palette.selected.background color by default") compare(defaults.highlighted, false, "Not highlighted by default"); compare(defaults.divider.visible, true, "divider is visible by default"); compare(defaults.divider.anchors.leftMargin, 0, "divider's left margin is 0"); compare(defaults.divider.anchors.rightMargin, 0, "divider's right margin is 0"); var mappedDividerPos = defaults.mapFromItem(defaults.divider, defaults.divider.x, defaults.divider.y); compare(mappedDividerPos.x, 0, "divider's left anchor is wrong"); compare(mappedDividerPos.x + defaults.divider.width, defaults.width, "divider's right anchor is wrong"); compare(defaults.divider.height, units.dp(1), "divider's thickness is wrong"); compare(defaults.divider.colorFrom, theme.palette.normal.base, "colorFrom differs."); compare(defaults.divider.colorTo, theme.palette.normal.base, "colorTo differs."); compare(defaults.action, null, "No action by default."); compare(defaults.style, null, "Style is loaded upon first use."); compare(defaults.__styleInstance, null, "__styleInstance must be null."); compare(defaults.selected, false, "Not selected by default"); compare(defaults.selectMode, false, "Not selectable by default"); compare(testColumn.ViewItems.selectMode, false, "The parent attached property is not selectable by default"); compare(testColumn.ViewItems.selectedIndices.length, 0, "No item is selected by default"); compare(listView.ViewItems.dragMode, false, "Drag mode is off on ListView"); compare(actionsDefault.delegate, null, "ListItemActions has no delegate set by default."); compare(actionsDefault.actions.length, 0, "ListItemActions has no actions set."); } Component { id: customStyle; ListItemStyle {} } function test_children_in_content_item() { compare(bodyItem.parent, testItem.contentItem, "Content is not in the right holder!"); } function test_highlightedChanged_on_click() { highlightedSpy.target = testItem; mousePress(testItem, testItem.width / 2, testItem.height / 2); highlightedSpy.wait(); mouseRelease(testItem, testItem.width / 2, testItem.height / 2); } function test_highlightedChanged_on_tap() { highlightedSpy.target = testItem; TestExtras.touchPress(0, testItem, centerOf(testItem)); highlightedSpy.wait(); TestExtras.touchRelease(0, testItem, centerOf(testItem)); // local cleanup, wait few msecs to suppress double tap wait(400); } function test_clicked_on_mouse() { clickSpy.target = testItem; mouseClick(testItem, testItem.width / 2, testItem.height / 2); clickSpy.wait(); } function test_clicked_on_tap() { clickSpy.target = testItem; TestExtras.touchClick(0, testItem, centerOf(testItem)); clickSpy.wait(); } function test_no_click_when_swiped() { var item = findChild(listView, "listItem0"); clickSpy.target = item; clickSpy.clear(); swipe(item, centerOf(item).x, centerOf(item).y, units.gu(20), 0); // click over the contentItem movingSpy.target = item; mouseClick(item.contentItem, 1, 1); compare(clickSpy.count, 0, "No click() should be emitted on a swiped in ListItem."); movingSpy.wait(); } function test_no_pressAndHold_when_swiped() { var item = findChild(listView, "listItem0"); pressAndHoldSpy.target = item; pressAndHoldSpy.clear(); swipe(item, centerOf(item).x, centerOf(item).y, units.gu(20), 0); // press and hold movingSpy.target = item; mouseLongPress(item.contentItem, 1, 1); mouseRelease(item.contentItem, 1, 1); mouseRelease(item.contentItem, 1, 1); compare(pressAndHoldSpy.count, 0, "No pressAndHold() should be emitted on a swiped in ListItem."); movingSpy.wait(); } function test_vertical_listview_move_cancels_highlight_data() { return [ {tag: "With touch", mouse: false}, {tag: "With mouse", mouse: true}, ]; } function test_vertical_listview_move_cancels_highlight(data) { var listItem = findChild(listView, "listItem0"); verify(listItem, "Cannot find listItem0"); // convert positions and use the listView to move var pos = listView.mapFromItem(listItem, listItem.width / 2, 0); if (data.mouse) { // provide slow move mousePress(listView, pos.x, pos.y); for (var i = 1; i < 4; i++) { pos.y += i * units.gu(0.5); mouseMove(listView, pos.x, pos.y, 100); } compare(listItem.highlighted, false, "highlighted still!"); mouseRelease(listView, pos.x, pos.y, undefined, undefined, 100); } else { // convert pos to point otherwise touch functions will get (0,0) points!!! var pt = Qt.point(pos.x, pos.y); TestExtras.touchPress(0, listView, pt); for (i = 1; i < 4; i++) { pt.y += i * units.gu(0.5); TestExtras.touchMove(0, listView, pt); wait(100); } compare(listItem.highlighted, false, "highlighted still!"); TestExtras.touchRelease(0, listView, pt); } } function test_background_height_change_on_divider_visible() { // make sure the testItem's divider is shown testItem.divider.visible = true; var margins = testItem.contentItem.anchors.topMargin + testItem.contentItem.anchors.bottomMargin; compare(testItem.contentItem.height, testItem.height - margins - testItem.divider.height, "ListItem's background height must be less than the item itself."); testItem.divider.visible = false; waitForRendering(testItem.contentItem); compare(testItem.contentItem.height, testItem.height - margins, "ListItem's background height must be the same as the item itself."); testItem.divider.visible = true; } function test_tug_actions_data() { var item = findChild(listView, "listItem0"); return [ {tag: "Trailing, mouse", item: item, pos: centerOf(item), dx: -units.gu(20), positiveDirection: false, mouse: true}, {tag: "Leading, mouse", item: item, pos: centerOf(item), dx: units.gu(20), positiveDirection: true, mouse: true}, {tag: "Trailing, touch", item: item, pos: centerOf(item), dx: -units.gu(20), positiveDirection: false, mouse: false}, {tag: "Leading, touch", item: item, pos: centerOf(item), dx: units.gu(20), positiveDirection: true, mouse: false}, ]; } function test_tug_actions(data) { listView.positionViewAtBeginning(); if (data.mouse) { swipe(data.item, data.pos.x, data.pos.y, data.dx, 0); } else { tug(data.item, data.pos.x, data.pos.y, data.dx, 0); } if (data.positiveDirection) { verify(data.item.contentItem.x > 0, data.tag + " actions did not show up"); } else { verify(data.item.contentItem.x < 0, data.tag + " actions did not show up"); } // dismiss rebound(data.item); } function test_tug_ignored_on_right_button() { listView.positionViewAtBeginning(); var item = findChild(listView, "listItem0"); movingSpy.target = item; flick(item, centerOf(item).x, centerOf(item).y, units.gu(20), 0, 0, 0, Qt.RightButton, undefined, 100); compare(movingSpy.count, 0, "Action panel should not budge!") } function test_rebound_when_pressed_outside_or_clicked_data() { var item0 = findChild(listView, "listItem0"); var item1 = findChild(listView, "listItem1"); return [ {tag: "Click on an other Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item1, mouse: true}, {tag: "Click on the same Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item0, mouse: true}, {tag: "Tap on an other Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item1, mouse: false}, {tag: "Tap on the same Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item0, mouse: false}, ]; } function test_rebound_when_pressed_outside_or_clicked(data) { listView.positionViewAtBeginning(); if (data.mouse) { swipe(data.item, data.pos.x, data.pos.y, data.dx, 0); } else { tug(data.item, data.pos.x, data.pos.y, data.dx, 0); } verify(data.item.contentItem.x != 0, "The component wasn't tugged!"); // dismiss rebound(data.clickOn, data.item) } // the function tests whether the Flickable/ListView moves when the ListItem is swiped function test_listview_not_interactive_while_tugged_data() { var item0 = findChild(listView, "listItem0"); var item1 = findChild(listView, "listItem1"); return [ {tag: "Trailing", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item1, mouse: true}, {tag: "Leading", item: item0, pos: centerOf(item0), dx: units.gu(20), clickOn: item0.contentItem, mouse: true}, {tag: "Trailing", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item1, mouse: false}, {tag: "Leading", item: item0, pos: centerOf(item0), dx: units.gu(20), clickOn: item0.contentItem, mouse: false}, ]; } function test_listview_not_interactive_while_tugged(data) { listView.positionViewAtBeginning(); flickableSpy.target = listView; compare(listView.interactive, true, "ListView is not interactive"); if (data.mouse) { swipe(data.item, data.pos.x, data.pos.y, data.dx, units.gu(5)); } else { tug(data.item, data.pos.x, data.pos.y, data.dx, units.gu(5)); } // animation should no longer be running! compare(flickableSpy.count, 0, "Flickable moved!"); // check if it snapped in verify(data.item.contentItem.x != 0.0, "Not snapped in!!"); // dismiss rebound(data.clickOn, data.item); fuzzyCompare(data.item.contentItem.x, data.item.contentItem.anchors.leftMargin, 0.1, "Not snapped out!!"); } function test_visualized_actions_data() { var listItem0 = findChild(listView, "listItem0"); var listItem1 = findChild(listView, "listItem1"); return [ {tag: "Leading actions", item: listItem0, leading: true, expected: ["leading_1", "leading_2", "leading_3"]}, {tag: "Trailing actions", item: listItem0, leading: false, expected: ["stockAction"]}, ]; } function test_visualized_actions(data) { swipe(data.item, centerOf(data.item).x, centerOf(data.item).y, data.leading ? units.gu(20) : -units.gu(20), 0); // check if the action is visible var panel = panelItem(data.item, data.leading); verify(panel, "Panel not visible"); for (var i in data.expected) { var actionItem = findChild(panel, data.expected[i]); verify(actionItem, data.expected[i] + " action not found"); } // dismiss rebound(data.item); } function test_listitem_margins_data() { var item = findChild(listView, "listItem1"); return [ {tag: "leading", item: item, dx: units.gu(10), leading: true}, {tag: "trailing", item: item, dx: -units.gu(10), leading: false} ]; } function test_listitem_margins(data) { data.item.contentItem.anchors.margins = units.gu(1); swipe(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0); var panel = panelItem(data.item, data.leading); verify(panel && panel.visible, "Panel not visible."); // cleanup rebound(data.item); compare(data.item.contentItem.x, units.gu(1), "contentItem.x differs from margin"); data.item.contentItem.anchors.margins = 0; } function test_selecting_action_rebounds_data() { var item0 = findChild(listView, "listItem0"); return [ {tag: "With mouse", item: item0, pos: centerOf(item0), dx: units.gu(20), leading: true, select: "leading_1", mouse: true}, {tag: "With touch", item: item0, pos: centerOf(item0), dx: units.gu(20), leading: true, select: "leading_1", mouse: false}, ] } function test_selecting_action_rebounds(data) { listView.positionViewAtBeginning(); if (data.mouse) { swipe(data.item, data.pos.x, data.pos.y, data.dx, 0); } else { tug(data.item, data.pos.x, data.pos.y, data.dx, 0); } verify(data.item.contentItem.x > 0, "Not snapped in!"); var panel = panelItem(data.item, data.leading); verify(panel, "panelItem not found"); var selectedAction = findChild(panel, data.select); verify(selectedAction, "Cannot select action " + data.select); // dismiss movingSpy.target = data.item; if (data.mouse) { mouseClick(selectedAction, centerOf(selectedAction).x, centerOf(selectedAction).y); } else { TestExtras.touchClick(0, selectedAction, centerOf(selectedAction)); } movingSpy.wait(); fuzzyCompare(data.item.contentItem.x, data.item.contentItem.anchors.leftMargin, 0.1, "Content not snapped out"); } function test_custom_trailing_delegate() { trailing.delegate = customDelegate; listView.positionViewAtBeginning(); var item = findChild(listView, "listItem0"); movingSpy.target = item; swipeNoWait(item, centerOf(item).x, centerOf(item).y, -units.gu(20), 0); var panel = panelItem(item, false); verify(panel, "Panel is not visible"); var custom = findChild(panel, "custom_delegate"); verify(custom, "Custom delegate not in use"); movingSpy.wait(); // cleanup rebound(item); } // execute as last so we make sure we have the panel created function test_snap_data() { var listItem = findChild(listView, "listItem0"); verify(listItem, "ListItem cannot be found"); return [ // the list snaps out if the panel is dragged in > overshoot GU (hardcoded for now) {tag: "Snap out leading", item: listItem, dx: units.gu(2), snapIn: false}, {tag: "Snap in leading", item: listItem, dx: units.gu(6), snapIn: true}, {tag: "Snap out trailing", item: listItem, dx: -units.gu(2), snapIn: false}, {tag: "Snap in trailing", item: listItem, dx: -units.gu(6), snapIn: true}, ]; } function test_snap(data) { swipe(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0); waitForRendering(data.item.contentItem, 400); if (data.snapIn) { verify(data.item.contentItem.x != 0.0, "Not snapped to be visible"); // cleanup rebound(data.item); } else { tryCompareFunction(function() { return data.item.contentItem.x; }, data.item.contentItem.anchors.leftMargin, 1000, "Not snapped back"); } } function test_snap_gesture_data() { var listItem = findChild(listView, "listItem0"); var front = Qt.point(listItem.contentItem.anchors.leftMargin + units.gu(1), listItem.height / 2); var rear = Qt.point(listItem.width - (listItem.contentItem.anchors.rightMargin + units.gu(1)), listItem.height / 2); return [ // the first dx must be big enough to drag the panel in, it is always the last dx value // which decides the snap direction {tag: "Snap out, leading", item: listItem, grabPos: front, dx: [units.gu(10), -units.gu(3)], snapIn: false}, {tag: "Snap in, leading", item: listItem, grabPos: front, dx: [units.gu(10), -units.gu(1), units.gu(1.5)], snapIn: true}, // have less first dx as the trailing panel is shorter {tag: "Snap out, trailing", item: listItem, grabPos: rear, dx: [-units.gu(5), units.gu(2)], snapIn: false}, {tag: "Snap in, trailing", item: listItem, grabPos: rear, dx: [-units.gu(5), units.gu(1), -units.gu(1.5)], snapIn: true}, ]; } function test_snap_gesture(data) { // performe the moves movingSpy.target = data.item; var pos = data.grabPos; mousePress(data.item, pos.x, pos.y); for (var i in data.dx) { var dx = data.dx[i]; mouseMoveSlowly(data.item, pos.x, pos.y, data.dx[i], 0, 5, 100); pos.x += data.dx[i]; } mouseRelease(data.item, pos.x, pos.y); movingSpy.wait(); if (data.snapIn) { // the contenTitem must be dragged in (snapIn) verify(data.item.contentItem.x != 0.0, "Not snapped in!"); // dismiss rebound(data.item); } else { fuzzyCompare(data.item.contentItem.x, data.item.contentItem.anchors.leftMargin, 0.1, "Not snapped out!"); } } function test_verify_action_value_data() { listView.positionViewAtBeginning(); var item0 = findChild(listView, "listItem0"); var item1 = findChild(listView, "listItem1"); return [ // testItem is the child item @index 3 in the topmost Column. {tag: "Standalone item, child index 3", item: testItem, result: 3}, {tag: "ListView, item index 0", item: item0, result: 0}, {tag: "ListView, item index 1", item: item1, result: 1}, ]; } function test_verify_action_value(data) { // tug actions in swipe(data.item, 1, centerOf(data.item).y, units.gu(40), 0); wait(2000); verify(data.item.contentItem.x != data.item.contentItem.anchors.leftMargin, "Not snapped in"); var panel = panelItem(data.item, true); var action = findChild(panel, "leading_2"); verify(action, "actions panel cannot be reached"); // we test the action closest to the list item's contentItem actionSpy.target = data.item.leadingActions.actions[1]; // select the action movingSpy.target = data.item; mouseClick(action, centerOf(action).x, centerOf(action).y); movingSpy.wait(); // check the action param actionSpy.wait(); // SignalSpy.signalArguments[0] is an array of arguments, where the index is set as index 0 var param = actionSpy.signalArguments[0]; compare(param[0], data.result, "Action parameter differs"); } function test_highlight_data() { return [ {tag: "No actions", item: highlightTest, x: centerOf(highlightTest).x, y: centerOf(highlightTest).y, pressed: false}, {tag: "Leading/trailing actions", item: testItem, x: centerOf(testItem).x, y: centerOf(testItem).y, pressed: true}, {tag: "Active component content", item: controlItem, x: units.gu(1), y: units.gu(1), pressed: true}, {tag: "Center of active component content", item: controlItem, x: centerOf(controlItem).x, y: centerOf(controlItem).y, pressed: false}, {tag: "clicked() connected", item: clickedConnected, x: centerOf(clickedConnected).x, y: centerOf(clickedConnected).y, pressed: true}, ]; } function test_highlight(data) { highlightedSpy.target = data.item; mouseClick(data.item, data.x, data.y); if (data.pressed) { highlightedSpy.wait(); } else { compare(highlightedSpy.count, 0, "Should not be highlighted!"); } } SignalSpy { id: pressAndHoldSpy signalName: "pressAndHold" } SignalSpy { id: buttonSpy signalName: "clicked" target: button } function test_pressandhold_suppress_click() { var center = centerOf(testItem); pressAndHoldSpy.target = testItem; clickSpy.target = testItem; clickSpy.clear(); mouseLongPress(testItem, center.x, center.y); mouseRelease(testItem, center.x, center.y); pressAndHoldSpy.wait(); compare(clickSpy.count, 0, "Click must be suppressed when long pressed"); } function test_pressandhold_not_emitted_when_swiped() { var center = centerOf(testItem); pressAndHoldSpy.target = testItem; // move mouse slowly from left to right, the swipe threshold is 1.5 GU!!!, // so any value less than that will emit pressAndHold mouseMoveSlowly(testItem, center.x, center.y, units.gu(2), 0, 10, 100); mouseRelease(testItem, center.x + units.gu(1), center.y); compare(pressAndHoldSpy.count, 0, "pressAndHold should not be emitted!"); // make sure we have collapsed item rebound(testItem); } function test_pressandhold_not_emitted_when_pressed_over_active_component() { var press = centerOf(button); pressAndHoldSpy.target = controlItem; mouseLongPress(button, press.x, press.y); compare(pressAndHoldSpy.count, 0, "") mouseRelease(button, press.x, press.y); } function test_click_on_button_suppresses_listitem_click() { buttonSpy.target = button; clickSpy.target = controlItem; mouseClick(button, centerOf(button).x, centerOf(button).y); buttonSpy.wait(); compare(clickSpy.count, 0, "ListItem clicked() must be suppressed"); } function test_pressandhold_connected_causes_highlight() { highlightedSpy.target = clickedConnected; mouseLongPress(clickedConnected, centerOf(clickedConnected).x, centerOf(clickedConnected).y); highlightedSpy.wait(); mouseRelease(clickedConnected, centerOf(clickedConnected).x, centerOf(clickedConnected).y); } function test_listitem_blocks_ascendant_flickables() { var listItem = findChild(nestedListView, "listItem0"); verify(listItem, "Cannot find test item"); flickableSpy.target = testFlickable; // tug leading swipe(listItem, centerOf(listItem).x, centerOf(listItem).y, listItem.width / 2, 0); // check if interactive got changed expectFailContinue("", "Flickable should not move"); flickableSpy.wait(200); // cleanup!!! rebound(listItem); } function test_action_type_set() { stockAction.parameterType = Action.None; compare(stockAction.parameterType, Action.None, "No parameter type for stockAction!"); testItem.action = stockAction; compare(stockAction.parameterType, Action.Integer, "No parameter type for stockAction!"); } function test_action_triggered_on_clicked() { testItem.action = stockAction; actionSpy.target = stockAction; mouseClick(testItem, centerOf(testItem).x, centerOf(testItem).y); actionSpy.wait(); } function test_action_suppressed_on_longpress() { testItem.action = stockAction; actionSpy.target = stockAction; clickSpy.target = testItem; pressAndHoldSpy.target = testItem; mouseLongPress(testItem, centerOf(testItem).x, centerOf(testItem).y); mouseRelease(testItem, centerOf(testItem).x, centerOf(testItem).y); pressAndHoldSpy.wait(); compare(clickSpy.count, 0, "Click must be suppressed."); compare(actionSpy.count, 0, "Action triggered must be suppressed"); } function test_select_indices_updates_selected_items() { listView.ViewItems.selectedIndices = [0,1,2]; toggleSelectMode(listView, true); for (var i in listView.ViewItems.selectedIndices) { var index = listView.ViewItems.selectedIndices[i]; var listItem = findChild(listView, "listItem" + index); compare(listItem.selected, true, "ListItem at index " + index + " is not selected!"); } toggleSelectMode(listView, false); listView.ViewItems.selectedIndices = []; } function test_toggle_selectMode_data() { return [ {tag: "When not selected", index: 0, selected: false}, {tag: "When selected", index: 0, selected: true}, ] } function test_toggle_selectMode(data) { var listItem = findChild(listView, "listItem" + data.index) verify(listItem, "Cannot get test item"); listItem.selected = data.selected; toggleSelectMode(listView, true); // testItem is the 4th child, so index is 3 verify(findChild(listItem, "selection_panel" + data.index), "Cannot find selection panel"); compare(listItem.contentItem.enabled, true, "contentItem is not disabled."); } SignalSpy { id: selectedSpy signalName: "selectedChanged" } function test_toggle_selected_data() { return [ // item = , clickOk: , offsetX|Y: {tag: "Click over selection", selectableHolder: testColumn, item: controlItem, clickOn: "listitem_select", offsetX: units.gu(0.5), offsetY: units.gu(0.5), xfail: false}, {tag: "Click over contentItem", selectableHolder: testColumn, item: controlItem, clickOn: "ListItemHolder", offsetX: units.gu(0.5), offsetY: units.gu(0.5), xfail: true}, {tag: "Click over control", selectableHolder: testColumn, item: controlItem, clickOn: "button_in_list", offsetX: units.gu(0.5), offsetY: units.gu(0.5), xfail: true}, ]; } function test_toggle_selected(data) { // make test item selectable first, so the panel is created toggleSelectMode(data.selectableHolder, true); // get the control to click on var clickOn = findChild(data.item, data.clickOn); verify(clickOn, "control to be clicked on not found"); // click on the selection and check selected changed selectedSpy.target = data.item; selectedSpy.clear(); mouseClick(clickOn, data.offsetX, data.offsetY); if (data.xfail) { expectFail(data.tag, "Clicking anywhere else but selection panel should not toggle selection state!"); } selectedSpy.wait(); } SignalSpy { id: selectedIndicesSpy signalName: "selectedIndicesChanged" target: listView.ViewItems } function test_selectedIndices_change() { // move to the end of the view listView.positionViewAtEnd(); var listItem = findChild(listView, "listItem" + (listView.count - 1)); verify(listItem, "Cannot get tested list item"); toggleSelectMode(listView, true, false); selectedSpy.target = listItem; selectedSpy.clear(); listItem.selected = true; selectedSpy.wait(); selectedIndicesSpy.wait(); } function test_no_tug_when_selectable() { movingSpy.target = testItem; toggleSelectMode(testColumn, true); // try to tug leading movingSpy.clear(); swipeNoWait(testItem, centerOf(testItem).x, centerOf(testItem).y, units.gu(10), 0); compare(movingSpy.count, 0, "No tug allowed when in selection mode"); } function test_selectable_and_click() { toggleSelectMode(testColumn, true); clickSpy.target = testItem; mouseClick(testItem, centerOf(testItem).x, centerOf(testItem).y); clickSpy.wait(); } function test_selectable_and_pressandhold() { toggleSelectMode(testColumn, true); pressAndHoldSpy.target = testItem; mouseLongPress(testItem, centerOf(testItem).x, centerOf(testItem).y); mouseRelease(testItem, centerOf(testItem).x, centerOf(testItem).y); pressAndHoldSpy.wait(); } function test_proper_attached_properties_data() { return [ {tag: "Attached to ListView", item: listView}, {tag: "Attached to Column in Flickable", item: column}, ]; } function test_proper_attached_properties(data) { var listItem = findChild(data.item, "listItem0"); verify(listItem, "ListItem not found!"); toggleSelectMode(data.item, true); // check if the selection mode was activated by looking after the first selection panel var panel = findChild(listItem, "selection_panel0"); // turn off selection mode so we have a proper cleanup toggleSelectMode(data.item, true); verify(panel, "Selection panel not found, wrong attached property target?"); } function test_dragmode_availability_data() { return [ {tag: "Attached to Column", item: testColumn, lookupOn: testItem, xfail: true}, {tag: "Attached to ListView", item: listView, lookupOn: findChild(listView, "listItem0"), xfail: false}, ]; } function test_dragmode_availability(data) { if (data.xfail) { ignoreWarning(warningFormat(85, 5, "QML Column: Dragging mode requires ListView")); } data.item.ViewItems.dragMode = true; wait(400); var panel = findChild(data.lookupOn, "drag_panel0"); if (data.xfail) { expectFailContinue(data.tag, "There should be no drag handler shown!") } verify(panel, "No drag handler found!"); } function test_drag_data() { return [ // note: Live mode adds an extra drop event when the mouse/touch is released {tag: "Live 0->1 OK", live: true, from: 0, to: 1, count: 1, dropCount: 1, accept: true, indices:[1,0,2,3,4]}, {tag: "Live 0->2 OK", live: true, from: 0, to: 2, count: 2, dropCount: 1, accept: true, indices:[1,2,0,3,4]}, {tag: "Live 0->3 OK", live: true, from: 0, to: 3, count: 3, dropCount: 1, accept: true, indices:[1,2,3,0,4]}, {tag: "Live 3->0 OK", live: true, from: 3, to: 0, count: 3, dropCount: 1, accept: true, indices:[3,0,1,2,4]}, // do not accept moves {tag: "Live 0->1 NOK", live: true, from: 0, to: 1, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, {tag: "Live 0->2 NOK", live: true, from: 0, to: 2, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, {tag: "Live 0->3 NOK", live: true, from: 0, to: 3, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, {tag: "Live 3->0 NOK", live: true, from: 3, to: 0, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, // non-live updates {tag: "Drop 0->1 OK", live: false, from: 0, to: 1, count: 1, dropCount: 1, accept: true, indices:[1,0,2,3,4]}, {tag: "Drop 0->2 OK", live: false, from: 0, to: 2, count: 1, dropCount: 1, accept: true, indices:[1,2,0,3,4]}, {tag: "Drop 0->3 OK", live: false, from: 0, to: 3, count: 1, dropCount: 1, accept: true, indices:[1,2,3,0,4]}, {tag: "Drop 3->0 OK", live: false, from: 3, to: 0, count: 1, dropCount: 1, accept: true, indices:[3,0,1,2,4]}, // do not accept moves {tag: "Drop 0->1 NOK", live: false, from: 0, to: 1, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, {tag: "Drop 0->2 NOK", live: false, from: 0, to: 2, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, {tag: "Drop 0->3 NOK", live: false, from: 0, to: 3, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, {tag: "Drop 3->0 NOK", live: false, from: 3, to: 0, count: 0, dropCount: 1, accept: false, indices:[0,1,2,3,4]}, ]; } function test_drag(data) { var moveCount = 0; var dropCount = 0; function liveUpdate(event) { if (event.status == ListItemDrag.Started) { return; } if (event.status == ListItemDrag.Moving) { if (data.accept) { moveCount++; listView.model.move(event.from, event.to, 1); } event.accept = data.accept; } if (event.status == ListItemDrag.Dropped) { dropCount++; event.accept = data.accept; } } function singleDrop(event) { if (event.status == ListItemDrag.Dropped) { dropCount++; if (data.accept) { moveCount++; listView.model.move(event.from, event.to, 1); } event.accept = data.accept; } else if (event.status == ListItemDrag.Moving) { event.accept = false; } } objectModel.reset(); waitForRendering(listView); listView.positionViewAtBeginning(); var func = data.live ? liveUpdate : singleDrop; listView.ViewItems.dragUpdated.connect(func); // enter drag mode toggleDragMode(listView, true); drag(listView, data.from, data.to); compare(moveCount, data.count, "Move did not happen or more than one item was moved"); compare(dropCount, data.dropCount, "Dropped amount differs"); // compare array indices for (var i in data.indices) { compare(listView.model.get(i).data, data.indices[i], "data at index " + i + " is not the expected one"); } // cleanup listView.ViewItems.dragUpdated.disconnect(func); toggleDragMode(listView, false); } // preconditions: // the first 2 items cannot be dragged anywhere, nothing can be dropped in this area // the 3-> items can be interchanged in between, cannot be dragged outside function test_drag_restricted_data() { return [ {tag: "[0,1] locked, drag 0->1 NOK", from: 0, to: 1, count: 0, indices: [0,1,2,3,4]}, {tag: "[0,1] locked, drag 1->2 NOK", from: 1, to: 2, count: 0, indices: [0,1,2,3,4]}, {tag: "[0,1] locked, drag 2->1 NOK", from: 2, to: 1, count: 0, indices: [0,1,2,3,4]}, {tag: "[0,1] locked, drag 2->0 NOK", from: 2, to: 0, count: 0, indices: [0,1,2,3,4]}, // drag {tag: "[0,1] locked, drag 2->3 OK", from: 2, to: 3, count: 1, indices: [0,1,3,2,4]}, ]; } function test_drag_restricted(data) { var moveCount = 0; function updateHandler(event) { if (event.status == ListItemDrag.Started) { if (event.from < 2) { event.accept = false; } else { event.minimumIndex = 2; } } else if (event.status == ListItemDrag.Moving) { listView.model.move(event.from, event.to, 1); moveCount++; } } objectModel.reset(); waitForRendering(listView); listView.positionViewAtBeginning(); listView.ViewItems.dragUpdated.connect(updateHandler); // enter drag mode toggleDragMode(listView, true); drag(listView, data.from, data.to); compare(moveCount, data.count, "Move did not happen or more than one item was moved"); // compare array indices for (var i in data.indices) { compare(listView.model.get(i).data, data.indices[i], "data at index " + i + " is not the expected one"); } // cleanup listView.ViewItems.dragUpdated.disconnect(updateHandler); toggleDragMode(listView, false); } function test_drag_keeps_selected_indexes_data() { return [ {tag: "[0,1,2] selected, move 0->3, live", selected: [0,1,2], from: 0, to: 3, expected: [0,1,3], live: true}, {tag: "[1,2] selected, move 3->2, live", selected: [1,2], from: 3, to: 2, expected: [1,3], live: true}, {tag: "[1,2] selected, move 0->3, live", selected: [1,2], from: 0, to: 3, expected: [0,1], live: true}, {tag: "[1,2] selected, move 3->0, live", selected: [1,2], from: 3, to: 0, expected: [2,3], live: true}, // non-live updates {tag: "[0,1,2] selected, move 0->3, non-live", selected: [0,1,2], from: 0, to: 3, expected: [0,1,3], live: false}, {tag: "[1,2] selected, move 3->2, non-live", selected: [1,2], from: 3, to: 2, expected: [1,3], live: false}, {tag: "[1,2] selected, move 0->3, non-live", selected: [1,2], from: 0, to: 3, expected: [0,1], live: false}, {tag: "[1,2] selected, move 3->0, non-live", selected: [1,2], from: 3, to: 0, expected: [2,3], live: false}, ]; } function test_drag_keeps_selected_indexes(data) { function updateHandler(event) { if (event.status == ListItemDrag.Started) { return; } if (data.live || event.status == ListItemDrag.Dropped) { listView.model.move(event.from, event.to, 1); } else { event.accept = false; } } objectModel.reset(); waitForRendering(listView); listView.ViewItems.selectedIndices = data.selected; listView.ViewItems.dragUpdated.connect(updateHandler); toggleDragMode(listView, true); drag(listView, data.from, data.to); listView.ViewItems.dragUpdated.disconnect(updateHandler); toggleDragMode(listView, false); // NOTE: the selected indexes order is arbitrar and cannot be predicted by the test // therefore we check the selected indexes presence in the expected list. compare(listView.ViewItems.selectedIndices.length, data.expected.length, "The selected indexes and expected list size differs"); for (var i = 0; i < listView.ViewItems.selectedIndices.length; i++) { var index = data.expected.indexOf(listView.ViewItems.selectedIndices[i]); verify(index >= 0, "Index " + listView.ViewItems.selectedIndices[i] + " is not expected to be selected!"); } } // must run this immediately after the defaults are checked otherwise drag handler connected check will fail function test_1_warn_missing_dragUpdated_signal_handler() { ignoreWarning(warningFormat(121, 9, "QML ListView: ListView has no ViewItems.dragUpdated() signal handler implemented. No dragging will be possible.")); toggleDragMode(listView, true); drag(listView, 0, 1); toggleDragMode(listView, true); } DelegateModel { id: delegateModel delegate: ListItem { objectName: "listItem" + index Label { text: modelData } } } ObjectModel { id: objectModel2 Repeater { model: 3 ListItem { objectName: "listItem" + index Label { text: modelData } } } } function test_warn_model_data() { var list = [1,2,3,4,5,6,7,8,9,10]; return [ {tag: "number", model: 20, warning: "Dragging is only supported when using a QAbstractItemModel, ListModel or list."}, {tag: "list", model: list, warning: ""}, {tag: "ListModel", model: objectModel, warning: ""}, {tag: "DelegateModel with number", model: delegateModel, modelModel: 20, warning: "Dragging is only supported when using a QAbstractItemModel, ListModel or list."}, {tag: "DelegateModel with list", model: delegateModel, modelModel: list, warning: ""}, {tag: "DelegateModel with ListModel", model: delegateModel, modelModel: objectModel, warning: ""}, {tag: "ObjectModel", model: objectModel2, warning: ""}, ]; } function test_warn_model(data) { function dummyFunc() {} if (data.warning !== "") { ignoreWarning(warningFormat(121, 9, "QML ListView: " + data.warning)); } listView.model = data.model; if (typeof data.modelModel !== "undefined") { listView.model.model = data.modelModel; } waitForRendering(listView, 500); listView.ViewItems.dragUpdated.connect(dummyFunc); toggleDragMode(listView, true); toggleDragMode(listView, false); listView.ViewItems.dragUpdated.disconnect(dummyFunc); } function test_rtl_actions_data() { return [ {tag: "Leading actions", item: "listItem0", leading: true, expected: ["leading_1", "leading_2", "leading_3"]}, {tag: "Trailing actions", item: "listItem0", leading: false, expected: ["stockAction"]}, ]; } function test_rtl_actions(data) { listView.LayoutMirroring.enabled = true; waitForRendering(listView, 500); var listItem = findChild(listView, data.item); swipe(listItem, centerOf(listItem).x, centerOf(listItem).y, data.leading ? -units.gu(20) : units.gu(20), 0); // check if the action is visible var panel = panelItem(listItem, data.leading); verify(panel, "Panel not visible"); for (var i in data.expected) { var actionItem = findChild(panel, data.expected[i]); verify(actionItem, data.expected[i] + " action not found"); } // dismiss rebound(listItem); listView.LayoutMirroring.enabled = false; waitForRendering(listView, 500); } function test_rtl_selection_panel_position() { listView.LayoutMirroring.enabled = true; waitForRendering(listView, 500); toggleSelectMode(listView, true); // get the panel var listItem = findChild(listView, "listItem0"); verify(listItem, "ListItem cannot be found"); var panel = findChild(listView, "selection_panel0"); verify(panel, "Selection panel not found."); verify(listItem.mapFromItem(panel, panel.x, panel.y).x > centerOf(listItem).x, "Panel is not in its proper place!"); toggleSelectMode(listView, false); listView.LayoutMirroring.enabled = false; waitForRendering(listView, 500); } function test_rtl_drag_panel_position() { listView.LayoutMirroring.enabled = true; waitForRendering(listView, 500); toggleDragMode(listView, true); // get the panel var listItem = findChild(listView, "listItem0"); verify(listItem, "ListItem cannot be found"); var panel = findChild(listView, "drag_panel0"); verify(panel, "Drag panel not found."); verify(listItem.mapFromItem(panel, panel.x, panel.y).x < centerOf(listItem).x, "Panel is not in its proper place!"); toggleDragMode(listView, false); listView.LayoutMirroring.enabled = false; waitForRendering(listView, 500); } function test_listitem_actions_width_bug1465582_data() { return [ {tag: "leading", dx: units.gu(5), action: "leading_1"}, {tag: "trailing", dx: -units.gu(5), action: "stockAction"}, ]; } function test_listitem_actions_width_bug1465582(data) { var height = testItem.height; testItem.height = units.gu(15); swipe(testItem, centerOf(testItem).x, centerOf(testItem).y, data.dx); var icon = findChild(testItem, data.action); verify(icon); compare(icon.width, units.gu(5), "icon width should be the same no matter of the height set"); rebound(testItem); // restore height testItem.height = height; } } } ./tests/unit_x11/tst_components/tst_pickerpanel.qml0000644000015600001650000002620212700370701022667 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Pickers 1.0 Item { id: testSuite width: units.gu(40) height: units.gu(71) Flow { anchors { fill: parent // give a margin so we can dismiss panels topMargin: units.gu(4) } Button { id: defaultMode text: "defaultMode" property date buttonDate: new Date() property Item panel onClicked: panel = PickerPanel.openDatePicker(defaultMode, "buttonDate") } Button { id: modeSet text: "modeSet" property string mode property date buttonDate: new Date() property Item panel onClicked: panel = PickerPanel.openDatePicker(modeSet, "buttonDate", mode) } } SignalSpy { id: closeSpy signalName: "closed" } UbuntuTestCase { name: "PickerPanelAPI" when: windowShown function initTestCase() { waitForRendering(testSuite); } function test_0_clickOndefaultMode() { mouseClick(defaultMode, units.gu(1), units.gu(1)); verify(defaultMode.panel !== null, "the picker is not opened"); verify(defaultMode.panel.picker !== null, "the DatePicker is not defined"); compare(defaultMode.panel.pickerMode, "Years|Months|Days", "the mode from the picker is not the default"); compare(defaultMode.panel.date, defaultMode.buttonDate, "the date from the picker differs from the button's"); compare(defaultMode.panel.caller, defaultMode, "wrong caller"); compare(defaultMode.panel.callerProperty, "buttonDate", "wrong callerProperty"); verify(defaultMode.panel.hasOwnProperty("closed"), "the object has no closed signal"); // dismiss closeSpy.clear(); closeSpy.target = defaultMode.panel; mouseClick(testSuite, units.gu(1), units.gu(1)); closeSpy.wait(); } function test_1_modeSet_YM() { modeSet.mode = "Years|Months" ; mouseClick(modeSet, units.gu(1), units.gu(1)); verify(modeSet.panel !== null, "the picker is opened"); compare(modeSet.panel.date, modeSet.buttonDate, "the date from the picker differs from the button's"); compare(modeSet.panel.pickerMode, modeSet.mode, "the mode from the picker differs from the button's"); // check the number of pickers var picker = findChild(modeSet.panel.picker, "PickerRow_Positioner"); compare(picker.children.length, 3, "there is not enough pickers in the panel"); // dismiss closeSpy.clear(); closeSpy.target = modeSet.panel; mouseClick(testSuite, units.gu(1), units.gu(1)); closeSpy.wait(); } function test_1_modeSet_YD() { ignoreWarning("Invalid DatePicker mode: Years|Days") modeSet.mode = "Years|Days" ; mouseClick(modeSet, units.gu(1), units.gu(1)); verify(modeSet.panel !== null, "the picker is opened"); compare(modeSet.panel.date, modeSet.buttonDate, "the date from the picker differs from the button's"); compare(modeSet.panel.pickerMode, modeSet.mode, "the mode from the picker differs from the button's"); // check the number of pickers var picker = findChild(modeSet.panel.picker, "PickerRow_Positioner"); expectFailContinue("", "this mode is invalid"); compare(picker.children.length, 2, "there is not enough pickers in the panel"); // dismiss closeSpy.clear(); closeSpy.target = modeSet.panel; mouseClick(testSuite, units.gu(1), units.gu(1)); closeSpy.wait(); } function test_1_modeSet_HMS() { modeSet.mode = "Hours|Minutes|Seconds" ; mouseClick(modeSet, units.gu(1), units.gu(1)); verify(modeSet.panel !== null, "the picker is opened"); compare(modeSet.panel.date, modeSet.buttonDate, "the date from the picker differs from the button's"); compare(modeSet.panel.pickerMode, modeSet.mode, "the mode from the picker differs from the button's"); // check the number of pickers var picker = findChild(modeSet.panel.picker, "PickerRow_Positioner"); compare(picker.children.length, 4, "there is not enough pickers in the panel"); // dismiss closeSpy.clear(); closeSpy.target = modeSet.panel; mouseClick(testSuite, units.gu(1), units.gu(1)); closeSpy.wait(); } function test_1_modeSet_HS() { ignoreWarning("Invalid DatePicker mode: Hours|Seconds") modeSet.mode = "Hours|Seconds" ; mouseClick(modeSet, units.gu(1), units.gu(1)); verify(modeSet.panel !== null, "the picker is opened"); compare(modeSet.panel.date, modeSet.buttonDate, "the date from the picker differs from the button's"); compare(modeSet.panel.pickerMode, modeSet.mode, "the mode from the picker differs from the button's"); // check the number of pickers var picker = findChild(modeSet.panel.picker, "PickerRow_Positioner"); expectFailContinue("", "this mode is invalid"); compare(picker.children.length, 2, "there is not enough pickers in the panel"); // dismiss closeSpy.clear(); closeSpy.target = modeSet.panel; mouseClick(testSuite, units.gu(1), units.gu(1)); closeSpy.wait(); } // forced panel tests // these should be executed as last ones function test_2_clickOndefaultMode() { // force panel - this is private specific!!! var privates = findChild(PickerPanel, "PickerPanel_Internals"); privates.isPhone = true; mouseClick(defaultMode, units.gu(1), units.gu(1)); verify(defaultMode.panel !== null, "the picker is not opened"); verify(defaultMode.panel.picker !== null, "the DatePicker is not defined"); compare(defaultMode.panel.pickerMode, "Years|Months|Days", "the mode from the picker is not the default"); compare(defaultMode.panel.date, defaultMode.buttonDate, "the date from the picker differs from the button's"); compare(defaultMode.panel.caller, defaultMode, "wrong caller"); compare(defaultMode.panel.callerProperty, "buttonDate", "wrong callerProperty"); verify(defaultMode.panel.hasOwnProperty("closed"), "the object has no closed signal"); // dismiss closeSpy.clear(); closeSpy.target = defaultMode.panel; mouseClick(testSuite, units.gu(1), units.gu(1)); closeSpy.wait(); } function test_3_modeSet_YM() { modeSet.mode = "Years|Months" ; mouseClick(modeSet, units.gu(1), units.gu(1)); verify(modeSet.panel !== null, "the picker is opened"); compare(modeSet.panel.date, modeSet.buttonDate, "the date from the picker differs from the button's"); compare(modeSet.panel.pickerMode, modeSet.mode, "the mode from the picker differs from the button's"); // check the number of pickers var picker = findChild(modeSet.panel.picker, "PickerRow_Positioner"); compare(picker.children.length, 3, "there is not enough pickers in the panel"); // dismiss closeSpy.clear(); closeSpy.target = modeSet.panel; mouseClick(testSuite, units.gu(1), units.gu(1)); closeSpy.wait(); } function test_3_modeSet_YD() { ignoreWarning("Invalid DatePicker mode: Years|Days") modeSet.mode = "Years|Days" ; mouseClick(modeSet, units.gu(1), units.gu(1)); verify(modeSet.panel !== null, "the picker is opened"); compare(modeSet.panel.date, modeSet.buttonDate, "the date from the picker differs from the button's"); compare(modeSet.panel.pickerMode, modeSet.mode, "the mode from the picker differs from the button's"); // check the number of pickers var picker = findChild(modeSet.panel.picker, "PickerRow_Positioner"); expectFailContinue("", "this mode is invalid"); compare(picker.children.length, 2, "there is not enough pickers in the panel"); // dismiss closeSpy.clear(); closeSpy.target = modeSet.panel; mouseClick(testSuite, units.gu(1), units.gu(1)); closeSpy.wait(); } function test_3_modeSet_HMS() { modeSet.mode = "Hours|Minutes|Seconds" ; mouseClick(modeSet, units.gu(1), units.gu(1)); verify(modeSet.panel !== null, "the picker is opened"); compare(modeSet.panel.date, modeSet.buttonDate, "the date from the picker differs from the button's"); compare(modeSet.panel.pickerMode, modeSet.mode, "the mode from the picker differs from the button's"); // check the number of pickers var picker = findChild(modeSet.panel.picker, "PickerRow_Positioner"); compare(picker.children.length, 4, "there is not enough pickers in the panel"); // dismiss closeSpy.clear(); closeSpy.target = modeSet.panel; mouseClick(testSuite, units.gu(1), units.gu(1)); closeSpy.wait(); } function test_3_modeSet_HS() { ignoreWarning("Invalid DatePicker mode: Hours|Seconds") modeSet.mode = "Hours|Seconds" ; mouseClick(modeSet, units.gu(1), units.gu(1)); verify(modeSet.panel !== null, "the picker is opened"); compare(modeSet.panel.date, modeSet.buttonDate, "the date from the picker differs from the button's"); compare(modeSet.panel.pickerMode, modeSet.mode, "the mode from the picker differs from the button's"); // check the number of pickers var picker = findChild(modeSet.panel.picker, "PickerRow_Positioner"); expectFailContinue("", "this mode is invalid"); compare(picker.children.length, 2, "there is not enough pickers in the panel"); // dismiss closeSpy.clear(); closeSpy.target = modeSet.panel; mouseClick(testSuite, units.gu(1), units.gu(1)); closeSpy.wait(); } } } ./tests/unit_x11/tst_components/tst_header.qml0000644000015600001650000003654612700370701021636 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Test 1.0 Item { id: root width: units.gu(50) height: units.gu(70) property real initialHeaderHeight: units.gu(6) Header { id: header flickable: flickable z:1 width: parent.width height: root.initialHeaderHeight Rectangle { // to visualize the header anchors.fill: parent color: UbuntuColors.red opacity: 0.5 border { color: "black" width: 2 } } onMovingChanged: { // The value of movingLabel.text is used in: // - test_dont_move_when_flickable_shortens_bug1514143() // - test_dont_move_exposed_header_when_scrolling_down_bug1514143() // - test_dont_move_hidden_header_when_scrolling_up() movingLabel.text = "Moving changed to " + moving; movingLabel.color = moving ? "purple" : "red"; } } Flickable { id: flickable anchors { top: header.flickable ? parent.top : header.bottom left: parent.left right: parent.right bottom: parent.bottom } contentHeight: root.height * 2 Grid { id: switchGrid columns: 2 spacing: units.gu(1) anchors { top: parent.top left: parent.left leftMargin: units.gu(5) topMargin: 2*root.initialHeaderHeight } Switch { id: lockedSwitch checked: null === header.flickable function trigger() { if (header.flickable) { header.flickable = null; } else { header.flickable = flickable; } } } Label { text: "header locked" } Switch { id: hiddenSwitch checked: header.exposed function trigger() { header.exposed = !header.exposed; } } Label { text: "header exposed" } Item { width: 1 height: 1 } } Button { id: contentYButton anchors { top: switchGrid.bottom topMargin: units.gu(4) horizontalCenter: parent.horizontalCenter } property real newY: flickable.contentY == 0 ? -header.height : 0 onClicked: flickable.contentY = newY; text: "Set contentY to " + newY } Label { id: flickLabel anchors { top: contentYButton.bottom horizontalCenter: parent.horizontalCenter topMargin: units.gu(8) } text: "Flick me" } Label { id: movingLabel anchors { top: flickLabel.bottom horizontalCenter: parent.horizontalCenter } text: "hmm" } } Rectangle { id: reparentTestItem anchors { right: parent.right bottom: parent.bottom } height: units.gu(15) width: parent.width / 2 color: "blue" Label { anchors { horizontalCenter: parent.horizontalCenter bottom: parent.bottom } text: "Click to reparent" color: "white" } MouseArea { anchors.fill: parent onClicked: { if (header.parent === root) { header.parent = reparentTestItem; } else { header.parent = root; } } } } Flickable { id: otherFlickable property real initialTopMargin: 123 topMargin: initialTopMargin height: units.gu(10) contentHeight: units.gu(20); } Header { id: otherHeader } Header { id: hiddenHeader exposed: false height: root.initialHeaderHeight } UbuntuTestCase { name: "Header" when: windowShown id: testCase function initTestCase() { wait_for_exposed(true, "Header is not exposed initially."); compare(otherHeader.flickable, null, "Flickable not null by default."); compare(header.flickable, flickable, "Flickable not properly intialized."); // note: moving may be true briefly due to header height changes, but // it does not change in the initialization after wait_for_exposed() above. compare(header.moving, false, "Header moving initially."); } function init() { flickable.contentHeight = 2*flickable.height; flickable.interactive = true; flickable.contentY = -header.height; header.exposed = true; wait_for_exposed(true); } function scroll(dy) { var p = centerOf(flickable); // Use mouseWheel to scroll because mouseDrag is very unreliable // and does not properly handle negative values for dy. mouseWheel(flickable, p.x, p.y, 0, dy); } function scroll_down() { scroll(-2.0*header.height); } function scroll_up() { scroll(header.height); } function wait_for_exposed(exposed, errorMessage) { tryCompare(header, "exposed", exposed, 5000, errorMessage); // wait for the animation to finish: tryCompare(header, "moving", false, 5000, "Header still moving?"); if (exposed) { compare(header.y, 0, errorMessage + " y-value/exposed mismatch for exposed header!"); } else { compare(header.y, -header.height, errorMessage + " y-value/exposed mismatch for hidden header!"); } } function test_0_initially_hidden() { // Don't show an animation if the header is hidden initially. compare(hiddenHeader.y, -header.height, "Hidden header has wrong initial y-value."); } function test_reparent_width() { // test initial header width: compare(header.parent, root); compare(header.width, root.width); compare(header.y, 0); // test width update when changing parent: header.parent = reparentTestItem; compare(header.parent, reparentTestItem); compare(header.width, reparentTestItem.width); compare(header.y, 0); // test width update when changing width of parent: var old_width = reparentTestItem.width; reparentTestItem.width = units.gu(5); compare(header.width, reparentTestItem.width); compare(header.y, 0); // revert to original parent: header.parent = root; compare(header.parent, root); compare(header.width, root.width); compare(header.y, 0); reparentTestItem.width = old_width; } function test_height_change() { // first scroll down for this test, the following test repeats // the cases at the top of the flickable. scroll_down(); header.height = units.gu(15); wait_for_exposed(true, "Increasing header height hides header."); scroll_down(); header.exposed = false; wait_for_exposed(false, "Header with height set does not hide."); header.height = units.gu(2); wait_for_exposed(false, "Decreasing header height exposes it."); header.exposed = true; wait_for_exposed(true, "Header with decreased height does not expose."); // revert to initial state header.height = root.initialHeaderHeight; flickable.contentY = -header.height; wait_for_exposed(true, "Setting flickable.contentY hides the header."); } function test_height_change_at_top() { // Near the top, changing the header height exposes the header // to avoid the header becoming inaccessible because it cannot // be pulled down. header.exposed = false; wait_for_exposed(false); header.height = units.gu(15); wait_for_exposed(true, "Increasing header height at top hides header."); // making the header smaller does not need to expose it, because there is // enough space to pull it down. // revert to original state. header.height = root.initialHeaderHeight; flickable.contentY = -header.height; header.exposed = true; wait_for_exposed(true); } function test_set_exposed_to_hide_and_show() { header.exposed = false; wait_for_exposed(false, "Cannot hide header by setting visible to false."); header.exposed = true; wait_for_exposed(true, "Cannot show header by setting visible to true."); // change the value of exposed twice quickly: header.exposed = false; header.exposed = true; wait_for_exposed(true, "Quickly hiding and showing header does not result in exposed header."); // and the other way around: header.exposed = false; wait_for_exposed(false); header.exposed = true; header.exposed = false; wait_for_exposed(false, "Quickly showing and hiding header does not result in hidden header."); header.exposed = true; wait_for_exposed(true); } function test_scroll_updates_exposed() { scroll_down(); wait_for_exposed(false, "Scrolling down does not hide header."); scroll_up(); wait_for_exposed(true, "Scrolling up does not show header."); } function test_flickable_margins() { compare(flickable.topMargin, header.height, "Flickable top margin does not match header height."); header.height = units.gu(15); wait_for_exposed(true, "Increasing header height at top hides header."); compare(flickable.topMargin, header.height, "Updating header height does not update flickable top margin."); header.height = root.initialHeaderHeight; // revert wait_for_exposed(true, "Reverting header height at top hides header."); compare(flickable.topMargin, header.height, "Reverting header height does not revert flickable top margin."); compare(otherFlickable.topMargin, otherFlickable.initialTopMargin, "Flickable top margin is not initialized properly."); header.flickable = otherFlickable; compare(otherFlickable.topMargin, header.height, "Setting flickable does not update flickable top margin."); compare(flickable.topMargin, 0, "Changing the flickable does not reset the previous flickable top margin to 0."); header.flickable = flickable; compare(otherFlickable.topMargin, otherFlickable.initialTopMargin, "Reverting flickable does not restore the other flickable top margin."); compare(flickable.topMargin, header.height, "Reverting flickable breaks flickable top margin."); } function test_flickable_contentHeight_bug1156573() { var old_height = flickable.contentHeight; header.exposed = false; wait_for_exposed(false); flickable.contentHeight = flickable.height / 2; wait_for_exposed(true, "Small content height does not expose the header."); // revert: flickable.contentHeight = old_height; compare(header.exposed, true, "Reverting flickable content height hides the header."); } function test_flickable_interactive() { header.exposed = false; wait_for_exposed(false); flickable.interactive = false; wait_for_exposed(true, "Making flickable not interactive does not expose the header."); // revert: flickable.interactive = true; compare(header.exposed, true, "Reverting flickable exposed hides the header."); } function test_scroll_disconnected_flickable() { var hy = header.y; header.flickable = null; scroll_down(); compare(header.y, hy, "Header scrolls when disconnected flickable scrolls down."); wait_for_exposed(true, "Scrolling down disconnected flickable hides header."); scroll_up(); compare(header.y, hy, "Header scrolls when disconnected flickable scrolls up."); wait_for_exposed(true, "Scrolling up disconnected flickable hides header."); header.flickable = flickable; } function test_dont_move_when_flickable_shortens_bug1514143() { var flickableContentHeight = flickable.contentHeight; movingLabel.text = "HEADER DID NOT MOVE"; flickable.contentHeight = 200; compare(movingLabel.text, "HEADER DID NOT MOVE", "Reducing flickable contents height unneccessary sets header.moving."); flickable.contentHeight = flickableContentHeight; compare(movingLabel.text, "HEADER DID NOT MOVE", "Increasing flickable contents height unneccessary sets header.moving."); } function test_dont_move_exposed_header_when_scrolling_down_bug1514143() { scroll_down(); scroll_down(); wait_for_exposed(false, "Header doesn't hide when scrolling down."); header.exposed = true; wait_for_exposed(true, "Cannot expose header after scrolling down."); movingLabel.text = "HEADER DID NOT MOVE"; scroll_up(); wait(100); compare(movingLabel.text, "HEADER DID NOT MOVE", "Header moved when scrolling up while header was already exposed."); } function test_dont_move_hidden_header_when_scrolling_up() { // flickable is at the top. header.exposed = false; wait_for_exposed(false, "Cannot hide header."); movingLabel.text = "HEADER DID NOT MOVE"; scroll_down(); wait(100); compare(movingLabel.text, "HEADER DID NOT MOVE", "Header moved when scrolling down while header was already hidden."); } } } ./tests/unit_x11/tst_components/tst_textarea_in_flickable.qml0000644000015600001650000000605712700370701024677 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 Item { id: root width: units.gu(50); height: units.gu(100) Flickable { id: flickable anchors.fill: parent contentHeight: column.childrenRect.height clip: true Column { id: column Text { text: "This is a simple label on top of the Flickable" } TextArea { id: inFlickable width: flickable.width autoSize: true maximumLineCount: 0 text: "1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1" } } } SignalSpy { id: moveSpy target: flickable signalName: "onMovementEnded" } UbuntuTestCase { name: "TextAreaInFlickableAPI" when: windowShown function init() { waitForRendering(flickable, 1000); } function cleanup() { flickable.contentY = 0; moveSpy.clear(); inFlickable.focus = false; inFlickable.cursorPosition = 0; // empty event buffer caused by the flick() events wait(400); } function test_select_state_locks_outer_flickable() { var handler = findChild(inFlickable, "input_handler"); inFlickable.focus = true; // select text flick(inFlickable, 50, 50, -50, -50, handler.selectionModeTimeout+ 50); compare(moveSpy.count, 0, "The Flickable has moved while the TextArea was in selection mode"); verify(inFlickable.selectedText !== "", "No text selected"); } function test_scrolling_input_with_selected_text() { var handler = findChild(inFlickable, "input_handler"); inFlickable.focus = true; // select text inFlickable.select(0, 10); verify(inFlickable.selectedText !== "", "No text selected"); // not scrollable when focused, focus locks scrolling with mouse moveSpy.clear(); mouseWheel(inFlickable, 50, 20, 0, -100); // wait till the move ends expectFailContinue("", "cannot scroll when scroller is locked"); moveSpy.wait(500); verify(inFlickable.selectedText !== "", "There is still text selected"); } } } ./tests/unit_x11/tst_components/tst_popover13.qml0000644000015600001650000001405112700370714022233 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.3 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 MainView { id: main width: units.gu(50) height: units.gu(71) Rectangle { id: rect y: main.height / 2 height: units.gu(10) width: height MouseArea { id: whiteSpace anchors.fill: parent acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton } Button { id: pressMe anchors.top: parent.top text: "Press me" onClicked: { testCase.resetPositions(); var popover = PopupUtils.open(popoverComponent, pressMe); popoverSpy.target = testCase.findChild(popover, "popover_foreground"); popoverSpy.clear(); pressMe.parent.height = units.gu(25) pressMe.anchors.top = parent.bottom } } Button { id: pushMe anchors.bottom: parent.bottom text: "Push me" onClicked: { testCase.resetPositions(); var popover = PopupUtils.open(popoverComponent, pushMe); popoverSpy.target = testCase.findChild(popover, "popover_foreground"); popoverSpy.clear(); rect.y = main.height / 10 } } } Label { id: other text: "Ignore me" anchors.centerIn: parent } // spy to listen on the popover foreground's hideCompleted() signal SignalSpy { id: popoverSpy signalName: "hideCompleted" } SignalSpy { id: whiteSpy signalName: "clicked" target: whiteSpace } Component { id: popoverComponent Popover { objectName: "popover" Rectangle { width: units.gu(20) height: units.gu(20) color: "blue" } } } UbuntuTestCase { id: testCase name: "PopoverTests" when: windowShown function resetPositions() { pressMe.parent.height = units.gu(10) rect.y = main.height / 2 } function cleanup() { resetPositions() popoverSpy.target = null; popoverSpy.clear(); waitForRendering(main, 500); } function test_dismiss_on_click_data() { return [ {button: Qt.LeftButton}, {button: Qt.MiddleButton}, {button: Qt.RightButton}, ]; } function test_dismiss_on_click(data) { mouseClick(pressMe, pressMe.width / 2, pressMe.height / 2); waitForRendering(pressMe); verify(popoverSpy.target !== null, "The popover did not open"); // dismiss mouseClick(main, 10, 10, data.button); popoverSpy.wait(); } function test_dismiss_on_key() { mouseClick(pressMe, pressMe.width / 2, pressMe.height / 2); waitForRendering(pressMe); verify(popoverSpy.target !== null, "The popover did not open"); keyClick(Qt.Key_Escape); popoverSpy.wait(); // Dismiss via click to avoid false negatives on other cases mouseClick(main, 10, 10, Qt.LeftButton); } function test_popover_consumes_clicks_bug1488540_data() { return [ { tag: 'Left-click', button: Qt.LeftButton }, { tag: 'Right-click', button: Qt.RightButton }, { tag: 'Middle-click', button: Qt.MiddleButton }, ] } function test_popover_consumes_clicks_bug1488540(data) { mouseClick(pressMe, pressMe.width / 2, pressMe.height / 2); waitForRendering(pressMe); verify(popoverSpy.target !== null, "The popover did not open"); var popover = popoverSpy.target; // Click in the popover, the rectangle doesn't handle clicks whiteSpy.clear(); mouseClick(popover, popover.width / 2, popover.height / 2, data.button); // dismiss mouseClick(main, 10, 10, Qt.LeftButton); popoverSpy.wait(); // Did the click reach through the popover foreground? compare(whiteSpy.count, 0, 'Click passed through popover foreground!'); } function test_popover_follows_pointerTarget_bug1199502_data() { return [ { tag: "Moving pointerTarget", button: pressMe, dir: "down", y: 318 }, // FIXME: { tag: "Moving parent", button: pushMe, dir: "up", y: 142.8 }, // https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1427557 ] } function test_popover_follows_pointerTarget_bug1199502(data) { mouseClick(data.button, data.button.width / 2, data.button.height / 2); waitForRendering(data.button); var dir = popoverSpy.target.direction var popoverY = popoverSpy.target.y // dismiss mouseClick(main, 10, 10, Qt.LeftButton); popoverSpy.wait(); // ensure popover was next to caller compare(dir, data.dir, "Popover arrow is wrong") compare(popoverY, data.y, "Popover isn't pointing at the caller") } } } ./tests/unit_x11/tst_components/tst_actionbar.qml0000644000015600001650000002276012700370701022341 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 Item { id: root width: 400 height: 600 property list actionList: [ Action { iconName: "alarm-clock" text: "Tick tock" }, Action { iconName: "appointment" text: "Date" }, Action { iconName: "attachment" text: "Attach" }, Action { iconName: "contact" text: "Contact" }, Action { iconName: "like" text: "Like" }, Action { iconName: "lock" text: "Lock" } ] property list shortActionList: [ Action { iconName: "share" text: "Share" }, Action { iconName: "starred" text: "Favorite" } ] Column { anchors { left: parent.left right: parent.right top: parent.top margins: units.gu(2) } height: childrenRect.height Item { width: parent.width height: childrenRect.height Label { anchors { left: parent.left verticalCenter: shortBar.verticalCenter } text: "" + shortBar.numberOfSlots + " slot(s):" } ActionBar { // no numberOfSlots specified. Using default value. id: shortBar anchors.right: parent.right actions: root.shortActionList } } Item { width: parent.width height: childrenRect.height Label { anchors { left: parent.left verticalCenter: bar.verticalCenter } text: "" + bar.numberOfSlots + " slot(s):" } ActionBar { id: bar anchors.right: parent.right numberOfSlots: numberOfActionsSlider.value.toFixed(0) actions: root.actionList } } Slider { id: numberOfActionsSlider anchors { left: parent.left right: parent.right } minimumValue: -1 maximumValue: 10 value: 3 live: true } Item { width: parent.width height: childrenRect.height Label { anchors { left: parent.left verticalCenter: customDelegateBar.verticalCenter } text: "Custom delegate" } ActionBar { id: customDelegateBar anchors.right: parent.right actions: root.shortActionList delegate: Button { action: modelData width: units.gu(14) strokeColor: UbuntuColors.purple objectName: "custom_delegate_button_" + index } } } Item { width: parent.width height: childrenRect.height Label { anchors { left: parent.left verticalCenter: greenButtonsBar.verticalCenter } text: "Custom delegate 2" } ActionBar { id: greenButtonsBar anchors.right: parent.right actions: root.actionList delegate: AbstractButton { styleName: "IconButtonStyle" action: modelData StyleHints { foregroundColor: UbuntuColors.green } } } } } UbuntuTestCase { id: testCase name: "ActionBarApi" when: windowShown function initTestCase() { compare(shortBar.numberOfSlots, 3, "Default number of slots should be 3."); } function init() { // revert to initial values bar.numberOfSlots = 3; shortBar.numberOfSlots = 3; bar.actions = root.actionList; shortBar.actions = root.shortActionList; } function get_overflow_button_visible(actionBar) { var overflowButton = findChild(actionBar, "overflow_action_button") return overflowButton !== null && overflowButton.visible } function get_number_of_visible_buttons(actionBar) { var repeater = findChild(actionBar, "actions_repeater"); return repeater.count; } function get_number_of_actions_in_overflow(actionBar) { if (get_overflow_button_visible(actionBar)) { var overflowButton = findChild(actionBar, "overflow_action_button"); // click the overflow button in order to create the overflow panel mouseClick(overflowButton, overflowButton.width/2, overflowButton.height/2); // the overflow panel is not a child of the ActionBar, so use // root to find it var panel = findChild(root, "actions_overflow_panel"); var n = panel.actions.length; // click again to close the overflow panel mouseClick(overflowButton, overflowButton.width/2, overflowButton.height/2); return n; } else { // empty overflow return 0; } } function test_number_of_slots() { compare(shortBar.numberOfSlots, 3, "Initial number of slots should be 3."); shortBar.numberOfSlots = 10; compare(shortBar.numberOfSlots, 10, "Number of slots cannot be set."); } function test_actions() { compare(bar.actions, root.actionList, "Actions property can be initialized."); bar.actions = root.shortActionList; compare(bar.actions, root.shortActionList, "Actions property can be updated."); } function test_number_of_visible_buttons() { compare(shortActionList.length, get_number_of_visible_buttons(shortBar), "Incorrect number of actions visible for num actions < num slots."); compare(bar.numberOfSlots, get_number_of_visible_buttons(bar), "Incorrect number of actions visible for num actions > num slots."); bar.numberOfSlots = 0; compare(1, get_number_of_visible_buttons(bar), "No slot visible when numberOfSlots < 1."); } function test_overflow_button_visible() { compare (false, get_overflow_button_visible(shortBar), "Overflow button visible when num actions < num slots."); bar.numberOfSlots = actionList.length; compare(false, get_overflow_button_visible(bar), "Overflow button visible when num actions = num slots."); bar.numberOfSlots = actionList.length - 1; compare(true, get_overflow_button_visible(bar), "Overflow button not visible when num actions > num slots."); } function test_number_of_actions_in_overflow() { compare(0, get_number_of_actions_in_overflow(shortBar), "Incorrect number of actions in overflow when num actions < num slots."); bar.numberOfSlots = actionList.length; compare(0, get_number_of_actions_in_overflow(bar), "Incorrect number of actions in overflow when num actions = num slots."); bar.numberOfSlots--; // one action too many, plus one slot used for the overflow button: compare(2, get_number_of_actions_in_overflow(bar), "Incorrect number of actions in overflow when num actions = num slots + 1."); bar.numberOfSlots--; compare(3, get_number_of_actions_in_overflow(bar), "Incorrect number of actions in overflow when num actions = num slots + 2."); bar.numberOfSlots = 0; compare(actionList.length, get_number_of_actions_in_overflow(bar), "Incorrect number of actions in overflow when num slots = 0."); } function test_custom_delegate() { var i = 0; var button; var n = shortActionList.length; for (i = 0; i < n; i++) { button = findChild(customDelegateBar, "custom_delegate_button_"+i); compare(button.text, shortActionList[n-1-i].text, "Incorrect custom button " + i); } button = findChild(customDelegateBar, "custom_delegate_button_" + n); compare(button, null, "Too many buttons."); } } } ./tests/unit_x11/tst_components/tst_app_theming.qml0000644000015600001650000000313312700370701022663 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import QtTest 1.0 import Ubuntu.Test 1.0 MainView { id: main width: units.gu(40) height: units.gu(71) Component.onCompleted: theme.name = "AppTheme" Label { id: testLabel } UbuntuTestCase { name: "AppTheming" when: windowShown function test_app_theme_defaults() { compare(main.backgroundColor, "#a21e1c", "Theme not loaded?"); compare(testLabel.color, "#add8e6", "Label color not from application theme."); } // the following tests should give binding loops which are captured by the runtest.sh // and will report failure if received function test_no_binding_loop_when_set_to_ambiance() { main.theme.name = "Ubuntu.Components.Themes.Ambiance"; } function test_reset_theme_should_not_give_binding_loops() { main.theme.name = undefined; } } } ./tests/unit_x11/tst_components/tst_listitem_expansion.qml0000644000015600001650000001610712700370701024313 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.3 import Ubuntu.Components.Styles 1.3 Item { width: units.gu(40) height: units.gu(71) ListModel { id: testModel Component.onCompleted: reload() function reload() { clear(); for (var i = 0; i < 25; i++) { append({data: i}); } } } ListItemActions { id: actions actions: Action { iconName: "delete" } } property real expandedHeight Column { id: defColumn anchors.fill: parent spacing: units.gu(0.5) ListItem { id: defaults } ListView { id: listView width: parent.width height: units.gu(28) clip: true model: testModel delegate: ListItem { objectName: "listItem" + index Label { text: "ListItem " + modelData } expansion.height: expandedHeight leadingActions: actions } } Flickable { id: flickable width: parent.width height: units.gu(28) clip: true contentHeight: flickableColumn.height Column { id: flickableColumn width: parent.width Repeater { model: testModel ListItem { objectName: "listItem" + index Label { text: "ListItem " + modelData } expansion.height: expandedHeight leadingActions: actions onClicked: expansion.expanded = !expansion.expanded } } } } } ListItemTestCase13 { name: "ListItemExpansion" when: windowShown function init() { expandedHeight = units.gu(12); } function cleanup() { expandedHeight = 0; // move both views to the top listView.positionViewAtBeginning(); flickable.contentY = 0; listView.ViewItems.expandedIndices = []; flickableColumn.ViewItems.expandedIndices = []; listView.ViewItems.expansionFlags = ViewItems.Exclusive; flickableColumn.ViewItems.expansionFlags = ViewItems.Exclusive; wait(200); } function initTestCase() { compare(defaults.expansion.expanded, false, "Not expanded by default"); compare(defaults.expansion.height, 0, "No expansion height by default"); verify(defColumn.ViewItems.expandedIndices, "ViewItems.expandedIndices not defined"); verify(defColumn.ViewItems.expansionFlags, ViewItems.Exclusive); } function test_exclusive_expansion_data() { return [ {tag: "ListView", test: listView, expand1: 0, expand2: 2}, {tag: "Flickable", test: flickableColumn, expand1: 0, expand2: 2}, ]; } function test_exclusive_expansion(data) { var item1 = findChild(data.test, "listItem" + data.expand1); var item2 = findChild(data.test, "listItem" + data.expand2); verify(item1); verify(item2); expand(item1, true); compare(data.test.ViewItems.expandedIndices.length, 1, "More items expanded"); compare(data.test.ViewItems.expandedIndices[0], data.expand1, "More items expanded"); // expand the other one expand(item2, true); compare(data.test.ViewItems.expandedIndices.length, 1, "More items expanded"); compare(data.test.ViewItems.expandedIndices[0], data.expand2, "More items expanded"); } function test_multiple_expanded_data() { return [ {tag: "ListView", test: listView, expand1: 0, expand2: 2}, {tag: "Flickable", test: flickableColumn, expand1: 0, expand2: 2}, ]; } function test_multiple_expanded(data) { var item1 = findChild(data.test, "listItem" + data.expand1); var item2 = findChild(data.test, "listItem" + data.expand2); verify(item1); verify(item2); data.test.ViewItems.expansionFlags = 0; expand(item1, true); expand(item2, true); compare(data.test.ViewItems.expandedIndices.length, 2, "Different amount of items expanded"); } function test_locked_while_expanded_data() { return [ {tag: "ListView, locked", test: listView, expand: 0, flags: 0, xfail: true}, {tag: "Flickable, locked", test: flickableColumn, expand: 0, flags: 0, xfail: true}, {tag: "ListView, unlocked", test: listView, expand: 0, flags: ViewItems.UnlockExpanded, xfail: false}, {tag: "Flickable, unlocked", test: flickableColumn, expand: 0, flags: ViewItems.UnlockExpanded, xfail: false}, ]; } function test_locked_while_expanded(data) { var item = findChild(data.test, "listItem" + data.expand); verify(item); data.test.ViewItems.expansionFlags = data.flags; expand(item, true); setupSpy(item, "contentMovementEnded"); swipeNoWait(item, centerOf(item).x, centerOf(item).y, units.gu(10), 0); if (data.xfail) { expectFailContinue(data.tag, "No panel swipe is allowed"); } spyWait(); } function test_colapse_on_external_click_data() { return [ {tag: "ListView", test: listView, expand1: 1, clickOn: 0}, {tag: "Flickable", test: flickableColumn, expand1: 1, clickOn: 0}, ]; } function test_colapse_on_external_click(data) { var item = findChild(data.test, "listItem" + data.expand1); var clickItem = findChild(data.test, "listItem" + data.clickOn); verify(item); verify(clickItem); var collapsedHeight = item.height; data.test.ViewItems.expansionFlags = ViewItems.CollapseOnOutsidePress; expand(item, true); mouseClick(clickItem, centerOf(clickItem).x, centerOf(clickItem).y); tryCompareFunction(function() { return item.height; }, collapsedHeight, 500); } } } ./tests/unit_x11/tst_components/tst_icon-select@18.png0000644000015600001650000000157212700370701023046 0ustar jenkinsjenkinsPNG  IHDR$$hsBITO pHYs B(xtEXtSoftwarewww.inkscape.org<,PLTE4QlctRNS !#&'*+,-6CGILNSW[\]knpstuzdF[QIDAT8˭VB1JX^c{CT@ED/(KN KVV2;ҿcj/uT7s&JD31qt=p }>;n_?.1(IZa:IqqHQcI=f4ʍ$n{M^.[HIrA{:F(-T@s-\jv˴)~$9w^5mM١K5i_h`qGHO@ zeB{+3RS=xJ4E%^Rz<73;͌J3/ⱂ(*z#T:+|.rRIENDB`./tests/unit_x11/tst_components/tst_listitem_extras.qml0000644000015600001650000003251212700370714023617 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.3 import Ubuntu.Components 1.3 Item { id: main width: units.gu(50) height: units.gu(100) ListItemActions { id: trailing actions: [ Action { iconName: "starred" text: 'Bookmark' objectName: "trailing1" }, Action { iconName: "edit" text: 'Edit' objectName: "trailing2" onTriggered: text = 'Edit Again' }, Action { iconName: "camcorder" text: 'Record' objectName: "trailing3" } ] } ListItemActions { id: leading actions: Action { id: stockAction iconName: "torch-on" objectName: "leading1" text: 'Switch lights on' } } Column { anchors.fill: parent ListItem { id: testWithActiveItem leadingActions: leading trailingActions: trailing Button { id: activeItem text: "pressme" anchors.centerIn: parent } } ListItem { id: overlaidMouseArea leadingActions: leading trailingActions: trailing property bool acceptEvent MouseArea { id: overlayArea anchors.fill: parent onPressed: mouse.accepted = overlaidMouseArea.acceptEvent } } ListView { id: listView width: parent.width height: 4 * units.gu(7) // 4 items clip: true model: 5 delegate: ListItem { objectName: "listItem" + index Label { anchors.centerIn: parent text: index } leadingActions: leading } } ListItem { id: emptyActionList leadingActions: ListItemActions {} trailingActions: ListItemActions { actions: [] } } ListItem { id: contentDragging swipeEnabled: ma.drag.active Rectangle { id: draggedItem width: units.gu(2) height: width color: "red" MouseArea { id: ma anchors.fill: parent drag.target: parent } } } } ListItemTestCase13 { name: "ListItemExtras" SignalSpy { id: clickSpy signalName: "clicked" } function initTestCase() { TestExtras.registerTouchDevice(); } function cleanup() { rebound(testWithActiveItem); rebound(overlaidMouseArea); clickSpy.target = null; clickSpy.clear(); wait(200); } function test_swipe_over_active_item() { clickSpy.target = activeItem; swipe(activeItem, centerOf(activeItem).x, centerOf(activeItem).y, units.gu(10)); compare(clickSpy.count, 0, "activeItem was clicked"); } function test_swipe_over_mousearea_not_accepting_press_data() { return [ {tag: "Accept events", accept: true}, {tag: "Do not accept events", accept: false}, ]; } function test_swipe_over_mousearea_not_accepting_press(data) { overlaidMouseArea.acceptEvent = data.accept; setupSpy(overlaidMouseArea, "contentMovementEnded"); swipeNoWait(overlayArea, centerOf(overlayArea).x, centerOf(overlayArea).y, units.gu(10)); spyWait(); } function test_swipe_out_from_overlay_button_bug1497156_data() { return [ {tag: "leading with mouse", touch: false, swipeInDx: units.gu(20), swipeOutDx: -units.gu(5)}, {tag: "trailing with mouse", touch: false, swipeInDx: -units.gu(20), swipeOutDx: units.gu(5)}, {tag: "leading with touch", touch: true, swipeInDx: units.gu(20), swipeOutDx: -units.gu(5)}, {tag: "trailing with touch", touch: true, swipeInDx: -units.gu(20), swipeOutDx: units.gu(5)}, ] } function test_swipe_out_from_overlay_button_bug1497156(data) { // swipe in and out from teh same point if (data.touch) { tug(testWithActiveItem, centerOf(testWithActiveItem).x, centerOf(testWithActiveItem).y, data.swipeInDx, 0); } else { swipe(testWithActiveItem, centerOf(testWithActiveItem).x, centerOf(testWithActiveItem).y, data.swipeInDx, 0); } verify(testWithActiveItem.contentItem.x != 0, "Not swiped in"); // swipe out if (data.touch) { tug(testWithActiveItem, centerOf(testWithActiveItem).x, centerOf(testWithActiveItem).y, data.swipeOutDx, 0); } else { swipe(testWithActiveItem, centerOf(testWithActiveItem).x, centerOf(testWithActiveItem).y, data.swipeOutDx, 0); } tryCompareFunction(function() { return testWithActiveItem.contentItem.x == testWithActiveItem.contentItem.anchors.leftMargin; }, true, 500); } function test_swipe_over_contextual_actions_bug1486008_data() { return [ {tag: "leading action with mouse", touch: false, dx: units.gu(20), leadingPanel: true, action: "leading1"}, {tag: "trailing action with mouse", touch: false, dx: -units.gu(20), leadingPanel: false, action: "trailing1"}, {tag: "leading action with touch", touch: true, dx: units.gu(20), leadingPanel: true, action: "leading1"}, {tag: "trailing action with touch", touch: true, dx: -units.gu(20), leadingPanel: false, action: "trailing1"}, ]; } function test_swipe_over_contextual_actions_bug1486008(data) { if (data.touch) { tug(testWithActiveItem, centerOf(testWithActiveItem).x, centerOf(testWithActiveItem).y, data.dx, 0); } else { swipe(testWithActiveItem, centerOf(testWithActiveItem).x, centerOf(testWithActiveItem).y, data.dx, 0); } var panel = panelItem(testWithActiveItem, data.leadingPanel); var actionItem = findChild(panel, data.action); verify(actionItem, data.action + " action not found."); // swipe over the action setupSpy(testWithActiveItem, "contentMovementStarted"); if (data.touch) { tugNoWait(actionItem, centerOf(actionItem).x, centerOf(actionItem).y, -data.dx, 0); } else { swipeNoWait(actionItem, centerOf(actionItem).x, centerOf(actionItem).y, -data.dx, 0); } expectFail(data.tag, "should not swipe"); spyWait(); } function test_button_inactive_while_swiped_data() { return [ {tag: "mouse", touch: false, dx: units.gu(20)}, {tag: "touch", touch: true, dx: units.gu(20)}, ]; } function test_button_inactive_while_swiped(data) { clickSpy.target = activeItem; if (data.touch) { tug(testWithActiveItem, centerOf(testWithActiveItem).x, centerOf(testWithActiveItem).y, data.dx, 0); TestExtras.touchClick(0, activeItem, centerOf(activeItem)); } else { swipe(testWithActiveItem, centerOf(testWithActiveItem).x, centerOf(testWithActiveItem).y, data.dx, 0); mouseClick(activeItem, centerOf(activeItem).x, centerOf(activeItem).y); } expectFail(data.tag, "Button is inactive while swiped"); clickSpy.wait(200); } function test_click_before_and_after_snapout_bug1496468_data() { var item0 = findChild(listView, "listItem0"); var item1 = findChild(listView, "listItem1"); return [ {tag: "mouse", touch: false, clickedItem: item0, swipedItem: item1, dx: units.gu(20), reboundDx: -units.gu(5)}, {tag: "touch", touch: true, clickedItem: item0, swipedItem: item1, dx: units.gu(20), reboundDx: -units.gu(5)}, ]; } function test_click_before_and_after_snapout_bug1496468(data) { clickSpy.target = data.clickedItem; if (data.touch) { TestExtras.touchClick(0, data.clickedItem, centerOf(data.clickedItem)); } else { mouseClick(data.clickedItem, centerOf(data.clickedItem).x, centerOf(data.clickedItem).y); } clickSpy.wait(200); // swipe in then rebound if (data.touch) { tug(data.swipedItem, centerOf(data.swipedItem).x, centerOf(data.swipedItem).y, data.dx, 0); wait(200); tug(data.swipedItem, centerOf(data.swipedItem).x, centerOf(data.swipedItem).y, data.reboundDx, 0); } else { swipe(data.swipedItem, centerOf(data.swipedItem).x, centerOf(data.swipedItem).y, data.dx, 0); wait(200); swipe(data.swipedItem, centerOf(data.swipedItem).x, centerOf(data.swipedItem).y, data.reboundDx, 0); } // then test click clickSpy.target = data.swipedItem; clickSpy.clear(); if (data.touch) { TestExtras.touchClick(0, data.swipedItem, centerOf(data.swipedItem)); } else { mouseClick(data.swipedItem, centerOf(data.swipedItem).x, centerOf(data.swipedItem).y); } clickSpy.wait(200); } function test_swipe_on_empty_actions_bug1500416_data() { return [ {tag: "swipe leading, touch", item: emptyActionList, dx: units.gu(5), touch: true}, {tag: "swipe trailing, touch", item: emptyActionList, dx: -units.gu(5), touch: true}, {tag: "swipe leading, mouse", item: emptyActionList, dx: units.gu(5), touch: false}, {tag: "swipe trailing, mouse", item: emptyActionList, dx: -units.gu(5), touch: false} ]; } function test_swipe_on_empty_actions_bug1500416(data) { setupSpy(data.item, "contentMovementEnded"); if (data.touch) { tugNoWait(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0); } else { swipeNoWait(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0); } expectFailContinue(data.tag, "No swipe should happen"); spyWait(200); } function test_swipe_not_possible_when_swipe_disabled_data() { listView.positionViewAtBeginning(); return [ {tag: "leading, touch", item: findChild(listView, "listItem0"), dx: units.gu(10), touch: true}, {tag: "trailing, touch", item: findChild(listView, "listItem0"), dx: -units.gu(10), touch: true}, {tag: "leading, mouse", item: findChild(listView, "listItem0"), dx: units.gu(10), touch: false}, {tag: "trailing, mouse", item: findChild(listView, "listItem0"), dx: -units.gu(10), touch: false}, ]; } function test_swipe_not_possible_when_swipe_disabled(data) { verify(data.item, "test item not found"); data.item.swipeEnabled = false; setupSpy(data.item, "contentMovementEnded"); if (data.touch) { tugNoWait(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0); } else { swipeNoWait(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0); } expectFailContinue(data.tag, "No swipe should happen"); spyWait(200); data.item.swipeEnabled = true; } function test_drag_listitem_content_bug1500409_data() { return [ {tag: "touch", touch: true}, {tag: "mouse", touch: false} ]; } function test_drag_listitem_content_bug1500409(data) { setupSpy(contentDragging, "contentMovementStarted"); if (data.touch) { TestExtras.touchDrag(0, draggedItem, centerOf(draggedItem), Qt.point(units.gu(10), units.gu(3))); } else { mouseDrag(draggedItem, centerOf(draggedItem).x, centerOf(draggedItem).y, units.gu(10), units.gu(3)); } expectFailContinue("", "drag disables swipe"); spyWait(200); } } } ./tests/unit_x11/tst_components/tst_page13.qml0000644000015600001650000001052012700370714021452 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Test 1.3 import Ubuntu.Components 1.3 Item { width: 400 height: 600 Flickable { id: testFlickable } MainView { anchors.fill: parent id: mainView Page { id: page Flickable { id: pageFlickable anchors.fill: parent contentHeight: column.height Column { id: column Repeater { model: 100 Label { text: "line "+index } } } } } } UbuntuTestCase { id: testCase name: "Page13API" when: windowShown function init() { compare(page.title, "", "Page title is set by default."); compare(page.active, true, "Page is inactive by default."); compare(page.pageStack, null, "Page has a PageStack by default."); } function test_title() { var newTitle = "Hello World!"; page.title = newTitle; compare(page.title, newTitle, "Could not set page title."); page.title = ""; compare(page.title, "", "Could not unset page title."); } function test_header_title() { var newTitle = "Hello header!"; page.title = newTitle; var header = mainView.__propagated.header; compare(header.title, newTitle, "Header title does not match active page title."); page.title = ""; } function test_flickable_bug1200642_bug1192591() { var header = page.__propagated.header; compare(page.flickable, pageFlickable, "Flickable is not correctly detected."); compare(header.flickable, pageFlickable, "Header flickable is not correctly set."); page.flickable = testFlickable; compare(page.flickable, testFlickable, "Flickable could not be set."); compare(header.flickable, testFlickable, "Header flickable was not updated correctly."); page.flickable = null; compare(page.flickable, null, "Flickable cannot be unset."); compare(header.flickable, null, "Header flickable was not correctly unset."); } function test_flickableY_bug1201452() { var header = findChild(mainView, "MainView_Header"); var headerHeight = header.height; var flickableY = 150; page.flickable.contentY = flickableY; compare(page.flickable.contentY, flickableY, "Flickable.contentY could not be set."); compare(page.flickable.topMargin, headerHeight, "topMargin of the flickable does not equal header height."); page.head.locked = true; page.head.visible = false; waitForHeaderAnimation(mainView); compare(page.flickable.topMargin, 0, "topMargin is not 0 when header is locked hidden."); compare(page.flickable.contentY, flickableY + headerHeight, "contentY was not updated properly when header was hidden."); page.head.locked = false; page.head.visible = true; waitForHeaderAnimation(mainView); compare(page.flickable.contentY, flickableY, "Hiding and showing header changes flickable.contentY."); compare(page.flickable.topMargin, headerHeight, "topMargin was not updated when header became visible."); } } } ./tests/unit_x11/tst_components/PageHeaderBaseDividerBottom@18.png0000644000015600001650000000164412700370701025223 0ustar jenkinsjenkinsPNG  IHDRetEXtSoftwareAdobe ImageReadyqe<$iTXtXML:com.adobe.xmp IDATxb@GX_/IENDB`./tests/unit_x11/tst_components/tst_listitems_standard.qml0000644000015600001650000001204712700370701024271 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 as ListItem Item { width: 400 height: 400 Rectangle { id: testItem } AbstractButton { id: testControl visible: false } ListItem.Standard { id: listItemStandard anchors.fill: parent } TestCase { name: "ListItemsStandardAPI" when: windowShown function test_clickToTrigger_bug1527811() { compare(listItemTriggeredSpy.valid, true, "triggered signal exists") var listItemTriggeredCount = listItemTriggeredSpy.count mouseMove(listItemStandard, 10, 10) mouseClick(listItemStandard, 10, 10, Qt.LeftButton) compare(listItemTriggeredSpy.count, listItemTriggeredCount + 1, "Clicking the list item triggers it") } function test_fallbackIconSource() { expectFail("","https://bugs.launchpad.net/tavastia/+bug/1076762") compare(listItemStandard.fallbackIconSource,undefined,"fallbackIconSource is not set by default") } function test_control() { listItemStandard.control = testControl compare(listItemStandard.control,testControl,"set/get") listItemStandard.control = null compare(listItemStandard.control, null, "unset") } function test_clicked() { compare(listItemClickedSpy.valid, true, "clicked signal exists") compare(controlClickedSpy.valid, true, "control has clicked signal") var listItemClickedCount = listItemClickedSpy.count var controlClickedCount = controlClickedSpy.count mouseMove(listItemStandard, 10, 10) mouseClick(listItemStandard, 10, 10, Qt.LeftButton) listItemClickedCount++; compare(listItemClickedSpy.count, listItemClickedCount, "List item clicked triggered") listItemStandard.control = testControl; mouseMove(listItemStandard, 10, 10) mouseClick(listItemStandard, 10, 10, Qt.LeftButton) compare(listItemStandard.control, testControl, "control can be set") listItemClickedCount++; compare(controlClickedSpy.count, controlClickedCount, "Control clicked triggered") compare(listItemClickedSpy.count, listItemClickedCount, "List item clicked not triggered when there is a control") listItemStandard.control = null; } function test_bug1166982_disabled_control_clicked() { var controlClickedCount = controlClickedSpy.count listItemStandard.control = testControl testControl.enabled = false mouseMove(listItemStandard, 10, 10) mouseClick(listItemStandard, 10, 10, Qt.LeftButton) compare(controlClickedSpy.count, controlClickedCount, "Control clicked not triggered with disabled control") testControl.enabled = true listItemStandard.control = null } function test_icon() { ignoreWarning("WARNING: ListItems.Standard.icon is DEPRECATED. Use iconName and iconSource instead.") compare(listItemStandard.icon,undefined,"icon is not set by default") // test with url var newIcon = Qt.resolvedUrl("../../../examples/ubuntu-ui-toolkit-gallery/small_avatar.png") listItemStandard.icon = newIcon compare(listItemStandard.icon,newIcon,"set/get from url") } function test_iconFrame() { compare(listItemStandard.iconFrame,true,"iconFrame is true by default") } function test_progression() { compare(listItemStandard.progression,false,"progression is false by default") } function test_text() { compare(listItemStandard.text,"","text is '' by default") var newText = "Hello World!" listItemStandard.text = newText compare(listItemStandard.text,newText,"set/get") } SignalSpy { id: listItemClickedSpy target: listItemStandard signalName: "clicked" } SignalSpy { id: controlClickedSpy target: testControl signalName: "clicked" } SignalSpy { id: listItemTriggeredSpy target: listItemStandard signalName: "triggered" } } } ./tests/unit_x11/tst_components/tst_pagestack.qml0000644000015600001650000002400012700370701022326 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.3 import Ubuntu.Test 1.0 // pagestack tests for deprecated toolbar are in // unit/tst_components/tst_pagestack_deprecated_toolbar.qml Item { width: units.gu(50) height: units.gu(80) MainView { id: mainView anchors.fill: parent PageStack { id: pageStack Page { id: pageInStack } } } Page { id: page1 title: "Title 1" } Page { id: page2 title: "Title 2" } Page { id: pageWithPage title: "Outer" Page { title: "Inner" } } Tabs { id: tabs Tab { id: tab1 page: Page { title: "Tab 1" } } Tab { id: tab2 page: Page { title: "Tab 2" } } } Page { id: pageWithHeader title: "Page with PageHeader" header: PageHeader { title: pageWithHeader.title } } Component { id: pageComponent Page { title: "Page from component" } } UbuntuTestCase { name: "PageStackAPI" when: windowShown id: testCase function initTestCase() { waitForHeaderAnimation(mainView); compare(pageStack.currentPage, null, "is not set by default"); compare(pageStack.__propagated, mainView.__propagated, "propagated property of pageStack equals mainView.__propagated") compare(mainView.__propagated.header.title, "", "empty title by default"); } function cleanup() { pageStack.clear(); waitForHeaderAnimation(mainView); compare(pageStack.depth, 0, "depth is not 0 after clearing."); compare(pageStack.currentPage, null, "currentPage is not null after clearing."); } function test_depth() { compare(pageStack.depth, 0, "depth is 0 by default"); pageStack.push(page1); waitForHeaderAnimation(mainView); compare(pageStack.depth, 1, "depth is correctly increased when pushing a page"); pageStack.push(page2); waitForHeaderAnimation(mainView); compare(pageStack.depth, 2, "depth is correctly updated when pushing a page"); pageStack.pop(); waitForHeaderAnimation(mainView); compare(pageStack.depth, 1, "depth is correctly decreased when popping a page"); } function test_currentPage() { compare(pageStack.currentPage, null, "currentPage is null by default"); pageStack.push(page1); waitForHeaderAnimation(mainView); compare(pageStack.currentPage, page1, "currentPage properly updated"); } function test_page_order() { compare(pageStack.depth, 0, "depth is 0 initially"); pageStack.push(page1); pageStack.push(page2); waitForHeaderAnimation(mainView); compare(pageStack.currentPage, page2, "last pushed page is on top"); pageStack.pop(); waitForHeaderAnimation(mainView); compare(pageStack.currentPage, page1, "popping puts previously pushed page on top"); } function test_multipop_bug1461729() { for (var i=0; i < 10; i++) { pageStack.push(pageComponent); } waitForHeaderAnimation(mainView); compare(pageStack.depth, 10, "couldn't push 10 new pages"); // When updating depth after animating out the header, depth // is not reliable to be used to guard a loop: while(pageStack.depth > 1) { pageStack.pop(); } waitForHeaderAnimation(mainView); compare(pageStack.depth, 1, "popping until one page is left failed. " + pageStack.depth + " pages left on stack"); } function test_active_bug1260116() { pageStack.push(page1); waitForHeaderAnimation(mainView); compare(page1.active, true, "Page is active after pushing"); pageStack.push(page2); waitForHeaderAnimation(mainView); compare(page1.active, false, "Page no longer active after pushing a new page"); compare(page2.active, true, "New page is active after pushing"); pageStack.pop(); waitForHeaderAnimation(mainView); compare(page1.active, true, "Page re-activated when on top of the stack"); compare(page2.active, false, "Page no longer active after being popped"); pageStack.clear(); waitForHeaderAnimation(mainView); compare(pageInStack.active, false, "Page defined inside PageStack is not active by default"); pageStack.push(pageInStack); waitForHeaderAnimation(mainView); compare(pageInStack.active, true, "Pushing a page on PageStack makes it active"); pageStack.pop(); waitForHeaderAnimation(mainView); compare(pageInStack.active, false, "Popping a page from PageStack makes it inactive"); } function test_title_bug1143345_bug1317902() { pageStack.push(page1); waitForHeaderAnimation(mainView); compare(mainView.__propagated.header.title, "Title 1", "Header title is correctly set by page"); page1.title = "New title"; compare(mainView.__propagated.header.title, "New title", "Header title correctly updated by page"); pageStack.push(page2); waitForHeaderAnimation(mainView); compare(mainView.__propagated.header.title, "Title 2", "Header title is correctly set by page"); pageStack.clear(); page1.title = "Title 1"; pageStack.push(pageWithPage); waitForHeaderAnimation(mainView); compare(mainView.__propagated.header.title, pageWithPage.title, "Embedded page sets title of outer page"); } function get_tabs_button() { var button = findChild(mainView, "tabsButton"); if (!button.visible) return null; return button; } function test_tabs_inside_stack_bug1187850() { compare(get_tabs_button(), null, "Without tabs there is no visible tabs button."); pageStack.push(tabs); waitForHeaderAnimation(mainView); compare(pageStack.currentPage, tabs, "Tabs can be pushed on a PageStack"); compare(tabs.active, true, "Tabs on top of a PageStack are active"); compare(get_tabs_button().visible, true, "Pushing tabs on pagestack enables the tabs button"); pageStack.push(page1); waitForHeaderAnimation(mainView); compare(pageStack.currentPage, page1, "A page can be pushed on top of a Tabs"); compare(tabs.active, false, "Tabs on a PageStack, but not on top, are inactive"); compare(get_tabs_button(), null, "Contents of inactive Tabs is not applied to header"); pageStack.pop(); waitForHeaderAnimation(mainView); compare(tabs.active, true, "Tabs on top of PageStack is active"); compare(get_tabs_button().visible, true, "Active Tabs controls header contents"); } function test_pop_to_tabs_bug1316736() { pageStack.push(tabs); waitForHeaderAnimation(mainView); tabs.selectedTabIndex = 1; pageStack.push(page1); waitForHeaderAnimation(mainView); compare(tabs.active, false, "Tabs on a PageStack, but not on top, are inactive"); pageStack.pop(); waitForHeaderAnimation(mainView); compare(tabs.active, true, "Tabs on top of PageStack is active"); compare(tabs.selectedTabIndex, 1, "Pushing and popping another page on top of Tabs does not change selectedTabsIndex"); } function test_push_return_values() { var pushedPage = pageStack.push(page1); compare(pushedPage, page1, "PageStack.push() returns pushed Page"); pushedPage = pageStack.push(pageComponent); compare(pushedPage.title, "Page from component", "PageStack.push() returns Page created from Component"); pushedPage = pageStack.push(Qt.resolvedUrl("MyExternalPage.qml")); compare(pushedPage.title, "Page from QML file", "PageStack.push() returns Page created from QML file"); } function test_page_header_back_button() { pageStack.push(pageWithHeader); var backButton = findChild(pageWithHeader.header, "pagestack_back_action_button"); // FIXME TIM: when visibleActions is fixed, only check for backButton, null. compare(backButton == null || !backButton.visible, true, "Page header shows back button with only one page on the stack."); pageStack.pop(); pageStack.push(page1); pageStack.push(pageWithHeader); waitForHeaderAnimation(mainView); backButton = findChild(pageWithHeader.header, "pagestack_back_action_button"); compare(backButton.visible, true, "Page header has no back button with two pages on the stack."); } } } ./tests/unit_x11/tst_components/tst_panel.qml0000644000015600001650000003105512700370701021473 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 import Ubuntu.Test 1.0 Item { width: 200 height: 200 id: root Panel { id: panel anchors { bottom: parent.bottom left: parent.left right: parent.right } height: parent.height / 2 Rectangle { color: "pink" anchors.fill: parent } } UbuntuTestCase { id: testCase name: "PanelAPI" when: windowShown function initTestCase() { compare(panel.align, Qt.AlignBottom, "Panel initially aligned at bottom"); compare(panel.opened, false, "Panel initially not opened"); compare(panel.locked, false, "Panel initially not locked"); compare(panel.hintSize, units.gu(2), "Default hintSize is 2 grid units"); compare(panel.triggerSize, units.gu(2), "Default triggerSize is 2 grid units"); } function test_align() { panel.align = Qt.AlignTop; compare(panel.align, Qt.AlignTop, "Can set align to top"); panel.align = Qt.AlignLeft; compare(panel.align, Qt.AlignLeft, "Can set align to left"); panel.align = Qt.AlignRight; compare(panel.align, Qt.AlignRight, "Can set align to right"); panel.align = Qt.AlignBottom; compare(panel.align, Qt.AlignBottom, "Can set align to bottom"); } function test_height() { var bar = findChild(panel, "bar_item"); // panel is not opened panel.height = 123; compare(bar.y, 123, "Panel is properly closed after changing height"); panel.open(); wait(500); compare(bar.y, 0, "Panel opens properly after changing height"); panel.height = 78; compare(bar.y, 0, "Panel stays propery opened after changing height"); panel.close(); wait(500); compare(bar.y, 78, "Panel closes properly after changing height"); panel.height = root.height / 2; compare(bar.y, root.height/2, "Panel stays closed properly after changing height"); } function test_opened() { panel.open(); compare(panel.opened, true, "Can set opened"); panel.close(); compare(panel.opened, false, "Can unset opened"); } function test_locked() { panel.locked = true; compare(panel.locked, true, "Can set locked"); panel.locked = false; compare(panel.locked, false, "Can unset locked"); } function test_hintSize() { panel.hintSize = units.gu(1); compare(panel.hintSize, units.gu(1), "Can set hintSize"); panel.hintSize = units.gu(2); } function test_triggerSize() { panel.triggerSize = units.gu(5); compare(panel.triggerSize, units.gu(5), "Can set triggerSize"); panel.triggerSize = units.gu(2); } function test_swipeBottomPanel() { // swipe bottom-aligned panel in and out swipeTests.slowMouseMove = false; swipeTests.swipeUpDown(); swipeTests.slowMouseMove = true; swipeTests.swipeUpDown(); swipeTests.slowMouseMove = false; } function test_swipeLeftPanel() { // swipe a left-aligned panel in and out panel.align = Qt.AlignLeft; swipeTests.slowMouseMove = false; swipeTests.swipeRightLeft(); swipeTests.slowMouseMove = true; swipeTests.swipeRightLeft(); swipeTests.slowMouseMove = false; panel.align = Qt.AlignBottom; } function test_swipeRightPanel() { // swipe right-aligned panel in and out panel.align = Qt.AlignRight; swipeTests.slowMouseMove = false; swipeTests.swipeLeftRight(); swipeTests.slowMouseMove = true; swipeTests.swipeLeftRight(); swipeTests.slowMouseMove = false; panel.align = Qt.AlignBottom; } function test_swipeLeadingPanel() { // swipe leading-aligned panel in and out panel.align = Qt.AlignLeading; swipeTests.swipeRightLeft(); panel.LayoutMirroring.enabled = true; panel.LayoutMirroring.childrenInherit = true; swipeTests.slowMouseMove = false; swipeTests.swipeLeftRight(); swipeTests.slowMouseMove = true; swipeTests.swipeLeftRight(); swipeTests.slowMouseMove = false; panel.LayoutMirroring.enabled = false; panel.align = Qt.AlignBottom; } function test_swipeTrailingPanel() { // swipe trailing-aligned panel in and out panel.align = Qt.AlignTrailing; swipeTests.swipeLeftRight(); panel.LayoutMirroring.enabled = true; panel.LayoutMirroring.childrenInherit = true; swipeTests.slowMouseMove = false; swipeTests.swipeRightLeft(); swipeTests.slowMouseMove = true; swipeTests.swipeRightLeft(); swipeTests.slowMouseMove = false; panel.LayoutMirroring.enabled = false; panel.align = Qt.AlignBottom; } function test_swipeTopPanel() { // swipe top-aligned panel in and out panel.anchors.top = root.top; panel.anchors.bottom = undefined; panel.align = Qt.AlignTop; swipeTests.slowMouseMove = false; swipeTests.swipeDownUp(); swipeTests.slowMouseMove = true; swipeTests.swipeDownUp(); swipeTests.slowMouseMove = false; // revert to original state panel.anchors.bottom = root.bottom; panel.anchors.top = undefined; panel.align = Qt.AlignBottom; } function test_clickToDeactivate() { // deprecated test. This functionality is only there for backwards compatibility panel.__closeOnContentsClicks = true; panel.open(); compare(panel.opened && panel.align === Qt.AlignBottom, true, "Panel is opened and bottom-aligned"); mouseClick(root, root.width / 2, 5, Qt.LeftButton); compare(panel.opened, false, "Panel is deactivated by clicking in the view outside of the panel"); // reset property to default value panel.__closeOnContentsClicks = false; } function test_hideTimeout_bug1249031() { compare(panel.hideTimeout, -1, "Panel hide timeout is initially negative (no timeout)"); panel.hideTimeout = 2000; panel.open(); compare(panel.opened, true, "Panel can be made opened"); wait(panel.hideTimeout + 500); // add 500 ms margin compare(panel.opened, false, "Panel automatically closes after timeout"); // now, wait in total more than hideTimeout, but less than 2*hideTimeout, // and have user interaction half-way to verify that the interaction // resets the timer and the panel is not closed. panel.open(); wait(0.6*panel.hideTimeout); mouseClick(panel, panel.width/2, panel.height/2); wait(0.6*panel.hideTimeout); compare(panel.opened, true, "Interacting with panel contents resets the hide timer"); // verify that the timer is still running by waiting a bit longer: wait(0.6*panel.hideTimeout); compare(panel.opened, false, "Interacting with the panel contents does not stop the timer") panel.hideTimeout = -1; } QtObject { id: swipeTests // waiting time in ms after move, to simulate slow drag vs fast swipe property int moveDelay: slowMouseMove ? 400 : 0 property bool slowMouseMove: false function swipeUpDown() { testCase.compare(panel.opened, false, "Panel initially not opened") var x = root.width / 2; var y = root.height - 1; var dx = 0; var dy = -panel.height / 2; testCase.mousePress(root, x, y, Qt.LeftButton); testCase.mouseMove(root, x + dx, y + dy, moveDelay); testCase.mouseRelease(root, x + dx, y + dy, Qt.LeftButton); testCase.compare(panel.opened, true, "Panel activated by swiping up (delay: "+moveDelay+")") x = panel.width / 2; y = 10; testCase.mousePress(panel, x, y, Qt.LeftButton); testCase.mouseMove(panel, x - dx, y - dy, moveDelay); testCase.mouseRelease(panel, x - dx, y - dy, Qt.LeftButton); testCase.compare(panel.opened, false, "Panel deactivated by swiping down (delay: "+moveDelay+")") } function swipeRightLeft() { testCase.compare(panel.opened, false, "Panel initially not opened") var x = 1; var y = 3 * root.height / 4; var dx = panel.width / 2; var dy = 0; testCase.mousePress(root, x, y, Qt.LeftButton); testCase.mouseMove(root, x + dx, y + dy, moveDelay); testCase.mouseRelease(root, x + dx, y + dy, Qt.Leftbutton); testCase.compare(panel.opened, true, "Left-aligned panel activated by swiping to the right (delay: "+moveDelay+")"); x = 3 * panel.width / 4; y = panel.height / 2; testCase.mousePress(panel, x, y, Qt.LeftButton); testCase.mouseMove(root, x - dx, y - dy, moveDelay); testCase.mouseRelease(panel, x - dx, y - dy, Qt.LeftButton); testCase.compare(panel.opened, false, "Left-aligned panel deactivated by swiping to the left (delay: "+moveDelay+""); } function swipeLeftRight() { testCase.compare(panel.opened, false, "Panel initially not opened") var x = root.width - 1; var y = 3 * root.height / 4; var dx = -panel.width / 2; var dy = 0; testCase.mousePress(root, x, y, Qt.LeftButton); testCase.mouseMove(root, x + dx, y + dy, moveDelay); testCase.mouseRelease(root, x + dx, y + dy, Qt.Leftbutton); testCase.compare(panel.opened, true, "Right-aligned panel activated by swiping to the left (delay: "+moveDelay+""); x = 1; y = panel.height / 2; testCase.mousePress(panel, x, y, Qt.LeftButton); testCase.mouseMove(panel, -dx, -dy, moveDelay); testCase.mouseRelease(panel, x - dx, y - dy, Qt.LeftButton); testCase.compare(panel.opened, false, "Right-aligned panel deactivating by swiping to the right (delay: "+moveDelay+""); } function swipeDownUp() { testCase.compare(panel.opened, false, "Panel initially not opened") var x = root.width / 2; var y = 1; var dx = 0; var dy = panel.height / 2; testCase.mousePress(root, x, y, Qt.LeftButton); testCase.mouseMove(root, x + dx, y + dy, moveDelay); testCase.mouseRelease(root, x + dx, y + dy, Qt.LeftButton); testCase.compare(panel.opened, true, "Top-aligned panel activated by swiping down (delay: "+moveDelay+""); x = panel.width / 2; y = panel.height - 1; testCase.mousePress(panel, x, y, Qt.LeftButton); testCase.mouseMove(panel, x - dx, y - dy, moveDelay); testCase.mouseRelease(panel, x - dx, y - dy, Qt.LeftButton); testCase.compare(panel.opened, false, "Top-aligned panel deactivated by swiping up (delay: "+moveDelay+""); } } } } ./tests/unit_x11/tst_components/tst_tabs.qml0000644000015600001650000001452312700370701021326 0ustar jenkinsjenkins/* * Copyright 2012-2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 MainView { id: mainView width: units.gu(50) height: units.gu(80) useDeprecatedToolbar: false Tabs { id: tabs Tab { id: tab1 title: "tab 1" page: Page { id: page1 Button { id: button anchors.centerIn: parent text: "click" } } } Tab { id: tab2 title: "tab 2" page: Page { id: page2 } } Tab { id: tab3 title: "tab 3" page: Page { id: page3 } } Tab { id: tabFlick1 title: "flick" page: Page { Flickable { id: flickable1 anchors.fill: parent } } } Tab { id: tabFlick2 title: "flick 2" page: Page { Flickable { id: flickable2 anchors.fill: parent } } } Tab { id: tabFlickLoader title: "load" page: Loader { id: loader sourceComponent: tabs.selectedTabIndex != 5 ? null : pageComponent } } Tab { id: tabNoFlickLoader title: "loadNoFlick" page: Loader { id: loaderNoFlick anchors { left: parent.left right: parent.right bottom: parent.bottom } // height compes from the loaded Page sourceComponent: tabs.selectedTabIndex === 6 ? pageComponentNoFlick : null } } } Component { id: pageComponent Page { title: "Loaded page" property Flickable flick: loadedFlickable Flickable { id: loadedFlickable anchors.fill: parent contentHeight: 1000 } } } Component { id: pageComponentNoFlick Page { title: "Loaded page without flickable" } } UbuntuTestCase { name: "TabsAPINewHeader" when: windowShown function test_tabsDefaults() { compare(tabs.selectedTabIndex, 0, "The default selectedTabIndex is 0 when Tabs has contents"); compare(tabs.selectedTab, tab1, "The default selectedTab is the first tab"); compare(tabs.currentPage, page1, "The default currentPage is the page of the first tab"); } function test_tabsSetSelectedTab() { var tabArray = [tab1, tab2, tab3]; var pageArray = [page1, page2, page3]; for (var i=0; i < 3; i++) { tabs.selectedTabIndex = i; compare(tabs.selectedTabIndex, i, "Can set selectedTabIndex"); compare(tabs.selectedTab, tabArray[i], "Can update selectedTab by setting selectedTabIndex"); compare(tabs.currentPage, pageArray[i], "Can update currentPage by setting selectedTabIndex"); for (var j=0; j < 3; j++) { compare(pageArray[j].active, j===i, "Only the page of the selected tab is active"); } } } function test_flickable() { // ensure that the flickable of the header is set to the flickable of the selected tab. tabs.selectedTabIndex = 3; compare(mainView.__propagated.header.flickable, flickable1, "Header flickable correctly initialized"); tabs.selectedTabIndex = 4; compare(mainView.__propagated.header.flickable, flickable2, "Header flickable correctly updated"); tabs.selectedTabIndex = 0; } function test_pageLoader() { tabs.selectedTabIndex = 0; compare(loader.item, null, "Page not loaded when tab is not selected"); tabs.selectedTabIndex = 5; compare(tabs.currentPage, loader, "Selected loader for current page"); compare(loader.item.title, "Loaded page", "Loaded item is a page"); tabs.selectedTabIndex = 0; compare(loader.item, null, "Loaded page was properly unloaded"); } function test_bug1088740() { tabs.selectedTabIndex = 5; compare(mainView.__propagated.header.flickable, loader.item.flick, "Header flickable correctly updated with Loader"); compare(loader.item.flick.contentHeight, 1000, "Header flickable is correct flickable"); tabs.selectedTabIndex = 0; } function test_pageHeightLoaderNoFlick_bug1259917() { tabs.selectedTabIndex = 6; compare(tabs.selectedTab, tabNoFlickLoader, "Tab 6 was selected."); compare(mainView.__propagated.header.flickable, null, "Loaded page without flickable."); compare(loaderNoFlick.item.height, mainView.height - mainView.__propagated.header.height, "Correct height for loaded Page without flickable."); } function test_index() { compare(tab1.index, 0, "tab1 is at 0"); compare(tab2.index, 1, "tab2 is at 1"); compare(tab3.index, 2, "tab3 is at 2"); compare(tabFlick1.index, 3, "tabFlick1 is at 3"); compare(tabFlick2.index, 4, "tabFlick2 is at 4"); compare(tabFlickLoader.index, 5, "tabFlickLoader is at 5"); compare(tabNoFlickLoader.index, 6, "tabNoFlickLoader is at 6"); } } } ./tests/xvfb.sh0000755000015600001650000000201012700370701013531 0ustar jenkinsjenkins#!/bin/sh # # Copyright 2013 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # # Author: Christian Dywan echo Running $@ in virtual frame buffer... xvfb-run -a -s "-screen 0 1280x1024x24" -e xvfb.err "$@" 2>test.err RETVAL=$? if [ $RETVAL -eq 0 ]; then echo $@ finished successfully... else echo $@ in virtual frame buffer failed... cat test.err >&2 echo Tail of xvfb-run output: tail xvfb.err >&2 exit $RETVAL fi ./tests/checkresults.sh0000755000015600001650000000476012700370701015301 0ustar jenkinsjenkins#!/bin/bash # # Copyright 2014-2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # # Author: Christian Dywan ################################################################################ FAILURES=0 for i in $*; do _XML=$i _TESTNAME=$(basename $_XML | sed -r 's@test_(.+)\.xml@\1@' -) if [ ! -f $_XML ]; then echo "$_XML doesn't exist" exit 1 fi EXCEPTIONS='tst_components_benchmark \ tst_tabbar.qml \ tst_datepicker.qml \ tst_qquick_image_extension \ tst_page.qml \ tst_toolbar.qml \ tst_label13.qml \ tst_performance \ tst_tabs.qml \ tst_focus.qml \ tst_pickerpanel.qml \ tst_picker.qml \ tst_picker13.qml \ tst_recreateview \ tst_touchregistry \ tst_mainview \ tst_listitems_itemselector.qml \ tst_tabs_with_repeater.deprecated_toolbar.qml \ tst_inversemousearea \ ' WARNINGS=$(grep -c -e 'qwarn' $_XML) ERRORS=$(grep -c -e '. """Emulators was the old name for the custom proxy objects.""" import logging logger = logging.getLogger(__name__) logger.warning( 'The ubuntuuitoolkit.emulators module is deprecated. Import the autopilot ' 'helpers from the top-level ubuntuuitoolkit module.') __all__ = [ 'check_autopilot_version', 'get_keyboard', 'get_pointing_device', 'TextInputPopover', 'ActionSelectionPopover', 'Base', 'CheckBox', 'ComposerSheet', 'Empty', 'UCListItem', 'Header', 'Dialog', 'ItemSelector', 'MainView', 'MultiValue', 'OptionSelector', 'QQuickFlickable', 'QQuickListView', 'SingleControl', 'SingleValue', 'Standard', 'Subtitled', 'TabBar', 'Tabs', 'TextField', 'Toolbar', 'ToolkitEmulatorException', 'UbuntuUIToolkitEmulatorBase', ] from ubuntuuitoolkit._custom_proxy_objects import ( check_autopilot_version, get_keyboard, get_pointing_device, CheckBox, Header, Dialog, UCListItem, MainView, OptionSelector, QQuickFlickable, QQuickListView, TabBar, Tabs, TextField, Toolbar, ToolkitException as ToolkitEmulatorException, UbuntuUIToolkitCustomProxyObjectBase as UbuntuUIToolkitEmulatorBase, ) from ubuntuuitoolkit._custom_proxy_objects.listitems import ( Base, Empty, ItemSelector, MultiValue, SingleControl, SingleValue, Standard, Subtitled ) from ubuntuuitoolkit._custom_proxy_objects.popups import ( TextInputPopover, ActionSelectionPopover, ComposerSheet ) ./tests/autopilot/ubuntuuitoolkit/__init__.py0000644000015600001650000000377612700370701021670 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Ubuntu UI Toolkit Autopilot tests and helpers.""" __all__ = [ 'AppHeader', 'base', 'ActionBar', 'check_autopilot_version', 'CheckBox', 'environment', 'fixture_setup', 'get_keyboard', 'get_pointing_device', 'Header', 'Dialog', 'listitems', 'UCListItem', 'MainView', 'OptionSelector', 'pickers', 'popups', 'QQuickFlickable', 'QQuickGridView', 'QQuickListView', 'Sections', 'TabBar', 'Tabs', 'tests', 'TextArea', 'TextField', 'Toolbar', 'ToolkitException', 'ubuntu_scenarios', 'UbuntuListView11', 'UbuntuListView', 'UbuntuUIToolkitCustomProxyObjectBase', ] from ubuntuuitoolkit import ( base, environment, fixture_setup, tests, ubuntu_scenarios ) from ubuntuuitoolkit._custom_proxy_objects import ( ActionBar, AppHeader, check_autopilot_version, CheckBox, get_keyboard, get_pointing_device, Header, Dialog, listitems, UCListItem, MainView, OptionSelector, pickers, popups, QQuickFlickable, QQuickGridView, QQuickListView, Sections, TabBar, Tabs, TextArea, TextField, Toolbar, ToolkitException, UbuntuUIToolkitCustomProxyObjectBase, UbuntuListView11, UbuntuListView, ) ./tests/autopilot/ubuntuuitoolkit/tests/0000755000015600001650000000000012700370701020704 5ustar jenkinsjenkins./tests/autopilot/ubuntuuitoolkit/tests/test_launcher.py0000644000015600001650000000356412700370701024126 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import os from testtools.matchers import Equals from autopilot.matchers import Eventually from ubuntuuitoolkit import tests class LauncherTouchTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_launcher.touch.qml') def get_command_line(self, command_line): command_line.append('-touch') return command_line def test_apparent_touch_screen(self): textfield = self.main_view.select_single(objectName="textarea") # Trigger handlers as a courtesy to a watching person self.pointing_device.click_object(textfield) self.assertThat(textfield.text, Eventually(Equals("Yes"))) class LauncherQtTestTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_launcher.testcase.qml') def test_can_run_qt_test_case(self): textfield = self.main_view.select_single(objectName="textarea") self.assertThat(textfield.text, Eventually(Equals("Lorem ipsum dolor sit amet"))) ./tests/autopilot/ubuntuuitoolkit/tests/test_fixture_setup.LaunchFakeApplicationTestCase.qml0000644000015600001650000000157012700370701033207 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.3 import Ubuntu.Components 1.2 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Label { id: label objectName: 'testLabel' text: 'Test application.' } } ./tests/autopilot/ubuntuuitoolkit/tests/__init__.py0000644000015600001650000001555312700370701023026 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012-2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Ubuntu UI Toolkit autopilot tests.""" import os import tempfile from autopilot.input import Pointer from autopilot.matchers import Eventually from testtools.matchers import Is, Not, Equals import ubuntuuitoolkit from ubuntuuitoolkit import base, fixture_setup _DESKTOP_FILE_CONTENTS = ("""[Desktop Entry] Type=Application Exec=/usr/bin/whoami Path=Not important Name=Test app Icon=Not important """) def _write_test_desktop_file(): desktop_file_dir = get_local_desktop_file_directory() if not os.path.exists(desktop_file_dir): os.makedirs(desktop_file_dir) # Strip underscores which look like an APP_ID to Unity # See https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1329141 chars = tempfile._RandomNameSequence.characters.strip("_") tempfile._RandomNameSequence.characters = chars desktop_file = tempfile.NamedTemporaryFile( suffix='.desktop', dir=desktop_file_dir, delete=False) desktop_file.write(_DESKTOP_FILE_CONTENTS.encode('utf-8')) desktop_file.close() return desktop_file.name def get_local_desktop_file_directory(): return os.path.join(os.environ['HOME'], '.local', 'share', 'applications') def _get_module_include_path(): return os.path.join(get_path_to_build_root(), 'modules') def get_path_to_build_root(): if "UITK_BUILD_ROOT" in os.environ: return os.environ["UITK_BUILD_ROOT"] return _guess_root_path() def get_path_to_source_root(): if "UITK_SOURCE_ROOT" in os.environ: return os.environ["UITK_SOURCE_ROOT"] return _guess_root_path() def _guess_root_path(): return os.path.abspath( os.path.join( os.path.dirname(__file__), '..', '..', '..', '..')) class UbuntuUIToolkitWithFakeAppRunningTestCase( base.UbuntuUIToolkitAppTestCase): test_qml = (""" import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { width: units.gu(48) height: units.gu(80) objectName: "mainView" } """) def setUp(self): super().setUp() self.launch_application() def launch_application(self): fake_application = fixture_setup.FakeApplication( qml_file_contents=self.test_qml) self.useFixture(fake_application) local_modules_path = _get_module_include_path() if os.path.exists(local_modules_path): self.use_local_modules(local_modules_path) desktop_file_name = os.path.basename( fake_application.desktop_file_path) application_name, _ = os.path.splitext(desktop_file_name) self.app = self.launch_upstart_application( application_name, emulator_base=ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase) def use_local_modules(self, local_modules_path): env_vars = [ 'QML_IMPORT_PATH', 'QML2_IMPORT_PATH', 'UBUNTU_UI_TOOLKIT_THEMES_PATH' ] kwargs = {'global_': True} for env in env_vars: kwargs[env] = local_modules_path self.useFixture(fixture_setup.InitctlEnvironmentVariable(**kwargs)) class QMLStringAppTestCase(UbuntuUIToolkitWithFakeAppRunningTestCase): """Base test case for self tests that define the QML on an string.""" def setUp(self): super().setUp() self.assertThat( self.main_view.visible, Eventually(Equals(True))) self.pointing_device = Pointer(self.input_device_class.create()) @property def main_view(self): """ Return the MainView of the app, selected by objectName. QML code used for testing must define the objectName of the MainView to be 'mainView'. """ return self.app.select_single(objectName='mainView') class FlickDirection: """Enum for flick or scroll direction.""" UP, DOWN, LEFT, RIGHT = range(0, 4) class QMLFileAppTestCase(base.UbuntuUIToolkitAppTestCase): """Base test case for self tests that launch a QML file.""" test_qml_file_path = '/path/to/file.qml' desktop_file_path = None def setUp(self): super().setUp() self.pointing_device = Pointer(self.input_device_class.create()) self.launch_application() def get_command_line(self, command_line): return command_line def launch_application(self): desktop_file_path = self._get_desktop_file_path() command_line = [ base.get_toolkit_launcher_command(), "-I", _get_module_include_path(), self.test_qml_file_path, '--desktop_file_hint={0}'.format(desktop_file_path) ] self.app = self.launch_test_application( *self.get_command_line(command_line), emulator_base=ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase, app_type='qt') self.assertThat( self.main_view.visible, Eventually(Equals(True))) def _get_desktop_file_path(self): if self.desktop_file_path is None: desktop_file_path = _write_test_desktop_file() self.addCleanup(os.remove, desktop_file_path) return desktop_file_path else: self.desktop_file_path @property def main_view(self): """ Return the MainView of the app, selected by objectName. QML code used for testing must define the objectName of the MainView to be 'mainView'. """ return self.app.select_single(objectName='mainView') def getOrientationHelper(self): orientationHelper = self.main_view.select_many( "OrientationHelper")[0] self.assertThat(orientationHelper, Not(Is(None))) return orientationHelper def checkPageHeader(self, pageTitle): header_label = self.main_view.wait_select_single( objectName="header_title_label", text=pageTitle, visible=True) self.assertThat(header_label, Not(Is(None))) self.assertThat(header_label.visible, Eventually(Equals(True))) def getObject(self, objectName): obj = self.app.select_single(objectName=objectName) self.assertThat(obj, Not(Is(None))) return obj def tap(self, objectName): obj = self.getObject(objectName) self.pointing_device.move_to_object(obj) self.pointing_device.click() ./tests/autopilot/ubuntuuitoolkit/tests/test_base.py0000644000015600001650000000270212700370701023230 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2013 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import testtools from autopilot import input, platform from ubuntuuitoolkit import base class AppTestCase(base.UbuntuUIToolkitAppTestCase): """Empty test case to be used by other tests.""" def _runTest(self): pass class TestUbuntuUIToolkitAppTestCase(testtools.TestCase): @testtools.skipIf(platform.model() != 'Desktop', 'Desktop only') def test_desktop_input_device_class(self): test = AppTestCase('_runTest') test.setUp() self.assertIs(test.input_device_class, input.Mouse) @testtools.skipIf(platform.model() == 'Desktop', 'Phablet only') def test_phablet_input_device_class(self): test = AppTestCase('_runTest') test.setUp() self.assertIs(test.input_device_class, input.Touch) ./tests/autopilot/ubuntuuitoolkit/tests/test_emulators.py0000644000015600001650000000716012700370701024334 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Tests for the deprecated ubuntuuitoolkit.emulators module.""" import imp import logging import fixtures import testscenarios import testtools from testtools.matchers import Contains import ubuntuuitoolkit from ubuntuuitoolkit import emulators, listitems, popups class DeprecatedSymbolsTestCase(testscenarios.TestWithScenarios): symbols_retaining_name = [ 'check_autopilot_version', 'get_keyboard', 'get_pointing_device', 'CheckBox', 'Header', 'MainView', 'OptionSelector', 'QQuickFlickable', 'QQuickListView', 'TabBar', 'Tabs', 'TextField', 'Toolbar', ] symbols_retaining_name_scenarios = [ (symbol, dict( current_module=ubuntuuitoolkit, current_symbol=symbol, deprecated_symbol=symbol)) for symbol in symbols_retaining_name ] symbols_with_new_name = [ (ubuntuuitoolkit, 'ToolkitException', 'ToolkitEmulatorException'), (ubuntuuitoolkit, 'UbuntuUIToolkitCustomProxyObjectBase', 'UbuntuUIToolkitEmulatorBase'), (popups, 'ActionSelectionPopover', 'ActionSelectionPopover'), (popups, 'ComposerSheet', 'ComposerSheet'), (listitems, 'Base', 'Base'), (listitems, 'Empty', 'Empty'), (listitems, 'ItemSelector', 'ItemSelector'), (listitems, 'MultiValue', 'MultiValue'), (listitems, 'SingleControl', 'SingleControl'), (listitems, 'SingleValue', 'SingleValue'), (listitems, 'Standard', 'Standard'), (listitems, 'Subtitled', 'Subtitled') ] symbols_with_new_name_scenarios = [ ('{0} to {1}'.format(old_name, new_name), dict( current_module=new_module, current_symbol=new_name, deprecated_symbol=old_name)) for new_module, new_name, old_name in symbols_with_new_name] scenarios = (symbols_retaining_name_scenarios + symbols_with_new_name_scenarios) def test_deprecated_symbol_must_be_the_same_as_current(self): self.assertEqual( getattr(self.current_module, self.current_symbol), getattr(emulators, self.deprecated_symbol)) class DeprecationWarningTestCase(testtools.TestCase): def reload_emulators(self): _, ubuntuuitoolkit_path, _ = imp.find_module('ubuntuuitoolkit') emulators_file, emulators_path, emulators_description = ( imp.find_module('emulators', [ubuntuuitoolkit_path])) imp.load_module( 'emulators', emulators_file, emulators_path, emulators_description) def test_import_emulators_must_log_warning(self): fake_logger = fixtures.FakeLogger(level=logging.WARNING) self.useFixture(fake_logger) self.reload_emulators() self.assertThat( fake_logger.output, Contains( 'The ubuntuuitoolkit.emulators module is deprecated. Import ' 'the autopilot helpers from the top-level ubuntuuitoolkit ' 'module.')) ./tests/autopilot/ubuntuuitoolkit/tests/test_environment.py0000644000015600001650000000731212700370701024664 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import uuid import testtools from ubuntuuitoolkit import environment class InitctlEnvironmentVariableTestCase(testtools.TestCase): def test_is_environment_variable_set_with_unset_variable(self): """Test that is_initctl_env_var_set returns False for unset vars.""" variable = 'I do not exist {}'.format(uuid.uuid1()) self.assertFalse(environment.is_initctl_env_var_set(variable)) def test_is_environment_variable_set_with_set_variable(self): """Test that is_initctl_env_var_set returns True for existing vars.""" variable = 'Test variable to set {}'.format(uuid.uuid1()) self.addCleanup(environment.unset_initctl_env_var, variable) environment.set_initctl_env_var(variable, 'dummy') self.assertTrue(environment.is_initctl_env_var_set(variable)) def test_get_environment_variable(self): """Test that get_initctl_env_var returns the right value.""" variable = 'Test variable to get {}'.format(uuid.uuid1()) self.addCleanup(environment.unset_initctl_env_var, variable) environment.set_initctl_env_var(variable, 'test value') self.assertEqual( 'test value', environment.get_initctl_env_var(variable)) def test_unset_environment_variable(self): """Test that unset_initctl_env_var removes the variable.""" variable = 'Test variable to unset {}'.format(uuid.uuid1()) environment.set_initctl_env_var(variable, 'dummy') environment.unset_initctl_env_var(variable) self.assertFalse(environment.is_initctl_env_var_set(variable)) def test_unset_environment_variable_with_unset_variable(self): """Test that unset_initctl_env_var does nothing with unset var.""" variable = 'I do not exist {}'.format(uuid.uuid1()) environment.unset_initctl_env_var(variable) self.assertFalse(environment.is_initctl_env_var_set(variable)) def test_is_global_environment_variable_set_with_unset_variable(self): """Test is_initctl_env_var_set returns False for unset global vars.""" variable = 'I do not exist global {}'.format(uuid.uuid1()) self.assertFalse(environment.is_initctl_env_var_set( variable, global_=True)) def test_get_global_environment_variable(self): """Test that get_initctl_env_var returns the right global value.""" variable = 'Test variable to get {}'.format(uuid.uuid1()) self.addCleanup( environment.unset_initctl_env_var, variable, global_=True) environment.set_initctl_env_var(variable, 'test value', global_=True) self.assertEqual( 'test value', environment.get_initctl_env_var(variable, global_=True)) def test_unset_global_environment_variable(self): """Test that unset_initctl_env_var removes the global variable.""" variable = 'Test variable to unset {}'.format(uuid.uuid1()) environment.set_initctl_env_var(variable, 'dummy', global_=True) environment.unset_initctl_env_var(variable, global_=True) ./tests/autopilot/ubuntuuitoolkit/tests/test_fixture_setup.py0000644000015600001650000004276412700370701025240 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import os import subprocess import tempfile from unittest import mock import testscenarios import testtools from autopilot import ( display, introspection, platform, testcase as autopilot_testcase ) from autopilot.matchers import Eventually from testtools.matchers import Contains, Equals, FileExists, Not from ubuntuuitoolkit import base, environment, fixture_setup, tests class FakeApplicationTestCase(testtools.TestCase): def assert_desktop_file_contents( self, desktop_file_contents, expected_contents_dict): desktop_file_lines = desktop_file_contents.splitlines() self.assertEqual('[Desktop Entry]', desktop_file_lines[0]) contents_dict = dict( [line.split('=') for line in desktop_file_lines[1:]]) self.assertDictEqual(expected_contents_dict, contents_dict) def test_qml_file_must_be_created_with_specified_contents(self): fake_application = fixture_setup.FakeApplication( qml_file_contents='Test') self.useFixture(fake_application) with open(fake_application.qml_file_path, 'r+t') as qml_file: qml_file_contents = qml_file.read() self.assertEqual('Test', qml_file_contents) def test_qml_file_with_default_contents(self): fake_application = fixture_setup.FakeApplication() self.useFixture(fake_application) with open(fake_application.qml_file_path, 'r+t') as qml_file: qml_file_contents = qml_file.read() self.assertEqual( fixture_setup.DEFAULT_QML_FILE_CONTENTS, qml_file_contents) def test_desktop_file_must_be_created_with_specified_values(self): test_desktop_file_dict = { 'test key 1': 'test value 1', 'test key 2': 'test value 2', 'Exec': 'test', } fake_application = fixture_setup.FakeApplication( desktop_file_dict=test_desktop_file_dict) self.useFixture(fake_application) with open(fake_application.desktop_file_path, 'r+t') as desktop_file: desktop_file_contents = desktop_file.read() self.assert_desktop_file_contents( desktop_file_contents, test_desktop_file_dict) def test_desktop_file_with_launch_command(self): test_desktop_file_dict = {'Exec': '{launcher} application'} qmlscene = 'ubuntuuitoolkit.base.get_toolkit_launcher_command' with mock.patch(qmlscene) as mock_qmlscene: mock_qmlscene.return_value = 'test_qmlscene_command' fake_application = fixture_setup.FakeApplication( desktop_file_dict=test_desktop_file_dict) self.useFixture(fake_application) with open(fake_application.desktop_file_path, 'r+t') as desktop_file: desktop_file_contents = desktop_file.read() self.assertThat( desktop_file_contents, Contains('Exec=test_qmlscene_command application')) def test_desktop_file_with_qml_file_path(self): test_desktop_file_dict = {'Exec': 'qmlscene {qml_file_path}'} fake_application = fixture_setup.FakeApplication( desktop_file_dict=test_desktop_file_dict) self.useFixture(fake_application) with open(fake_application.desktop_file_path, 'r+t') as desktop_file: desktop_file_contents = desktop_file.read() self.assertThat( desktop_file_contents, Contains( 'Exec=qmlscene {}'.format(fake_application.qml_file_path))) def test_desktop_file_with_default_contents(self): get_launcher = 'ubuntuuitoolkit.base.get_toolkit_launcher_command' with mock.patch(get_launcher) as mock_launcher: mock_launcher.return_value = 'testlauncher' fake_application = fixture_setup.FakeApplication() self.useFixture(fake_application) with open(fake_application.desktop_file_path, 'r+t') as desktop_file: desktop_file_contents = desktop_file.read() expected_desktop_file_dict = { 'Type': 'Application', 'Name': 'test', 'Icon': 'Not important', 'Exec': 'testlauncher {}'.format(fake_application.qml_file_path), } self.assert_desktop_file_contents( desktop_file_contents, expected_desktop_file_dict) def test_desktop_file_must_be_created_in_local_directory(self): fake_application = fixture_setup.FakeApplication() self.useFixture(fake_application) expected_desktop_file_directory = os.path.join( os.environ.get('HOME'), '.local', 'share', 'applications') self.assertEqual( expected_desktop_file_directory, os.path.dirname(fake_application.desktop_file_path)) def test_fake_application_files_must_be_removed_after_test(self): fake_application = fixture_setup.FakeApplication( url_dispatcher_protocols=['testprotocol']) def inner_test(): class TestWithFakeApplication(testtools.TestCase): def test_it(self): self.useFixture(fake_application) return TestWithFakeApplication('test_it') inner_test().run() self.assertThat(fake_application.qml_file_path, Not(FileExists())) self.assertThat(fake_application.desktop_file_path, Not(FileExists())) self.assertThat( fake_application.url_dispatcher_file_path, Not(FileExists())) class LaunchFakeApplicationTestCase(autopilot_testcase.AutopilotTestCase): def test_launch_fake_application_with_qmlscene(self): fake_application = fixture_setup.FakeApplication() self.useFixture(fake_application) application = self.launch_test_application( base.get_qmlscene_launch_command(), fake_application.qml_file_path, '--desktop_file_hint={0}'.format( fake_application.desktop_file_path), app_type='qt') # We can select a component from the application. application.select_single('Label', objectName='testLabel') def test_launch_fake_application_from_url_dispatcher(self): if platform.model() == 'Desktop': self.skipTest('Not yet working on desktop') path = os.path.abspath(__file__) dir_path = os.path.dirname(path) qml_file_path = os.path.join( dir_path, 'test_fixture_setup.LaunchFakeApplicationTestCase.qml') with open(qml_file_path) as qml_file: qml_file_contents = qml_file.read() fake_application = fixture_setup.FakeApplication( qml_file_contents=qml_file_contents, url_dispatcher_protocols=['testprotocol']) self.useFixture(fake_application) self.useFixture(fixture_setup.InitctlEnvironmentVariable( QT_LOAD_TESTABILITY=1)) self.addCleanup( subprocess.check_output, ['ubuntu-app-stop', fake_application.application_name]) subprocess.check_output( ['url-dispatcher', 'testprotocol://test']) pid = int(subprocess.check_output( ['ubuntu-app-pid', fake_application.application_name]).strip()) application = introspection.get_proxy_object_for_existing_process( pid=pid) # We can select a component from the application. application.select_single('Label', objectName='testLabel') class InitctlEnvironmentVariableTestCase(testscenarios.TestWithScenarios): scenarios = [ ('global_variable', {'global_': True}), ('local_variable', {'global_': False}) ] def set_original_value(self, value): self.addCleanup( environment.unset_initctl_env_var, 'testenvvarforfixture', global_=self.global_) environment.set_initctl_env_var('testenvvarforfixture', value, global_=self.global_) def create_fixture(self, value): self.initctl_env_var = fixture_setup.InitctlEnvironmentVariable( testenvvarforfixture=value, global_=self.global_) def assertValueIs(self, expected_value): self.assertEqual( expected_value, environment.get_initctl_env_var( 'testenvvarforfixture', global_=self.global_)) def assertVariableIsNotSet(self): self.assertFalse( environment.is_initctl_env_var_set( 'testenvvarforfixture', global_=self.global_)) def assertTestIsSuccessful(self, expected_value, test_name): result = testtools.TestResult() class TestWithInitctlEnvVar(testtools.TestCase): def setUp(inner): super().setUp() inner.useFixture(self.initctl_env_var) def test_value_set(inner): self.assertValueIs(expected_value) def test_variable_not_set(inner): self.assertVariableIsNotSet() TestWithInitctlEnvVar(test_name).run(result) self.assertTrue( result.wasSuccessful(), 'Failed to set the environment variable.') def test_use_initctl_environment_variable_to_set_unexisting_variable(self): """Test the initctl env var fixture when the var is unset. During the test, the new value must be in place. After the test, the variable must be unset again. """ self.create_fixture('test value') self.assertTestIsSuccessful('test value', 'test_value_set') self.assertVariableIsNotSet() def test_use_initctl_environment_variable_to_set_existing_variable(self): """Test the initctl env var fixture when the var is unset. During the test, the new value must be in place. After the test, the old value must be set again. """ self.set_original_value('original test value') self.create_fixture('new test value') self.assertTestIsSuccessful('new test value', 'test_value_set') self.assertValueIs('original test value') def test_use_initctl_environment_variable_to_unset_existing_variable(self): """Test the initctl env var fixture to unset a variable. During the test, the variable must be unset. After the test, the old value must be set again. """ self.set_original_value('original test value') self.create_fixture(None) self.assertTestIsSuccessful(None, 'test_variable_not_set') self.assertValueIs('original test value',) def test_use_initctl_environment_variable_to_unset_nonexisting_variable( self): """Test the initctl env var fixture to unset a variable. During the test, the variable must be unset. After the test, the variable must remain unset. """ self.create_fixture(None) self.assertTestIsSuccessful(None, 'test_variable_not_set') self.assertVariableIsNotSet() class FakeHomeTestCase(testtools.TestCase): def test_fake_home_fixture_patches_initctl_env_var(self): original_home = environment.get_initctl_env_var('HOME') fake_home = original_home + 'fake' result = testtools.TestResult() def inner_test(): class TestWithFakeHome(testtools.TestCase): def test_it(self): fake_home_fixture = fixture_setup.FakeHome(fake_home) fake_home_fixture.should_copy_xauthority_file = False self.useFixture(fake_home_fixture) self.assertEqual( fake_home, environment.get_initctl_env_var('HOME')) return TestWithFakeHome('test_it') inner_test().run(result) self.assertTrue( result.wasSuccessful(), 'Failed to fake the home: {}'.format(result.errors)) self.assertEqual( original_home, environment.get_initctl_env_var('HOME')) def test_fake_home_fixture_patches_env_var(self): original_home = os.environ.get('HOME') fake_home = tempfile.gettempdir() result = testtools.TestResult() def inner_test(): class TestWithFakeHome(testtools.TestCase): def test_it(self): fake_home_fixture = fixture_setup.FakeHome(fake_home) fake_home_fixture.should_copy_xauthority_file = False self.useFixture(fake_home_fixture) self.assertEqual( fake_home, os.environ.get('HOME')) return TestWithFakeHome('test_it') inner_test().run(result) self.assertTrue( result.wasSuccessful(), 'Failed to fake the home: {}'.format(result.failures)) self.assertEqual(original_home, os.environ.get('HOME')) def test_fake_home_fixture_must_create_default_directory(self): original_home = os.environ.get('HOME') self.useFixture(fixture_setup.FakeHome()) home_parent_directory, _ = os.path.split(os.environ.get('HOME')) self.assertEqual( home_parent_directory, os.path.join(original_home, 'autopilot', 'fakeenv')) def test_fake_home_fixture_must_copy_xauthority(self): # Fake the home first so we don't write the xauthority on the real # home. self.useFixture(fixture_setup.FakeHome()) open(os.path.join(os.environ.get('HOME'), '.Xauthority'), 'w').close() self.useFixture(fixture_setup.FakeHome()) self.assertTrue( os.path.exists( os.path.join(os.environ.get('HOME'), '.Xauthority'))) class HideUnity7LauncherTestCase( tests.UbuntuUIToolkitWithFakeAppRunningTestCase): def setUp(self): if platform.model() != 'Desktop': self.skipTest('Unity 7 runs only on desktop.') self.useFixture(fixture_setup.HideUnity7Launcher()) super().setUp() def test_maximized_application_must_use_all_screen_width(self): application = self.process_manager.get_running_applications()[0] window = application.get_windows()[0] # Maximize window. screen = display.Display.create() screen_width = screen.get_screen_width() screen_height = screen.get_screen_height() window.resize(screen_width, screen_height) def get_window_width(): _, _, window_width, _ = window.geometry return window_width self.assertThat( get_window_width, Eventually(Equals(screen_width))) class FakeDisplay(object): """Fake display with fixed widht and height for use in tests.""" def __init__(self, width, height): super().__init__() self.width = width self.height = height def get_screen_width(self): return self.width def get_screen_height(self): return self.height class SimulateDeviceTestCase(autopilot_testcase.AutopilotTestCase): scenarios = [ ('Device equal to screen', { 'device_width': 100, 'device_height': 100, 'device_grid_unit': 20, 'screen_width': 100, 'screen_height': 100, 'expected_width': 100, 'expected_height': 100, 'expected_grid_unit': 20}), ('Device smaller than screen', { 'device_width': 100, 'device_height': 90, 'device_grid_unit': 20, 'screen_width': 110, 'screen_height': 100, 'expected_width': 100, 'expected_height': 90, 'expected_grid_unit': 20}), ('Device wider than screen', { 'device_width': 200, 'device_height': 90, 'device_grid_unit': 20, 'screen_width': 110, 'screen_height': 100, 'expected_width': 100, 'expected_height': 45, 'expected_grid_unit': 10}), ('Device taller than screen', { 'device_width': 100, 'device_height': 180, 'device_grid_unit': 20, 'screen_width': 110, 'screen_height': 100, 'expected_width': 50, 'expected_height': 90, 'expected_grid_unit': 10}), ('Device bigger than screen', { 'device_width': 200, 'device_height': 180, 'device_grid_unit': 20, 'screen_width': 110, 'screen_height': 100, 'expected_width': 100, 'expected_height': 90, 'expected_grid_unit': 10}), ] def test_simulate_device_fixture_with_size_smaller_than_screen(self): """Test the simulation of a device that fits the screen. All the attributes of the fixture must remain the same. """ simulate_device_fixture = fixture_setup.SimulateDevice( self.device_width, self.device_height, self.device_grid_unit) fake_display = FakeDisplay(self.screen_width, self.screen_height) simulate_device_fixture._screen = fake_display self.useFixture(simulate_device_fixture) self.assertEqual( int(os.environ.get('GRID_UNIT_PX')), self.expected_grid_unit) self.assertEqual( simulate_device_fixture.app_width, self.expected_width) self.assertEqual( simulate_device_fixture.app_height, self.expected_height) ./tests/autopilot/ubuntuuitoolkit/tests/gallery/0000755000015600001650000000000012700370701022343 5ustar jenkinsjenkins./tests/autopilot/ubuntuuitoolkit/tests/gallery/test_toggles.py0000644000015600001650000000607012700370701025423 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import testscenarios from testtools.matchers import Equals from ubuntuuitoolkit import emulators, ubuntu_scenarios from ubuntuuitoolkit.tests import gallery class EnabledTogglesTestCase(gallery.GalleryTestCase): toggles_scenarios = [ ('checkbox unchecked', dict( object_name='checkbox_unchecked', initial_state=False)), ('checkbox checked', dict( object_name='checkbox_checked', initial_state=True)), ('switch unchecked', dict( object_name='switch_unchecked', initial_state=False)), ('switch checked', dict( object_name='switch_checked', initial_state=True)) ] scenarios = testscenarios.multiply_scenarios( ubuntu_scenarios.get_device_simulation_scenarios(), toggles_scenarios) def setUp(self): super().setUp() self.open_page('togglesElement') def test_change_toggles_state(self): toggle = self.main_view.select_single( emulators.CheckBox, objectName=self.object_name) self.assertThat(toggle.enabled, Equals(True)) self.assertThat(toggle.checked, Equals(self.initial_state)) toggle.change_state(timeout=1) self.assertThat(toggle.checked, Equals(not self.initial_state)) class DisabledTogglesTestCase(gallery.GalleryTestCase): toggles_scenarios = [ ('checkbox disabled unchecked', dict( object_name='checkbox_disabled_unchecked', initial_state=False)), ('checkbox disabled checked', dict( object_name='checkbox_disabled_checked', initial_state=True)), ('switch disabled unchecked', dict( object_name='switch_disabled_unchecked', initial_state=False)), ('switch disabled checked', dict( object_name='switch_disabled_checked', initial_state=True)) ] scenarios = testscenarios.multiply_scenarios( ubuntu_scenarios.get_device_simulation_scenarios(), toggles_scenarios) def setUp(self): super().setUp() self.open_page('togglesElement') def test_change_toggles_state(self): toggle = self.main_view.select_single( emulators.CheckBox, objectName=self.object_name) self.assertThat(toggle.enabled, Equals(False)) self.assertThat(toggle.checked, Equals(self.initial_state)) self.assertRaises(AssertionError, toggle.change_state, timeout=1) ./tests/autopilot/ubuntuuitoolkit/tests/gallery/__init__.py0000644000015600001650000001302712700370701024457 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Tests for the Ubuntu UI Toolkit Gallery""" import os import shutil from autopilot.matchers import Eventually from testtools.matchers import Equals import ubuntuuitoolkit from ubuntuuitoolkit import fixture_setup class GalleryTestCase(ubuntuuitoolkit.tests.QMLFileAppTestCase): """Base class for gallery test cases.""" local_desktop_file_path = None def setUp(self): self.test_source_path = self._get_test_source_path() self.test_qml_file_path = self._get_test_qml_file_path() self.desktop_file_path = self._get_desktop_file_path() if self.should_simulate_device(): # Hide the Unity7 launcher because it takes space that might be # needed by the app with the simulated size. self.useFixture(fixture_setup.HideUnity7Launcher()) # This sets the grid units, so it should be called before launching # the app. self.simulate_device() super().setUp() if self.should_simulate_device(): # XXX Currently we have no way to launch the application with a # specific size, so we must resize it after it's launched. # --elopio - 2014-06-25 self.resize_window() def should_simulate_device(self): return (hasattr(self, 'app_width') and hasattr(self, 'app_height') and hasattr(self, 'grid_unit_px')) def simulate_device(self): simulate_device_fixture = self.useFixture(fixture_setup.SimulateDevice( self.app_width, self.app_height, self.grid_unit_px)) self.app_width = simulate_device_fixture.app_width self.app_height = simulate_device_fixture.app_height def resize_window(self): application = self.process_manager.get_running_applications()[0] window = application.get_windows()[0] window.resize(self.app_width, self.app_height) def get_window_size(): _, _, window_width, window_height = window.geometry return window_width, window_height self.assertThat( get_window_size, Eventually(Equals((self.app_width, self.app_height)))) def _get_test_source_path(self): if self._application_source_exists(): test_source_path = self._get_path_to_gallery_source() else: test_source_path = self._get_path_to_installed_gallery() assert os.path.exists(test_source_path) return test_source_path def _get_path_to_gallery_source(self): return os.path.join( ubuntuuitoolkit.tests.get_path_to_source_root(), 'examples', 'ubuntu-ui-toolkit-gallery') def _application_source_exists(self): return 'UBUNTU_UI_TOOLKIT_AUTOPILOT_FROM_SOURCE' in os.environ def _get_test_qml_file_path(self): return os.path.join( self.test_source_path, 'ubuntu-ui-toolkit-gallery.qml') def _get_path_to_installed_gallery(self): host_multiarch = ubuntuuitoolkit.base.get_host_multiarch() return '/usr/lib/{}/qt5/examples//ubuntu-ui-toolkit/examples/' \ 'ubuntu-ui-toolkit-gallery'.format(host_multiarch) def _get_desktop_file_path(self): desktop_file_path = os.path.join( self.test_source_path, 'ubuntu-ui-toolkit-gallery.desktop') if self._application_source_exists(): local_desktop_file_dir = ( ubuntuuitoolkit.tests.get_local_desktop_file_directory()) if not os.path.exists(local_desktop_file_dir): os.makedirs(local_desktop_file_dir) local_desktop_file_path = os.path.join( local_desktop_file_dir, 'ubuntu-ui-toolkit-gallery.desktop') shutil.copy(desktop_file_path, local_desktop_file_path) # We can't delete the desktop file before we close the application, # so we save it on an attribute to be deleted on tear down. self.local_desktop_file_path = local_desktop_file_path return local_desktop_file_path else: return desktop_file_path def open_page(self, page): """Open a page of the widget gallery. :param page: The objectName of the element in the index list that opens the page. """ list_view = self.main_view.select_single(objectName="widgetList") element = list_view.click_element(page) # Do not check the ListItem's highlight # the actual highlight is implemented in the UbuntuListView self.checkPageHeader(element.text) return element def tearDown(self): super().tearDown() # We can't delete the desktop file before we close the application, # so we save it on an attribute to be deleted on tear down. if self.local_desktop_file_path is not None: os.remove(self.local_desktop_file_path) ./tests/autopilot/ubuntuuitoolkit/tests/gallery/test_optionselector.py0000644000015600001650000000515612700370701027034 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Tests for the Ubuntu UI Toolkit Gallery - OptionSelector component.""" import ubuntuuitoolkit from ubuntuuitoolkit import ubuntu_scenarios from ubuntuuitoolkit.tests.gallery import GalleryTestCase class OptionSelectorTestCase(GalleryTestCase): scenarios = ubuntu_scenarios.get_device_simulation_scenarios() def setUp(self): super().setUp() self.open_page('optionSelectorsElement') def test_select_option_from_collapsed_optionselector(self): collapsed_option_selector = self.main_view.select_single( ubuntuuitoolkit.OptionSelector, objectName='optionselector_collapsed') self.assertEqual( collapsed_option_selector.get_selected_text(), 'Value 1') collapsed_option_selector.select_option('Label', text='Value 4') self.assertEqual(collapsed_option_selector.get_selected_index(), 3) def test_select_option_from_expanded_optionselector(self): expanded_option_selector = self.main_view.select_single( ubuntuuitoolkit.OptionSelector, objectName='optionselector_expanded') self.assertEqual( expanded_option_selector.get_selected_text(), 'Value 1') expanded_option_selector.select_option('Label', text='Value 4') self.assertEqual(expanded_option_selector.get_selected_index(), 3) def test_select_option_from_optionselector_with_custom_model(self): option_selector_with_custom_model = self.main_view.select_single( ubuntuuitoolkit.OptionSelector, objectName='optionselector_custommodel') option_selector_with_custom_model.swipe_into_view() self.assertEqual( option_selector_with_custom_model.get_selected_index(), 0) option_selector_with_custom_model.select_option( 'Label', text='Name 4') self.assertEqual( option_selector_with_custom_model.get_selected_index(), 3) ./tests/autopilot/ubuntuuitoolkit/tests/gallery/test_scrollbar.py0000644000015600001650000000470512700370701025745 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from autopilot import platform from ubuntuuitoolkit import ubuntu_scenarios from ubuntuuitoolkit.tests import gallery class ScrollBarTestCase(gallery.GalleryTestCase): scenarios = ubuntu_scenarios.get_device_simulation_scenarios() def setUp(self): super().setUp() self.open_page('navigationElement') self.scrollview = self.main_view.wait_select_single( 'ScrollView', objectName="TemplateScrollView") self.scrollbar = self.scrollview.select_single( objectName="verticalScrollbar") def move_mouse_to_thumb(self): # TODO we need a helper to move the interactive thumb. # --elopio 2014-05-06 thumb = self.get_mouse_thumb() self.pointing_device.move_to_object(thumb) def get_mouse_thumb(self): return self.scrollbar.select_single( objectName='interactiveScrollbarThumb') def test_drag_thumb_down_must_make_bottom_visible(self): if platform.model() != 'Desktop': self.skipTest( 'The interactive thumb is activated by the move of a mouse') bottom_section = self.main_view.select_single(className='PageStack') flickable = self.main_view.select_single( 'QQuickFlickable', objectName='TemplateFlickable') self.assertEqual(flickable.is_child_visible(bottom_section), False) self.move_mouse_to_thumb() mouse_thumb = self.get_mouse_thumb() x, y, width, height = mouse_thumb.globalRect start_x = stop_x = x + (width // 2) start_y = y + (height // 2) stop_y = self.main_view.y + self.main_view.height self.pointing_device.drag(start_x, start_y, stop_x, stop_y) self.assertEqual(flickable.is_child_visible(bottom_section), True) ./tests/autopilot/ubuntuuitoolkit/tests/gallery/test_gallery.py0000644000015600001650000000654712700370701025427 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Tests for the Ubuntu UI Toolkit Gallery""" import testscenarios import ubuntuuitoolkit from ubuntuuitoolkit import ubuntu_scenarios from ubuntuuitoolkit.tests import gallery class GalleryAppTestCase(gallery.GalleryTestCase): """Generic tests for the Gallery""" scenarios = ubuntu_scenarios.get_device_simulation_scenarios() def test_select_main_view_must_return_main_window_emulator(self): main_view = self.main_view self.assertIsInstance(main_view, ubuntuuitoolkit.MainView) def test_slider(self): self.open_page('slidersElement') item_data = [ ["slider_standard"], ["slider_live"], ["slider_range"] ] for data in item_data: objName = data[0] self.getObject(objName) self.tap(objName) # TODO: move slider value def test_progress_and_activity(self): self.open_page('progressBarsElement') item_data = [ ["progressbar_standard"], ["progressbar_indeterminate"], ["activityindicator_standard"] ] for data in item_data: objName = data[0] self.getObject(objName) self.tap(objName) # TODO: check for properties def test_ubuntushape(self): # Flaky test case # FIXME: https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1308979 return self.open_page('ubuntuShapesElement') item_data = [ ["ubuntushape_color_hex"], ["ubuntushape_color_lightblue"], ["ubuntushape_color_darkgray"], ["ubuntushape_image"], ["ubuntushape_radius_small"], ["ubuntushape_radius_medium"], ["ubuntushape_sizes_15_6"], ["ubuntushape_sizes_10_14"] ] for data in item_data: objName = data[0] self.getObject(objName) class OpenPagesTestCase(gallery.GalleryTestCase): names = [ 'navigation', 'toggles', 'buttons', 'sliders', 'textinputs', 'optionSelectors', 'pickers', 'progressBars', 'ubuntuShapes', 'icons', 'labels', 'listItems', 'ubuntuListView', 'dialogs', 'popovers', 'sheets', 'animations' ] pages_scenarios = [ (name, dict( element_name=name+'Element', template_name=name+'Template')) for name in names ] scenarios = testscenarios.multiply_scenarios( ubuntu_scenarios.get_device_simulation_scenarios(), pages_scenarios) def test_open_page(self): self.open_page(self.element_name) self.main_view.wait_select_single(objectName=self.template_name) ./tests/autopilot/ubuntuuitoolkit/tests/gallery/test_textinput.py0000644000015600001650000000707212700370701026026 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Tests for the Ubuntu UI Toolkit Gallery - TextInput components""" import testscenarios from ubuntuuitoolkit import emulators, ubuntu_scenarios from ubuntuuitoolkit.tests.gallery import GalleryTestCase import locale class WriteAndClearTextInputTestCase(GalleryTestCase): def text_to_write_string(): return 'Hello World' def text_to_write_number(): return locale.format('%.2f', -1001.23) # text_to_write is a function to ensure # that locale is evaluated after setUp text_input_scenarios = [ ('standard textfield', dict( objectName='textfield_standard', text_to_write=text_to_write_string, expected_text=text_to_write_string())), ('password textfield', dict( objectName='textfield_password', text_to_write=text_to_write_string, expected_text=text_to_write_string())), # The text_to_write contains a decimal separator based on locale # eg. -1001.23 or -1001,23 or -۱۰۰۱٫۲۳ # The test expects integers, TextField rejects that character ('only integers textfield', dict( objectName='textfield_numbers', text_to_write=text_to_write_number, expected_text='-100123')) ] scenarios = testscenarios.multiply_scenarios( ubuntu_scenarios.get_device_simulation_scenarios(), text_input_scenarios) def setUp(self): super().setUp() # Apply the user locale from the environment # The UITK does the same, so the test must be localized locale.setlocale(locale.LC_ALL, "") self.open_page('textinputsElement') def test_write_on_textfield_must_update_text(self): textfield = self.main_view.select_single( emulators.TextField, objectName=self.objectName) textfield.write(self.text_to_write()) self.assertEqual(self.expected_text, textfield.text) def test_clear_textfield_must_remove_text(self): textfield = self.main_view.select_single( emulators.TextField, objectName=self.objectName) textfield.write(self.text_to_write()) textfield.clear() self.assertEqual('', textfield.text) class DisabledTextInputTestCase(GalleryTestCase): scenarios = ubuntu_scenarios.get_device_simulation_scenarios() def setUp(self): super().setUp() self.open_page('textinputsElement') def test_textfield_disabled(self): textfield_disabled = self.main_view.select_single( emulators.TextField, objectName='textfield_disabled') self.assertFalse(textfield_disabled.enabled) disabled_text = textfield_disabled.text self.assertRaises(AssertionError, textfield_disabled.write, 'This should not be written') self.assertEqual(disabled_text, textfield_disabled.text) ./tests/autopilot/ubuntuuitoolkit/tests/gallery/test_ubuntulistview.py0000644000015600001650000000301212700370701027061 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Tests for the Ubuntu UI Toolkit Gallery - UbuntuListView component.""" from ubuntuuitoolkit.tests.gallery import GalleryTestCase class UbuntuListViewTestCase(GalleryTestCase): def _open_page(self): super().open_page('ubuntuListViewElement') self.listView = self.main_view.select_single( objectName="ubuntuListView") def test_pull_to_refresh_enabled(self): self._open_page() self.assertTrue(self.listView.pull_to_refresh_enabled()) def test_manual_refresh_wait(self): self._open_page() self.assertTrue(self.listView.manual_refresh_wait()) def test_manual_refresh_nowait(self): self._open_page() self.assertTrue(self.listView.manual_refresh_nowait()) # wait for completion self.listView.wait_refresh_completed() ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/0000755000015600001650000000000012700370701025170 5ustar jenkinsjenkins././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootroot./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_header.DeprecatedHeaderTestCase.qml./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_header.DeprecatedHeaderTestCase.qm0000644000015600001650000000140712700370701034624 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { objectName: 'main' Header { title: 'test' } } ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootroot./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_listview.QQuickListViewTestCase.Uitk10.vertical.qml./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_listview.QQuickListViewTestCase.Ui0000644000015600001650000000330712700370701034716 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.0 import Ubuntu.Components.ListItems 1.0 as ListItem MainView { width: units.gu(48) height: units.gu(20) objectName: "mainView" Page { Column { id: column width: units.gu(48) height: units.gu(20) Label { id: clickedLabel objectName: "clickedLabel" text: "No element clicked." } ListView { id: testListView objectName: "testListView" anchors.left: parent.left anchors.right: parent.right height: column.height - clickedLabel.paintedHeight clip: true model: 20 delegate: ListItem.Standard { objectName: "testListElement%1".arg(index) text: "test list element %1".arg(index) onClicked: clickedLabel.text = objectName height: units.gu(5) } } } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_dialog.py0000644000015600001650000000330712700370701030043 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2013, 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import os from ubuntuuitoolkit import tests class DialogTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_dialog.DialogTestCase.qml') def test_dialog(self): open_button = self.main_view.wait_select_single('Button', objectName='button') self.pointing_device.click_object(open_button) dialog = self.main_view.wait_select_single('Dialog', title="Dialog") text_area = dialog.wait_select_single('TextArea', objectName='textfield_standard') text_area.write('test') self.assertEqual(text_area.text, 'test') lower_button = dialog.wait_select_single('Button', text='Lower button') self.pointing_device.click_object(lower_button) ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_actionbar.ActionBarTestCase.qml0000644000015600001650000000361512700370701034206 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Page { title: "ActionBar test" Label { id: label objectName: "Label" anchors { top: parent.top horizontalCenter: parent.horizontalCenter } text: "No action triggered." } ActionBar { objectName: "ActionBar" anchors.centerIn: parent numberOfSlots: 2 actions: [ Action { iconName: "share" text: "Share" onTriggered: label.text = "Action 1 triggered." objectName: "Action1" }, Action { iconName: "starred" text: "Favorite" onTriggered: label.text = "Action 2 triggered." objectName: "Action2" }, Action { iconName: "lock" text: "Lock" onTriggered: label.text = "Action 3 triggered." objectName: "Action3" } ] } } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootroot./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_tabs.TabsTestCase.new_header.1.3.qml./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_tabs.TabsTestCase.new_header.1.3.q0000644000015600001650000000217512700370701034273 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.3 MainView { width: units.gu(70) height: units.gu(60) objectName: "mainView" Tabs { id: tabs Tab { objectName: "tab1" title: "Tab1" page: Page { } } Tab { objectName: "tab2" title: "Tab2" page: Page { } } Tab { objectName: "tab3" title: "Tab3" page: Page { } } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_textfield.1.3.qml0000644000015600001650000000214312700370701031232 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Item { TextField { id: simpleTextField objectName: "simple_text_field" } TextField { id: textFieldWithoutClearButton objectName: "text_field_without_clear_button" hasClearButton: false anchors.top: simpleTextField.bottom } } } ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootroot./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_listview.QQuickListViewTestCase.Uitk13.horizontal.qml./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_listview.QQuickListViewTestCase.Ui0000644000015600001650000000361012700370701034713 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(48) height: units.gu(20) objectName: "mainView" Page { header: Item { } Column { id: column width: units.gu(48) height: units.gu(20) Label { id: clickedLabel objectName: "clickedLabel" text: "No element clicked." } ListView { id: testListView orientation: ListView.Horizontal objectName: "testListView" anchors { left: parent.left right: parent.right } height: column.height - clickedLabel.paintedHeight clip: true model: 20 delegate: ListItem { objectName: "testListElement%1".arg(index) Label { anchors.centerIn: parent text: "test list element %1".arg(index) } onClicked: clickedLabel.text = objectName height: units.gu(5) width: units.gu(20) } } } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_listitems.py0000644000015600001650000001722512700370701030625 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2013-2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from unittest import mock import logging import os import fixtures import testtools from testtools.matchers import Contains import ubuntuuitoolkit from ubuntuuitoolkit import listitems, tests class ListItemsTestCase(testtools.TestCase): def test_supported_class(self): self.assertTrue(issubclass( listitems.Base, listitems.Empty)) self.assertTrue(issubclass( listitems.Expandable, listitems.Empty)) self.assertTrue(issubclass( listitems.ItemSelector, listitems.Empty)) self.assertTrue(issubclass( listitems.Standard, listitems.Empty)) self.assertTrue(issubclass( listitems.SingleControl, listitems.Empty)) self.assertTrue(issubclass( listitems.MultiValue, listitems.Base)) self.assertTrue(issubclass( listitems.SingleValue, listitems.Base)) self.assertTrue(issubclass( listitems.Subtitled, listitems.Base)) class SwipeToDeleteTestCase(tests.QMLStringAppTestCase): test_qml = (""" import QtQuick 2.0 import Ubuntu.Components 1.0 import Ubuntu.Components.ListItems 1.0 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Page { ListModel { id: testModel ListElement { name: "listitem_destroyed_on_remove_with_confirm" label: "Item destroyed on remove with confirmation" confirm: true } ListElement { name: "listitem_destroyed_on_remove_without_confirm" label: "Item destroyed on remove without confirmation" confirm: false } } Column { anchors { fill: parent } Standard { objectName: "listitem_standard" confirmRemoval: true removable: true text: 'Slide to remove' } Empty { objectName: "listitem_empty" } Standard { objectName: "listitem_without_confirm" confirmRemoval: false removable: true text: "Item without delete confirmation" } ListView { anchors { left: parent.left; right: parent.right } height: childrenRect.height model: testModel delegate: Standard { removable: true confirmRemoval: confirm onItemRemoved: testModel.remove(index) text: label objectName: name } } } } } """) def setUp(self): super().setUp() self._item = self.main_view.select_single( listitems.Standard, objectName='listitem_standard') self.assertTrue(self._item.exists()) def test_standard_custom_proxy_object(self): self.assertIsInstance(self._item, listitems.Standard) def test_swipe_item(self): self._item.swipe_to_delete() self.assertTrue(self._item.waitingConfirmationForRemoval) def test_swipe_item_to_right(self): self._item.swipe_to_delete('right') self.assertTrue(self._item.waitingConfirmationForRemoval) def test_swipe_item_to_left_must_raise_exception(self): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self._item.swipe_to_delete, 'left') self.assertEqual( str(error), 'Only swiping to the right will cause the item to be deleted.') def test_swipe_item_with_direction_must_log_deprecation_warning(self): fake_logger = fixtures.FakeLogger(level=logging.WARNING) self.useFixture(fake_logger) self._item.swipe_to_delete(direction='right') self.assertThat( fake_logger.output, Contains( 'The direction argument is deprecated. Now the Ubuntu SDK ' 'only deletes list items when swiping from left to right. ' 'Call swipe_to_delete without arguments.')) def test_swipe_item_to_wrong_direction(self): self.assertRaises( ubuntuuitoolkit.ToolkitException, self._item.swipe_to_delete, 'up') def test_delete_item_moving_right(self): self._item.swipe_to_delete('right') self._item.confirm_removal() self.assertFalse(self._item.exists()) def test_delete_non_removable_item(self): self._item = self.main_view.select_single( listitems.Empty, objectName='listitem_empty') self.assertRaises( ubuntuuitoolkit.ToolkitException, self._item.swipe_to_delete) def test_confirm_removal_when_item_was_not_swiped(self): self.assertRaises( ubuntuuitoolkit.ToolkitException, self._item.confirm_removal) def test_delete_item_without_confirm(self): item = self.main_view.select_single( listitems.Standard, objectName='listitem_without_confirm') item.swipe_to_delete() self.assertFalse(item.exists()) def test_delete_item_with_confirmation_that_will_be_destroyed(self): item = self.main_view.select_single( listitems.Standard, objectName='listitem_destroyed_on_remove_with_confirm') item.swipe_to_delete() item.confirm_removal() self.assertFalse(item.exists()) def test_delete_item_without_confirmation_that_will_be_destroyed(self): item = self.main_view.select_single( listitems.Standard, objectName='listitem_destroyed_on_remove_without_confirm') item.swipe_to_delete() self.assertFalse(item.exists()) class ExpandableTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_listitems.ExpandableTestCase.qml') def setUp(self): super().setUp() self.test_expandable = self.main_view.select_single( listitems.Expandable, objectName='expandable0') def test_expand_item(self): self.test_expandable.expand() self.assertTrue(self.test_expandable.expanded) def test_expand_already_expanded_item_must_do_nothing(self): self.test_expandable.expand() # Replace the pointer with None, so we make sure it's not being called. with mock.patch.object(self.test_expandable, 'pointing_device', None): self.test_expandable.expand() def test_collapse_item(self): self.test_expandable.expand() self.test_expandable.collapse() self.assertFalse(self.test_expandable.expanded) def test_collapse_already_collapsed_item_must_do_nothing(self): self.test_expandable.collapse() # Replace the pointer with None, so we make sure it's not being called. with mock.patch.object(self.test_expandable, 'pointing_device', None): self.test_expandable.collapse() ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/__init__.py0000644000015600001650000000000012700370701027267 0ustar jenkinsjenkins./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_checkbox.py0000644000015600001650000000764612700370701030404 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2013-2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import time from autopilot import input from testtools.matchers import GreaterThan, LessThan from unittest import mock import ubuntuuitoolkit from ubuntuuitoolkit import tests TEST_QML_WITH_CHECKBOX = (""" import QtQuick 2.0 import Ubuntu.Components 1.0 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Item { CheckBox { checked: false objectName: "test_checkbox" } } } """) TEST_QML_WITH_SWITCH = (""" import QtQuick 2.0 import Ubuntu.Components 1.0 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Item { Switch { checked: false objectName: "test_switch" } } } """) class ToggleTestCase(tests.QMLStringAppTestCase): scenarios = [ ('checkbox', dict( test_qml=TEST_QML_WITH_CHECKBOX, objectName='test_checkbox')), ('switch', dict( test_qml=TEST_QML_WITH_SWITCH, objectName='test_switch')) ] def setUp(self): super().setUp() self.toggle = self.main_view.select_single( ubuntuuitoolkit.CheckBox, objectName=self.objectName) self.assertFalse(self.toggle.checked) def test_toggle_custom_proxy_object(self): self.assertIsInstance(self.toggle, ubuntuuitoolkit.CheckBox) def test_check_toggle(self): self.toggle.check() self.assertTrue(self.toggle.checked) def test_check_toggle_already_checked(self): self.toggle.check() with mock.patch.object(input.Pointer, 'click_object') as mock_click: self.toggle.check() self.assertFalse(mock_click.called) def test_uncheck_toggle(self): self.toggle.check() self.toggle.uncheck() self.assertFalse(self.toggle.checked) def test_uncheck_toggle_already_unchecked(self): with mock.patch.object(input.Pointer, 'click_object') as mock_click: self.toggle.uncheck() self.assertFalse(mock_click.called) def test_change_state_from_checked(self): self.toggle.check() self.toggle.change_state() self.assertFalse(self.toggle.checked) def test_change_state_from_unchecked(self): self.toggle.change_state() self.assertTrue(self.toggle.checked) def test_check_with_timeout(self): with mock.patch.object( ubuntuuitoolkit.CheckBox, 'change_state') as mock_change: self.toggle.check(timeout=1) mock_change.assert_called_once_with(1) def test_uncheck_with_timeout(self): self.toggle.check() with mock.patch.object( ubuntuuitoolkit.CheckBox, 'change_state') as mock_change: self.toggle.uncheck(timeout=1) mock_change.assert_called_once_with(1) def test_change_state_with_timeout(self): with mock.patch.object(self.toggle, 'pointing_device'): # mock the pointing device so the checkbox is not clicked. timestamp_before_call = time.time() self.assertRaises(AssertionError, self.toggle.change_state, 1) waiting_time = time.time() - timestamp_before_call self.assertThat(waiting_time, GreaterThan(1)) self.assertThat(waiting_time, LessThan(2)) ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_flickable_uitk10.py0000644000015600001650000002532712700370701031723 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014-2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from unittest import mock import testtools import ubuntuuitoolkit from ubuntuuitoolkit import ( tests, units, ) from ubuntuuitoolkit._custom_proxy_objects import _flickable class FlickableTestCase(testtools.TestCase): def test_is_flickable_with_flicking_property_must_return_true(self): """is_flickable returns True if flickable property exists.""" dummy_id = (0, 0) dummy_flicking = (0, 'dummy') state_with_flicking = {'id': dummy_id, 'flicking': dummy_flicking} element = ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase( state_with_flicking, '/dummy'.encode(), 'dummy') with element.no_automatic_refreshing(): self.assertTrue(element.is_flickable()) def test_is_flickable_without_flicking_property_must_return_false(self): """is_flickable returns False if flickable property doesn't exist.""" dummy_id = (0, 0) state_without_flicking = {'id': dummy_id} element = ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase( state_without_flicking, '/dummy'.encode(), 'dummy') with element.no_automatic_refreshing(): self.assertFalse(element.is_flickable()) class IsFlickableTestCase(tests.QMLStringAppTestCase): """Functional test to check that is_flickable returns the right value. We already have tests for is_flickable with mocks, so here we just check with some real elements. """ test_qml = (""" import QtQuick 2.0 import Ubuntu.Components 1.0 import Ubuntu.Components.ListItems 1.0 as ListItem MainView { objectName: 'mainView' width: units.gu(48) height: units.gu(60) Flickable { objectName: 'flickable' } ListView { objectName: 'listView' } Label { objectName: 'label' } } """) scenarios = [ ('main view', dict(object_name='mainView', is_flickable=False)), ('flickable', dict(object_name='flickable', is_flickable=True)), ('list view', dict(object_name='listView', is_flickable=True)), ('label', dict(object_name='label', is_flickable=False)) ] def test_is_flickable(self): """Test that is_flickable identifies the elements correctly.""" element = self.app.select_single(objectName=self.object_name) self.assertEqual(element.is_flickable(), self.is_flickable) class SwipeFlickableTestCase(tests.QMLStringAppTestCase): test_qml = (""" import QtQuick 2.0 import Ubuntu.Components 1.0 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Label { id: clickedLabel objectName: "clickedLabel" text: "No element clicked." } Flickable { anchors { fill: parent topMargin: clickedLabel.height // It can't be at the bottom, or the toolbar will be opened // when we try to click it. bottomMargin: units.gu(10) } objectName: 'flickable' height: units.gu(60) contentHeight: bottomButton.y + bottomButton.height Button { id: topButton objectName: 'topButton' text: 'Top button' onClicked: clickedLabel.text = objectName } Rectangle { id: emptyRectangle height: units.gu(80) anchors.top: topButton.bottom } Button { id: bottomButton objectName: 'bottomButton' text: 'Bottom button' onClicked: clickedLabel.text = objectName anchors.top: emptyRectangle.bottom } } } """) def setUp(self): super().setUp() self.flickable = self.main_view.select_single( ubuntuuitoolkit.QQuickFlickable, objectName='flickable') self.label = self.main_view.select_single( 'Label', objectName='clickedLabel') self.assertEqual(self.label.text, 'No element clicked.') def test_swipe_into_view_bottom_element(self): self.main_view.close_toolbar() button = self.main_view.select_single(objectName='bottomButton') button.swipe_into_view() self.pointing_device.click_object(button) self.assertEqual(self.label.text, 'bottomButton') def test_swipe_into_view_top_element(self): self.main_view.close_toolbar() bottomButton = self.main_view.select_single(objectName='bottomButton') bottomButton.swipe_into_view() topButton = self.main_view.select_single(objectName='topButton') topButton.swipe_into_view() self.pointing_device.click_object(topButton) self.assertEqual(self.label.text, 'topButton') def test_swipe_to_top_must_leave_flickable_at_y_beginning(self): self.flickable.swipe_to_bottom() self.assertFalse(self.flickable.atYBeginning) self.flickable.swipe_to_top() self.assertTrue(self.flickable.atYBeginning) def test_swipe_to_bottom_must_leave_flickable_at_y_end(self): self.flickable.swipe_to_top() self.assertFalse(self.flickable.atYEnd) self.flickable.swipe_to_bottom() self.assertTrue(self.flickable.atYEnd) def test_swipe_to_show_more_above_with_containers(self): """Swipe to show more above must receive containers as parameter.""" self.flickable.swipe_to_bottom() self.assertTrue(self.flickable.atYEnd) containers = self.flickable._get_containers() self.flickable.swipe_to_show_more_above(containers) self.assertFalse(self.flickable.atYEnd) def test_swipe_to_show_more_above_without_arguments(self): """Calling swipe to show more above must get containers by default.""" self.flickable.swipe_to_bottom() self.assertTrue(self.flickable.atYEnd) self.flickable.swipe_to_show_more_above() self.assertFalse(self.flickable.atYEnd) def test_swipe_to_show_more_below_with_containers(self): """Swipe to show more below must receive containers as parameter.""" self.flickable.swipe_to_top() self.assertTrue(self.flickable.atYBeginning) containers = self.flickable._get_containers() self.flickable.swipe_to_show_more_below(containers) self.assertFalse(self.flickable.atYBeginning) def test_swipe_to_show_more_below_without_arguments(self): """Calling swipe to show more below must get containers by default.""" self.flickable.swipe_to_top() self.assertTrue(self.flickable.atYBeginning) self.flickable.swipe_to_show_more_below() self.assertFalse(self.flickable.atYBeginning) def test_swipe_to_show_more_below_with_bottom_margin(self): """Calling swipe to show more below will use the margin in the drag.""" qquickflickable = self.main_view.select_single( ubuntuuitoolkit.QQuickFlickable, objectName='flickable') qquickflickable.margin_to_swipe_from_bottom = units.gu(6) containers = qquickflickable._get_containers() bottom = _flickable._get_visible_container_bottom(containers) with mock.patch.object( qquickflickable.pointing_device, 'drag') as mock_drag: try: qquickflickable.swipe_to_show_more_below() except ubuntuuitoolkit.ToolkitException: # An exception will be raised because the drag was faked. pass mock_drag.assert_called_with( mock.ANY, bottom - units.gu(6), mock.ANY, mock.ANY, rate=mock.ANY) def test_swipe_to_show_more_above_with_top_margin(self): """Calling swipe to show more above will use the margin in the drag.""" qquickflickable = self.main_view.select_single( ubuntuuitoolkit.QQuickFlickable, objectName='flickable') qquickflickable.margin_to_swipe_from_top = units.gu(6) containers = qquickflickable._get_containers() top = _flickable._get_visible_container_top(containers) qquickflickable.swipe_to_bottom() with mock.patch.object( qquickflickable.pointing_device, 'drag') as mock_drag: try: qquickflickable.swipe_to_show_more_above() except ubuntuuitoolkit.ToolkitException: # An exception will be raised because the drag was faked. pass mock_drag.assert_called_with( mock.ANY, top + units.gu(6), mock.ANY, mock.ANY, rate=mock.ANY) def test_failed_drag_must_raise_exception(self): dummy_coordinates = (0, 0, 10, 10) # Patch the pointing device so it does nothing and the swipe fails. with mock.patch.object(self.flickable, 'pointing_device'): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.flickable._slow_drag, *dummy_coordinates ) self.assertEqual('Could not swipe in the flickable.', str(error)) class UnityFlickableTestCase(tests.QMLStringAppTestCase): test_qml = (""" import QtQuick 2.0 import Ubuntu.Components 1.0 MainView { width: units.gu(48) height: units.gu(60) objectName: 'mainView' Flickable { objectName: 'testFlickable' width: 200; height: 200 contentWidth: image.width; contentHeight: image.height } } """) def get_command_line(self, command_line): command_line.append('-engine') return command_line def test_get_unity_top_container(self): """Test that we can get the top cointainer in Unity.""" # This tests bug http://pad.lv/1314390 # On Unity, the top container is not the first child as it is in all # the apps that have a MainView. This makes the first implementation of # _get_top_container fail. Instead of going from the top looking for # a container, we should start from the flickable until we find the # top-most container. test_flickable = self.app.select_single( ubuntuuitoolkit.QQuickFlickable, objectName='testFlickable') top_container = test_flickable._get_top_container() self.assertIsInstance(top_container, ubuntuuitoolkit.MainView) ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_actionbar.py0000644000015600001650000000417112700370701030546 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import os import ubuntuuitoolkit from ubuntuuitoolkit import tests class ActionBarTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_actionbar.ActionBarTestCase.qml') def setUp(self): super().setUp() self.actionbar = self.app.select_single( 'ActionBar', objectName='ActionBar') self.label = self.app.select_single(objectName='Label') self.assertEqual(self.label.text, 'No action triggered.') def test_custom_proxy_object(self): self.assertIsInstance(self.actionbar, ubuntuuitoolkit.ActionBar) self.assertTrue(self.actionbar.visible) def test_click_action_button(self): self.actionbar.click_action_button('Action1') self.assertEqual(self.label.text, 'Action 1 triggered.') def test_click_overflow_action_button(self): # Action1 is directly the ActionBar, Action2 and Action3 # are in the overflow panel. self.actionbar.click_action_button('Action3') self.assertEqual(self.label.text, 'Action 3 triggered.') def test_click_unexisting_action_button(self): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.actionbar.click_action_button, 'unexisting') self.assertEqual( str(error), 'Button not found in ActionBar or overflow') ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_dialog.DialogTestCase.qml0000644000015600001650000000450612700370701033040 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Popups 0.1 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" automaticOrientation: true Page { Component { id: dialog Dialog { id: dialogue title: "Dialog" text: "Simple dialog with text area and three stacked button" Column { id: row width: parent.width spacing: units.gu(1) TextArea { height: parent.height/2 objectName: "textfield_standard" placeholderText: i18n.tr("Type me in...") width: parent.width } Button { width: parent.width text: "Bellow TextField" color: UbuntuColors.green onClicked: PopupUtils.close(dialogue) } Button { width: parent.width text: "Middle button" onClicked: PopupUtils.close(dialogue) } Button { width: parent.width text: "Lower button" onClicked: PopupUtils.close(dialogue) } } } } Button { objectName: "button" anchors.centerIn: parent text: i18n.tr("Open dialog") onClicked: PopupUtils.open(dialog, null) } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_textfield.py0000644000015600001650000000742512700370701030601 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2013-2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import os from unittest import mock import ubuntuuitoolkit from ubuntuuitoolkit import tests class TextFieldTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) qml_file_path_1_0 = os.path.join( dir_path, 'test_textfield.1.0.qml') qml_file_path_1_3 = os.path.join( dir_path, 'test_textfield.1.3.qml') scenarios = [ ('1.0', dict(test_qml_file_path=qml_file_path_1_0)), ('1.3', dict(test_qml_file_path=qml_file_path_1_3)), ] def setUp(self): super().setUp() self.simple_text_field = self.main_view.select_single( ubuntuuitoolkit.TextField, objectName='simple_text_field') def test_text_field_custom_proxy_object(self): self.assertIsInstance( self.simple_text_field, ubuntuuitoolkit.TextField) def test_write(self): self.simple_text_field.write('test') self.assertEqual(self.simple_text_field.text, 'test') def test_clear_with_clear_button(self): self.simple_text_field.write('test') self.simple_text_field.clear() self.assertEqual(self.simple_text_field.text, '') def test_clear_without_clear_button(self): text_field = self.main_view.select_single( ubuntuuitoolkit.TextField, objectName='text_field_without_clear_button') text_field.write('test') text_field.clear() self.assertEqual(text_field.text, '') def test_clear_and_write(self): self.simple_text_field.write('test1') self.simple_text_field.write('test2') self.assertEqual(self.simple_text_field.text, 'test2') def test_write_without_clear(self): self.simple_text_field.write('test1') self.simple_text_field.write('test2', clear=False) self.assertEqual(self.simple_text_field.text, 'test1test2') def test_write_without_clear_writes_at_the_end(self): self.simple_text_field.write( 'long text that will fill more than half of the text field.') self.simple_text_field.write('append', clear=False) self.assertEqual( self.simple_text_field.text, 'long text that will fill more than half of the text field.append') def test_is_empty(self): self.assertTrue(self.simple_text_field.is_empty()) self.simple_text_field.write('test') self.assertFalse(self.simple_text_field.is_empty()) def test_select_all_selects_all_text(self): self.simple_text_field.write('Text to select.') self.simple_text_field._select_all() self.assertTrue(self.simple_text_field._is_all_text_selected()) def test_select_all_when_already_selected_must_do_nothing(self): """Test for select all the text when it's already selected.""" self.simple_text_field.write('Text to select.') self.simple_text_field._select_all() with mock.patch.object( self.simple_text_field, 'pointing_device') as mock_device: self.simple_text_field._select_all() self.assertFalse(mock_device.called) ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_header.SectionsTestCase.qml0000644000015600001650000000256512700370701033424 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Page { id: page title: "Test title" Column { spacing: units.gu(1) width: childrenRect.width anchors.centerIn: parent Label { text: "Sections enabled" } Switch { id: sectionsEnabledSWitch objectName: "sections_enabled_switch" checked: page.head.sections.enabled onCheckedChanged: page.head.sections.enabled = checked } } head { sections.model: ["one", "two", "three"] } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_tabs.TabsTestCase.new_header.qml0000644000015600001650000000223512700370701034321 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.1 MainView { width: units.gu(70) height: units.gu(60) useDeprecatedToolbar: false objectName: "mainView" Tabs { id: tabs Tab { objectName: "tab1" title: "Tab1" page: Page { } } Tab { objectName: "tab2" title: "Tab2" page: Page { } } Tab { objectName: "tab3" title: "Tab3" page: Page { } } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_optionselector.py0000644000015600001650000001561412700370701031661 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2013, 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import ubuntuuitoolkit from ubuntuuitoolkit import tests class OptionSelectorCustomDelegateTestCase(tests.QMLStringAppTestCase): test_qml = (""" import QtQuick 2.0 import Ubuntu.Components 1.0 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Page{ Column { anchors.left: parent.left anchors.right: parent.right anchors.fill: parent spacing: units.gu(3) Component { id: valueSelectorDelegate OptionSelectorDelegate { text: label objectName: name } } ListModel { id: valueModel ListElement { name: "one"; label: "Value 1" } ListElement { name: "two"; label: "Value 2" } ListElement { name: "three"; label: "Value 3" } ListElement { name: "four"; label: "Value 4" } ListElement { name: "five"; label: "Value 5" } } OptionSelector { id: valueSelector objectName: "test_option_selector_collapsed" text: "Collapsed" delegate: valueSelectorDelegate model: valueModel } } } } """) def setUp(self): super().setUp() self.option_selector = self.main_view.select_single( ubuntuuitoolkit.OptionSelector, objectName="test_option_selector_collapsed") def test_get_option_count(self): """get_option_count() must return number of options""" self.assertEqual(self.option_selector.get_option_count(), 5) def test_expand(self): """expand() must expand a collapsed option elector""" self.assertFalse(self.option_selector.currentlyExpanded) self.option_selector._expand() self.assertTrue(self.option_selector.currentlyExpanded) def test_negative_select_text(self): """select_text() must raise a ValueError if text does not exist""" error = self.assertRaises( ubuntuuitoolkit.ToolkitException, lambda: self.option_selector.select_option(text="this should fail") ) self.assertEqual( "OptionSelectorDelegate with kwargs {'text': 'this should fail'}" " not found", str(error) ) def test_select_option(self): """select_text() must select the text in the OptionSelector""" self.option_selector.select_option(objectName="three") self.assertEqual(2, self.option_selector.selectedIndex) def test_get_selected_text(self): """get_selected_text() must return the text selected item""" self.option_selector.select_option(text="Value 2") self.assertEqual(1, self.option_selector.selectedIndex) self.assertEqual( self.option_selector.get_selected_text(), "Value 2") def test_same_item_2_times(self): """Emulator must be able to select 2 items in a row""" self.option_selector.select_option(text="Value 3") self.assertEqual( self.option_selector.get_selected_text(), "Value 3") self.assertEqual(2, self.option_selector.selectedIndex) self.option_selector.select_option(text="Value 3") self.assertEqual( self.option_selector.get_selected_text(), "Value 3") self.assertEqual(2, self.option_selector.selectedIndex) class OptionSelectorTestCase(tests.QMLStringAppTestCase): test_qml = (""" import QtQuick 2.0 import Ubuntu.Components 1.0 MainView { width: units.gu(48) height: units.gu(120) objectName: "mainView" Column { anchors.fill: parent anchors.left: parent.left anchors.right: parent.right spacing: units.gu(3) OptionSelector { objectName: "option_selector" text: i18n.tr("option_selector") expanded: true model: [i18n.tr("Red"), i18n.tr("Blue"), i18n.tr("Green"), i18n.tr("Yellow"), i18n.tr("Black")] } } } """) def setUp(self): super().setUp() self.option_selector = self.main_view.select_single( ubuntuuitoolkit.OptionSelector, objectName="option_selector") def test_get_option_count(self): """get_option_count() must return number of options""" self.assertEqual(self.option_selector.get_option_count(), 5) def test_negative_select_text(self): """select_text() must raise a ValueError if object and text does not exist""" error = self.assertRaises( ubuntuuitoolkit.ToolkitException, lambda: self.option_selector.select_option('Label', text="this should fail") ) self.assertEqual( "OptionSelectorDelegate with args ('Label',) and kwargs {'text': " "'this should fail'} not found", str(error) ) def test_select_option(self): """select_text() must select the text in the OptionSelector""" self.option_selector.select_option('Label', text="Green") self.assertEqual(2, self.option_selector.selectedIndex) def test_get_selected_text(self): """get_selected_text() must return the text selected item""" self.option_selector.select_option('Label', text="Blue") self.assertEqual(1, self.option_selector.selectedIndex) self.assertEqual( self.option_selector.get_selected_text(), "Blue") def test_same_item_2_times(self): """Emulator must be able to select 2 items in a row""" self.option_selector.select_option('Label', text="Green") self.assertEqual( self.option_selector.get_selected_text(), "Green") self.assertEqual(2, self.option_selector.selectedIndex) self.option_selector.select_option('Label', text="Green") self.assertEqual( self.option_selector.get_selected_text(), "Green") self.assertEqual(2, self.option_selector.selectedIndex) ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_listitems.ExpandableTestCase.qml0000644000015600001650000000410512700370701034455 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Column { anchors.fill: parent Repeater { model: 2 Expandable { id: expandingItem objectName: "expandable" + index expandedHeight: contentCol.height + units.gu(1) onClicked: { expanded = !expanded; } Column { id: contentCol anchors { left: parent.left; right: parent.right } Item { anchors { left: parent.left; right: parent.right} height: expandingItem.collapsedHeight Label { anchors { left: parent.left right: parent.right verticalCenter: parent.verticalCenter } text: "Item " + index } } UbuntuShape { objectName: "shape" + index anchors { left: parent.left; right: parent.right } height: units.gu(6) } } } } } } ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootroot./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_qquickgridview.QQuickGridViewTestCase.qml./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_qquickgridview.QQuickGridViewTestC0000644000015600001650000000223612700370701035013 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 0.1 as ListItems MainView { width: units.gu(60) height: units.gu(80) objectName: 'mainView' GridView { objectName: 'testListView' anchors.fill: parent clip: true model: 20 delegate: ListItems.Standard { objectName: 'testListElement%1'.arg(index) text: 'test list element %1'.arg(index) height: units.gu(5) width: units.gu(15) } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_main_view.py0000644000015600001650000001345312700370701030565 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2013-2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from unittest import mock import ubuntuuitoolkit from ubuntuuitoolkit import tests class MainView10TestCase(tests.QMLStringAppTestCase): test_qml = (""" import QtQuick 2.0 import Ubuntu.Components 1.0 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" } """) def test_main_view_custom_proxy_object(self): self.assertIsInstance(self.main_view, ubuntuuitoolkit.MainView) def test_get_header_without_header(self): header = self.main_view.get_header() self.assertFalse(header.visible) def test_toolbar_custom_proxy_object(self): toolbar = self.main_view.get_toolbar() self.assertIsInstance(toolbar, ubuntuuitoolkit.Toolbar) def test_open_toolbar(self): with mock.patch.object(ubuntuuitoolkit.Toolbar, 'open') as mock_open: self.main_view.open_toolbar() mock_open.assert_called_once_with() def test_close_toolbar(self): with mock.patch.object(ubuntuuitoolkit.Toolbar, 'close') as mock_close: self.main_view.close_toolbar() mock_close.assert_called_once_with() def test_open_toolbar_returns_the_toolbar(self): toolbar = self.main_view.open_toolbar() self.assertIsInstance(toolbar, ubuntuuitoolkit.Toolbar) def test_get_tabs_without_tabs(self): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.main_view.get_tabs) self.assertEqual( str(error), 'The MainView has no Tabs.') def test_switch_to_next_tab_without_tabs(self): header = self.main_view.get_header() error = self.assertRaises( ubuntuuitoolkit.ToolkitException, header.switch_to_next_tab) self.assertEqual( str(error), 'The MainView has no Tabs.') class MainView12TestCase(tests.QMLStringAppTestCase): test_qml = (""" import QtQuick 2.3 import Ubuntu.Components 1.2 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" } """) def test_main_view_custom_proxy_object(self): self.assertIsInstance(self.main_view, ubuntuuitoolkit.MainView) def test_get_header_without_header(self): header = self.main_view.get_header() self.assertFalse(header.visible) def test_get_tabs_without_tabs(self): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.main_view.get_tabs) self.assertEqual( str(error), 'The MainView has no Tabs.') def test_switch_to_next_tab_without_tabs(self): header = self.main_view.get_header() error = self.assertRaises( ubuntuuitoolkit.ToolkitException, header.switch_to_next_tab) self.assertEqual( str(error), 'The MainView has no Tabs.') def test_get_toolbar_without_toolbar(self): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.main_view.get_toolbar) self.assertEqual( str(error), 'The MainView has no Toolbar.') def test_open_toolbar_without_toolbar(self): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.main_view.open_toolbar) self.assertEqual( str(error), 'The MainView has no Toolbar.') def test_close_toolbar_without_toolbar(self): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.main_view.close_toolbar) self.assertEqual( str(error), 'The MainView has no Toolbar.') TEST_GO_BACK_QML_FORMAT = (""" import QtQuick 2.0 import Ubuntu.Components 1.0 MainView {{ width: units.gu(48) height: units.gu(60) objectName: "mainView" useDeprecatedToolbar: {use_deprecated_toolbar} PageStack {{ id: pageStack Component.onCompleted: push(page0) Page {{ id: page0 title: "Page 0" visible: false Button {{ objectName: "go_to_page1" text: "Go to page 1" onClicked: pageStack.push(page1) }} }} Page {{ id: page1 title: "Page 1" visible: false }} }} }} """) class GoBackTestCase(tests.QMLStringAppTestCase): scenarios = [ ('back in toolbar', dict( test_qml=TEST_GO_BACK_QML_FORMAT.format( use_deprecated_toolbar='true'))), ('back in header', dict( test_qml=TEST_GO_BACK_QML_FORMAT.format( use_deprecated_toolbar='false'))) ] def setUp(self): super().setUp() self.header = self.main_view.get_header() self.assertEqual(self.header.title, 'Page 0') def test_open_page(self): self._go_to_page1() self.assertEqual(self.header.title, 'Page 1') def _go_to_page1(self): button = self.main_view.select_single( 'Button', objectName='go_to_page1') self.pointing_device.click_object(button) self.header.wait_for_animation() def test_go_back(self): self._go_to_page1() self.main_view.go_back() self.assertEqual(self.header.title, 'Page 0') ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_listitem.ListItemTestCase.qml0000644000015600001650000000472312700370701033767 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.2 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Page { id: testPage objectName: "test_page" title: listView.ViewItems.selectMode ? "In selection mode" : "No action triggered" ListView { id: listView objectName: "test_view" anchors.fill: parent model: 25 delegate: ListItem { objectName: "listitem" + index onPressAndHold: listView.ViewItems.selectMode = true leadingActions: ListItemActions { actions: [ Action { iconName: "delete" objectName: 'delete_action' onTriggered: testPage.title = objectName + " action triggered"; } ] } trailingActions: ListItemActions { actions: [ Action { iconName: "search" objectName: 'search_action' onTriggered: testPage.title = objectName + " action triggered"; }, Action { iconName: "edit" objectName: 'edit_action' onTriggered: testPage.title = objectName + " action triggered"; }, Action { iconName: "email" objectName: 'email_action' onTriggered: testPage.title = objectName + " action triggered"; } ] } } } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_pull_to_refresh.qml0000644000015600001650000000540212700370701032137 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 as ListItem MainView { id: root width: units.gu(48) height: units.gu(60) objectName: "mainView" ListModel { id: listModel property bool refreshing: refreshComplete.running function modelData(index) { return {'name': 'line #' + index} } function reload() { refreshComplete.restart(); refreshedLabel.text = 'Refreshed.' } function fillModel() { clear(); for (var i = 0; i < 50; i++) { append(modelData(i)); } } Component.onCompleted: fillModel() } Timer { id: refreshComplete interval: 1000 onTriggered: { listModel.fillModel(); } } Column { anchors.fill: parent Label { id: refreshedLabel objectName: 'refreshedLabel' text: 'Not refreshed.' } Flickable { id: view objectName: 'flickableWithPullToRefresh' width: parent.width height: parent.height - refreshedLabel.paintedHeight clip: true contentWidth: column.childrenRect.width contentHeight: column.childrenRect.height Column { id: column Repeater { model: listModel ListItem.Standard { width: root.width height: units.gu(5) text: index + ' - ' + modelData onClicked: { listModel.reload(); } } } } PullToRefresh { id: pullToRefresh objectName: 'InFlickable' parent: view refreshing: listModel.refreshing onRefresh: listModel.reload() } } Flickable { objectName: 'flickableWithoutPullToRefresh' } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_flickable.py0000644000015600001650000003733712700370701030532 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2016 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from unittest import mock import testtools import ubuntuuitoolkit from ubuntuuitoolkit import ( tests, units, ) from ubuntuuitoolkit._custom_proxy_objects import _flickable class FlickableTestCase(testtools.TestCase): def test_is_flickable_with_flicking_property_must_return_true(self): """is_flickable returns True if flickable property exists.""" dummy_id = (0, 0) dummy_flicking = (0, 'dummy') state_with_flicking = {'id': dummy_id, 'flicking': dummy_flicking} element = ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase( state_with_flicking, '/dummy'.encode(), 'dummy') with element.no_automatic_refreshing(): self.assertTrue(element.is_flickable()) def test_is_flickable_without_flicking_property_must_return_false(self): """is_flickable returns False if flickable property doesn't exist.""" dummy_id = (0, 0) state_without_flicking = {'id': dummy_id} element = ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase( state_without_flicking, '/dummy'.encode(), 'dummy') with element.no_automatic_refreshing(): self.assertFalse(element.is_flickable()) class IsFlickableTestCase(tests.QMLStringAppTestCase): """Functional test to check that is_flickable returns the right value. We already have tests for is_flickable with mocks, so here we just check with some real elements. """ test_qml = (""" import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { objectName: 'mainView' width: units.gu(48) height: units.gu(60) Flickable { objectName: 'flickable' } ListView { objectName: 'listView' } Label { objectName: 'label' } } """) scenarios = [ ('main view', dict(object_name='mainView', is_flickable=False)), ('flickable', dict(object_name='flickable', is_flickable=True)), ('list view', dict(object_name='listView', is_flickable=True)), ('label', dict(object_name='label', is_flickable=False)) ] def test_is_flickable(self): """Test that is_flickable identifies the elements correctly.""" element = self.app.select_single(objectName=self.object_name) self.assertEqual(element.is_flickable(), self.is_flickable) # FIXME: Only left-to-right (where x=0 is leftmost) layouts are taken into # account. Add support for horizontal flicking with right-to-left layouts. class SwipeFlickableTestCase(tests.QMLStringAppTestCase): test_qml = (""" import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Label { id: clickedLabel objectName: "clickedLabel" text: "No element clicked." } Flickable { anchors { fill: parent topMargin: clickedLabel.height } objectName: 'flickable' height: units.gu(60) contentHeight: bottomButton.y + bottomButton.height contentWidth: topRightButton.x + Math.max(topRightButton.width, bottomRightButton.width) Button { id: topButton objectName: 'topButton' text: 'Top button' onClicked: clickedLabel.text = objectName } Rectangle { id: emptyRectangle width: units.gu(70) height: units.gu(80) anchors.top: topButton.bottom } Button { id: bottomButton objectName: 'bottomButton' text: 'Bottom button' onClicked: clickedLabel.text = objectName anchors.top: emptyRectangle.bottom } Button { id: topRightButton objectName: 'topRightButton' text: 'Top-right button' onClicked: clickedLabel.text = objectName anchors { top: parent.top left: emptyRectangle.right } } Button { id: bottomRightButton objectName: 'bottomRightButton' text: 'Bottom-right button' onClicked: clickedLabel.text = objectName anchors { top: emptyRectangle.bottom left: emptyRectangle.right } } } } """) def setUp(self): super().setUp() self.flickable = self.main_view.select_single( ubuntuuitoolkit.QQuickFlickable, objectName='flickable') self.label = self.main_view.select_single(objectName='clickedLabel') self.assertEqual(self.label.text, 'No element clicked.') def test_swipe_into_view_bottom_element(self): button = self.main_view.select_single(objectName='bottomButton') button.swipe_into_view() self.pointing_device.click_object(button) self.assertEqual(self.label.text, 'bottomButton') def test_swipe_into_view_top_element(self): bottomButton = self.main_view.select_single(objectName='bottomButton') bottomButton.swipe_into_view() topButton = self.main_view.select_single(objectName='topButton') topButton.swipe_into_view() self.pointing_device.click_object(topButton) self.assertEqual(self.label.text, 'topButton') def test_swipe_into_view_bottom_right_element(self): bottomRightButton = self.main_view.select_single( objectName='bottomRightButton') bottomRightButton.swipe_into_view() self.pointing_device.click_object(bottomRightButton) self.assertEqual(self.label.text, 'bottomRightButton') def test_swipe_into_view_top_right_element(self): topRightButton = self.main_view.select_single( objectName='topRightButton') topRightButton.swipe_into_view() self.pointing_device.click_object(topRightButton) self.assertEqual(self.label.text, 'topRightButton') def test_swipe_to_top_must_leave_flickable_at_y_beginning(self): self.flickable.swipe_to_bottom() self.assertFalse(self.flickable.atYBeginning) self.flickable.swipe_to_top() self.assertTrue(self.flickable.atYBeginning) def test_swipe_to_bottom_must_leave_flickable_at_y_end(self): self.flickable.swipe_to_top() self.assertFalse(self.flickable.atYEnd) self.flickable.swipe_to_bottom() self.assertTrue(self.flickable.atYEnd) def test_swipe_to_leftmost_must_leave_flickable_at_x_beginning(self): self.flickable.swipe_to_rightmost() self.assertFalse(self.flickable.atXBeginning) self.flickable.swipe_to_leftmost() self.assertTrue(self.flickable.atXBeginning) def test_swipe_to_rightmost_must_leave_flickable_at_x_end(self): self.flickable.swipe_to_leftmost() self.assertFalse(self.flickable.atXEnd) self.flickable.swipe_to_rightmost() self.assertTrue(self.flickable.atXEnd) def test_swipe_to_show_more_above_with_containers(self): """Swipe to show more above must receive containers as parameter.""" self.flickable.swipe_to_bottom() self.assertTrue(self.flickable.atYEnd) containers = self.flickable._get_containers() self.flickable.swipe_to_show_more_above(containers) self.assertFalse(self.flickable.atYEnd) def test_swipe_to_show_more_above_without_arguments(self): """Calling swipe to show more above must get containers by default.""" self.flickable.swipe_to_bottom() self.assertTrue(self.flickable.atYEnd) self.flickable.swipe_to_show_more_above() self.assertFalse(self.flickable.atYEnd) def test_swipe_to_show_more_below_with_containers(self): """Swipe to show more below must receive containers as parameter.""" self.flickable.swipe_to_top() self.assertTrue(self.flickable.atYBeginning) containers = self.flickable._get_containers() self.flickable.swipe_to_show_more_below(containers) self.assertFalse(self.flickable.atYBeginning) def test_swipe_to_show_more_below_without_arguments(self): """Calling swipe to show more below must get containers by default.""" self.flickable.swipe_to_top() self.assertTrue(self.flickable.atYBeginning) self.flickable.swipe_to_show_more_below() self.assertFalse(self.flickable.atYBeginning) def test_swipe_to_show_more_left_with_containers(self): """Swipe to show more left must receive containers as parameter.""" self.flickable.swipe_to_rightmost() self.assertTrue(self.flickable.atXEnd) containers = self.flickable._get_containers() self.flickable.swipe_to_show_more_left(containers) self.assertFalse(self.flickable.atXEnd) def test_swipe_to_show_more_left_without_arguments(self): """Calling swipe to show more left must get containers by default.""" self.flickable.swipe_to_rightmost() self.assertTrue(self.flickable.atXEnd) self.flickable.swipe_to_show_more_left() self.assertFalse(self.flickable.atXEnd) def test_swipe_to_show_more_right_with_containers(self): """Swipe to show more right must receive containers as parameter.""" self.flickable.swipe_to_leftmost() self.assertTrue(self.flickable.atXBeginning) containers = self.flickable._get_containers() self.flickable.swipe_to_show_more_right(containers) self.assertFalse(self.flickable.atXBeginning) def test_swipe_to_show_more_right_without_arguments(self): """Calling swipe to show more right must get containers by default.""" self.flickable.swipe_to_leftmost() self.assertTrue(self.flickable.atXBeginning) self.flickable.swipe_to_show_more_right() self.assertFalse(self.flickable.atXBeginning) def test_swipe_to_show_more_below_with_bottom_margin(self): """Calling swipe to show more below will use the margin in the drag.""" qquickflickable = self.main_view.select_single( ubuntuuitoolkit.QQuickFlickable, objectName='flickable') qquickflickable.margin_to_swipe_from_bottom = units.gu(6) containers = qquickflickable._get_containers() bottom = _flickable._get_visible_container_bottom(containers) with mock.patch.object( qquickflickable.pointing_device, 'drag') as mock_drag: try: qquickflickable.swipe_to_show_more_below() except ubuntuuitoolkit.ToolkitException: # An exception will be raised because the drag was faked. pass mock_drag.assert_called_with( mock.ANY, bottom - units.gu(6), mock.ANY, mock.ANY, rate=mock.ANY) def test_swipe_to_show_more_above_with_top_margin(self): """Calling swipe to show more above will use the margin in the drag.""" qquickflickable = self.main_view.select_single( ubuntuuitoolkit.QQuickFlickable, objectName='flickable') qquickflickable.margin_to_swipe_from_top = units.gu(6) containers = qquickflickable._get_containers() top = _flickable._get_visible_container_top(containers) qquickflickable.swipe_to_bottom() with mock.patch.object( qquickflickable.pointing_device, 'drag') as mock_drag: try: qquickflickable.swipe_to_show_more_above() except ubuntuuitoolkit.ToolkitException: # An exception will be raised because the drag was faked. pass mock_drag.assert_called_with( mock.ANY, top + units.gu(6), mock.ANY, mock.ANY, rate=mock.ANY) def test_swipe_to_show_more_right_with_right_margin(self): """Calling swipe to show more right will use the margin in the drag.""" qquickflickable = self.main_view.select_single( ubuntuuitoolkit.QQuickFlickable, objectName='flickable') qquickflickable.margin_to_swipe_from_right = units.gu(6) containers = qquickflickable._get_containers() rightmost = _flickable._get_visible_container_rightmost(containers) with mock.patch.object( qquickflickable.pointing_device, 'drag') as mock_drag: try: qquickflickable.swipe_to_show_more_right() except ubuntuuitoolkit.ToolkitException: # An exception will be raised because the drag was faked. pass mock_drag.assert_called_with( rightmost - units.gu(6), mock.ANY, mock.ANY, mock.ANY, rate=mock.ANY) def test_swipe_to_show_more_left_with_left_margin(self): """Calling swipe to show more above will use the margin in the drag.""" qquickflickable = self.main_view.select_single( ubuntuuitoolkit.QQuickFlickable, objectName='flickable') qquickflickable.margin_to_swipe_from_left = units.gu(6) containers = qquickflickable._get_containers() leftmost = _flickable._get_visible_container_leftmost(containers) qquickflickable.swipe_to_rightmost() with mock.patch.object( qquickflickable.pointing_device, 'drag') as mock_drag: try: qquickflickable.swipe_to_show_more_left() except ubuntuuitoolkit.ToolkitException: # An exception will be raised because the drag was faked. pass mock_drag.assert_called_with( leftmost + units.gu(6), mock.ANY, mock.ANY, mock.ANY, rate=mock.ANY) def test_failed_drag_must_raise_exception(self): dummy_coordinates = (0, 0, 10, 10) # Patch the pointing device so it does nothing and the swipe fails. with mock.patch.object(self.flickable, 'pointing_device'): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.flickable._slow_drag, *dummy_coordinates ) self.assertEqual('Could not swipe in the flickable.', str(error)) class UnityFlickableTestCase(tests.QMLStringAppTestCase): test_qml = (""" import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(48) height: units.gu(60) objectName: 'mainView' Flickable { objectName: 'testFlickable' width: 200; height: 200 contentWidth: image.width; contentHeight: image.height } } """) def get_command_line(self, command_line): command_line.append('-engine') return command_line def test_get_unity_top_container(self): """Test that we can get the top cointainer in Unity.""" # This tests bug http://pad.lv/1314390 # On Unity, the top container is not the first child as it is in all # the apps that have a MainView. This makes the first implementation of # _get_top_container fail. Instead of going from the top looking for # a container, we should start from the flickable until we find the # top-most container. test_flickable = self.app.select_single( ubuntuuitoolkit.QQuickFlickable, objectName='testFlickable') top_container = test_flickable._get_top_container() self.assertIsInstance(top_container, ubuntuuitoolkit.MainView) ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootroot./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_popups.ActionSelectionPopoverTestCase.qml./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_popups.ActionSelectionPopoverTestC0000644000015600001650000000337212700370701035105 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.0 import Ubuntu.Components.Popups 1.0 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Button { objectName: "open_popover" text: "Open Popover" onClicked: testActionsPopover.show(); } Label { id: "label" objectName: "clicked_label" anchors.centerIn: parent text: "Button not clicked." } ActionSelectionPopover { objectName: "test_actions_popover" id: testActionsPopover actions: ActionList { Action { text: "Action one" objectName: "actionOne" onTriggered: label.text = "Button clicked." } Action { text: "Action two" objectName: "actionDisabled" onTriggered: label.text = "Disabled button clicked." } Action { text: "Action three" objectName: "actionHidden" onTriggered: label.text = "Hidden button clicked." } } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_date_picker.py0000644000015600001650000001661412700370701031063 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import datetime import ubuntuuitoolkit from ubuntuuitoolkit import pickers, tests class DatePickerBaseTestCase(tests.QMLStringAppTestCase): test_qml = (""" import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Pickers 1.0 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Column { DatePicker { id: datePicker objectName: 'datePicker' mode: 'Years|Months|Days' maximum: { var d = new Date() d.setFullYear('2030') return d } minimum: { var d = new Date() d.setFullYear('1990') return d } date: { var d = new Date() d.setFullYear('2010') d.setMonth('5') d.setDate('15') return d } } DatePicker { id: timePicker objectName: 'timePicker' mode: 'Hours|Minutes|Seconds' maximum: { var d = new Date() d.setFullYear('2030') return d } minimum: { var d = new Date() d.setFullYear('1990') return d } date: { var d = new Date() d.setHours(12) d.setMinutes('30') d.setSeconds('30') return d } } } } """) def setUp(self): super().setUp() self.date_picker = self.main_view.select_single( pickers.DatePicker, objectName='datePicker') self.time_picker = self.main_view.select_single( pickers.DatePicker, objectName='timePicker') class DatePickerTestCase(DatePickerBaseTestCase): def test_select_date_picker_must_return_custom_proxy_object(self): self.assertIsInstance( self.date_picker, pickers.DatePicker) def test_pick_date_on_time_picker_must_raise_exception(self): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.time_picker.pick_date, 'dummy') self.assertEqual( str(error), "Can't pick date. The picker mode is: {!r}.".format( self.time_picker.mode)) def test_pick_time_on_date_picker_must_raise_exception(self): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.date_picker.pick_time, 'dummy') self.assertEqual( str(error), "Can't pick time. The picker mode is: {!r}.".format( self.date_picker.mode)) def test_swipe_to_show_one_more_below_must_select_next_index(self): """Test that we don't end up swiping more than needed. This would cause us to miss the element we are looking for, and to have to swipe many times in order to finally click it. """ picker = self.main_view.select_single( 'Picker', objectName='PickerRow_DayPicker') path_view = picker.select_single( pickers.QQuickPathView, objectName='Picker_WrapAround') current_index = path_view.currentIndex path_view._swipe_to_show_one_more_below(path_view._get_containers()) self.assertEqual(path_view.currentIndex, current_index + 1) def test_swipe_to_show_one_more_above_must_select_previous_index(self): """Test that we don't end up swiping more than needed. This would cause us to miss the element we are looking for, and to have to swipe many times in order to finally click it. """ picker = self.main_view.select_single( 'Picker', objectName='PickerRow_DayPicker') path_view = picker.select_single( pickers.QQuickPathView, objectName='Picker_WrapAround') current_index = path_view.currentIndex path_view._swipe_to_show_one_more_above(path_view._get_containers()) self.assertEqual(path_view.currentIndex, current_index - 1) class PickDateFromDatePickerTestCase(DatePickerBaseTestCase): SELECTED_YEAR = 2010 SELECTED_MONTH = 6 # June SELECTED_DAY = 15 scenarios = [ ('higher year', { 'date_to_pick': datetime.date( SELECTED_YEAR + 10, SELECTED_MONTH, SELECTED_DAY)}), ('lower year', { 'date_to_pick': datetime.date( SELECTED_YEAR - 10, SELECTED_MONTH, SELECTED_DAY)}), ('higher month', { 'date_to_pick': datetime.date( SELECTED_YEAR, SELECTED_MONTH + 4, SELECTED_DAY)}), ('lower month', { 'date_to_pick': datetime.date( SELECTED_YEAR, SELECTED_MONTH - 4, SELECTED_DAY)}), ('higher day', { 'date_to_pick': datetime.date( SELECTED_YEAR, SELECTED_MONTH, SELECTED_DAY + 10)}), ('lower day', { 'date_to_pick': datetime.date( SELECTED_YEAR, SELECTED_MONTH, SELECTED_DAY - 10)}), ('change all values', { 'date_to_pick': datetime.date( SELECTED_YEAR - 10, SELECTED_MONTH + 4, SELECTED_DAY - 10)}), ] def test_pick_date(self): """Test that picking a date updates the picker.""" self.date_picker.pick_date(self.date_to_pick) self.assertEqual(self.date_picker.get_date(), self.date_to_pick) class PickTimeFromDatePickerTestCase(DatePickerBaseTestCase): SELECTED_HOUR = 12 SELECTED_MINUTE = 30 SELECTED_SECOND = 30 scenarios = [ ('higher hour', { 'time_to_pick': datetime.time( SELECTED_HOUR + 6, SELECTED_MINUTE, SELECTED_SECOND)}), ('lower hour', { 'time_to_pick': datetime.time( SELECTED_HOUR - 6, SELECTED_MINUTE, SELECTED_SECOND)}), ('higher minute', { 'time_to_pick': datetime.time( SELECTED_HOUR, SELECTED_MINUTE + 10, SELECTED_SECOND)}), ('lower minute', { 'time_to_pick': datetime.time( SELECTED_HOUR, SELECTED_MINUTE - 10, SELECTED_SECOND)}), ('higher second', { 'time_to_pick': datetime.time( SELECTED_HOUR, SELECTED_MINUTE, SELECTED_SECOND + 10)}), ('lower second', { 'time_to_pick': datetime.time( SELECTED_HOUR, SELECTED_MINUTE, SELECTED_SECOND - 10)}), ('change all values', { 'time_to_pick': datetime.time( SELECTED_HOUR + 6, SELECTED_MINUTE - 10, SELECTED_SECOND + 10)}), ] def test_pick_time(self): self.time_picker.pick_time(self.time_to_pick) self.assertEqual(self.time_picker.get_time(), self.time_to_pick) ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_sections.py0000644000015600001650000000607012700370701030433 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import os import ubuntuuitoolkit from ubuntuuitoolkit import tests class SectionsTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_sections.SectionsTestCase.qml') def setUp(self): super().setUp() self.sections = self.app.select_single(objectName='sections') self.scrollingSections = self.app.select_single(objectName='scrolling_sections') self.label = self.app.select_single(objectName='label') self.scrollingLabel = self.app.select_single(objectName='scrolling_label') self.assertEqual(self.label.text, 'Section 0 is selected.') self.assertEqual(self.scrollingLabel.text, 'Scrollable section 0 is selected.') def test_custom_proxy_object(self): self.assertIsInstance(self.sections, ubuntuuitoolkit.Sections) self.assertTrue(self.sections.visible) self.assertIsInstance(self.scrollingSections, ubuntuuitoolkit.Sections) self.assertTrue(self.scrollingSections.visible) def test_click_section_button(self): self.sections.click_section_button(2) self.assertEqual(self.label.text, 'Section 2 is selected.') def test_click_visible_scrolling_section_button(self): self.scrollingSections.click_section_button(2) self.assertEqual(self.scrollingLabel.text, 'Scrollable section 2 is selected.') def test_scroll_and_click_section_button(self): # scroll forward and click: self.scrollingSections.click_section_button(15) self.assertEqual(self.scrollingLabel.text, 'Scrollable section 15 is selected.') # scroll back and click: self.scrollingSections.click_section_button(1) self.assertEqual(self.scrollingLabel.text, 'Scrollable section 1 is selected.') def test_click_unexisting_section_button(self): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.sections.click_section_button, 3) self.assertEqual( str(error), 'Button with section index 3 not found in Sections.') error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.scrollingSections.click_section_button, 20) self.assertEqual( str(error), 'Button with section index 20 not found in Sections.') ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_tabs.py0000644000015600001650000001141112700370701027530 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2013, 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import os from unittest import mock import ubuntuuitoolkit from ubuntuuitoolkit import tests class TabsTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) deprecated_tabbar_test_qml_file_path = os.path.join( dir_path, 'test_tabs.TabsTestCase.deprecated_TabBar.qml') new_header_test_qml_file_path = os.path.join( dir_path, 'test_tabs.TabsTestCase.new_header.qml') new_header_1_3_test_qml_file_path = os.path.join( dir_path, 'test_tabs.TabsTestCase.new_header.1.3.qml') scenarios = [ ('deprecated TabBar', dict(test_qml_file_path=deprecated_tabbar_test_qml_file_path)), ('new header', dict(test_qml_file_path=new_header_test_qml_file_path)), ('new header 1.3', dict(test_qml_file_path=new_header_1_3_test_qml_file_path)) ] def test_tabs_custom_proxy_object(self): self.assertIsInstance(self.main_view.get_tabs(), ubuntuuitoolkit.Tabs) def test_get_current_tab(self): tabs = self.main_view.get_tabs() self.assertEqual(tabs.get_current_tab().title, 'Tab1') def test_switch_to_next_tab_from_header(self): header = self.main_view.get_header() header.switch_to_next_tab() current_tab = self.main_view.get_tabs().get_current_tab() self.assertEqual(current_tab.title, 'Tab2') def test_switch_to_next_tab_from_main_view(self): current_tab = self.main_view.switch_to_next_tab() self.assertEqual(current_tab.title, 'Tab2') def test_switch_to_next_tab_from_last(self): last_tab_index = self.main_view.get_tabs().get_number_of_tabs() - 1 self.main_view.switch_to_tab_by_index(last_tab_index) current_tab = self.main_view.switch_to_next_tab() self.assertEqual(current_tab.title, 'Tab1') def test_switch_to_tab_by_index(self): current_tab = self.main_view.switch_to_tab_by_index(2) self.assertEqual(current_tab.title, 'Tab3') current_tab = self.main_view.switch_to_tab_by_index(1) self.assertEqual(current_tab.title, 'Tab2') current_tab = self.main_view.switch_to_tab_by_index(0) self.assertEqual(current_tab.title, 'Tab1') def test_switch_to_opened_tab_is_not_opened_again(self): with mock.patch.object( ubuntuuitoolkit.AppHeader, 'switch_to_next_tab') as mock_switch: current_tab = self.main_view.switch_to_tab_by_index(0) self.assertFalse(mock_switch.called) self.assertEqual(current_tab.title, 'Tab1') def test_get_number_of_tabs(self): tabs = self.main_view.get_tabs() self.assertEqual(tabs.get_number_of_tabs(), 3) def test_swith_to_tab_by_index_out_of_range(self): last_tab_index = self.main_view.get_tabs().get_number_of_tabs() - 1 error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.main_view.switch_to_tab_by_index, last_tab_index + 1) self.assertEqual(str(error), 'Tab index out of range.') def test_switch_to_previous_tab_from_first(self): current_tab = self.main_view.switch_to_previous_tab() self.assertEqual(current_tab.title, 'Tab3') def test_switch_to_previous_tab_not_from_first(self): self.main_view.switch_to_tab_by_index(1) current_tab = self.main_view.switch_to_previous_tab() self.assertEqual(current_tab.title, 'Tab1') def test_switch_to_tab_by_object_name(self): current_tab = self.main_view.switch_to_tab('tab3') self.assertEqual(current_tab.title, 'Tab3') current_tab = self.main_view.switch_to_tab('tab2') self.assertEqual(current_tab.title, 'Tab2') current_tab = self.main_view.switch_to_tab('tab1') self.assertEqual(current_tab.title, 'Tab1') def test_switch_to_unexisting_tab(self): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.main_view.switch_to_tab, 'unexisting') self.assertEqual( str(error), 'Tab with objectName "unexisting" not found.') ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_listitem.py0000644000015600001650000001006412700370701030434 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2013, 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import os import ubuntuuitoolkit from ubuntuuitoolkit import tests class ListItemTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_listitem.ListItemTestCase.qml') def setUp(self): super().setUp() self.list_view = self.main_view.select_single( ubuntuuitoolkit.QQuickListView, objectName='test_view') self.test_listitem = self.main_view.select_single( 'UCListItem', objectName='listitem0') self.test_page = self.main_view.select_single( objectName='test_page') self.assertEqual(self.test_page.title, 'No action triggered') def test_trigger_delete(self): self.test_listitem.trigger_leading_action('delete_action') self.assertEqual(self.test_page.title, 'delete_action action triggered') def test_trigger_search(self): self.test_listitem.trigger_trailing_action('search_action') self.assertEqual(self.test_page.title, 'search_action action triggered') def test_trigger_edit(self): self.test_listitem.trigger_trailing_action('edit_action') self.assertEqual(self.test_page.title, 'edit_action action triggered') def test_trigger_email(self): self.test_listitem.trigger_trailing_action('email_action') self.assertEqual(self.test_page.title, 'email_action action triggered') def test_trigger_all_actions(self): self.test_listitem.trigger_leading_action('delete_action') self.assertEqual(self.test_page.title, 'delete_action action triggered') self.test_listitem.trigger_trailing_action('search_action') self.assertEqual(self.test_page.title, 'search_action action triggered') self.test_listitem.trigger_trailing_action('edit_action') self.assertEqual(self.test_page.title, 'edit_action action triggered') self.test_listitem.trigger_trailing_action('email_action') self.assertEqual(self.test_page.title, 'email_action action triggered') def test_trigger_nonexistent_leading_action(self): error = self.assertRaises(ubuntuuitoolkit.ToolkitException, self.test_listitem.trigger_leading_action, ('this_action_does_not_exist')) self.assertEqual(str(error), 'The requested action not found on leading side') def test_trigger_nonexistent_trailing_action(self): error = self.assertRaises(ubuntuuitoolkit.ToolkitException, self.test_listitem.trigger_trailing_action, 'this_action_does_not_exist') self.assertEqual(str(error), 'The requested action not found on trailing side') def test_select_items(self): self.list_view.enable_select_mode() self.test_listitem.toggle_selected() self.assertTrue(self.test_listitem.selected) # select an other one listItem3 = self.main_view.select_single( 'UCListItem', objectName='listitem3') listItem3.toggle_selected() self.assertTrue(listItem3.selected) ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_header.ToolsTestCase.qml0000644000015600001650000000561612700370701032735 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" useDeprecatedToolbar: false Page { title: "Test title" Flickable { anchors.fill: parent contentHeight: units.gu(120) objectName: "header_test_flickable" Label { id: label objectName: "clicked_label" anchors { top: parent.top horizontalCenter: parent.horizontalCenter } text: "No button clicked." } Button { objectName: "hide_actions_button" anchors { top: label.bottom topMargin: units.gu(5) horizontalCenter: parent.horizontalCenter } text: "Hide some actions" onClicked: { cancelAction.visible = false; for (var i=0; i < 3; i++) { buttonRepeater.itemAt(i).action.visible = false; } // only three of five visible actions left } } Label { id: endLabel objectName: "end_label" anchors { bottom: parent.bottom horizontalCenter: parent.horizontalCenter } text: "The end." } } tools: ToolbarItems { back: ToolbarButton { action: Action { id: cancelAction iconName: "cancel" text: "cancel" onTriggered: label.text = "Cancel button clicked." } } Repeater { id: buttonRepeater model: 5 ToolbarButton { action: Action { objectName: "action" + index text: "text " + index iconName: "add" onTriggered: label.text = "Button "+index+" clicked." } } } } } } ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootroot./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_header.DeprecatedHeaderSectionsTestCase.qml./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_header.DeprecatedHeaderSectionsTes0000644000015600001650000000262412700370701034742 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" useDeprecatedToolbar: true Page { id: page title: "Test title" Column { spacing: units.gu(1) width: childrenRect.width anchors.centerIn: parent Label { text: "Sections enabled" } Switch { id: sectionsEnabledSWitch objectName: "sections_enabled_switch" checked: page.head.sections.enabled onCheckedChanged: page.head.sections.enabled = checked } } head { sections.model: ["one", "two", "three"] } } } ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootroot./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_listitem.ListViewWithoutLiveDraggingTestCase.qml./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_listitem.ListViewWithoutLiveDraggi0000644000015600001650000000413612700370701035077 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.2 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Page { id: testPage objectName: "test_page" title: listView.ViewItems.dragMode ? "In drag mode" : "Test app" ListView { id: listView objectName: "test_view" ViewItems.objectName: "test_attached" ViewItems.onDragUpdated: { if (event.status == ListItemDrag.Moving) { // disable live move. event.accept = false; } else if (event.status == ListItemDrag.Dropped) { model.move(event.from, event.to, 1) } } anchors.fill: parent model: ListModel { Component.onCompleted: { for (var i = 0; i < 25; i++) { append({data: i}); } } } moveDisplaced: Transition { UbuntuNumberAnimation { properties: "y"; } } delegate: ListItem { objectName: "listitem" + index ListView.objectName: "bumm" onPressAndHold: ListView.view.ViewItems.dragMode = !ListView.view.ViewItems.dragMode Label { text: "List item #" + modelData } } } } } ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootroot./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_listview.QQuickListViewTestCase.Uitk13.vertical.qml./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_listview.QQuickListViewTestCase.Ui0000644000015600001650000000345712700370701034724 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(48) height: units.gu(20) objectName: "mainView" Page { header: Item { } Column { id: column width: units.gu(48) height: units.gu(20) Label { id: clickedLabel objectName: "clickedLabel" text: "No element clicked." } ListView { id: testListView objectName: "testListView" anchors { left: parent.left right: parent.right } height: column.height - clickedLabel.paintedHeight clip: true model: 20 delegate: ListItem { objectName: "testListElement%1".arg(index) Label { anchors.centerIn: parent text: "test list element %1".arg(index) } onClicked: clickedLabel.text = objectName height: units.gu(5) } } } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_qquickgridview.py0000644000015600001650000000306112700370701031637 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import os import testtools import ubuntuuitoolkit from ubuntuuitoolkit import tests class QQuickGridViewClassTestCase(testtools.TestCase): def test_qquickgridview_custom_proxy_object_inherits_from_flickable(self): self.assertTrue( issubclass( ubuntuuitoolkit.QQuickGridView, ubuntuuitoolkit.QQuickFlickable)) class QQuickGridViewTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_qquickgridview.QQuickGridViewTestCase.qml') def test_select_qquickgridview_must_return_custom_proxy_object(self): grid_view = self.main_view.select_single( ubuntuuitoolkit.QQuickGridView, objectName='testListView') self.assertIsInstance(grid_view, ubuntuuitoolkit.QQuickGridView) ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootroot./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_listitem.ListViewWithLiveDraggingTestCase.qml./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_listitem.ListViewWithLiveDraggingT0000644000015600001650000000370712700370701035023 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.2 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Page { id: testPage objectName: "test_page" title: listView.ViewItems.dragMode ? "In drag mode" : "Test app" ListView { id: listView objectName: "test_view" ViewItems.objectName: "test_attached" ViewItems.onDragUpdated: { if (event.status == ListItemDrag.Moving) { model.move(event.from, event.to, 1) } } anchors.fill: parent model: ListModel { Component.onCompleted: { for (var i = 0; i < 25; i++) { append({data: i}); } } } moveDisplaced: Transition { UbuntuNumberAnimation { properties: "y"; } } delegate: ListItem { objectName: "listitem" + index ListView.objectName: "bumm" onPressAndHold: ListView.view.ViewItems.dragMode = !ListView.view.ViewItems.dragMode Label { text: "List item #" + modelData } } } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_sections.SectionsTestCase.qml0000644000015600001650000000452712700370701034023 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Page { id: page header: PageHeader { title: "Sections test" } Label { id: label objectName: "label" anchors { top: page.header.bottom topMargin: units.gu(2) horizontalCenter: parent.horizontalCenter } text: "Section " + sections.selectedIndex + " is selected." } Sections { id: sections objectName: "sections" anchors { horizontalCenter: parent.horizontalCenter top: label.bottom topMargin: units.gu(4) } model: [ "first", "second", "third" ] } Label { id: moreLabel objectName: "scrolling_label" anchors { centerIn: parent } text: "Scrollable section " + moreSections.selectedIndex + " is selected." } Sections { id: moreSections objectName: "scrolling_sections" anchors { horizontalCenter: parent.horizontalCenter top: moreLabel.bottom topMargin: units.gu(4) left: parent.left right: parent.right } model: ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty" ] } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_textfield.1.0.qml0000644000015600001650000000214312700370701031227 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.0 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Item { TextField { id: simpleTextField objectName: "simple_text_field" } TextField { id: textFieldWithoutClearButton objectName: "text_field_without_clear_button" hasClearButton: false anchors.top: simpleTextField.bottom } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_header.HideShowTestCase.qml0000644000015600001650000000242112700370701033336 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 as ListItem MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" useDeprecatedToolbar: false Page { id: page title: "Test title" ListView { id: testListView objectName: "testListView" anchors.fill: parent model: 20 delegate: ListItem.Standard { objectName: "testListElement%1".arg(index) text: "test list element %1".arg(index) height: units.gu(5) } } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_textarea.py0000644000015600001650000000401512700370701030416 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014-2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from testtools.matchers import GreaterThan import ubuntuuitoolkit from ubuntuuitoolkit import tests class TextAreaTestCase(tests.QMLStringAppTestCase): test_qml = (""" import QtQuick 2.0 import Ubuntu.Components 1.0 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Item { TextArea { objectName: "simple_text_area" } } } """) def setUp(self): super().setUp() self.simple_text_area = self.main_view.select_single( ubuntuuitoolkit.TextArea, objectName='simple_text_area') def test_text_area_inherits_text_field(self): self.assertTrue( issubclass(ubuntuuitoolkit.TextArea, ubuntuuitoolkit.TextField)) def test_clear_with_single_line(self): self.simple_text_area.write('test') self.simple_text_area.clear() self.assertEqual(self.simple_text_area.text, '') def test_clear_with_multiple_lines(self): # This is a regrestion test for http://pad.lv/1359167 self.simple_text_area.write( 'Long text that will make it wrap into multiple lines.') self.assertThat(self.simple_text_area.lineCount, GreaterThan(1)) self.simple_text_area._go_to_start() self.simple_text_area.clear() self.assertEqual(self.simple_text_area.text, '') ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_qquicklistview.py0000644000015600001650000002533112700370701031671 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2013-2016 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from unittest import mock import os import testscenarios from autopilot import platform from autopilot.introspection import dbus import ubuntuuitoolkit from ubuntuuitoolkit import tests class QQuickListViewTestCase(tests.QMLFileAppTestCase): """Test clicking on elements in the ListView The ListView may need to be scrolled forward or backwards before the element can be clicked. In a standard vertical ListView, 'forward' means 'down' and 'backward' means 'up. In a horizontal ListView, 'forward' means to the right, and 'backward' means to the left. TODO: Add support for right-to-left layouts. """ path = os.path.abspath(__file__) dir_path = os.path.dirname(path) uitk10v_qml_file_path = os.path.join( dir_path, 'test_listview.QQuickListViewTestCase.Uitk10.vertical.qml') uitk13v_qml_file_path = os.path.join( dir_path, 'test_listview.QQuickListViewTestCase.Uitk13.vertical.qml') uitk13h_qml_file_path = os.path.join( dir_path, 'test_listview.QQuickListViewTestCase.Uitk13.horizontal.qml') scenarios = [ ('UITK 1.0 vertical', dict(test_qml_file_path=uitk10v_qml_file_path)), ('UITK 1.3 vertical', dict(test_qml_file_path=uitk13v_qml_file_path)), ('UITK 1.3 horizontal', dict(test_qml_file_path=uitk13h_qml_file_path)) ] def setUp(self): super().setUp() self.list_view = self.main_view.select_single( ubuntuuitoolkit.QQuickListView, objectName='testListView') self.label = self.main_view.select_single( objectName='clickedLabel') self.assertEqual(self.label.text, 'No element clicked.') def test_qquicklistview_custom_proxy_object(self): self.assertIsInstance(self.list_view, ubuntuuitoolkit.QQuickListView) def _click_element(self, object_name): """Click the element with the given object name and verify that the label text was updated. """ self.list_view.click_element(object_name) self.assertEqual(self.label.text, object_name) def test_click_element_in_view(self): self.assertTrue(self.list_view._is_element_visible('testListElement0')) self._click_element('testListElement0') def test_click_cached_element_outside_view_after(self): # Click the first element out of view to make sure we are not scrolling # towards the end at once. i = 0 while i < self.list_view.count: objectName = 'testListElement' + str(i) if not self.list_view._is_element_visible(objectName): break i = i + 1 # _is_element_visible() checks that the center of the element is not # visible. To make sure the element is fully invisible, take the # next one. i = i + 1 objectName = 'testListElement' + str(i) if i == self.list_view.count: raise ubuntuuitoolkit.ToolkitException( 'Example program has no invisible item that is not cached.') self.assertTrue(self.list_view._is_element_cached(objectName)) self._click_element(objectName) def test_click_element_outside_view_before(self): self.list_view.click_element('testListElement9') self.assertFalse( self.list_view._is_element_visible('testListElement4')) self._click_element('testListElement4') def test_click_uncached_element_outside_view_after(self): objectName = 'testListElement19' self.assertFalse(self.list_view._is_element_cached(objectName)) self._click_element(objectName) def test_click_element_from_first_page_deleted_when_swiping_forward(self): """Test that no more swiping is done after finding the element. This is a regression test for bug http://pad.lv/1342521 that caused us to swipe down after finding an element on the first page of the list. If we were lucky, the element was still cached so we just ended up doing two extra swipes. If not, then the element will be deleted from the tree and the helper failed. """ # Swipe forward. self.list_view.click_element('testListElement19') objectName = 'testListElement1' self.assertFalse(self.list_view._is_element_cached(objectName)) with mock.patch.object( self.list_view, 'swipe_to_show_more_below') as mock_swipe_down: with mock.patch.object( self.list_view, 'swipe_to_show_more_right') as mock_swipe_right: self._click_element(objectName) self.assertFalse(mock_swipe_down.called) self.assertFalse(mock_swipe_right.called) def test_click_unexisting_element(self): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.list_view.click_element, 'unexisting') self.assertEqual( str(error), 'List element with objectName "unexisting" not found.') class QQuickListViewOutOfViewTestCase(tests.QMLStringAppTestCase): """Test that we can make elements visible when the list is out of view.""" test_qml = (""" import QtQuick 2.0 import Ubuntu.Components 1.0 import Ubuntu.Components.ListItems 1.0 as ListItem MainView { width: units.gu(48) height: units.gu(20) objectName: "mainView" Page { Flickable { Column { id: column width: units.gu(48) // The column height is greater than the main view height, so // the bottom of the list is out of view. height: units.gu(40) Label { id: clickedLabel objectName: "clickedLabel" text: "No element clicked." } ListView { id: testListView objectName: "testListView" anchors.left: parent.left anchors.right: parent.right height: column.height - clickedLabel.paintedHeight clip: true model: 20 delegate: ListItem.Standard { objectName: "testListElement%1".arg(index) text: "test list element %1".arg(index) onClicked: clickedLabel.text = objectName height: units.gu(5) } } } } } } """) def setUp(self): super().setUp() self.list_view = self.main_view.select_single( ubuntuuitoolkit.QQuickListView, objectName='testListView') self.label = self.main_view.select_single( 'Label', objectName='clickedLabel') self.assertEqual(self.label.text, 'No element clicked.') def test_click_element_outside_view_below(self): """Test that we can click an element that's out of view below. The list is also out of view, so we must scroll from the bottom of the main view. """ # Test for http://pad.lv/1275060. # Click the first element out of view to make sure we are not scrolling # to the bottom at once. self.assertFalse( self.list_view._is_element_visible('testListElement9')) self.list_view.click_element('testListElement9') self.assertEqual(self.label.text, 'testListElement9') class QQuickListViewDraggingBaseTestCase(tests.QMLFileAppTestCase): def setUp(self): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) self.test_qml_file_path = os.path.join( dir_path, self.qml_file_name) super().setUp() self.list_view = self.main_view.select_single( ubuntuuitoolkit.QQuickListView, objectName='test_view') class QQuickListViewDraggingTestCase(QQuickListViewDraggingBaseTestCase): qml_file_name = 'test_listitem.ListViewWithLiveDraggingTestCase.qml' def test_long_press_must_enable_drag_mode(self): list_item = self.list_view.select_single( 'UCListItem', objectName='listitem0') self.assertFalse(list_item.dragMode) self.list_view._enable_drag_mode() self.assertTrue(list_item.dragMode) class QQuickListViewReorderingTestCase(QQuickListViewDraggingBaseTestCase): dragging_scenarios = [ ('with live dragging', { 'qml_file_name': ( 'test_listitem.ListViewWithLiveDraggingTestCase.qml')}), ('without live dragging', { 'qml_file_name': ( 'test_listitem.ListViewWithoutLiveDraggingTestCase.qml')}), ] reorder_scenarios = [ ('both items visible, to bottom', {'from_index': 0, 'to_index': 1}), ('both items visible, to top', {'from_index': 1, 'to_index': 0}), ('both items visible, to bottom, first non visible', { 'from_index': 0, 'to_index': 7}), ('to item not visible, to top', {'from_index': 15, 'to_index': 0}), ('to item not visible, to middle down', { 'from_index': 0, 'to_index': 15}), ('to item not visible, to bottom', {'from_index': 0, 'to_index': 24}) ] scenarios = testscenarios.multiply_scenarios( dragging_scenarios, reorder_scenarios) def _find_item(self, index): object_name = 'listitem{}'.format(index) try: return self.list_view.select_single(objectName=object_name) except dbus.StateNotFoundError: return self.list_view._find_element(object_name) def _get_item_text(self, index): item = self._find_item(index) return item.select_single('Label').text def test_drag_item_must_reorder_list(self): if platform.model() != 'Desktop': self.skipTest( 'Drag does not work on the phone because of bug #1266601') original_from_text = self._get_item_text(self.from_index) self.list_view.drag_item(self.from_index, self.to_index) self.assertEqual( original_from_text, self._get_item_text(self.to_index)) ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_toolbar.py0000644000015600001650000000732512700370701030252 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2013-2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from unittest import mock import ubuntuuitoolkit from ubuntuuitoolkit import tests class ToolbarTestCase(tests.QMLStringAppTestCase): test_qml = (""" import QtQuick 2.0 import Ubuntu.Components 1.0 MainView { width: units.gu(50) height: units.gu(50) objectName: "mainView" // Make sure that for these tests the toolbar starts closed. Component.onCompleted: { __propagated.toolbar.close(); } Page { Label { id: "label" objectName: "clicked_label" anchors.centerIn: parent text: "Button not clicked." } tools: ToolbarItems { ToolbarButton { objectName: "buttonName" action: Action { text: "buttonText" onTriggered: label.text = "Button clicked." } } } } } """) def setUp(self): super().setUp() self.toolbar = self.main_view.get_toolbar() # toolbar may be opened or closed now, depending on whether # the application has been deactivated and resumed already def test_open_toolbar(self): self.toolbar.open() self.assertTrue(self.toolbar.opened) self.assertFalse(self.toolbar.animating) def test_opened_toolbar_is_not_opened_again(self): self.toolbar.open() with mock.patch.object( self.main_view.pointing_device, 'drag') as mock_drag: self.toolbar.open() self.assertFalse(mock_drag.called) self.assertTrue(self.toolbar.opened) def test_close_toolbar(self): self.toolbar.open() self.toolbar.close() self.assertFalse(self.toolbar.opened) self.assertFalse(self.toolbar.animating) def test_closed_toolbar_is_not_closed_again(self): self.toolbar.close() with mock.patch.object( self.main_view.pointing_device, 'drag') as mock_drag: self.toolbar.close() self.assertFalse(mock_drag.called) self.assertFalse(self.toolbar.opened) def test_click_toolbar_button(self): self.toolbar.close() label = self.app.select_single('Label', objectName='clicked_label') self.assertNotEqual(label.text, 'Button clicked.') self.toolbar.open() self.toolbar.click_button('buttonName') self.assertEqual(label.text, 'Button clicked.') def test_click_unexisting_button(self): self.main_view.open_toolbar() error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.toolbar.click_button, 'unexisting') self.assertEqual( str(error), 'Button with objectName "unexisting" not found.') def test_click_button_on_closed_toolbar(self): self.toolbar.close() error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.toolbar.click_button, 'buttonName') self.assertEqual( str(error), 'Toolbar must be opened before calling click_button().') ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootroot./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_tabs.TabsTestCase.deprecated_TabBar.qml./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_tabs.TabsTestCase.deprecated_TabBa0000644000015600001650000000316612700370701034565 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.1 MainView { width: units.gu(70) height: units.gu(60) useDeprecatedToolbar: true objectName: "mainView" Tabs { id: tabs Tab { objectName: "tab1" title: "Tab1" Page { tools: ToolbarItems { ToolbarButton { text: "Test1" } } } } Tab { objectName: "tab2" title: "Tab2" Page { tools: ToolbarItems { ToolbarButton { text: "Test2" } } } } Tab { objectName: "tab3" title: "Tab3" Page { tools: ToolbarItems { ToolbarButton { text: "Test3" } } } } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_popups.py0000644000015600001650000001501512700370701030131 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2013-2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from autopilot.introspection import dbus import os import ubuntuuitoolkit from ubuntuuitoolkit import popups, tests class ActionSelectionPopoverTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_popups.ActionSelectionPopoverTestCase.qml') def test_custom_proxy_object(self): popover = self.main_view.get_action_selection_popover( 'test_actions_popover') self.assertIsInstance(popover, popups.ActionSelectionPopover) def test_click_button_by_label(self): label = self.app.select_single('Label', objectName='clicked_label') self.assertNotEqual(label.text, 'Button clicked.') self._open_popover() popover = self.main_view.get_action_selection_popover( 'test_actions_popover') popover.click_button_by_text('Action one') self.assertEqual(label.text, 'Button clicked.') def test_click_button_by_object_name(self): label = self.app.select_single('Label', objectName='clicked_label') self.assertNotEqual(label.text, 'Button clicked.') self._open_popover() popover = self.main_view.get_action_selection_popover( 'test_actions_popover') popover.click_action_button('actionOne') self.assertEqual(label.text, 'Button clicked.') def test_click_unexisting_button_by_object_name(self): self._open_popover() popover = self.main_view.get_action_selection_popover( 'test_actions_popover') error = self.assertRaises( ubuntuuitoolkit.ToolkitException, popover.click_action_button, 'actionTwo') self.assertEqual( str(error), 'Action with objectName "actionTwo" not found.') def test_click_disabled_button_by_object_name(self): self._open_popover() popover = self.main_view.get_action_selection_popover( 'test_actions_popover') # Disabled actions are not shown in ActionSelectionPopover error = self.assertRaises( ubuntuuitoolkit.ToolkitException, popover.click_action_button, 'actionDisabled') self.assertEqual( str(error), 'Action with objectName "actionDisabled" not found.') def test_click_hidden_button_by_object_name(self): self._open_popover() popover = self.main_view.get_action_selection_popover( 'test_actions_popover') error = self.assertRaises( ubuntuuitoolkit.ToolkitException, popover.click_action_button, 'actionHidden') self.assertEqual( str(error), 'Action with objectName "actionHidden" not found.') def _open_popover(self): open_button = self.main_view.select_single( 'Button', objectName='open_popover') self.pointing_device.click_object(open_button) def test_click_unexisting_button(self): self._open_popover() popover = self.main_view.get_action_selection_popover( 'test_actions_popover') error = self.assertRaises( ubuntuuitoolkit.ToolkitException, popover.click_button_by_text, 'unexisting') self.assertEqual( str(error), 'Button with text "unexisting" not found.') def test_click_button_with_closed_popover(self): popover = self.main_view.get_action_selection_popover( 'test_actions_popover') error = self.assertRaises( ubuntuuitoolkit.ToolkitException, popover.click_button_by_text, 'Action one') self.assertEqual( str(error), 'The popover is not open.') class ComposerSheetTestCase(tests.QMLStringAppTestCase): test_qml = (""" import QtQuick 2.0 import Ubuntu.Components 1.0 import Ubuntu.Components.Popups 1.0 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Button { objectName: "openComposerSheetButton" text: "Open Composer Sheet" onClicked: PopupUtils.open(testComposerSheet); } Label { id: "label" objectName: "actionLabel" anchors.centerIn: parent text: "No action taken." } Component { id: testComposerSheet ComposerSheet { id: sheet objectName: "testComposerSheet" onCancelClicked: { label.text = "Cancel selected." } onConfirmClicked: { label.text = "Confirm selected." } } } } """) def setUp(self): super().setUp() self.label = self.main_view.select_single( 'Label', objectName='actionLabel') self.assertEqual(self.label.text, 'No action taken.') self._open_composer_sheet() self.composer_sheet = self._select_composer_sheet() def _open_composer_sheet(self): button = self.main_view.select_single( 'Button', objectName='openComposerSheetButton') self.pointing_device.click_object(button) def _select_composer_sheet(self): return self.main_view.select_single( popups.ComposerSheet, objectName='testComposerSheet') def test_select_composer_sheet_custom_proxy_object(self): self.assertIsInstance( self.composer_sheet, popups.ComposerSheet) def test_confirm_composer_sheet(self): self.composer_sheet.confirm() self.assertEqual(self.label.text, 'Confirm selected.') self._assert_composer_sheet_is_closed() def _assert_composer_sheet_is_closed(self): self.assertRaises( dbus.StateNotFoundError, self._select_composer_sheet) def test_cancel_composer_sheet(self): self.composer_sheet.cancel() self.assertEqual(self.label.text, 'Cancel selected.') self._assert_composer_sheet_is_closed() ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootroot./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_header.HeaderInCustomMainViewTestCase.qml./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_header.HeaderInCustomMainViewTestC0000644000015600001650000000136112700370701034657 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 CustomMainView { objectName: 'customMainView' } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_pull_to_refresh.py0000644000015600001650000000440412700370701031777 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import os import time from autopilot import platform import ubuntuuitoolkit from ubuntuuitoolkit import tests class PullToRefreshTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join(dir_path, 'test_pull_to_refresh.qml') def setUp(self): super().setUp() self.label = self.main_view.select_single( 'Label', objectName='refreshedLabel') self.assertEqual(self.label.text, 'Not refreshed.') self.flickable_with_pull_to_refresh = self.main_view.select_single( ubuntuuitoolkit.QQuickFlickable, objectName='flickableWithPullToRefresh') def test_pull_to_refresh_must_refresh_model(self): # TODO disabled due bug #1372446 self.skipTest( 'Try to reproduce consistently, bug logged in #1372446') self.flickable_with_pull_to_refresh.pull_to_refresh() self.assertEqual(self.label.text, 'Refreshed.') def test_cancel_pull_to_refresh_must_not_refresh_model(self): if platform.model() != 'Desktop': # TODO remove the skip once bug http://pad.lv/1266601 is fixed. self.skipTest( 'Autopilot is not yet able to do a drag on the devices ' 'without releasing the simulated finger.') self.flickable_with_pull_to_refresh._cancel_pull_to_refresh() # Sleep for some time to make sure that the list is not being # refreshed. time.sleep(3) self.assertEqual(self.label.text, 'Not refreshed.') ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_common.py0000644000015600001650000000466312700370701030102 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2013, 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import unittest import autopilot from autopilot import platform, input from unittest import mock import ubuntuuitoolkit from ubuntuuitoolkit import tests class CheckAutopilotVersionTestCase(unittest.TestCase): def test_lower_version_should_raise_exception(self): with mock.patch.object(autopilot, 'version', '1.3'): self.assertRaises( ubuntuuitoolkit.ToolkitException, ubuntuuitoolkit.check_autopilot_version) def test_required_version_should_succeed(self): with mock.patch.object(autopilot, 'version', '1.4'): ubuntuuitoolkit.check_autopilot_version() def test_higher_version_should_succeed(self): with mock.patch.object(autopilot, 'version', '1.5'): ubuntuuitoolkit.check_autopilot_version() class UbuntuUIToolkitCustomProxyObjectBaseTestCase(tests.QMLStringAppTestCase): def test_pointing_device(self): self.assertIsInstance(self.app.pointing_device, input.Pointer) @unittest.skipIf(platform.model() != 'Desktop', 'Desktop only') def test_pointing_device_in_desktop(self): self.assertIsInstance(self.app.pointing_device._device, input.Mouse) @unittest.skipIf(platform.model() == 'Desktop', 'Phablet only') def test_pointing_device_in_phablet(self): self.assertIsInstance(self.app.pointing_device._device, input.Touch) def test_custom_proxy_objects_should_check_version_on_init(self): check_name = ( 'ubuntuuitoolkit._custom_proxy_objects._common.' 'check_autopilot_version') with mock.patch(check_name, autospec=True) as mock_check: # Instantiate any custom proxy object. self.main_view mock_check.assert_called_once_with() ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_header.ActionsTestCase.qml0000644000015600001650000000677112700370701033240 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Page { id: page title: "Test title" Flickable { anchors.fill: parent contentHeight: units.gu(120) objectName: "header_test_flickable" Label { id: label objectName: "clicked_label" anchors { top: parent.top horizontalCenter: parent.horizontalCenter } text: "No button clicked." } Button { objectName: "hide_actions_button" anchors { top: label.bottom topMargin: units.gu(5) horizontalCenter: parent.horizontalCenter } text: "Hide some actions" onClicked: { cancelAction.visible = false; for (var i=0; i < 3; i++) { page.head.actions[i].visible = false; } // only three of five visible actions left } } Label { id: endLabel objectName: "end_label" anchors { bottom: parent.bottom horizontalCenter: parent.horizontalCenter } text: "The end." } } head { backAction: Action { id: cancelAction iconName: "cancel" text: "cancel" onTriggered: label.text = "Cancel button clicked." } actions: [ Action { objectName: "action0" text: "text 0" iconName: "add" onTriggered: label.text = "Button 0 clicked." }, Action { objectName: "action1" text: "text 1" iconName: "add" onTriggered: label.text = "Button 1 clicked." }, Action { objectName: "action2" text: "text 2" iconName: "add" onTriggered: label.text = "Button 2 clicked." }, Action { objectName: "action3" text: "text 3" iconName: "add" onTriggered: label.text = "Button 3 clicked." }, Action { objectName: "action4" text: "text 4" iconName: "add" onTriggered: label.text = "Button 4 clicked." } ] } } } ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/test_header.py0000644000015600001650000002054612700370701030040 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2013-2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import logging import os import fixtures from testtools.matchers import Contains from autopilot import introspection import ubuntuuitoolkit from ubuntuuitoolkit import tests class HideShowTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_header.HideShowTestCase.qml') def setUp(self): super().setUp() self.header = self.main_view.get_header() def test_ensure_header_visible_must_show_it_when_not_visible(self): """Test that header.ensure_visible() shows the header.""" # NOTE: Using the internal _is_visible() function here. # It is not made public because besides testing the # ensure_visible() function, there is no use for it. self.assertEquals(self.header._is_visible(), True) # Scroll down to hide the header self.list_view = self.main_view.select_single( ubuntuuitoolkit.QQuickListView, objectName='testListView') self.list_view.click_element('testListElement19') self.assertEquals(self.header._is_visible(), False) self.header.ensure_visible() self.assertEquals(self.header._is_visible(), True) class ActionsTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) tools_test_qml_file_path = os.path.join( dir_path, 'test_header.ToolsTestCase.qml') actions_test_qml_file_path = os.path.join( dir_path, 'test_header.ActionsTestCase.qml') scenarios = [ ('deprecated tools', dict(test_qml_file_path=tools_test_qml_file_path)), ('actions', dict(test_qml_file_path=actions_test_qml_file_path)) ] def setUp(self): super().setUp() self.header = self.main_view.get_header() self.label = self.app.select_single(objectName='clicked_label') self.assertEqual(self.label.text, 'No button clicked.') def test_header_custom_proxy_object(self): self.assertIsInstance(self.header, ubuntuuitoolkit.AppHeader) self.assertTrue(self.header.visible) self.assertEqual(self.header.title, "Test title") def test_click_header_action_button(self): self.header.click_action_button('action0') self.assertEqual(self.label.text, 'Button 0 clicked.') def test_click_header_overflow_action_button(self): # custom back button and first action button go in the header # and the others in the overflow. self.header.click_action_button('action3') self.assertEqual(self.label.text, 'Button 3 clicked.') def test_click_unexisting_header_action_button(self): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.header.click_action_button, 'unexisting') self.assertEqual( str(error), 'Button not found in header or overflow') # back button and tabs button are tested in pagestack and tabs tests def test_click_custom_back_button(self): self.header.click_custom_back_button() self.assertEqual(self.label.text, 'Cancel button clicked.') def test_click_header_action_button_with_hidden_header(self): bottom_label = self.main_view.select_single(objectName='end_label') bottom_label.swipe_into_view() self.assertFalse(self.header._is_visible()) self.header.click_action_button('action0') self.assertEqual(self.label.text, 'Button 0 clicked.') class SectionsTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_header.SectionsTestCase.qml') def setUp(self): super().setUp() self.header = self.main_view.get_header() # initially, section 0 is selected self.assertEqual(self.header.get_selected_section_index(), 0) def test_select_sections(self): for index in [1, 0, 2]: self.header.switch_to_section_by_index(index) self.assertEqual(self.header.get_selected_section_index(), index) def test_select_sections_with_sections_disabled(self): sectionsEnabledSwitch = self.app.select_single( 'CheckBox', objectName='sections_enabled_switch') sectionsEnabledSwitch.uncheck() for index in [1, 0, 2]: self.header.switch_to_section_by_index(index) # cannot change section by tapping the section name in divider self.assertEqual(self.header.get_selected_section_index(), 0) class DeprecatedHeaderSectionsTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_header.DeprecatedHeaderSectionsTestCase.qml') def setUp(self): super().setUp() self.header = self.main_view.get_header() def test_get_selection_index(self): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.header.get_selected_section_index) self.assertEqual( str(error), 'Old header has no sections') def test_select_sections(self): error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.header.switch_to_section_by_index, 1) self.assertEqual( str(error), 'Old header has no sections') def test_select_sections_with_sections_disabled(self): sectionsEnabledSwitch = self.app.select_single( 'CheckBox', objectName='sections_enabled_switch') sectionsEnabledSwitch.uncheck() error = self.assertRaises( ubuntuuitoolkit.ToolkitException, self.header.switch_to_section_by_index, 1) self.assertEqual( str(error), 'Old header has no sections') class CustomMainView(ubuntuuitoolkit.MainView): """Autopilot helper for a custom main view.""" @classmethod def validate_dbus_object(cls, path, state): state_name = introspection.get_classname_from_path(path) class_name = cls.__name__.encode('utf-8') return state_name == class_name class HeaderInCustomMainViewTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_header.HeaderInCustomMainViewTestCase.qml') @property def main_view(self): return self.app.select_single(objectName='customMainView') def test_get_header_from_custom_main_view(self): """Test that we can get the header from a custom main view. This prevents a regression of http://pad.lv/1324556. """ header = self.main_view.get_header() self.assertIsInstance(header, ubuntuuitoolkit.AppHeader) class DeprecatedHeaderTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_header.DeprecatedHeaderTestCase.qml') @property def main_view(self): return self.app.select_single('QQuickItem', objectName='main') def test_get_deprecated_header_must_log_deprecation_warning(self): fake_logger = fixtures.FakeLogger(level=logging.WARNING) self.useFixture(fake_logger) self.main_view.select_single(ubuntuuitoolkit.Header) self.assertThat( fake_logger.output, Contains( 'Header is an internal QML component of Ubuntu.Components and ' 'its API may change or be removed at any moment. Please use ' 'MainView and Page instead.')) ./tests/autopilot/ubuntuuitoolkit/tests/custom_proxy_objects/CustomMainView.qml0000644000015600001650000000137112700370701030617 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 0.1 MainView { objectName: "overview" property string test } ./tests/autopilot/ubuntuuitoolkit/tests/components/0000755000015600001650000000000012700370701023071 5ustar jenkinsjenkins././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootroot./tests/autopilot/ubuntuuitoolkit/tests/components/test_header.HeaderActionsOverflowTestCase.actions.qml./tests/autopilot/ubuntuuitoolkit/tests/components/test_header.HeaderActionsOverflowTestCase.actions0000644000015600001650000000341512700370701034635 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" useDeprecatedToolbar: false PageStack { id: stack Component.onCompleted: stack.push(page) Page { title: "Test title" id: page head { actions: [ Action { iconName: "contact" text: "action 0" }, Action { iconName: "contact" text: "action 1" }, Action { iconName: "contact" text: "action 2" }, Action { objectName: "pushStackAction" text: "Push page" iconName: "add" onTriggered: stack.push(pushMe) } ] } } Page { title: "Pushed page" id: pushMe } } } ./tests/autopilot/ubuntuuitoolkit/tests/components/test_textinput.textarea.qml0000644000015600001650000000220712700370701030524 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.2 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Page { title: "Textarea" head.backAction: Action { iconName: "back" text: i18n.tr("Back") onTriggered: visible = false } Column { TextArea { objectName: "textarea" width: units.gu(25) height: units.gu(25) } } } } ./tests/autopilot/ubuntuuitoolkit/tests/components/__init__.py0000644000015600001650000000205612700370701025205 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Tests for the Ubuntu UI Toolkit components.""" # Note that the feedback loop that you get from testing QML components with # Autopilot is bigger than what you would get by doing it with QtTest. # So, the QML components need to be tested first in isolation at a lower level # with QtTest, leaving Autopilot to test complex user interactions or user # stories. ./tests/autopilot/ubuntuuitoolkit/tests/components/test_textinput.textfield_custom.qml0000644000015600001650000000440312700370701032271 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.2 import Ubuntu.Components.Themes.Ambiance 1.1 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Page { title: "Textfield" head.backAction: Action { iconName: "back" text: i18n.tr("Back") onTriggered: visible = false } Flickable { anchors.fill: parent contentHeight: childrenRect.height Column { anchors.fill: parent anchors.leftMargin: units.gu(2) Label { text: "Below is a customized text field with clipping" } Item { clip: true // Mustn't affect handler visibility width: childrenRect.width height: childrenRect.height TextField { objectName: "textfield" placeholderText: "Type here" width: units.gu(35) height: units.gu(2) style: TextFieldStyle { overlaySpacing: 0 frameSpacing: 0 background: Item {} color: UbuntuColors.lightAubergine } } } Repeater { model: 30 Label { text: "These labels are here to necessitate scrolling" } } } } } } ./tests/autopilot/ubuntuuitoolkit/tests/components/test_textinput.textfield.qml0000644000015600001650000000222212700370701030674 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.2 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Page { title: "Textfield" head.backAction: Action { iconName: "back" text: i18n.tr("Back") onTriggered: visible = false } Column { TextField { objectName: "textfield" placeholderText: "Type here" width: units.gu(35) } } } } ./tests/autopilot/ubuntuuitoolkit/tests/components/test_units.py0000644000015600001650000000347312700370701025653 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Tests for the Ubuntu UI Toolkit units helpers.""" import logging import os import testscenarios import testtools import fixtures from ubuntuuitoolkit import ( fixture_setup, units ) logger = logging.getLogger(__name__) class UnitsTestCase(testscenarios.TestWithScenarios, testtools.TestCase): WIDTH_IN_GU = 20 path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_units.UnitsTestCase.qml') scenarios = [ ('with default GRID_UNIT_PX', {'grid_unit_px': '', 'expected_pixels': 160}), ('with GRID_UNIT_PX environment variable set', {'grid_unit_px': '10', 'expected_pixels': 200}) ] def setUp(self): self.useFixture(fixtures.EnvironmentVariable( 'GRID_UNIT_PX', self.grid_unit_px)) self.useFixture(fixture_setup.InitctlEnvironmentVariable( global_=True, GRID_UNIT_PX=self.grid_unit_px)) super().setUp() def test_gu(self): pixels = units.gu(self.WIDTH_IN_GU) self.assertEquals(pixels, self.expected_pixels) ./tests/autopilot/ubuntuuitoolkit/tests/components/test_popover.qml0000644000015600001650000000367412700370701026347 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Popups 1.0 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Page { title: "Popover" Column { Button { objectName: "button_small" text: "Small" onClicked: PopupUtils.open(smallDialogComponent) } Button { objectName: "button_huge" text: "Huge" onClicked: PopupUtils.open(hugeDialogComponent) } } Component { id: smallDialogComponent Dialog { objectName: "dialog_small" Column { Button { text: "Just a button" } } } } Component { id: hugeDialogComponent Dialog { objectName: "dialog_huge" Column { Repeater { model: 50 Button { objectName: "buttlet%1".arg(index) text: "Button %1".arg(index) } } } } } } } ./tests/autopilot/ubuntuuitoolkit/tests/components/test_popover.py0000644000015600001650000000361212700370701026176 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Tests for the Ubuntu UI Toolkit Header component.""" import os from ubuntuuitoolkit import tests class DialogScrollTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_popover.qml') def test_dialog_small(self): button = self.main_view.select_single(objectName='button_small') self.pointing_device.click_object(button) dialog = self.main_view.select_single(objectName='dialog_small') flickable = dialog.select_single('QQuickFlickable') # There's nothing to reveal self.assertTrue(flickable.atYEnd) def test_dialog_scrollable(self): button = self.main_view.select_single(objectName='button_huge') self.pointing_device.click_object(button) dialog = self.main_view.select_single(objectName='dialog_huge') flickable = dialog.select_single('QQuickFlickable') buttlet = dialog.select_single(objectName='buttlet49') # We can scroll self.assertFalse(flickable.atYEnd) flickable.swipe_child_into_view(buttlet) self.assertEqual(flickable.is_child_visible(buttlet), True) ./tests/autopilot/ubuntuuitoolkit/tests/components/test_header.HeaderContentsTestCase.qml0000644000015600001650000000305112700370701032433 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" useDeprecatedToolbar: false PageStack { id: stack Component.onCompleted: stack.push(page) Page { id: page title: "Test title" Button { objectName: "push_button" anchors.centerIn: parent text: "push" onClicked: stack.push(pushMe) } } Page { id: pushMe title: "Invisible title" head { contents: Rectangle { objectName: "orange_header_contents" color: UbuntuColors.orange height: units.gu(5) width: parent ? parent.width - units.gu(2) : undefined } } } } } ./tests/autopilot/ubuntuuitoolkit/tests/components/test_textinput.py0000644000015600001650000002053512700370701026553 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Tests for the Ubuntu UI Toolkit Header component.""" import os import testtools from time import sleep from autopilot.input._common import get_center_point from autopilot import platform from ubuntuuitoolkit import tests class CaretTextInputTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) textfield_qml_file_path = os.path.join( dir_path, 'test_textinput.textfield.qml') textarea_qml_file_path = os.path.join( dir_path, 'test_textinput.textarea.qml') customfield_qml_file_path = os.path.join( dir_path, 'test_textinput.textfield_custom.qml') header_qml_file_path = os.path.join( dir_path, 'test_textinput.header.qml') scenarios = [ ('textfield', dict(test_qml_file_path=textfield_qml_file_path, objectName='textfield')), ('textarea', dict(test_qml_file_path=textarea_qml_file_path, objectName='textarea')), ('customfield', dict(test_qml_file_path=customfield_qml_file_path, objectName='textfield')), ('header', dict(test_qml_file_path=header_qml_file_path, objectName='textfield')), ] def get_command_line(self, command_line): command_line.append('-touch') return command_line def setUp(self): super().setUp() self.textfield = self.main_view.select_single( objectName=self.objectName) self.assertFalse(self.textfield.focus) def select_cursor(self, positionProperty): # The cursor may not receive events right away sleep(1) return self.main_view.select_single( objectName=positionProperty + '_draggeditem') def test_caret_hidden_if_empty(self): cursorName = 'text_cursor_style_caret_cursorPosition' self._assert_not_visible(objectName=cursorName) self.pointing_device.click_object(self.textfield) self.assertTrue(self.textfield.focus) self._assert_not_visible(objectName=cursorName) def test_caret_visible_on_focus(self): cursorName = 'text_cursor_style_caret_cursorPosition' self._assert_not_visible(objectName=cursorName) self.textfield.write('Lorem ipsum') self.pointing_device.click_object(self.textfield) self.main_view.select_single(objectName=cursorName) def test_caret_hide_while_typing(self): self.pointing_device.click_object(self.textfield) self.assertTrue(self.textfield.focus) cursor = self.select_cursor('cursorPosition') self.textfield.write('Lorem ipsum') self.assertFalse(cursor.visible) def test_caret_visible_after_tapping(self): self.test_caret_hide_while_typing() self.pointing_device.click_object(self.textfield) self.select_cursor('cursorPosition') @testtools.skipUnless(platform.model() == 'Desktop', 'Desktop only due to non-OSK key used.') def test_caret_visible_after_selecting(self): self.test_caret_hide_while_typing() # Select a character self.keyboard.press_and_release('Shift+Left') self.select_cursor('selectionEnd') class InsertModeTextInputTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) textfield_qml_file_path = os.path.join( dir_path, 'test_textinput.textfield.qml') textarea_qml_file_path = os.path.join( dir_path, 'test_textinput.textarea.qml') customfield_qml_file_path = os.path.join( dir_path, 'test_textinput.textfield_custom.qml') header_qml_file_path = os.path.join( dir_path, 'test_textinput.header.qml') scenarios = [ ('textfield', dict(test_qml_file_path=textfield_qml_file_path, objectName='textfield')), ('textarea', dict(test_qml_file_path=textarea_qml_file_path, objectName='textarea')), ('customfield', dict(test_qml_file_path=customfield_qml_file_path, objectName='textfield')), ('header', dict(test_qml_file_path=header_qml_file_path, objectName='textfield')), ] def get_command_line(self, command_line): command_line.append('-touch') return command_line def setUp(self): super().setUp() self.textfield = self.main_view.select_single( objectName=self.objectName) self.assertFalse(self.textfield.focus) def assert_buttons(self, texts): popover = self.main_view.get_text_input_context_menu( 'text_input_contextmenu') for text in texts: button = popover._get_button(text) self.assertTrue(button.visible) def assert_discard_popover(self): # Discard popover by tap self.pointing_device.move( self.textfield.globalRect.x + self.textfield.width * 0.6, self.textfield.globalRect.y + self.textfield.height * 0.95) self.pointing_device.click() self._assert_not_visible(objectName='text_input_contextmenu') def select_cursor(self, positionProperty): # The cursor may not receive events right away sleep(1) return self.main_view.select_single( objectName=positionProperty + '_draggeditem') def test_popover_not_obscured(self): self.textfield.write('Lorem ipsum') self.pointing_device.click_object(self.textfield) cursor = self.select_cursor('cursorPosition') self.pointing_device.click_object(cursor) popover = self.main_view.get_text_input_context_menu( 'text_input_contextmenu') self.assertTrue(popover.globalRect.y > 0, '%s <= 0' % popover.globalRect.y) def test_header_undisturbed_by_text_handlers(self): # Verify that handlers aren't accidentally placed at absolute 0/0 self.pointing_device.click_object(self.textfield) # Back will hide when pressed back = self.main_view.select_single(objectName='customBackButton') self.main_view.get_header().click_custom_back_button() self.assertFalse(back.visible) def test_popover_visible_after_tapping_caret(self): # Insert Mode self.textfield.write('Lorem ipsum') self.pointing_device.click_object(self.textfield) cursor = self.select_cursor('cursorPosition') self.pointing_device.click_object(cursor) self.assert_buttons(['Select All', 'Paste']) self.assert_discard_popover() def test_popover_visible_after_dragging_caret(self): # Insert Mode self.textfield.write('Lorem ipsum') self.pointing_device.click_object(self.textfield) cursor = self.select_cursor('cursorPosition') x, y = get_center_point(cursor) self.pointing_device.drag(x, y, x + self.textfield.width // 2, y) self.assert_buttons(['Select All', 'Paste']) self.assert_discard_popover() @testtools.skipIf(platform.model() == 'Desktop', 'Touch only') def test_popover_visible_after_long_press(self): # Select Mode self.textfield.write('Lorem ipsum') self.pointing_device.move( self.textfield.globalRect.x + self.textfield.width // 8, self.textfield.globalRect.y + self.textfield.height // 2) # Long press to select a word # FIXME: input.Mouse doesn't support long press # press_duration doesn't work here # self.pointing_device.click(press_duration=2.0) self.pointing_device.press() sleep(2) self.pointing_device.release() self.assert_buttons(['Cut', 'Copy', 'Paste']) self.assert_discard_popover() ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootroot./tests/autopilot/ubuntuuitoolkit/tests/components/test_header.HeaderActionsOverflowTestCase.tools.qml./tests/autopilot/ubuntuuitoolkit/tests/components/test_header.HeaderActionsOverflowTestCase.tools.q0000644000015600001650000000342512700370701034575 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" useDeprecatedToolbar: false PageStack { id: stack Component.onCompleted: stack.push(page) Page { title: "Test title" id: page tools: ToolbarItems { Repeater { id: buttonRepeater model: 5 ToolbarButton { action: Action { objectName: "action" + index text: "text " + index iconName: "add" } } } ToolbarButton { action: Action { objectName: "pushStackAction" text: "Push page" iconName: "add" onTriggered: stack.push(pushMe) } } } } Page { title: "Pushed page" id: pushMe } } } ./tests/autopilot/ubuntuuitoolkit/tests/components/test_header.py0000644000015600001650000001034212700370701025732 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014-2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Tests for the Ubuntu UI Toolkit Header component.""" import os from autopilot.introspection import dbus from ubuntuuitoolkit import tests class HeaderActionsOverflowTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) tools_test_qml_file_path = os.path.join( dir_path, 'test_header.HeaderActionsOverflowTestCase.tools.qml') actions_test_qml_file_path = os.path.join( dir_path, 'test_header.HeaderActionsOverflowTestCase.actions.qml') scenarios = [ ('deprecated tools', dict(test_qml_file_path=tools_test_qml_file_path)), ('actions', dict(test_qml_file_path=actions_test_qml_file_path)) ] def setUp(self): super().setUp() self.header = self.main_view.get_header() def test_click_header_overflow_action_must_close_popover(self): """Test that clicking an action from the popover must close it. Regression test for http://pad.lv/1326963 """ self.header.click_action_button('pushStackAction') # the popover was created to click the action button # popover will be closed and destroyed immediately after # clicking the action button try: overflow_popover = self.main_view.select_single( objectName='actions_overflow_popover') overflow_popover.wait_until_destroyed() except dbus.StateNotFoundError: # overflow popover was already destroyed before # it could be selected pass class HeaderContentsTestCase(tests.QMLFileAppTestCase): path = os.path.abspath(__file__) dir_path = os.path.dirname(path) test_qml_file_path = os.path.join( dir_path, 'test_header.HeaderContentsTestCase.qml') def setUp(self): super().setUp() self.header = self.main_view.get_header() def test_open_page_with_head_contents_must_change_header(self): """Test that setting head.contents overrides header contents.""" label = self.header.select_single( 'Label', objectName='header_title_label') self.assertEqual(label.visible, True) self.assertEqual(label.text, 'Test title') pushButton = self.main_view.select_single( 'Button', objectName='push_button') self.pointing_device.move_to_object(pushButton) self.pointing_device.click() self.header.wait_for_animation() self.assertEqual(label.visible, False) headerContents = self.header.select_single( objectName='orange_header_contents') self.assertEqual(headerContents.visible, True) def test_close_page_with_head_contents_must_revert_header(self): """Test that closing a page with head.contents reverts the header.""" pushButton = self.main_view.select_single( 'Button', objectName='push_button') self.pointing_device.move_to_object(pushButton) self.pointing_device.click() self.header.wait_for_animation() headerContents = self.header.select_single( objectName='orange_header_contents') label = self.header.select_single( 'Label', objectName='header_title_label') self.assertEqual(headerContents.visible, True) self.assertEqual(label.visible, False) self.header.click_back_button() self.assertEqual(headerContents.visible, False) self.assertEqual(label.visible, True) self.assertEqual(label.text, 'Test title') ./tests/autopilot/ubuntuuitoolkit/tests/components/test_textinput.header.qml0000644000015600001650000000432012700370701030135 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.2 MainView { id: root width: units.gu(48) height: units.gu(60) objectName: "mainView" Page { title: "Header" head.backAction: Action { iconName: "back" text: i18n.tr("Back") onTriggered: visible = false } head.contents: TextField { id: searchTextField objectName: "textfield" placeholderText: "Header" inputMethodHints: Qt.ImhNoPredictiveText hasClearButton: false anchors { fill: parent leftMargin: units.gu(1) topMargin: units.gu(0.5) bottomMargin: units.gu(0.5) rightMargin: units.gu(1) } secondaryItem: AbstractButton { height: searchTextField.height width: height enabled: searchTextField.text.length > 0 Image { objectName: "clearIcon" anchors.fill: parent anchors.margins: units.gu(.75) source: "image://theme/clear" opacity: searchTextField.text.length > 0 visible: opacity > 0 Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration } } } } } Column { Label { text: "Above is a text field in the header" } } } } ./tests/autopilot/ubuntuuitoolkit/tests/test_launcher.testcase.qml0000644000015600001650000000236712700370701026101 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 import Ubuntu.Test 1.0 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Page { title: "Launcher/TestCase" Column { TextArea { objectName: "textarea" text: "Lorem ipsum dolor sit amet" width: units.gu(25) height: units.gu(25) } } UbuntuTestCase { name: "LauncherCanRunTests" function test_can_run() { verify(true); } } } } ./tests/autopilot/ubuntuuitoolkit/tests/test_launcher.touch.qml0000644000015600001650000000207612700370701025405 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { width: units.gu(48) height: units.gu(60) objectName: "mainView" Page { title: "Launcher/Touch" Column { TextArea { objectName: "textarea" text: QuickUtils.touchScreenAvailable ? "Yes" : "No" width: units.gu(25) height: units.gu(25) } } } } ./tests/autopilot/ubuntuuitoolkit/tests/test_ubuntu_scenarios.py0000644000015600001650000000533212700370701025710 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from unittest import mock import testtools from ubuntuuitoolkit import ubuntu_scenarios class ScenariosTestCase(testtools.TestCase): def test_get_nexus_4_scenario(self): expected_scenarios = [ ('Simulating Nexus 4 in desktop', dict(app_width=768, app_height=1280, grid_unit_px=18)), ] with mock.patch('autopilot.platform.model') as mock_model: mock_model.return_value = 'Desktop' scenarios = ubuntu_scenarios.get_device_simulation_scenarios( devices=ubuntu_scenarios.NEXUS4_DEVICE) self.assertEqual(expected_scenarios, scenarios) def test_get_nexus_10_scenario(self): expected_scenarios = [ ('Simulating Nexus 10 in desktop', dict(app_width=2560, app_height=1600, grid_unit_px=20)) ] with mock.patch('autopilot.platform.model') as mock_model: mock_model.return_value = 'Desktop' scenarios = ubuntu_scenarios.get_device_simulation_scenarios( devices=ubuntu_scenarios.NEXUS10_DEVICE) self.assertEqual(expected_scenarios, scenarios) def test_get_default_scenarios_must_return_supported_devices(self): expected_scenarios = [ ('Simulating Nexus 4 in desktop', dict(app_width=768, app_height=1280, grid_unit_px=18)), ('Simulating Nexus 10 in desktop', dict(app_width=2560, app_height=1600, grid_unit_px=20)) ] with mock.patch('autopilot.platform.model') as mock_model: mock_model.return_value = 'Desktop' scenarios = ubuntu_scenarios.get_device_simulation_scenarios() self.assertEqual(expected_scenarios, scenarios) def test_get_scenarios_on_device_must_return_no_simulation_scenarios(self): with mock.patch('autopilot.platform.model') as mock_model: mock_model.return_value = 'Not Desktop' scenarios = ubuntu_scenarios.get_device_simulation_scenarios() self.assertEqual([('Not Desktop', {})], scenarios) ./tests/autopilot/ubuntuuitoolkit/ubuntu_scenarios.py0000644000015600001650000000364712700370701023516 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from autopilot import platform NEXUS4_DEVICE = 'Nexus4' NEXUS10_DEVICE = 'Nexus10' DEFAULT_DEVICES = (NEXUS4_DEVICE, NEXUS10_DEVICE) def get_device_simulation_scenarios(devices=DEFAULT_DEVICES): """Return a list of devices to be simulated on tests. :param devices: The device or devices to simulate. Default value is all the officially supported devices. :type devices: string or sequence of strings. :return: A list of scenarios to be used with the testscenarios python module, with the values of app_width, app_height and grid_unit corresponding to the selected device. """ if platform.model() == 'Desktop': return _get_device_simulation_scenarios_for_desktop(devices) else: return [(platform.model(), {})] def _get_device_simulation_scenarios_for_desktop(devices): scenarios = [] if NEXUS4_DEVICE in devices: scenarios.append( ('Simulating Nexus 4 in desktop', dict(app_width=768, app_height=1280, grid_unit_px=18)) ) if NEXUS10_DEVICE in devices: scenarios.append( ('Simulating Nexus 10 in desktop', dict(app_width=2560, app_height=1600, grid_unit_px=20)) ) return scenarios ./tests/autopilot/ubuntuuitoolkit/fixture_setup.py0000644000015600001650000002741312700370701023031 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import copy import json import logging import os import shutil import subprocess import tempfile import fixtures from autopilot import display from gi.repository import Gio from ubuntuuitoolkit import base, environment DEFAULT_QML_FILE_CONTENTS = (""" import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { width: units.gu(48) height: units.gu(60) Label { objectName: 'testLabel' text: 'Test application.' } } """) DEFAULT_DESKTOP_FILE_DICT = { 'Type': 'Application', 'Name': 'test', 'Exec': '{launcher} {qml_file_path}', 'Icon': 'Not important' } logger = logging.getLogger(__name__) class FakeApplication(fixtures.Fixture): def __init__( self, qml_file_contents=DEFAULT_QML_FILE_CONTENTS, desktop_file_dict=None, url_dispatcher_protocols=None): super().__init__() self._qml_file_contents = qml_file_contents if desktop_file_dict is None: self._desktop_file_dict = copy.deepcopy(DEFAULT_DESKTOP_FILE_DICT) else: self._desktop_file_dict = copy.deepcopy(desktop_file_dict) self.url_dispatcher_protocols = url_dispatcher_protocols def setUp(self): super().setUp() self.qml_file_path, self.desktop_file_path = ( self._create_test_application()) desktop_file_name = os.path.basename(self.desktop_file_path) self.application_name, _ = os.path.splitext(desktop_file_name) if self.url_dispatcher_protocols: self.url_dispatcher_file_path = ( self._register_url_dispatcher_protocols(self.application_name)) def _create_test_application(self): qml_file_path = self._write_test_qml_file() self.addCleanup(os.remove, qml_file_path) desktop_file_path = self._write_test_desktop_file(qml_file_path) self.addCleanup(os.remove, desktop_file_path) return qml_file_path, desktop_file_path def _write_test_qml_file(self): qml_file = self._named_temporary_file(suffix='.qml') qml_file.write(self._qml_file_contents) qml_file.close() return qml_file.name def _named_temporary_file(self, dir=None, mode='w+t', delete=False, suffix=''): # Discard files with underscores which look like an APP_ID to Unity # See https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1329141 chars = tempfile._RandomNameSequence.characters.strip("_") tempfile._RandomNameSequence.characters = chars return tempfile.NamedTemporaryFile(dir=dir, mode=mode, delete=delete, suffix=suffix) def _write_test_desktop_file(self, qml_file_path): desktop_file_dir = self._get_local_desktop_file_directory() if not os.path.exists(desktop_file_dir): os.makedirs(desktop_file_dir) desktop_file = self._named_temporary_file(suffix='.desktop', dir=desktop_file_dir) self._desktop_file_dict['Exec'] = ( self._desktop_file_dict['Exec'].format( launcher=base.get_toolkit_launcher_command(), qml_file_path=qml_file_path)) desktop_file.write('[Desktop Entry]\n') for key, value in self._desktop_file_dict.items(): desktop_file.write('{key}={value}\n'.format(key=key, value=value)) desktop_file.close() return desktop_file.name def _get_local_desktop_file_directory(self): return os.path.join( os.environ.get('HOME'), '.local', 'share', 'applications') def _register_url_dispatcher_protocols(self, application_name): url_dispatcher_file_path = self._write_url_dispatcher_file( application_name) self.addCleanup(os.remove, url_dispatcher_file_path) self._update_url_dispatcher_directory(url_dispatcher_file_path) return url_dispatcher_file_path def _write_url_dispatcher_file(self, application_name): url_dispatcher_dir = self._get_local_url_dispatcher_directory() if not os.path.exists(url_dispatcher_dir): os.makedirs(url_dispatcher_dir) protocol_list = [ {'protocol': protocol} for protocol in self.url_dispatcher_protocols] url_dispatcher_file_path = os.path.join( url_dispatcher_dir, application_name + '.url-dispatcher') with open(url_dispatcher_file_path, 'w') as url_dispatcher_file: url_dispatcher_file.write(json.dumps(protocol_list)) return url_dispatcher_file_path def _get_local_url_dispatcher_directory(self): return os.path.join( os.environ.get('HOME'), '.config', 'url-dispatcher', 'urls') def _update_url_dispatcher_directory(self, url_dispatcher_file_path): # FIXME This should be updated calling # initctl start url-dispatcher-update-user, but it is not working. # https://bugs.launchpad.net/ubuntu/+source/url-dispatcher/+bug/1461496 # --elopio - 2015-06-02 subprocess.check_output( '/usr/lib/*/url-dispatcher/update-directory ' + url_dispatcher_file_path, shell=True) class InitctlEnvironmentVariable(fixtures.Fixture): """Set the value of initctl environment variables.""" def __init__(self, global_=False, **kwargs): super().__init__() # Added one level of indirection to be able to spy the calls to # environment during tests. self.environment = environment self.variables = kwargs self.global_ = global_ def setUp(self): super().setUp() for variable, value in self.variables.items(): self._add_variable_cleanup(variable) if value is None: self.environment.unset_initctl_env_var( variable, global_=self.global_) else: self.environment.set_initctl_env_var( variable, value, global_=self.global_) def _add_variable_cleanup(self, variable): if self.environment.is_initctl_env_var_set( variable, global_=self.global_): original_value = self.environment.get_initctl_env_var( variable, global_=self.global_) self.addCleanup( self.environment.set_initctl_env_var, variable, original_value, global_=self.global_) else: self.addCleanup( self.environment.unset_initctl_env_var, variable, global_=self.global_) class FakeHome(fixtures.Fixture): # We copy the Xauthority file to allow executions using XVFB. If it is not # on the user's HOME directory, nothing will happen. should_copy_xauthority_file = True def __init__(self, directory=None): super().__init__() self.directory = directory def setUp(self): super().setUp() self.directory = self._make_directory_if_not_specified() if self.should_copy_xauthority_file: self._copy_xauthority_file(self.directory) # We patch both environment variables so it works on the desktop and on # the phone. self.useFixture( InitctlEnvironmentVariable(HOME=self.directory)) self.useFixture( fixtures.EnvironmentVariable('HOME', newvalue=self.directory)) def _make_directory_if_not_specified(self): if self.directory is None: parent_directory = os.path.join( os.environ.get('HOME'), 'autopilot', 'fakeenv') if not os.path.exists(parent_directory): os.makedirs(parent_directory) temp_dir_fixture = fixtures.TempDir(parent_directory) self.useFixture(temp_dir_fixture) return temp_dir_fixture.path else: return self.directory def _copy_xauthority_file(self, directory): """Copy the .Xauthority file if it exists in the user's home.""" xauthority_file_path = os.path.join( os.environ.get('HOME'), '.Xauthority') if os.path.isfile(xauthority_file_path): shutil.copyfile( xauthority_file_path, os.path.join(directory, '.Xauthority')) class HideUnity7Launcher(fixtures.Fixture): """Hide the Unity7 launcher if it is visible and restore it on clean up.""" _UNITYSHELL_GSETTINGS_SCHEMA = 'org.compiz.unityshell' _UNITYSHELL_GSETTINGS_PATH = ( '/org/compiz/profiles/unity/plugins/unityshell/') _UNITYSHELL_LAUNCHER_KEY = 'launcher-hide-mode' _UNITYSHELL_LAUNCHER_HIDDEN_MODE = 1 # launcher hidden def setUp(self): super().setUp() self._hide_launcher() def _hide_launcher(self): if (self._UNITYSHELL_GSETTINGS_SCHEMA in Gio.Settings.list_relocatable_schemas()): unityshell_schema = Gio.Settings.new_with_path( self._UNITYSHELL_GSETTINGS_SCHEMA, self._UNITYSHELL_GSETTINGS_PATH) self._hide_launcher_from_schema(unityshell_schema) else: logger.warning('Unity Shell gsettings schema not found.') def _hide_launcher_from_schema(self, unityshell_schema): original_mode = self._get_launcher_mode(unityshell_schema) self.addCleanup( self._set_launcher_mode, unityshell_schema, original_mode) self._set_launcher_mode( unityshell_schema, self._UNITYSHELL_LAUNCHER_HIDDEN_MODE) def _get_launcher_mode(self, unityshell_schema): return unityshell_schema.get_int(self._UNITYSHELL_LAUNCHER_KEY) def _set_launcher_mode(self, unityshell_schema, mode): unityshell_schema.set_int(self._UNITYSHELL_LAUNCHER_KEY, mode) class SimulateDevice(fixtures.Fixture): def __init__(self, app_width, app_height, grid_unit_px): super().__init__() self.app_width = app_width self.app_height = app_height self.grid_unit_px = grid_unit_px self._screen = None def setUp(self): super().setUp() if self._is_geometry_larger_than_display( self.app_width, self.app_height): scale_divisor = self._get_scale_divisor() self.grid_unit_px = self.grid_unit_px // scale_divisor self.app_width = self.app_width // scale_divisor self.app_height = self.app_height // scale_divisor self.useFixture( fixtures.EnvironmentVariable( 'GRID_UNIT_PX', str(self.grid_unit_px))) def _get_scale_divisor(self): scale_divisor = 2 while self._is_geometry_larger_than_display( self.app_width // scale_divisor, self.app_height // scale_divisor): scale_divisor = scale_divisor * 2 return scale_divisor def _is_geometry_larger_than_display(self, width, height): screen = self._get_screen() screen_width = screen.get_screen_width() screen_height = screen.get_screen_height() return (width > screen_width) or (height > screen_height) def _get_screen(self): if self._screen is None: self._screen = display.Display.create() return self._screen ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/0000755000015600001650000000000012700370701024165 5ustar jenkinsjenkins./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_uclistitem.py0000644000015600001650000000751612700370701027071 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import logging from autopilot import logging as autopilot_logging from ubuntuuitoolkit._custom_proxy_objects import _common logger = logging.getLogger(__name__) class UCListItem(_common.UbuntuUIToolkitCustomProxyObjectBase): """Base class to emulate swipe for leading and trailing actions.""" @autopilot_logging.log_action(logger.info) def _swipe_in_panel(self, panel_item): """ Swipe in panel (leading/trailing)""" x, y, width, height = self.globalRect if panel_item == 'leading': start_x = x + (width * 0.2) stop_x = x + (width * 0.8) elif panel_item == 'trailing': start_x = x + (width * 0.8) stop_x = x + (width * 0.2) else: raise _common.ToolkitException( 'No {0} panel found in a ListItem'.format(panel_item)) start_y = stop_y = y + (height // 2) self.pointing_device.drag(start_x, start_y, stop_x, stop_y) # wait till animation finishes self.contentMoving.wait_for(False) def _click_on_panel_action(self, panel_item, action_object, wait_function): self._swipe_in_panel(panel_item) try: button_name = 'actionbutton_' + action_object action_button = self.select_single(objectName=button_name) except: raise _common.ToolkitException( 'The requested action not found on {0} side'. format(panel_item)) self.pointing_device.click_object(action_button) if wait_function is None: # wait till animation finishes self.contentMoving.wait_for(False) else: wait_function() @autopilot_logging.log_action(logger.info) def trigger_leading_action(self, action_objectName, wait_function=None): """Swipe the item in from left to right to open leading actions and click on the button representing the requested action. parameters: action_objectName - object name of the action to be triggered. wait_function - a custom wait function to wait till the action is triggered """ self._click_on_panel_action('leading', action_objectName, wait_function) @autopilot_logging.log_action(logger.info) def trigger_trailing_action(self, action_objectName, wait_function=None): """Swipe the item in from right to left to open trailing actions and click on the button representing the requested action. parameters: action_objectName - object name of the action to be triggered. wait_function - a custom wait function to wait till the action is triggered """ self._click_on_panel_action('trailing', action_objectName, wait_function) @autopilot_logging.log_action(logger.info) def toggle_selected(self): """Toggles selected state of the ListItem. """ toggle = self.select_single(objectName='listitem_select') self.pointing_device.click_object(toggle) ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_qquickgridview.py0000644000015600001650000000156112700370701027737 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from ubuntuuitoolkit._custom_proxy_objects import _flickable class QQuickGridView(_flickable.QQuickFlickable): """Autopilot helper for the QQuickGridView component.""" ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_toolbar.py0000644000015600001650000000717012700370701026345 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import logging from autopilot import logging as autopilot_logging from autopilot.introspection import dbus from ubuntuuitoolkit._custom_proxy_objects import _common logger = logging.getLogger(__name__) class Toolbar(_common.UbuntuUIToolkitCustomProxyObjectBase): """Toolbar Autopilot custom proxy object.""" @autopilot_logging.log_action(logger.info) def open(self): """Open the toolbar if it's not already opened. :return: The toolbar. """ self.animating.wait_for(False) if not self.opened: self._drag_to_open() self.opened.wait_for(True) self.animating.wait_for(False) return self def _drag_to_open(self): x, y, _, _ = self.globalRect line_x = x + self.width * 0.50 start_y = y + self.height - 1 stop_y = y self.pointing_device.drag(line_x, start_y, line_x, stop_y) @autopilot_logging.log_action(logger.info) def close(self): """Close the toolbar if it's opened.""" self.animating.wait_for(False) if self.opened: self._drag_to_close() self.opened.wait_for(False) self.animating.wait_for(False) def _drag_to_close(self): x, y, _, _ = self.globalRect line_x = x + self.width * 0.50 start_y = y stop_y = y + self.height - 1 self.pointing_device.drag(line_x, start_y, line_x, stop_y) @autopilot_logging.log_action(logger.info) def click_button(self, object_name): """Click a button of the toolbar. The toolbar should be opened before clicking the button, or an exception will be raised. If the toolbar is closed for some reason (e.g., timer finishes) after moving the mouse cursor and before clicking the button, it is re-opened automatically by this function. :parameter object_name: The QML objectName property of the button. :raise ToolkitException: If there is no button with that object name. """ # ensure the toolbar is open if not self.opened: raise _common.ToolkitException( 'Toolbar must be opened before calling click_button().') try: button = self._get_button(object_name) except dbus.StateNotFoundError: raise _common.ToolkitException( 'Button with objectName "{0}" not found.'.format(object_name)) self.pointing_device.move_to_object(button) # ensure the toolbar is still open (may have closed due to timeout) self.open() # click the button self.pointing_device.click_object(button) def _get_button(self, object_name): return self.select_single('UCActionItem', objectName=object_name) @autopilot_logging.log_action(logger.info) def click_back_button(self): """Click the back button of the toolbar.""" self.click_button('back_toolbar_button') ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/__init__.py0000644000015600001650000000576712700370701026315 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Ubuntu UI Toolkit Autopilot custom proxy objects.""" __all__ = [ 'AppHeader', 'ActionBar', 'ActionSelectionPopover', 'check_autopilot_version', 'CheckBox', 'get_keyboard', 'get_pointing_device', 'Header', 'Dialog', 'listitems', 'UCListItem', 'MainView', 'OptionSelector', 'pickers', 'popups', 'QQuickFlickable', 'QQuickGridView', 'QQuickListView', 'Sections', 'TabBar', 'Tabs', 'TextArea', 'TextField', 'Toolbar', 'ToolkitException', 'UbuntuListView11', 'UbuntuListView', 'UbuntuUIToolkitCustomProxyObjectBase', ] from ubuntuuitoolkit._custom_proxy_objects._actionbar import ActionBar from ubuntuuitoolkit._custom_proxy_objects._sections import Sections from ubuntuuitoolkit._custom_proxy_objects._checkbox import CheckBox from ubuntuuitoolkit._custom_proxy_objects._common import ( check_autopilot_version, get_keyboard, get_pointing_device, ToolkitException, UbuntuUIToolkitCustomProxyObjectBase, ) from ubuntuuitoolkit._custom_proxy_objects._flickable import QQuickFlickable from ubuntuuitoolkit._custom_proxy_objects._header import ( AppHeader, Header, ) from ubuntuuitoolkit._custom_proxy_objects.popups import ( Dialog, ActionSelectionPopover, ) from ubuntuuitoolkit._custom_proxy_objects import listitems from ubuntuuitoolkit._custom_proxy_objects._uclistitem import ( UCListItem ) from ubuntuuitoolkit._custom_proxy_objects._mainview import MainView from ubuntuuitoolkit._custom_proxy_objects._optionselector import ( OptionSelector ) from ubuntuuitoolkit._custom_proxy_objects import pickers from ubuntuuitoolkit._custom_proxy_objects import popups from ubuntuuitoolkit._custom_proxy_objects._qquickgridview import ( QQuickGridView ) from ubuntuuitoolkit._custom_proxy_objects._qquicklistview import ( QQuickListView ) from ubuntuuitoolkit._custom_proxy_objects._tabbar import TabBar from ubuntuuitoolkit._custom_proxy_objects._tabs import Tabs from ubuntuuitoolkit._custom_proxy_objects._textarea import TextArea from ubuntuuitoolkit._custom_proxy_objects._textfield import TextField from ubuntuuitoolkit._custom_proxy_objects._toolbar import Toolbar from ubuntuuitoolkit._custom_proxy_objects._ubuntulistview import ( UbuntuListView11, UbuntuListView, ) ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/popups.py0000644000015600001650000001262212700370701026070 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import logging from autopilot import logging as autopilot_logging from autopilot.introspection import dbus from autopilot import introspection from ubuntuuitoolkit._custom_proxy_objects import _common logger = logging.getLogger(__name__) class Dialog(_common.UbuntuUIToolkitCustomProxyObjectBase): """Autopilot helper for the Dialog component.""" class TextInputPopover(_common.UbuntuUIToolkitCustomProxyObjectBase): """TextInputPopover Autopilot emulator .""" def click_option_by_text(self, text): """Click a button on the popover. XXX We are receiving the text because there's no way to set the objectName on the action. This is reported at https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1205144 --elopio - 2013-07-25 :parameter text: The text of the button. :raise ToolkitException: If the popover is not open. """ if not self.visible: raise _common.ToolkitException('The popover is not open.') button = self._get_button(text) if button is None: raise _common.ToolkitException( 'Button with text "{0}" not found.'.format(text)) self.pointing_device.click_object(button) if self.autoClose: try: self.visible.wait_for(False) except dbus.StateNotFoundError: # The popover was removed from the tree. pass def _get_button(self, text): # Try the C++ class name in case this is a 1.3 AbstractButton try: return self.wait_select_single('UCAbstractButton', text=text) except dbus.StateNotFoundError: return self.wait_select_single('AbstractButton', text=text) class ActionSelectionPopover(_common.UbuntuUIToolkitCustomProxyObjectBase): """ActionSelectionPopover Autopilot custom proxy object.""" @classmethod def validate_dbus_object(cls, path, state): if super().validate_dbus_object(path, state): return True name = introspection.get_classname_from_path(path) if name == b'OverflowPanel': return True return False def click_action_button(self, action_object_name): """Click an action button on the popover. :parameter object_name: The QML objectName property of the action :raise ToolkitException: If there is no visible button with that object name or the popover is not open. """ if not self.visible: raise _common.ToolkitException('The popover is not open.') try: object_name = action_object_name + "_button" button = self.select_single(objectName=object_name) except dbus.StateNotFoundError: raise _common.ToolkitException( 'Action with objectName "{0}" not found.'.format(object_name)) self.pointing_device.click_object(button) if self.autoClose: try: self.visible.wait_for(False) except dbus.StateNotFoundError: # The popover was removed from the tree. pass def click_button_by_text(self, text): """Click a button on the popover. :parameter text: The text of the button. :raise ToolkitException: If there is no visible button with that label or the popover is not open. """ if not self.visible: raise _common.ToolkitException('The popover is not open.') button = self._get_button(text) if button is None: raise _common.ToolkitException( 'Button with text "{0}" not found.'.format(text)) self.pointing_device.click_object(button) if self.autoClose: try: self.visible.wait_for(False) except dbus.StateNotFoundError: # The popover was removed from the tree. pass def _get_button(self, text): buttons = self.select_many('Empty') for button in buttons: if button.text == text: return button class ComposerSheet(_common.UbuntuUIToolkitCustomProxyObjectBase): """ComposerSheet Autopilot custom proxy object.""" @autopilot_logging.log_action(logger.info) def confirm(self): """Confirm the composer sheet.""" button = self.select_single('Button', objectName='confirmButton') self.pointing_device.click_object(button) self.wait_until_destroyed() @autopilot_logging.log_action(logger.info) def cancel(self): """Cancel the composer sheet.""" button = self.select_single('Button', objectName='cancelButton') self.pointing_device.click_object(button) self.wait_until_destroyed() ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_ubuntulistview.py0000644000015600001650000000332512700370701030012 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from ubuntuuitoolkit._custom_proxy_objects import _qquicklistview class UbuntuListView11(_qquicklistview.QQuickListView): """Autopilot helper for the UbuntuListView 1.1.""" def pull_to_refresh_enabled(self): refresh = self.select_single('PullToRefresh') return refresh.enabled def manual_refresh_wait(self): refresh = self.select_single('PullToRefresh') if refresh.enabled: self.pull_to_refresh() refresh.wait_for_refresh() return True return False def manual_refresh_nowait(self): refresh = self.select_single('PullToRefresh') if refresh.enabled: self.pull_to_refresh() return True return False def wait_refresh_completed(self): refresh = self.select_single('PullToRefresh') if refresh.enabled: refresh.wait_for_refresh() return True return False class UbuntuListView(UbuntuListView11): """Autopilot helper for the UbuntuListView 1.3.""" ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_optionselector.py0000644000015600001650000000746312700370701027761 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import time from autopilot.introspection import dbus from ubuntuuitoolkit._custom_proxy_objects import _common class OptionSelector(_common.UbuntuUIToolkitCustomProxyObjectBase): """OptionSelector Autopilot custom proxy object""" def get_option_count(self): """Gets the number of items in the option selector""" self.list_view = self.select_single("QQuickListView") return self.list_view.count def get_selected_index(self): """Gets the current selected index of the QQuickListView""" self.list_view = self.select_single("QQuickListView") return self.list_view.currentIndex def get_selected_text(self): """gets the text of the currently selected item""" option_selector_delegate = self.select_single( 'OptionSelectorDelegate', focus='True') current_label = option_selector_delegate.select_single( 'Label', visible='True') return current_label.text def get_current_label(self): """gets the text of the currently selected item""" option_selector_delegate = self.select_single( 'OptionSelectorDelegate', focus='True') current_label = option_selector_delegate.select_single( 'Label', visible='True') return current_label def _expand(self): """Expand an optionselector if it's collapsed""" # if just collapsed it can think that the item is expanded # https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1240288 time.sleep(1) if not self.expanded and not self.currentlyExpanded: self.pointing_device.click_object(self.get_current_label()) self.currentlyExpanded.wait_for(True) # selecting the same item too quickly after expand # causes the wrong item to be selected # https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1231939 time.sleep(1) def select_option(self, *args, **kwargs): """Select delegate in option selector Example usage:: select_option(objectName="myOptionSelectorDelegate") select_option('Label', text="some_text_here") :parameter kwargs: keywords used to find property(s) of delegate in option selector """ if args: try: select_object = self.select_single( *args, **kwargs ) except dbus.StateNotFoundError: raise _common.ToolkitException( 'OptionSelectorDelegate with args {} and kwargs {} not ' 'found'.format(args, kwargs) ) else: try: select_object = self.select_single( 'OptionSelectorDelegate', **kwargs ) except dbus.StateNotFoundError: raise _common.ToolkitException( 'OptionSelectorDelegate with kwargs {} not found'.format( kwargs) ) self._expand() self.pointing_device.click_object(select_object) ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_flickable.py0000644000015600001650000003255112700370701026620 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2016 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import logging import autopilot.exceptions from autopilot import logging as autopilot_logging from ubuntuuitoolkit import units from ubuntuuitoolkit._custom_proxy_objects import _common logger = logging.getLogger(__name__) # FIXME: Only left-to-right (where x=0 is leftmost) layouts are taken into # account. Add support for horizontal flicking with right-to-left layouts. # Containers helpers. def _get_visible_container_top(containers): containers_top = [container.globalRect.y for container in containers] return max(containers_top) def _get_visible_container_bottom(containers): containers_bottom = [ container.globalRect.y + container.globalRect.height for container in containers if container.globalRect.height > 0] return min(containers_bottom) def _get_visible_container_leftmost(containers): containers_left = [container.globalRect.x for container in containers] return max(containers_left) def _get_visible_container_rightmost(containers): containers_right = [ container.globalRect.x + container.globalRect.width for container in containers if container.globalRect.width > 0] return min(containers_right) class Scrollable(_common.UbuntuUIToolkitCustomProxyObjectBase): @autopilot_logging.log_action(logger.info) def is_child_visible(self, child): """Determine if the child is visible. A child is visible if no scrolling is needed to reveal it. """ containers = self._get_containers() return self._is_child_visible(child, containers) def _get_containers(self): """Return a list with the containers to take into account when swiping. The list includes this flickable and the top-most container. TODO add additional flickables that are between this and the top container. --elopio - 2014-03-22 """ containers = [self._get_top_container(), self] return containers def _is_child_in_visible_y_range(self, child, containers): """Check if the center of the child has an y-value in the visible range. :return: True if the center of the child is y-visible, False otherwise. """ object_center_y = child.globalRect.y + child.globalRect.height // 2 visible_top = _get_visible_container_top(containers) visible_bottom = _get_visible_container_bottom(containers) return (object_center_y >= visible_top and object_center_y <= visible_bottom) def _is_child_in_visible_x_range(self, child, containers): """Check if the center of the child has an x-value in the visible range. :return: True if the center of the child is x-visible. False otherwise. """ object_center_x = child.globalRect.x + child.globalRect.width // 2 visible_left = _get_visible_container_leftmost(containers) visible_right = _get_visible_container_rightmost(containers) return (object_center_x >= visible_left and object_center_x <= visible_right) def _is_child_visible(self, child, containers): """Check if the center of the child is visible. :return: True if the center of the child is visible, False otherwise. """ return (self._is_child_in_visible_y_range(child, containers) and self._is_child_in_visible_x_range(child, containers)) def _slow_drag_rate(self): # I found that when the flickDeceleration is 1500, the rate should be # 5 and that when it's 100, the rate should be 1. With those two points # we can get the following equation. # XXX The deceleration might not be linear with respect to the rate, # but this works for the two types of scrollables we have for now. # --elopio - 2014-05-08 return (self.flickDeceleration + 250) / 350 def _slow_drag(self, start_x, stop_x, start_y, stop_y, rate=None): # If we drag too fast, we end up scrolling more than what we # should, sometimes missing the element we are looking for. # FIXME: Not all scrollables have contentX and contentY # (PathView does not have them), so use this only in a Flickable. original_content_y = self.contentY original_content_x = self.contentX if rate is None: rate = self._slow_drag_rate() self.pointing_device.drag(start_x, start_y, stop_x, stop_y, rate=rate) if (self.contentY == original_content_y and self.contentX == original_content_x): raise _common.ToolkitException('Could not swipe in the flickable.') class QQuickFlickable(Scrollable): # Swiping from below can open the deprecated toolbar or trigger the bottom # edge gesture. Use this margin to start a swipe that will not be that # close to the bottom edge. margin_to_swipe_from_bottom = units.gu(2) # Swiping from above can open the indicators or resize the window. Use this # margin to start a swipe that will not be that close to the top edge. margin_to_swipe_from_top = units.gu(1) # Swiping from left and right can show the launcher or open app switcher. margin_to_swipe_from_left = units.gu(3) margin_to_swipe_from_right = units.gu(3) @autopilot_logging.log_action(logger.info) def swipe_child_into_view(self, child): """Make the child visible. """ containers = self._get_containers() if not self._is_child_visible(child, containers): self._swipe_non_visible_child_into_view(child, containers) else: logger.debug('The element is already visible.') @autopilot_logging.log_action(logger.info) def _swipe_non_visible_child_into_view(self, child, containers): while not self._is_child_in_visible_y_range(child, containers): # Check the direction of the swipe based on the position of the # child relative to the immediate flickable container. if child.globalRect.y < self.globalRect.y: self.swipe_to_show_more_above(containers) else: self.swipe_to_show_more_below(containers) while not self._is_child_in_visible_x_range(child, containers): if child.globalRect.x < self.globalRect.x: self.swipe_to_show_more_left(containers) else: self.swipe_to_show_more_right(containers) @autopilot_logging.log_action(logger.info) def swipe_to_show_more_above(self, containers=None): if self.atYBeginning: raise _common.ToolkitException( "Can't swipe more, we are already at the top of the " "container.") else: self._swipe_to_show_more('above', containers) @autopilot_logging.log_action(logger.info) def swipe_to_show_more_below(self, containers=None): if self.atYEnd: raise _common.ToolkitException( "Can't swipe more, we are already at the bottom of the " "container.") else: self._swipe_to_show_more('below', containers) @autopilot_logging.log_action(logger.info) def swipe_to_show_more_left(self, containers=None): if self.atXBeginning: raise _common.ToolkitException( "Can't swipe more, we are already at the left of the " "container.") else: self._swipe_to_show_more('left', containers) @autopilot_logging.log_action(logger.info) def swipe_to_show_more_right(self, containers=None): if self.atXEnd: raise _common.ToolkitException( "Can't swipe more, we are already at the right of the " "container.") else: self._swipe_to_show_more('right', containers) def _swipe_to_show_more(self, direction, containers=None): if containers is None: containers = self._get_containers() start_x = stop_x = self.globalRect.x + (self.globalRect.width // 2) start_y = stop_y = self.globalRect.y + (self.globalRect.height // 2) top = _get_visible_container_top(containers) bottom = _get_visible_container_bottom(containers) leftmost = _get_visible_container_leftmost(containers) rightmost = _get_visible_container_rightmost(containers) # Make the drag range be a multiple of the drag "rate" value. # Workarounds https://bugs.launchpad.net/mir/+bug/1399690 rate = self._slow_drag_rate() # The swipes are not done from right at the top and bottom because # they could trigger edge gestures or resize windows. if direction == 'below': start_y = bottom - self.margin_to_swipe_from_bottom stop_y = start_y + (top - start_y) / rate * rate elif direction == 'above': start_y = top + self.margin_to_swipe_from_top stop_y = start_y + (bottom - start_y) / rate * rate elif direction == 'left': start_x = leftmost + self.margin_to_swipe_from_left stop_x = start_x + (rightmost - start_x) / rate * rate elif direction == 'right': start_x = rightmost - self.margin_to_swipe_from_right stop_x = start_x + (leftmost - start_x) / rate * rate else: raise _common.ToolkitException( 'Invalid direction {}.'.format(direction)) self._slow_drag(start_x, stop_x, start_y, stop_y, rate) self.dragging.wait_for(False) self.moving.wait_for(False) @autopilot_logging.log_action(logger.info) def swipe_to_top(self): if not self.atYBeginning: containers = self._get_containers() while not self.atYBeginning: self.swipe_to_show_more_above(containers) @autopilot_logging.log_action(logger.info) def swipe_to_bottom(self): if not self.atYEnd: containers = self._get_containers() while not self.atYEnd: self.swipe_to_show_more_below(containers) @autopilot_logging.log_action(logger.info) def swipe_to_leftmost(self): if not self.atXBeginning: containers = self._get_containers() while not self.atXBeginning: self.swipe_to_show_more_left(containers) def swipe_to_rightmost(self): if not self.atXEnd: containers = self._get_containers() while not self.atXEnd: self.swipe_to_show_more_right(containers) @autopilot_logging.log_action(logger.info) def pull_to_refresh(self): """Pulls the flickable down and triggers a refresh on it. :raises ubuntuuitoolkit.ToolkitException: If the flickable has no pull to release functionality. """ try: pull_to_refresh = self.select_single(PullToRefresh) except autopilot.exceptions.StateNotFoundError: raise _common.ToolkitException( 'The flickable has no pull to refresh functionality.') self.swipe_to_top() self._swipe_to_middle() pull_to_refresh.wait_for_refresh() @autopilot_logging.log_action(logger.info) def _swipe_to_middle(self): start_x = stop_x = self.globalRect.x + (self.globalRect.width // 2) # Start just a little under the top. containers = self._get_containers() top = _get_visible_container_top(containers) + 5 bottom = _get_visible_container_bottom(containers) start_y = top stop_y = (self.globalRect.y + bottom) // 2 self._slow_drag(start_x, stop_x, start_y, stop_y) self.dragging.wait_for(False) self.moving.wait_for(False) @autopilot_logging.log_action(logger.info) def _cancel_pull_to_refresh(self): """Swipe down the list and then swipe it up to cancel the refresh.""" # This method is kept private because it's not for the test writers to # call. It's to test pull to refresh. --elopio - 2014-05-22 self.swipe_to_top() start_x = stop_x = self.globalRect.x + (self.globalRect.width // 2) # Start just a little under the top. containers = self._get_containers() top = _get_visible_container_top(containers) + 5 bottom = _get_visible_container_bottom(containers) start_y = top stop_y = (self.globalRect.y + bottom) // 2 self.pointing_device.move(start_x, start_y) self.pointing_device.press() self.pointing_device.move(stop_x, stop_y) self.pointing_device.move(start_x, start_y) self.pointing_device.release() class PullToRefresh(_common.UbuntuUIToolkitCustomProxyObjectBase): """Autopilot helper for the PullToRefresh component.""" def wait_for_refresh(self): activity_indicator = self.select_single('ActivityIndicator') activity_indicator.running.wait_for(False) ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_checkbox.py0000644000015600001650000000417212700370701026470 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import logging from autopilot import logging as autopilot_logging from ubuntuuitoolkit._custom_proxy_objects import _common logger = logging.getLogger(__name__) class CheckBox(_common.UbuntuUIToolkitCustomProxyObjectBase): """CheckBox Autopilot custom proxy object.""" @autopilot_logging.log_action(logger.info) def check(self, timeout=10): """Check a CheckBox, if its not already checked. :parameter timeout: number of seconds to wait for the CheckBox to be checked. Default is 10. """ if not self.checked: self.change_state(timeout) @autopilot_logging.log_action(logger.info) def uncheck(self, timeout=10): """Uncheck a CheckBox, if its not already unchecked. :parameter timeout: number of seconds to wait for the CheckBox to be unchecked. Default is 10. """ if self.checked: self.change_state(timeout) @autopilot_logging.log_action(logger.info) def change_state(self, timeout=10): """Change the state of a CheckBox. If it is checked, it will be unchecked. If it is unchecked, it will be checked. :parameter time_out: number of seconds to wait for the CheckBox state to change. Default is 10. """ original_state = self.checked self.pointing_device.click_object(self) self.checked.wait_for(not original_state, timeout) ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_header.py0000644000015600001650000002665112700370701026140 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012-2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import logging from autopilot import logging as autopilot_logging from autopilot.introspection import dbus from ubuntuuitoolkit._custom_proxy_objects import ( _common, _tabbar ) _NO_TABS_ERROR = 'The MainView has no Tabs.' logger = logging.getLogger(__name__) class AppHeader(_common.UbuntuUIToolkitCustomProxyObjectBase): """AppHeader Autopilot custom proxy object.""" def __init__(self, *args): super().__init__(*args) if not hasattr(self, 'useDeprecatedToolbar'): self.useDeprecatedToolbar = None def ensure_visible(self): if not self._is_visible(): self._show() def _is_visible(self): return self.y == 0 def _show(self): # FIXME This will fail if the header is not linked to a flickable that # fills the main view. The header has a flickable property but it # can't be read by autopilot. See bug http://pad.lv/1318829 top_container = self._get_top_container() # Make the drag range be a multiple of the drag "rate" value. # Workarounds https://bugs.launchpad.net/mir/+bug/1399690 rate = 10 start_x = stop_x = self.globalRect.x + self.globalRect.width // 2 start_y = top_container.globalRect.y + 5 stop_y = start_y + self.globalRect.height // rate * rate self.pointing_device.drag(start_x, start_y, stop_x, stop_y, rate) self.y.wait_for(0) def wait_for_animation(self): try: style = self.select_single(objectName='PageHeadStyle') style.animating.wait_for(False) except dbus.StateNotFoundError: # AppHeader is not using the new PageHeadStyle, # so no need to wait. return # Wait showing/hiding animation of the header. self.moving.wait_for(False) @autopilot_logging.log_action(logger.info) def switch_to_section_by_index(self, index): """Select a section in the header divider :parameter index: The index of the section to select :raise ToolkitEmulatorException: If the selection index is out of range or useDeprecatedToolbar is set. """ self.ensure_visible() if self.useDeprecatedToolbar: raise _common.ToolkitException('Old header has no sections') self.wait_for_animation() try: # Ubuntu.Components >=1.3 sections = self.select_single( 'Sections', objectName='headerSectionsItem') sections.click_section_button(index) except dbus.StateNotFoundError: # Ubuntu.Components < 1.3, has no headerSectionsItem. try: object_name = "section_button_" + str(index) button = self.select_single(objectName=object_name) except dbus.StateNotFoundError: raise _common.ToolkitException( 'Button for section with given index not found') self.pointing_device.click_object(button) def get_selected_section_index(self): if self.useDeprecatedToolbar: raise _common.ToolkitException('Old header has no sections') self.wait_for_animation() try: # Ubuntu.Components >=1.3 sections = self.select_single( 'Sections', objectName='headerSectionsItem') return sections.selectedIndex except dbus.StateNotFoundError: # Ubuntu.Components < 1.3, has no headerSectionsItem. sectionsProperties = self.select_single( 'QQuickItem', objectName='sectionsProperties') return sectionsProperties.selectedIndex def click_back_button(self): self.ensure_visible() if self.useDeprecatedToolbar: raise _common.ToolkitException('Old header has no back button') try: self.wait_for_animation() back_button = self.select_single(objectName='backButton') except dbus.StateNotFoundError: raise _common.ToolkitException('Missing back button in header') if not back_button.visible: raise _common.ToolkitException('Back button in header not visible') self.pointing_device.click_object(back_button) self.wait_for_animation() def click_custom_back_button(self): self.ensure_visible() if self.useDeprecatedToolbar: raise _common.ToolkitException( 'Old header has no custom back button') try: self.wait_for_animation() custom_back_button = self.select_single( objectName='customBackButton') except dbus.StateNotFoundError: raise _common.ToolkitException( 'Missing custom back button in header') if not custom_back_button.visible: raise _common.ToolkitException( 'Custom back button in header not visible') self.pointing_device.click_object(custom_back_button) self.wait_for_animation() def _get_animating(self): if self.useDeprecatedToolbar: tab_bar_style = self.select_single('TabBarStyle') return tab_bar_style.animating else: return False @autopilot_logging.log_action(logger.info) def switch_to_next_tab(self): """Open the next tab. :raise ToolkitException: If the main view has no tabs. """ self.ensure_visible() if self.useDeprecatedToolbar: self._switch_to_next_tab_in_deprecated_tabbar() else: self._switch_to_next_tab_in_drawer() def _switch_to_next_tab_in_deprecated_tabbar(self): try: tab_bar = self.select_single(_tabbar.TabBar) except dbus.StateNotFoundError: raise _common.ToolkitException(_NO_TABS_ERROR) tab_bar.switch_to_next_tab() self._get_animating().wait_for(False) def _switch_to_next_tab_in_drawer(self): self.wait_for_animation() tabs_model_properties = self.select_single( 'QQuickItem', objectName='tabsModelProperties') if tabs_model_properties.count == 0: raise _common.ToolkitException(_NO_TABS_ERROR) next_tab_index = (tabs_model_properties.selectedIndex + 1) % tabs_model_properties.count self._switch_to_tab_in_drawer_by_index(next_tab_index) @autopilot_logging.log_action(logger.info) def switch_to_tab_by_index(self, index): """Open a tab. This only supports the new tabs in the header :parameter index: The index of the tab to open. :raise ToolkitException: If the tab index is out of range or useDeprecatedToolbar is set. """ self.ensure_visible() if self.useDeprecatedToolbar: raise _common.ToolkitException( "AppHeader.switch_to_tab_by_index only works with new header") else: self._switch_to_tab_in_drawer_by_index(index) def _switch_to_tab_in_drawer_by_index(self, index): self.wait_for_animation() try: tabs_drawer_button = self.select_single(objectName='tabsButton') except dbus.StateNotFoundError: raise _common.ToolkitException(_NO_TABS_ERROR) self.pointing_device.click_object(tabs_drawer_button) tabs_model_properties = self.select_single( 'QQuickItem', objectName='tabsModelProperties') if tabs_model_properties.selectedIndex == index: return popover = self.get_root_instance().select_single( objectName='tabsPopover') try: # 1.3, using ActionSelectionPopover action_name = 'select_tab_' + str(index) popover.click_action_button(action_name) except _common.ToolkitException: try: # < 1.3 using custom popover tab_button = self.get_root_instance().select_single( objectName='tabButton' + str(index)) self.pointing_device.click_object(tab_button) except dbus.StateNotFoundError: raise _common.ToolkitException( "Tab button {0} not found.".format(index)) self.wait_for_animation() def click_action_button(self, action_object_name): """Click an action button of the header. :parameter object_name: The QML objectName property of the action :raise ToolkitException: If there is no action button with that object name. """ self.ensure_visible() try: # for Ubuntu.Components 1.3 actionbar = self.select_single( 'ActionBar', objectName='headerActionBar') actionbar.click_action_button(action_object_name) except dbus.StateNotFoundError: # for Ubuntu.Components < 1.3 button = self._get_action_button(action_object_name) self.pointing_device.click_object(button) except _common.ToolkitException: # Catch 'Button not found in ActionBar or overflow' exception raise _common.ToolkitException( 'Button not found in header or overflow') self.wait_for_animation() def _get_action_button(self, action_object_name): self.wait_for_animation() try: object_name = action_object_name + "_header_button" button = self.select_single(objectName=object_name) except dbus.StateNotFoundError: # the button is not in the header, but it may be in the overflow try: button = self._get_action_button_in_overflow( action_object_name) except dbus.StateNotFoundError: raise _common.ToolkitException( 'Button not found in header or overflow') return button def _get_action_button_in_overflow(self, action_object_name): actions_overflow_button = self.select_single( objectName='actions_overflow_button') if not actions_overflow_button.visible: raise _common.ToolkitException('No actions in overflow') # open the popover self.pointing_device.click_object(actions_overflow_button) object_name = action_object_name + "_header_overflow_button" # the popover is not a child of the header, so use the root object # to find the requested button return self.get_root_instance().select_single(objectName=object_name) class Header(AppHeader): """Autopilot helper for the deprecated Header.""" def __init__(self, *args): logger.warning( 'Header is an internal QML component of Ubuntu.Components and ' 'its API may change or be removed at any moment. Please use ' 'MainView and Page instead.') super().__init__(*args) ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_actionbar.py0000644000015600001650000000534512700370701026647 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import logging from autopilot import logging as autopilot_logging from autopilot.introspection import dbus from ubuntuuitoolkit._custom_proxy_objects import _common logger = logging.getLogger(__name__) class ActionBar(_common.UbuntuUIToolkitCustomProxyObjectBase): """ActionBar Autopilot custom proxy object.""" def _open_overflow(self): """Click the overflow button and return the overflow panel""" actions_overflow_button = self.select_single( objectName='overflow_action_button') if not actions_overflow_button.visible: raise _common.ToolkitException('No actions in overflow') # open the popover self.pointing_device.click_object(actions_overflow_button) # the popover is not a child of the ActionBar, so use the popover # object to find the requested button try: popover = self.get_root_instance().select_single( objectName='actions_overflow_panel') except dbus.StateNotFoundError: raise _common.ToolkitException( 'Failed to select overflow panel') return popover @autopilot_logging.log_action(logger.info) def click_action_button(self, action_object_name): """Click an action button of the action bar. :parameter object_name: The QML objectName property of the action :raise ToolkitException: If there is no action button with that object name. """ try: object_name = action_object_name + "_button" button = self.select_single(objectName=object_name) self.pointing_device.click_object(button) except dbus.StateNotFoundError: # the button is not in the ActionBar, but it may be in the overflow try: popover = self._open_overflow() popover.click_action_button(action_object_name) except _common.ToolkitException: raise _common.ToolkitException( 'Button not found in ActionBar or overflow') ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_textfield.py0000644000015600001650000001103312700370701026664 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import logging from autopilot import logging as autopilot_logging from ubuntuuitoolkit._custom_proxy_objects import _common, _mainview logger = logging.getLogger(__name__) class TextField(_common.UbuntuUIToolkitCustomProxyObjectBase): """TextField Autopilot custom proxy object.""" def __init__(self, *args): super().__init__(*args) self.keyboard = _common.get_keyboard() @autopilot_logging.log_action(logger.info) def write(self, text, clear=True): """Write into the text field. :parameter text: The text to write. :parameter clear: If True, the text field will be cleared before writing the text. If False, the text will be appended at the end of the text field. Default is True. """ self._ensure_focused() if clear: self.clear() else: if not self.is_empty(): self._go_to_end() self.keyboard.type(text) @autopilot_logging.log_action(logger.info) def clear(self): """Clear the text field.""" self._ensure_focused() if not self.is_empty(): if self.hasClearButton: self._click_clear_button() else: self._clear_with_keys() self.text.wait_for('') def is_empty(self): """Return True if the text field is empty. False otherwise.""" return self.text == '' @autopilot_logging.log_action(logger.debug) def _click_clear_button(self): clear_button = self.select_single(objectName='clear_button') if not clear_button.visible: self.pointing_device.click_object(self) self.pointing_device.click_object(clear_button) @autopilot_logging.log_action(logger.debug) def _clear_with_keys(self): self._select_all() self.keyboard.press_and_release('\b') if not self.is_empty(): raise _common.ToolkitException('Failed to clear the text field.') @autopilot_logging.log_action(logger.debug) def _select_all(self): if not self._is_all_text_selected(): if self._is_keyboard_osk(): cursor = self.select_single('TextCursor', visible=True) self.pointing_device.click_object( cursor, time_between_events=0.5) self.pointing_device.click_object( cursor, time_between_events=0.5) root = self.get_root_instance() main_view = root.select_single(_mainview.MainView) popover = main_view.get_text_input_context_menu( 'text_input_contextmenu') popover.click_option_by_text('Select All') else: self._go_to_start() self.keyboard.press('Shift') self._go_to_end() self.keyboard.release('Shift') def _is_all_text_selected(self): return self.text == self.selectedText def _is_keyboard_osk(self): """Return True if the keyboard instance is the OSK.""" return _common.is_maliit_process_running() @autopilot_logging.log_action(logger.debug) def _go_to_end(self): if self._is_keyboard_osk(): from ubuntu_keyboard.emulators.keyboard import Keyboard Keyboard().send_end_key() else: self.keyboard.press_and_release('End') @autopilot_logging.log_action(logger.debug) def _go_to_start(self): if self._is_keyboard_osk(): from ubuntu_keyboard.emulators.keyboard import Keyboard Keyboard().send_home_key() else: self.keyboard.press_and_release('Home') @autopilot_logging.log_action(logger.debug) def _ensure_focused(self): if not self.activeFocus: self.pointing_device.click_object(self) self.activeFocus.wait_for(True) ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_mainview.py0000644000015600001650000002021012700370701026510 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Ubuntu UI Toolkit Autopilot custom proxy objects.""" import logging from autopilot import logging as autopilot_logging from autopilot.introspection import dbus from autopilot import introspection from ubuntuuitoolkit._custom_proxy_objects import ( _common, popups, _tabs, _toolbar, ) _NO_TABS_ERROR = 'The MainView has no Tabs.' _NO_TOOLBAR_ERROR = 'The MainView has no Toolbar.' logger = logging.getLogger(__name__) class MainView(_common.UbuntuUIToolkitCustomProxyObjectBase): """MainView Autopilot custom proxy object.""" def __init__(self, *args): super().__init__(*args) if not hasattr(self, 'useDeprecatedToolbar'): self.useDeprecatedToolbar = None @classmethod def validate_dbus_object(cls, path, state): if super().validate_dbus_object(path, state): # This covers MainView 0.1/1.0/1.1 and possible components # derived from MainView (e.g. "CustomMainView") that have # their own CPO. # Using objectName for selecting a MainView is recommneded. return True name = introspection.get_classname_from_path(path) if name == b'MainView12': # MainView 1.2. Must be selected using objectName. return True return False def get_header(self): """Return the AppHeader custom proxy object of the MainView.""" try: return self.select_single(objectName='MainView_Header') except dbus.StateNotFoundError: raise _common.ToolkitException('The main view has no header.') def get_toolbar(self): """Return the Toolbar custom proxy object of the MainView. :raise ToolkitException: If the main view has no toolbar. """ try: return self.select_single(_toolbar.Toolbar) except dbus.StateNotFoundError: raise _common.ToolkitException(_NO_TOOLBAR_ERROR) @autopilot_logging.log_action(logger.info) def open_toolbar(self): """Open the toolbar if it is not already opened. :return: The toolbar. :raise ToolkitException: If the main view has no toolbar. """ return self.get_toolbar().open() @autopilot_logging.log_action(logger.info) def close_toolbar(self): """Close the toolbar if it is opened. :raise ToolkitException: If the main view has no toolbar. """ self.get_toolbar().close() def get_tabs(self): """Return the Tabs custom proxy object of the MainView. :raise ToolkitException: If the main view has no tabs. """ try: return self.select_single(_tabs.Tabs) except dbus.StateNotFoundError: raise _common.ToolkitException(_NO_TABS_ERROR) @autopilot_logging.log_action(logger.info) def switch_to_next_tab(self): """Open the next tab. :return: The newly opened tab. """ logger.debug('Switch to next tab.') self.get_header().switch_to_next_tab() current_tab = self.get_tabs().get_current_tab() current_tab.visible.wait_for(True) return current_tab @autopilot_logging.log_action(logger.info) def switch_to_tab_by_index(self, index): """Open a tab. :parameter index: The index of the tab to open. :return: The newly opened tab. :raise ToolkitException: If the tab index is out of range. """ if self.useDeprecatedToolbar: return self._switch_to_tab_in_deprecated_tabbar_by_index(index) else: return self._switch_to_tab_in_drawer_by_index(index) def _switch_to_tab_in_deprecated_tabbar_by_index(self, index): tabs = self.get_tabs() number_of_tabs = tabs.get_number_of_tabs() if index >= number_of_tabs: raise _common.ToolkitException('Tab index out of range.') current_tab = tabs.get_current_tab() number_of_switches = 0 while not tabs.selectedTabIndex == index: logger.debug( 'Current tab index: {0}.'.format(tabs.selectedTabIndex)) if number_of_switches >= number_of_tabs - 1: # This prevents a loop. But if this error is ever raised, it's # likely there's a bug on the helper or on the QML Tab. raise _common.ToolkitException( 'The tab with index {0} was not selected.'.format(index)) current_tab = self.switch_to_next_tab() number_of_switches += 1 return current_tab def _switch_to_tab_in_drawer_by_index(self, index): tabs = self.get_tabs() number_of_tabs = tabs.get_number_of_tabs() if index >= number_of_tabs: raise _common.ToolkitException('Tab index out of range.') if index != tabs.selectedTabIndex: self.get_header().switch_to_tab_by_index(index) current_tab = tabs.get_current_tab() return current_tab @autopilot_logging.log_action(logger.info) def switch_to_previous_tab(self): """Open the previous tab. :return: The newly opened tab. """ tabs = self.get_tabs() if tabs.selectedTabIndex == 0: previous_tab_index = tabs.get_number_of_tabs() - 1 else: previous_tab_index = tabs.selectedTabIndex - 1 return self.switch_to_tab_by_index(previous_tab_index) @autopilot_logging.log_action(logger.info) def switch_to_tab(self, object_name): """Open a tab. :parameter object_name: The QML objectName property of the tab. :return: The newly opened tab. :raise ToolkitException: If there is no tab with that object name. """ tabs = self.get_tabs() for index, tab in enumerate(tabs.select_many('Tab')): if tab.objectName == object_name: return self.switch_to_tab_by_index(tab.index) raise _common.ToolkitException( 'Tab with objectName "{0}" not found.'.format(object_name)) def get_action_selection_popover(self, object_name): """Return an ActionSelectionPopover custom proxy object. :parameter object_name: The QML objectName property of the popover. """ return self.wait_select_single( popups.ActionSelectionPopover, objectName=object_name) def get_text_input_context_menu(self, object_name): """Return a TextInputContextMenu emulator. :parameter object_name: The QML objectName property of the popover. """ return self.wait_select_single( popups.TextInputPopover, objectName=object_name) @autopilot_logging.log_action(logger.info) def go_back(self): """Go to the previous page.""" if self.useDeprecatedToolbar: toolbar = self.open_toolbar() toolbar.click_back_button() else: self.get_header().click_back_button() @autopilot_logging.log_action(logger.info) def click_action_button(self, action_object_name): """Click the specified button. :parameter action_object_name: the objectName of the action to trigger. :raise ToolkitException: The requested button is not available. """ if self.useDeprecatedToolbar: raise _common.ToolkitException( "App is using deprecated toolbar instead of new header") else: header = self.open_header() header.click_action_button(action_object_name) ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/pickers.py0000644000015600001650000003056512700370701026210 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import datetime import logging from autopilot import logging as autopilot_logging from autopilot.introspection import dbus from ubuntuuitoolkit._custom_proxy_objects import ( _common, _qquicklistview ) logger = logging.getLogger(__name__) class DatePicker(_common.UbuntuUIToolkitCustomProxyObjectBase): """Autopilot helper for the DatePicker component.""" @autopilot_logging.log_action(logger.info) def pick_date(self, date): """Pick a date from the date picker. :parameter date: The date to pick. :type date: An object with year, month and day attributes, like python's datetime.date. :raises ubuntuuitoolkit.ToolkitException if the mode of the picker doesn't let select a date. """ if not self._is_date_picker(): raise _common.ToolkitException( "Can't pick date. The picker mode is: {!r}.".format(self.mode)) if 'Years' in self.mode: self._pick_year(date.year) self.year.wait_for(date.year) if 'Month' in self.mode: # Python's date object starts at one. The model in the date picker # at 0. self._pick_month(date.month - 1) self.month.wait_for(date.month - 1) if 'Day' in self.mode: self._pick_day(date.day) self.day.wait_for(date.day) def _is_date_picker(self): mode = self.mode if 'Years' in mode or 'Months' in mode or 'Days' in mode: return True else: return False @autopilot_logging.log_action(logger.info) def _pick_year(self, year): picker = self.select_single( 'Picker', objectName='PickerRow_YearPicker') list_view = picker.select_single( _qquicklistview.QQuickListView, objectName='Picker_Linear') self._pick_value(self.year, year, list_view) @autopilot_logging.log_action(logger.info) def _pick_month(self, month): self._pick_value_from_path_view('Month', self.month, month) @autopilot_logging.log_action(logger.info) def _pick_day(self, day): # Python's date object starts at one. The model in the date picker # at 0. self._pick_value_from_path_view('Day', self.day - 1, day - 1) def _pick_value_from_path_view(self, type_, current_value, new_value): picker = self.select_single( 'Picker', objectName='PickerRow_{}Picker'.format(type_)) path_view = picker.select_single( QQuickPathView, objectName='Picker_WrapAround') self._pick_value(current_value, new_value, path_view) def _pick_value(self, current_value, new_value, scrollable): if new_value > current_value: direction = 'below' elif new_value < current_value: direction = 'above' else: logger.debug('The value is already selected.') return scrollable.click_element( object_name='PickerRow_PickerLabel{}'.format(new_value), direction=direction) def get_date(self): """Return the currently selected date. :return: a python datetime.date object with the selected date. """ # Python's date object starts at one. The model in the date picker # at 0. return datetime.date(self.year, self.month + 1, self.day) @autopilot_logging.log_action(logger.info) def pick_time(self, time): """Pick a time from the date picker. :parameter time: The time to pick. :type time: An object with hour, minute and second attributes, like python's datetime.time. :raises ubuntuuitoolkit.ToolkitException if the mode of the picker doesn't let select a time. """ if not self._is_time_picker(): raise _common.ToolkitException( "Can't pick time. The picker mode is: {!r}.".format(self.mode)) # Workaround https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1346669 # By setting seconds, then minutes, then hours, erratic behavoir # can be dealt with if 'Seconds' in self.mode: self._pick_second(time.second) self.seconds.wait_for(time.second) if 'Minutes' in self.mode: self._pick_minute(time.minute) self.minutes.wait_for(time.minute) if 'Hours' in self.mode: self._pick_hour(time.hour) self.hours.wait_for(time.hour) def _is_time_picker(self): mode = self.mode if 'Hours' in mode or 'Minutes' in mode or 'Seconds' in mode: return True else: return False @autopilot_logging.log_action(logger.info) def _pick_hour(self, hour): self._pick_value_from_path_view('Hours', self.hours, hour) @autopilot_logging.log_action(logger.info) def _pick_minute(self, minute): self._pick_value_from_path_view('Minutes', self.minutes, minute) @autopilot_logging.log_action(logger.info) def _pick_second(self, second): self._pick_value_from_path_view('Seconds', self.seconds, second) def get_time(self): """Return the currently selected time. :return: a python datetime.time object with the selected time. """ return datetime.time(self.hours, self.minutes, self.seconds) # Containers helpers. def _get_visible_container_top(containers): containers_top = [container.globalRect.y for container in containers] return max(containers_top) def _get_visible_container_bottom(containers): containers_bottom = [ container.globalRect.y + container.globalRect.height for container in containers if container.globalRect.height > 0] return min(containers_bottom) class Scrollable(_common.UbuntuUIToolkitCustomProxyObjectBase): @autopilot_logging.log_action(logger.info) def is_child_visible(self, child): """Determine if the child is visible. A child is visible if no scrolling is needed to reveal it. """ containers = self._get_containers() return self._is_child_visible(child, containers) def _get_containers(self): """Return a list with the containers to take into account when swiping. The list includes this flickable and the top-most container. TODO add additional flickables that are between this and the top container. --elopio - 2014-03-22 """ containers = [self._get_top_container(), self] return containers def _is_child_visible(self, child, containers): """Check if the center of the child is visible. :return: True if the center of the child is visible, False otherwise. """ object_center = child.globalRect.y + child.globalRect.height // 2 visible_top = _get_visible_container_top(containers) visible_bottom = _get_visible_container_bottom(containers) return (object_center >= visible_top and object_center <= visible_bottom) def _slow_drag_rate(self): # I found that when the flickDeceleration is 1500, the rate should be # 5 and that when it's 100, the rate should be 1. With those two points # we can get the following equation. # XXX The deceleration might not be linear with respect to the rate, # but this works for the two types of scrollables we have for now. # --elopio - 2014-05-08 return (self.flickDeceleration + 250) / 350 def _slow_drag(self, start_x, stop_x, start_y, stop_y, rate=None): # If we drag too fast, we end up scrolling more than what we # should, sometimes missing the element we are looking for. # FIXME: QQuickPathView has no contentY property, but it was added # to the PathView used inside the Picker in Picker.qml original_content_y = self.contentY if rate is None: rate = self._slow_drag_rate() self.pointing_device.drag(start_x, start_y, stop_x, stop_y, rate=rate) if self.contentY == original_content_y: raise _common.ToolkitException('Could not swipe in the flickable.') class QQuickPathView(Scrollable): # TODO make it more general and move it to its own module. # --elopio - 2014-05-06 @autopilot_logging.log_action(logger.info) def click_element(self, object_name, direction='below'): try: element = self.select_single(objectName=object_name) except dbus.StateNotFoundError: # The element might be on a part of the list that hasn't been # created yet. We have to search for it scrolling. element = self._find_element(object_name, direction) self.swipe_child_into_view(element) self.pointing_device.click_object(element) @autopilot_logging.log_action(logger.info) def _find_element(self, object_name, direction): containers = self._get_containers() for index in range(self.count): if direction == 'below': swipe_method = self._swipe_to_show_one_more_below elif direction == 'above': swipe_method = self._swipe_to_show_one_more_above else: raise _common.ToolkitException( 'Invalid direction: {}'.format(direction)) swipe_method(containers) try: return self.select_single(objectName=object_name) except dbus.StateNotFoundError: pass raise _common.ToolkitException( 'List element with objectName "{}" not found.'.format(object_name)) @autopilot_logging.log_action(logger.info) def _swipe_to_show_one_more_above(self, containers): self._swipe_to_show_one_more('above', containers) @autopilot_logging.log_action(logger.info) def _swipe_to_show_one_more_below(self, containers): self._swipe_to_show_one_more('below', containers) def _swipe_to_show_one_more(self, direction, containers): start_x = stop_x = self.globalRect.x + (self.globalRect.width // 2) center_y = self.globalRect.y + (self.globalRect.height // 2) # XXX This assumes all the children are of the same height child = self.get_children_by_type('PickerDelegate')[0] top = center_y - (child.globalRect.height // 2) bottom = center_y + (child.globalRect.height // 2) if direction == 'below': start_y = bottom stop_y = top elif direction == 'above': start_y = top stop_y = bottom else: raise _common.ToolkitException( 'Invalid direction {}.'.format(direction)) self._slow_drag(start_x, stop_x, start_y, stop_y) self.dragging.wait_for(False) self.moving.wait_for(False) @autopilot_logging.log_action(logger.info) def swipe_child_into_view(self, child): """Make the child visible. Currently it works only when the object needs to be swiped vertically. TODO implement horizontal swiping. --elopio - 2014-03-21 """ containers = self._get_containers() if not self._is_child_visible(child, containers): self._swipe_non_visible_child_into_view(child, containers) else: logger.debug('The element is already visible.') @autopilot_logging.log_action(logger.info) def _swipe_non_visible_child_into_view(self, child, containers): while not self._is_child_visible(child, containers): # Check the direction of the swipe based on the position of the # child relative to the immediate flickable container. if child.globalRect.y < self.globalRect.y: self._swipe_to_show_one_more_above(containers) else: self._swipe_to_show_one_more_below(containers) ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_sections.py0000644000015600001650000000342612700370701026532 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2016 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import logging from autopilot import logging as autopilot_logging from autopilot.introspection import dbus from ubuntuuitoolkit._custom_proxy_objects import _common logger = logging.getLogger(__name__) class Sections(_common.UbuntuUIToolkitCustomProxyObjectBase): """Sections Autopilot custom proxy object.""" def __init__(self, *args): super().__init__(*args) self.listview = self.select_single(objectName='sections_listview') @autopilot_logging.log_action(logger.info) def click_section_button(self, section_index): """Click a section button of the Sections. :parameter section_index: The index of the section to click. :raise ToolkitException: If there is no section button with that index. """ button_object_name = 'section_button_' + str(section_index) try: self.listview.click_element(button_object_name) except _common.ToolkitException: raise _common.ToolkitException( 'Button with section index ' + str(section_index) + ' not found in Sections.') ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_tabbar.py0000644000015600001650000000513712700370701026137 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import logging from autopilot import logging as autopilot_logging from ubuntuuitoolkit._custom_proxy_objects import _common logger = logging.getLogger(__name__) class TabBar(_common.UbuntuUIToolkitCustomProxyObjectBase): """TabBar Autopilot custom proxy object.""" @autopilot_logging.log_action(logger.info) def switch_to_next_tab(self): """Open the next tab.""" self._activate_tab_bar() logger.debug('Click the next tab bar button.') self.pointing_device.click_object(self._get_next_tab_button()) def _activate_tab_bar(self): # First move to the tab bar to avoid timing issues when we find it in # selection mode but it's deselected while we move to it. self.pointing_device.move_to_object(self) if self.selectionMode: logger.debug('Already in selection mode.') else: # Click the tab bar to switch to selection mode. logger.debug('Click the tab bar to enable selection mode.') self.pointing_device.click_object(self) def _get_next_tab_button(self): current_index = self._get_selected_button_index() next_index = (current_index + 1) % self._get_number_of_tab_buttons() return self._get_tab_button(next_index) def _get_selected_button_index(self): return self.select_single('QQuickPathView').selectedButtonIndex def _get_number_of_tab_buttons(self): return len(self._get_tab_buttons()) def _get_tab_buttons(self): # TabBar is only used before 1.3, when there was no UCAbstractButton return self.select_many('AbstractButton') def _get_tab_button(self, index): buttons = self._get_tab_buttons() for button in buttons: if button.buttonIndex == index: return button raise _common.ToolkitException( 'There is no tab button with index {0}.'.format(index)) ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_qquicklistview.py0000644000015600001650000002411612700370701027766 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import logging import time from autopilot import ( input, logging as autopilot_logging, platform ) from autopilot.introspection import dbus from ubuntuuitoolkit._custom_proxy_objects import _common, _flickable logger = logging.getLogger(__name__) class QQuickListView(_flickable.QQuickFlickable): @autopilot_logging.log_action(logger.info) def click_element(self, object_name, direction=None): """Click an element from the list. It swipes the element into view if it's center is not visible. :parameter object_name: The objectName property of the element to click. :parameter direction: The direction where the element is, it can be either 'above' or 'below'. Default value is None, which means we don't know where the object is and we will need to search the full list. """ try: element = self.select_single(objectName=object_name) except dbus.StateNotFoundError: # The element might be on a part of the list that hasn't been # created yet. We have to search for it scrolling the entire list. element = self._find_element(object_name, direction) self.swipe_child_into_view(element) self.pointing_device.click_object(element) return element @autopilot_logging.log_action(logger.info) def _find_element(self, object_name, direction=None): if direction is None: # We don't know where the object is so we start looking for it from # the top or left, depending on the ListView orientation. if self.orientation == 2: # 2 == ListView.Vertical self.swipe_to_top() direction = 'below' else: # orientation == 1 == ListView.Horizontal self.swipe_to_leftmost() direction = 'right' if direction == 'below': fail_condition = lambda: self.atYEnd swipe_method = self.swipe_to_show_more_below elif direction == 'above': fail_condition = lambda: self.atYBeginning swipe_method = self.swipe_to_show_more_above elif direction == 'left': fail_condition = lambda: self.atXBeginning swipe_method = self.swipe_to_show_more_left elif direction == 'right': fail_condition = lambda: self.atXEnd swipe_method = self.swipe_to_show_more_right else: raise _common.ToolkitException( 'Invalid direction: {}'.format(direction)) containers = self._get_containers() while not fail_condition(): try: return self.select_single(objectName=object_name) except dbus.StateNotFoundError: swipe_method(containers) else: # We have reached the start or the end of the list. try: return self.select_single(objectName=object_name) except dbus.StateNotFoundError: raise _common.ToolkitException( 'List element with objectName "{}" not found.'.format( object_name)) def _is_element_cached(self, object_name): """Return the object with the given object name if the element is cached, or None if the element is not cached. """ try: child = self.select_single(objectName=object_name) except dbus.StateNotFoundError: return None return child def _is_element_visible(self, object_name): """Return True if the center of element with the given object name is visible and False otherwise. """ child = self._is_element_cached(object_name) if not child: return False; containers = self._get_containers() return self._is_child_visible(child, containers) @autopilot_logging.log_action(logger.info) def enable_select_mode(self): """Default implementation to enable select mode. Performs a long tap over the first list item in the ListView. The delegates must be the new ListItem components. """ self.swipe_to_top() first_item = self._get_first_item() self.pointing_device.click_object(first_item, press_duration=2) try: self.wait_select_single('QQuickItem', objectName='selection_panel0') except dbus.StateNotFoundError: raise _common.ToolkitException( 'ListView delegate is not a ListItem or not in selectMode') def _get_first_item(self): """Returns the first item from the ListView.""" items = self.get_children_by_type('QQuickItem')[0].get_children() items = sorted(items, key=lambda item: item.globalRect.y) return items[0] @autopilot_logging.log_action(logger.info) def drag_item(self, from_index, to_index): if platform.model() != 'Desktop': raise NotImplementedError( 'Drag does not work on the phone because of bug #1266601') self._enable_drag_mode() both_items_visible = ( self._is_drag_panel_visible(from_index) and self._is_drag_panel_visible(to_index)) if both_items_visible: self._drag_both_items_visible(from_index, to_index) else: self._drag_item_with_pagination(from_index, to_index) # wait 1 second till all animations complete time.sleep(1) @autopilot_logging.log_action(logger.debug) def _enable_drag_mode(self): self.swipe_to_top() first_item = self._get_first_item() self.pointing_device.click_object(first_item, press_duration=2) self._get_drag_panel(wait=True) def _is_drag_panel_visible(self, index): try: drag_panel = self._get_drag_panel(index) except: return False else: return self.is_child_visible(drag_panel) def _get_drag_panel(self, index=0, wait=False): select_method = self.wait_select_single if wait else self.select_single try: return select_method( 'QQuickItem', objectName='drag_panel{}'.format(index)) except ValueError: # While we are dragging, each panel item is duplicated. # A ValueError will be raised in this scenario. We can take # any of the returned elements, as they have the same position. return self.select_many( 'QQuickItem', objectName='drag_panel{}'.format(index))[0] def _drag_both_items_visible(self, from_index, to_index): from_drag_handler = self._get_drag_panel(from_index) to_drag_handler = self._get_drag_panel(to_index) start_x, start_y = input.get_center_point(from_drag_handler) stop_x, stop_y = input.get_center_point(to_drag_handler) self.pointing_device.drag(start_x, start_y, stop_x, stop_y) def _drag_item_with_pagination(self, from_index, to_index): # the from_index might be invisible from_item = self._find_element('listitem{}'.format(from_index)) from_item.swipe_into_view() from_drag_panel = self._get_drag_panel(from_index) containers = self._get_containers() if from_index < to_index: self._drag_downwards(from_drag_panel, to_index, containers) else: self._drag_upwards(from_drag_panel, to_index, containers) def _drag_downwards(self, drag_panel, to_index, containers): visible_bottom = _flickable._get_visible_container_bottom( containers) start_x, start_y = input.get_center_point(drag_panel) self.pointing_device.move(start_x, start_y) self.pointing_device.press() stop_x = start_x self.pointing_device.move(stop_x, visible_bottom) to_drag_panel = self._get_drag_panel(to_index, wait=True) while not self.is_child_visible(to_drag_panel): pass # stop moving h = to_drag_panel.height / 2 self.pointing_device.move(stop_x, self.pointing_device.y - h) # move under the item with the to_index to_drag_panel = self._get_drag_panel(to_index - 1) stop_y = ( to_drag_panel.globalRect.y + to_drag_panel.globalRect.height) self.pointing_device.move(stop_x, stop_y) self.pointing_device.release() def _drag_upwards(self, handler, to_index, containers): visible_top = _flickable._get_visible_container_top( containers) start_x, start_y = input.get_center_point(handler) self.pointing_device.move(start_x, start_y) self.pointing_device.press() stop_x = start_x # Header alters topMargin, therefore drag only till that edge self.pointing_device.move(stop_x, visible_top + self.topMargin) to_drag_panel = self._get_drag_panel(to_index, wait=True) while not self.is_child_visible(to_drag_panel): pass # stop moving h = to_drag_panel.height / 2 self.pointing_device.move(stop_x, self.pointing_device.y + h) # move after the item with the to_index to_drag_panel = self._get_drag_panel(to_index) stop_y = ( to_drag_panel.globalRect.y + to_drag_panel.globalRect.height) self.pointing_device.move(stop_x, stop_y) self.pointing_device.release() ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/listitems.py0000644000015600001650000001261312700370701026557 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import logging from autopilot import logging as autopilot_logging from autopilot.introspection import dbus from ubuntuuitoolkit._custom_proxy_objects import _common logger = logging.getLogger(__name__) class Empty(_common.UbuntuUIToolkitCustomProxyObjectBase): """Base class to emulate swipe to delete.""" def exists(self): try: return self.implicitHeight > 0 except dbus.StateNotFoundError: return False def _get_confirm_button(self): return self.select_single( 'QQuickItem', objectName='confirmRemovalDialog') @autopilot_logging.log_action(logger.info) def swipe_to_delete(self, direction='deprecated'): """Swipe the item in from left to right in order to delete it. :param direction: deprecated. The only direction that will cause a delete is left to right. Do not pass any argument to this method, because it will be removed in future versions. """ if direction != 'deprecated': logger.warn( 'The direction argument is deprecated. Now the Ubuntu SDK ' 'only deletes list items when swiping from left to right. ' 'Call swipe_to_delete without arguments.') else: direction = 'right' if self.removable: self._swipe_to_delete_removable_item(direction) else: raise _common.ToolkitException( 'The item "{0}" is not removable'.format(self.objectName)) def _swipe_to_delete_removable_item(self, direction): if direction == 'left': raise _common.ToolkitException( 'Only swiping to the right will cause the item to be deleted.') elif direction != 'right': raise _common.ToolkitException( 'Invalid direction "{0}" used on swipe to delete function' .format(direction)) self._drag_pointing_device_to_delete() if self.confirmRemoval: self.waitingConfirmationForRemoval.wait_for(True) else: self._wait_until_deleted() def _drag_pointing_device_to_delete(self): x, y, width, height = self.globalRect start_x = x + (width * 0.2) stop_x = x + (width * 0.8) start_y = stop_y = y + (height // 2) self.pointing_device.drag(start_x, start_y, stop_x, stop_y) def _wait_until_deleted(self): try: # The item was hidden. self.implicitHeight.wait_for(0) except dbus.StateNotFoundError: # The item was destroyed. pass @autopilot_logging.log_action(logger.info) def confirm_removal(self): """Comfirm item removal if this was already swiped.""" if self.waitingConfirmationForRemoval: deleteButton = self._get_confirm_button() self.pointing_device.click_object(deleteButton) self._wait_until_deleted() else: raise _common.ToolkitException( 'The item "{0}" is not waiting for removal confirmation'. format(self.objectName)) class Base(Empty): pass class Expandable(Empty): @autopilot_logging.log_action(logger.info) def expand(self): """Expand an expandable list item. If the item is already expanded, no action will be executed. If you want to check if the item is expanded, you can use the ``expanded`` property. """ if not self.expanded: self._click_always_visible_section() self.expanded.wait_for(True) self.height.wait_for(self.expandedHeight) else: logger.debug('The item is already expanded.') @autopilot_logging.log_action(logger.debug) def _click_always_visible_section(self): self.pointing_device.move( self.globalRect.x + self.globalRect.width // 2, self.globalRect.y + self.collapsedHeight // 2) self.pointing_device.click() @autopilot_logging.log_action(logger.info) def collapse(self): """Collapse an expandable list item. If the item is already collapsed, no action will be executed. If you want to check if the item is expanded, you can use the ``expanded`` property. """ if self.expanded: self._click_always_visible_section() self.expanded.wait_for(False) self.height.wait_for(self.collapsedHeight) else: logger.debug('The item is already collapsed.') class Standard(Empty): pass class ItemSelector(Empty): pass class SingleControl(Empty): pass class MultiValue(Base): pass class SingleValue(Base): pass class Subtitled(Base): pass ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_common.py0000644000015600001650000002104612700370701026171 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Common helpers for Ubuntu UI Toolkit Autopilot custom proxy objects.""" import logging import os import subprocess import time from distutils import version from gi.repository import Gio import autopilot from autopilot import ( input, logging as autopilot_logging, platform ) from autopilot.introspection import dbus logger = logging.getLogger(__name__) MALIIT = 'maliit-server' class ToolkitException(Exception): """Exception raised when there is an error with the custom proxy object.""" def get_pointing_device(): """Return the pointing device depending on the platform. If the platform is `Desktop`, the pointing device will be a `Mouse`. If not, the pointing device will be `Touch`. """ if platform.model() == 'Desktop': input_device_class = input.Mouse else: input_device_class = input.Touch return input.Pointer(device=input_device_class.create()) def get_keyboard(): """Return the keyboard device.""" if is_maliit_process_running(): configure_osk_settings() restart_maliit_with_testability() return input.Keyboard.create('OSK') else: return input.Keyboard.create() def restart_maliit_with_testability(): """Restart maliit-server with testability enabled.""" pid = get_process_pid(MALIIT) if _is_testability_enabled_for_process(pid): return _stop_process(MALIIT) _start_process(MALIIT, 'QT_LOAD_TESTABILITY=1') # This is needed to work around https://launchpad.net/bugs/1248913 time.sleep(5) def configure_osk_settings(): """Configure OSK ready for testing by turning off all helpers.""" gsettings = Gio.Settings.new("com.canonical.keyboard.maliit") gsettings.set_string("active-language", "en") gsettings.set_boolean("auto-capitalization", False) gsettings.set_boolean("auto-completion", False) gsettings.set_boolean("predictive-text", False) gsettings.set_boolean("spell-checking", False) gsettings.set_boolean("double-space-full-stop", False) def _is_testability_enabled_for_process(pid): """Return True if testability is enabled for specified process.""" proc_env = '/proc/{pid}/environ'.format(pid=pid) command = ['cat', proc_env] try: output = subprocess.check_output( command, stderr=subprocess.STDOUT, universal_newlines=True, ) except subprocess.CalledProcessError as e: e.args += ('Failed to get environment for pid {}: {}.'.format( pid, e.output),) raise return output.find('QT_LOAD_TESTABILITY=1') >= 0 def _stop_process(proc_name): """Stop process with name proc_name.""" logger.info('Stoping process {}.'.format(proc_name)) command = ['/sbin/initctl', 'stop', proc_name] try: output = subprocess.check_output( command, stderr=subprocess.STDOUT, universal_newlines=True, ) logger.info(output) except subprocess.CalledProcessError as e: e.args += ('Failed to stop {}: {}.'.format(proc_name, e.output),) raise def _start_process(proc_name, *args): """Start a process. :param proc_name: The name of the process. :param args: The arguments to be used when starting the job. :return: The process id of the started job. :raises CalledProcessError: if the job failed to start. """ logger.info('Starting job {} with arguments {}.'.format(proc_name, args)) command = ['/sbin/initctl', 'start', proc_name] + list(args) try: output = subprocess.check_output( command, stderr=subprocess.STDOUT, universal_newlines=True, ) logger.info(output) pid = get_process_pid(proc_name) except subprocess.CalledProcessError as e: e.args += ('Failed to start {}: {}.'.format(proc_name, e.output),) raise else: return pid def get_process_pid(proc_name): """Return the process id of a running job. :param str name: The name of the job. :raises ToolkitException: if the job is not running. """ status = get_process_status(proc_name) if "start/" not in status: raise ToolkitException( '{} is not in the running state.'.format(proc_name)) return int(status.split()[-1]) def get_process_status(name): """ Return the status of a process. :param str name: The name of the process. :return: Status of process as string, or zero length string if process is not found. """ try: return subprocess.check_output([ '/sbin/initctl', 'status', name ], universal_newlines=True, stderr=subprocess.DEVNULL) except subprocess.CalledProcessError: return '' def is_process_running(name): """Return True if the process is running. Otherwise, False. :param str name: The name of the process. :raises ToolkitException: if not possible to get status of the process. """ return 'start/' in get_process_status(name) def is_maliit_process_running(): """Return True if malitt-server process is running, False otherwise.""" # FIXME: lp#1542224 Use Maliit by default if 'UITK_USE_MALIIT' not in os.environ: logger.info("Not going to use Maliit - set UITK_USE_MALIIT to enable it") return False if is_process_running(MALIIT): logger.info('Using Maliit for keyboard input') return True logger.info('Maliit enabled but not running on the system') return False def check_autopilot_version(): """Check that the Autopilot installed version matches the one required. :raise ToolkitException: If the installed Autopilot version does't match the required by the custom proxy objects. """ installed_version = version.LooseVersion(autopilot.version) if installed_version < version.LooseVersion('1.4'): raise ToolkitException( 'The custom proxy objects require Autopilot 1.4 or higher.') class UbuntuUIToolkitCustomProxyObjectBase(dbus.CustomEmulatorBase): """A base class for all the Ubuntu UI Toolkit custom proxy objects.""" def __init__(self, *args): check_autopilot_version() super().__init__(*args) self.pointing_device = get_pointing_device() def is_flickable(self): """Check if the object is flickable. If the object has a flicking attribute, we consider it as a flickable. :return: True if the object is flickable. False otherwise. """ try: self.flicking return True except AttributeError: return False @autopilot_logging.log_action(logger.info) def swipe_into_view(self): """Make the object visible. Currently it works only when the object needs to be swiped vertically. TODO implement horizontal swiping. --elopio - 2014-03-21 """ flickable_parent = self._get_flickable_parent() flickable_parent.swipe_child_into_view(self) def _get_flickable_parent(self): parent = self.get_parent() root = self.get_root_instance() while parent.id != root.id: if parent.is_flickable(): return parent parent = parent.get_parent() raise ToolkitException( "The element is not contained in a Flickable so it can't be " "swiped into view.") def _get_top_container(self): """Return the top-most container with a globalRect.""" root = self.get_root_instance() parent = self.get_parent() top_container = None while parent.id != root.id: if hasattr(parent, 'globalRect'): top_container = parent parent = parent.get_parent() if top_container is None: raise ToolkitException('Could not find the top-most container.') else: return top_container ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_textarea.py0000644000015600001650000000372612700370701026523 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from ubuntuuitoolkit._custom_proxy_objects import _textfield class TextArea(_textfield.TextField): """TextArea autopilot emulator.""" def clear(self): """Clear the text area.""" self._ensure_focused() if not self.is_empty(): self._clear_with_keys() self.text.wait_for('') def _go_to_end(self): # We override this because the text areas can have more than one line. if self._is_keyboard_osk(): from ubuntu_keyboard.emulators.keyboard import Keyboard osk = Keyboard() while self.cursorPosition != len(self.text): # Move to the end of the line below osk.send_down_key() osk.send_end_key() else: self.keyboard.press_and_release('Ctrl+End') def _go_to_start(self): # We override this because the text areas can have more than one line. if self._is_keyboard_osk(): from ubuntu_keyboard.emulators.keyboard import Keyboard osk = Keyboard() while self.cursorPosition != 0: # Move to the start of the line above osk.send_up_key() osk.send_home_key() else: self.keyboard.press_and_release('Ctrl+Home') ./tests/autopilot/ubuntuuitoolkit/_custom_proxy_objects/_tabs.py0000644000015600001650000000267312700370701025637 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2012, 2013, 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from ubuntuuitoolkit._custom_proxy_objects import _common class Tabs(_common.UbuntuUIToolkitCustomProxyObjectBase): """Tabs Autopilot custom proxy object.""" def get_current_tab(self): """Return the currently selected tab.""" return self._get_tab(self.selectedTabIndex) def _get_tab(self, index): tabs = self._get_tabs() for tab in tabs: if tab.index == index: return tab else: raise _common.ToolkitException( 'There is no tab with index {0}.'.format(index)) def _get_tabs(self): return self.select_many('Tab') def get_number_of_tabs(self): """Return the number of tabs.""" return len(self._get_tabs()) ./tests/autopilot/ubuntuuitoolkit/base.py0000644000015600001650000000660512700370701021035 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2013, 2014, 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Base classes for Autopilot tests using the Ubuntu UI Toolkit.""" import logging import os import subprocess import ubuntuuitoolkit from autopilot.introspection import dbus from autopilot.matchers import Eventually from testtools.matchers import Equals from autopilot import ( input, platform, testcase ) logger = logging.getLogger(__name__) def get_host_multiarch(): if 'deb_host_multiarch' not in os.environ: # Discard errors: the one known message is "GCC not installed" os.environ['deb_host_multiarch'] = subprocess.check_output( ["dpkg-architecture", "-qDEB_HOST_MULTIARCH"], universal_newlines=True, stderr=subprocess.PIPE).strip() return os.environ['deb_host_multiarch'] def get_qmlscene_launch_command(): """Return the command to launch qmlscene for autopilot tests. This function is deprecated. Use get_toolkit_launcher_command() instead. """ logger.warn('This function is deprecated. ' 'Use get_toolkit_launcher_command() instead.') # We need to specify qt5 because qtchooser doesn't have a default # configuration on devices and it seems the environment variable # QT_SELECT=qt5 doesn't work for autopilot tests. --Mirv - 2013-10-03 arch = get_host_multiarch() return '/usr/lib/{}/qt5/bin/qmlscene'.format(arch) def get_toolkit_launcher_command(): root = ubuntuuitoolkit.tests.get_path_to_build_root() path_to_local_launcher = os.path.join( root, 'ubuntu-ui-toolkit-launcher', 'ubuntu-ui-toolkit-launcher') if os.path.exists(path_to_local_launcher): return path_to_local_launcher else: path_to_installed_launcher = os.path.join( '/', 'usr', 'bin', 'ubuntu-ui-toolkit-launcher') return path_to_installed_launcher class UbuntuUIToolkitAppTestCase(testcase.AutopilotTestCase): """Autopilot test case for applications using the Ubuntu UI Toolkit.""" def setUp(self): super().setUp() self.input_device_class = self._get_input_device_class() def _get_input_device_class(self): if platform.model() == 'Desktop': return input.Mouse else: return input.Touch def _assert_not_visible(self, type_name='*', **kwargs): """Confirm that an object is hidden. Internally this means asserting that selecting the object fails. """ try: object = self.main_view.select_single(type_name, **kwargs) # object.visible is always True if the select succeeds self.assertThat(object.visible, Eventually(Equals(False))) except dbus.StateNotFoundError: # Caret can't be selected because it's hidden pass ./tests/autopilot/ubuntuuitoolkit/environment.py0000644000015600001650000000450312700370701022462 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import logging import subprocess from autopilot import logging as autopilot_logging logger = logging.getLogger(__name__) def is_initctl_env_var_set(variable, global_=False): """Check True if an initctl environment variable is set. :param variable: The name of the variable to check. :param global: if True, the method will operate on the global environment table. Default is False. :return: True if the variable is set. False otherwise. """ try: get_initctl_env_var(variable, global_) return True except subprocess.CalledProcessError: return False def get_initctl_env_var(variable, global_=False): """Return the value of an initctl environment variable.""" command = ['/sbin/initctl', 'get-env', variable] if global_: command += ['--global'] output = subprocess.check_output( command, stderr=subprocess.STDOUT, universal_newlines=True) return output.rstrip() @autopilot_logging.log_action(logger.info) def set_initctl_env_var(variable, value, global_=False): """Set the value of an initctl environment variable.""" command = ['/sbin/initctl', 'set-env', '%s=%s' % (variable, value)] if global_: command += ['--global'] subprocess.call(command, stderr=subprocess.STDOUT, universal_newlines=True) @autopilot_logging.log_action(logger.info) def unset_initctl_env_var(variable, global_=False): """Remove an initctl environment variable.""" command = ['/sbin/initctl', 'unset-env', variable] if global_: command += ['--global'] subprocess.call( command, stderr=subprocess.STDOUT, universal_newlines=True) ./tests/autopilot/ubuntuuitoolkit/units.py0000644000015600001650000000241312700370701021256 0ustar jenkinsjenkins# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . """Ubuntu UI Toolkit units helpers.""" import os from ubuntuuitoolkit import environment ENV_GRID_UNIT_PX = 'GRID_UNIT_PX' DEFAULT_GRID_UNIT_PX = 8 def get_grid_unit(): grid_unit_px = os.environ.get(ENV_GRID_UNIT_PX, None) if not grid_unit_px and environment.is_initctl_env_var_set( ENV_GRID_UNIT_PX): grid_unit_px = environment.get_initctl_env_var(ENV_GRID_UNIT_PX) return float(grid_unit_px or DEFAULT_GRID_UNIT_PX) def gu(value): """"Return the number of pixels corresponding to value in grid units.""" return value * get_grid_unit() ./tests/packaging-sorting.sh0000755000015600001650000000233012700370714016204 0ustar jenkinsjenkins#!/bin/bash # Copyright 2016 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # # Author: Timo Jyrinki # Ensure packaging has gone through wrap-and-sort command if [ ! -f "/usr/bin/wrap-and-sort" ] ; then echo "Please install 'devscripts' package" exit 1 fi cd $(dirname $0) tmpdir=$(mktemp -d) cp -a ../debian $tmpdir wrap-and-sort -a -t -d $tmpdir/debian/ diff -urN ../debian $tmpdir/debian if [ $? == 1 ] ; then echo echo echo "*******************************************************" echo "Please run 'wrap-and-sort -a -t' to clean up packaging." echo "*******************************************************" echo exit 1 fi ./tests/unit/0000755000015600001650000000000012700370716013221 5ustar jenkinsjenkins./tests/unit/tst_argument/0000755000015600001650000000000012700370701015727 5ustar jenkinsjenkins./tests/unit/tst_argument/tst_argument.cpp0000644000015600001650000000635012700370701021153 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #define protected public #include "ucargument.h" #undef protected #include #include class tst_UCArgument : public QObject { Q_OBJECT private Q_SLOTS: void testAt() { UCArgument argument; QCOMPARE(argument.at(-2).type(), QVariant::Invalid); QCOMPARE(argument.at(0).type(), QVariant::Invalid); QCOMPARE(argument.at(1).type(), QVariant::Invalid); QCOMPARE(argument.at(2).type(), QVariant::Invalid); QStringList values; values << "value1" << "value2"; argument.setValues(values); QCOMPARE(argument.at(-2).type(), QVariant::Invalid); QCOMPARE(argument.at(0).type(), QVariant::String); QCOMPARE(argument.at(1).type(), QVariant::String); QCOMPARE(argument.at(2).type(), QVariant::Invalid); QCOMPARE(argument.at(0).toString(), QString("value1")); QCOMPARE(argument.at(1).toString(), QString("value2")); } void testSyntax() { QFETCH(QString, name); QFETCH(QStringList, valueNames); QFETCH(bool, required); QFETCH(QString, expectedSyntax); UCArgument argument; argument.setName(name); argument.setRequired(required); argument.setValueNames(valueNames); QCOMPARE(argument.syntax(), expectedSyntax); } void testSyntax_data() { QTest::addColumn("name"); QTest::addColumn("valueNames"); QTest::addColumn("required"); QTest::addColumn("expectedSyntax"); QStringList valueNames; valueNames << "VALUE1" << "VALUE2"; QTest::newRow("no name, no valueNames, not required") << "" << QStringList() << false << ""; QTest::newRow("name, no valueNames, not required") << "argument" << QStringList() << false << "--argument"; QTest::newRow("no name, 2 valueNames, not required") << "" << valueNames << false << "[VALUE1] [VALUE2]"; QTest::newRow("name, 2 valueNames, not required") << "argument" << valueNames << false << "--argument=VALUE1 VALUE2"; QTest::newRow("no name, no valueNames, required") << "" << QStringList() << true << ""; QTest::newRow("name, no valueNames, required") << "argument" << QStringList() << true << "--argument"; QTest::newRow("no name, 2 valueNames, required") << "" << valueNames << true << "VALUE1 VALUE2"; QTest::newRow("name, 2 valueNames, required") << "argument" << valueNames << true << "--argument=VALUE1 VALUE2"; } }; QTEST_MAIN(tst_UCArgument) #include "tst_argument.moc" ./tests/unit/tst_argument/tst_argument.pro0000644000015600001650000000007112700370701021163 0ustar jenkinsjenkinsinclude(../test-include.pri) SOURCES += tst_argument.cpp ./tests/unit/plugin_dependency.pri0000644000015600001650000000155512700370701017431 0ustar jenkinsjenkinsPLUGIN_SRC = $$PWD/../../src/Ubuntu PLUGIN_BLD = $$shadowed($$PWD)/../../qml/Ubuntu COMPONENTS_PATH = ../../../qml/Ubuntu/Components INCLUDEPATH += $$PLUGIN_SRC/Components/plugin INCLUDEPATH += $$PLUGIN_SRC/Test/plugin PRE_TARGETDEPS = $$PLUGIN_BLD/Components/libUbuntuComponents.so PRE_TARGETDEPS += $$PLUGIN_BLD/Test/libUbuntuTest.so LIBS += -L$$PLUGIN_BLD/Components -lUbuntuComponents LIBS += -L$$PLUGIN_BLD/Test -lUbuntuTest LIBS += -L$${ROOT_BUILD_DIR}/lib -lUbuntuGestures LIBS += -L$$PLUGIN_BLD/UbuntuToolkit -lUbuntuToolkit DEFINES += QUICK_TEST_SOURCE_DIR=\"\\\"$$_PRO_FILE_PWD_\\\"\" QMAKE_CXXFLAGS += -Werror DEFINES+=UBUNTU_COMPONENT_PATH='\\"$${ROOT_BUILD_DIR}/qml/Ubuntu/Components\\"' DEFINES+=UBUNTU_QML_IMPORT_PATH='\\"$${ROOT_BUILD_DIR}/qml\\"' DEFINES+=UBUNTU_SOURCE_ROOT='\\"$${ROOT_SOURCE_DIR}\\"' DEFINES+=UBUNTU_BUILD_ROOT='\\"$${ROOT_BUILD_DIR}\\"' ./tests/unit/unit.pro0000644000015600001650000000123012700370714014714 0ustar jenkinsjenkinsTEMPLATE = subdirs SUBDIRS += testparser ####################################### # these tests are failing in armhf/qemu # can not create QQuickView # tested with Qt 5 beta 1 and beta 2 # # https://bugs.launchpad.net/qemu-linaro/+bug/1084148 ####################################### #!contains(QMAKE_HOST.arch,armv7l) { SUBDIRS += tst_components \ tst_components_benchmark #} SUBDIRS += \ custom_qpa \ tst_units \ tst_scaling_image_provider \ tst_qquick_image_extension \ tst_performance \ tst_mainview \ tst_i18n \ tst_arguments \ tst_argument \ tst_alarms \ tst_theme \ tst_quickutils \ tst_tree ./tests/unit/test-include.pri0000644000015600001650000000020412700370714016327 0ustar jenkinsjenkinsinclude( plugin_dependency.pri ) include( add_makecheck.pri ) TEMPLATE = app QT += testlib qml quick CONFIG += no_keywords c++11 ./tests/unit/tst_components_benchmark/0000755000015600001650000000000012700370701020304 5ustar jenkinsjenkins./tests/unit/tst_components_benchmark/tst_components_benchmark.pro0000644000015600001650000000010612700370701026114 0ustar jenkinsjenkinsinclude(../test-include.pri) SOURCES += tst_components_benchmark.cpp ./tests/unit/tst_components_benchmark/tst_components_benchmark.cpp0000644000015600001650000000652112700370701026105 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include #include #include #include #include #include class tst_components_benchmark: public QObject { Q_OBJECT private Q_SLOTS: void benchmark_creation_components_data() { QTest::addColumn("fileName"); QDir dir; dir.setPath(QString("%1/%2.%3").arg(UBUNTU_COMPONENT_PATH).arg(MAJOR_VERSION(LATEST_UITK_VERSION)).arg(MINOR_VERSION(LATEST_UITK_VERSION))); QVERIFY2(dir.exists(), qPrintable(dir.absolutePath())); QStringList nameFilters; nameFilters << "*.qml"; dir.setNameFilters(nameFilters); dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); dir.setSorting(QDir::Size | QDir::Reversed); QFileInfoList list = dir.entryInfoList(); QVERIFY2(list.size(), qPrintable(dir.absolutePath())); for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); QTest::newRow(fileInfo.fileName().toLatin1()) << fileInfo.fileName(); } } void benchmark_creation_components() { QFETCH(QString, fileName); QQmlComponent component(&engine, fileName); QObject *obj = component.create(); obj->deleteLater(); QBENCHMARK { QObject *obj = component.create(); obj->deleteLater(); } } void benchmark_creation_listitems_data() { QTest::addColumn("fileName"); QDir dir; dir.setPath(QString("%1/ListItems/%2.%3").arg(UBUNTU_COMPONENT_PATH).arg(MAJOR_VERSION(LATEST_UITK_VERSION)).arg(MINOR_VERSION(LATEST_UITK_VERSION))); QVERIFY2(dir.exists(), qPrintable(dir.absolutePath())); QStringList nameFilters; nameFilters << "*.qml"; dir.setNameFilters(nameFilters); dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); dir.setSorting(QDir::Size | QDir::Reversed); QFileInfoList list = dir.entryInfoList(); QVERIFY2(list.size(), qPrintable(dir.absolutePath())); for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); QTest::newRow(fileInfo.fileName().toLatin1()) << fileInfo.fileName(); } } void benchmark_creation_listitems() { QFETCH(QString, fileName); QQmlComponent component(&engine, fileName); QObject *obj = component.create(); obj->deleteLater(); QBENCHMARK { QObject *obj = component.create(); obj->deleteLater(); } } private: QQmlEngine engine; }; QTEST_MAIN(tst_components_benchmark) #include "tst_components_benchmark.moc" ./tests/unit/README0000644000015600001650000000037412700370701014077 0ustar jenkinsjenkins== How to execute a single qml test == When current path is tests/unit/tst_components: QML2_IMPORT_PATH=../../../modules:$QML2_IMPORT_PATH UBUNTU_UI_TOOLKIT_THEMES_PATH=../../../modules qmltestrunner -input tst_yourtest.qml -import "../../../modules" ./tests/unit/tst_mainview/0000755000015600001650000000000012700370701015724 5ustar jenkinsjenkins./tests/unit/tst_mainview/PageTitle.qml0000644000015600001650000000153012700370701020314 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { objectName: "pageTitle" applicationName: "once.upon.a.time" Page { objectName: "page" title: 'Once upon a time' } } ./tests/unit/tst_mainview/Settings.qml0000644000015600001650000000171212700370701020240 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 import Qt.labs.settings 1.0 MainView { objectName: "settings" applicationName: "red.riding.hood" Settings { property alias nickname: textField.text } TextField { id: textField objectName: "textfield" text: "Red" } } ./tests/unit/tst_mainview/LocalStorage.qml0000644000015600001650000000216112700370701021016 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import QtQuick.LocalStorage 2.0 MainView { objectName: "localStorage" applicationName: "tv.island.pacific" Component.onCompleted: { var db = LocalStorage.openDatabaseSync("pacific.island.tv", "1.0", "lorem ipsum", 1000) db.transaction(function(tx){ tx.executeSql('CREATE TABLE IF NOT EXISTS Island(name TEXT)') tx.executeSql('INSERT INTO Island VALUES(?)', ['Tuvalu']) }) } } ./tests/unit/tst_mainview/TabsTitle.qml0000644000015600001650000000176612700370701020344 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { objectName: "tabsTitle" applicationName: "once.upon.a.time" Tabs { objectName: "tabs" Tab { title: 'Not the title you are looking for' page: Page { objectName: "page" title: 'Long long ago' } } } } ./tests/unit/tst_mainview/AppName.qml0000644000015600001650000000141112700370701017755 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { objectName: "appName" applicationName: "org.gnu.wildebeest" } ./tests/unit/tst_mainview/tst_mainview.pro0000644000015600001650000000015312700370701021156 0ustar jenkinsjenkinsinclude(../test-include.pri) QT += gui SOURCES += tst_mainview.cpp OTHER_FILES += $$system(ls tst_*.qml) ./tests/unit/tst_mainview/PageStack.qml0000644000015600001650000000174712700370701020312 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { objectName: "pageStack" applicationName: "once.upon.a.time" PageStack { id: stack objectName: "stack" Component.onCompleted: stack.push(pageOnStack) Page { id: pageOnStack objectName: "page" title: 'Far far away' } } } ./tests/unit/tst_mainview/tst_mainview.cpp0000644000015600001650000002015212700370701021141 0ustar jenkinsjenkins/* * Copyright 2012-2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ucapplication.h" #include "ucunits.h" #include "uctestcase.h" #include "plugin.h" class tst_MainView : public QObject { Q_OBJECT private: QQuickView *view; public: tst_MainView() : view(0) { } QQuickItem *loadTest(const QString &document) { // load the document view->setSource(QUrl::fromLocalFile(document)); QTest::waitForEvents(); return view->rootObject(); } QQuickItem *testItem(QQuickItem *that, const QString &identifier) { if (that->property(identifier.toLocal8Bit()).isValid()) return that->property(identifier.toLocal8Bit()).value(); QList children = that->findChildren(identifier); return (children.count() > 0) ? children[0] : 0; } private Q_SLOTS: void initTestCase() { QString modules(UBUNTU_QML_IMPORT_PATH); QVERIFY(QDir(modules).exists()); view = new QQuickView; QQmlEngine *quickEngine = view->engine(); UbuntuComponentsPlugin::initializeContextProperties(quickEngine); view->setGeometry(0,0, UCUnits::instance()->gu(40), UCUnits::instance()->gu(30)); //add modules folder so we have access to the plugin from QML QStringList imports = quickEngine->importPathList(); imports.prepend(QDir(modules).absolutePath()); quickEngine->setImportPathList(imports); } void cleanupTestCase() { delete view; } void testCase_AppName() { QQuickItem *root = loadTest("AppName.qml"); QVERIFY(root); QQuickItem *mainView = root; QString applicationName(mainView->property("applicationName").toString()); QCOMPARE(applicationName, QString("org.gnu.wildebeest")); QCOMPARE(applicationName, QCoreApplication::applicationName()); QCOMPARE(QString(""), QCoreApplication::organizationName()); } void testSetApplicationName() { QString appName("com.ubuntu.foo"); UCApplication::instance()->setApplicationName(appName); QCOMPARE(UCApplication::instance()->applicationName(), appName); QCOMPARE(QCoreApplication::applicationName(), appName); QCOMPARE(QString(""), QCoreApplication::organizationName()); } void testExpectedDataFolder() { QString appName("net.weight.gain"); UCApplication::instance()->setApplicationName(appName); QString dataFolder(QStandardPaths::writableLocation(QStandardPaths::DataLocation)); QString xdgDataHome(QProcessEnvironment::systemEnvironment().value("XDG_DATA_HOME", QProcessEnvironment::systemEnvironment().value("HOME") + "/.local/share")); QString expectedDataFolder(xdgDataHome + "/" + appName); QCOMPARE(dataFolder, expectedDataFolder); } void testExpectedCacheFolder() { QString appName("cat.long.very"); UCApplication::instance()->setApplicationName(appName); QString cacheFolder(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)); QString xdgCacheHome(QProcessEnvironment::systemEnvironment().value("XDG_CACHE_HOME", QProcessEnvironment::systemEnvironment().value("HOME") + "/.cache")); QString expectedCacheFolder(xdgCacheHome + "/" + appName); QCOMPARE(cacheFolder, expectedCacheFolder); } void testLocalStorage() { QQuickItem *root = loadTest("LocalStorage.qml"); QVERIFY(root); QQuickItem *mainView = root; QString applicationName(mainView->property("applicationName").toString()); QCOMPARE(applicationName, QString("tv.island.pacific")); QCOMPARE(applicationName, QCoreApplication::applicationName()); QCOMPARE(QString(""), QCoreApplication::organizationName()); QString dataFolder(QStandardPaths::writableLocation(QStandardPaths::DataLocation)); QString databaseFolder(dataFolder + "/Databases"); QVERIFY(QFile::exists(databaseFolder)); QString hash(QCryptographicHash::hash("pacific.island.tv", QCryptographicHash::Md5).toHex()); QString database(databaseFolder + "/" + hash + ".sqlite"); QVERIFY(QFile::exists(database)); } QString getConfFile(QString applicationName) { QString configFolder(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)); QString subFolder(configFolder + "/" + applicationName); QString filename(subFolder + "/" + applicationName + ".conf"); return filename; } void testLabsSettings() { QString applicationName("red.riding.hood"); // Delete file if it exists to avoid false positives QString filename(getConfFile(applicationName)); QFile::remove(filename); QQuickItem *root = loadTest("Settings.qml"); QVERIFY(root); QQuickItem *mainView = root; QCOMPARE(applicationName, mainView->property("applicationName").toString()); QCOMPARE(QString(applicationName), QCoreApplication::organizationDomain()); QQuickItem *textField(testItem(mainView, "textfield")); textField->setProperty("text", "Blue"); delete root; QVERIFY(QFile::exists(filename)); } void testQSettings() { QString applicationName("i.prefer.pi"); // Delete file if it exists to avoid false positives QString filename(getConfFile(applicationName)); QFile::remove(filename); UCApplication::instance()->setApplicationName(applicationName); // QSettings with defaults QSettings mySettings; mySettings.setValue("spam", "eggs"); // Force writing to disk mySettings.sync(); QVERIFY(QFile::exists(filename)); } void testNoWarnings_bug186065() { // An empty MainView would suffice QScopedPointertestCase (new UbuntuTestCase("AppName.qml")); // No warnings from QML QCOMPARE(testCase->warnings(), 0); } void testWindowTitleFromPage() { QScopedPointer testCase(new UbuntuTestCase("PageTitle.qml")); QQuickItem *page = testCase->findItem("page"); QCOMPARE(QString("Once upon a time"), page->property("title").toString()); QCOMPARE(testCase->title(), page->property("title").toString()); } void testWindowTitleFromStack() { QScopedPointer testCase(new UbuntuTestCase("PageStack.qml")); QQuickItem *page = testCase->findItem("page"); QCOMPARE(QString("Far far away"), page->property("title").toString()); QCOMPARE(testCase->title(), page->property("title").toString()); } void testWindowTitleFromTabs() { QScopedPointer testCase(new UbuntuTestCase("TabsTitle.qml")); QQuickItem *page = testCase->findItem("page"); QCOMPARE(QString("Long long ago"), page->property("title").toString()); QCOMPARE(testCase->title(), page->property("title").toString()); } }; QTEST_MAIN(tst_MainView) #include "tst_mainview.moc" ./tests/unit/tst_performance/0000755000015600001650000000000012700370701016406 5ustar jenkinsjenkins./tests/unit/tst_performance/SwitchStyleGrid.qml0000644000015600001650000000215712700370701022216 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Themes.Ambiance 0.1 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 Item { id: thisItem property Item item: thisItem property string text property color color property bool checked SwitchStyle { property Item styledItem: thisItem } } } } ./tests/unit/tst_performance/PaletteConfigurationOneColor.qml0000644000015600001650000000165612700370701024720 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes 1.3 StyledItem { width: 100 height: 62 property string newTheme theme: ThemeSettings { name: newTheme palette: Palette { normal.background: "#ABCDEF" } } } ./tests/unit/tst_performance/ListItemWithInlineActionsAndFourMouseAreas.qml0000644000015600001650000000363612700370701027443 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Column { width: 800 height: 600 Repeater { model: 5000 ListItem { trailingActions: ListItemActions { actions: [ Action {} ] } leadingActions: ListItemActions { actions: [ Action {}, Action {}, Action {} ] } Row { anchors.fill: parent MouseArea { id: firstContainer height: parent.height width: units.gu(4) } MouseArea { id: secondContainer height: parent.height width: parent.width - firstContainer.width - thirdContainer.width - fourthContainer.width } MouseArea { height: parent.height id: thirdContainer width: units.gu(4) } MouseArea { id: fourthContainer height: parent.height width: units.gu(4) } } } } } ./tests/unit/tst_performance/ListOfEmptyListItemLayout_withProgression.qml0000644000015600001650000000156712700370701027510 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Column { width: 800 height: 600 Repeater { model: 5000 ListItem { ListItemLayout { ProgressionSlot {} } } } } ./tests/unit/tst_performance/SliderGrid.qml0000644000015600001650000000154612700370701021157 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Themes.Ambiance 0.1 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 Slider {} } } ./tests/unit/tst_performance/ListOfCaptions.qml0000644000015600001650000000172012700370701022022 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.3 import Ubuntu.Components 1.2 import QtQuick.Layouts 1.1 Column { width: 800 height: 600 Repeater { id: repeater model: 5000 ListItem { RowLayout { anchors.fill: parent Captions { } } } } } ./tests/unit/tst_performance/PaletteConfigurationAllColors.qml0000644000015600001650000000337712700370701025074 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes 1.3 StyledItem { width: 100 height: 62 property string newTheme theme: ThemeSettings { name: newTheme palette: Palette { normal { background: "#ABCDEF" backgroundText: "#0F0F0F" base: "#ABCDEF" baseText: "#0F0F0F" foreground: "#ABCDEF" foregroundText: "#0F0F0F" overlay: "#ABCDEF" overlayText: "#0F0F0F" field: "#ABCDEF" fieldText: "#0F0F0F" selection: "#ABCDEF" } selected { background: "#ABCDEF" backgroundText: "#0F0F0F" base: "#ABCDEF" baseText: "#0F0F0F" foreground: "#ABCDEF" foregroundText: "#0F0F0F" overlay: "#ABCDEF" overlayText: "#0F0F0F" field: "#ABCDEF" fieldText: "#0F0F0F" selection: "#ABCDEF" } } } } ./tests/unit/tst_performance/ListItemWithActionsList.qml0000644000015600001650000000212412700370701023663 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.2 Column { width: 800 height: 600 ListItemActions { id: actions1 actions: [Action {}] } ListItemActions { id: actions2 actions: [ Action {}, Action {}, Action {} ] } Repeater { model: 5000 ListItem { trailingActions: actions1 leadingActions: actions2 } } } ./tests/unit/tst_performance/CheckBoxStyleGrid.qml0000644000015600001650000000216112700370701022436 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Themes.Ambiance 0.1 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 Item { id: thisItem property Item item: thisItem property string text property color color property bool checked CheckBoxStyle { property Item styledItem: thisItem } } } } ./tests/unit/tst_performance/ListItemsBaseList.qml0000644000015600001650000000154212700370701022467 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 as ListItems Column { width: 800 height: 600 Repeater { model: 5000 ListItems.Base { } } } ./tests/unit/tst_performance/tst_performance.cpp0000644000015600001650000001702312700370701022310 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include #include #include #include #include class tst_Performance : public QObject { Q_OBJECT public: tst_Performance() {} private: QQuickView *quickView; QQmlEngine *quickEngine; QQuickItem *loadDocument(const QString &document) { quickView->setSource(QUrl::fromLocalFile(document)); QTest::waitForEvents(); return quickView->rootObject(); } private Q_SLOTS: void initTestCase() { QString modules(UBUNTU_QML_IMPORT_PATH); QVERIFY(QDir(modules).exists()); quickView = new QQuickView(0); quickEngine = quickView->engine(); quickView->setGeometry(0,0, 240, 320); //add modules folder so we have access to the plugin from QML QStringList imports = quickEngine->importPathList(); imports.prepend(QDir(modules).absolutePath()); quickEngine->setImportPathList(imports); } void cleanupTestCase() { delete quickView; } void clean() { qputenv("SUPPRESS_DEPRECATED_NOTE", "no"); } void benchmark_theming_data() { QTest::addColumn("document"); QTest::addColumn("theme"); QTest::newRow("new theming, subtheming enabled, no theme change") << "StyledItemNewTheming.qml" << QUrl(); QTest::newRow("new theming, subtheming enabled, with theme change") << "StyledItemNewTheming.qml" << QUrl("Ubuntu.Components.Themes.SuruDark"); QTest::newRow("old theming, subtheming enabled") << "StyledItemOldTheming.qml" << QUrl("Ubuntu.Components.Themes.SuruDark"); QTest::newRow("subtheming, no changes on themes") << "Styling.qml" << QUrl(); QTest::newRow("subtheming, change mid item") << "Styling.qml" << QUrl("Ubuntu.Components.Themes.SuruDark"); QTest::newRow("Palette configuration of one color") << "PaletteConfigurationOneColor.qml" << QUrl("Ubuntu.Components.Themes.SuruDark"); QTest::newRow("Palette configuration of all colors") << "PaletteConfigurationAllColors.qml" << QUrl("Ubuntu.Components.Themes.SuruDark"); } void benchmark_theming() { QFETCH(QString, document); QFETCH(QUrl, theme); qputenv("SUPPRESS_DEPRECATED_NOTE", "yes"); QQuickItem *root = 0; QBENCHMARK { root = loadDocument(document); if (root && theme.isValid()) { root->setProperty("newTheme", theme.toString()); } } if (root) delete root; } void benchmark_GridOfComponents_data() { QTest::addColumn("document"); QTest::addColumn("theme"); QTest::newRow("AbstractButton 1.2") << "AbstractButtonGrid.qml" << QUrl(); QTest::newRow("AbstractButton 1.3") << "AbstractButton13Grid.qml" << QUrl(); QTest::newRow("grid with Rectangle") << "RectangleGrid.qml" << QUrl(); QTest::newRow("grid with Text") << "TextGrid.qml" << QUrl(); QTest::newRow("grid with Label 1.2") << "LabelGrid.qml" << QUrl(); QTest::newRow("grid with Label 1.3") << "LabelGrid13.qml" << QUrl(); QTest::newRow("grid with UbuntuShape") << "UbuntuShapeGrid.qml" << QUrl(); QTest::newRow("grid with UbuntuShapePair") << "PairOfUbuntuShapeGrid.qml" << QUrl(); QTest::newRow("grid with Button") << "ButtonGrid.qml" << QUrl(); QTest::newRow("grid with Slider") << "SliderGrid.qml" << QUrl(); QTest::newRow("list with QtQuick Item") << "ItemList.qml" << QUrl(); QTest::newRow("list with new ListItem") << "ListItemList.qml" << QUrl(); QTest::newRow("list with new ListItem 1.3") << "ListItemList13.qml" << QUrl(); QTest::newRow("list with new ListItem with actions") << "ListItemWithActionsList.qml" << QUrl(); QTest::newRow("list with new ListItem with inline actions") << "ListItemWithInlineActionsList.qml" << QUrl(); QTest::newRow("list with Captions, preset: caption") << "ListOfCaptions.qml" << QUrl(); QTest::newRow("list with Captions 1.3, preset: caption") << "ListOfCaptions13.qml" << QUrl(); QTest::newRow("list with ListItems.Empty (equivalent to the new ListItem") << "ListItemsEmptyList.qml" << QUrl(); QTest::newRow("list with new ListItem (inline actions!) with a Row of 4 Items") << "ListItemWithInlineActionsAndFourContainersList.qml" << QUrl(); QTest::newRow("list with new ListItem (inline actions!) with a Row of 4 MouseAreas") << "ListItemWithInlineActionsAndFourMouseAreas.qml" << QUrl(); QTest::newRow("list with new ListItem (no actions) and empty ListItemLayout") << "ListOfEmptyListItemLayout.qml" << QUrl(); QTest::newRow("list with new ListItem (no actions) and empty ListItemLayout with progression symbol") << "ListOfEmptyListItemLayout_withProgression.qml" << QUrl(); QTest::newRow("list with new ListItem (no actions) and ListItemLayout with 2 defined labels") << "ListOfListItemLayout_labelsOnly.qml" << QUrl(); QTest::newRow("list with new ListItem (no actions) and ListItemLayout with 2 defined labels and 3 slots") << "ListOfListItemLayout_complex1.qml" << QUrl(); QTest::newRow("list with new ListItem (inline actions!) and ListItemLayout with 3 labels and 3 slots") << "ListOfListItemLayout_complex2.qml" << QUrl(); QTest::newRow("list with new ListItem (inline actions!) and a custom purpose-built layout which simulates ListItemLayout with 3 labels and 3 slots") << "ListOfCustomListItemLayouts.qml" << QUrl(); QTest::newRow("list of Scrollbar 1.3") << "ListOfScrollbars_1_3.qml" << QUrl(); QTest::newRow("list of ScrollView 1.3 with both Scrollbars") << "ListOfScrollView_bothScrollbars_1_3.qml" << QUrl(); // disable this test as it takes >20 seconds. Kept still for measurements to be done during development // QTest::newRow("list with ListItems.Base (one icon, one label and one chevron)") << "ListItemsBaseList.qml" << QUrl(); QTest::newRow("single MainView") << "MainView.qml" << QUrl(); } void benchmark_GridOfComponents() { QFETCH(QString, document); QFETCH(QUrl, theme); QQuickItem *root = 0; QBENCHMARK { root = loadDocument(document); if (root && theme.isValid()) { root->setProperty("newTheme", theme.toString()); } } if (root) delete root; } void benchmark_import_data() { QTest::addColumn("document"); QTest::newRow("importing Ubuntu.Components") << "TextWithImportGrid.qml"; QTest::newRow("importing Ubuntu.Components.Popups") << "TextWithImportGrid.qml"; } void benchmark_import() { QFETCH(QString, document); QBENCHMARK { loadDocument(document); } } }; QTEST_MAIN(tst_Performance) #include "tst_performance.moc" ./tests/unit/tst_performance/SliderStyleGrid.qml0000644000015600001650000000247712700370701022204 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Themes.Ambiance 1.1 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 Item { id: thisItem property Item item: thisItem property real minimumValue: 0.0 property real maximumValue: 1.0 property bool live function formatValue(v){return v} property var __internals: MouseArea { property bool isPressed property bool liveValue } SliderStyle { property Item styledItem: thisItem } } } } ./tests/unit/tst_performance/ListOfScrollView_bothScrollbars_1_3.qml0000644000015600001650000000204012700370701026034 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 //FIXME: This test uses 3.2Gb of RAM with a model:5000! Column { width: 800 height: 600 Repeater { id: repeater model: 50 ScrollView { width: units.gu(10) height: units.gu(20) Item { width: units.gu(20) height: units.gu(30) } } } } ./tests/unit/tst_performance/ListOfHardcodedFourContainersLayout.qml0000644000015600001650000000156412700370701026205 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Column { width: 800 height: 600 Repeater { model: 5000 ListItem { HardcodedFourContainersLayout { } } } } ./tests/unit/tst_performance/RectangleGrid.qml0000644000015600001650000000143712700370701021640 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 Rectangle {} } } ./tests/unit/tst_performance/ListOfListItemLayout_complex2.qml0000644000015600001650000000304312700370701025003 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Column { width: 800 height: 600 Repeater { model: 5000 ListItem { trailingActions: ListItemActions { actions: [ Action {} ] } leadingActions: ListItemActions { actions: [ Action {}, Action {}, Action {} ] } ListItemLayout { Item { SlotsLayout.position: SlotsLayout.Leading; width: units.gu(2) } Item { SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(2) } Item { SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(2) } title.text: "test" subtitle.text: "label" summary.text: "new" } } } } ./tests/unit/tst_performance/MainView.qml0000644000015600001650000000134512700370701020643 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.1 MainView { useDeprecatedToolbar: false } ./tests/unit/tst_performance/UbuntuShapeGrid.qml0000644000015600001650000000147612700370701022202 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 UbuntuShape {} } } ./tests/unit/tst_performance/ListOfCaptions13.qml0000644000015600001650000000172012700370701022166 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.3 import Ubuntu.Components 1.3 import QtQuick.Layouts 1.1 Column { width: 800 height: 600 Repeater { id: repeater model: 5000 ListItem { RowLayout { anchors.fill: parent Captions { } } } } } ./tests/unit/tst_performance/ListItemList13.qml0000644000015600001650000000154612700370701021661 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.3 import Ubuntu.Components 1.3 Column { width: 800 height: 600 property alias count: repeater.count Repeater { id: repeater model: 5000 ListItem { } } } ./tests/unit/tst_performance/ListOfHardcodedFourContainersLayout_withItems.qml0000644000015600001650000000201412700370701030231 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Column { width: 800 height: 600 Repeater { model: 5000 ListItem { HardcodedFourContainersLayout { firstSlot: Item { width: units.gu(2); } secondSlot: Item { width: units.gu(2); } thirdSlot: Item { width: units.gu(2); } } } } } ./tests/unit/tst_performance/ListItemWithInlineActionsList.qml0000644000015600001650000000216612700370701025030 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.2 Column { width: 800 height: 600 Repeater { model: 5000 ListItem { trailingActions: ListItemActions { actions: [ Action {} ] } leadingActions: ListItemActions { actions: [ Action {}, Action {}, Action {} ] } } } } ./tests/unit/tst_performance/SwitchGrid.qml0000644000015600001650000000154612700370701021176 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Themes.Ambiance 0.1 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 Switch {} } } ./tests/unit/tst_performance/ListOfEmptyListItemLayout.qml0000644000015600001650000000154512700370701024216 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Column { width: 800 height: 600 Repeater { model: 5000 ListItem { ListItemLayout { } } } } ./tests/unit/tst_performance/LabelGrid.qml0000644000015600001650000000147012700370701020750 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 Label {} } } ./tests/unit/tst_performance/TextWithImportGrid.qml0000644000015600001650000000144612700370701022707 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 Grid { width: 800 height: 600 rows: 16 columns: 160 Repeater { model: 16*160 TextWithImport {} } } ./tests/unit/tst_performance/TextWithImportPopups.qml0000644000015600001650000000130712700370701023304 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components.Popups 1.0 Text { } ./tests/unit/tst_performance/CheckBoxGrid.qml0000644000015600001650000000154712700370701021424 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Themes.Ambiance 0.1 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 CheckBox{} } } ./tests/unit/tst_performance/ItemList.qml0000644000015600001650000000154412700370701020657 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Column { width: 800 height: 600 Repeater { model: 5000 Item { width: parent.width height: units.gu(6) } } } ./tests/unit/tst_performance/StyledItemOldTheming.qml0000644000015600001650000000376512700370701023172 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 StyledItem { id: component1 width: units.gu(50) height: units.gu(100) property string newTheme onNewThemeChanged: Theme.name = newTheme Column { anchors.fill: parent StyledItem { id: component2 width: units.gu(40) height: units.gu(80) StyledItem { id: component3 width: units.gu(40) height: units.gu(80) Item { anchors.fill: parent StyledItem { id: component4 width: units.gu(40) height: units.gu(80) } Loader { id: loader1 width: units.gu(30) height: units.gu(30) sourceComponent: dynamicItem } } } } Component { id: dynamicItem Item { StyledItem { id: component5 anchors.fill: parent } } } Loader { id: loader2 width: units.gu(30) height: units.gu(30) sourceComponent: dynamicItem } } } ./tests/unit/tst_performance/ListOfListItemLayout_complex1.qml0000644000015600001650000000224512700370701025005 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Column { width: 800 height: 600 Repeater { model: 5000 ListItem { ListItemLayout { Item { SlotsLayout.position: SlotsLayout.Leading; width: units.gu(2) } Item { SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(2) } Item { SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(2) } title.text: "test" subtitle.text: "label" } } } } ./tests/unit/tst_performance/TextWithImportPopupsGrid.qml0000644000015600001650000000145412700370701024115 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 Grid { width: 800 height: 600 rows: 16 columns: 160 Repeater { model: 16*160 TextWithImportPopups {} } } ./tests/unit/tst_performance/ListItemWithInlineActionsAndFourContainersList.qml0000644000015600001650000000361212700370701030332 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Column { width: 800 height: 600 Repeater { model: 5000 ListItem { trailingActions: ListItemActions { actions: [ Action {} ] } leadingActions: ListItemActions { actions: [ Action {}, Action {}, Action {} ] } Row { anchors.fill: parent Item { id: firstContainer height: parent.height width: units.gu(4) } Item { id: secondContainer height: parent.height width: parent.width - firstContainer.width - thirdContainer.width - fourthContainer.width } Item { height: parent.height id: thirdContainer width: units.gu(4) } Item { id: fourthContainer height: parent.height width: units.gu(4) } } } } } ./tests/unit/tst_performance/AbstractButtonGrid.qml0000644000015600001650000000151212700370701022665 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 AbstractButton { } } } ./tests/unit/tst_performance/ButtonStyleGrid.qml0000644000015600001650000000235012700370701022223 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Themes.Ambiance 1.1 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 Item { id: thisItem property Item item: thisItem property string text property url iconSource property string iconPosition: "left" property color color property Gradient gradient property font font ButtonStyle { property Item styledItem: thisItem } } } } ./tests/unit/tst_performance/ListOfCustomListItemLayouts.qml0000644000015600001650000000716012700370701024554 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Column { width: 800 height: 600 Repeater { model: 5000 ListItem { trailingActions: ListItemActions { actions: [ Action {} ] } leadingActions: ListItemActions { actions: [ Action {}, Action {}, Action {} ] } Row { id: row width: parent.width //use the max height of the components + 2gu margin per side height: Math.max(labelsContainer.height, Math.max(Math.max(item1.height, item2.height), item3.height)) + units.gu(4) MouseArea { id: slot1 height: parent.height width: item1.width + units.gu(3) Item { id: item1; anchors.centerIn: parent; width: units.gu(2) } } Item { id: labelsContainer height: title.height + subtitle.height + subsubtitle.height + units.gu(2) width: parent.width - slot1.width - slot2.width - slot3.width anchors.verticalCenter: parent.verticalCenter //Item { id: title; width: parent.width; } //Item { width: parent.width; anchors.top: title.bottom } Text { id: title; width: parent.width; text: "test"; font.weight: Font.Light; color: "#525252"; font.pixelSize: FontUtils.sizeToPixels("medium") } Text { id: subtitle anchors.top: title.baseline; anchors.topMargin: units.gu(1); width: parent.width; text: "test"; font.weight: Font.Light; color: "#525252"; font.pixelSize: FontUtils.sizeToPixels("small") } Text { id: subsubtitle anchors.top: subtitle.baseline; anchors.topMargin: units.gu(1); width: parent.width; text: "test"; font.weight: Font.Light; color: "#525252"; font.pixelSize: FontUtils.sizeToPixels("small") } } MouseArea { id: slot2 height: parent.height width: item2.width + units.gu(3) Item { id: item2; anchors.centerIn: parent; width: units.gu(2) } } MouseArea { id: slot3 height: parent.height width: item3.width + units.gu(3) Item { id: item3; anchors.centerIn: parent; width: units.gu(2) } } } } } }./tests/unit/tst_performance/TextGrid.qml0000644000015600001650000000143212700370701020653 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 Text {} } } ./tests/unit/tst_performance/tst_performance.pro0000644000015600001650000000264312700370701022330 0ustar jenkinsjenkinsinclude(../test-include.pri) SOURCES += tst_performance.cpp DEFINES += SRCDIR=\\\"$$PWD/\\\" OTHER_FILES += \ UbuntuShapeGrid.qml \ ButtonStyleGrid.qml \ PairOfUbuntuShapeGrid.qml \ ButtonGrid.qml \ CheckBoxStyleGrid.qml \ CheckBoxGrid.qml \ SwitchStyleGrid.qml \ SwitchGrid.qml \ LabelGrid.qml \ SliderStyleGrid.qml \ SliderGrid.qml \ TextGrid.qml \ RectangleGrid.qml \ TextWithImport.qml \ TextWithImportGrid.qml \ TextWithImportPopupsGrid.qml \ TextWithImportPopups.qml \ ItemList.qml \ ListItemList.qml \ ListItemsEmptyList.qml \ ListItemsBaseList.qml \ ListItemWithInlineActionsList.qml \ ListItemWithActionsList.qml \ StyledItemOldTheming.qml \ Styling.qml \ PaletteConfigurationOneColor.qml \ PaletteConfigurationAllColors.qml \ StyledItemNewTheming.qml \ AbstractButtonGrid.qml \ AbstractButton13Grid.qml \ LabelGrid13.qml \ ListOfCaptions13.qml \ ListItemList13.qml \ ListItemWithInlineActionsAndFourContainersList.qml \ ListItemWithInlineActionsAndFourMouseAreas.qml \ ListOfCustomListItemLayouts.qml \ ListOfEmptyListItemLayout.qml \ ListOfEmptyListItemLayout_withProgression.qml \ ListOfListItemLayout_complex1.qml \ ListOfListItemLayout_complex2.qml \ ListOfListItemLayout_labelsOnly.qml \ ListOfScrollbars_1_3.qml \ ListOfScrollView_bothScrollbars_1_3.qml ./tests/unit/tst_performance/LabelGrid13.qml0000644000015600001650000000147012700370701021114 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 Label {} } } ./tests/unit/tst_performance/ListItemList.qml0000644000015600001650000000154612700370701021515 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.3 import Ubuntu.Components 1.2 Column { width: 800 height: 600 property alias count: repeater.count Repeater { id: repeater model: 5000 ListItem { } } } ./tests/unit/tst_performance/ListOfListItemLayout_labelsOnly.qml0000644000015600001650000000163612700370701025364 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Column { width: 800 height: 600 Repeater { model: 5000 ListItem { ListItemLayout { title.text: "test" subtitle.text: "label" } } } } ./tests/unit/tst_performance/TextWithImport.qml0000644000015600001650000000130112700370701022067 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Text { } ./tests/unit/tst_performance/ListItemsEmptyList.qml0000644000015600001650000000154312700370701022714 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 as ListItems Column { width: 800 height: 600 Repeater { model: 5000 ListItems.Empty { } } } ./tests/unit/tst_performance/Styling.qml0000644000015600001650000000422012700370701020550 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { id: component1 width: units.gu(50) height: units.gu(100) property string newTheme onNewThemeChanged: component3.theme.name = newTheme Column { anchors.fill: parent StyledItem { id: component2 width: units.gu(40) height: units.gu(80) StyledItem { id: component3 width: units.gu(40) height: units.gu(80) Item { anchors.fill: parent StyledItem { id: component4 theme: ThemeSettings { name: "Ubuntu.Components.Themes.Ambiance" } width: units.gu(40) height: units.gu(80) } Loader { id: loader1 width: units.gu(30) height: units.gu(30) sourceComponent: dynamicItem } } } } Component { id: dynamicItem Item { StyledItem { id: component5 anchors.fill: parent } } } Loader { id: loader2 width: units.gu(30) height: units.gu(30) sourceComponent: dynamicItem } } } ./tests/unit/tst_performance/ListOfScrollbars_1_3.qml0000644000015600001650000000206012700370701023010 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Column { width: 800 height: 600 Repeater { id: repeater model: 50 Item { width: units.gu(10) height: units.gu(20) Flickable { id: flick width: units.gu(20) height: units.gu(20) } Scrollbar { flickableItem: flick } } } } ./tests/unit/tst_performance/AbstractButton13Grid.qml0000644000015600001650000000151212700370701023031 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 AbstractButton { } } } ./tests/unit/tst_performance/PairOfUbuntuShapeGrid.qml0000644000015600001650000000162012700370701023272 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 Item { UbuntuShape { } UbuntuShape { } } } } ./tests/unit/tst_performance/StyledItemNewTheming.qml0000644000015600001650000000376512700370701023205 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { id: component1 width: units.gu(50) height: units.gu(100) property string newTheme onNewThemeChanged: theme.name = newTheme Column { anchors.fill: parent StyledItem { id: component2 width: units.gu(40) height: units.gu(80) StyledItem { id: component3 width: units.gu(40) height: units.gu(80) Item { anchors.fill: parent StyledItem { id: component4 width: units.gu(40) height: units.gu(80) } Loader { id: loader1 width: units.gu(30) height: units.gu(30) sourceComponent: dynamicItem } } } } Component { id: dynamicItem Item { StyledItem { id: component5 anchors.fill: parent } } } Loader { id: loader2 width: units.gu(30) height: units.gu(30) sourceComponent: dynamicItem } } } ./tests/unit/tst_performance/ButtonGrid.qml0000644000015600001650000000155712700370701021212 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Themes.Ambiance 0.1 Grid { width: 800 height: 600 rows: 16 columns: 16 Repeater { model: 16*16 Button { } } } ./tests/unit/tst_quickutils/0000755000015600001650000000000012700370701016302 5ustar jenkinsjenkins./tests/unit/tst_quickutils/tst_quickutils.cpp0000644000015600001650000000323412700370701022077 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "uctestcase.h" #include "quickutils.h" #include class tst_QuickUtils : public QObject { Q_OBJECT public: tst_QuickUtils() {} private: QString imEnvVar; private Q_SLOTS: void initTestCase() { imEnvVar = qgetenv("QT_IM_MODULE"); QQmlEngine *engine = new QQmlEngine(this); QuickUtils::instance(engine); } void cleanupTestCase() { qputenv("QT_IM_MODULE", imEnvVar.toLocal8Bit()); } void test_inputmethod_data() { QTest::addColumn("envVar"); QTest::newRow("(empty)") << QByteArray(""); QTest::newRow("ibus") << QByteArray("ibus"); QTest::newRow("compose") << QByteArray("compose"); QTest::newRow("none") << QByteArray("none"); } void test_inputmethod() { QFETCH(QByteArray, envVar); qputenv("QT_IM_MODULE", envVar); QVERIFY(QuickUtils::instance()->inputMethodProvider().isEmpty()); } }; QTEST_MAIN(tst_QuickUtils) #include "tst_quickutils.moc" ./tests/unit/tst_quickutils/tst_quickutils.pro0000644000015600001650000000007312700370701022113 0ustar jenkinsjenkinsinclude(../test-include.pri) SOURCES += tst_quickutils.cpp ./tests/unit/tst_tree/0000755000015600001650000000000012700370716015052 5ustar jenkinsjenkins./tests/unit/tst_tree/tst_tree.pro0000644000015600001650000000012112700370714017415 0ustar jenkinsjenkinsinclude(../test-include.pri) QT *= UbuntuToolkit SOURCES += \ tst_tree.cpp ./tests/unit/tst_tree/tst_tree.cpp0000644000015600001650000003735212700370714017417 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Benjamin Zeller */ #include #include #include #include #include class tst_Tree : public QObject { Q_OBJECT public: tst_Tree() {} private Q_SLOTS: void test_populateTree () { UbuntuToolkit::Tree tree; //use as cleanup helper to delete all created objects QObject parent; QObject *rootNode = new QObject(&parent); QObject *subNode1Stem1 = new QObject(&parent); QObject *subNode2Stem1 = new QObject(&parent); QObject *rootStem2 = new QObject(&parent); QVERIFY(tree.add(0, nullptr, rootNode)); QVERIFY(tree.add(0, rootNode, subNode1Stem1)); QVERIFY(tree.add(1, rootNode, rootStem2)); QVERIFY(tree.add(0, rootNode, subNode2Stem1)); QVERIFY(tree.index(rootNode) == 0); QVERIFY(tree.index(subNode1Stem1) == 1); QVERIFY(tree.index(rootStem2) == 2); QVERIFY(tree.index(subNode2Stem1) == 3); } void test_doubleAddNode () { UbuntuToolkit::Tree tree; QTest::ignoreMessage(QtWarningMsg, "Cannot add the same node twice to a tree."); QObject node; QVERIFY(tree.add(0, nullptr, &node)); QVERIFY(!tree.add(0, nullptr, &node)); } void test_addRootWithParent () { UbuntuToolkit::Tree tree; QTest::ignoreMessage(QtWarningMsg, "Root node must have parentNode null."); QObject parent; QObject node; QVERIFY(!tree.add(0, &parent, &node)); } void test_addSubNodeWithoutParent () { UbuntuToolkit::Tree tree; QTest::ignoreMessage(QtWarningMsg, "Only root node has parentNode null."); QObject root; QObject node; QVERIFY(tree.add(0, nullptr, &root)); QVERIFY(!tree.add(0, nullptr, &node)); } void test_addSubNodeWithParentNotInTree () { UbuntuToolkit::Tree tree; QTest::ignoreMessage(QtWarningMsg, "Cannot add non-root node if parentNode is not in the tree."); QObject root; QObject someParent; QObject node; QVERIFY(tree.add(0, nullptr, &root)); QVERIFY(!tree.add(0, &someParent, &node)); } void test_parentNodes () { UbuntuToolkit::Tree tree; //use as cleanup helper to delete all created objects QObject parent; QObject *rootNode = new QObject(&parent); QObject *subNode1Stem1 = new QObject(&parent); QObject *subNode2Stem1 = new QObject(&parent); QObject *rootStem2 = new QObject(&parent); QObject *subNode1Stem2 = new QObject(&parent); QVERIFY(tree.add(0, nullptr, rootNode)); QVERIFY(tree.add(0, rootNode, subNode1Stem1)); QVERIFY(tree.add(0, rootNode, subNode2Stem1)); QVERIFY(tree.add(1, rootNode, rootStem2)); QVERIFY(tree.add(1, rootStem2, subNode1Stem2)); QVERIFY(tree.parent(rootNode) == nullptr); QVERIFY(tree.parent(rootStem2) == rootNode); QVERIFY(tree.parent(subNode1Stem1) == rootNode); QVERIFY(tree.parent(subNode2Stem1) == rootNode); QVERIFY(tree.parent(subNode1Stem2) == rootStem2); } void test_pruneSingleStem () { UbuntuToolkit::Tree tree; //use as cleanup helper to delete all created objects QObject parent; QObject *rootNode = new QObject(&parent); QObject *rootStem2 = new QObject(&parent); QObject *rootStem3 = new QObject(&parent); QObject *subNode1Stem1 = new QObject(&parent); QObject *subNode1Stem2 = new QObject(&parent); QObject *subNode1Stem3 = new QObject(&parent); QVERIFY(tree.add(0, nullptr, rootNode)); QVERIFY(tree.add(0, rootNode, subNode1Stem1)); QVERIFY(tree.add(1, rootNode, rootStem2)); QVERIFY(tree.add(1, rootStem2, subNode1Stem2)); QVERIFY(tree.add(2, rootNode, rootStem3)); QVERIFY(tree.add(2, rootStem3, subNode1Stem3)); QList removed = tree.prune(2); QVERIFY(removed.contains(subNode1Stem3)); QVERIFY(removed.contains(rootStem3)); QVERIFY(tree.index(rootNode) == 0); QVERIFY(tree.index(subNode1Stem1) == 1); QVERIFY(tree.index(rootStem2) == 2); QVERIFY(tree.index(rootStem3) == -1); QVERIFY(tree.index(subNode1Stem2) == 3); QVERIFY(tree.index(subNode1Stem3) == -1); } void test_pruneMultipleStems () { UbuntuToolkit::Tree tree; //use as cleanup helper to delete all created objects QObject parent; QObject *rootNode = new QObject(&parent); QObject *rootStem2 = new QObject(&parent); QObject *rootStem3 = new QObject(&parent); QObject *subNode1Stem1 = new QObject(&parent); QObject *subNode1Stem2 = new QObject(&parent); QObject *subNode1Stem3 = new QObject(&parent); QVERIFY(tree.add(0, nullptr, rootNode)); QVERIFY(tree.add(0, rootNode, subNode1Stem1)); QVERIFY(tree.add(1, rootNode, rootStem2)); QVERIFY(tree.add(1, rootStem2, subNode1Stem2)); QVERIFY(tree.add(2, rootNode, rootStem3)); QVERIFY(tree.add(2, rootStem3, subNode1Stem3)); QList removed = tree.prune(1); QVERIFY(removed.contains(subNode1Stem2)); QVERIFY(removed.contains(rootStem2)); QVERIFY(removed.contains(subNode1Stem3)); QVERIFY(removed.contains(rootStem3)); QVERIFY(tree.index(rootNode) == 0); QVERIFY(tree.index(rootStem2) == -1); QVERIFY(tree.index(rootStem3) == -1); QVERIFY(tree.index(subNode1Stem1) == 1); QVERIFY(tree.index(subNode1Stem2) == -1); QVERIFY(tree.index(subNode1Stem3) == -1); } void test_pruneAllStems () { UbuntuToolkit::Tree tree; //use as cleanup helper to delete all created objects QObject parent; QObject *rootNode = new QObject(&parent); QObject *rootStem2 = new QObject(&parent); QObject *rootStem3 = new QObject(&parent); QObject *subNode1Stem1 = new QObject(&parent); QObject *subNode1Stem2 = new QObject(&parent); QObject *subNode1Stem3 = new QObject(&parent); QVERIFY(tree.add(0, nullptr, rootNode)); QVERIFY(tree.add(0, rootNode, subNode1Stem1)); QVERIFY(tree.add(1, rootNode, rootStem2)); QVERIFY(tree.add(1, rootStem2, subNode1Stem2)); QVERIFY(tree.add(2, rootNode, rootStem3)); QVERIFY(tree.add(2, rootStem3, subNode1Stem3)); QList removed = tree.prune(0); QVERIFY(removed.contains(subNode1Stem2)); QVERIFY(removed.contains(rootStem2)); QVERIFY(removed.contains(subNode1Stem3)); QVERIFY(removed.contains(rootStem3)); QVERIFY(removed.contains(subNode1Stem1)); QVERIFY(removed.contains(rootNode)); QVERIFY(tree.index(rootNode) == -1); QVERIFY(tree.index(rootStem2) == -1); QVERIFY(tree.index(rootStem3) == -1); QVERIFY(tree.index(subNode1Stem1) == -1); QVERIFY(tree.index(subNode1Stem2) == -1); QVERIFY(tree.index(subNode1Stem3) == -1); } void test_chopNode () { UbuntuToolkit::Tree tree; //use as cleanup helper to delete all created objects QObject parent; QObject *rootNode = new QObject(&parent); QObject *subNode1Stem1 = new QObject(&parent); QObject *subNode2Stem1 = new QObject(&parent); QVERIFY(tree.add(0, nullptr, rootNode)); QVERIFY(tree.add(0, rootNode, subNode1Stem1)); QVERIFY(tree.add(0, rootNode, subNode2Stem1)); QList removed = tree.chop(QVariant::fromValue(subNode2Stem1), true); QVERIFY(removed.size() == 1); QVERIFY(removed.contains(subNode2Stem1)); QVERIFY(tree.index(subNode2Stem1) == -1); //check if everything else is as expected QVERIFY(tree.index(rootNode) == 0); QVERIFY(tree.index(subNode1Stem1) == 1); } void test_chopNodeAndStemsExclusive () { UbuntuToolkit::Tree tree; //use as cleanup helper to delete all created objects QObject parent; QObject *rootNode = new QObject(&parent); QObject *rootStem2 = new QObject(&parent); QObject *rootStem3 = new QObject(&parent); QObject *subNode1Stem1 = new QObject(&parent); QObject *subNode1Stem2 = new QObject(&parent); QObject *subNode1Stem3 = new QObject(&parent); QVERIFY(tree.add(0, nullptr, rootNode)); QVERIFY(tree.add(0, rootNode, subNode1Stem1)); QVERIFY(tree.add(1, rootNode, rootStem2)); QVERIFY(tree.add(1, rootStem2, subNode1Stem2)); QVERIFY(tree.add(2, rootNode, rootStem3)); QVERIFY(tree.add(2, rootStem3, subNode1Stem3)); //chop the root of the second stem but exclude the node QList nodes = tree.chop(QVariant::fromValue(rootStem2), false); //the node should not be removed QVERIFY(!nodes.contains(rootStem2) && tree.index(rootStem2) >= 0); QVERIFY(nodes.contains(subNode1Stem2) && tree.index(subNode1Stem2) == -1); QVERIFY(nodes.contains(rootStem3) && tree.index(rootStem3) == -1); QVERIFY(nodes.contains(subNode1Stem3) && tree.index(subNode1Stem3) == -1); //the other nodes should still be there QVERIFY(tree.index(rootNode) >= 0); QVERIFY(tree.index(subNode1Stem1) >= 0); } void test_chopNodeAndStemsInclusive () { UbuntuToolkit::Tree tree; //use as cleanup helper to delete all created objects QObject parent; QObject *rootNode = new QObject(&parent); QObject *rootStem2 = new QObject(&parent); QObject *rootStem3 = new QObject(&parent); QObject *subNode1Stem1 = new QObject(&parent); QObject *subNode1Stem2 = new QObject(&parent); QObject *subNode1Stem3 = new QObject(&parent); QVERIFY(tree.add(0, nullptr, rootNode)); QVERIFY(tree.add(0, rootNode, subNode1Stem1)); QVERIFY(tree.add(1, rootNode, rootStem2)); QVERIFY(tree.add(1, rootStem2, subNode1Stem2)); QVERIFY(tree.add(2, rootNode, rootStem3)); QVERIFY(tree.add(2, rootStem3, subNode1Stem3)); //chop the root of the second stem but exclude the node QList nodes = tree.chop(QVariant::fromValue(rootStem2), true); //the node should be removed as well QVERIFY(nodes.contains(rootStem2) && tree.index(rootStem2) == -1); QVERIFY(nodes.contains(subNode1Stem2) && tree.index(subNode1Stem2) == -1); QVERIFY(nodes.contains(rootStem3) && tree.index(rootStem3) == -1); QVERIFY(nodes.contains(subNode1Stem3) && tree.index(subNode1Stem3) == -1); //the other nodes should still be there QVERIFY(tree.index(rootNode) >= 0); QVERIFY(tree.index(subNode1Stem1) >= 0); } void test_chopNullNode () { UbuntuToolkit::Tree tree; //use as cleanup helper to delete all created objects QObject parent; QObject *rootNode = new QObject(&parent); QObject *rootStem2 = new QObject(&parent); QObject *rootStem3 = new QObject(&parent); QObject *subNode1Stem1 = new QObject(&parent); QObject *subNode1Stem2 = new QObject(&parent); QObject *subNode1Stem3 = new QObject(&parent); QVERIFY(tree.add(0, nullptr, rootNode)); QVERIFY(tree.add(0, rootNode, subNode1Stem1)); QVERIFY(tree.add(1, rootNode, rootStem2)); QVERIFY(tree.add(1, rootStem2, subNode1Stem2)); QVERIFY(tree.add(2, rootNode, rootStem3)); QVERIFY(tree.add(2, rootStem3, subNode1Stem3)); //make sure the tree is not altered if the passed node is null QList nodes = tree.chop(QVariant::fromValue(nullptr)); //nothing should be removed QVERIFY(nodes.isEmpty()); QVERIFY(tree.index(rootStem2) >= 0); QVERIFY(tree.index(subNode1Stem2) >= 0); QVERIFY(tree.index(rootStem3) >= 0); QVERIFY(tree.index(subNode1Stem3) >= 0); QVERIFY(tree.index(rootNode) >= 0); QVERIFY(tree.index(subNode1Stem1) >= 0); } void test_chopInvalidNode () { UbuntuToolkit::Tree tree; //use as cleanup helper to delete all created objects QObject parent; QObject *rootNode = new QObject(&parent); QObject *rootStem2 = new QObject(&parent); QObject *rootStem3 = new QObject(&parent); QObject *subNode1Stem1 = new QObject(&parent); QObject *subNode1Stem2 = new QObject(&parent); QObject *subNode1Stem3 = new QObject(&parent); QVERIFY(tree.add(0, nullptr, rootNode)); QVERIFY(tree.add(0, rootNode, subNode1Stem1)); QVERIFY(tree.add(1, rootNode, rootStem2)); QVERIFY(tree.add(1, rootStem2, subNode1Stem2)); QVERIFY(tree.add(2, rootNode, rootStem3)); QVERIFY(tree.add(2, rootStem3, subNode1Stem3)); //passing the node as "undefined" from JS will call chop() with a invalid QVariant() //make sure that behaves and removes only the top() node QObject *nodeToRemove = tree.top(); QList nodes = tree.chop(QVariant()); //nothing should be removed QVERIFY(nodes.size() == 1); QVERIFY(nodes.contains(nodeToRemove)); QVERIFY(tree.index(rootNode) == 0); QVERIFY(tree.index(subNode1Stem1) == 1); QVERIFY(tree.index(rootStem2) == 2); QVERIFY(tree.index(subNode1Stem2) == 3); QVERIFY(tree.index(rootStem3) == 4); QVERIFY(tree.index(subNode1Stem3) == -1); } void test_top () { UbuntuToolkit::Tree tree; //use as cleanup helper to delete all created objects QObject parent; QObject *rootNode = new QObject(&parent); QObject *rootStem2 = new QObject(&parent); QObject *rootStem3 = new QObject(&parent); QObject *rootStem5 = new QObject(&parent); QObject *subNode1Stem1 = new QObject(&parent); QObject *subNode1Stem2 = new QObject(&parent); QObject *subNode1Stem3 = new QObject(&parent); QVERIFY(tree.add(0, nullptr, rootNode)); QVERIFY(tree.add(0, rootNode, subNode1Stem1)); QVERIFY(tree.add(1, rootNode, rootStem2)); QVERIFY(tree.add(1, rootStem2, subNode1Stem2)); QVERIFY(tree.add(2, rootNode, rootStem3)); QVERIFY(tree.add(2, rootStem3, subNode1Stem3)); QVERIFY(tree.add(4, rootNode, rootStem5)); //top without args should return the last node that was added QVERIFY(tree.top() == rootStem5); //check each stems top QVERIFY(tree.top(0, true) == subNode1Stem1); QVERIFY(tree.top(1, true) == subNode1Stem2); QVERIFY(tree.top(2, true) == subNode1Stem3); QVERIFY(tree.top(3, false) == rootStem5); //get the nth node for the stem QVERIFY(tree.top(0, true, 0) == subNode1Stem1); QVERIFY(tree.top(0, true, 1) == rootNode); QVERIFY(tree.top(2, true, 0) == subNode1Stem3); QVERIFY(tree.top(2, true, 1) == rootStem3); //out of bounds QVERIFY(tree.top(0, true, 19) == nullptr); } }; QTEST_MAIN(tst_Tree) #include "tst_tree.moc" ./tests/unit/qtprivate_dependency.pri0000644000015600001650000000020212700370701020136 0ustar jenkinsjenkinsQT += quick-private qml-private core-private equals(QT_MAJOR_VERSION, 5):lessThan(QT_MINOR_VERSION, 2) { QT += v8-private } ./tests/unit/tst_qquick_image_extension/0000755000015600001650000000000012700370701020640 5ustar jenkinsjenkins./tests/unit/tst_qquick_image_extension/tst_qquick_image_extension.cpp0000644000015600001650000001022712700370701026773 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include #include // Make protected methods of QQuickImageExtension public in order to test them #define protected public #include "ucqquickimageextension.h" #undef protected #include "plugin.h" unsigned int numberOfTemporarySciFiles() { QStringList nameFilters; nameFilters << "*.sci"; return QDir::temp().entryList(nameFilters, QDir::Files).count(); } class tst_UCQQuickImageExtension : public QObject { Q_OBJECT private: QQmlEngine *engine = Q_NULLPTR; private Q_SLOTS: void init() { engine = new QQmlEngine; UbuntuComponentsPlugin::initializeContextProperties(engine); } void cleanup() { delete engine; } void scaledBorderIdentity() { UCQQuickImageExtension image; QString border = "border: 13"; QString expected = "border: 13"; QString result = image.scaledBorder(border, "1"); QCOMPARE(result, expected); } void scaledBorderHalf() { UCQQuickImageExtension image; QString border = "border: 13"; QString expected = "border: 7"; QString result = image.scaledBorder(border, "0.5"); QCOMPARE(result, expected); } void scaledBorderDouble() { UCQQuickImageExtension image; QString border = "border: 13"; QString expected = "border: 26"; QString result = image.scaledBorder(border, "2"); QCOMPARE(result, expected); } void rewriteContainsBorderInName() { UCQQuickImageExtension image; QString sciFilePath = "borderInName.sci"; QString result; QTextStream resultStream(&result); image.rewriteSciFile(sciFilePath, "1", resultStream); QString expected; QTextStream expectedStream(&expected); expectedStream << "source: \"image://scaling/1/./borderInName.png\"" << endl; expectedStream << "border.left: 9" << endl; expectedStream << "border.right: 2" << endl; expectedStream << "border.top: 9" << endl; expectedStream << "border.bottom: 0" << endl; expectedStream << "horizontalTileMode: Stretch" << endl; expectedStream << "verticalTileMode: Stretch" << endl; QCOMPARE(result, expected); } void cachingOfRewrittenSciFiles() { /* This tests an internal implementation detail of UCQQuickImageExtension, namely making sure that only one temporary rewritten .sci file is created for each source .sci file. */ QQuickImageBase baseImage; UCQQuickImageExtension* image1 = new UCQQuickImageExtension(&baseImage); UCQQuickImageExtension* image2 = new UCQQuickImageExtension(&baseImage); QUrl sciFileUrl = QUrl::fromLocalFile("./test.sci"); unsigned int initialNumberOfSciFiles = numberOfTemporarySciFiles(); image1->setSource(sciFileUrl); QCOMPARE(numberOfTemporarySciFiles(), initialNumberOfSciFiles + 1); image2->setSource(sciFileUrl); QCOMPARE(numberOfTemporarySciFiles(), initialNumberOfSciFiles + 1); delete image1; QCOMPARE(numberOfTemporarySciFiles(), initialNumberOfSciFiles + 1); /* The temporary files will be deleted when the cache is destroyed when the application exits. */ delete image2; QCOMPARE(numberOfTemporarySciFiles(), initialNumberOfSciFiles + 1); } }; QTEST_MAIN(tst_UCQQuickImageExtension) #include "tst_qquick_image_extension.moc" ./tests/unit/tst_qquick_image_extension/tst_qquick_image_extension.pro0000644000015600001650000000013312700370701027004 0ustar jenkinsjenkinsinclude(../test-include.pri) SOURCES += tst_qquick_image_extension.cpp QT += quick-private ./tests/unit/tst_qquick_image_extension/test@18.sci0000644000015600001650000000021312700370701022564 0ustar jenkinsjenkinssource: "test@18.png" border.left: 9 border.right: 2 border.top: 9 border.bottom: 0 horizontalTileMode: Stretch verticalTileMode: Stretch ./tests/unit/tst_qquick_image_extension/borderInName.sci0000644000015600001650000000022012700370701023677 0ustar jenkinsjenkinssource: "borderInName.png" border.left: 9 border.right: 2 border.top: 9 border.bottom: 0 horizontalTileMode: Stretch verticalTileMode: Stretch ./tests/unit/tst_qmltemplate/0000755000015600001650000000000012700370701016432 5ustar jenkinsjenkins./tests/unit/tst_qmltemplate/tst_example_mouse.qml0000644000015600001650000000741112700370701022705 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 Item { id: root width: 200 height: 200 // The object under test MouseArea { id: objectUnderTest anchors.fill: parent hoverEnabled: true // required for pure mouseMove events acceptedButtons: Qt.LeftButton | Qt.RightButton onCanceled: { console.debug("onCancelled"); } onClicked: { console.debug("onClicked b:" + mouse.button); } onDoubleClicked: { console.debug("onDoubleClicked b:" + mouse.button); } onEntered: { console.debug("onEntered"); } onExited: { console.debug("onExited"); } onPositionChanged: { console.debug("onPositionChanged x:" + mouseX + " y:" + mouseY); } onPressAndHold: { console.debug("onPressAndHold b:" + mouse.button); } onPressed: { console.debug("onPressed b:" + mouse.button); } onReleased: { console.debug("onReleased b:" + mouse.button); } } TestCase { name: "ExampleMouse" when: windowShown function init() { console.debug(">> init"); console.debug("<< init"); } function cleanup() { console.debug(">> cleanup"); mouseMove(root); mouseRelease(root); console.debug("<< cleanup"); } function initTestCase() { console.debug(">> initTestCase"); console.debug("<< initTestCase"); } function cleanupTestCase() { console.debug(">> cleanupTestCase"); console.debug("<< cleanupTestCase"); } /* * test for a signal existence */ // API: function mouseRelease(item, x, y, button, modifiers, delay) // API: function mousePress(item, x, y, button, modifiers, delay) // API: function mouseDrag(item, x, y, dx, dy, button, modifiers, delay) // API: function mouseClick(item, x, y, button, modifiers, delay) // API: function mouseDoubleClick(item, x, y, button, modifiers, delay) // API: function mouseMove(item, x, y, delay, buttons) // API: function mouseWheel(item, x, y, xDelta, yDelta, buttons, modifiers, delay) function test_mouse_click() { mouseClick(objectUnderTest,2,2,Qt.LeftButton,Qt.NoModifiers,100); mouseClick(objectUnderTest,10,2,Qt.RightButton); } function test_mouse_doubleclick() { mouseDoubleClick(objectUnderTest,10,2,Qt.RightButton); mouseDoubleClick(objectUnderTest,2,2,Qt.LeftButton,Qt.NoModifiers,100); } function test_mouse_move() { mouseMove(objectUnderTest,20,20); } function test_mouse_drag() { mouseDrag(objectUnderTest,1,1,10,10,Qt.LeftButton); } // end of tests } } ./tests/unit/tst_qmltemplate/tst_example_keyboard.qml0000644000015600001650000000465012700370701023357 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 Item { id: root width: 200 height: 200 focus: true // required for Keys property string text : "" Keys.onPressed: { console.debug("onPressed: " + event.key); text += event.text; } Keys.onReleased: { console.debug("onReleased: " + event.key); } TestCase { name: "ExampleKeys" when: windowShown function init() { console.debug(">> init is called before each test"); console.debug("<< init is called before each test"); } function cleanup() { console.debug(">> cleanup"); root.text = ""; console.debug("<< cleanup"); } function initTestCase() { console.debug(">> initTestCase"); console.debug("<< initTestCase"); } function cleanupTestCase() { console.debug(">> cleanupTestCase"); console.debug("<< cleanupTestCase"); } // API: function keyPress(key, modifiers, delay) // API: function keyRelease(key, modifiers, delay) // API: function keyClick(key, modifiers, delay) function test_keyClick() { keyClick(Qt.Key_H); keyClick(Qt.Key_E); keyClick(Qt.Key_L); keyClick(Qt.Key_L); keyClick(Qt.Key_O); compare(root.text,"hello","Text was inserted by keyboard events"); } function test_keyPress_and_keyRelease() { keyPress(Qt.Key_E); keyRelease(Qt.Key_E); compare(root.text,"e","Text was inserted by keyboard events"); } // end of tests } } ./tests/unit/tst_qmltemplate/tst_example_signals.qml0000644000015600001650000000477712700370701023231 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 Item { id: root width: 200 height: 200 // The objects Button { id: objectUnderTest anchors.margins: 20 anchors.fill: parent } TestCase { name: "ExampleCheckSignals" when: windowShown SignalSpy { id: signalSpy target: objectUnderTest } function init() { console.debug(">> init"); console.debug("<< init"); } function cleanup() { console.debug(">> cleanup"); console.debug("<< cleanup"); } function initTestCase() { console.debug(">> initTestCase"); console.debug("<< initTestCase"); } function cleanupTestCase() { console.debug(">> cleanupTestCase"); console.debug("<< cleanupTestCase"); } /* * test for a signal existence */ function test_signals_exists_data() { return [ { tag: "clicked", signalName: "clicked", validSignal: true }, { tag: "hovered", signalName: "hovered", validSignal: true } ]; } function test_signals_exists(data) { signalSpy.signalName = data.signalName; compare(signalSpy.signalName,data.signalName,"signalName is set to " + data.signalName); compare(signalSpy.valid,data.validSignal,"valid is " + data.validSignal); } function test_signal_emission_clicked() { signalSpy.signalName = "clicked"; mouseMove(objectUnderTest,10,10); mouseClick(objectUnderTest,10,10); tryCompare(signalSpy,"count",1,"clicked was emitted"); } // end of tests } } ./tests/unit/tst_qmltemplate/tst_example_checks.qml0000644000015600001650000000617312700370701023021 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 Item { id: root width: 200 height: 200 property string testString : "i am set" property string anotherTestString : "" TestCase { name: "ExampleChecks" when: windowShown function init() { console.debug(">> init"); console.debug("<< init"); } function cleanup() { console.debug(">> cleanup"); console.debug("<< cleanup"); } function initTestCase() { console.debug(">> initTestCase"); console.debug("<< initTestCase"); } function cleanupTestCase() { console.debug(">> cleanupTestCase"); console.debug("<< cleanupTestCase"); } // API: function verify(cond, msg) // API: function fail(msg) // API: function compare(actual, expected, msg) // API: function fuzzyCompare(actual, expected, delta, msg) // API: function grabImage(item) // API: function tryCompare(obj, prop, value, timeout) // API: function skip(msg) // API: function expectFail(tag, msg) // API: function expectFailContinue(tag, msg) // API: function warn(msg) // API: function wait(ms) // API: function waitForRendering(item, timeout) // API: function sleep(ms) /* When you find a bug and you write a test for it, use expectFail or expectFailContinue, as then you will notice when it has been fixed as XFAIL will turn to XPASS */ // You should NOT use skip as then the bug might be forgotten. function test_expectFailContinue() { expectFailContinue("","The next check will fail, but we WILL continue further"); compare(root.testString,root.anotherTestString,"The strings does not match"); verify(root.testString==="i am set","this check gets called even tho we failed earlier"); } function test_expectFail() { expectFail("","The next one will fail, but we _WILL NOT_ continue any further") compare(root.testString,root.anotherTestString,"The strings does not match"); console.debug("you wont get this far"); root.testString = ""; compare(root.testString,root.anotherTestString,"The strings does match"); } } } ./tests/unit/tst_qmltemplate/tst_qmltemplate.cpp0000644000015600001650000000131112700370701022351 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include QUICK_TEST_MAIN(qmltemplate) ./tests/unit/tst_qmltemplate/tst_example_benchmark.qml0000644000015600001650000000335612700370701023513 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "ExampleBenchmarkObject" when: windowShown function init() { console.debug(">> init"); console.debug("<< init"); } function cleanup() { console.debug(">> cleanup"); console.debug("<< cleanup"); } function initTestCase() { console.debug(">> initTestCase"); console.debug("<< initTestCase"); } function cleanupTestCase() { console.debug(">> cleanupTestCase"); console.debug("<< cleanupTestCase"); } /* * the data for the benchmark_create_component(data) */ function benchmark_create_component_data() { return [ { tag: "Button", fileName: "../../../qml/Ubuntu/Components/Button.qml" } ]; } /* * a data driven test function */ function benchmark_create_component(data) { var component = Qt.createComponent(data.fileName) var obj = component.createObject(top) obj.destroy() component.destroy() } } ./tests/unit/tst_qmltemplate/tst_example_property.qml0000644000015600001650000000523612700370701023444 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 Item { id: root width: 200 height: 200 // The objects Button { id: objectUnderTest anchors.margins: 20 anchors.fill: parent } Label { id: testObject1 } TestCase { name: "ExampleCheckProperty" when: windowShown function init() { console.debug(">> init"); console.debug("<< init"); } function cleanup() { console.debug(">> cleanup"); console.debug("<< cleanup"); } function initTestCase() { console.debug(">> initTestCase"); console.debug("<< initTestCase"); } function cleanupTestCase() { console.debug(">> cleanupTestCase"); console.debug("<< cleanupTestCase"); } /* * the data for the test_text(data) */ function test_text_data() { return [ { tag: "A normal text", text: "Hello World!", expectFail: false }, { tag: "Unable to set object* to text", text: testObject1, expectFail: true } ]; } /* * a data driven test function */ function test_text(data) { // check if the expectFail flag is up in data if (data.expectFail) { expectFail("",data.tag); } // try to set the data try { objectUnderTest.text = data.text; } catch (e) { // catched an exception, check if we are expecting a failure, if we are then lets ignore. if (!data.expectFail) { console.error(e); } else { console.debug(e); } } // do the comparing compare(objectUnderTest.text,data.text,"Was able to set " + data.text + " as text."); } } } ./tests/unit/tst_qmltemplate/tst_qmltemplate.pro0000644000015600001650000000023612700370701022374 0ustar jenkinsjenkinsTESTS += $$system(ls tst_*.qml) include(../qmltest-include.pri) TARGET = tst_qmltemplate SOURCES += tst_qmltemplate.cpp OTHER_FILES += $$system(ls *.qml) ./tests/unit/tst_units/0000755000015600001650000000000012700370701015247 5ustar jenkinsjenkins./tests/unit/tst_units/dpr1/0000755000015600001650000000000012700370701016115 5ustar jenkinsjenkins./tests/unit/tst_units/dpr1/resource_only_smaller@7.png0000644000015600001650000000000012700370701023407 0ustar jenkinsjenkins./tests/unit/tst_units/dpr1/resource@1.png0000644000015600001650000000000012700370701020621 0ustar jenkinsjenkins./tests/unit/tst_units/dpr1/dpr1.qrc0000644000015600001650000000044012700370701017470 0ustar jenkinsjenkins exact_match_no_suffix.png higher_scale.png lower_scale.png resource_only_smaller@7.png resource_only_higher@13.png ./tests/unit/tst_units/dpr1/resource@8.png0000644000015600001650000000000012700370701020630 0ustar jenkinsjenkins./tests/unit/tst_units/dpr1/tst_units.cpp0000644000015600001650000002214012700370701020654 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include #include "ucunits.h" class tst_UCUnits: public QObject { Q_OBJECT private Q_SLOTS: // void singletonInstance() { // UCUnits& units1 = UCUnits::instance(); // UCUnits& units2 = UCUnits::instance(); // QCOMPARE(&units1, &units2); // } void defaultGridUnit() { qputenv("GRID_UNIT_PX", ""); UCUnits units; QCOMPARE(units.gridUnit(), 8.0f); } void setGridUnit() { UCUnits units; units.setGridUnit(0.0); QCOMPARE(units.gridUnit(), 0.0f); units.setGridUnit(42.0); QCOMPARE(units.gridUnit(), 42.0f); } void gridUnitEnvironmentVariable() { QByteArray gridUnit = QString::number(11).toLocal8Bit(); qputenv("GRID_UNIT_PX", gridUnit); UCUnits units; QCOMPARE(units.gridUnit(), 11.0); qputenv("GRID_UNIT_PX", ""); } void dpGridUnitDefault() { UCUnits units; QCOMPARE(units.dp(1.0), 1.0f); QCOMPARE(units.dp(1.32), 1.0f); QCOMPARE(units.dp(1.72), 2.0f); QCOMPARE(units.dp(0.23), 0.0f); QCOMPARE(units.dp(0.51), 1.0f); QCOMPARE(units.dp(0.9999), 1.0f); QCOMPARE(units.dp(1000.01), 1000.0f); } void guGridUnitDefault() { UCUnits units; QCOMPARE(units.gu(1.0), 8.0f); QCOMPARE(units.gu(1.32), 11.0f); QCOMPARE(units.gu(1.72), 14.0f); QCOMPARE(units.gu(0.23), 2.0f); QCOMPARE(units.gu(0.51), 4.0f); QCOMPARE(units.gu(0.9999), 8.0f); QCOMPARE(units.gu(1000.01), 8000.0f); } void dpGridUnitTen() { UCUnits units; units.setGridUnit(10); QCOMPARE(units.dp(1.0), 1.0f); QCOMPARE(units.dp(1.32), 1.0f); QCOMPARE(units.dp(1.72), 2.0f); QCOMPARE(units.dp(0.23), 0.0f); QCOMPARE(units.dp(0.51), 1.0f); QCOMPARE(units.dp(0.9999), 1.0f); QCOMPARE(units.dp(1000.01), 1250.0f); } void guGridUnitTen() { UCUnits units; units.setGridUnit(10); QCOMPARE(units.gu(0.5), 5.0f); QCOMPARE(units.gu(1), 10.0f); QCOMPARE(units.gu(1.5), 15.0f); QCOMPARE(units.gu(2), 20.0f); QCOMPARE(units.gu(4), 40.0f); QCOMPARE(units.gu(100000), 1000000.0f); QCOMPARE(units.gu(150.51983), 1505.0f); } void dpGridUnitSixteen() { UCUnits units; units.setGridUnit(16); QCOMPARE(units.dp(1.0), 2.0f); QCOMPARE(units.dp(1.32), 3.0f); QCOMPARE(units.dp(1.72), 3.0f); QCOMPARE(units.dp(0.23), 0.0f); QCOMPARE(units.dp(0.51), 1.0f); QCOMPARE(units.dp(0.9999), 2.0f); QCOMPARE(units.dp(1000.01), 2000.0f); } void guGridUnitSixteen() { UCUnits units; units.setGridUnit(16); QCOMPARE(units.gu(0.5), 8.0f); QCOMPARE(units.gu(1), 16.0f); QCOMPARE(units.gu(1.5), 24.0f); QCOMPARE(units.gu(2), 32.0f); QCOMPARE(units.gu(4), 64.0f); QCOMPARE(units.gu(100000), 1600000.0f); QCOMPARE(units.gu(150.51983), 2408.0f); } void dpGridUnitEighteen() { UCUnits units; units.setGridUnit(18); QCOMPARE(units.dp(1.0), 2.0f); QCOMPARE(units.dp(1.32), 3.0f); QCOMPARE(units.dp(1.72), 3.0f); QCOMPARE(units.dp(0.23), 0.0f); QCOMPARE(units.dp(0.51), 1.0f); QCOMPARE(units.dp(0.9999), 2.0f); QCOMPARE(units.dp(1000.01), 2250.0f); } void dpGridUnitTwenty() { UCUnits units; units.setGridUnit(20); QCOMPARE(units.dp(1.0), 2.0f); QCOMPARE(units.dp(1.32), 3.0f); QCOMPARE(units.dp(1.72), 3.0f); QCOMPARE(units.dp(0.23), 0.0f); QCOMPARE(units.dp(0.51), 1.0f); QCOMPARE(units.dp(0.9999), 2.0f); QCOMPARE(units.dp(1000.01), 2500.0f); } void resolveEmpty() { UCUnits units; QString resolved; QString expected; resolved = units.resolveResource(QUrl("")); expected = QString(""); QCOMPARE(resolved, expected); units.setGridUnit(18); resolved = units.resolveResource(QUrl("")); expected = QString(""); QCOMPARE(resolved, expected); } void resolveNonExisting() { UCUnits units; QString resolved; QString expected; resolved = units.resolveResource(QUrl::fromLocalFile("non_existing.png")); expected = QString(""); QCOMPARE(resolved, expected); } void resolveDirectory() { UCUnits units; QString resolved; QString expected; resolved = units.resolveResource(QUrl::fromLocalFile("")); expected = QString(""); QCOMPARE(resolved, expected); } void resolveExactMatch() { UCUnits units; QString resolved; QString expected; units.setGridUnit(8); resolved = units.resolveResource(QUrl::fromLocalFile("exact_match.png")); expected = QString("1/" + QDir::currentPath() + QDir::separator() + "exact_match@8.png"); QCOMPARE(resolved, expected); } void resolveExistsOnlyHigherGridUnit() { UCUnits units; QString resolved; QString expected; units.setGridUnit(10); resolved = units.resolveResource(QUrl::fromLocalFile("resource_only_higher.png")); expected = QString("0.769231/" + QDir::currentPath() + QDir::separator() + "resource_only_higher@13.png"); QCOMPARE(resolved, expected); } void resolveExistsOnlyHigherGridUnitQrc() { UCUnits units; QString resolved; QString expected; units.setGridUnit(10); resolved = units.resolveResource(QUrl("qrc:/test/prefix/resource_only_higher.png")); expected = QString("0.769231/:/test/prefix/resource_only_higher@13.png"); QCOMPARE(resolved, expected); } void resolveExistsOnlySmallerGridUnit() { UCUnits units; QString resolved; QString expected; units.setGridUnit(10); resolved = units.resolveResource(QUrl::fromLocalFile("resource_only_smaller.png")); expected = QString("1.42857/" + QDir::currentPath() + QDir::separator() + "resource_only_smaller@7.png"); QCOMPARE(resolved, expected); } void resolveExistsOnlySmallerGridUnitQrc() { UCUnits units; QString resolved; QString expected; units.setGridUnit(10); resolved = units.resolveResource(QUrl("qrc:/test/prefix/resource_only_smaller.png")); expected = QString("1.42857/:/test/prefix/resource_only_smaller@7.png"); QCOMPARE(resolved, expected); } void resolveExistsMultipleGridUnit() { UCUnits units; QString resolved; QString expected; units.setGridUnit(20); resolved = units.resolveResource(QUrl::fromLocalFile("resource.png")); expected = QString("1.05263/" + QDir::currentPath() + QDir::separator() + "resource@19.png"); QCOMPARE(resolved, expected); units.setGridUnit(19); resolved = units.resolveResource(QUrl::fromLocalFile("resource.png")); expected = QString("1/" + QDir::currentPath() + QDir::separator() + "resource@19.png"); QCOMPARE(resolved, expected); units.setGridUnit(18); resolved = units.resolveResource(QUrl::fromLocalFile("resource.png")); expected = QString("1/" + QDir::currentPath() + QDir::separator() + "resource@18.png"); QCOMPARE(resolved, expected); units.setGridUnit(17); resolved = units.resolveResource(QUrl::fromLocalFile("resource.png")); expected = QString("0.944444/" + QDir::currentPath() + QDir::separator() + "resource@18.png"); QCOMPARE(resolved, expected); units.setGridUnit(9); resolved = units.resolveResource(QUrl::fromLocalFile("resource.png")); expected = QString("0.9/" + QDir::currentPath() + QDir::separator() + "resource@10.png"); QCOMPARE(resolved, expected); units.setGridUnit(8); resolved = units.resolveResource(QUrl::fromLocalFile("resource.png")); expected = QString("1/" + QDir::currentPath() + QDir::separator() + "resource@8.png"); QCOMPARE(resolved, expected); units.setGridUnit(7); resolved = units.resolveResource(QUrl::fromLocalFile("resource.png")); expected = QString("0.875/" + QDir::currentPath() + QDir::separator() + "resource@8.png"); QCOMPARE(resolved, expected); } }; QTEST_MAIN(tst_UCUnits) #include "tst_units.moc" ./tests/unit/tst_units/dpr1/resource_only_higher@13.png0000644000015600001650000000000012700370701023273 0ustar jenkinsjenkins./tests/unit/tst_units/dpr1/higher_scale.png0000644000015600001650000000000012700370701021226 0ustar jenkinsjenkins./tests/unit/tst_units/dpr1/lower_scale.png0000644000015600001650000000000012700370701021110 0ustar jenkinsjenkins./tests/unit/tst_units/dpr1/resource@15.png0000644000015600001650000000000012700370701020706 0ustar jenkinsjenkins./tests/unit/tst_units/dpr1/exact_match@8.png0000644000015600001650000000000012700370701021261 0ustar jenkinsjenkins./tests/unit/tst_units/dpr1/resource@19.png0000644000015600001650000000000012700370701020712 0ustar jenkinsjenkins./tests/unit/tst_units/dpr1/resource@18.png0000644000015600001650000000000012700370701020711 0ustar jenkinsjenkins./tests/unit/tst_units/dpr1/dpr1.pro0000644000015600001650000000011712700370701017504 0ustar jenkinsjenkinsinclude(../../test-include.pri) SOURCES += tst_units.cpp RESOURCES += dpr1.qrc ./tests/unit/tst_units/dpr1/resource@10.png0000644000015600001650000000000012700370701020701 0ustar jenkinsjenkins./tests/unit/tst_units/dpr1/resources_unit0000644000015600001650000000000312700370701021102 0ustar jenkinsjenkins18 ./tests/unit/tst_units/dpr1/exact_match_no_suffix.png0000644000015600001650000000000012700370701023151 0ustar jenkinsjenkins./tests/unit/tst_units/tst_units.pro0000644000015600001650000000010012700370701020014 0ustar jenkinsjenkinsTEMPLATE = subdirs SUBDIRS += \ dpr1 \ dpr2 \ dpr3 ./tests/unit/tst_units/dpr3/0000755000015600001650000000000012700370701016117 5ustar jenkinsjenkins./tests/unit/tst_units/dpr3/tst_units_dpr3.cpp0000644000015600001650000000521612700370701021613 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include #include "ucunits.h" class tst_UCUnitsDPR3: public QObject { Q_OBJECT private Q_SLOTS: void dpGridUnitDefaultWithDPR3() { UCUnits units; QCOMPARE(units.dp(1.0), 1.0f); QCOMPARE(units.dp(1.32), 1.33333f); QCOMPARE(units.dp(1.72), 1.66666f); QCOMPARE(units.dp(0.23), 0.333333f); QCOMPARE(units.dp(0.51), 0.666666f); QCOMPARE(units.dp(0.9999), 1.0f); QCOMPARE(units.dp(1000.01), 1000.0f); } void guGridUnitDefaultWithDPR3() { UCUnits units; QCOMPARE(units.gu(0.5), 4.0f); QCOMPARE(units.gu(1), 8.0f); QCOMPARE(units.gu(1.5), 12.0f); QCOMPARE(units.gu(2), 16.0f); QCOMPARE(units.gu(4), 32.0f); QCOMPARE(units.gu(100000), 800000.0f); QCOMPARE(units.gu(150.51983), 1204.0f); } void dpGridUnitSixteenWithDPR3() { UCUnits units; units.setGridUnit(16); QCOMPARE(units.dp(1.0), 0.666666f); QCOMPARE(units.dp(1.32), 1.0f); QCOMPARE(units.dp(1.72), 1.0f); QCOMPARE(units.dp(0.23), 0.0f); QCOMPARE(units.dp(0.51), 0.333333f); QCOMPARE(units.dp(0.9999), 0.666666f); QCOMPARE(units.dp(1000.01), 666.666666f); } void guGridUnitSixteenWithDPR3() { UCUnits units; units.setGridUnit(16); QCOMPARE(units.gu(0.5), 2.666666f); QCOMPARE(units.gu(1), 5.333333f); QCOMPARE(units.gu(1.5), 8.0f); QCOMPARE(units.gu(2), 10.666666f); QCOMPARE(units.gu(4), 21.333333f); QCOMPARE(units.gu(100000), 533333.333333f); QCOMPARE(units.gu(150.51983), 802.666666f); } }; //QTEST_MAIN(tst_UCUnitsDPR3) - want to set custom env var, so need to use actual code: int main(int argc, char *argv[]) { qputenv("QT_DEVICE_PIXEL_RATIO", "3"); QGuiApplication app(argc, argv); app.setAttribute(Qt::AA_Use96Dpi, true); tst_UCUnitsDPR3 tc; return QTest::qExec(&tc, argc, argv); } #include "tst_units_dpr3.moc" ./tests/unit/tst_units/dpr3/dpr3.pro0000644000015600001650000000021212700370701017504 0ustar jenkinsjenkinsCONFIG += custom_qpa # needed by test to set device pixel ratio correctly include(../../test-include.pri) SOURCES += tst_units_dpr3.cpp ./tests/unit/tst_units/dpr2/0000755000015600001650000000000012700370701016116 5ustar jenkinsjenkins./tests/unit/tst_units/dpr2/dpr2.pro0000644000015600001650000000021212700370701017502 0ustar jenkinsjenkinsCONFIG += custom_qpa # needed by test to set device pixel ratio correctly include(../../test-include.pri) SOURCES += tst_units_dpr2.cpp ./tests/unit/tst_units/dpr2/tst_units_dpr2.cpp0000644000015600001650000001027212700370701021607 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include #include "ucunits.h" class tst_UCUnitsDPR2: public QObject { Q_OBJECT private Q_SLOTS: void dpGridUnitDefaultWithDPR2() { UCUnits units; QCOMPARE(units.dp(1.0), 1.0f); QCOMPARE(units.dp(1.32), 1.5f); QCOMPARE(units.dp(1.72), 1.5f); QCOMPARE(units.dp(0.23), 0.0f); QCOMPARE(units.dp(0.51), 0.5f); QCOMPARE(units.dp(0.9999), 1.0f); QCOMPARE(units.dp(1000.01), 1000.0f); } void guGridUnitDefaultWithDPR2() { UCUnits units; QCOMPARE(units.gu(0.5), 4.0f); QCOMPARE(units.gu(1), 8.0f); QCOMPARE(units.gu(1.5), 12.0f); QCOMPARE(units.gu(2), 16.0f); QCOMPARE(units.gu(4), 32.0f); QCOMPARE(units.gu(100000), 800000.0f); QCOMPARE(units.gu(150.51983), 1204.0f); } void dpGridUnitEightWithDPR2() { UCUnits units; units.setGridUnit(8); QCOMPARE(units.dp(1.0), 0.5f); QCOMPARE(units.dp(1.32), 0.5f); QCOMPARE(units.dp(1.72), 1.0f); QCOMPARE(units.dp(0.23), 0.0f); QCOMPARE(units.dp(0.51), 0.5f); QCOMPARE(units.dp(0.9999), 0.5f); QCOMPARE(units.dp(1000.01), 500.0f); } void guGridUnitEightWithDPR2() { UCUnits units; units.setGridUnit(8); QCOMPARE(units.gu(0.5), 2.0f); QCOMPARE(units.gu(1), 4.0f); QCOMPARE(units.gu(1.5), 6.0f); QCOMPARE(units.gu(2), 8.0f); QCOMPARE(units.gu(4), 16.0f); QCOMPARE(units.gu(100000), 400000.0f); QCOMPARE(units.gu(150.51983), 602.0f); } void dpGridUnitSixteenWithDPR2() { UCUnits units; units.setGridUnit(16); /* This testcase covers unit calculations when the Qt device pixel ratio is 2. * */ QCOMPARE(units.dp(1.0), 1.0f); QCOMPARE(units.dp(1.32), 1.5f); QCOMPARE(units.dp(1.72), 1.5f); QCOMPARE(units.dp(0.23), 0.0f); QCOMPARE(units.dp(0.51), 0.5f); QCOMPARE(units.dp(0.9999), 1.0f); QCOMPARE(units.dp(1000.01), 1000.0f); } void guGridUnitSixteenWithDPR2() { UCUnits units; units.setGridUnit(16); QCOMPARE(units.gu(0.5), 4.0f); QCOMPARE(units.gu(1), 8.0f); QCOMPARE(units.gu(1.5), 12.0f); QCOMPARE(units.gu(2), 16.0f); QCOMPARE(units.gu(4), 32.0f); QCOMPARE(units.gu(100000), 800000.0f); QCOMPARE(units.gu(150.51983), 1204.0f); } void dpGridUnitTwentyWithDPR2() { UCUnits units; units.setGridUnit(20); QCOMPARE(units.dp(1.0), 1.0f); QCOMPARE(units.dp(1.32), 1.5f); QCOMPARE(units.dp(1.72), 1.5f); QCOMPARE(units.dp(0.23), 0.0f); QCOMPARE(units.dp(0.51), 0.5f); QCOMPARE(units.dp(0.9999), 1.0f); QCOMPARE(units.dp(1000.01), 1250.0f); } void guGridUnitTenWithDPR2() { UCUnits units; units.setGridUnit(10); QCOMPARE(units.gu(0.5), 2.5f); QCOMPARE(units.gu(1), 5.0f); QCOMPARE(units.gu(1.5), 7.5f); QCOMPARE(units.gu(2), 10.0f); QCOMPARE(units.gu(4), 20.0f); QCOMPARE(units.gu(100000), 500000.0f); QCOMPARE(units.gu(150.51983), 752.5f); } }; //QTEST_MAIN(tst_UCUnitsDPR2) - want to set custom env var, so need to use actual code: int main(int argc, char *argv[]) { qputenv("QT_DEVICE_PIXEL_RATIO", "2"); QGuiApplication app(argc, argv); app.setAttribute(Qt::AA_Use96Dpi, true); tst_UCUnitsDPR2 tc; return QTest::qExec(&tc, argc, argv); } #include "tst_units_dpr2.moc" ./tests/unit/add_makecheck.pri0000644000015600001650000000136412700370701016456 0ustar jenkinsjenkins# Do not use CONFIG += testcase that would add a 'make check' because it also # adds a 'make install' that installs the test cases, which we do not want. # Instead add a 'make check' manually. check.target = check check.commands += cd $$_PRO_FILE_PWD_; check.commands += UITK_TEST_KEEP_RUNNING=1 TEST_COMMAND = '$${ROOT_SOURCE_DIR}/tests/unit/runtest.sh "$$shadowed($$_PRO_FILE_PWD_)/$${TARGET}" "$$shadowed($$_PRO_FILE_PWD_)/$${TARGET}"' message($$TEST_COMMAND) # if "CONFIG += custom_qpa" is set, use our custom QPA plugin for the test custom_qpa { check.commands += env QT_QPA_PLATFORM_PLUGIN_PATH=$${ROOT_BUILD_DIR}/tests/unit/custom_qpa check.commands += '$$TEST_COMMAND custom'; } else { check.commands += '$$TEST_COMMAND minimal'; } ./tests/unit/tst_i18n/0000755000015600001650000000000012700370701014664 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_LocalizedApp.o0000644000015600001650000027714012700370701021157 0ustar jenkinsjenkinsELF> J@@56789:<=?@BCFGIJLMOPRSUVWYZ[]^`acefhiklnoqrsuvwyz}~HH(tHHtCUSHH5HHHHuH[]HHH[]1Ð@AUATIUSHHcG HHcGHL$IL9t!HH+HtHHI9uHL[]A\A]ff.ATUISHcG HHcGHH,HH9u=@H;H9t"HHt܃t(„tH9u[L]A\f.AWAVAUATUSHdH%(H$1uHt@'tKH$dH3%( H[]A\A]A^A_HHtHP L$LH$HD$ QvL$H5 Hl$ LHl$ LHH$H$vH$HH$H=HHpH$HD$ H$QvH5,LL$L$LLH$/L$LLLH HH5ASLAH$EH=ALl$0Lt$pHD$0LLLH HH5AVLAEE(1HILsLL5H$A>L=L,A>D$ L,H{DD$ 11H\$@H4$HLt$PLLL|$`LLHD$@8HcPHt$HD$L$IHL$@Hct$HcQH<HHL:L9tULHtH1H v@HHI9uHL$@Hct$HcQH<HHIHcy H<HH HH9t.HtI $1H v@HIH9uՋHHT$@HcBHHHcT$HHtHD$`HQvH|$`yLH<$HHH|$0tt%/uH|$0fDH|$ u&ffD/H|$ 뻐/H$eG/8H$i/ZH$>/H$A/2H$/~H|$`efDHD$`H$QvHH$Hf.LV1LLH=HL)LL=1LLH=HLH(„9,LHLHHILLHLLHLHHLHHIIHLILHXHPLHL@HLHL#HHHHHf.ATUISH͉Hx u~.H[]A\f uHUf.H1LD$ D$ HHt HtHHHHHHHHHSHHHH[SHHtHH[DH[HuHDt („tHUSHHHHt HHHEH[]HuHDt („tHUSHHHHHHu_H{u&HH[]ft/uH{f.t/uH{H H{HHH+DRATUHSHHHdH%(HD$1HvHt HHHIHHH<$u4HL$dH3 %(Hu(H[]A\ft/uH<$HHLHHR]vHuHt („tHHuHt („tHHHtAWAVIAUATUSHHpHHcPH,HIHcP L,HcPIL<IM9Lt2fHuHIL#HHI9uH[]A\A]A^A_H LHHI9tHkHtHHHHHI>HH-!7 }Compared values are not the sameQSignalSpy: Cannot spy on a null objectQSignalSpy: Null signal name is not validQSignalSpy: Not a valid signal, use the SIGNAL macroQSignalSpy: No such signal: '%s'QSignalSpy: QMetaObject::connect returned false. Unable to connect.Don't know how to handle '%s', use qRegisterMetaType to register it.QCoreApplication::applicationName()page->property("title").toString()QString("Count the kilometres")button->property("text").toString()all1->property("text").toString()all2->property("text").toString()i18n->dtr(i18n->domain(), QString("Welcome"))i18n->tr(QString("Count the kilometres"))i18n->ctr(QString("All Contacts"), QString("All"))i18n->ctr(QString("All Calls"), QString("All"))/en/LC_MESSAGES/localizedApp.moQFileInfo(messageCatalog).exists()QString(localeA.readAll()).split("\n").contains("en_US.utf8")button2->property("text").toString()all3->property("text").toString()i18n->tag(QString("All kittens"))i18n->tag(QString("All Cats"), QString("All"))i18n->tr(QString("Count the kittens"))i18n->ctr(QString("All Cats"), QString("All"))/share/locale/en/LC_MESSAGES/localizedApp.moQFileInfo(testAppDir + "/share/locale/en/LC_MESSAGES/localizedApp.mo").exists()/home/nick/Work/phablet/bugs/1378821.time/uitk.split.i18n/modulesAWAVAUATIUSHHIHHLD$DL$HHxpLILIzArLHIDL$H5LLAQLD$MAPIH([]A\A]A^A_ATUSL'A$uIIcD$ HIcD$LH,LH9t@HHH9u[L]A\t A,$t[]A\L'HuHDt („tHUSHH(HHHHGHHHH{ ugH{u.H{HH[]t/uH{f.t/uH{ HH{ H{H{HHHHH*C\esUSHH(HHHHGHHHH{ ugH{u.H{HHH[]t/uH{f.t/uH{ HH{ H{H{HHHHH*C\emATUSL'A$}IcD$ HIcD$LH,LH9u?[L]A\@t(„uH;H9tHHuf.t A,$t[]A\L'dHuHt („tHQQuickItem *defaultLC_ALLexitLoopQString("")i18n->domain()src/tst_i18n_LocalizedApp.cppCsrc/LocalizedApp.qmlrootapplicationNamelocalizedAppQString("localizedApp")pageWelcometitleQString("Welcome")buttonCount the kilometrestextall1AllQString("All")all2All ContactsAll Calls/localizedAppshare/localeexpectedLocalePathboundDomaingettextDomainlocale -alocaleA.waitForFinished()en_US.utf8 2languageChanged()GreetsQString("Greets")Count the clicksQString("Count the clicks")TodosQString("Todos")TodasQString("Todas")button2Count the kittensQString("Count the kittens")all3All kittensQString("All kittens")All CatsContar los gatitosQString("Contar los gatitos")CadaQString("Cada")APP_DIRQDir(modules).exists()UHAWAVAULmATSIHLIH]HXdH%(HE1HELHHHPMDuHA?H}ELuLLHULHHRHHuH=HIH};HMdH3 %(LeHe[A\A]A^A_]Q/BH}*HHAHLLHEHUHcBJ ) :v{HrHHIHuIHcF HHcFHH H<I9t H)HA$tA,$HUHcBHHIHD/H}L%A$At^HD9LDHHu6fDE1vLVL$HEH5HILH AHH5L5h H}AXZt&t /t E<$/H}fHH0`1QII&LMHLLHHLHIIHLHLHg4J}$AWAVIAUATUSHHHcPH,HIIHcP L,HcPIHHI9HD$t3HHuHIL#HHI9uAu HL[]A\A]A^A_f.t A/tH[]A\A]A^A_H LHHH9\$tHkHtHHHHHI>M>HH1$#et }AUATAUSHHHҋ3C%9u HcҾHHHHEDcHcPHHH4A9L,IHHKI)LHH}D;gW K   H9S u H[]A\A]fDHHH9tt+t /„tH]H[]A\A]H}IcL,P@HcSHD9|I II`LHHH0HHC(HHH@H{HLLHCH@HC HHK.k  p   ] $ AWAVAUATIUSHHT$t$ Ht$ HcPHHЉHH$IIEHcPL4HcT$ IH,M$.M9tIHLfDHt HHHHI9uIEHcT$ HcHH,L$IHcH H,$L4IHcD$HM$M9t$L@Ht HHHHI9uAutIcG HIcGLH,LH9tfHHH9uLIUHcBHHHcT$ H[]A\HA]A^A_@tA/uvHHHCI9t.HHHHCI9tkHHHI}HcGH,HcD$ HH\H9tHHH9uI}M}HHHHI}M}HHMC;}ATUHSHHdH%(HD$1H8v:Ht HHHD$dH3%(u'H[]A\fHIHH$HHHh HLHH HH1(0@fn AWAVAUATIUSH(HT$t$Ht$HcPH,HIHD$HD$IHcPL<HcT$IH,M,/M9tRLL@HuHIL#HHI9uIHcT$HcHH,L,IHcH Hl$L$IHcD$HM|M9t3LHuHIL+HHI9uHD$uHcGH,HcD$HH\H9t$HL#MtLLH9uI>HD$ILHHI9tHkHtHHHHH"HI>HD$IHHHMB<}'}AUATIUSHHH8v@ILHHImH[]A\A]ILHHImH[]A\A]IHLHHh HIHHLHHh HH=2"/=Xes}HSHHHH[USHHHHHHu_H{u&HHH[]t/uH{f.t/uH{H H{HHH+DLATUISH0|$ H=Hl$dH%(HD$(1Ht$ HL1HHHt$ LHCHHHHHL$(dH3 %(u H0[]A\IHLHHH@Of'(.) Mm+Z,++--,-H,,,j,,j,, $ p, m. , + + 0+ . '-.+Q,-----(,0V,00/00$,RV,QQQQQ$,QV,QQQQQ$,QQPPPQQ2,PPPPP$,PTTTTTP(,TSSSSST$,SSSSRRRRR55505 4 . 54!/!(/!)/!."/"Z."/#.#/$/$(5$/$/$.$/$.%/%4%5%R%R%,&-'g+(+)p-*+*-+,,,--.0.050.14141424242424242(43P3O3I4O4P444.646O6O6O6O7O7247O7O8O8O8O8$48N9V49N:N:N:N:N:*4;N;V4<N<N<N<N<N<.4=M=M=M>M>M>M>M>.4>M?M?M?M?M?.4@L@L@L@LALALALA.4ALBKBKBKBKBKBLB.4CKCJCJDJDKD.4DJDJEJEJEJEJEJE.4FJFJFJFJFJG.4GJGJHJHIHJHJHJH4H.H/H4I5IRIRI,I|F((z        UHAWAVAUATISIΉHHdH%(HE1Ex ut,mH}dH3<%(EiHe[A\A]A^A_]HIE L}HUp;r~:L&IE p~a1ELe6fIT^LLLLIE EHM;H}H@4)uIt^LѐI}LA}HtaI](HII9tYjH5jjj1jjE1jjjjHjjjjjjjjjjHĠLmAuHHQ-A(LH5LLH AHH5L5h HAXZu.HD (LHJt/uHHH HXH`HpHHH LLLHX1IIHLHxMHLIHmH HH!HpHL=L0IIHLHLHxHHHH H`LLIH%HHHLHLHL{HH%H4LHHLH0HHH8H@HXHPH`HLHHLH\H`1HHH+HH2LSLH`HXcLVLH5LLLLHLHLx1ELH{(EE1LELmLHELH5ELLHhHLHLHHxHxLH HALHx0LL0LH5LLH(HLHLHHxHxLH HALHx0LL0HQII HxLLHLIIIHHHHxMLHH HH*HXHXLLHH5HHxLH HLLLLHxLH HALL爅0LHx0HH5HIH0LHHLHLHHxHxLH HALL0HxALH0EL H5LHhLLLIHx1H MHH5@AmH@H5HIH0L HxHLH0LHHxHxLH HALL0HxALH0EHPH5HIIHhLLLI1H MHH5@APHpH5HIHxL0HLLL`LLLH HALLLxLALHxEHH5HIHhLH5LHLHHxLHxLLLLH HALLLhLAHxLHhEHH5HIHxLH5LLLLLLH HALLLxLALHxEDH H5HIHhLH5LHH5HHxLHxLLLLH HALLLhLAHxLHhEtH`H5HIHhL@H5LH0H5HHxLPHxLLLLH HALLLhLAHxLHhEHH5HIHxLpH5LLLLLLH HALLLxLALHxEHH5HIHhLH5LHH5HHxLHxLLLLH HALLLhLAHxLHhE4HH5HIHxLH5LLLLLLH HALLLxLALHxEH@H5HIHhH H5HHxLH5LL0HxLLLLH HALLMLALHxLEHHHH8H@HXHPH`HphII!HxLLsLMLMHxMHh=IIII(I.IbICItI%IYI:IkLMLMHxMLMHxMLMHhLMLMHxMwII IILMHxMLMHh-II IILMHxMLMHhII IILMLMHxMII LMHxMLMHheIIII LMLMHxM'IIII1I$I8LMHxMLH0LIIHxMLH0IIIIILLHxUIH%H-LH`HXL_LH`HX:HHHHLH`HXLHHHHLH`HXHHHH+HH2LLH`HXpLcHHNHHHP?L2H*H HH*H`H`LLHH H HLH`HXLHHHH 19QListSpecialMethodsI5QListI8QVariantEE5QListIS_I8QVariantEE+++x vkTLtst_I18n_LocalizedAppinitTestCasecleanupTestCasetestCase_LocalizedApp10QSignalSpy21tst_I18n_LocalizedAppA BGCC: (Ubuntu 4.9.2-10ubuntu13) 4.9.2zRx 0DXl HS4KFAT R AAA DGA.AY F M4cBBD A(D0H(D ABB(@uBAD cDBl7$3AAO _AA7zPLRx ,$AAG D DAN 4TBAD G0  AABJ D/X/`)bBE B(A0A8G@y8A0A(B BBBB@LBBB B(D0A8MPWXJ`L8A0A(B BBB8 tBAA F DBH S ABA \7,AAK a DAM ,AAK i DAE 8BAA } DBI S ABA  /8hAC FP H .D.dEBBE B(A0A8DP 8D0A(B BBBO U 8A0A(B BBBA P BBD A(G0 (A ABBG m (A ABBA 8`AC HF- A .l.LuBBD B(D0A8DPR 8A0A(B FBBE 4BAD G0K  AABC L$BBD B(D0A8D`6 8A0A(B FBBI LtBBD A(G0z (A ABBH h (A ABBA | HS,AAG L DAF 4BAD DP  AABA 8HAC HGQ D .i.T%*AC HK.b.K G 3.D.x.g.u.e.'.a.LvBBB B(A0A8GM 8A0A(B BBBH 4iBAD I0Y  AABC .symtab.strtab.shstrtab.rela.text.data.bss.text.unlikely._ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE8DestructEPv.text._ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE8DestructEPv.text.unlikely._ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE9ConstructEPvPKv.text._ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE9ConstructEPvPKv.text.unlikely._ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE6DeleteEPv.rela.text._ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE6DeleteEPv.text.unlikely._ZN7UCUnitsD2Ev.rela.text._ZN7UCUnitsD2Ev.text.unlikely._ZN21tst_I18n_LocalizedAppD2Ev.rela.text._ZN21tst_I18n_LocalizedAppD2Ev.text.unlikely._ZN21tst_I18n_LocalizedAppD0Ev.rela.text._ZN21tst_I18n_LocalizedAppD0Ev.text.unlikely.text.unlikely._ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE6CreateEPKv.rela.text._ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE6CreateEPKv.text.unlikely._ZN10QByteArrayD2Ev.rela.text._ZN10QByteArrayD2Ev.text.unlikely._ZN7QStringC2EPKc.rela.text._ZN7QStringC2EPKc.text.unlikely._ZN7QStringD2Ev.rela.text._ZN7QStringD2Ev.text.unlikely._ZN10UbuntuI18nD2Ev.rela.text._ZN10UbuntuI18nD2Ev.gcc_except_table._ZN10UbuntuI18nD2Ev.text.unlikely._ZplRK7QStringPKc.rela.text._ZplRK7QStringPKc.gcc_except_table._ZplRK7QStringPKc.text.unlikely._ZN5QListI7QStringED2Ev.rela.text._ZN5QListI7QStringED2Ev.text.unlikely._ZN5QListI8QVariantED2Ev.rela.text._ZN5QListI8QVariantED2Ev.text.unlikely._ZN5QListI8QVariantEC2ERKS1_.rela.text._ZN5QListI8QVariantEC2ERKS1_.gcc_except_table._ZN5QListI8QVariantEC2ERKS1_.rodata.str1.8.text.unlikely._ZN5QTest8qCompareI7QStringEEbRKT_S4_PKcS6_S6_i.rela.text._ZN5QTest8qCompareI7QStringEEbRKT_S4_PKcS6_S6_i.text.unlikely._ZN5QListIS_I8QVariantEED2Ev.rela.text._ZN5QListIS_I8QVariantEED2Ev.text.unlikely._ZN7QVectorIiED2Ev.rela.text._ZN7QVectorIiED2Ev.text.unlikely._ZN10QSignalSpyD2Ev.rela.text._ZN10QSignalSpyD2Ev.gcc_except_table._ZN10QSignalSpyD2Ev.text.unlikely._ZN10QSignalSpyD0Ev.rela.text._ZN10QSignalSpyD0Ev.gcc_except_table._ZN10QSignalSpyD0Ev.text.unlikely._ZN5QListI10QByteArrayED2Ev.rela.text._ZN5QListI10QByteArrayED2Ev.text.unlikely._ZN5QListIP10QQuickItemED2Ev.rela.text._ZN5QListIP10QQuickItemED2Ev.rodata.str1.1.text.unlikely._ZN21tst_I18n_LocalizedApp8testItemEP10QQuickItemRK7QString.rela.text._ZN21tst_I18n_LocalizedApp8testItemEP10QQuickItemRK7QString.gcc_except_table._ZN21tst_I18n_LocalizedApp8testItemEP10QQuickItemRK7QString.text.unlikely._ZN5QListI8QVariantE13detach_helperEi.rela.text._ZN5QListI8QVariantE13detach_helperEi.gcc_except_table._ZN5QListI8QVariantE13detach_helperEi.text.unlikely._ZN7QVectorIiE11reallocDataEii6QFlagsIN10QArrayData16AllocationOptionEE.rela.text._ZN7QVectorIiE11reallocDataEii6QFlagsIN10QArrayData16AllocationOptionEE.gcc_except_table._ZN7QVectorIiE11reallocDataEii6QFlagsIN10QArrayData16AllocationOptionEE.text.unlikely._ZN10QSignalSpyC2EPK7QObjectPKc.rela.text._ZN10QSignalSpyC2EPK7QObjectPKc.gcc_except_table._ZN10QSignalSpyC2EPK7QObjectPKc.text.unlikely._ZN5QListIS_I8QVariantEE18detach_helper_growEii.rela.text._ZN5QListIS_I8QVariantEE18detach_helper_growEii.gcc_except_table._ZN5QListIS_I8QVariantEE18detach_helper_growEii.text.unlikely._ZN5QListIS_I8QVariantEE6appendERKS1_.rela.text._ZN5QListIS_I8QVariantEE6appendERKS1_.gcc_except_table._ZN5QListIS_I8QVariantEE6appendERKS1_.text.unlikely._ZN5QListI8QVariantE18detach_helper_growEii.rela.text._ZN5QListI8QVariantE18detach_helper_growEii.gcc_except_table._ZN5QListI8QVariantE18detach_helper_growEii.text.unlikely._ZN5QListI8QVariantE6appendERKS0_.rela.text._ZN5QListI8QVariantE6appendERKS0_.gcc_except_table._ZN5QListI8QVariantE6appendERKS0_.text.unlikely._ZN7UCUnitsD0Ev.rela.text._ZN7UCUnitsD0Ev.text.unlikely._ZN10UbuntuI18nD0Ev.rela.text._ZN10UbuntuI18nD0Ev.gcc_except_table._ZN10UbuntuI18nD0Ev.rela.text.startup.gcc_except_table.text.unlikely._ZN10QSignalSpy11qt_metacallEN11QMetaObject4CallEiPPv.rela.text._ZN10QSignalSpy11qt_metacallEN11QMetaObject4CallEiPPv.text.unlikely._ZN21tst_I18n_LocalizedApp21testCase_LocalizedAppEv.rela.text._ZN21tst_I18n_LocalizedApp21testCase_LocalizedAppEv.bss._ZZN11QMetaTypeIdIP10QQuickItemE14qt_metatype_idEvE11metatype_id.bss._ZZN10QSignalSpyC4EPK7QObjectPKcE12memberOffset.bss._ZZN10UbuntuI18n8instanceEvE8instance.bss._ZZN7UCUnits8instanceEvE8instance.rela.data.rel.ro._ZTI19QListSpecialMethodsI5QListI8QVariantEE.rodata._ZTS19QListSpecialMethodsI5QListI8QVariantEE.rela.data.rel.ro._ZTI5QListIS_I8QVariantEE.rodata._ZTS5QListIS_I8QVariantEE.rodata.rela.data.rel.ro._ZTI10QSignalSpy.rodata._ZTS10QSignalSpy.rodata._ZTS21tst_I18n_LocalizedApp.rela.data.rel.ro._ZTI21tst_I18n_LocalizedApp.rela.data.rel.ro._ZTV10QSignalSpy.rela.data.rel.ro._ZTV21tst_I18n_LocalizedApp.rela.data.rel.ro.bss._ZGVZN10UbuntuI18n8instanceEvE8instance.bss._ZGVZN7UCUnits8instanceEvE8instance.bss._ZGVZN10QSignalSpyC4EPK7QObjectPKcE12memberOffset.rodata.cst4.rela.data.DW.ref.__gxx_personality_v0.comment.note.GNU-stack.rela.eh_frame.group13456789:<=?@BCEFGI1pc1uIJLMOPRSUVWYZ[]^`acdefhiklnoqrsuvwyz|}~|+|d|A|%dd(|#d)|/| 5d;d(AdGd(MdPSdY|_|e|&k|2q|_w|a}|v|{||dp||||d|||dd|||d|d0dXd| d|!d|9%|F+|Y1|e7d =d@C|sI|}O|U|[dha|g|m|s|y||||||+|3|Ed|bd|g|sd|d ||dP|| dx!@Tf v   8U      !"#$%&'()*+,-./0u"6"8":dz"="="@!p"@"C 71a01 K"G.TZk"J7"J7"M3"M3$"P74"P7D"SX!t"S"W  "[/2 "[/J "^/c "^/| "a)      "a) "fA a s  "it "it "l7 "l7 "o !p& ; "oO "sc "w "w "z/ "z/ "~ - G ` z    C     C]"E"%,:"ZlDX &Jm""uEd"""" "!?"3If3"%*g -Pr %Np!.9Tl~Q1Ed1`v 'Km~ $<1 i}!!)!@!Z!8k! !!!Fmtst_i18n_LocalizedApp.cpp_ZL40qt_meta_stringdata_tst_I18n_LocalizedApp_ZN5QListI8QVariantE7deallocEPN9QListData4DataE.isra.20_ZN5QListI7QStringE7deallocEPN9QListData4DataE.isra.17_ZL34qt_meta_data_tst_I18n_LocalizedApp.LC82.LC121.LC122.LC52.LC49.LC123.LC124.LC125.LC126.LC127.LC19.LC27.LC31.LC34.LC37.LC35.LC32.LC33.LC36.LC45.LC47.LC50.LC51.LC53.LC54.LC55.LC56.LC57.LC58.LC59.LC60.LC61.LC62.LC63.LC64.LC65.LC66.LC67.LC68.LC69.LC70.LC71.LC72.LC73.LC74.LC75.LC76.LC77.LC78.LC79.LC80.LC81.LC83.LC84.LC85.LC86.LC87.LC88.LC89.LC90.LC91.LC92.LC93.LC94.LC95.LC96.LC97.LC98.LC99.LC100.LC101.LC102.LC103.LC104.LC105.LC106.LC107.LC108.LC109.LC110.LC111.LC112.LC113.LC114.LC115.LC116.LC117.LC118.LC119_ZN7UCUnitsD5Ev_ZN21tst_I18n_LocalizedAppD5Ev_ZN10QByteArrayD5Ev_ZN7QStringC5EPKc_ZN7QStringD5Ev_ZN10UbuntuI18nD5Ev_ZN5QListI7QStringED5Ev_ZN5QListI8QVariantED5Ev_ZN5QListI8QVariantEC5ERKS1__ZN5QListIS_I8QVariantEED5Ev_ZN7QVectorIiED5Ev_ZN10QSignalSpyD5Ev_ZN5QListI10QByteArrayED5Ev_ZN5QListIP10QQuickItemED5Ev_ZN10QSignalSpyC5EPK7QObjectPKc_ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE8DestructEPv_ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE9ConstructEPvPKv_ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE6DeleteEPv_GLOBAL_OFFSET_TABLE__ZdlPv_ZN7UCUnitsD2Ev_ZTV7UCUnits_ZN7QObjectD2Ev_ZN7UCUnitsD1Ev_ZN21tst_I18n_LocalizedAppD2Ev_ZTV21tst_I18n_LocalizedApp_ZN21tst_I18n_LocalizedAppD1Ev_ZN21tst_I18n_LocalizedAppD0Ev_ZNK21tst_I18n_LocalizedApp10metaObjectEv_ZNK11QObjectData17dynamicMetaObjectEv_ZN21tst_I18n_LocalizedApp16staticMetaObjectE_ZN21tst_I18n_LocalizedApp11qt_metacastEPKcstrcmp_ZN7QObject11qt_metacastEPKc_ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE6CreateEPKv_Znwm_ZN8QVariantD1Ev_ZN9QListData7disposeEPNS_4DataE_ZN10QArrayData10deallocateEPS_mm_ZN10QByteArrayD2Ev_ZN10QByteArrayD1Ev_ZN7QStringC2EPKcstrlen_ZN7QString16fromAscii_helperEPKci_ZN7QStringC1EPKc_ZN7QStringD2Ev_ZN7QStringD1Ev_ZN10UbuntuI18nD2EvDW.ref.__gxx_personality_v0_ZTV10UbuntuI18n_Unwind_Resume__gxx_personality_v0_ZN10UbuntuI18nD1Ev_ZplRK7QStringPKc_ZN7QString15fromUtf8_helperEPKci_ZN7QString6appendERKS___stack_chk_fail_ZN5QListI7QStringED2Ev_ZN5QListI7QStringED1Ev_ZN5QListI8QVariantED2Ev_ZN5QListI8QVariantED1Ev_ZN5QListI8QVariantEC2ERKS1__ZN9QListData6detachEi_ZN8QVariantC1ERKS___cxa_begin_catch__cxa_rethrow__cxa_end_catch_ZN5QListI8QVariantEC1ERKS1__ZN5QTest8qCompareI7QStringEEbRKT_S4_PKcS6_S6_i_ZN5QTest15toPrettyUnicodeEPKti_ZeqRK7QStringS1__ZN5QTest14compare_helperEbPKcPcS2_S1_S1_S1_i_ZN5QListIS_I8QVariantEED2Ev_ZN5QListIS_I8QVariantEED1Ev_ZN7QVectorIiED2Ev_ZN7QVectorIiED1Ev_ZN10QSignalSpyD2Ev_ZTV10QSignalSpy_ZTV14QTestEventLoop_ZN10QSignalSpyD1Ev_ZN10QSignalSpyD0Ev_ZN5QListI10QByteArrayED2Ev_ZN5QListI10QByteArrayED1Ev_ZN5QListIP10QQuickItemED2Ev_ZN5QListIP10QQuickItemED1Ev_ZN21tst_I18n_LocalizedApp8testItemEP10QQuickItemRK7QString_ZNK7QString11toLocal8BitEv_ZNK7QObject8propertyEPKc_ZNK8QVariant8userTypeEv_ZN9QMetaType9typeFlagsEi_ZN10QQuickItem16staticMetaObjectE_ZNK11QMetaObject4castEP7QObject_ZN9QListData11shared_nullE_Z23qt_qFindChildren_helperPK7QObjectRK7QStringRK11QMetaObjectP5QListIPvE6QFlagsIN2Qt15FindChildOptionEE_ZZN11QMetaTypeIdIP10QQuickItemE14qt_metatype_idEvE11metatype_id_ZNK8QVariant7convertEiPvmemcpy_ZN11QMetaObject14normalizedTypeEPKc_ZN9QMetaType22registerNormalizedTypeERK10QByteArrayPFvPvEPFS3_PKvES5_PFS3_S3_S7_Ei6QFlagsINS_8TypeFlagEEPK11QMetaObject_ZNK8QVariant9constDataEv_ZN5QListI8QVariantE13detach_helperEi_ZN7QVectorIiE11reallocDataEii6QFlagsIN10QArrayData16AllocationOptionEE_ZN10QArrayData8allocateEmmm6QFlagsINS_16AllocationOptionEE_ZN10QArrayData11shared_nullEmemset_Z9qBadAllocv_ZN10QSignalSpyC2EPK7QObjectPKc_ZN7QObjectC2EPS__ZGVZN10QSignalSpyC4EPK7QObjectPKcE12memberOffset_ZNK14QMessageLogger7warningEPKcz__cxa_guard_acquire_ZN7QObject16staticMetaObjectE_ZNK11QMetaObject11methodCountEv_ZZN10QSignalSpyC4EPK7QObjectPKcE12memberOffset__cxa_guard_release_ZN11QMetaObject19normalizedSignatureEPKc_ZNK11QMetaObject13indexOfMethodEPKc_ZN11QMetaObject7connectEPK7QObjectiS2_iiPi_ZN11QMetaObject10ConnectionD1Ev_ZN10QByteArrayaSERKS__ZNK11QMetaObject6methodEi_ZNK11QMetaMethod14parameterCountEv_ZNK11QMetaMethod13parameterTypeEi_ZNK11QMetaMethod11methodIndexEv_ZN11QMetaObject8metacallEP7QObjectNS_4CallEiPPv_ZNK11QMetaMethod14parameterNamesEv__cxa_guard_abort_ZN10QSignalSpyC1EPK7QObjectPKc_ZN5QListIS_I8QVariantEE18detach_helper_growEii_ZN9QListData11detach_growEPii_ZN5QListIS_I8QVariantEE6appendERKS1__ZN9QListData6appendEv_ZN5QListI8QVariantE18detach_helper_growEii_ZN5QListI8QVariantE6appendERKS0__ZN7UCUnitsD0Ev_ZN10UbuntuI18nD0Evmainunsetenv_ZN15QGuiApplicationC1ERiPPci_ZN16QCoreApplication12setAttributeEN2Qt20ApplicationAttributeEb_ZN5QTest5qExecEP7QObjectiPPc_ZN15QGuiApplicationD1Ev_ZN10QSignalSpy11qt_metacallEN11QMetaObject4CallEiPPv_ZN7QObject11qt_metacallEN11QMetaObject4CallEiPPv_ZN8QVariantC1EiPKv_ZNK7QObject6threadEv_ZN7QThread13currentThreadEv_ZN11QMetaObject12invokeMethodEP7QObjectPKcN2Qt14ConnectionTypeE22QGenericReturnArgument16QGenericArgumentS7_S7_S7_S7_S7_S7_S7_S7_S7__ZN7QObject9killTimerEi_ZN10QEventLoop4exitEi_ZN9QListData7reallocEi_ZN21tst_I18n_LocalizedApp21testCase_LocalizedAppEv_ZGVZN10UbuntuI18n8instanceEvE8instance_ZZN10UbuntuI18n8instanceEvE8instance_ZNK10UbuntuI18n6domainEv_ZN10UbuntuI18nC1EP7QObject__dso_handle__cxa_atexit_ZN10UbuntuI18n11setLanguageERK7QString_ZN4QUrl13fromLocalFileERK7QString_ZN10QQuickView9setSourceERK4QUrl_ZN4QUrlD1Ev_ZN16QCoreApplication13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE_ZNK10QQuickView10rootObjectEv_ZN5QTest7qVerifyEbPKcS1_S1_i_ZNK8QVariant8toStringEv_ZN16QCoreApplication15applicationNameEv_ZN10UbuntuI18n3dtrERK7QStringS2__ZN10UbuntuI18n2trERK7QString_ZN10UbuntuI18n3ctrERK7QStringS2__ZNK7QString6toUtf8Evbindtextdomain_ZN4QDir11currentPathEv_ZN4QDirC1ERK7QString_ZNK4QDir8filePathERK7QString_ZN4QDirD1Evtextdomain_ZN9QFileInfoC1ERK7QString_ZNK9QFileInfo6existsEv_ZN9QFileInfoD1Ev_ZN8QProcessC1EP7QObject_ZN8QProcess5startERK7QString6QFlagsIN9QIODevice12OpenModeFlagEE_ZN8QProcess15waitForFinishedEi_ZN9QIODevice7readAllEv_ZNK7QString5splitERKS_NS_13SplitBehaviorEN2Qt15CaseSensitivityE_ZN9QtPrivate20QStringList_containsEPK11QStringListRK7QStringN2Qt15CaseSensitivityE_ZN8QProcessD1Ev_ZN10QEventLoopC1EP7QObject_ZN7QObject10startTimerEiN2Qt9TimerTypeE_ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE_ZN10QEventLoopD1Ev_ZN10UbuntuI18n3tagERK7QString_ZN10UbuntuI18n3tagERK7QStringS2__ZN21tst_I18n_LocalizedApp18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPvsetenv_ZNK4QDir6existsEv_ZN10QQuickViewC1EP7QWindow_ZNK10QQuickView6engineEv_ZGVZN7UCUnits8instanceEvE8instance_ZZN7UCUnits8instanceEvE8instance_ZN7UCUnits2guEf_ZN7QWindow11setGeometryEiiii_ZNK10QQmlEngine14importPathListEv_ZNK4QDir12absolutePathEv_ZN10QQmlEngine17setImportPathListERK11QStringList_ZN9QListData7prependEv_ZN7UCUnitsC1EP7QObject_ZN21tst_I18n_LocalizedApp11qt_metacallEN11QMetaObject4CallEiPPv_ZTI19QListSpecialMethodsI5QListI8QVariantEE_ZTVN10__cxxabiv117__class_type_infoE_ZTS19QListSpecialMethodsI5QListI8QVariantEE_ZTI5QListIS_I8QVariantEE_ZTVN10__cxxabiv120__si_class_type_infoE_ZTS5QListIS_I8QVariantEE_ZTI10QSignalSpy_ZTVN10__cxxabiv121__vmi_class_type_infoE_ZTS10QSignalSpy_ZTI7QObject_ZTS21tst_I18n_LocalizedApp_ZTI21tst_I18n_LocalizedApp_ZNK7QObject10metaObjectEv_ZN7QObject5eventEP6QEvent_ZN7QObject11eventFilterEPS_P6QEvent_ZN7QObject10timerEventEP11QTimerEvent_ZN7QObject10childEventEP11QChildEvent_ZN7QObject11customEventEP6QEvent_ZN7QObject13connectNotifyERK11QMetaMethod_ZN7QObject16disconnectNotifyERK11QMetaMethod-g4<!%'!w37C8d''x'y7#8D'W_fzm{t|'},z{~ +$8DK ` hpJ'R^f:''$o6>sE LTdos }s 9//3/ :  /% /- /5 3L AT /Y Bc Cp   / / / / 3 ?  ]"&Q&   $!$'+$,' 2,'E'/3SC+S7^8w'9//3  l8?$@A%BCA&BC%32FHFVGbH@=Q&' N O+D']'fIL)I3t N O+D']'fInL)I3|n'H& &5WKXa%~'WXYZ [\%'S ]Z [r^?US _fY}`&ab   #  [cK'\dx9)%)3U3U3)3$?f$u@A%BC!A)&1B9CA3l@ga h 'YiijA'BC3/l6 ]C NQ hlls Oz mnDoS pXq_ ristu= rEvqwxyzz{|}~0]neSn' fn-nkynf9S()/ OCOL[)dIlt3|<DD8=E&A=A=BCA=&(B2B:CB3GCOAX&aBiCq31ADgDo}9ABA=BC3C3=~$@$@*lA%BCA% &&B.9AO%WbBqCyA&BC3C3#0$>@Yf$t@ABC3ABC3  2,'E'M/3[,APZ$gln 93)k ]e%#1ix=9%=3 9 @{N,nFFGzH''o s 5,#-,COW^g'z{X%,F9FOGVzmt|HFF Gz)08@Hg''''^tFFGzH',IWiX%'WXYZ [\&%F'f'wz~{-XzE$/,%4/OW-iV{/z{-X  z  3 E> /J %V /m u - V / z {    -  X$ + z2 9 Q E\ /h %t /  - V / z {    - , XB I zP W o Ez / % /  -  -   z  - E; /G /S /[ /v  -  -  z   E / / /% - -; J -X g -  z   E / / / /  - -)8-X_zfm~E//// -)/*8wJ6R/`h-~/zE-z#*;EF/dv6z{-/$z+{2@Ve-s{-,"z){0>L:X/d)l/x//////3 ]A [`^?a&Ux _Y`9b   #  [(cI'P _`d)//3U)%) 3/!/)3Q/Y3a/n/%3/3/%//3U#/B:N/Z)b/n/z///////#//%;/H/[c-nv/}-X)7z>ESEe/m%u/-XzE /%//PJ/R%Z/eP////-)1XCQzX_mE{/%/-Xz#E2/:%F/]e-wV/z{-Xz%,AEP/X%d/{-V/z{-X")z07OEZ/b%n/--zE/&/./:/Qc-qy-zE/// -  -' 6 -R Y z` g  E / / / /  -  - !-"!)!z0!7!O!EZ!/f!/n!/z!/!!-!!-!!z!!!E"/"/"/1"C"-Q"Y"-g"v"-""z"""E"/"/"/"/##-!#)#->#E#zL#S#k#Ev#/~#/#/##-##-##-$ $z$$+$E6$/>$/J$/R$/c$Po${$/$/$/$/$/$/$/$%$/$/$/ %/%/d%/o%/~%/%/%/%/%/%/%/%/&/&/&/(&/L&/[&/f&/r&/&/&/&/&/&/&/&/'/'%.'/\'/p'/x'%'/'/'/'%'/'/'%(/(/+(/7(/?(/L(/X(/d(/(/(/(/(/(/(%(/ )/)/")%.)/;)/f)/s)/)/)/)/)))/)/)/)/(" (P0Q8@HPX`h  (08@HPX`hpgg4 4H \ p  pDp1!"H$\&p(y),$.`0t2}3568:$=->`@iACDF%GXIaJLMOP0R9SUWXYZ\ Z"@^IZM`ZH +@ +L +X +d+x+ #+ + + ++6+ + ++ E+ +( +4+P +\ +hV+xe+f++++++ + +_+r+++ +(+0+8+@+H+P+X+`N+h+p+x+m+1 I @@ 1& , 1   F   @:S w r@0=4 @ @0@T ` @HHC= L  .@0G * 7%@JD j 3e@0M$07@Php@ S)$@J@E@Wb6@/@[pp/@^M)H@Pap02jjp@xf(YtT@0i|7@l@ o!$LG@8sf!@ 0w / @Pz2 2A   @h~ "k! J#[ P#EV @ph $4 $ $ @ i &( & & @p h.OO . .u @h@ 81P 1E 1@ @Pq d24 2 2 @P5PY55@6@66  @HH%7M7H@g77@P88??@8AA%*{@h>kk5l `ll@x@0 l) Pl@@H'plIl@V`n8 Q@@`tn nn@PAHop@@A8op@@B85p0 0@D`B0po0p0p0p8p@hD0@p& fp!hp@Dx2x- 0./tests/unit/tst_i18n/tst_i18n.pro0000644000015600001650000000012512700370701017055 0ustar jenkinsjenkinsTEMPLATE = subdirs SUBDIRS += tst_i18n_LocalizedApp SUBDIRS += tst_i18n_RelativeTime ./tests/unit/tst_i18n/tst_i18n_RelativeTime.o0000644000015600001650000031435012700370701021175 0ustar jenkinsjenkinsELF>d@@56789:<=?@BCFGIJLMOPRSUVWYZ[]^`acefhiklnoqrsuvwyz}~HH(tHHtCUSHH5HHHHuH[]HHH[]1Ð@AUATIUSHHcG HHcGHL$IL9t!HH+HtHHI9uHL[]A\A]ff.ATUISHcG HHcGHH,HH9u=@H;H9t"HHt܃t(„tH9u[L]A\f.AWAVAUATUSHdH%(H$1uHt@'tKH$dH3%( H[]A\A]A^A_HHtHP L$LH$HD$ QvL$H5 Hl$ LHl$ LHH$H$vH$HH$H=HHpH$HD$ H$QvH5,LL$L$LLH$/L$LLLH HH5ATLAH$EH=ALl$0Lt$pHD$0LLLH HH5AWLAEE(1HILsLL5H$A>L=L,A>D$ L,H{DD$ 11H\$@H4$HLt$PLLL|$`LLHD$@8HcPHt$HD$L$IHL$@Hct$HcQH<HHL:L9tULHtH1H v@HHI9uHL$@Hct$HcQH<HHIHcy H<HH HH9t.HtI $1H v@HIH9uՋHHT$@HcBHHHcT$HHtHD$`HQvH|$`yLH<$HHH|$0tt%/uH|$0fDH|$ u&ffD/H|$ 뻐/H$eG/8H$i/ZH$>/H$A/2H$/~H|$`efDHD$`H$QvHH$Hf.LV1LLH=HL)LL=1LLH=HLH(„9,LHLHHILLHLLHLHHLHHIIHLILHXHPLHL@HLHL#HHHHHf.ATUISH͉Hx u~.H[]A\f uHUf.H1LD$ D$ HHt HtHHHHHHHHHSHHHH[SHHtHH[DH[HuHDt („tHUSHHHHt HHHEH[]HuHDt („tHUSHHHHHHu_H{u&HH[]ft/uH{f.t/uH{H H{HHH+DRATUHSHHHdH%(HD$1HvHt HHHIHHH<$u4HL$dH3 %(Hu(H[]A\ft/uH<$HHLHHR]vHuHt („tHHuHt („tHHHtAWAVIAUATUSHHpHHcPH,HIHcP L,HcPIL<IM9Lt2fHuHIL#HHI9uH[]A\A]A^A_H LHHI9tHkHtHHHHHI>HH-!7 }Compared values are not the sameQSignalSpy: Cannot spy on a null objectQSignalSpy: Null signal name is not validQSignalSpy: Not a valid signal, use the SIGNAL macroQSignalSpy: No such signal: '%s'QSignalSpy: QMetaObject::connect returned false. Unable to connect.Don't know how to handle '%s', use qRegisterMetaType to register it.QDateTime(QDate(2000,1,1), QTime(0,0,0,0)).toString("ddd d MMM'\u2003'HH:mm")timeFarAway->property("text").toString()timeNow->property("text").toString()timeMinuteBefore->property("text").toString()timeMinuteAfter->property("text").toString()tenMinutesBefore->property("text").toString()tenMinutesAfter->property("text").toString()i18n->relativeDateTime(QDateTime::currentDateTime())i18n->relativeDateTime(QDateTime(QDate(2000,1,1), QTime(0,0,0,0)))i18n->relativeDateTime(QDateTime::currentDateTime().addSecs(-60))i18n->relativeDateTime(QDateTime::currentDateTime().addSecs(60))i18n->relativeDateTime(QDateTime::currentDateTime().addSecs(-600))i18n->relativeDateTime(QDateTime::currentDateTime().addSecs(600))/en/LC_MESSAGES/relativeTime.moQFileInfo(messageCatalog).exists()QString(localeA.readAll()).split("\n").contains("en_US.utf8")button2->property("text").toString()all3->property("text").toString()/share/locale/en/LC_MESSAGES/relativeTime.moQFileInfo(testAppDir + "/share/locale/en/LC_MESSAGES/relativeTime.mo").exists()/home/nick/Work/phablet/bugs/1378821.time/uitk.split.i18n/modulesAWAVAUATIUSHHIHHLD$DL$HHxpLILIzArLHIDL$H5LLAQLD$MAPIH([]A\A]A^A_ATUSL'A$uIIcD$ HIcD$LH,LH9t@HHH9u[L]A\t A,$t[]A\L'HuHDt („tHUSHH(HHHHGHHHH{ ugH{u.H{HH[]t/uH{f.t/uH{ HH{ H{H{HHHHH*C\esUSHH(HHHHGHHHH{ ugH{u.H{HHH[]t/uH{f.t/uH{ HH{ H{H{HHHHH*C\emATUSL'A$}IcD$ HIcD$LH,LH9u?[L]A\@t(„uH;H9tHHuf.t A,$t[]A\L'dHuHt („tHQQuickItem *defaultLC_ALLexitLoopQString("")i18n->domain()src/tst_i18n_RelativeTime.cppCsrc/RelativeTime.qmlrootpagetimeFarAwayddd d MMM' 'HH:mmtexttimeNowNowQString("Now")timeMinuteBefore1 minute agoQString("1 minute ago")timeMinuteAfter1 minuteQString("1 minute")tenMinutesBefore10 minutes agoQString("10 minutes ago")tenMinutesAfter10 minutesQString("10 minutes")/relativeTimeshare/localeexpectedLocalePathboundDomaingettextDomainlocale -alocaleA.waitForFinished()en_US.utf8 2languageChanged()tr:NowQString("tr:Now")tr:1 minute agoQString("tr:1 minute ago")tr:1 minuteQString("tr:1 minute")tr:10 minutes agoQString("tr:10 minutes ago")tr:10 minutesQString("tr:10 minutes")tr:FarAwayQString("tr:FarAway")button2Count the kittensQString("Count the kittens")all3AllQString("All")APP_DIRQDir(modules).exists()UHAWAVAULmATSIHLIH]HXdH%(HE1HELHHHPMDuHA?H}ELuLLHULHHRHHuH=HIH};HMdH3 %(LeHe[A\A]A^A_]Q/BH}*HHAHLLHEHUHcBJ ) :v{HrHHIHuIHcF HHcFHH H<I9t H)HA$tA,$HUHcBHHIHD/H}L%A$At^HD9LDHHu6fDE1vLVL$HEH5HILH AHH5L5h H}AXZt&t /t E<$/H}fHH0`1QII&LMHLLHHLHIIHLHLHg4J}$AWAVIAUATUSHHHcPH,HIIHcP L,HcPIHHI9HD$t3HHuHIL#HHI9uAu HL[]A\A]A^A_f.t A/tH[]A\A]A^A_H LHHH9\$tHkHtHHHHHI>M>HH1$#et }AUATAUSHHHҋ3C%9u HcҾHHHHEDcHcPHHH4A9L,IHHKI)LHH}D;gW K   H9S u H[]A\A]fDHHH9tt+t /„tH]H[]A\A]H}IcL,P@HcSHD9|I II`LHHH0HHC(HHH@H{HLLHCH@HC HHK.k  p   ] $ AWAVAUATIUSHHT$t$ Ht$ HcPHHЉHH$IIEHcPL4HcT$ IH,M$.M9tIHLfDHt HHHHI9uIEHcT$ HcHH,L$IHcH H,$L4IHcD$HM$M9t$L@Ht HHHHI9uAutIcG HIcGLH,LH9tfHHH9uLIUHcBHHHcT$ H[]A\HA]A^A_@tA/uvHHHCI9t.HHHHCI9tkHHHI}HcGH,HcD$ HH\H9tHHH9uI}M}HHHHI}M}HHMC;}ATUHSHHdH%(HD$1H8v:Ht HHHD$dH3%(u'H[]A\fHIHH$HHHh HLHH HH1(0@fn AWAVAUATIUSH(HT$t$Ht$HcPH,HIHD$HD$IHcPL<HcT$IH,M,/M9tRLL@HuHIL#HHI9uIHcT$HcHH,L,IHcH Hl$L$IHcD$HM|M9t3LHuHIL+HHI9uHD$uHcGH,HcD$HH\H9t$HL#MtLLH9uI>HD$ILHHI9tHkHtHHHHH"HI>HD$IHHHMB<}'}AUATIUSHHH8v@ILHHImH[]A\A]ILHHImH[]A\A]IHLHHh HIHHLHHh HH=2"/=Xes}HSHHHH[USHHHHHHu_H{u&HHH[]t/uH{f.t/uH{H H{HHH+DLATUISH0|$ H=Hl$dH%(HD$(1Ht$ HL1HHHt$ LHCHHHHHL$(dH3 %(u H0[]A\IHLHHH@Of'(.)MmgZgggghhhGhGhh*hhhGG"G 2G I #I I G L o? J I I tIIIJ?#@"g&@@#@@@NAAAAAAIkkjkkjIjjjjjjIjjijjiIiiiiihFFFh!>FF;EEEEEFFEDD D D D E  D!D!D!D!D!D!D!"D"C"C#C#C#C#D##C#C$C$C$C$C$C$ %C%B%B%B%B&B&B&A&A&O&O&O'-O'N(N(6N(I((I)*I)I)H)^I*I+I+H+G,(G,G,H,I,I,I-I-N-O-A-B-%.h/h/eh0h1#h2I2kI3G5h5F6h6)I8h8I9F9I:@:@;@<I="@>@>@>??@?@AABBBCDDEFFGGJIJNJIJNJNK&NKNKNLNLNLNL/NMgMfMaMfMgMNMIONOfPfPfPfPfP/NQfQfQfQfQfR/NRfRfSeSfSfS/NSeTeTeTeTeT(NUeUQNVeVdVdVdVeV(NWdWLNXdXdXdXdXdX$NYdYdYdYdYdY(NZ>dZc[c[c[d[$N[c\c\c\c\c\c\c\(N]c]c]b^b^b^c^c^(N^b_b_b_b_b_b_b_/N`a`a`a`aaaaaaaaNgghiijjjjk|F((z        UHAWAVAUATISIΉHHdH%(HE1Ex ut,mH}dH3<%(EiHe[A\A]A^A_]HIE L}HUp;r~:L&IE p~a1ELe6fIT^LLLLIE EHM;H}H@4)uIt^LѐI}LA}HtaI](HII9tYjH5jjj1jjE1jjjjHjjjjjjjjjjHĠLmAuHAH$HH5HHHH0HLH0LHLH HALLH0HHH5HH0HH(HLH(LH0LH HALLH(H0HH5HH0HH HLH LH0LH HALL(H H0(3HH5HH0HHHLHLH0LH HALL(HH0(LH5LLLLLH01H0H HH5A@ L0H5LH0HHH HHH0H0LH HALH0(HL(vL@H5LLLLLI1H MHH5@AL`H5LLLHLLPLLLLH HALLLAHLELH5LLpLLLLLLH HALLL0LL0LH5LHE1111L8LLH1LLHLLHILH HALLL8H8ALLE$LH5LHHILHLL8LLLLLLH HALLL0LH8L0jL@H5LHHIL <LL8LL0LLLLH HALLL0LH8L0LH5LHPHIL`H¨LL8LLpLLLLH HALLL0LH8L0HH5HH8LLLXLLLLLLH8LH HALLLLH8MII4I?I2I=LHHFLLLH8MIILLH8MLMIIIILLH8MLMIIIILLH8MLM[IIIIH8MLL#II(I.IUI1h01 K "G.[ar"J7"J7"M3"M3+"P7;"P7K"S_!{"S"W ! "[/9 "[/Q "^/j "^/ "a)      "a) "fH h z  "it "it "l7 "l7 "o !p- B "oV "sj "w "w "z/ "z/ "~ 4 N g     J     Jd"E",3A"asK_-Qt""uLk"""" "(F"&:Pm ":"5n  4Wy$4c0?WmBbz <e1`v6Pt5Me1 i!!)&!@i!!8! !!/Jo tst_i18n_RelativeTime.cpp_ZL40qt_meta_stringdata_tst_I18n_RelativeTime_ZN5QListI8QVariantE7deallocEPN9QListData4DataE.isra.20_ZN5QListI7QStringE7deallocEPN9QListData4DataE.isra.17_ZL34qt_meta_data_tst_I18n_RelativeTime.LC88.LC122.LC123.LC52.LC49.LC124.LC125.LC126.LC127.LC128.LC19.LC27.LC31.LC34.LC37.LC35.LC32.LC33.LC36.LC45.LC47.LC50.LC51.LC53.LC54.LC55.LC56.LC57.LC58.LC59.LC60.LC61.LC62.LC63.LC64.LC65.LC66.LC67.LC68.LC69.LC70.LC71.LC72.LC73.LC74.LC75.LC76.LC77.LC78.LC79.LC80.LC81.LC82.LC83.LC84.LC85.LC86.LC87.LC89.LC90.LC91.LC92.LC93.LC94.LC95.LC96.LC97.LC98.LC99.LC100.LC101.LC102.LC103.LC104.LC105.LC106.LC107.LC108.LC109.LC110.LC111.LC112.LC113.LC114.LC115.LC116.LC117.LC118.LC119.LC120_ZN7UCUnitsD5Ev_ZN21tst_I18n_RelativeTimeD5Ev_ZN10QByteArrayD5Ev_ZN7QStringC5EPKc_ZN7QStringD5Ev_ZN10UbuntuI18nD5Ev_ZN5QListI7QStringED5Ev_ZN5QListI8QVariantED5Ev_ZN5QListI8QVariantEC5ERKS1__ZN5QListIS_I8QVariantEED5Ev_ZN7QVectorIiED5Ev_ZN10QSignalSpyD5Ev_ZN5QListI10QByteArrayED5Ev_ZN5QListIP10QQuickItemED5Ev_ZN10QSignalSpyC5EPK7QObjectPKc_ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE8DestructEPv_ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE9ConstructEPvPKv_ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE6DeleteEPv_GLOBAL_OFFSET_TABLE__ZdlPv_ZN7UCUnitsD2Ev_ZTV7UCUnits_ZN7QObjectD2Ev_ZN7UCUnitsD1Ev_ZN21tst_I18n_RelativeTimeD2Ev_ZTV21tst_I18n_RelativeTime_ZN21tst_I18n_RelativeTimeD1Ev_ZN21tst_I18n_RelativeTimeD0Ev_ZNK21tst_I18n_RelativeTime10metaObjectEv_ZNK11QObjectData17dynamicMetaObjectEv_ZN21tst_I18n_RelativeTime16staticMetaObjectE_ZN21tst_I18n_RelativeTime11qt_metacastEPKcstrcmp_ZN7QObject11qt_metacastEPKc_ZN17QtMetaTypePrivate23QMetaTypeFunctionHelperIP10QQuickItemLb1EE6CreateEPKv_Znwm_ZN8QVariantD1Ev_ZN9QListData7disposeEPNS_4DataE_ZN10QArrayData10deallocateEPS_mm_ZN10QByteArrayD2Ev_ZN10QByteArrayD1Ev_ZN7QStringC2EPKcstrlen_ZN7QString16fromAscii_helperEPKci_ZN7QStringC1EPKc_ZN7QStringD2Ev_ZN7QStringD1Ev_ZN10UbuntuI18nD2EvDW.ref.__gxx_personality_v0_ZTV10UbuntuI18n_Unwind_Resume__gxx_personality_v0_ZN10UbuntuI18nD1Ev_ZplRK7QStringPKc_ZN7QString15fromUtf8_helperEPKci_ZN7QString6appendERKS___stack_chk_fail_ZN5QListI7QStringED2Ev_ZN5QListI7QStringED1Ev_ZN5QListI8QVariantED2Ev_ZN5QListI8QVariantED1Ev_ZN5QListI8QVariantEC2ERKS1__ZN9QListData6detachEi_ZN8QVariantC1ERKS___cxa_begin_catch__cxa_rethrow__cxa_end_catch_ZN5QListI8QVariantEC1ERKS1__ZN5QTest8qCompareI7QStringEEbRKT_S4_PKcS6_S6_i_ZN5QTest15toPrettyUnicodeEPKti_ZeqRK7QStringS1__ZN5QTest14compare_helperEbPKcPcS2_S1_S1_S1_i_ZN5QListIS_I8QVariantEED2Ev_ZN5QListIS_I8QVariantEED1Ev_ZN7QVectorIiED2Ev_ZN7QVectorIiED1Ev_ZN10QSignalSpyD2Ev_ZTV10QSignalSpy_ZTV14QTestEventLoop_ZN10QSignalSpyD1Ev_ZN10QSignalSpyD0Ev_ZN5QListI10QByteArrayED2Ev_ZN5QListI10QByteArrayED1Ev_ZN5QListIP10QQuickItemED2Ev_ZN5QListIP10QQuickItemED1Ev_ZN21tst_I18n_RelativeTime8testItemEP10QQuickItemRK7QString_ZNK7QString11toLocal8BitEv_ZNK7QObject8propertyEPKc_ZNK8QVariant8userTypeEv_ZN9QMetaType9typeFlagsEi_ZN10QQuickItem16staticMetaObjectE_ZNK11QMetaObject4castEP7QObject_ZN9QListData11shared_nullE_Z23qt_qFindChildren_helperPK7QObjectRK7QStringRK11QMetaObjectP5QListIPvE6QFlagsIN2Qt15FindChildOptionEE_ZZN11QMetaTypeIdIP10QQuickItemE14qt_metatype_idEvE11metatype_id_ZNK8QVariant7convertEiPvmemcpy_ZN11QMetaObject14normalizedTypeEPKc_ZN9QMetaType22registerNormalizedTypeERK10QByteArrayPFvPvEPFS3_PKvES5_PFS3_S3_S7_Ei6QFlagsINS_8TypeFlagEEPK11QMetaObject_ZNK8QVariant9constDataEv_ZN5QListI8QVariantE13detach_helperEi_ZN7QVectorIiE11reallocDataEii6QFlagsIN10QArrayData16AllocationOptionEE_ZN10QArrayData8allocateEmmm6QFlagsINS_16AllocationOptionEE_ZN10QArrayData11shared_nullEmemset_Z9qBadAllocv_ZN10QSignalSpyC2EPK7QObjectPKc_ZN7QObjectC2EPS__ZGVZN10QSignalSpyC4EPK7QObjectPKcE12memberOffset_ZNK14QMessageLogger7warningEPKcz__cxa_guard_acquire_ZN7QObject16staticMetaObjectE_ZNK11QMetaObject11methodCountEv_ZZN10QSignalSpyC4EPK7QObjectPKcE12memberOffset__cxa_guard_release_ZN11QMetaObject19normalizedSignatureEPKc_ZNK11QMetaObject13indexOfMethodEPKc_ZN11QMetaObject7connectEPK7QObjectiS2_iiPi_ZN11QMetaObject10ConnectionD1Ev_ZN10QByteArrayaSERKS__ZNK11QMetaObject6methodEi_ZNK11QMetaMethod14parameterCountEv_ZNK11QMetaMethod13parameterTypeEi_ZNK11QMetaMethod11methodIndexEv_ZN11QMetaObject8metacallEP7QObjectNS_4CallEiPPv_ZNK11QMetaMethod14parameterNamesEv__cxa_guard_abort_ZN10QSignalSpyC1EPK7QObjectPKc_ZN5QListIS_I8QVariantEE18detach_helper_growEii_ZN9QListData11detach_growEPii_ZN5QListIS_I8QVariantEE6appendERKS1__ZN9QListData6appendEv_ZN5QListI8QVariantE18detach_helper_growEii_ZN5QListI8QVariantE6appendERKS0__ZN7UCUnitsD0Ev_ZN10UbuntuI18nD0Evmainunsetenv_ZN15QGuiApplicationC1ERiPPci_ZN16QCoreApplication12setAttributeEN2Qt20ApplicationAttributeEb_ZN5QTest5qExecEP7QObjectiPPc_ZN15QGuiApplicationD1Ev_ZN10QSignalSpy11qt_metacallEN11QMetaObject4CallEiPPv_ZN7QObject11qt_metacallEN11QMetaObject4CallEiPPv_ZN8QVariantC1EiPKv_ZNK7QObject6threadEv_ZN7QThread13currentThreadEv_ZN11QMetaObject12invokeMethodEP7QObjectPKcN2Qt14ConnectionTypeE22QGenericReturnArgument16QGenericArgumentS7_S7_S7_S7_S7_S7_S7_S7_S7__ZN7QObject9killTimerEi_ZN10QEventLoop4exitEi_ZN9QListData7reallocEi_ZN21tst_I18n_RelativeTime21testCase_RelativeTimeEv_ZGVZN10UbuntuI18n8instanceEvE8instance_ZZN10UbuntuI18n8instanceEvE8instance_ZNK10UbuntuI18n6domainEv_ZN10UbuntuI18nC1EP7QObject__dso_handle__cxa_atexit_ZN10UbuntuI18n11setLanguageERK7QString_ZN4QUrl13fromLocalFileERK7QString_ZN10QQuickView9setSourceERK4QUrl_ZN4QUrlD1Ev_ZN16QCoreApplication13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE_ZNK10QQuickView10rootObjectEv_ZN5QTest7qVerifyEbPKcS1_S1_i_ZN5QTimeC1Eiiii_ZN5QDateC1Eiii_ZN9QDateTimeC1ERK5QDateRK5QTimeN2Qt8TimeSpecE_ZNK9QDateTime8toStringERK7QString_ZNK8QVariant8toStringEv_ZN9QDateTimeD1Ev_ZN9QDateTime15currentDateTimeEv_ZN10UbuntuI18n16relativeDateTimeERK9QDateTime_ZNK9QDateTime7addSecsEx_ZNK7QString6toUtf8Evbindtextdomain_ZN4QDir11currentPathEv_ZN4QDirC1ERK7QString_ZNK4QDir8filePathERK7QString_ZN4QDirD1Evtextdomain_ZN9QFileInfoC1ERK7QString_ZNK9QFileInfo6existsEv_ZN9QFileInfoD1Ev_ZN8QProcessC1EP7QObject_ZN8QProcess5startERK7QString6QFlagsIN9QIODevice12OpenModeFlagEE_ZN8QProcess15waitForFinishedEi_ZN9QIODevice7readAllEv_ZNK7QString5splitERKS_NS_13SplitBehaviorEN2Qt15CaseSensitivityE_ZN9QtPrivate20QStringList_containsEPK11QStringListRK7QStringN2Qt15CaseSensitivityE_ZN8QProcessD1Ev_ZN10QEventLoopC1EP7QObject_ZN7QObject10startTimerEiN2Qt9TimerTypeE_ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE_ZN10QEventLoopD1Ev_ZN21tst_I18n_RelativeTime18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPvsetenv_ZNK4QDir6existsEv_ZN10QQuickViewC1EP7QWindow_ZNK10QQuickView6engineEv_ZGVZN7UCUnits8instanceEvE8instance_ZZN7UCUnits8instanceEvE8instance_ZN7UCUnits2guEf_ZN7QWindow11setGeometryEiiii_ZNK10QQmlEngine14importPathListEv_ZNK4QDir12absolutePathEv_ZN10QQmlEngine17setImportPathListERK11QStringList_ZN9QListData7prependEv_ZN7UCUnitsC1EP7QObject_ZN21tst_I18n_RelativeTime11qt_metacallEN11QMetaObject4CallEiPPv_ZTI19QListSpecialMethodsI5QListI8QVariantEE_ZTVN10__cxxabiv117__class_type_infoE_ZTS19QListSpecialMethodsI5QListI8QVariantEE_ZTI5QListIS_I8QVariantEE_ZTVN10__cxxabiv120__si_class_type_infoE_ZTS5QListIS_I8QVariantEE_ZTI10QSignalSpy_ZTVN10__cxxabiv121__vmi_class_type_infoE_ZTS10QSignalSpy_ZTI7QObject_ZTS21tst_I18n_RelativeTime_ZTI21tst_I18n_RelativeTime_ZNK7QObject10metaObjectEv_ZN7QObject5eventEP6QEvent_ZN7QObject11eventFilterEPS_P6QEvent_ZN7QObject10timerEventEP11QTimerEvent_ZN7QObject10childEventEP11QChildEvent_ZN7QObject11customEventEP6QEvent_ZN7QObject13connectNotifyERK11QMetaMethod_ZN7QObject16disconnectNotifyERK11QMetaMethod -g4<"&(!w38C9d((x(y8#9D(W_fzm{t|(}-z{~ +%8DK ` hpJ(R^f;(($p6>tE LTdps }t :0040 ;  0% 0- 05 4L BT 0Y Cc Dp   0 0 0 0 4 ?  ]#'Q'   %!%(,$-( 3,(E(04SC,S8^9w(:004  l8@%AB&CDB'CD%42GHGVHbI@>Q'( O P+D(](fJM*J4t O P+D(](fJnM*J4|n(H' '5XKYa&~(XYZ[ \]&(S ^Z \r_@VS `fZ}a'bc   $  \dK(\ex:*&*4V4V4*4$@f%uAB&CD!B)'1C9DA4l@hb i (YjjkB(CD4/m6 ^C OQ ilms Pz noDpS qXr_ situv= sEwqxyz{{|}~0]oeTo( go-okyog:T(*/ PCOM[*dJlt4|<EE8>E'B>B>CDB>'(C2C:DB4GDOBX'aCiDq41AEgEo}:BCB>CD4D4=~%A%A*lB&CDB& '&C.9BO&WbCqDyB'CD4D4#0%>AYf%tABCD4BCD4  3,(E(M04[,APZ%gmn :4)k ^f&#1ix>:&>4 9 @{N-nGGHzI((p t 6-#--COW^g(z{-XY.&yXYZ[ \]&((z{!0?I-cX}Y&(XYZ[&]5&U(u(z{-#Z~YGGHz#+IS([&{((-XY&9(ZXsY{Z[]&((z {  , 1 .? G YY g zn u  F 0 & 0  . W 0 z {  $ ) .7 ? YQ _ zf m  F 0 & 0  . W 0 z {   ! ./ 7 YI W z^ e z F 0 & 0  . W 0 z {    .' / YA O zV ] r F 0 & 0  . W 0 z {    . ' Y9 G zN U j Fy 0 & 0  .   z   F 0 07<.Qoz%,DFS0_g0s0.zF0*6>0NV.ezF00 ."B^ezlsF00."z)0HFW0cow0.*0w 70 /.Ehp|0zF.zF0>M7ckrzy{.0 z{'=L.Zi.- z{"0>;J0V*b0n000000(+(c ^j \_@b5'TV `Za ^_U@b'Vc   $  \d(& `EZia,efuc|   $ d( ^_P@bVle: `Za'e27c> E R $Y ld(*&*04 0 &! 0- 9 0A 4p V V 0 4 0 & 0 4  0 0 !0!4)!03!0U!0]!4i!0u!0}!4!*!0!!!0!4!0"""0 "4C"0O"["c"0k"4"0"""0"4"0""0"#0 #40#0<#D#0L#4b#*m#&y#*#0#4#*#&#*#0#4#*#;$0$*$0&$02$>$0J$0V$0x$*$0$$V$V%%.'%/%06%A%V%q%%%%%.%%Y%%z& &&F%&01&&=&0X&g&.|&&Y&&z&&&F&0&&&0&Q'0'&+'06'Qk'u'0'0'0'0''.''Y((z%(,(:(FH(0T(&`(0{((.((Y((z(((F(0(& )0%)4).I)N)Yd)r)zy)))F)0)&)0)).))Y**z#***8*FF*0R*&^*0y**.*W*0*z*{****.*+Y!+/+z6+=+K+F]+0i+&q+0++.+W+0+z+{++++., ,Y&,-,z4,;,L,FW,0c,&k,0,,.,,,z,,,F,0,,0 --.*-H-c-{--z---F-0--0--.-.-.4.z;.B.S.Fa.0i.u.}.0.......z.. /F/0!/-/5/0P/X/.j////z///F/0///0 00.(0?0T0b0zi0p0~0F000000000&000000 10#10+1:1E10f10n1}11010111010120E20M2X20e20q2&y2020202&2020202&20303&*30A30M3&Y30303&303*3034303034444$4V54Vg4s40{44404&40444044404&405450&54250=5&I50Q54m50u54505&5054(# (Q0R8@HPX`h! (08@HPX`hqgg5 4H \ p  pDp2!"H$\&p(y),$.`0t2}3568:$=->`@iACDF%GXIaJLMOP0R9SUWXYZ\ Z"@^IZM`Z +@ +L +X +d+x+ $+ + + ++7+ + ++ F+ +( +4+P +\ +hW+xf+g++++++ + +`+s+++ +(+0+8+@+H+P+X+`O+h+p+x+n+2 I @ 1& , 1   F   @@:S w r@X0=4 @ @0@T ` @HC= L  .@0G * 7%@0JD j 3e@H0M$07@xPhp@S)$@J@E@8Wb6@/@[pp/@^M)H@(Pap02 @xxf(YtT@0i|4@7@ lx@8 ou!$LG@X8sf!@0wp p/ @z2 2fA     @~ #k! j$[ p$EV @h %4 % % @H i '( ' ' @hp /OO / /u @@ X2P 2E 2@ @Pq 34 3 3 @hp6PY66@8 7@78  @ H% 8M 8H@ g88@ 89\B`B@8DDPD5{@(Jzz5z `zz@[0 z) Pz@0[H'pzIz@V`|8 Q@x[`t| ||@[H}p@@ \8}p@@X]85~0 0@^`B0~o0~0~0~8~@^0@~& f~!h~@_2- x8./tests/unit/tst_i18n/tst_i18n_LocalizedApp/0000755000015600001650000000000012700370701020764 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_LocalizedApp/localizedApp/0000755000015600001650000000000012700370701023373 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_LocalizedApp/localizedApp/.click/0000755000015600001650000000000012700370701024536 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_LocalizedApp/localizedApp/.click/status0000644000015600001650000000002612700370701026002 0ustar jenkinsjenkinsPackage: localizedApp ./tests/unit/tst_i18n/tst_i18n_LocalizedApp/localizedApp/share/0000755000015600001650000000000012700370701024475 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_LocalizedApp/localizedApp/share/locale/0000755000015600001650000000000012700370701025734 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_LocalizedApp/localizedApp/share/locale/en/0000755000015600001650000000000012700370701026336 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_LocalizedApp/localizedApp/share/locale/en/LC_MESSAGES/0000755000015600001650000000000012700370701030123 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_LocalizedApp/src/0000755000015600001650000000000012700370701021553 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_LocalizedApp/src/LocalizedApp.qml0000644000015600001650000000716612700370701024647 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 MainView { width: units.gu(48) height: units.gu(60) applicationName: 'localizedApp' Page { objectName: 'page' title: i18n.dtr('localizedApp', "Welcome") Button { id: button objectName: 'button' anchors.horizontalCenter: parent.horizontalCenter text: i18n.tr('Count the kilometres') width: units.gu(15) } Button { id: button2 objectName: 'button2' anchors.top: button.bottom text: i18n.tag('Count the kittens') width: units.gu(15) } Label { id: all1 objectName: 'all1' anchors.top: button2.bottom anchors.horizontalCenter: button.horizontalCenter text: i18n.ctr('All Contacts', 'All') } Label { id: all2 objectName: 'all2' anchors.top: all1.bottom anchors.horizontalCenter: all1.horizontalCenter text: i18n.ctr('All Calls', 'All') } Label { id: all3 objectName: 'all3' anchors.top: all2.bottom anchors.horizontalCenter: all2.horizontalCenter text: i18n.tag('All Cats', 'All') } Label { id: timeNow objectName: 'timeNow' anchors.top: all3.bottom anchors.horizontalCenter: all3.horizontalCenter text: i18n.relativeDateTime(new Date()) } Label { id: timeMinuteBefore objectName: 'timeMinuteBefore' anchors.top: timeNow.bottom anchors.horizontalCenter: timeNow.horizontalCenter text: i18n.relativeDateTime(new Date(new Date().getTime() - 60000)) } Label { id: timeMinuteAfter objectName: 'timeMinuteAfter' anchors.top: timeMinuteBefore.bottom anchors.horizontalCenter: timeMinuteBefore.horizontalCenter text: i18n.relativeDateTime(new Date(new Date().getTime() + 60000)) } Label { id: tenMinutesBefore objectName: 'tenMinutesBefore' anchors.top: timeMinuteAfter.bottom anchors.horizontalCenter: timeMinuteAfter.horizontalCenter text: i18n.relativeDateTime(new Date(new Date().getTime() - 600000)) } Label { id: tenMinutesAfter objectName: 'tenMinutesAfter' anchors.top: tenMinutesBefore.bottom anchors.horizontalCenter: tenMinutesBefore.horizontalCenter text: i18n.relativeDateTime(new Date(new Date().getTime() + 600000)) } Label { id: timeFarAway objectName: 'timeFarAway' anchors.top: tenMinutesAfter.bottom anchors.horizontalCenter: tenMinutesAfter.horizontalCenter text: i18n.relativeDateTime(new Date(2000, 0, 1, 0, 0, 0, 0)) } } } ./tests/unit/tst_i18n/tst_i18n_LocalizedApp/src/tst_i18n_LocalizedApp.cpp0000644000015600001650000002010112700370701026351 0ustar jenkinsjenkins/* * Copyright 2012-2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace C { #include } #include "ucunits.h" #include "i18n.h" #include "plugin.h" class tst_I18n_LocalizedApp : public QObject { Q_OBJECT private: QQuickView *view; public: tst_I18n_LocalizedApp() : view(0) { } QQuickItem *loadTest(const QString &document) { // load the document view->setSource(QUrl::fromLocalFile(document)); QTest::waitForEvents(); return view->rootObject(); } QQuickItem *testItem(QQuickItem *that, const QString &identifier) { if (that->property(identifier.toLocal8Bit()).isValid()) return that->property(identifier.toLocal8Bit()).value(); QList children = that->findChildren(identifier); return (children.count() > 0) ? children[0] : 0; } private Q_SLOTS: void initTestCase() { // Set test locale folder in the environment // Using setenv because QProcessEnvironment ignores changes QString testAppDir(QDir::currentPath() + "/localizedApp"); setenv("APP_DIR", testAppDir.toUtf8(), 1); // Verify that we set it correctly QVERIFY(QFileInfo(testAppDir + "/share/locale/en/LC_MESSAGES/localizedApp.mo").exists()); QString modules(UBUNTU_QML_IMPORT_PATH); QVERIFY(QDir(modules).exists()); view = new QQuickView; QQmlEngine *quickEngine = view->engine(); UbuntuComponentsPlugin::initializeContextProperties(quickEngine); view->setGeometry(0,0, UCUnits::instance()->gu(40), UCUnits::instance()->gu(30)); //add modules folder so we have access to the plugin from QML QStringList imports = quickEngine->importPathList(); imports.prepend(QDir(modules).absolutePath()); quickEngine->setImportPathList(imports); } void cleanupTestCase() { delete view; } void testCase_LocalizedApp() { QQmlEngine engine; UbuntuComponentsPlugin::initializeContextProperties(&engine); UbuntuI18n* i18n = UbuntuI18n::instance(); // By default no domain is set QCOMPARE(i18n->domain(), QString("")); // Start out with no localization i18n->setLanguage("C"); // Load the app which should pick up the locale we prepared QQuickItem *root = loadTest("src/LocalizedApp.qml"); QVERIFY(root); QQuickItem *mainView = root; // Sanity checks to avoid confusion QString applicationName(mainView->property("applicationName").toString()); QCOMPARE(applicationName, QString("localizedApp")); QCOMPARE(applicationName, QCoreApplication::applicationName()); QCOMPARE(applicationName, i18n->domain()); // There no translation happens QQuickItem* page(testItem(mainView, "page")); QVERIFY(page); QCOMPARE(page->property("title").toString(), QString("Welcome")); QQuickItem* button(testItem(page, "button")); QVERIFY(button); QCOMPARE(button->property("text").toString(), QString("Count the kilometres")); QQuickItem* all1(testItem(page, "all1")); QVERIFY(all1); QCOMPARE(all1->property("text").toString(), QString("All")); QQuickItem* all2(testItem(page, "all2")); QVERIFY(all2); QCOMPARE(all2->property("text").toString(), QString("All")); // There no translation happens in C++ either QCOMPARE(i18n->dtr(i18n->domain(), QString("Welcome")), QString("Welcome")); QCOMPARE(i18n->tr(QString("Count the kilometres")), QString("Count the kilometres")); QCOMPARE(i18n->ctr(QString("All Contacts"), QString("All")), QString("All")); QCOMPARE(i18n->ctr(QString("All Calls"), QString("All")), QString("All")); // Was the locale folder detected and set? QString boundDomain(C::bindtextdomain(i18n->domain().toUtf8(), ((const char*)0))); QString testAppDir(QDir::currentPath() + "/localizedApp"); QString expectedLocalePath(QDir(testAppDir).filePath("share/locale")); QCOMPARE(boundDomain, expectedLocalePath); // Is the domain gettext uses correct? QString gettextDomain(C::textdomain(((const char*)0))); QCOMPARE(gettextDomain, i18n->domain()); // Is the compiled en_US message catalog in the right location? QString messageCatalog(boundDomain + "/en/LC_MESSAGES/localizedApp.mo"); QVERIFY(QFileInfo(messageCatalog).exists()); /* For manual testing one can do something like env LANGUAGE=en_US TEXTDOMAINDIR=./tests/unit/tst_i18n/locale/ gettext localizedApp 'Welcome' */ // Check if system has en_US locale, otherwise gettext won't work QProcess localeA; localeA.start("locale -a"); QVERIFY(localeA.waitForFinished()); QVERIFY(QString(localeA.readAll()).split("\n").contains("en_US.utf8")); i18n->setLanguage("en_US.utf8"); QSignalSpy spy(i18n, SIGNAL(languageChanged())); spy.wait(); // Inspect translated strings in QML QCOMPARE(page->property("title").toString(), QString("Greets")); QCOMPARE(button->property("text").toString(), QString("Count the clicks")); QCOMPARE(all1->property("text").toString(), QString("Todos")); QCOMPARE(all2->property("text").toString(), QString("Todas")); // Only tagged, not actually translated QQuickItem* button2(testItem(page, "button2")); QVERIFY(button2); QCOMPARE(button2->property("text").toString(), QString("Count the kittens")); QQuickItem* all3(testItem(page, "all3")); QVERIFY(all3); QCOMPARE(all3->property("text").toString(), QString("All")); // Translate in C++ QCOMPARE(i18n->dtr(i18n->domain(), QString("Welcome")), QString("Greets")); QCOMPARE(i18n->tr(QString("Count the kilometres")), QString("Count the clicks")); QCOMPARE(i18n->ctr(QString("All Contacts"), QString("All")), QString("Todos")); QCOMPARE(i18n->ctr(QString("All Calls"), QString("All")), QString("Todas")); // Only tagged, not actually translated QCOMPARE(i18n->tag(QString("All kittens")), QString("All kittens")); QCOMPARE(i18n->tag(QString("All Cats"), QString("All")), QString("All")); // Sanity-check that the test strings would otherwise work and not no-op by accident QCOMPARE(i18n->tr(QString("Count the kittens")), QString("Contar los gatitos")); QCOMPARE(i18n->ctr(QString("All Cats"), QString("All")), QString("Cada")); } }; // The C++ equivalent of QTEST_MAIN(tst_I18n_LocalizedApp) with added initialization int main(int argc, char *argv[]) { // LC_ALL would fail the test case; it must be unset before execution unsetenv("LC_ALL"); QGuiApplication app(argc, argv); app.setAttribute(Qt::AA_Use96Dpi, true); tst_I18n_LocalizedApp* testObject = new tst_I18n_LocalizedApp(); return QTest::qExec(static_cast(testObject), argc, argv); } #include "tst_i18n_LocalizedApp.moc" ./tests/unit/tst_i18n/tst_i18n_LocalizedApp/po/0000755000015600001650000000000012700370701021402 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_LocalizedApp/po/en_US.po0000644000015600001650000000111712700370701022753 0ustar jenkinsjenkinsmsgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" "Last-Translator: Christian Dywan \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" msgid "Welcome" msgstr "Greets" msgid "Count the kilometres" msgstr "Count the clicks" msgid "Count the kittens" msgstr "Contar los gatitos" msgctxt "All Contacts" msgid "All" msgstr "Todos" msgctxt "All Calls" msgid "All" msgstr "Todas" msgctxt "All Cats" msgid "All" msgstr "Cada" ./tests/unit/tst_i18n/tst_i18n_LocalizedApp/tst_i18n_LocalizedApp.pro0000644000015600001650000000064512700370701025613 0ustar jenkinsjenkinsinclude(../../test-include.pri) QT += gui DEFINES += SRCDIR=\\\"$$PWD/\\\" DOMAIN = localizedApp mo.target = mo mo.commands = set -e; mo.commands += echo Generating localization; mo.commands += msgfmt $$PWD/po/en_US.po -o $$PWD/$${DOMAIN}/share/locale/en/LC_MESSAGES/$${DOMAIN}.mo; QMAKE_EXTRA_TARGETS += mo PRE_TARGETDEPS += mo SOURCES += \ src/tst_i18n_LocalizedApp.cpp OTHER_FILES += \ src/LocalizedApp.qml ./tests/unit/tst_i18n/diversion/0000755000015600001650000000000012700370701016666 5ustar jenkinsjenkins./tests/unit/tst_i18n/diversion/locale/0000755000015600001650000000000012700370701020125 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_RelativeTime/0000755000015600001650000000000012700370701021007 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_RelativeTime/src/0000755000015600001650000000000012700370701021576 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_RelativeTime/src/tst_i18n_RelativeTime.cpp0000644000015600001650000002046412700370701026433 0ustar jenkinsjenkins /* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Nick Dedekind */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace C { #include } #include "ucunits.h" #include "i18n.h" #include "plugin.h" class tst_I18n_RelativeTime : public QObject { Q_OBJECT private: QQuickView *view; public: tst_I18n_RelativeTime() : view(0) { } QQuickItem *loadTest(const QString &document) { // load the document view->setSource(QUrl::fromLocalFile(document)); QTest::waitForEvents(); return view->rootObject(); } QQuickItem *testItem(QQuickItem *that, const QString &identifier) { if (that->property(identifier.toLocal8Bit()).isValid()) return that->property(identifier.toLocal8Bit()).value(); QList children = that->findChildren(identifier); return (children.count() > 0) ? children[0] : 0; } private Q_SLOTS: void initTestCase() { // Set test locale folder in the environment // Using setenv because QProcessEnvironment ignores changes QString testAppDir(QDir::currentPath() + "/ubuntu-ui-toolkit"); setenv("APP_DIR", testAppDir.toUtf8(), 1); // Verify that we set it correctly QVERIFY(QFileInfo(testAppDir + "/share/locale/en/LC_MESSAGES/ubuntu-ui-toolkit.mo").exists()); QString modules(UBUNTU_QML_IMPORT_PATH); QVERIFY(QDir(modules).exists()); view = new QQuickView; QQmlEngine *quickEngine = view->engine(); UbuntuComponentsPlugin::initializeContextProperties(quickEngine); view->setGeometry(0,0, UCUnits::instance()->gu(40), UCUnits::instance()->gu(30)); //add modules folder so we have access to the plugin from QML QStringList imports = quickEngine->importPathList(); imports.prepend(QDir(modules).absolutePath()); quickEngine->setImportPathList(imports); } void cleanupTestCase() { delete view; } void testCase_RelativeTime() { QQmlEngine engine; UbuntuComponentsPlugin::initializeContextProperties(&engine); UbuntuI18n* i18n = UbuntuI18n::instance(); // By default no domain is set QCOMPARE(i18n->domain(), QString("")); // Start out with no localization i18n->setLanguage("C"); // Load the app which should pick up the locale we prepared QQuickItem *root = loadTest("src/RelativeTime.qml"); QVERIFY(root); QQuickItem *mainView = root; // There no translation happens QQuickItem* page(testItem(mainView, "page")); QVERIFY(page); QQuickItem* timeFarAway(testItem(page, "timeFarAway")); QVERIFY(timeFarAway); QCOMPARE(timeFarAway->property("text").toString(), QDateTime(QDate(2000,1,1), QTime(0,0,0,0)).toString("ddd d MMM'\u2003'HH:mm")); QQuickItem* timeNow(testItem(page, "timeNow")); QVERIFY(timeNow); QCOMPARE(timeNow->property("text").toString(), QString("Now")); QQuickItem* timeMinuteBefore(testItem(page, "timeMinuteBefore")); QVERIFY(timeMinuteBefore); QCOMPARE(timeMinuteBefore->property("text").toString(), QString("1 minute ago")); QQuickItem* timeMinuteAfter(testItem(page, "timeMinuteAfter")); QVERIFY(timeMinuteAfter); QCOMPARE(timeMinuteAfter->property("text").toString(), QString("1 minute")); QQuickItem* tenMinutesBefore(testItem(page, "tenMinutesBefore")); QVERIFY(tenMinutesBefore); QCOMPARE(tenMinutesBefore->property("text").toString(), QString("10 minutes ago")); QQuickItem* tenMinutesAfter(testItem(page, "tenMinutesAfter")); QVERIFY(tenMinutesAfter); QCOMPARE(tenMinutesAfter->property("text").toString(), QString("10 minutes")); // There no translation happens in C++ either QCOMPARE(i18n->relativeDateTime(QDateTime::currentDateTime()), QString("Now")); QCOMPARE(i18n->relativeDateTime(QDateTime(QDate(2000,1,1), QTime(0,0,0,0))), QDateTime(QDate(2000,1,1), QTime(0,0,0,0)).toString("ddd d MMM'\u2003'HH:mm")); QCOMPARE(i18n->relativeDateTime(QDateTime::currentDateTime().addSecs(-60)), QString("1 minute ago")); QCOMPARE(i18n->relativeDateTime(QDateTime::currentDateTime().addSecs(60)), QString("1 minute")); QCOMPARE(i18n->relativeDateTime(QDateTime::currentDateTime().addSecs(-600)), QString("10 minutes ago")); QCOMPARE(i18n->relativeDateTime(QDateTime::currentDateTime().addSecs(600)), QString("10 minutes")); // Was the locale folder detected and set? QString boundDomain(C::bindtextdomain(i18n->domain().toUtf8(), ((const char*)0))); QString testAppDir(QDir::currentPath() + "/ubuntu-ui-toolkit"); QString expectedLocalePath(QDir(testAppDir).filePath("share/locale")); QCOMPARE(boundDomain, expectedLocalePath); // Is the domain gettext uses correct? QString gettextDomain(C::textdomain(((const char*)0))); QCOMPARE(gettextDomain, i18n->domain()); // Is the compiled en_US message catalog in the right location? QString messageCatalog(boundDomain + "/en/LC_MESSAGES/ubuntu-ui-toolkit.mo"); QVERIFY(QFileInfo(messageCatalog).exists()); // Check if system has en_US locale, otherwise gettext won't work QProcess localeA; localeA.start("locale -a"); QVERIFY(localeA.waitForFinished()); QVERIFY(QString(localeA.readAll()).split("\n").contains("en_US.utf8")); i18n->setLanguage("en_US.utf8"); QSignalSpy spy(i18n, SIGNAL(languageChanged())); spy.wait(); // Inspect translated strings in QML QCOMPARE(timeNow->property("text").toString(), QString("tr:Now")); QCOMPARE(timeMinuteBefore->property("text").toString(), QString("tr:1 minute ago")); QCOMPARE(timeMinuteAfter->property("text").toString(), QString("tr:1 minute")); QCOMPARE(tenMinutesBefore->property("text").toString(), QString("tr:10 minutes ago")); QCOMPARE(tenMinutesAfter->property("text").toString(), QString("tr:10 minutes")); QCOMPARE(timeFarAway->property("text").toString(), QString("tr:FarAway")); // Translate in C++ QCOMPARE(i18n->relativeDateTime(QDateTime::currentDateTime()), QString("tr:Now")); QCOMPARE(i18n->relativeDateTime(QDateTime(QDate(2000,1,1), QTime(0,0,0,0))), QString("tr:FarAway")); QCOMPARE(i18n->relativeDateTime(QDateTime::currentDateTime().addSecs(-60)), QString("tr:1 minute ago")); QCOMPARE(i18n->relativeDateTime(QDateTime::currentDateTime().addSecs(60)), QString("tr:1 minute")); QCOMPARE(i18n->relativeDateTime(QDateTime::currentDateTime().addSecs(-600)), QString("tr:10 minutes ago")); QCOMPARE(i18n->relativeDateTime(QDateTime::currentDateTime().addSecs(600)), QString("tr:10 minutes")); } }; // The C++ equivalent of QTEST_MAIN(tst_I18n_RelativeTime) with added initialization int main(int argc, char *argv[]) { // LC_ALL would fail the test case; it must be unset before execution unsetenv("LC_ALL"); QGuiApplication app(argc, argv); app.setAttribute(Qt::AA_Use96Dpi, true); tst_I18n_RelativeTime* testObject = new tst_I18n_RelativeTime(); return QTest::qExec(static_cast(testObject), argc, argv); } #include "tst_i18n_RelativeTime.moc" ./tests/unit/tst_i18n/tst_i18n_RelativeTime/src/RelativeTime.qml0000644000015600001650000000477212700370701024715 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 MainView { width: units.gu(48) height: units.gu(60) applicationName: "ubuntu-ui-toolkit" Page { objectName: 'page' Label { id: timeNow objectName: 'timeNow' anchors.top: parent.top anchors.horizontalCenter: parent.horizontalCenter text: i18n.relativeDateTime(new Date()) } Label { id: timeMinuteBefore objectName: 'timeMinuteBefore' anchors.top: timeNow.bottom anchors.horizontalCenter: timeNow.horizontalCenter text: i18n.relativeDateTime(new Date(new Date().getTime() - 60000)) } Label { id: timeMinuteAfter objectName: 'timeMinuteAfter' anchors.top: timeMinuteBefore.bottom anchors.horizontalCenter: timeMinuteBefore.horizontalCenter text: i18n.relativeDateTime(new Date(new Date().getTime() + 60000)) } Label { id: tenMinutesBefore objectName: 'tenMinutesBefore' anchors.top: timeMinuteAfter.bottom anchors.horizontalCenter: timeMinuteAfter.horizontalCenter text: i18n.relativeDateTime(new Date(new Date().getTime() - 600000)) } Label { id: tenMinutesAfter objectName: 'tenMinutesAfter' anchors.top: tenMinutesBefore.bottom anchors.horizontalCenter: tenMinutesBefore.horizontalCenter text: i18n.relativeDateTime(new Date(new Date().getTime() + 600000)) } Label { id: timeFarAway objectName: 'timeFarAway' anchors.top: tenMinutesAfter.bottom anchors.horizontalCenter: tenMinutesAfter.horizontalCenter text: i18n.relativeDateTime(new Date(2000, 0, 1, 0, 0, 0, 0)) } } } ./tests/unit/tst_i18n/tst_i18n_RelativeTime/po/0000755000015600001650000000000012700370701021425 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_RelativeTime/po/en_US.po0000644000015600001650000000205712700370701023002 0ustar jenkinsjenkinsmsgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" "Last-Translator: Christian Dywan \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" msgid "Now" msgstr "tr:Now" msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "tr:%1 minute ago" msgstr[1] "tr:%1 minutes ago" msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "tr:%1 minute" msgstr[1] "tr:%1 minutes" msgid "h:mm ap" msgstr "'tr:'h:mm ap" msgid "HH:mm" msgstr "'tr:'HH:mm" msgid "'Yesterday 'h:mm ap" msgstr "'tr:Yesterday 'h:mm ap" msgid "'Yesterday 'HH:mm" msgstr "'tr:Yesterday 'HH:mm" msgid "'Tomorrow 'h:mm ap" msgstr "'tr:Tomorrow 'h:mm ap" msgid "'Tomorrow 'HH:mm" msgstr "'tr:Tomorrow 'HH:mm" msgid "ddd' 'h:mm ap" msgstr "'tr:'ddd' 'h:mm ap" msgid "ddd' 'HH:mm" msgstr "'tr:'ddd' 'HH:mm" msgid "ddd d MMM' 'h:mm ap" msgstr "'tr:FarAway'" msgid "ddd d MMM' 'HH:mm" msgstr "'tr:FarAway'" ./tests/unit/tst_i18n/tst_i18n_RelativeTime/ubuntu-ui-toolkit/0000755000015600001650000000000012700370701024427 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_RelativeTime/ubuntu-ui-toolkit/share/0000755000015600001650000000000012700370701025531 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_RelativeTime/ubuntu-ui-toolkit/share/locale/0000755000015600001650000000000012700370701026770 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_RelativeTime/ubuntu-ui-toolkit/share/locale/en/0000755000015600001650000000000012700370701027372 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_RelativeTime/ubuntu-ui-toolkit/share/locale/en/LC_MESSAGES/0000755000015600001650000000000012700370701031157 5ustar jenkinsjenkins./tests/unit/tst_i18n/tst_i18n_RelativeTime/tst_i18n_RelativeTime.pro0000644000015600001650000000065612700370701025663 0ustar jenkinsjenkinsinclude(../../test-include.pri) QT += gui DEFINES += SRCDIR=\\\"$$PWD/\\\" DOMAIN = ubuntu-ui-toolkit mo.target = mo mo.commands = set -e; mo.commands += echo Generating localization; mo.commands += msgfmt $${PWD}/po/en_US.po -o $${PWD}/$${DOMAIN}/share/locale/en/LC_MESSAGES/$${DOMAIN}.mo; QMAKE_EXTRA_TARGETS += mo PRE_TARGETDEPS += mo SOURCES += \ src/tst_i18n_RelativeTime.cpp OTHER_FILES += \ src/RelativeTime.qml ./tests/unit/testparser/0000755000015600001650000000000012700370701015407 5ustar jenkinsjenkins./tests/unit/testparser/main.cpp0000644000015600001650000001523212700370701017042 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Juhapekka Piiroinen */ #include #include #include #include #include #include #include QStringList _testReports; int _testcaseCounter; int _testcasePassed; int _testcaseFailed; int _testcaseSkipped; int _testcaseXPass; int _testcaseXFail; void printResults() { int failedTests = 0; int passTests = 0; QStringList failedTestNames; foreach (QString fileName, _testReports) { QString testXmlData = ""; QString testName = QFileInfo(fileName).fileName();; QFile testXml(fileName); qDebug() << "\nResults @" << fileName.toLatin1().constData(); qDebug(); int testcaseCounter = 0; int testcaseSkipped = 0; int testcasePassed = 0; int testcaseFailed = 0; int testcaseXFail = 0; int testcaseXPass = 0; if (testXml.open(QIODevice::ReadOnly)) { testXmlData = testXml.readAll(); testXml.close(); } else { qWarning() << "Unable to open" << fileName << "for reading. Skipped."; continue; } if (testXmlData.trimmed().length()==0) { QFile::remove(fileName); qWarning() << "The file was empty, removing it."; continue; } QDomDocument xmlDocument; QString errorMsg; int errorLine; if (!xmlDocument.setContent(testXmlData,&errorMsg,&errorLine)) { qDebug() << "\n"; qWarning() << "\t" << "\033[0;41m error \033[0;0m" << errorMsg.toLatin1().constData() << " @ line:" << errorLine; continue; } QDomNodeList xmlTestCases = xmlDocument.elementsByTagName("testcase"); for (int idx = 0; idx < xmlTestCases.length(); idx++) { testcaseCounter++; QDomNode xmlTestCase = xmlTestCases.at(idx); QDomNamedNodeMap attributes = xmlTestCase.attributes(); QDomNode nameNode = attributes.namedItem("name"); if (nameNode.isNull()) { qWarning() << "Could not find name node"; continue; } QDomNode resultNode = attributes.namedItem("result"); QString result; if (resultNode.isNull()) { result = "SKIP"; testcaseSkipped++; } else { result = resultNode.nodeValue().toLatin1().constData(); if (result=="pass") { testcasePassed++; } else if (result=="fail") { testcaseFailed++; } else if (result=="xpass") { testcaseXPass++; } else if (result=="xfail") { testcaseXFail++; } } qDebug() << "\t" << (result=="pass" ? "\033[0;32m[PASS]\033[0;0m" : (result=="SKIP") ? "\033[0;33m[SKIP]\033[0;0m" : (result=="xpass") ? "\033[2;32m[XPASS]\033[0;0m" : (result=="xfail") ? "\033[2;31m[XFAIL]\033[0;0m" : "\033[0;31m[FAILED]\033[0;0m") << nameNode.nodeValue().toLatin1().constData(); } _testcaseCounter += testcaseCounter; _testcasePassed += testcasePassed; _testcaseFailed += testcaseFailed; _testcaseSkipped += testcaseSkipped; _testcaseXFail += testcaseXFail; _testcaseXPass += testcaseXPass; qDebug(); qDebug() << "\t" << "Total" << testcaseCounter << " - \033[0;32m[PASS]\033[0;0m" << testcasePassed << "\033[2;31m[XFAIL]\033[0;0m" << testcaseXFail << "\033[2;32m[XPASS]\033[0;0m" << testcaseXPass << "\033[0;31m[FAILED]\033[0;0m" << testcaseFailed << "\033[0;33m[SKIP]\033[0;0m" << testcaseSkipped << "\n"; if (testcaseFailed>0) { // FAILED failedTests++; failedTestNames << testName.toLatin1().constData(); qDebug() << "\033[0;41m FAILED \033[0;0m" << testName.toLatin1().constData(); } else { passTests++; qDebug() << "\033[0;42m PASSED \033[0;0m" << testName.toLatin1().constData(); } qDebug() << "-------------------------------------------------------"; } qDebug() << "\n\n"; qDebug() << "TEST SUITES\t" << QString("%0").arg(passTests+failedTests).toLatin1().constData(); qDebug() << "\033[0;42m PASSED \033[0;0m" << "\t" << passTests; qDebug() << "\033[0;41m FAILED \033[0;0m" << "\t" << failedTests; qDebug() << "\n"; qDebug() << "TEST CASES\t" << QString("%0").arg(_testcaseCounter).toLatin1().constData(); qDebug() << "\033[0;32m[PASS]\033[0;0m\t\t" << _testcasePassed; qDebug() << "\033[2;31m[XFAIL]\033[0;0m\t\t" << _testcaseXFail; qDebug() << "\033[2;32m[XPASS]\033[0;0m\t\t" << _testcaseXPass; qDebug() << "\033[0;31m[FAILED]\033[0;0m\t" << _testcaseFailed; qDebug() << "\033[0;33m[SKIP]\033[0;0m\t\t" << _testcaseSkipped; qDebug() << "\n"; if (failedTests>0) { qDebug() << "\tFailed tests:"; foreach (QString failedTest, failedTestNames) { qDebug() << "\t" << failedTest.toLatin1().constData(); } qDebug() << "\n"; } } void findTestResults(QString path) { QDir dir(path); QFileInfoList files = dir.entryInfoList(); foreach (const QFileInfo &file, files) { if (file.fileName()=="." || file.fileName()=="..") continue; if (file.isDir()) continue; if (file.completeSuffix()=="xml") { _testReports << file.absoluteFilePath(); } } } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString searchPath = "."; int returnValue = 0; if (a.arguments().count()==2) { QString arg = a.arguments().takeAt(1).trimmed(); searchPath = arg; } if (!QFileInfo(searchPath).exists()) { qWarning() << "\n\nInvalid argument, file or folder does not exist:\n" << searchPath << "\n\n"; return -1; } if (QFileInfo(searchPath).isDir()) { findTestResults(searchPath); } else { _testReports << searchPath; } printResults(); return returnValue; } ./tests/unit/testparser/testparser.pro0000644000015600001650000000021412700370701020322 0ustar jenkinsjenkinsQT += core xml QT -= gui TARGET = testparser CONFIG += console CONFIG -= app_bundle TEMPLATE = app SOURCES += main.cpp ./tests/unit/runtest.sh0000755000015600001650000000611712700370714015267 0ustar jenkinsjenkins#!/bin/bash # # Copyright 2012 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # # Author: Juhapekka Piiroinen ################################################################################ . `dirname $0`/../../build_paths.inc _CMD="" _TARGETPATH=$1 _TESTFILEPATH=$2 _MINIMAL=$3 _TARGET=$(basename $1) _TESTFILE=$(basename $2) _LIB_PATH="${BUILD_DIR}/lib:${BUILD_DIR}/qml/Ubuntu/Components:${BUILD_DIR}/qml/Ubuntu/Test:$LD_LIBRARY_PATH" _IMPORT_PATH="${BUILD_DIR}/qml:$QML2_IMPORT_PATH" _THEMES_PATH="${BUILD_DIR}/qml" _XML="${BUILD_DIR}/tests/test_$_TARGET_$_TESTFILE.xml" _ARGS="-p -o -p $_XML,xunitxml -p -o -p -,txt" set +e function create_test_cmd { if [[ "$_TARGETPATH" = /* ]]; then EXE=$_TARGETPATH else EXE=./$_TARGETPATH fi _CMD="-n $_TESTFILE -m 300" DEB_HOST_ARCH=$(dpkg-architecture -qDEB_HOST_ARCH) if [[ ${DEB_HOST_ARCH} =~ 'arm' ]]; then _CMD="dbus-test-runner --task $EXE $_CMD" else _CMD="dbus-test-runner --task gdb -p --quiet $_CMD" _CMD="$_CMD -p --batch -p -ex -p 'set print thread-events off' -p -ex -p run -p -ex -p bt -p --return-child-result -p --args -p $EXE" fi if [ "$_MINIMAL" = "minimal" ]; then _CMD="$_CMD -p -platform -p minimal" elif [ "$_MINIMAL" = "custom" ]; then _CMD="$_CMD -p -platform -p custom" fi if [ $_TARGETPATH != $_TESTFILEPATH ]; then _CMD="$_CMD -p -input -p $_TESTFILEPATH" fi _CMD="$_CMD -p -maxwarnings -p 100" } function execute_test_cmd { echo "Executing $_CMD $_ARGS" echo "Working directory: $PWD" if [ ! -x $_TARGETPATH ]; then echo "Error: $_TARGET wasn't built!" RESULT=2 elif [ $DISPLAY ]; then # https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1256999 # https://bugreports.qt-project.org/browse/QTBUG-36243 QML2_IMPORT_PATH=${_IMPORT_PATH} UBUNTU_UI_TOOLKIT_THEMES_PATH=${_THEMES_PATH} \ LD_LIBRARY_PATH=${_LIB_PATH} \ ALARM_BACKEND=memory SUPPRESS_DEPRECATED_NOTE=no \ QT_LOGGING_RULES="[PERFORMANCE].warning=false" \ $_CMD $_ARGS 2>&1 | grep -v 'QFontDatabase: Cannot find font directory' if [ "x$UITK_TEST_KEEP_RUNNING" != "x1" ]; then ${BUILD_DIR}/tests/checkresults.sh $_XML RESULT=$? fi else echo "Skipped because no DISPLAY available" fi if [ -z $RESULT ]; then RESULT=0 # segfault elif [ $RESULT -eq 139 ]; then RESULT=2 # abort elif [ $RESULT -eq 134 ]; then RESULT=2 fi echo "$_TARGET_$_TESTFILE exited with $RESULT" return $RESULT } create_test_cmd execute_test_cmd RESULT=$? exit $RESULT ./tests/unit/tst_scaling_image_provider/0000755000015600001650000000000012700370701020601 5ustar jenkinsjenkins./tests/unit/tst_scaling_image_provider/input.png0000644000015600001650000000443612700370701022455 0ustar jenkinsjenkinsPNG  IHDR$$tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp -NIDATxڤXIO:t2vCH! BB\י0Yj:,$c.WW/&H薾q."ʲ̡ߎAt:wa,Ǡ%I2HB<#Ad"dzVŻ]>Ӝ; 3@cAˀe`lü;orfprp]9waf4}Ӵ\+;H#k}L"L8Ƃ~ي|K57fAxf vʊuSSS29DfQ??9ZZ$@r?lx'dkkˍkڱg QdSd@?Hh,6'yw ߂A[ZZ VrnjlT̊U]MQQs`½=fEs'r༁YB_6XP榛A_زuȑ jV3̀.//I1o 6h! 0k LY 4ic^̖Ea]cMӉewnG Q ykp=&n!qr#b 5dM&S;~&33Y[k뛞o6]/Ԙd%A޶t٦V RYj:=|!߼ Q܌U׾!h: JSlMLP*> R߅eɌEb6#YYe=ǵ } Z4#c;/溘tȔG+~$1N>ҵ/C TBNOOU_\rYA2LfKJDmsXxqtK&p&ѢՉP;]2[('/KJ'𸟚 q'b\e2wp `, SQv 0eK<נ =Aʣq9F_4tCgJJg8} q$2U{^P `ۭi;H\&x4s@1yEpKI w/[]]lXxx㣯zؤ'WM 4gmll]=9oQ-O#p input.png ./tests/unit/tst_scaling_image_provider/tst_scaling_image_provider.cpp0000644000015600001650000001071512700370701026677 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include #include "ucscalingimageprovider.h" class tst_UCScalingImageProvider: public QObject { Q_OBJECT private Q_SLOTS: void scaleToHalfSize() { UCScalingImageProvider provider; QImage result; QSize returnedSize; QImage expected; result = provider.requestImage("0.5/" + QDir::currentPath() + QDir::separator() + "input.png", &returnedSize, QSize()); expected = QImage("scaled_half.png"); QCOMPARE(result, expected); QCOMPARE(returnedSize, expected.size()); } void qrcSupport() { UCScalingImageProvider provider; QImage result; QSize returnedSize; QImage expected; result = provider.requestImage("0.5/:/test/prefix/input.png", &returnedSize, QSize()); expected = QImage("scaled_half.png"); QCOMPARE(result, expected); QCOMPARE(returnedSize, expected.size()); } void respectRequestedSize_data() { QTest::addColumn("inputFile"); QTest::addColumn("scalingFactor"); QTest::addColumn("requestedSize"); QTest::addColumn("returnedSize"); QTest::addColumn("resultSize"); QString inputFile(QDir::currentPath() + QDir::separator() + "input128x256.png"); QTest::newRow("no scaling, bigger width and height") << inputFile << "1.0" << QSize(1000, 1000) << QSize(128, 256) << QSize(128, 256); QTest::newRow("no scaling, smaller width") << inputFile << "1.0" << QSize(50, 1000) << QSize(128, 256) << QSize(50, 100); QTest::newRow("no scaling, smaller height") << inputFile << "1.0" << QSize(1000, 50) << QSize(128, 256) << QSize(25, 50); QTest::newRow("no scaling, smaller width and height")<< inputFile << "1.0" << QSize(50, 50) << QSize(128, 256) << QSize(25, 50); QTest::newRow("downscaling, bigger width and height")<< inputFile << "0.5" << QSize(1000, 1000) << QSize(64, 128) << QSize(64, 128); QTest::newRow("downscaling, smaller width") << inputFile << "0.5" << QSize(50, 1000) << QSize(64, 128) << QSize(50, 100); QTest::newRow("downscaling, smaller height") << inputFile << "0.5" << QSize(1000, 50) << QSize(64, 128) << QSize(25, 50); QTest::newRow("downscaling, smaller width and height")<< inputFile << "0.5" << QSize(50, 50) << QSize(64, 128) << QSize(25, 50); QTest::newRow("upscaling, bigger width and height") << inputFile << "2.0" << QSize(1000, 1000) << QSize(256, 512) << QSize(256, 512); QTest::newRow("upscaling, smaller width") << inputFile << "2.0" << QSize(50, 1000) << QSize(256, 512) << QSize(50, 100); QTest::newRow("upscaling, smaller height") << inputFile << "2.0" << QSize(1000, 50) << QSize(256, 512) << QSize(25, 50); QTest::newRow("upscaling, smaller width and height") << inputFile << "2.0" << QSize(50, 50) << QSize(256, 512) << QSize(25, 50); QTest::newRow("upscaling, smaller width and no height") << inputFile << "2.0" << QSize(50, 0) << QSize(256, 512) << QSize(50, 100); QTest::newRow("upscaling, smaller height and no width") << inputFile << "2.0" << QSize(0, 50) << QSize(256, 512) << QSize(25, 50); } void respectRequestedSize() { UCScalingImageProvider provider; QImage result; QSize size; QFETCH(QString, inputFile); QFETCH(QString, scalingFactor); QFETCH(QSize, requestedSize); QFETCH(QSize, returnedSize); QFETCH(QSize, resultSize); result = provider.requestImage(scalingFactor + "/" + inputFile, &size, requestedSize); QCOMPARE(size, returnedSize); QCOMPARE(result.size(), resultSize); } }; QTEST_MAIN(tst_UCScalingImageProvider) #include "tst_scaling_image_provider.moc" ./tests/unit/tst_scaling_image_provider/input128x256.png0000644000015600001650000002666612700370701023346 0ustar jenkinsjenkinsPNG  IHDR{~bKGD pHYs  tIME !HJ IDATx]kr㸮&(=_Y 2 HɉTزD?WJ RJy=p  "_e)?|%_f׻?shZ5a@XrH/oP<C,#iv_"m[X;zzF+ Xd@x0n[\N׵>~3ZcN7!e]\S=Rg|i z봿y=cue#끡u >&ŭli!AjsZ#z9D|^- Ep@#޳D=xU{M{a'H>49s[Q{X- BtkxާcQ:PXH\8&"F,5QBsbH(M9?845y\'gAGb.Je FvVȂвg^5ZloymwŮi 1"QyZ: :3hȈ:_vI_%艋#6 U Xl+:vco&&tTRz3wwt|գg ^}p4O}Q ߟJwYŔR22E7hj܏BIEe1ْ^Fha׌jK)xq,gerGA8w]S{]̐Gc*Ej" #N]$pηgC # rzzƝ;빿*&2t, pL=!RU}"0oC543a+?f5n+~eۓhN>@;{HIXk-`Ukpy0a#ÀE=}@ta ~ЈpH܇L. 0brv?є6l~ABIE4RC1Ѳq9?1tyGcocIDW wt{$0 :T'AdQE".hiZaoY~4|X%V~^b]:؈#98 8kSՌ 4bqgc-2ʨ`N)ꫜ j՛R玟!xd L8CķP =D#>T^U-&Ф<88 9\El4>=``JnGFMvLː?V>2#̬HL+p>(fGT$A)%>(*9᜺{ZgncڪjuPV٢]PML eY6h1"x9_1`/`ָ]7 m( /<)[bF4">"C#vFΏE' A7ïn3d3Ű%ʵ0Afxh *@C`.c9p` %xs~(>N5hIi =xicH 9*s؃ 荬:2rs@P " @j>J)ifr2)a%7\ EAfo< mPDM*RNF4MS* d8əa8HkhNn&v_eX5Eo#@zփp3^Js bz+7; ,xACibЎrg)qU5+SD|n83pS . VV̆ݐz.-B~{G (YGx-a4ps`1GQUzQ Z+V"JDG12v~o}mѕć-ҕEZӟ@#e#}K;U1u% x֏L .7#=ԖfבrUI3K)Jz/k=(Aœ7 iXfLK#Kh(Q«?J)py/"gQiFT^S5*(*jƘHTMJ<-[7:Ig y7H&z^]ǝvIYxzMwhqNVgzQAܣ'$?"/ӷb3e- kOZjNZWs7!=#7!8[4-N[wI>2l·@`gKDDUIA_b[C/k>4Wx+'E[pFGr_!UJ(G& I@MJI0wGRo5}|V}_ mTs2*U@ONBfM$:ȳ3~`o^`݄0WM@b9oO p^k"vUI8Z1z(DqEߊmۆ!|eYvS;A礉iTU& nH֏KZ_**ioA^d 7 "򌟌_&f4&v-TpLϪېK3pPܿLjյ%R9v1?6q(ʏ+xN B)NHU ӧdnNjϱ|)S ,0T+bG]Vh ?a 6`a< zQ>Q xM"sV{^mmƿyӈ.Z>whָGgΠ$p$,f@G}Ž<1+=V @kw,dD*}64s3ě,ƽ| NtW5 tWp5_cio\T8"ȭxW34T3=Z`~FʲH& ց}jDN|ML F]rA=7`zy|#[,(=<^SA+39)~#{:Gp=BODށ DwG>BѽCo빭Wv3ӎ'uhD@+n}OSGܑu0qhQ|ž3&o-ud&8ѯŸ9a|:[EGMh#ث~']cʺ0- >'| ^j9Dwq_fV :f;@guT7?%oFr&Ϟ[ps !k\m>3<"6jHt56DŸkrzBQc}h?̽weLRv3}K Bc>A Q)Ń "q'Ǚ'0(7Gµ ۫pFri죭CAΝ Mh'5]a`KU@1~D2AڅxE!$*{LY+hocz=Z!O+خiL86A:Πd8 颓C!VhXkwp{Fu^FyoO=r6Gj[+ GgO1P$#J"&?l*dXq#?JM΋>5hO !~&"?ϳB~Ěy "?c|*(!7=ڦa_"[;rRbʹɌ(™[*pP`咏ڿ p^ : 1HKeѫmM55S25}ָ?Sr (rY___i/: H+zdâΣjSkSCA9Jy߿[Пu7K'!%3vvKm34 ui܎uQ>aޡіFmhoMkx;<MӔ2|$l"7g;c0kBB/L "L-.xB+ό {Zd9]ק9ap甧 > `·G^u絇fkXD7oFp" >'g^|}=oX#К"~Gčw{VGw֡1L`z~OM EOSҩ2 &ؙݵF.zl!`dZ Tј/"R <_$޲ 5k 7 {-K+P5EBQ  MT>Q,p0O!}" F`iX%}nRJ)]rQC6<1:R3@2#P9URR8~hFpRZ9}}}UQs&UT%:3xr姢YԺi-Ӯ@ƨqtm;Y Ć>rod+p3!ً)LK*? tz> :l~J,)j?Ä%RUoQj!r܉;$|,#(,g knaNIFTϗ`\RiӨ=zxTƦ&w#P1j @@6kwaF{B#6g{ Ac4#X{_` Lk0*S?-`;K[eJ צaY͡y ;<6_wld%|b#h@-?4-ǟڰKawHuZ7ؼ m$4>@,=Oc]ҳQ ,S-ҚC֮ /Cjs8wϹ* ֹG{[16TD ?&?]N~kY&,){VS?eU~r3L{@vH,P4"SeNA>``VjYi-y#@~MBO!~K3F#\_7մN*;#j!l 7IDAT?^bG-pv >SnGS_%~u/aEOX>vLш"kSZx\v0)Zזޞ'dxKK4˷d۲ nXHZcՒ-fMIv#(8=;[#__(5{+\j ^,i%nE6a]v2'77p|Vt"|$R(@]9AiJ'~&LDNjqf66LAh /Xv Adϖݣ˶+ZA6n͹b3eq8,˲M iJ~b٭>? Q%Ɍ VIN (^IRpo!|:i"rIej^-1M=P 41ηuʙ wLŁ߲lLjRJ?MxU9^`I9>zU.=͌5йCHU&<;|*qwY6Ri#ҏـޢ˺~cJ eyƻvukXJ@g@PTջ6՚M'zwjK);'?e2HB>Fkpm-hN.tgvCG/ HWko3W_`NJ@5q7/x>kiʐ&* ɿ<5GbHJc !I)o%>UzFTR/g(jAgVW/l3#%?eʠxè1"*!ĴszeY*`>&S#554l1Y!?6gCNSi*S*Yʀ(E4Ua"!r3 +|Eī޲lKbUCTU_JRȳW^˗E#$ږ18bUi{]Q)vyi8)RJgw=naQexH;K).pݪ( 2A3+gdz*Bz<y/&o'"i:MN;e<#MC|z^rd7fнSB5|2a$QH~j&2=X ̶<::`RZKݧP'YڙB \w5 Ch6YHoO*ymR[YAo|e(%]Vl"(~ws:nj?Z~{0(j76yP+3BLRƵrUi%|Ǧ, wRnkvkd 汕G31(@4g50C^ FEĝ01ͦx\VKƘ.Fp883"1,bֿHS 3LrZtF( FZI ZhsjȩUCmф͒?]G%^oޥNS]}˥h=N#&$pZ˲ȣE,)G܈z,rY>#(\, h :qeo*Y+޸*74+v3*+|; RQ:NOO9??'Ѷ-tJJR "$wUR ,1Y13kD7E???@T|N܌Yeef2Uv1' p 쌱@q.ņ!M&8L݇]|7#]U*XV{pwcZ1j~rC=!UܝfC۶{l^__k {V5QS t^+ivam}l4hrwR,r]⒫&{^^^hۖCbF4Mb{6*,Kx~ww')^(VW,$4IENDB`./tests/unit/tst_scaling_image_provider/tst_scaling_image_provider.pro0000644000015600001650000000016312700370701026711 0ustar jenkinsjenkinsinclude(../test-include.pri) SOURCES += tst_scaling_image_provider.cpp RESOURCES += tst_scaling_image_provider.qrc ./tests/unit/tst_theme/0000755000015600001650000000000012700370701015207 5ustar jenkinsjenkins./tests/unit/tst_theme/tst_theme.pro0000644000015600001650000000022212700370701017721 0ustar jenkinsjenkinsTESTS += $$system(ls tst_*.qml) include(../qmltest-include.pri) TARGET = tst_theme SOURCES += tst_theme.cpp OTHER_FILES += $$system(ls *.qml) ./tests/unit/tst_theme/tst_theme.cpp0000644000015600001650000000130312700370701017704 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include QUICK_TEST_MAIN(theme) ./tests/unit/tst_theme/tst_popoverforegroundstyle.qml0000644000015600001650000000216212700370701023463 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Themes.Ambiance 0.1 import Ubuntu.Components.Popups 1.0 TestCase { name: "PopupsPopoverAPI" function test_show() { popOver.show() } Popover { id: popOver foregroundStyle: testForegroundStyle Text { text: "Hello Popover!" } } Component { id: testForegroundStyle PopoverForegroundStyle { } } } ./tests/unit/custom_qpa/0000755000015600001650000000000012700370701015366 5ustar jenkinsjenkins./tests/unit/custom_qpa/README0000644000015600001650000000112512700370701016245 0ustar jenkinsjenkinsIn order to correctly test Qt's Device Pixel Ratio system in a unit test, one needs to have the QPA plugin for the platform support reading the DEVICE_PIXEL_RATIO environment variable. These unit tests use the "minimal" QPA plugin, which unfortunately does not support that variable. The contents of this directory is a near-complete duplicate of "minimal" QPA plugin source from Qt, with added support for the DEVICE_PIXEL_RATIO environment variable. One can use this plugin as follows: DEVICE_PIXEL_RATIO=2 QT_QPA_PLATFORM_PLUGIN_PATH=$PWD \ QT_QPA_PLATFORM=custom qmlscene ~/tmp.qml ./tests/unit/custom_qpa/main.cpp0000644000015600001650000000423712700370701017024 0ustar jenkinsjenkins/**************************************************************************** ** ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qcustomintegration.h" class QCustomIntegrationPlugin : public QPlatformIntegrationPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.2" FILE "custom.json") public: QPlatformIntegration *create(const QString&, const QStringList&); }; QPlatformIntegration *QCustomIntegrationPlugin::create(const QString& system, const QStringList& /*paramList*/) { if (!system.compare(QLatin1String("custom"), Qt::CaseInsensitive)) return new QCustomIntegration(); return 0; } #include "main.moc" ./tests/unit/custom_qpa/qcustomintegration.cpp0000644000015600001650000000737612700370701022046 0ustar jenkinsjenkins/**************************************************************************** ** ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qcustomintegration.h" #include "qcustombackingstore.h" #include #include #include #include static const char devicePixelRatioEnvironmentVariable[] = "QT_DEVICE_PIXEL_RATIO"; QCustomScreen::QCustomScreen() : mDepth(32), mFormat(QImage::Format_ARGB32_Premultiplied), mDpr(1.0) { if (qEnvironmentVariableIsSet(devicePixelRatioEnvironmentVariable)) { bool ok = false; const float dpr = qgetenv(devicePixelRatioEnvironmentVariable).toFloat(&ok); if (ok && dpr > 0) { mDpr = dpr; } } } QCustomIntegration::QCustomIntegration() { QCustomScreen *mPrimaryScreen = new QCustomScreen(); mPrimaryScreen->mGeometry = QRect(0, 0, 240, 320); mPrimaryScreen->mDepth = 32; mPrimaryScreen->mFormat = QImage::Format_ARGB32_Premultiplied; screenAdded(mPrimaryScreen); } bool QCustomIntegration::hasCapability(QPlatformIntegration::Capability cap) const { switch (cap) { case ThreadedPixmaps: return true; case MultipleWindows: return true; default: return QPlatformIntegration::hasCapability(cap); } } // Dummy font database that does not scan the fonts directory to be // used for command line tools like qmlplugindump that do not create windows // unless DebugBackingStore is activated. class DummyFontDatabase : public QPlatformFontDatabase { public: void populateFontDatabase() override {} }; QPlatformFontDatabase *QCustomIntegration::fontDatabase() const { return new DummyFontDatabase; } QPlatformWindow *QCustomIntegration::createPlatformWindow(QWindow *window) const { QPlatformWindow *w = new QPlatformWindow(window); w->requestActivateWindow(); return w; } QPlatformBackingStore *QCustomIntegration::createPlatformBackingStore(QWindow *window) const { return new QCustomBackingStore(window); } QAbstractEventDispatcher *QCustomIntegration::createEventDispatcher() const { return createUnixEventDispatcher(); } QCustomIntegration *QCustomIntegration::instance() { return static_cast(QGuiApplicationPrivate::platformIntegration()); } ./tests/unit/custom_qpa/qcustomintegration.h0000644000015600001650000000525212700370701021502 0ustar jenkinsjenkins/**************************************************************************** ** ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QPLATFORMINTEGRATION_MINIMAL_H #define QPLATFORMINTEGRATION_MINIMAL_H #include #include class QCustomScreen : public QPlatformScreen { public: QCustomScreen(); QRect geometry() const override { return mGeometry; } int depth() const override { return mDepth; } QImage::Format format() const override { return mFormat; } qreal devicePixelRatio() const override { return mDpr; } public: QRect mGeometry; int mDepth; QImage::Format mFormat; QSize mPhysicalSize; qreal mDpr; }; class QCustomIntegration : public QPlatformIntegration { public: explicit QCustomIntegration(); ~QCustomIntegration() = default; bool hasCapability(QPlatformIntegration::Capability cap) const override; QPlatformFontDatabase *fontDatabase() const override; QPlatformWindow *createPlatformWindow(QWindow *window) const override; QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const override; QAbstractEventDispatcher *createEventDispatcher() const override; static QCustomIntegration *instance(); }; #endif ./tests/unit/custom_qpa/qcustombackingstore.h0000644000015600001650000000410612700370701021627 0ustar jenkinsjenkins/**************************************************************************** ** ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QBACKINGSTORE_MINIMAL_H #define QBACKINGSTORE_MINIMAL_H #include #include #include class QCustomBackingStore : public QPlatformBackingStore { public: QCustomBackingStore(QWindow *window); ~QCustomBackingStore() = default; QPaintDevice *paintDevice(); void flush(QWindow *window, const QRegion ®ion, const QPoint &offset); void resize(const QSize &size, const QRegion &staticContents); private: QImage mImage; }; #endif ./tests/unit/custom_qpa/custom.json0000644000015600001650000000003512700370701017571 0ustar jenkinsjenkins{ "Keys": [ "custom" ] } ./tests/unit/custom_qpa/custom_qpa.pro0000644000015600001650000000051012700370701020257 0ustar jenkinsjenkinsTARGET = qcustom TEMPLATE = lib CONFIG += plugin no_keywords c++11 QT -= gui QT += core-private gui-private platformsupport-private SOURCES = main.cpp \ qcustomintegration.cpp \ qcustombackingstore.cpp HEADERS = qcustomintegration.h \ qcustombackingstore.h OTHER_FILES += custom.json ./tests/unit/custom_qpa/qcustombackingstore.cpp0000644000015600001650000000441212700370701022162 0ustar jenkinsjenkins/**************************************************************************** ** ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qcustombackingstore.h" #include "qcustomintegration.h" #include "qscreen.h" #include #include QCustomBackingStore::QCustomBackingStore(QWindow *window) : QPlatformBackingStore(window) { } QPaintDevice *QCustomBackingStore::paintDevice() { return &mImage; } void QCustomBackingStore::flush(QWindow *window, const QRegion ®ion, const QPoint &offset) { Q_UNUSED(window); Q_UNUSED(region); Q_UNUSED(offset); } void QCustomBackingStore::resize(const QSize &size, const QRegion &) { QImage::Format format = QGuiApplication::primaryScreen()->handle()->format(); if (mImage.size() != size) mImage = QImage(size, format); } ./tests/unit/tst_template/0000755000015600001650000000000012700370701015720 5ustar jenkinsjenkins./tests/unit/tst_template/tst_template.pro0000644000015600001650000000007112700370701021145 0ustar jenkinsjenkinsinclude(../test-include.pri) SOURCES += tst_template.cpp ./tests/unit/tst_template/tst_template.cpp0000644000015600001650000000162712700370701021137 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include class tst_Template: public QObject { Q_OBJECT private Q_SLOTS: void dummy() { QCOMPARE(true, true); } }; QTEST_MAIN(tst_Template) #include "tst_template.moc" ./tests/unit/add_qmlmakecheck.pri0000644000015600001650000000145712700370701017173 0ustar jenkinsjenkins# Do not use CONFIG += testcase that would add a 'make check' because it also # adds a 'make install' that installs the test cases, which we do not want. # Instead add a 'make check' manually. check.target = check check.commands = "set -e;" for(TEST, TESTS) { _uitk_command = cd $$_PRO_FILE_PWD_; _uitk_command += env UITK_TEST_KEEP_RUNNING=1 _uitk_command += '$${ROOT_SOURCE_DIR}/tests/unit/runtest.sh "$$shadowed($$_PRO_FILE_PWD_)/$${TARGET}" "$${TEST}" minimal'; check.commands += $${_uitk_command} #add a convenience target per TEST file check_name = "check_$${TEST}" check_name = $$replace(check_name, "\.qml", "") check_name = $$replace(check_name, "\.", "_") $${check_name}.target = $${check_name} $${check_name}.commands += $${_uitk_command} QMAKE_EXTRA_TARGETS+=$${check_name} } ./tests/unit/tst_alarms/0000755000015600001650000000000012700370701015364 5ustar jenkinsjenkins./tests/unit/tst_alarms/tst_alarms.cpp0000644000015600001650000005037612700370701020254 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include "ucalarm.h" #include "ucalarm_p.h" #include "alarmmanager_p.h" #include "ucalarmmodel.h" #include "adapters/alarmsadapter_p.h" #include "uctestcase.h" #include #include #include #include #include #include #include #include "plugin.h" class tst_UCAlarms : public QObject { Q_OBJECT public: tst_UCAlarms() {} Q_SIGNALS: void alarmUpdated(); private: QSignalSpy *insertSpy; QSignalSpy *updateSpy; QSignalSpy *cancelSpy; QQmlEngine *engine; void syncFetch() { // initiate fetch QSignalSpy spy(&AlarmManager::instance(), SIGNAL(alarmsRefreshed())); AlarmManager::instance().fetchAlarms(); spy.wait(1000); } // the function should be used when a new alarm event is added // which causes an insert operation. void waitForInsert() { if (!insertSpy->count()) { insertSpy->wait(1000); } insertSpy->clear(); } // the function should be used when an existing alarm event is updated // which causes an alarmUpdated() signal to be triggered void waitForUpdate() { if (!updateSpy->count()) { updateSpy->wait(1000); } updateSpy->clear(); } // the function should be used when an alarm event is removed // which causes an alarmRemoveStarted()/alarmRemoveFinished() signal pair // to be triggered void waitForRemove() { if (!cancelSpy->count()) { cancelSpy->wait(1000); } cancelSpy->clear(); } bool containsAlarm(UCAlarm *alarm, bool trace = false) { for (int i = 0; i < AlarmManager::instance().alarmCount(); i++) { const UCAlarm *element = AlarmManager::instance().alarmAt(i); if (trace && (alarm->message() == element->message())) { qDebug() << "----------------------"; qDebug() << "Alarm data:" << alarm->message(); qDebug() << alarm->date() << element->date(); qDebug() << alarm->type() << element->type(); qDebug() << alarm->daysOfWeek() << element->daysOfWeek(); } if (*element == *alarm) { return true; } } return false; } private Q_SLOTS: void initTestCase() { engine = new QQmlEngine; UbuntuComponentsPlugin::initializeContextProperties(engine); AlarmManager::instance(); // connect alarmUpdated() and alarmMoveFinished to the test signal so we get either of those on alarm updates connect(&AlarmManager::instance(), SIGNAL(alarmUpdated(int)), this, SIGNAL(alarmUpdated())); connect(&AlarmManager::instance(), SIGNAL(alarmMoveFinished()), this, SIGNAL(alarmUpdated())); insertSpy = new QSignalSpy(&AlarmManager::instance(), SIGNAL(alarmInsertFinished())); updateSpy = new QSignalSpy(this, SIGNAL(alarmUpdated())); cancelSpy = new QSignalSpy(&AlarmManager::instance(), SIGNAL(alarmRemoveFinished())); } void cleanupTestCase() { // remove all test alarms // model may have an outstanding fetch, so wait for its completion! QSignalSpy spy(&AlarmManager::instance(), SIGNAL(alarmsRefreshed())); UCAlarmModel model; model.componentComplete(); spy.wait(); int i = 0; while (i < model.count()) { UCAlarm *alarm = model.get(i); if (alarm && alarm->message().startsWith("test_")) { alarm->cancel(); waitForRemove(); i = 0; } else { i++; } } delete cancelSpy; delete updateSpy; delete insertSpy; delete engine; } void cleanup() { // clear each spy count insertSpy->clear(); updateSpy->clear(); cancelSpy->clear(); } void test_singleShotAlarmXFail() { UCAlarm alarm; alarm.save(); QVERIFY(alarm.error() == UCAlarm::EarlyDate); } void test_singleShotAlarmPass() { UCAlarm alarm(QDateTime::currentDateTime().addSecs(4), "test_singleShotAlarmPass"); alarm.save(); waitForInsert(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); } void test_repeating_autoDetect() { UCAlarm alarm(QDateTime::currentDateTime().addSecs(20), UCAlarm::AutoDetect, "test_repeating_autoDetect"); alarm.save(); waitForInsert(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); } void test_repeating_daily() { UCAlarm alarm(QDateTime::currentDateTime().addSecs(10), UCAlarm::Daily, "test_repeating_daily"); alarm.save(); waitForInsert(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); } void test_repeating_givenDay_exact_data() { QTest::addColumn("message"); QTest::addColumn("day"); QTest::newRow("Monday") << "Monday" << (int)UCAlarm::Monday; QTest::newRow("Tuesday") << "Tuesday" << (int)UCAlarm::Tuesday; QTest::newRow("Wednesday") << "Wednesday" << (int)UCAlarm::Wednesday; QTest::newRow("Thursday") << "Thursday" << (int)UCAlarm::Thursday; QTest::newRow("Friday") << "Friday" << (int)UCAlarm::Friday; QTest::newRow("Saturday") << "Saturday" << (int)UCAlarm::Saturday; QTest::newRow("Sunday") << "Sunday" << (int)UCAlarm::Sunday; } void test_repeating_givenDay_exact() { QFETCH(QString, message); QFETCH(int, day); UCAlarm alarm(QDateTime::currentDateTime(), (UCAlarm::DaysOfWeek)day, "test_repeating_givenDay_exact_" + message); alarm.save(); waitForInsert(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); } void test_repeating_moreDays_data() { QTest::addColumn("message"); QTest::addColumn("days"); QTest::newRow("First on Monday") << "Monday" << (int)(UCAlarm::Monday | UCAlarm::Sunday); QTest::newRow("First on Tuesday") << "Tuesday" << (int)(UCAlarm::Tuesday | UCAlarm::Monday); QTest::newRow("First on Wednesday") << "Wednesday" << (int)(UCAlarm::Wednesday | UCAlarm::Tuesday); QTest::newRow("First on Thursday") << "Thursday" << (int)(UCAlarm::Thursday | UCAlarm::Wednesday); QTest::newRow("First on Friday") << "Friday" << (int)(UCAlarm::Friday | UCAlarm::Thursday); QTest::newRow("First on Saturday") << "Saturday" << (int)(UCAlarm::Saturday | UCAlarm::Friday); QTest::newRow("First on Sunday") << "Sunday" << (int)(UCAlarm::Sunday | UCAlarm::Saturday); } void test_repeating_moreDays() { QFETCH(QString, message); QFETCH(int, days); QDateTime currentDate(QDateTime::currentDateTime()); UCAlarm alarm(currentDate, (UCAlarm::DaysOfWeek)days, "test_repeating_moreDays" + message); // the distance is always 6 days between the occurrences UCAlarm firstOccurrence(currentDate, alarm.daysOfWeek(), alarm.message()); // make sure we have the same setup as the original one; checkAlarm() adjusts all alarm data UCAlarmPrivate::get(&firstOccurrence)->checkAlarm(); alarm.save(); waitForInsert(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); QVERIFY(containsAlarm(&firstOccurrence)); } void test_repeating_weekly_data() { QTest::addColumn("message"); QTest::addColumn("dow"); QTest::newRow("Monday") << "Monday" << (int)UCAlarm::Monday; QTest::newRow("Tuesday") << "Tuesday" << (int)UCAlarm::Tuesday; QTest::newRow("Wednesday") << "Wednesday" << (int)UCAlarm::Wednesday; QTest::newRow("Thursday") << "Thursday" << (int)UCAlarm::Thursday; QTest::newRow("Friday") << "Friday" << (int)UCAlarm::Friday; QTest::newRow("Saturday") << "Saturday" << (int)UCAlarm::Saturday; QTest::newRow("Sunday") << "Sunday" << (int)UCAlarm::Sunday; } void test_repeating_weekly() { QFETCH(QString, message); QFETCH(int, dow); UCAlarm alarm(QDateTime::currentDateTime().addSecs(3600), (UCAlarm::DaysOfWeek)dow, "test_repeating_weekly_" + message); alarm.save(); waitForInsert(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); } void test_setAlarmObjectFail_WrongRecurence1() { UCAlarm alarm(QDateTime::currentDateTime().addDays(1), UCAlarm::Monday | UCAlarm::Tuesday); alarm.setType(UCAlarm::OneTime); alarm.save(); QCOMPARE(alarm.error(), (int)UCAlarm::OneTimeOnMoreDays); } void test_setAlarmObjectFail_WrongRecurence2() { UCAlarm alarm(QDateTime::currentDateTime().addDays(1), UCAlarm::Daily); alarm.setType(UCAlarm::OneTime); alarm.save(); QCOMPARE(alarm.error(), (int)UCAlarm::OneTimeOnMoreDays); } void test_cancelFail() { UCAlarm alarm(QDateTime::currentDateTime().addDays(1), "test_cancelFail"); alarm.cancel(); QCOMPARE(alarm.error(), (int)UCAlarm::InvalidEvent); } void test_cancelPass() { UCAlarm alarm(QDateTime::currentDateTime().addDays(1), "test_cancelPass"); alarm.save(); waitForInsert(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); alarm.cancel(); waitForRemove(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(!containsAlarm(&alarm)); } void test_twoAlarmsOnSameTime() { QDateTime dt = QDateTime::currentDateTime().addSecs(60); UCAlarm alarm1(dt, "test_twoAlarmsOnSameTime"); UCAlarm alarm2(dt, "test_twoAlarmsOnSameTime"); alarm1.save(); waitForInsert(); alarm2.save(); waitForInsert(); QCOMPARE(alarm1.error(), (int)UCAlarm::NoError); QCOMPARE(alarm2.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm1)); QVERIFY(containsAlarm(&alarm2)); } void test_twoAlarmsOnSameTime2() { QDateTime dt = QDateTime::currentDateTime().addSecs(60); UCAlarm alarm1(dt, "test_twoAlarmsOnSameTime2"); UCAlarm alarm2(dt, UCAlarm::Daily, "test_twoAlarmsOnSameTime2"); alarm1.save(); waitForInsert(); alarm2.save(); waitForInsert(); QCOMPARE(alarm1.error(), (int)UCAlarm::NoError); QCOMPARE(alarm2.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm2)); QVERIFY(containsAlarm(&alarm1)); } void test_updateAlarm_SameType() { QDateTime dt = QDateTime::currentDateTime().addSecs(120); UCAlarm alarm(dt, "test_updateAlarm_SameType"); UCAlarm copy(dt, "test_updateAlarm_SameType"); alarm.save(); waitForInsert(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); alarm.setDate(QDateTime::currentDateTime().addDays(5)); QVERIFY(!(alarm == copy)); alarm.save(); waitForUpdate(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); QVERIFY(!containsAlarm(©)); } void test_updateAlarm_DifferentType() { QDateTime dt = QDateTime::currentDateTime().addSecs(120); UCAlarm alarm(dt, "test_updateAlarm_DifferentType"); alarm.save(); waitForInsert(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); UCAlarm copy(dt, "test_updateAlarm_DifferentType"); alarm.setType(UCAlarm::Repeating); QVERIFY(!(alarm == copy)); alarm.save(); // do not fetch waitForUpdate(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); QVERIFY(!containsAlarm(©)); } void test_updateAlarm_Repeating() { UCAlarm alarm(QDateTime::currentDateTime().addMSecs(5000), UCAlarm::AutoDetect, "test_updateAlarm_Repeating"); alarm.save(); waitForInsert(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); alarm.setDate(alarm.date().addDays(1)); alarm.save(); waitForUpdate(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); alarm.setDaysOfWeek(UCAlarm::Daily); alarm.save(); waitForUpdate(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); } void test_fetchAlarmPlus7Days() { QDateTime dt = QDateTime::currentDateTime().addDays(10); UCAlarm alarm(dt, "test_fetchAlarmPlus7Days"); alarm.save(); waitForInsert(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); UCAlarm nextMonth(dt.addMonths(1), "test_fetchAlarmPlus1Month"); nextMonth.save(); waitForInsert(); QCOMPARE(nextMonth.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&nextMonth)); UCAlarm nextYear(dt.addYears(1), "test_fetchAlarmPlus1Year"); nextYear.save(); waitForInsert(); QCOMPARE(nextYear.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&nextYear)); } void test_correctAlarmOrderDaily() { QDate cd = QDate::currentDate(); QTime ct = QTime::currentTime(); QDateTime dt(cd, QTime(ct.hour(), ct.minute(), ct.second() + 2)); QDateTime nextDt(cd.addDays(1), QTime(ct.hour(), ct.minute(), ct.second() + 2)); UCAlarm alarm(dt, UCAlarm::Daily, "test_correctAlarmOrderDaily"); UCAlarm nextAlarm(nextDt, UCAlarm::Daily, "test_correctAlarmOrderDaily"); alarm.save(); waitForInsert(); QTest::qWait(3000); syncFetch(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&nextAlarm)); } void test_correctAlarmOrderWeekly() { QDate cd = QDate::currentDate(); QTime ct = QTime::currentTime(); QDateTime dt(cd, QTime(ct.hour(), ct.minute(), ct.second() + 1)); QDateTime nextDt(cd.addDays(7), QTime(ct.hour(), ct.minute(), ct.second() + 1)); UCAlarm alarm(dt, UCAlarm::AutoDetect, "test_correctAlarmOrderWeekly"); UCAlarm nextAlarm(nextDt, UCAlarm::AutoDetect, "test_correctAlarmOrderWeekly"); alarm.save(); waitForInsert(); QTest::qWait(2000); syncFetch(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&nextAlarm)); } void test_oneTime_dow_data() { QTest::addColumn("message"); QTest::addColumn("dow"); QTest::newRow("Monday") << "Monday" << (int)UCAlarm::Monday; QTest::newRow("Tuesday") << "Tuesday" << (int)UCAlarm::Tuesday; QTest::newRow("Wednesday") << "Wednesday" << (int)UCAlarm::Wednesday; QTest::newRow("Thursday") << "Thursday" << (int)UCAlarm::Thursday; QTest::newRow("Friday") << "Friday" << (int)UCAlarm::Friday; QTest::newRow("Saturday") << "Saturday" << (int)UCAlarm::Saturday; QTest::newRow("Sunday") << "Sunday" << (int)UCAlarm::Sunday; } void test_oneTime_dow() { QFETCH(QString, message); QFETCH(int, dow); UCAlarm alarm(QDateTime::currentDateTime().addSecs(3600), "test_oneTime_dow_" + message); alarm.setDaysOfWeek((UCAlarm::DaysOfWeek)dow); alarm.save(); waitForInsert(); QCOMPARE(alarm.error(), (int)UCAlarm::NoError); QVERIFY(containsAlarm(&alarm)); } void test_oneTime_setDate_does_not_change_dow_data() { QTest::addColumn("message"); QTest::addColumn("dow"); QTest::newRow("Monday") << "Monday" << (int)UCAlarm::Monday; QTest::newRow("Tuesday") << "Tuesday" << (int)UCAlarm::Tuesday; QTest::newRow("Wednesday") << "Wednesday" << (int)UCAlarm::Wednesday; QTest::newRow("Thursday") << "Thursday" << (int)UCAlarm::Thursday; QTest::newRow("Friday") << "Friday" << (int)UCAlarm::Friday; QTest::newRow("Saturday") << "Saturday" << (int)UCAlarm::Saturday; QTest::newRow("Sunday") << "Sunday" << (int)UCAlarm::Sunday; } void test_oneTime_setDate_does_not_change_dow() { QFETCH(QString, message); QFETCH(int, dow); UCAlarm alarm(QDateTime::currentDateTime(), "test_oneTime_setDate_does_not_change_dow_" + message); alarm.setDaysOfWeek((UCAlarm::DaysOfWeek)dow); alarm.setDate(QDateTime::currentDateTime().addSecs(3600)); QCOMPARE((int)alarm.daysOfWeek(), dow); } void test_sound_saving() { UCAlarm alarm(QDateTime::currentDateTime().addSecs(60), "test_onetime_sound"); alarm.setSound(QUrl("file:///usr/share/sounds/ubuntu/ringtones/Celestial.ogg")); alarm.save(); waitForInsert(); const UCAlarm *saved = AlarmManager::instance().findAlarm(alarm.cookie()); QVERIFY(saved); QCOMPARE(alarm, *saved); QCOMPARE(alarm.sound().toString(), saved->sound().toString()); } // guard bug #1360101 void test_create_update_and_disable_alarm() { UCAlarm alarm(QDateTime::currentDateTime(), UCAlarm::AutoDetect, "test_create_update_and_disable_alarm"); alarm.setSound(QUrl("file:///usr/share/sounds/ubuntu/ringtones/Celestial.ogg")); alarm.save(); waitForInsert(); QVERIFY(containsAlarm(&alarm)); // update alarm to occur 1h earlier QDateTime date = alarm.date(); date.addSecs(-60); alarm.save(); waitForUpdate(); QVERIFY(containsAlarm(&alarm)); // disable alarm alarm.setEnabled(false); alarm.save(); waitForUpdate(); QVERIFY(containsAlarm(&alarm)); QVERIFY(AlarmManager::instance().verifyChange(&alarm, AlarmManager::Enabled, false)); } void test_change_alarm_sound() { UCAlarm alarm(QDateTime::currentDateTime(), UCAlarm::AutoDetect, "test_change_alarm_fields_sound"); alarm.setSound(QUrl("file:///usr/share/sounds/ubuntu/ringtones/Bliss.ogg")); alarm.save(); waitForInsert(); QVERIFY(containsAlarm(&alarm)); // do the change alarm.setSound(QUrl("file:///usr/share/sounds/ubuntu/ringtones/Sparkle.ogg")); alarm.save(); waitForUpdate(); QVERIFY(containsAlarm(&alarm)); //verify whether we have the desired change QVERIFY(AlarmManager::instance().verifyChange(&alarm, AlarmManager::Sound, QVariant::fromValue(alarm.sound()))); } void test_check_alarm_tags_data() { QTest::addColumn("message"); QTest::addColumn("enabled"); QTest::newRow("enabled") << "enabled" << true; QTest::newRow("disabled") << "disabled" << false; } void test_check_alarm_tags() { QFETCH(QString, message); QFETCH(bool, enabled); UCAlarm alarm(QDateTime::currentDateTime().addDays(1), "test_check_alarm_tags_" + message); alarm.setSound(QUrl("file:///usr/share/sounds/ubuntu/ringtones/Marimbach.ogg")); alarm.setEnabled(enabled); alarm.save(); waitForInsert(); QVERIFY(containsAlarm(&alarm)); // check the tags QVERIFY(AlarmManager::instance().verifyChange(&alarm, AlarmManager::Enabled, enabled)); } }; QTEST_MAIN(tst_UCAlarms) #include "tst_alarms.moc" ./tests/unit/tst_alarms/tst_alarms.pro0000644000015600001650000000010712700370701020255 0ustar jenkinsjenkinsinclude(../test-include.pri) QT += organizer SOURCES += tst_alarms.cpp ./tests/unit/qmltest-include.pri0000644000015600001650000000017612700370701017045 0ustar jenkinsjenkinsinclude( plugin_dependency.pri ) include( add_qmlmakecheck.pri) TEMPLATE = app QT += qml quick qmltest CONFIG += no_keywords ./tests/unit/tst_components/0000755000015600001650000000000012700370716016300 5ustar jenkinsjenkins./tests/unit/tst_components/tst_label.qml0000644000015600001650000000474612700370701020771 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "LabelAPI" function cleanup() { textCustom.fontSize = "medium"; textCustom.font.weight = Font.Light; } function test_0_defaults() { compare(textCustom.font.family, "Ubuntu", "Default font family"); compare(textCustom.font.weight, Font.Light, "Default font weight"); compare(textCustom.fontSize,"medium","fontSize is 'medium' by default") } function test_fontSize_data() { return [ {tag: "xx-small"}, {tag: "x-small"}, {tag: "small"}, {tag: "medium"}, {tag: "large"}, {tag: "x-large"}, ]; } function test_fontSize(data) { textCustom.fontSize = data.tag; compare(textCustom.fontSize, data.tag, "Can set/get " + data.tag) } function test_fontWeight_data() { return [ {tag: "Light", weight: Font.Light}, {tag: "Normal", weight: Font.Normal}, {tag: "DemiBold", weight: Font.DemiBold}, {tag: "Bold", weight: Font.Bold}, {tag: "Black", weight: Font.Black}, ]; } function test_fontWeight(data) { textCustom.font.weight = data.weight compare(textCustom.font.weight, data.weight, "can set/get " + data.weight); } function test_boldWeightConflict() { compare(lightLabel.font.weight, Font.Light, "font.weight is not overriden by font.bold") } function test_weightPrecedence() { compare(lightLabel2.font.weight, Font.Light, "font.weight takes precedence over font.bold") } Label { id: textCustom } Label { id: lightLabel font.weight: Font.Light } Label { id: lightLabel2 font.weight: Font.Light font.bold: true } } ./tests/unit/tst_components/tst_popups_defaultsheet.qml0000644000015600001650000000351312700370701023764 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Popups 1.0 TestCase { name: "PopupsDefaultSheetAPI" function test_show() { defaultSheet.show() } function test_hide() { defaultSheet.hide() } function test_title() { compare(defaultSheet.title,"","title is not set by default") var newTitle = "Hello World!" defaultSheet.title = newTitle compare(defaultSheet.title,newTitle,"set/get") } function test_contentsWidth() { compare(defaultSheet.contentsWidth,units.gu(64),"contentsWidth is 64 grid units by default") } function test_contentsHeight() { compare(defaultSheet.contentsHeight,units.gu(40),"contentsHeight is 40 grid units by default") } function test_doneButton() { compare(defaultSheet.doneButton,false,"doneButton is set to false by default") var newValue = true defaultSheet.doneButton = newValue compare(defaultSheet.doneButton,newValue,"set/get") } function test_modal() { compare(defaultSheet.modal, true, "Sheets are modal by default"); } DefaultSheet { id: defaultSheet } } ./tests/unit/tst_components/tst_components.pro0000644000015600001650000000027712700370701022101 0ustar jenkinsjenkinsTESTS += $$system(ls tst_*.qml) include(../qmltest-include.pri) TARGET = tst_components SOURCES += tst_components.cpp OTHER_FILES += $$system(ls *.qml) \ tst_ubuntu_namespace_v13.qml ./tests/unit/tst_components/tst_tab.qml0000644000015600001650000000272012700370701020446 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "TabAPI" function test_iconSource() { compare(tab.iconSource,"","iconSource is not set by default") var newIcon = Qt.resolvedUrl("../../../examples/ubuntu-ui-toolkit-gallery/small_avatar.png") tab.iconSource = newIcon compare(tab.iconSource,newIcon,"Can set/get iconSource") } function test_page() { compare(tab.page,null,"page is null by default") } function test_title() { compare(tab.title,"","is not set by default") var newTitle = "Hello World!" tab.title = newTitle compare(tab.title,newTitle,"can set/get") } function test_index() { compare(tab.index, -1, "is -1 by default") } Tab { id: tab } } ./tests/unit/tst_components/tst_ubuntu_namespace_v13.qml0000644000015600001650000000433412700370714023736 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.3 import Ubuntu.Components 1.3 Item { width: 100 height: 62 TestCase { function test_API() { verify(Ubuntu.hasOwnProperty("toolkitVersion"), "toolkitVersion is part of 1.3 API!"); verify(Ubuntu.hasOwnProperty("toolkitVersionMajor"), "toolkitVersionMajor is part of 1.3 API!"); verify(Ubuntu.hasOwnProperty("toolkitVersionMinor"), "toolkitVersionMajor is part of 1.3 API!"); verify(Ubuntu.hasOwnProperty("version"), "version() is part of 1.3 API!"); } function test_toolkitversionMajor() { compare(Ubuntu.toolkitVersionMajor, 1, "Wrong major version!"); } function test_toolkitversionMinor() { compare(Ubuntu.toolkitVersionMinor, 3, "Wrong minor version!"); } function test_toolkitversion() { compare(Ubuntu.toolkitVersion, 1 * 256 + 3, "Wrong composed version!"); } function test_version() { compare(Ubuntu.version(1, 0), 1 * 256 + 0, "Wrong composit version for 1.0!"); compare(Ubuntu.version(1, 1), 1 * 256 + 1, "Wrong composit version for 1.1!"); compare(Ubuntu.version(1, 2), 1 * 256 + 2, "Wrong composit version for 1.2!"); compare(Ubuntu.version(1, 3), 1 * 256 + 3, "Wrong composit version for 1.3!"); compare(Ubuntu.version(2, 0), 2 * 256 + 0, "Wrong composit version for 2.0!"); compare(Ubuntu.version(2, 2), 2 * 256 + 2, "Wrong composit version for 2.2!"); } } } ./tests/unit/tst_components/tst_components.cpp0000644000015600001650000000131012700370701022050 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include QUICK_TEST_MAIN(components) ./tests/unit/tst_components/tst_inputhandler_v13.qml0000644000015600001650000000242712700370714023076 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.3 import Ubuntu.Components 1.3 UbuntuTestCase { name: "InputHandlerTest" TextField { id: tf } function test_internalFocus() { var handler = findChild(tf, "input_handler"); tf.focus = false handler.input.focus = false compare(tf.focus, false, "Text field doesn't have focus"); compare(handler.input.focus, false, "Input doesn't have focus"); tf.focus = true compare(tf.focus, true, "Focus restored to text field"); compare(handler.input.focus, true, "Focus automatically restored to input handler"); } } ./tests/unit/tst_components/tst_popups_popover.qml0000644000015600001650000000461512700370701023005 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Popups 1.0 TestCase { name: "PopupsPopoverAPI" function test_show() { popOver.show() } function test_hide() { popOver.hide() } function test_caller() { compare(popOver.caller,null,"caller is not set by default") } //PopupBase properties function test_dismissArea() { compare(popOver.dismissArea, popOver, "Default sensing area is the popover"); } function test_grabDismissAreaEvents() { compare(popOver.grabDismissAreaEvents, true, "Default grabs dismiss area events"); } // Popover properties function test_contentWidth() { expectFail("", "Content width is wrong due to rootItem not being initialized."); compare(popOver.contentWidth, units.gu(40), "Content width is 40 GU"); } function test_contentHeight() { expectFail("", "Content height is wrong due to rootItem not being initialized."); compare(popOver.contentHeight, units.gu(2), "Content height is 1.9 GUs with the default theme"); } function test_pointerTarget() { compare(popOver.pointerTarget, popOver.caller, "pointerTarget is the same as caller"); } function test_edgeMargins() { compare(popOver.edgeMargins, units.gu(2), "Default edgeMargins are 2 GU"); } function test_callerMargin() { compare(popOver.callerMargin, 0, "Default callerMargin is 0"); } function test_autoClose() { compare(popOver.autoClose, true, "autoClose is set by default"); } // contentHeight testing is not possible as it follows clientRect height Popover { id: popOver Text { text: "Hello Popover!" } } } ./tests/unit/tst_components/tst_abstractbutton.qml0000644000015600001650000000370112700370701022737 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "AbstractButtonAPI" function test_action() { compare(absButton.action, null,"Action is null by default") absButton.action = action1 compare(absButton.action, action1, "Action can be set") var numTriggers = action1.triggerCount absButton.clicked() compare(action1.triggerCount, numTriggers+1, "Button clicked triggers action") absButton.action = null } function test_hovered() { compare(absButton.hovered,false,"Hovered is boolean and false by default") } function test_pressed() { compare(absButton.pressed,false,"Pressed is boolean and false by default") } function test_signal_clicked() { signalSpy.signalName = "clicked"; compare(signalSpy.valid,true,"clicked signal exists") } function test_signal_pressAndHold() { signalSpy.signalName = "pressAndHold"; compare(signalSpy.valid,true,"pressAndHold signal exists") } AbstractButton { id: absButton SignalSpy { id: signalSpy target: parent } } Action { id: action1 property int triggerCount: 0 onTriggered: triggerCount++ } } ./tests/unit/tst_components/tst_mainview.qml0000644000015600001650000000445012700370701021521 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "MainViewAPI" MainView { id: mainView } Action { id: action0 } function initTestCase() { compare(mainView.active, true, "MainView always active."); compare(mainView.automaticOrientation, false, "Automatic orientation off by default."); compare(mainView.applicationName, "", "Application name is empty string by default."); compare(mainView.actions.length, 0, "No actions defined by default") } function test_automaticOrientation() { mainView.automaticOrientation = true; compare(mainView.automaticOrientation, true, "Automatic orientation can be enabled."); mainView.automaticOrientation = false; compare(mainView.automaticOrientation, false, "Automaic orientation can be disabled."); } function test_applicationName() { var appName = "testAppName"; mainView.applicationName = appName; compare(mainView.applicationName, appName, "Applicatin name can be set."); mainView.applicationName = ""; compare(mainView.applicationName, "", "Application name can be unset."); } function test_actions() { // FIXME: Check the contents of mainView.actions. This is currently not // possible because ActionContext.actions does not support it, // so changes to ActionContext are needed. mainView.actions = [action0]; compare(mainView.actions.length, 1, "Actions can be added to page actions"); mainView.actions = []; compare(mainView.actions.length, 0, "Page action list can be cleared"); } } ./tests/unit/tst_components/tst_listitems_multivalue.qml0000644000015600001650000000255412700370701024171 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components.ListItems 1.0 as ListItem TestCase { name: "ListItemsMultiValueAPI" function test_text() { compare(listItemMultiValue.text,"","text is '' by default") var newText = "Hello World!" listItemMultiValue.text = newText compare(listItemMultiValue.text,newText,"set/get") } function test_values() { compare(listItemMultiValue.values,undefined,"values is undefined by default") var newValues = ["value1","value2","value3"] listItemMultiValue.values = newValues compare(listItemMultiValue.values,newValues,"set/get") } ListItem.MultiValue { id: listItemMultiValue } } ./tests/unit/tst_components/tst_checkbox.qml0000644000015600001650000000423712700370701021473 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "CheckBoxAPI" function test_checked() { compare(checkbox.checked,false,"CheckBox.checked is false by default") checkbox.checked = true compare(checkbox.checked,true,"Can set/get checked") } function test_hovered() { compare(checkbox.hovered,false,"Hovered is boolean and false by default") } function test_pressed() { compare(checkbox.pressed,false,"Pressed is boolean and false by default") } function test_triggered() { checkbox.checked = false checkbox.clicked() signalSpy.wait() compare(checkbox.checked, true, "click flipped from unchecked to checked") checkbox.clicked() signalSpy.wait() compare(checkbox.checked, false, "click flipped from checked back to unchecked") // clicked and trigger both flip the checked state checkbox.trigger() signalSpy.wait() compare(checkbox.checked, true, "trigger flipped from unchecked to checked") checkbox.trigger() signalSpy.wait() compare(checkbox.checked, false, "trigger flipped from checked back to unchecked") } CheckBox { id: checkbox action: Action { enabled: true name: "check" text: "Check" parameterType: Action.Bool } } SignalSpy { id: signalSpy signalName: "triggered" target: checkbox } } ./tests/unit/tst_components/tst_plugin_ucunits.qml0000644000015600001650000000331712700370701022753 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "UCUnitsAPI" function test_gridUnitChanged() { signalSpy.signalName = "gridUnitChanged"; compare(signalSpy.valid,true,"gridUnitChanged signal exists") } function test_gridUnit() { var readValue = units.gridUnit; units.gridUnit += 1.0; readValue += 1.0; compare(units.gridUnit,readValue,"can set/get value"); } function test_gu() { var testValue = 1.0; var readValue = units.gu(testValue); var calculatedValue = Math.round(testValue*units.gridUnit); compare(readValue,calculatedValue,"can use units.gu"); } function test_dp() { var testValue = 1.0; var default_grid_unit_px = 8; var readValue = units.dp(testValue); var calculatedValue = Math.round(testValue*units.gridUnit / default_grid_unit_px); compare(readValue,calculatedValue,"can use units.dp"); } SignalSpy { id: signalSpy target: units } } ./tests/unit/tst_components/tst_progressbar11.qml0000644000015600001650000000241112700370701022370 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "ProgressBarAPI" function test_showProgressPercentageExists() { verify(progressBar.hasOwnProperty("showProgressPercentage"), "Property missing") } function test_noLabel() { compare(progressBar.showProgressPercentage,true, "is set by default") var newShowProgressPercentage = false progressBar.showProgressPercentage = newShowProgressPercentage compare(progressBar.showProgressPercentage, newShowProgressPercentage, "can set/get") } ProgressBar { id: progressBar } } ./tests/unit/tst_components/tst_pagestack_deprecated_toolbar.qml0000644000015600001650000001444012700370701025546 0ustar jenkinsjenkins/* * Copyright 2012-2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 // pagestack tests for the new header are in // unit_x11/tst_components/tst_pagestack_new_header.qml TestCase { name: "PageStackAPI" function initTestCase() { compare(pageStack.currentPage, null, "is not set by default"); compare(pageStack.__propagated, mainView.__propagated, "propagated property of pageStack equals mainView.__propagated") compare(mainView.__propagated.toolbar.tools, null, "no tools by default"); compare(mainView.__propagated.header.title, "", "empty title by default"); } function test_depth() { compare(pageStack.depth, 0, "depth is 0 by default"); pageStack.push(page1); compare(pageStack.depth, 1, "depth is correctly increased when pushing a page"); pageStack.push(page2); compare(pageStack.depth, 2, "depth is correctly updated when pushing a page"); pageStack.pop(); compare(pageStack.depth, 1, "depth is correctly decreased when popping a page"); pageStack.clear(); compare(pageStack.depth, 0, "depth is after clearing"); } function test_currentPage() { compare(pageStack.currentPage, null, "currentPage is null by default"); pageStack.push(page1); compare(pageStack.currentPage, page1, "currentPage properly updated"); pageStack.clear(); compare(pageStack.currentPage, null, "currentPage properly reset"); } function test_active_bug1260116() { pageStack.push(page1); compare(page1.active, true, "Page is active after pushing"); pageStack.push(page2); compare(page1.active, false, "Page no longer active after pushing a new page"); compare(page2.active, true, "New page is active after pushing"); pageStack.pop(); compare(page1.active, true, "Page re-activated when on top of the stack"); compare(page2.active, false, "Page no longer active after being popped"); pageStack.clear(); compare(pageInStack.active, false, "Page defined inside PageStack is not active by default"); pageStack.push(pageInStack); compare(pageInStack.active, true, "Pushing a page on PageStack makes it active"); pageStack.pop(); compare(pageInStack.active, false, "Popping a page from PageStack makes it inactive"); pageStack.clear(); } function test_title_bug1143345_bug1317902() { pageStack.push(page1); compare(mainView.__propagated.header.title, "Title 1", "Header title is correctly set by page"); page1.title = "New title"; compare(mainView.__propagated.header.title, "New title", "Header title correctly updated by page"); pageStack.push(page2); compare(mainView.__propagated.header.title, "Title 2", "Header title is correctly set by page"); pageStack.clear(); page1.title = "Title 1"; pageStack.push(pageWithPage); compare(mainView.__propagated.header.title, pageWithPage.title, "Embedded page sets title of outer page"); pageStack.clear(); } function test_tools_bug1126197() { pageStack.push(page1); compare(mainView.__propagated.toolbar.tools, page1.tools, "Page successfully updated toolbar tools"); pageStack.push(page2); compare(mainView.__propagated.toolbar.tools, page2.tools, "Page successfully updated toolbar tools again"); pageStack.pop(); compare(mainView.__propagated.toolbar.tools, page1.tools, "Tools updated after popping a page"); pageStack.clear(); } function test_tabs_inside_stack_bug1187850() { pageStack.push(tabs); compare(pageStack.currentPage, tabs, "Tabs can be pushed on a PageStack"); compare(tabs.active, true, "Tabs on top of a PageStack are active"); compare(mainView.__propagated.header.__styleInstance.__tabBar, tabs.tabBar, "Pushing Tabs on PageStack updates the header contents"); pageStack.push(page1); compare(pageStack.currentPage, page1, "A page can be pushed on top of a Tabs"); compare(tabs.active, false, "Tabs on a PageStack, but not on top, are inactive"); compare(mainView.__propagated.header.__styleInstance.__tabBar, null, "Contents of inactive Tabs is not applied to header"); pageStack.pop(); compare(tabs.active, true, "Tabs on top of PageStack is active"); compare(mainView.__propagated.header.__styleInstance.__tabBar, tabs.tabBar, "Active Tabs controls header contents"); pageStack.clear(); } function test_pop_to_tabs_bug1316736() { pageStack.push(tabs); tabs.selectedTabIndex = 1; pageStack.push(page1); compare(tabs.active, false, "Tabs on a PageStack, but not on top, are inactive"); pageStack.pop(); compare(tabs.active, true, "Tabs on top of PageStack is active"); compare(tabs.selectedTabIndex, 1, "Pushing and popping another page on top of Tabs does not change selectedTabsIndex"); pageStack.clear(); } MainView { id: mainView useDeprecatedToolbar: true PageStack { id: pageStack Page { id: pageInStack } } } Page { id: page1 title: "Title 1" tools: ToolbarItems { id: tools1 } } Page { id: page2 title: "Title 2" tools: ToolbarItems { id: tools2 } } Page { id: pageWithPage title: "Outer" Page { title: "Inner" } } Tabs { id: tabs Tab { id: tab1 } Tab { id: tab2 } } } ./tests/unit/tst_components/tst_listitems_divider.qml0000644000015600001650000000165512700370701023431 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components.ListItems 1.0 as ListItem TestCase { name: "ListItemsDividerAPI" function test_divider() { verify((listItemDivider),"Divider can be loaded") } ListItem.Divider { id: listItemDivider } } ./tests/unit/tst_components/tst_livetimer.qml0000644000015600001650000000321112700370701021674 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.3 TestCase { name: "LiveTimer" function test_0_defaults() { compare(liveTimer.frequency, LiveTimer.Disabled, "Default frequency"); } function test_frequency_data() { return [ { tag:"Disabled", frequency: LiveTimer.Disabled }, { tag:"Second", frequency: LiveTimer.Second }, { tag:"Minute", frequency: LiveTimer.Minute }, { tag:"Hour", frequency: LiveTimer.Hour }, { tag:"Relative", frequency: LiveTimer.Relative }, ]; } function test_frequency(data) { liveTimer.frequency = data.frequency; compare(liveTimer.frequency, data.frequency, "LiveTimer frequency can be set."); } function test_relativeTime() { liveTimer.relativeTime = new Date(2015, 0, 0, 0, 0, 0, 0); compare(liveTimer.relativeTime, new Date(2015, 0, 0, 0, 0, 0, 0), "Can set/get relativeTime") } LiveTimer { id: liveTimer } } ./tests/unit/tst_components/tst_fontutils.qml0000644000015600001650000000430112700370701021724 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "FontUtilsAPI" function test_modularScale() { compare(FontUtils.modularScale("xx-small"), 0.606, "xx-small scale"); compare(FontUtils.modularScale("x-small"), 0.707, "x-small scale"); compare(FontUtils.modularScale("small"), 0.857, "small scale"); compare(FontUtils.modularScale("medium"), 1.0, "medium scale"); compare(FontUtils.modularScale("large"), 1.414, "large scale"); compare(FontUtils.modularScale("x-large"), 1.905, "x-large scale"); } function test_modularScale_failures() { compare(FontUtils.modularScale("xxsmall"), 0.0, "xxsmall not defined"); compare(FontUtils.modularScale("undefined"), 0.0, "undefined scale"); } function test_sizeToPixels() { compare(FontUtils.sizeToPixels("xx-small"), 0.606 * units.dp(14), "xx-small scale"); compare(FontUtils.sizeToPixels("x-small"), 0.707 * units.dp(14), "x-small scale"); compare(FontUtils.sizeToPixels("small"), 0.857 * units.dp(14), "small scale"); compare(FontUtils.sizeToPixels("medium"), 1.0 * units.dp(14), "medium scale"); compare(FontUtils.sizeToPixels("large"), 1.414 * units.dp(14), "large scale"); compare(FontUtils.sizeToPixels("x-large"), 1.905 * units.dp(14), "x-large scale"); } function test_sizeToPixels_failures() { compare(FontUtils.sizeToPixels("xxsmall"), 0.0, "xxsmall not defined"); compare(FontUtils.sizeToPixels("undefined"), 0.0, "undefined scale"); } } ./tests/unit/tst_components/tst_switch.qml0000644000015600001650000000240412700370701021200 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "SwitchAPI" function test_checked() { compare(switchComponent.checked,false,"checked is false by default") switchComponent.checked = true compare(switchComponent.checked,true,"Can set/get checked") } function test_hovered() { compare(switchComponent.hovered,false,"Hovered is boolean and false by default") } function test_pressed() { compare(switchComponent.pressed,false,"Pressed is boolean and false by default") } Switch { id: switchComponent } } ./tests/unit/tst_components/tst_label13.qml0000644000015600001650000001364312700370714021135 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Components 1.3 TestCase { name: "Label13API" function cleanup() { textCustom.fontSize = "medium"; textCustom.font.weight = Font.Light; } function initTestCase() { compare(textCustom.font.family, "Ubuntu", "Default font family"); compare(textCustom.font.weight, Font.Light, "Default font weight"); compare(textCustom.fontSize, "medium", "fontSize is 'medium' by default") compare(textCustom.textSize, Label.Medium, "fontSize is 'medium' by default") } function test_fontSize_data() { return [ {tag: "xx-small"}, {tag: "x-small"}, {tag: "small"}, {tag: "medium"}, {tag: "large"}, {tag: "x-large"}, ]; } function test_fontSize(data) { textCustom.fontSize = data.tag; compare(textCustom.fontSize, data.tag, "Can set/get " + data.tag) } function test_textSize_data() { return [ {tag: "XxSmall", size: Label.XxSmall}, {tag: "XSmall", size: Label.XSmall}, {tag: "Small", size: Label.Small}, {tag: "Medium", size: Label.Medium}, {tag: "Large", size: Label.Large}, {tag: "XLarge", size: Label.XLarge}, ]; } function test_textSize(data) { textCustom.textSize = data.tag; compare(textCustom.textSize, data.size, "Can set/get " + data.tag) } // this must be executed on a Label which is tested only by this function function test_textSize_suppresses_fontSize() { textSizeTest.textSize = Label.XLarge; textSizeTest.fontSize = "xx-small"; compare(textSizeTest.textSize, Label.XLarge, "fontSize overruled textSize!"); } function test_fontSize_equals_textSize_data() { return [ {tag: "xx-small", size: Label.XxSmall}, {tag: "x-small", size: Label.XSmall}, {tag: "small", size: Label.Small}, {tag: "medium", size: Label.Medium}, {tag: "large", size: Label.Large}, {tag: "x-large", size: Label.XLarge}, ]; } function test_fontSize_equals_textSize(data) { textFontSize.textSize = data.size; fuzzyCompare(textFontSize.font.pixelSize, FontUtils.sizeToPixels(data.tag), 0.999, "pixelSize differs for " + data.tag); } function test_fontWeight_data() { return [ {tag: "Light", weight: Font.Light}, {tag: "Normal", weight: Font.Normal}, {tag: "DemiBold", weight: Font.DemiBold}, {tag: "Bold", weight: Font.Bold}, {tag: "Black", weight: Font.Black}, ]; } function test_fontWeight(data) { textCustom.font.weight = data.weight compare(textCustom.font.weight, data.weight, "can set/get " + data.weight); } function test_boldWeightConflict() { compare(lightLabel.font.weight, Font.Light, "font.weight is not overriden by font.bold") } function test_weightPrecedence() { compare(lightLabel2.font.weight, Font.Light, "font.weight takes precedence over font.bold") } function verifyAutomaticRenderType(label) { if (units.gridUnit <= 10) { compare(label.renderType, Text.NativeRendering, "On low dpi screen renderType is Text.NativeRendering by default"); } else { compare(label.renderType, Text.QtRendering, "On high dpi screen renderType is Text.QtRendering by default"); } } function verifyManualRenderType(label, renderType) { compare(label.renderType, renderType, "renderType was set manually, no automatic change should happen to it"); } function test_renderTypeDefault_data() { return [ {tag: "Default", gridUnit: 8.0}, {tag: "HighDPI", gridUnit: 16.0}, {tag: "LowDPI", gridUnit: 10.0}, ]; } function test_renderTypeDefault(data) { verifyAutomaticRenderType(textRenderTypeDefault); units.gridUnit = data.gridUnit; verifyAutomaticRenderType(textRenderTypeDefault); } function test_presetRenderType_data() { return test_renderTypeDefault_data(); } function test_setRenderType() { units.gridUnit = 8; verifyAutomaticRenderType(textSetRenderType); units.gridUnit = 16; verifyAutomaticRenderType(textSetRenderType); // set renderType manually textSetRenderType.renderType = Text.NativeRendering; verifyManualRenderType(textSetRenderType, Text.NativeRendering); units.gridUnit = 8; verifyManualRenderType(textSetRenderType, Text.NativeRendering); units.gridUnit = 16; verifyManualRenderType(textSetRenderType, Text.NativeRendering); } Label { id: textCustom } Label { id: textFontSize } Label { id: lightLabel font.weight: Font.Light } Label { id: lightLabel2 font.weight: Font.Light font.bold: true } Label { id: textSizeTest } Label { id: textRenderTypeDefault } Label { id: textRenderTypePreset renderType: Text.QtRendering } Label { id: textSetRenderType } } ./tests/unit/tst_components/tst_scrollbar.qml0000644000015600001650000000516112700370701021665 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "ScrollbarAPI" function initTestCase() { } function test_a() { compare(scrollbar.flickableItem, null, "Scrollbar does not have flickableItem set by default") var defaultAlign = Qt.AlignRight compare(scrollbar.align, defaultAlign, "Scrollbar is aligned to the right by default") } function test_flickableItem_Flickable() { scrollbar.flickableItem = flickable compare(scrollbar.flickableItem, flickable, "Cannot get/set flickableItem property") } function test_flickableItem_ListView() { scrollbar.flickableItem = listView compare(scrollbar.flickableItem, listView, "Cannot get/set flickableItem property") } function test_align_left() { scrollbar.align = Qt.AlignLeft compare(scrollbar.align, Qt.AlignLeft, "Cannot get/set align property") } function test_align_top() { scrollbar.align = Qt.AlignTop compare(scrollbar.align, Qt.AlignTop, "Cannot get/set align property") } function test_align_right() { scrollbar.align = Qt.AlignRight compare(scrollbar.align, Qt.AlignRight, "Cannot get/set align property") } function test_align_bottom() { scrollbar.align = Qt.AlignBottom compare(scrollbar.align, Qt.AlignBottom, "Cannot get/set align property") } function test_nonFlickable() { var failed = false try { scrollbar.flickableItem = nonFlickable } catch (e) { failed = true } finally { compare(failed,true,"can not set non-flickable item to flickableItem") } } Rectangle { id: nonFlickable } Flickable{ id: flickable } ListView { id: listView } Scrollbar { id: scrollbar SignalSpy { id: signals signalName: "styleChanged" } } } ./tests/unit/tst_components/tst_dateutils.qml0000644000015600001650000001273212700370701021702 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.1 /* Implementation note: We use Date(year, month, day) everywhere, Date(format) cannot be used as of Qt 5.2 */ TestCase { name: "DateUtilsAPI" function test_midnight() { var midnight = Date.prototype.midnight.call(new Date); compare(midnight.getHours(), 0, "hour is zero"); compare(midnight.getMinutes(), 0, "minutes is zero"); compare(midnight.getSeconds(), 0, "seconds is zero"); midnight = new Date(); var date = midnight.midnight(); compare(midnight.getHours(), 0, "hour is zero"); compare(midnight.getMinutes(), 0, "minutes is zero"); compare(midnight.getSeconds(), 0, "seconds is zero"); compare(date.getHours(), 0, "hour is zero"); compare(date.getMinutes(), 0, "minutes is zero"); compare(date.getSeconds(), 0, "seconds is zero"); } function test_getInvalidDate() { var date = Date.prototype.getInvalidDate.call(); verify(date.getFullYear() < 0, "year is invalid"); } function test_0isValid() { compare((new Date()).isValid(), true, "any date is valid"); compare((new Date(-1, -1)).isValid(), false, "a year and month set to -1 is invalid"); compare((Date.prototype.getInvalidDate.call()).isValid(), false, "getInvalidDate() returns an invalid date"); compare(Date.prototype.isValid.call(null), false, "null date is invalid"); compare(Date.prototype.isValid.call(undefined), false, "undefined date is invalid"); } function test_daysInMonth_data() { var date = new Date; return [ { "month": 0, "days": 31 }, { "month": 1, "days": 28 + (date.leapYear() ? 1 : 0) }, { "month": 2, "days": 31 }, { "month": 3, "days": 30 }, { "month": 4, "days": 31 }, { "month": 5, "days": 30 }, { "month": 6, "days": 31 }, { "month": 7, "days": 31 }, { "month": 8, "days": 30 }, { "month": 9, "days": 31 }, { "month": 10, "days": 30 }, { "month": 11, "days": 31 }, ]; } function test_daysInMonth(data) { var date = new Date; date.setDate(1); date.setMonth(data.month); compare(date.daysInMonth(), data.days, "daysInMonth() failed for month " + (data.month + 1)); } function test_leapYear_data() { return [ {"year": 2013, "result": false}, {"year": 2100, "result": false}, {"year": 2000, "result": true}, {"year": 2004, "result": true}, ]; } function test_leapYear(data) { var date = new Date(data.year, 0, 1) compare(date.leapYear(), data.result, "leapYear() failed for " + data.year); } function test_monthsTo_data() { return [ {"from": new Date(2000, 0, 1), "to": new Date(2000, 0, 31), "result": 0}, {"from": new Date(2000, 0, 1), "to": new Date(2000, 1, 1), "result": 1}, {"from": new Date(2000, 0, 31), "to": new Date(2000, 1, 1), "result": 1}, {"from": new Date(2000, 0, 31), "to": new Date(2001, 0, 1), "result": 12}, {"from": new Date(2000, 0, 31), "to": new Date(2002, 0, 31), "result": 24}, ]; } function test_monthsTo(data) { compare(data.from.monthsTo(data.to), data.result, "monthsTo() failed for " + Qt.formatDate(data.from, "yyyy/MM/dd") + " - " + Qt.formatDate(data.to, "yyyy/MM/dd")); } function test_daysTo_data() { return [ {"from": new Date(2000, 0, 1), "to": new Date(2000, 0, 31), "result": 30}, {"from": new Date(2000, 0, 1), "to": new Date(2000, 1, 1), "result": 31}, {"from": new Date(2000, 0, 31), "to": new Date(2000, 1, 1), "result": 1}, {"from": new Date(2000, 0, 1), "to": new Date(2001, 0, 1), "result": 366}, // 2000 is a leap year {"from": new Date(2000, 0, 1), "to": new Date(2000, 0, 2), "result": 1}, {"from": new Date(2000, 6, 1), "to": new Date(2000, 8, 1), "result": 62}, ]; } function test_daysTo(data) { compare(data.from.daysTo(data.to), data.result, "daysTo() failed for " + Qt.formatDate(data.from, "yyyy/MM/dd") + " - " + Qt.formatDate(data.to, "yyyy/MM/dd")); } function test_getWeek_data() { return [ {"date": new Date(2013, 0, 1), "week": 1}, {"date": new Date(2012, 11, 31), "week": 1}, {"date": new Date(2013, 11, 3), "week": 49}, {"date": new Date(2013, 11, 31), "week": 1}, {"date": new Date(2011, 11, 31), "week": 52}, ]; } function test_getWeek(data) { compare(data.date.getWeek(), data.week, "getWeek() failed for " + Qt.formatDate(data.date, "yyyy/MM/dd")); } } ./tests/unit/tst_components/tst_header_colors.qml0000644000015600001650000000633112700370701022513 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.1 import Ubuntu.Test 1.0 UbuntuTestCase { name: "PageHeadColorsAPI" id: testCase MainView { id: mainView width: units.gu(50) height: units.gu(80) useDeprecatedToolbar: false Page { id: page title: "Color test" head { actions: Action { objectName: "example_action" iconName: "settings" text: "Settings" } backAction: Action { iconName: "cancel" text: "Cancel" } } } } property var header function initTestCase() { compare(mainView.active, true, "MainView always active."); compare(page.active, true, "Single page is active in MainView."); testCase.header = findChild(mainView, "MainView_Header"); } function get_back_button() { return findChild(testCase.header, "backButton"); } function get_custom_back_button() { return findChild(testCase.header, "customBackButton"); } function get_action_button(actionName) { return findChild(testCase.header, actionName + "_header_button"); } function get_actions_overflow_button() { return findChild(testCase.header, "actions_overflow_button"); } function get_tabs_button() { return findChild(testCase.header, "tabsButton"); } function get_title_label() { return findChild(testCase.header, "header_title_label"); } function test_title_color() { var title = get_title_label(); var test_color = "#123456"; page.head.foregroundColor = test_color; compare(title.color, test_color, "Page head foreground color does not set title color."); } function test_button_colors() { var test_color = "#654321"; page.head.foregroundColor = test_color; compare(get_back_button().color, test_color, "Back button color does not match header foreground color."); compare(get_custom_back_button().color, test_color, "Custom back button color does not match header foreground color."); compare(get_actions_overflow_button().color, test_color, "Actions overflow button color does not match header foreground color."); compare(get_tabs_button().color, test_color, "Tabs button color does not match header foreground color."); compare(get_action_button("example_action").color, test_color, "Action button color does not match header foreground color."); } } ./tests/unit/tst_components/tst_listitems_base.qml0000644000015600001650000000341012700370701022704 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components.ListItems 1.0 as ListItem TestCase { name: "ListItemsBaseAPI" function test_fallbackIconSource() { expectFail("","https://bugs.launchpad.net/tavastia/+bug/1076762") compare(listItemBase.fallbackIconSource,undefined,"fallbackIconSource is not set by default") } function test_icon() { ignoreWarning('WARNING: ListItems.Base.icon is DEPRECATED. Use iconName and iconSource instead.') compare(listItemBase.icon,undefined,"icon is not set by default") // test with url var newIcon = Qt.resolvedUrl("../../../examples/ubuntu-ui-toolkit-gallery/small_avatar.png") listItemBase.icon = newIcon compare(listItemBase.icon,newIcon,"set/get from url") } function test_iconFrame() { compare(listItemBase.iconFrame,true,"iconFrame is true by default") } function test_progression() { compare(listItemBase.progression,false,"progression is false by default") } Rectangle { id: testItem } ListItem.Base { id: listItemBase } } ./tests/unit/tst_components/tst_slider.qml0000644000015600001650000000507212700370701021165 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "SliderAPI" function test_live() { compare(slider.live,false,"Live is boolean and false by default") var newLive = true slider.live = newLive compare(slider.live,newLive,"can set/get") } function test_maximumValue() { expectFail("","https://bugs.launchpad.net/tavastia/+bug/1076764") compare(slider.maximumValue,1.0,"is set to 1.0 by default") var newMaximumValue = 20.0 slider.maximumValue = newMaximumValue compare(slider.maximumValue,newMaximumValue,"can set/get") } function test_minimumValue() { compare(slider.minimumValue,0,"is set to 0 by default") var newMinimumValue = -20.0 slider.minimumValue = newMinimumValue compare(slider.minimumValue,newMinimumValue,"can set/get") } function test_value() { compare(slider.value,0,"is set to 0 by default") var newValue = 5 slider.value = newValue compare(slider.value,newValue,"can set/get") } // SliderUtils API tests function test_zzz_liveValue() { slider.live = true slider.minimumValue = 0.0 slider.maximumValue = 1.0 slider.value = 0.2 compare(slider.value, SliderUtils.liveValue(slider), "are identical") } function test_zzz_normalizedValue() { slider.live = true slider.minimumValue = 0.0 slider.maximumValue = 1.0 slider.value = 0.2557 compare(slider.value, SliderUtils.normalizedValue(slider), "are identical") } function test_signal_touched() { signalSpy.signalName = "touched"; compare(signalSpy.valid,true,"touched signal exists") } Slider { id: slider SignalSpy { id: signalSpy target: parent } } } ./tests/unit/tst_components/tst_popups_dialog.qml0000644000015600001650000000376212700370701022554 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Popups 1.0 TestCase { name: "PopupsDialogAPI" function test_show() { dialog.show() } function test_hide() { dialog.hide() } function test_caller() { compare(dialog.caller,null,"caller is not set by default") } function test_text() { compare(dialog.text,"","text is not set by default") var newText = "Hello World!" dialog.text = newText compare(dialog.text,newText,"set/get") } function test_title() { compare(dialog.title,"","title is not set by default") var newTitle = "Hello World!" dialog.title = newTitle compare(dialog.title,newTitle,"set/get") } function test_contentWidth() { expectFail("", "Content width is wrong due to rootItem not being initialized."); compare(dialog.contentWidth, units.gu(40), "Content width is 40 GU"); } function test_edgeMargins() { compare(dialog.edgeMargins, units.gu(2), "Default edgeMargins are 2 GU"); } function test_callerMargin() { compare(dialog.callerMargin, units.gu(1), "Default callerMargin is 1 GU"); } function test_modal() { compare(dialog.modal, true, "Dialogs are modal by default"); } Dialog { id: dialog } } ./tests/unit/tst_components/tst_activityindicator.qml0000644000015600001650000000205212700370701023427 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "ActivityIndicatorAPI" function test_running() { compare(activityIndicator.running,false,"Running is boolean and false by default") activityIndicator.running = true compare(activityIndicator.running,true,"can set/get running") } ActivityIndicator { id: activityIndicator } } ./tests/unit/tst_components/tst_listitems_subtitled.qml0000644000015600001650000000250612700370701023776 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components.ListItems 1.0 as ListItem TestCase { name: "ListItemsSubtitledAPI" function test_text() { compare(listItemSubtitled.text,"","text is '' by default") var newText = "Hello World!" listItemSubtitled.text = newText compare(listItemSubtitled.text,newText,"set/get") } function test_subText() { compare(listItemSubtitled.subText,"","subText is '' by default") var newText = "Hello World!" listItemSubtitled.subText = newText compare(listItemSubtitled.subText,newText,"set/get") } ListItem.Subtitled { id: listItemSubtitled } } ./tests/unit/tst_components/tst_action.qml0000644000015600001650000001712612700370701021163 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "ActionAPI" TestUtil { id: util } function contains(list, entry) { for (var i = 0; i < list.length; i++) { if (list[i] == entry) { return true; } } return false; } function cleanup() { triggeredSignalSpy.target = action; triggeredSignalSpy.clear(); context1.active = false; context2.active = false; } function initTestCase() { compare(action.text, "", "text is empty string set by default") compare(action.iconSource, "", "iconSource is empty string by default") compare(action.iconName, "", "iconName is empty string by default") } function test_iconSource() { compare(action.iconSource, "", "iconSource is empty string by default") var newIconSource = Qt.resolvedUrl("../../../examples/ubuntu-ui-toolkit-gallery/small_avatar.png") action.iconSource = newIconSource compare(action.iconSource, newIconSource, "iconSource can be set") action.iconSource = "" compare(action.iconSource, "", "iconSource can be unset") } function test_iconName() { compare(action.iconName, "", "iconName is empty string by default") var newIconName = "compose" action.iconName = newIconName compare(action.iconName, newIconName, "iconName can be set") action.iconName = "" compare(action.iconName, "", "iconName can be unset") } function test_trigger() { compare(triggeredSignalSpy.count, 0) action.triggered(null); compare(triggeredSignalSpy.count, 1) } function test_signal_triggered_exists() { compare(triggeredSignalSpy.valid, true, "triggered signal exists") } function test_valid_value_type_data() { return [ {tag: "None", type: Action.None, param: undefined}, {tag: "String", type: Action.String, param: "test"}, {tag: "Integer", type: Action.Integer, param: 100}, {tag: "Bool", type: Action.Bool, param: true}, {tag: "Real", type: Action.Real, param: 12.34}, {tag: "Object - QtObject", type: Action.Object, param: object}, {tag: "Object - Item", type: Action.Object, param: item}, ]; } function test_valid_value_type(data) { valueType.parameterType = data.type; valueType.trigger(data.param); valueTypeSpy.wait(); compare(valueType.parameter, data.param, "Test " + data.tag + " result differs"); valueTypeSpy.clear(); } function test_invalid_value_type_data() { return [ {tag: "None", type: Action.None, param: 120}, {tag: "String", type: Action.String, param: object}, {tag: "Integer", type: Action.Integer, param: "100"}, {tag: "Bool", type: Action.Bool, param: item}, {tag: "Real", type: Action.Real, param: undefined}, {tag: "Object - QtObject", type: Action.Object, param: true}, {tag: "Object - Item", type: Action.Object, param: "item"}, ]; } function test_invalid_value_type(data) { valueType.parameterType = data.type; valueType.trigger(data.param); valueTypeSpy.wait(); compare(valueType.parameter, undefined, "Test " + data.tag + " did not fail"); valueTypeSpy.clear(); } function test_actionmanager() { verify(manager.globalContext, "Global context is not defined"); compare(manager.localContexts.length, 2, "Invalid number of local contexts defined"); } function test_globalcontext_actions() { compare(manager.globalContext.actions.length, 3, "Global context action count must be a sum of all manager's actions' counts"); } function ignoreQMLWarning(message) { ignoreWarning(util.callerFile() + message); } function test_activate_contexts_data() { return [ {tag: "Activate context1", active: [context1], inactive: [context2]}, {tag: "Activate context2", active: [context2], inactive: [context1]}, {tag: "Activate context1, context2", active: [context1, context2], inactive: []}, ]; } function test_activate_contexts(data) { for (var i = 0; i < data.active.length; i++) { data.active[i].active = true; } for (var i = 0; i < data.active.length; i++) { verify(data.active[i].active, "Context activation error"); } for (var i = 0; i < data.inactive.length; i++) { verify(!data.inactive[i].active, "Context deactivation error"); } } function test_overloaded_action_trigger_data() { return [ {tag: "parametered override without parameter", action: suppressTrigger, invoked: true}, {tag: "parametered override with parameter", action: suppressTrigger, value: 1, type: Action.Integer, invoked: true}, {tag: "paremeterless override without parameter", action: override, invoked: true}, {tag: "paremeterless override with parameter", action: override, value: 1, type: Action.Integer, invoked: true}, ]; } function test_overloaded_action_trigger(data) { data.action.invoked = false; data.action.parameterType = Action.None; testItem.action = data.action; if (data.value) { data.action.parameterType = data.type; testItem.trigger(data.value); } else { testItem.trigger(data.value); } compare(data.action.invoked, data.invoked); } Action { id: action } Action { id: valueType property var parameter onTriggered: parameter = value } QtObject { id: object } Item { id: item } SignalSpy { id: triggeredSignalSpy target: action signalName: "triggered" } SignalSpy { id: valueTypeSpy target: valueType signalName: "triggered" } SignalSpy { id: textSpy target: action signalName: "textChanged" } ActionManager { id: manager } ActionManager { id: manager2 Action { } Action { } Action { } } ActionContext { id: context1 } ActionContext { id: context2 } Action { id: suppressTrigger property bool invoked: false // we must override the parametered version as Button connects to the parametered version function trigger(v) { invoked = true } } Action { id: override property bool invoked: false function trigger() { invoked = true } } ActionItem { id: testItem } } ./tests/unit/tst_components/tst_listitems_empty.qml0000644000015600001650000000322012700370701023127 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components.ListItems 1.0 as ListItem TestCase { name: "ListItemsEmptyAPI" function test_highlightWhenPressed() { compare(listItemEmpty.highlightWhenPressed,true,"highlightWhenPressed is true by default") listItemEmpty.highlightWhenPressed = false compare(listItemEmpty.highlightWhenPressed,false,"set/get") } function test_hovered() { compare(listItemEmpty.hovered,false,"hovered is false by default") } function test_pressed() { compare(listItemEmpty.pressed,false,"pressed is false by default") } function test_selected() { compare(listItemEmpty.selected,false,"selected is false by default") } function test_showDivider() { compare(listItemEmpty.showDivider,true,"showDivider is true by default") listItemEmpty.showDivider = false compare(listItemEmpty.showDivider,false,"set/get") } ListItem.Empty { id: listItemEmpty } } ./tests/unit/tst_components/tst_ubuntushape.qml0000644000015600001650000000162712700370701022250 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "UbuntuShapeAPI" function test_radius() { compare(shape.radius, "small", "radius is a string and \"small\" by default") } UbuntuShape { id: shape } } ./tests/unit/tst_components/map_icon.png0000644000015600001650000006464212700370701020601 0ustar jenkinsjenkinsPNG  IHDR2>sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxg,y;ƛqE RLbDbɕvny%Ֆ\`sպAr.KUE$$R$!D.@$09=3=Tt3" Jbu,*s]r!BUڹRu{h ><'HA䚖902H:!{=^(ra Xfn؂)yR1=(^)RR#EqL^\Hu1,;Mt4Ύh}U&҉ci¶:?UuY]=5οA{,*hoB4AK)4tv02M๝e d~+M~(pQZFSr v~X1L iTjT8硔bvvvj=֗mm`RO5;뎸ɦZOUH,s*Vi6'ٟH# |AۦPiL4}9(ExDKh0 S1- h\au*BRSi,R, ~5Ea9ZKiP,7pr_?izxI;V ߏxUj%oDu70MXN(W:mk#<0.QIAcX|_K>\|o1i4f~/6@2Cs{w àPn\}~MG)@7,'WrX4Qzntn D p:u֗N=l@mfô  D?Dmrc6̐L2UJj#UʥڝU)0(tۛA"a S*+.*Fg& }:[+8HRvRIY=tUk:qFS,5(7)WҘ O_&kWNvXC(iy-֞&^'b!G!$DdKƌcx{kJE,;7ok'{_2[)8iX3r%:Lvۑj%Cٔ e0F'K|P{WZrl6kk]>#@,-Bs5TIH<>Ll+* * RhԈifI{8 <AQ`~4ҊSqD~i왨2i]@eI H^BN<^7.=vT5"ɕF{}:ezK^|]M%,8Z{'O k{h'?Jdb1Sĕxzݠ^2yeūRp&78~x#Y%rοBFGiXN.wG~ Db狃Fv S&.*RR(Pww;hm-y.ΫoR~AtaxmC>!Mv"vQ7‘cD>O>IzjE+F]yr4 9e{')JysbLC:4Ov]_̮]ɶ T 4V ~ :5)bQ^;fR~(mʈ7փk:V^kY+Tz:|mm-Z&p;:ļpO`DJc..bvcVhyxuhu…إbv8h!WV.]"!P.?o=N˿C\o^&x؎CQ²Tx"y]+v ː,4l:w*gonO^N\矞>ǭ,p7yػ:nmű4N?{m4ȕ!F-9a4a/V'hV#ۺuGqS'_``.. F1ƁY,!yT?Kϋ9q|Ȟ<)贆ra fcZ={V{Jyn^H0?_JKTAR4N[m+tJ)UX~MkMZQ(7fP1|-n NNkP;qS /M䅠<2M4huY,Rnnyߕò-L<6sU#`rClwLfL;&5r>Q.73]`}=dT_Yj&b PG8dy 2(H3;)Oqm8 mhӑ}%E1tu{:'9?s%8-{⭭֣+aȕ R۶mY̚{DtmT Y<(`x[TKm 9^xBОiyRHDa,q=7ݘY|R\e9u,uN7摇#3yU>#dŝX߸ ϓ+vMuv ӲPjLzŗ#Z۫47.vḧݣ:J=giiaOОCa% yhD;ᧁapG.ǂe# .u:[Ba . r`@)o"`\ 5Ddʚ,~$c| |o|p Zj[ e b^w(z| tT-݁6J}q07u#Է~MWhoBKhn"v(/"_DRX'kHkq̳.BҴ~:*M.~">8Kb,Sr"~yrQC6'Q\/@}DeRt/˕)k lFO6Oje-YK5顰.(vE)aJ!] <~˞ 3Q,xM>|o=(E=ק @?1Aq~XMEXr&к|!Bv:i:fG?>CV8aO}vrN-C3@"INHn( prEGV0\YqLmĦklM3ό>?9{5ZiXq~ʲKE.Ly>yX 699 ݯApk.ariC;Afk}}st:(>vmZS @NcYX8a})yc u[lo-!^L .RS\it( p-ċ{CL :'y;Z[S+aȋ@닭 # p9)H47~t9(|\bn\.fНu V' #d&O#{'T rc]iVcI&4GָtQawk?~r7@^أr_%N63)kzk)X.8f< {6(-@q$wPq﵉bc|8ܸ8RiJ>y0'OmK=A@2¥0s ZʹWin.Y1[zwvʽuY}EX4V}9R_t4f'J>4>(A0|#}LbU=jDXDaHaDAH("B8&BbF`0(Ɓ2;6\;G1|glDVԕs w vMhROq_,טZ^GŊZ'8$yFPFbG?d?7~&?8# T*$ DNp.d{E!iK}DRw1$Ky%] iPKݯϵ1?W7gi4 %1.gĽq,]x?yK4À\sxe'܏&>Z)Ra9Ћ0ted]_2nWu_&심A> 9Y60Z7AG{>z>^q=/Z=<ߧ\v\r81G50OqţEoS.;qL>ӐO >JC WIe(&Hvd@ʁ6:&m1a4}#3:OwNŃ9}=˩gCq}p;7 聂 (x"AؤРPy#L:4n"_,1qcRJLD5> ]ƃo/1!d9ɭˠ_korl]$65zDŽZ+X!Z>%\vDLMOz/ pů|eP;%l 3\ut]s=|s=|/\vsU<%_Y2<||<#klw[> Ng^ok$žUJ^ş_~Xoz$JJuF O3xa5ZʀPjDNG:D]> g!pG%r;9^fG B<ϧxA@A@x.:n 3W>*0^ R ,@+D$k>[ַޠToPIV%W $so:ah8*zڠ4t,ڠ"f9`BC~N#m6[DZsS"_MB\^}1 Rb -8 Wpӟ&9c\mY)Nmr)|'C`hEQDt[t[ Ljs(V戢0M?x>!i4јSt]k|cX/7\VW0s/R,װ%aցsWeC#E\O&d}g^R:PsVZ"P;Ew}Pۿ1oVcA!QGqim1nj(}e,|ߧL1(Am@QK}3Od9<3^̗|orۭ #5|Bek~N1YҜ=,+Z,efH:* u¥瓭jdWuʊl11?xk.Ep. h^~Á's#e !@iّH0RcF T+jH)8c~R#ng smκBzZsg}VOba «d/12rF΅)R8I2LP:"<5s]X30\ !}7b IDATf Z"BA\xsA& m30 !ٰ۠ybӧ6oq9gyrs FCbs!|;ʂ4a⛝+75%YnQu#L~p!Ifs}F?fbiKɗ_xDWvLcwc0g3-xaUC ˡM8\0,;8\ufe &tj{''T>OfrH >tpo] ݷk7u5ZcB2>2.GkpD1O՘P[B=C : yˢT(019-]sHJz@in]?O]50DZ]RR[X0q7~>ȧNa@JA*cTK+f]_T8\rMs~{,w<('ϱe55-J^'Ր>[VYZthIP J\&b(n,"t_A= 'P*0MB,,-.AhS,N_) ðwqH Cht뗰8:ƑZBpmz-)IT(IZP5" ôs54` #GjECԆw$ױ,vXG曉UˢR.)imcg2qD^~j:`{0@&WN.K `صQ5Udk RNg(q?[E/}98%]]k.CB HC)F" )n/{1\:X(:9 C]Iz:BwcefRJ|KF(C6(I %O X_B*aY@Xr^{iZJ5ŝ]0ۖ| ^\qJ jm!?X9cIR OOSr`{*i?R`bGvHS99Y[VW󖡘*Z2q̵~k?/:C:\èZ"c(^!m"-+1I,N_FRʈ&lo\FAPILEQBln^baHfUǴwp2_3O! 9JEgWFS ZR e…h|]0lDcu՚by9C eA]0NSfMmoKJVwdPMnbg!JR$:hY;DpZFg47X>K"u@^@ DяڼL]kuR>+#2_ }Fd(4[.ngr uW %XGncZ[KVrgO Ё08<7GAOqjr)%a޾cR.(HE_Qu Bb}!CJM^r(ɮaWcB!nAiڝ ʥeXqeS\&u&"z=v7 #"ǘp7nv޻aי1V-\ntFj=$g2cwXdoh8mǏ#LgPF2/[+=H#%Zsv9 kg^9:*a/V1͝32Nkʇ*8o4c ρ7O-&W4Uıu=:$BO#;0@Vt}b&i6K 8Z#8P,2_pysMz']h}ic芈x"m!R&\ħ`It=)x2 5ZH KVal,3R? )>BEdVu pZ[#yl,X ׍?JkjMflY5Q Xe$ 5L ,J}=fzv,̖VtPxVaD(Z c"Gvf&t:Әο()+4huy* K!J>uKҼ:o_1W6oH"Ev@rލ}wr{ !ҩo'۶C;Yl*{ /a_aY']L&0.FL^/Z3laK S8+r8gDPlK}> t '!j0U@S;)R暁^o^z%#Ā?lz~UXi=ž9[0W"'/y7-N4u,YZ~q}]i&%ebc!{*YBsO>K̅y@ lLA:{1=cD+Θ:c} ֲI&pc;'?CT@JI*:wWlPP٪5ڂJvUJʳokֽעlveb+3BH ^8 9}:zk%e,)D}qwx8Lt$kј3]`N.".;sV*/WOhNW|f668^g6Ghk&zm L{p˵ن M :${>~8KTgƂVEb=sگIn+ f02HN: ;D81i  )_ۙ&Ƣ6z۰3 âZ+2/xxwz_7|̓wTy6K>ݵ#T(PFc_~C~lN!5HQZޣj8}4O^ƾ}fCda 2gD^!u?'DJic!Mo .'/-0men356.nt p cqisqa޽,--Aw^n^^fvm) KU(lb>A2A:cq}aFN(Ԣ/2@ՇE*cd \D-yrJ-mz~h򣑍Aj0*%w?<ٌ5N>z7X_^Q,G: 0 }'_bMw"do{M7Zs;^xaWXk]&YrtNd+ 5r%2+eyiBAv}}* )yeǠs&̖ S]Nu^=ݢQq8XD >҂xǚv`VIi?d2MzcPw_w֊a{=XR˴Z-n8j~׻XyMvO 9}'t68)e$g-=|GC?ЄJ2Pg4O00ҐsZ~.0(3S/a؂svGUs8//v*8A*l\O2@NmP v&ЕY Vq~ t3.J)vsRw)%wsssr9lƴm.s|a tTJt]Mv}}ߐNjހ}H)Dm؎E/8) 0 ֞B,y.pc?Zsaͥ-S.|Y<[![5,|0$z.a F33{rDG|2>njnTB z(`h'ssse\qA=:[Wج/Yto%Ţb%P91#u4f G5DD%G!$dLC[̩|.9*j2)o_fyos}Ҫϡ]9DQ< ?-%Mbn ×U';*8I>E҄a!JF< J,B[t[brN+X<}݉4jRz=ɬ{_ =,~F ~v+ARmEt:+*u,v'1;dő 0 αvC 2 HY?wL߰y]t},"Y$j${aNJPFm9T*Bt ˲p5V+ev;],Jl[HD4z =yN!>yHV:AcPLʶdd&V Ð-!RRvOae]}w{.@AI$R>%a+Bd;';.ڢdYHRXb93;W}TUCV=07QUYUY{Υ6՚ϋ3kWnU qb'RCKV RRk(W0.%u)RauZŚƷߋOhC4h4ꦴyMh.FSp Cgyȓ."BNEgqz:Koѣ4n~*Q LX"jBoscStC o]8//~n Ҙ8{4{[G Un\nO/-Y ]f[Oqr>q#7t$cs ߍB R{uF  y0B"D@. $h MeP~ qPwc]$QX])4 %LkXZ''e LCq^~gJ㘂;<) 3}2OҠZk!u澂s=w>p-et>ZmF/1Zrooo%S672;w*9C[4bp:]\Nu0-d({#Hݝ~ TGnG--;BdG[.:Ųa؎B%2-36]aƘ=GZ IDAT4'+tt2 j TgĿSjylT3&M÷7R> ,:|RjG Z$~Щ]& LM|ۯqD"4=R9lPBiP* tRªA0SC`(u@DEY6n"Fm!:±1q\x"F"*I+Ie$.K8!( ei鳉A74c}y%"<ϑ؝N?R->izNӋVɡiilKG7+|^b?}/I#pY]2_I6^>2Y ~eIPU,P,OB#ڊkCW1]g-;e~"OvY)g"dW qlqmܸ38qRBD 7É؎B찭Z68"W$r (ohk' NDFgOVM*Qة|\ /|m%[?~s4-Gm__6RJ67tc;^^o+_?CfW7X >UyϠi:B)o+ fI6 Tn{HkzN19)Y8 yWOбaIȣ2܎)'cڤ]<ɌK2&ܸC̵mdZ"Ӂ%QVkTuO!O;d6]5ye5`ykS=a r&@wmB!}~ icND"G%$+R9d5RJ^z%^z%<7o작Vۭf(f*A)S`i'A j":ϸ;RD:N"dXqr0,3s!Mt%>ф'wl]nyX zE\* *|4 ;&`!oro fR>PO!s.;dzX 4T*M._?Ǐ t']V+_e{6b}:gcc .Ovi: Y_+S!ؙ#lRM.Ic_*M am`JHONƎ١!\z-#MwGU$Hoz_c/V씫4G/o؀}L[ŚOgb]G( pʯ>R"n6f RࡼrXKX|3/q)*HdV>_@YŴbmnyq]/;\ڠݪi&n{4Z[*ՉvcIūyj֙~ve&NLQ7OIB8OpM]ue $A֏@A )j\*,}=ԷD!ptwcx lr&/[;oOᡙVXC=ժ{-b4ΒL.@:٬K:/!_YqxFϿ('r%tkѬw$L_~ׯs1ܹC!aqJ>@Ʃi&!CľM/Wk&~Ц^!Oan4Mq>R[ 4MczM^G?ǏbW+ߧݬHMv#EH͋;)n.r_YB7)Si=*;43 zKI$ G9xY&fܥqzp橳[a1ddxϼ`w. BVn]ƛgZ]eg9p3JSոvlA5?f}#,'NpX<iBS?a>BI1Q)x6@lR),E @uRUC7m|cc#dYbXᔓJY?t ˶>"ټ$Is ҙ ZiiUVL^GEVGCOx^F]DA,F hΕ+Wx7 U>OopQvkl\M#ÍgF@[A7h6$jtߟRi+^!rXZd~e.: } Q/c9qˆJvMM %$qg*'0 qt6ѓyܘB>mY0bh>.k 5Cɨ5mOMAun2*:M0LwyWr9X[[<+޹LY#& (t# zh"ƻ!p՝lU].]Z%0޸C&8AlEœEA4)}"Kԭa7Ji k!]isO!SȠ驘qnt/ԓwkxݐhTC螆3"1C9FĨ?w~7_>a`e- |Zyd.\`߾}j52 .]0 ga~nl\W_GP|4*2E i5CTUx ~9^}U}Yyٺ d@,f#|\е)lQ.ovqLʕ Jo#X,fV߃(h6&籾|Oк<4Möw Z[u2$`9eR:EiwaY>$Ny|[F=@:MUId dfOY^^&ꫯrQt]P(裏8*~%v61}%IBt?>eu|W 9&Fk\R"` iL2a^~vVen"MM>DZm4u*;$DrPS+M 2Rx~ 8nIX .y!gϞR`=9H  chB) fxAu+s:Wm]4tOr4n̰yeDpzHDhu*x&LIDD"8c{2;$qk *Bס+!L?PlwW? F/&v!OSN^{3g<3Ġގ%;J{Я=}aòZ٦1d˳lӧgI&m}qN&SF'@2.uD 4M|8뺎eYضeYL$΅z@ `J92D;GD퉭aϫ iG&%.[}6:N(]_qZ ըQ-G MxAy%ܼ-p`|KT}>R{5AЄM9:*_1׫in9!).St#Qe,| =!'IKTUh?chp_͝@ߦ٪!44.T*ŕ+Wo <#dY뷹5Jl-< {I"n1JڃH9K'i6 {Vk~W !H; hf"Sx&P Q4_A@6GB\|UΝ;˗T*izB~*֧ blaa{4g/-0 Eҹy G_9I<ٽq+qg{G(v.[,]yn6^T B)4L XušΒnթ֣?aMǜFl]`{tx䥗r=wJk海Zw?cxv)XoZh,P8;2(B~a2Uj-ڲJ g΀},9DhajXE?mǩUi6dokd{{P7lz<}(bv{aJM#{Hȵމ4M=<BXp'ω3sB s#,_l N< Nu|I*aq>~MDQ0À/Aݝ,cԓ ŵ= c?>Ma:c.L8*CL&0e_7ߣ=|C?hu3)GVe0E |<$麎r}oLav)dS^4gs B- 0L%,4t$=xgW=eǕQcl̎eefkHaյu.HT%]Sxj~:Ziz:zyW7$33aF 2e0?3K}c269qzLaHIDl7I~R`1G,f#Txt$ǡStgs n/0=X< H;8~6zRrI2}r,lO][ GZ`kmS %埰:<ڊ~boMJ7Dѧf+{R2 !X8tôfqe# >d>i.Ai4zL *iqXZ*zy~syHFB2\n,c'et d`SV{)-;w0-> BC47[eE2Nx? R~QVZr~!AXJiCe i<Ͱڤܼhh^`Q?̳|],PdFΑ1~;lFA"20 Idh1&Pu"cdae{h'2lJL]7ɤgl"ޫSZ޻1W8@2S@J)4ɠq0{F@N|i794 MhT[l޿9 $;fJ1evtm|zmz}о$ylEo]ߣ*~cƮƲ]y vye"u~0u:0;" a:%jA,ǥNK`[O#Dr^@Jfa\dT&Gv,>ЌȾ :}v1HH{?Y=-d`oB~ #%ܼXh;O0/{MvvVG4)(7XvaBj}K{S2NШ~H3618c b4 <ʭKsSdhThԋ=O18a\[=zk\ CzyWߩ=d)yY.yjIԈ ~ĉP Z3yӄ@Kcvj0P)mD 1>Lgds ju4jl-O% x) `(l\EH ]HIENDB`./tests/unit/tst_components/tst_CrossFadeImage.qml0000644000015600001650000000763012700370701022521 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "CrossFadeImage" property alias status: crossFadeImage.status property alias source: crossFadeImage.source property alias running: crossFadeImage.running property alias fadeDuration: crossFadeImage.fadeDuration CrossFadeImage { id: crossFadeImage } SignalSpy { id: signalSpy target: crossFadeImage } CrossFadeImage { id: crossFadeImagePreset sourceSize { width: 123 height: 321 } source: Qt.resolvedUrl("demo_image.jpg") } function loadImage(url) { source = url; signalSpy.signalName = "statusChanged"; if (status == Image.Null) { signalSpy.clear(); signalSpy.wait(); } if (status == Image.Loading) { signalSpy.clear(); signalSpy.wait(); } compare(status, Image.Ready, "Image not ready"); } function waitForAnimation() { signalSpy.signalName = "runningChanged"; if (!running) { signalSpy.clear(); signalSpy.wait(); compare(running, true, "Animation did not start"); } signalSpy.clear(); signalSpy.wait(); compare(running, false, "Animation did not stop within 5 seconds."); } function cleanupTest() { fadeDuration = UbuntuAnimation.FastDuration ; // default compare(running, false, "Animation is running after testcase"); } function test_fade_data() { return [ {style: "overlay"}, {style: "cross"} ]; } function test_fade(data) { crossFadeImage.fadeStyle = data.style; loadImage("demo_image.jpg"); loadImage("map_icon.png"); waitForAnimation(); cleanupTest(); } function test_fadeDuration_data() { return [ {style: "overlay"}, {style: "cross"} ]; } function test_fadeDuration(data) { crossFadeImage.fadeStyle = data.style; fadeDuration = UbuntuAnimation.SleepyDuration; loadImage("demo_image.jpg"); loadImage("map_icon.png"); sleep(UbuntuAnimation.SleepyDuration / 2); // < fadeDuration compare(running, true, "Animation stopped before 1000 ms"); waitForAnimation(); cleanupTest(); } function test_sourceSize() { loadImage("demo_image.jpg"); compare(crossFadeImage.sourceSize.width, 640, "Source width incorrectly initialized."); compare(crossFadeImage.sourceSize.height, 427, "Source height incorrectly initialized."); crossFadeImage.sourceSize.width = 100; crossFadeImage.sourceSize.height = 101; compare(crossFadeImage.sourceSize.width, 100, "Source width incorrectly updated."); compare(crossFadeImage.sourceSize.height, 101, "Source height incorrectly updated."); waitForAnimation(); cleanupTest(); } function test_sourcePreset() { compare(crossFadeImagePreset.sourceSize.width, 123, "Source width incorrectly taken from preset."); compare(crossFadeImagePreset.sourceSize.height, 321, "Source height incorrectly take from preset."); } } ./tests/unit/tst_components/tst_listitems_singlevalue.qml0000644000015600001650000000251612700370701024316 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components.ListItems 1.0 as ListItem TestCase { name: "ListItemsSingleValueAPI" function test_text() { compare(listItemSingleValue.text,"","text is '' by default") var newText = "Hello World!" listItemSingleValue.text = newText compare(listItemSingleValue.text,newText,"set/get") } function test_value() { compare(listItemSingleValue.value,"","value is '' by default") var newValue = "New Value" listItemSingleValue.value = newValue compare(listItemSingleValue.value,newValue,"set/get") } ListItem.SingleValue { id: listItemSingleValue } } ./tests/unit/tst_components/tst_sortfiltermodel.qml0000644000015600001650000000637712700370701023132 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "SortFilterModel" ListModel { id: things ListElement { foo: "pub"; alpha: "bee"; num: 200 } ListElement { foo: "den"; alpha: "cow"; num: 300 } ListElement { foo: "bar"; alpha: "ant"; num: 100 } } SortFilterModel { id: unmodified model: things } SortFilterModel { id: alphabetic model: things sort.property: "alpha" } SortFilterModel { id: alphaSecond model: things sort.property: "foo" } SortFilterModel { id: alphabeticRe model: things sort.property: "alpha" sort.order: Qt.DescendingOrder } SortFilterModel { id: numeric model: things sort.property: "num" } SortFilterModel { id: numericRe model: things sort.property: "num" sort.order: Qt.DescendingOrder } SortFilterModel { id: bee model: things filter.property: "alpha" filter.pattern: /e/ } function test_passthrough() { compare(unmodified.count, things.count) } function test_sort() { // Default is Ascending compare(alphabetic.sort.order, Qt.AscendingOrder) compare(alphabetic.get(0).alpha, "ant") compare(alphabetic.get(1).alpha, "bee") compare(alphabetic.get(2).alpha, "cow") // Ensure different columns work also compare(alphaSecond.get(0).foo, "bar") // Descending compare(alphabeticRe.sort.order, Qt.DescendingOrder) compare(alphabeticRe.get(0).alpha, "cow") compare(alphabeticRe.get(1).alpha, "bee") compare(alphabeticRe.get(2).alpha, "ant") // Numbers compare(numeric.get(0).num, 100) compare(numericRe.get(0).num, 300) // Changing roles alphabetic.sort.property = "foo" compare(alphabetic.get(0).foo, "bar") compare(alphabetic.get(1).foo, "den") compare(alphabetic.get(2).foo, "pub") // Sanity check compare(alphabetic.get(1).alpha, "cow") // change again alphabetic.sort.property = "num" compare(alphabetic.get(0).num, 100) compare(alphabetic.get(1).num, 200) compare(alphabetic.get(2).num, 300) // Sanity check compare(alphabetic.get(2).alpha, "cow") } function test_filter() { // Default is an empty pattern compare(unmodified.filter.pattern, RegExp()) // Filter compare(bee.count, 1) compare(bee.get(0).alpha, "bee") } } ./tests/unit/tst_components/tst_styleditem.qml0000644000015600001650000000176212700370701022070 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtTest 1.0 import Ubuntu.Components 1.1 import QtQuick 2.0 TestCase { name: "StyledItemAPI" StyledItem { id: scope } function test_api() { verify(scope.hasOwnProperty("activeFocusOnPress"), "missing activeFocusOnPressed!"); verify(scope.hasOwnProperty("requestFocus"), "missing requestFocus()!"); } } ./tests/unit/tst_components/tst_button.qml0000644000015600001650000000654012700370701021217 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "ButtonAPI" function test_text() { compare(button.text,"","Button does not have text set by default") var newText = "Hello World!" button.text = newText compare(button.text,newText,"Can set/get text") } function test_action() { compare(actionButton.action, null, "Action is null by default") actionButton.action = action1 compare(actionButton.action, action1, "action can be set") var newText = "Hello action!" action1.text = newText compare(actionButton.text, newText, "action can be used to define text") var newIcon = Qt.resolvedUrl("../../../examples/ubuntu-ui-toolkit-gallery/small_avatar.png") action1.iconSource = newIcon compare(actionButton.iconSource, newIcon, "action can be used to define iconSource") } function test_iconPosition() { compare(button.iconPosition,"left","The default value for iconPosition is 'left'") var newIconPosition = "right" button.iconPosition = newIconPosition compare(button.iconPosition,newIconPosition) } function test_color() { var newColor = "#f00baa" button.color = newColor compare(button.color,newColor,"Can set/get color") } function test_font() { verify(button.font === Qt.font({family: "Ubuntu", pixelSize: FontUtils.sizeToPixels("medium")}), "Default font differs"); } function test_hovered() { compare(button.hovered,false,"Hovered is boolean and false by default") } function test_iconSource() { compare(button.iconSource,"","iconSource is not set by default") var newIcon = Qt.resolvedUrl("../../../examples/ubuntu-ui-toolkit-gallery/small_avatar.png") button.iconSource = newIcon compare(button.iconSource,newIcon,"Can set/get iconSource") } function test_pressed() { compare(button.pressed,false,"Pressed is boolean and false by default") } function test_signal_clicked() { signalSpy.signalName = "clicked"; compare(signalSpy.valid,true,"clicked signal exists") } function test_signal_pressAndHold() { signalSpy.signalName = "pressAndHold"; compare(signalSpy.valid,true,"pressAndHold signal exists") } Button { id: button SignalSpy { id: signalSpy target: parent } } // Use a new button for action tests, because other tests override // the button's default text and iconSource so they are no longer // automatically taken from the action. Button { id: actionButton } Action { id: action1 } } ./tests/unit/tst_components/tst_listitems_singlecontrol.qml0000644000015600001650000000224512700370701024661 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 as ListItem TestCase { name: "ListItemsSingleControlAPI" function test_control() { compare(listItemSingleControl.control,null,"control is null by default") listItemSingleControl.control = testControl compare(listItemSingleControl.control,testControl,"set/get") } AbstractButton { id: testControl } ListItem.SingleControl { id: listItemSingleControl } } ./tests/unit/tst_components/tst_clipboard.qml0000644000015600001650000001012512700370701021635 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "ClipboardAPI" function initTestCase() { // clear the clipboard Clipboard.clear(); } function test_0_formats() { compare(Clipboard.data.formats, [], "Empty clipboard formats is empty"); } function test_clipboard_push_data() { return [ {tag: "text data", property: "text", data: "test string", result: "test string", expectFail: false}, {tag: "HTML data", property: "html", data: testHtml, result: testHtml, expectFail: false}, {tag: "URL list", property: "urls", data: testUrls, result: testUrls, expectFail: false}, {tag: "Color data", property: "color", data: testColor, result: testColor, expectFail: false}, {tag: "MIME data1", property: "data", data: mimeData1, result: mimeData1, expectFail: false}, // note that result of mimeData2 should be mimeData1 (the returned // list of mime datas is always a single list) {tag: "MIME data2", property: "data", data: mimeData2, result: mimeData1, expectFail: false}, ]; } function test_clipboard_push(data) { if (data.expectFail) expectFail("", data); Clipboard.clear(); Clipboard.push(data.data); compare(Clipboard.data[data.property], data.result, data.tag); } function test_clipboard_push_standalone() { Clipboard.clear(); Clipboard.push(standalone); compare(Clipboard.data.text, standalone.text, "Standalone text"); compare(Clipboard.data.html, standalone.html, "Standalone HTML"); compare(Clipboard.data.urls, standalone.urls, "Standalone URL list"); compare(Clipboard.data.color, standalone.color, "Standalone color"); standalone.text = "Modified text"; Clipboard.push(standalone); compare(Clipboard.data.text, standalone.text, "Standalone text"); } function test_push_color() { Clipboard.push(testColor); compare(Clipboard.data.color, "#ff0000", "Color pushed"); Clipboard.push(["application/x-color", "green"]); compare(Clipboard.data.color, standalone.color, "Color pushed"); } MimeData { id: standalone text: "Standalone text" html: testHtml urls: testUrls color: "green" data: [ "application/x-color", "blue", "text/richtext", "This is a rich text" ] } property string testHtml: " Title of the document The content of the document...... " property color testColor: "red" property url testUrl: Qt.resolvedUrl("tst_clipboard.qml") property var testUrls: [testUrl, "http://www.canonical.com", "http://www.google.com"] property var mimeData1: [ "text/plain", "this is a plain text", "application/x-color", "blue", "text/richtext", "This is a rich text" ] property var mimeData2: [ ["text/plain", "this is a plain text"], ["application/x-color", "blue"], ["text/richtext", "This is a rich text"] ] } ./tests/unit/tst_components/tst_listitems_header.qml0000644000015600001650000000206212700370701023224 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components.ListItems 1.0 as ListItem TestCase { name: "ListItemsHeaderAPI" function test_text() { compare(listItemHeader.text,"","text is '' by default") var newText = "Hello World!" listItemHeader.text = newText compare(listItemHeader.text,newText,"set/get") } ListItem.Header { id: listItemHeader } } ./tests/unit/tst_components/tst_popups_actionselectionpopover.qml0000644000015600001650000000236112700370701026105 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Popups 1.0 TestCase { name: "PopupsActionSelectionPopoverAPI" ActionSelectionPopover { id: popOver } function test_target() { compare(popOver.target, null, "Target is undefined by default"); } function test_actions() { compare(popOver.actions, undefined, "Actions are undefined by default"); } function test_delegate() { expectFail("", "Delegate should not be undefined by default"); compare(popOver.delegate, undefined, "popOver.delegate"); } } ./tests/unit/tst_components/tst_listitems_valueselector.qml0000644000015600001650000000477512700370701024666 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components.ListItems 1.0 as ListItem TestCase { name: "ListItemsValueSelectorAPI" function test_expanded() { compare(listItemValueSelector.expanded,false,"expanded is false by default") } function test_fallbackIconSource() { expectFail("","https://bugs.launchpad.net/tavastia/+bug/1076762") compare(listItemValueSelector.fallbackIconSource,undefined,"fallbackIconSource is not set by default") } function test_icon() { ignoreWarning('WARNING: ListItems.Base.icon is DEPRECATED. Use iconName and iconSource instead.') compare(listItemValueSelector.icon,undefined,"icon is not set by default") // test with url var newIcon = Qt.resolvedUrl("../../../examples/ubuntu-ui-toolkit-gallery/small_avatar.png") listItemValueSelector.icon = newIcon compare(listItemValueSelector.icon,newIcon,"set/get from url") } function test_iconFrame() { compare(listItemValueSelector.iconFrame,true,"iconFrame is true by default") } function test_text() { compare(listItemValueSelector.text,"","text is '' by default") var newText = "Hello World!" listItemValueSelector.text = newText compare(listItemValueSelector.text,newText,"set/get") } function test_selectedIndex() { compare(listItemValueSelector.selectedIndex,0,"selectedIndex is 0 by default") } function test_values() { compare(listItemValueSelector.values,undefined,"values is undefined by default") var newValues = ["value1","value2","value3"] listItemValueSelector.values = newValues compare(listItemValueSelector.values,newValues,"set/get") } Rectangle { id: testItem } ListItem.ValueSelector { id: listItemValueSelector } } ./tests/unit/tst_components/tst_inputhandler_v12.qml0000644000015600001650000000242712700370701023071 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.2 UbuntuTestCase { name: "InputHandlerTest" TextField { id: tf } function test_internalFocus() { var handler = findChild(tf, "input_handler"); tf.focus = false handler.input.focus = false compare(tf.focus, false, "Text field doesn't have focus"); compare(handler.input.focus, false, "Input doesn't have focus"); tf.focus = true compare(tf.focus, true, "Focus restored to text field"); compare(handler.input.focus, true, "Focus automatically restored to input handler"); } } ./tests/unit/tst_components/tst_haptics.qml0000644000015600001650000000345412700370701021340 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.3 import QtTest 1.0 import Ubuntu.Components 1.1 import Ubuntu.Test 1.0 import QtFeedback 5.0 UbuntuTestCase { name: "HapticsAPI" function waitForHapticsCompleted() { tryCompareFunction(function() { return Haptics.effect.state; }, HapticsEffect.Stopped, 1000); } function test_0_defaults() { verify(Haptics.hasOwnProperty("enabled"), "missing property 'enabled'"); verify(Haptics.hasOwnProperty("effect"), "missing property 'effect'"); verify(Haptics.hasOwnProperty("play"), "missing function 'play'"); } function test_play() { Haptics.play(); if (Haptics.enabled) { waitForHapticsCompleted(); } } function test_custom_play() { Haptics.play({attackTime: 10, attackIntensity: 0.5, duration: 1200}); if (Haptics.enabled && Haptics.effect.running) { compare(Haptics.effect.attackTime, 10, "attack time not modified"); compare(Haptics.effect.attackIntensity, 0.5, "attack intensity not modified"); compare(Haptics.effect.duration, 400, "duration not modified"); waitForHapticsCompleted(); } } } ./tests/unit/tst_components/tst_listitems_caption.qml0000644000015600001650000000207012700370701023430 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components.ListItems 1.0 as ListItem TestCase { name: "ListItemsCaptionAPI" function test_text() { compare(listItemCaption.text,"","text is '' by default") var newText = "Hello World!" listItemCaption.text = newText compare(listItemCaption.text,newText,"set/get") } ListItem.Caption { id: listItemCaption } } ./tests/unit/tst_components/tst_listitems_thindivider.qml0000644000015600001650000000170012700370701024303 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components.ListItems 1.0 as ListItem TestCase { name: "ListItemsThinDividerAPI" function test_divider() { verify((listItemThinDivider),"ThinDivider can be loaded") } ListItem.ThinDivider { id: listItemThinDivider } } ./tests/unit/tst_components/tst_popups_composersheet.qml0000644000015600001650000000312312700370701024164 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Popups 1.0 TestCase { name: "PopupsComposerSheetAPI" function test_show() { composerSheet.show() } function test_hide() { composerSheet.hide() } function test_title() { compare(composerSheet.title,"","title is not set by default") var newTitle = "Hello World!" composerSheet.title = newTitle compare(composerSheet.title,newTitle,"set/get") } function test_contentsWidth() { compare(composerSheet.contentsWidth,units.gu(64),"contentsWidth is 64 grid units by default") } function test_contentsHeight() { compare(composerSheet.contentsHeight,units.gu(40),"contentsHeight is 40 grid units by default") } function test_modal() { compare(composerSheet.modal, true, "Sheets are modal by default"); } ComposerSheet { id: composerSheet } } ./tests/unit/tst_components/demo_image.jpg0000644000015600001650000030701512700370701021070 0ustar jenkinsjenkinsJFIFHH XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC   C @ !1A"Qaq2#BRb$3 &4Cr 3!1AQ"aq2B#R ?T]مfdjT]}PټO?4{:\m|i CC[\]-|nkR*ʫ0TH(<.plSu~msNiM)\[P(BTd]D AI=yI8<G"*YEŷHTVޥ6<+L0DHF$o ˺,ߦ 5,3TJ5h&+6 4 ZҒHܧ~ms5sw'5Z5YY lNgF:qZك,2Wz_Uequ3:VEJ4 `#X#O udE|t=yr܆XѯcmsTԥdƚTd R:v)$~'NSG>]{uu/N)- 6AlbZAb1ꤿ2A)7z.-ez-bAzVڂI.TkVzOEK:vr[ln550~r[Ο=]J3Lբln ywe۶౎x8psFA:>,r,(Vΰ"P)DUGܯ GޏԚo䤊7"ˮrK:ZC301YUQֿ<)ieᩩvm<NXvta&u%:BT UM#Mo+z68/O]<:c:wm^ڛjY!J!`2`(DSrF-YU4MU  o3I3iĮ˯z+;fig=~^۵G+ gD;;pilKTNuj˲fR|r)(bA@F'(ioG>s^l.W5ie*%&P L$J'.V@/![BO 8}$21ݨTD6sG|EiQӽ+}W4i\WB0ԵH @(oq3ym}+E[\K7.-z$] A Ҋ{f\MگݖWيvhlOKXڌ1wߟ5$+'P|L$;J5 R j5YHNG"SYSV9E<9+O_w`nj)e,B}$R|OL(a mIrqZtr$UHُW%B *GFyWfi|#HǗ{I6:]r7V@rJ+r[l<0gĕN]s(GV.5j*S#;qLұ[ <lVs+] jC #7籹1F4Ab8Xba6 @a*5GƆPT > \gX1d&6I3nƛ؃s\$ꋝ Y ЂFpjzސYA*tr#smC]Tu,GoٓʔӺj+|Qƨ-4cEZ72~1=ynur XoqR9y27޿ %wL~$`䜿mp}~pֵb\>57f׬2G*bJ_t֋#91J7C'٩4x'H~ϕ =oՎ$WLυ:$jӿ?}KayC֯عV-rv;|ӡZV\+2X^~':&H|<[[;jP BU%V-i|FÄ>ޓiWUa۾)ZVW7q QI3nCRTlJ'z%C)i$`\ *qFǨ^N4Ъ^)/l[s@'sw9f8`JRiUҨ6b.T-J+v\[ȤP+dzIvw:C$n{|ˉ3-v{eJVIr2ʲ4nH2`NP$.d9F:>drQ|]L?KW{zT[ E!A#̹g^X9)3fJ?UX]&"T I vN=Zb!'hNQyNwBMWfNmTRr7IR;u:V:4kTZtRire$ ;|ˌcr|Q7̖(c|/\kSN"Lx)XFr5gO;![FgVE4EHH WS6 1*`Ǡj^vs\QiQsgRֵ\ފU-UٕQT#J@;82qﳟ,T2NzQdF :/+%D,w1+.;_NCZo]uM1BK)uy!B@&q+U9YӴQ? %nҭUVVN%Tv nRm5:?Ϧj_:2gkzSp*Q`NUT1,L9?id^:'ǖލ_C8t]IЙ|-_*RVAZi%i+*1\~Wgɏ:ٰFiɃcyaayyyG(k[_ 0]2Hװ};'rx3 ;g\snwf7;u9&0NT:DOWhd%/[tV[vy)ue5HR}Gaq㌾:~Tuq=ȳ'lX4)biƕurQ S7bIz64UHdynI])#Q*^(zzI; N jlmO-8>/Fi@C, ?\5E 6q:aхtdy]hl#mƜxlϟ,] 5SR lvm ͜$V6*CsqF|ʚ*;mƬiRch )%X3̚j2T,4{_iro<3Mih̞|q)ʔd`i$޸>mdrX:)//KAMT2MlUu+}1oM$'+v?uBz`Dd{ik W̚O3T'XI,|U:77'IR%+]ݡ&("  b܍R|ÈlL08G,AG ;A'$ .#/L.t1BFдjSd4i.Ron ) OLHqߣ>{iV e P;WM\"Ǩ& }G; TښIm\22ٛ$PJ3b4N۫Bio Q0cqOGd#R2S,I}q[xnMiHe-pzH9Lz‹ʐˬ=@_&|ᦚ/~QZt E 備8_S̓%adI.NQK;U3xv yIO;c hG[\tka=cJ +jUxܱܒ8SISm$;GeW. sFSOmݪc|0?%[=Q.Ⱥ5z|)hn3LQh Ke /AI*#ɸ3vY卽;4^BlhbRX|v:k~MJ6ܻ;^KҾwI+ۭ:1MEBU]'ӆ{ÛMEkoI${`Vwo89[њPsi{[t JfNqZ O?g-ej]4r:eOQv%*pIHcw>_gg:.j[/-khT e1O,{2Td޼weo{J[u򛒉Z ߕ?ßÏ*=UL=ouA[6.)>zbv.o ~WRCxl2T?Ӣٮq)kSY)P(mʐ7g$9tct.ی>K*IqFԫB iq21~/uZEK)嵿2[f "*N|x1{;:R{H>#f6Lz_sZ$Au 'mǣvEU>K6yutz\(Uw he!>4OF9˓Jtw,oI ֥:ZjcM;c"{`;.랢 A֔jV" s9t*v|QJIAz?L :O1k^3w:0ȳkR1/P^CPyD҈6rq^4Sżcz]zWi%{e#da̙ߜG6NI][?z)ZMZ4;jQx ɋiOߣ"tR5\΍CV\MTK.4 WoxG̔V ٻ<|f-oQuFoJ*xMe|=*&O H 57~x5cZc޺Y[uWWtVgwm^ڛ@"M6 F?zM,v,Z-J裠҈UIV#0Ri~AmY+[C1$x#G˜:/ї"rt;vqNʝ&[oQKSur ǿ3yRrK@J,.ɲ6y% ] obx8a"!cgkUhקE*:Iě|Z;۪֭ՠYUNḑ ǸFG:r<(% I;}1֧VQհ哔tX,ATqm{5Kr˱ O0/:Vj- F6Y X-q}0WPN|K7/*3V2#x?f %*ː P`B6+݋= K9'_ȧv )X?\Ipi0vduciա7 Sr@-ßnqT> Aa@>p\v%G_aFTo0vgȵ)ۑ596fwOqqtsԬfT0tƈF>_"Y_@1fD?n0j2~u| ՔIq= S+Lꃰ)S1dJ*hԂ:04b`#ñʄdj{~ne&+tH-qabߡjO)+*S1xҜk ) O$[RZw⣓V2x(aKI552 ?r0IG4 `XH~¦F >4oͩ,P@`aR}*76Z-ǯI9'|T'|񴻰4ƝL+v0?BZamH+ DNrNHڢ!ZAfrjVm1Τ6`HFU&9E*eMcuJ1u?7_8|ԣJ1k7^OH'8<핆<`a4R  rHpY2-Ќx?jMuF퀖Mh mT|vzцs*4-6{c4跖xih֭"71{9R<ͯ*` xCHA)s> :lU7E^3-T+QFGߞ# SI rkiu\ζTzip)"ǗHvҦ"7nswoeS&i1H#s>\|:|uŝ>[SEFH3\ +ZfxG3>^o٨Fޥ#UU\YB'ʳ$F3G4 xc QZ~'I~'kPmjIP*;H QH F wU$Iü첞[ӤU!P?cQT,ܕ{#ف4SNOYR7;c8v(+󮛦6 hZuS Dy0G}<~g%B臣jJT ؍^cY>}}7p? 3uKNҪPMݻlU 4wc临y2g\'2slD\ i*tqsTssl ]ֶ5nrQB*9?#P?1~Կ6_t/u-CAMG$: "AϴlTw|ω 2ȳWi\Զ>54؝D#J$IN4T_ԛì,&q;RiTҪi`Ycm| 9tv1(~?~$UtŮ[`ӠPPDǘĒOs;|@iU9k$AGHf>uAvXљI[褣gWhjRqP(mb6MtN);*?zs6ee^)\@Կcڡ.joL~$?QJ5;Ďgygd$~4~<l>:RW"vBЇ`ЮYbA$STb4k~v֓uZlj\2]m I;&q| JWTfBb<E'0>kJG?,'^>˕Ϙ PA^0Jp۷ffբ26ũjیbZjP "YtqbOR$qxR02Ǖ.M))BTgi -H`-vnxbmӶ4ęi;Z?%*kH=Fvۏ Otexx7խcm@mSE}J@Iq0Ŗ'uK/N]DHsհ'BIKS$ 'mVus V*R 7R3R!Cv'-!Қנ $ٖJ@~qy |t_EI40o3ammQp>^'&"q|S56g:#a˯ydm7<]Ay-r䂭iؕJc' v}t`|.Mbda@v@8ByRz:Ӽkqp멑ĝLvq^LV̞z< mRA+y$qiKnz&(ZJOĦeAL0F+$@8SI6hkqgwL2ʯSB*Q O$&K&N:~,˥z5Tq]<6 uA$5'"DDznr24ޚ pWA^p?yYmJW<|qRiڢT6׉VUj7  ckR\ދq^6vAZH=f874K?nKGhW,n֩soRbCI8!UT#@$p=R\ZqKMQԕ-9l4զ@YmPv~_dI3@xp[.,PPRJmJ+A7ozcW*š i5|MjO8G-W\ͺs<ޣ% g:aF{oRK%>MLElQJRԃJLs]b87 Jz:[?QԴjuS=-|2KRve.:%3xl%P*+0mԑ@N]77)6gH%dVokҴ[[er)}!:X(ƔJJ_Sީ3[&-OEFTebQĩpN鿃:ΜytmSJԱ^ gB}Lռ$HfՋ主ο.*|EzK1ϦUz"ZiӪU*Ux.[Wҗ`gů5Quo7"o 1y&'p#ӎ?Etd[!>\ .Xu 8+ cqW;=m MMk'LRVm$y@gC\Zu ߧ򋚙+vDCB?߆?-_T~mfN֝:RbzqߖU/}~Uֿ`,!&vW0y,^~-Pw%cqƴ:=JօHR$~n<m ա {|`e+V 'LJ+۶&I >4 ?}rwf\FԗPXP qEN g%WV|l#.Q5=Fyaֿ@j&"`zL'~ $ юRE㏟ZNjr C~ܐV[O8zdz"`TYt.xW:L?ˆ(}0QnuГ)j$KT\H{hdշam $_4`jF-TNκhF0XB$Oo|5:V2uJT a++P;H]K]=`5(~eƟ} 0nGYM Iff&5v,QObafDș<\gZ Gњ6@%Wm{kgq$8ѫrDԥvtAngqZ`RNҊkeV./ƠA' 5q?iNa1406D<^~Nӿ}I{y5k|EMrM?ml 2,.^XTIpa!v>Ĝs~Yv|C:o02ڄ=Gf>">"nLI`x7xSgtܧ4s^U,YG3~X91;wVF@]K٢ҡ54Hml>xx&S#j[S ⅹjP6< o}Qo!oТpA[jd0D񍸢;GH2RiJj?8) m-x4G 6w~,\6Wjk5@AX,dIϊ"SOo֟o`tص%,!>t$\u1xSkjtA}p@uEҹ_r 7lq S+i=s7:iҴ2m E4Uĝr mر'Me=$Ow.DKg{!D^*"MKOH擱mЙJN5ПOEsY0Kz5XԤ;wXT-$A^Ζ$'8L?զQs|멫5Jw4;Q^p4 |O(q+%­~ 2R 5Ibw&vi>.G,Kz[ KT Nc+2|]#B;QcT,lZ <%C8V\Ə*]B7}o131rKm q,f&Nc~u);ƔVw6ԍWFRL($L{%)GgJ UK"91KtS-4$f~[ZۊՉ"O Y>I2N;aђ#4U3S:AHOtE&'TqR/:` @$qeBJ[b2ǐ03W)*n*9cebrRl )3xƄD3֥QТf}1 ]WTU\*¨ }SBVIIPU$q; k #Q~ {qJVg4EAzȔwrZ꣱PLHͪC @ O”Q1(UU j*vSiU)7&ieolhT،x教tb]8dfJPmsc\Jع)rq0AR 8e%EZ5ʍD N9۶Z'% P,vߜY˔& =39[tٱE%  1>C|UZFK*3 05amܓ'1u~XBXUy pm&>))7itY=ss](kH#'i 5 Î9y5izӄ[-^NwjrJ}JnC>A36ʰW4aŝj2ֿz+&X4ڿG#nh>*ZEi~$S;T2 0=(k_o<}3:ҭDm/MbHbo,si=vɟ(%hҹ4Ҫ@#C%eJ;%KJZ#ydK~m} V %m?F5&evζ} PF5΂yc:0FYxSs/7qMA`@#c|O' g^Hc[?oԸmEZ=5cMuHMq26a8&xY|wŭzQzw[g9M |PM'rZDHv˚Y_O> ta[o;$w q<Ǚ.݌⾪/daZ([@U`N|sF\cK=\:.Z] "$2q};@>%}wqV5( ^06Q3lte|k zU4ꬺå~5ҬZx 6@uf:sW8I^VUjV]!Iv,=O{6䊒j:KjЂBxU >6/d{3EҔm,LaOر~s}ΛJjJU֦g6e5p~A$#>I>|^!׽3ҭmu[.9 T3|iR:i#2d忂/g4Jyy9t}K;Q4T!6 kCucÎQmɹMRLL|t!fl]?t7Iҷ VL `7ٟ$;fYul.5jb`%b(kaQ_an#WT&} T&3tXO5 c~d~tW]S\ȉWȏ9V~w`p_r"H@ oa T^'-hѩj;J "RD^0nIHJm+ѪR"pK2 T@%b~2ļ7R -zn5j{xavtcMw&g+Uo@9I7B%hlMm :2fw Z%$,b@'M僋c]Jf< ;ayۊLĐ[qًɏ*/b;'G++^S$I<>}\PKM@!RY~xSߠZ[Iq޻aH<؛ЉPPO.Ш㒴. 8 Ϻ1BFmR{DYF7ZMQHD{IՎ 95/f q&? u'OXs}T 1'f"g1pf baT萩,@^-k^7\LsHҪ@TQ;T8 j];v d.l2Bi'o|@bRGDǧ8)dԩ%JvES+ƒWE:@*>XGjk >]zdmJx=QsOfJZ43>~bK%p`$K}$FI{5dTRqDlg"X?$N#+2ĔmlJA7_ASճ `SAB@f+؂QfV$8ۿ| 
y[mf{ dukjObccD}aԨ?|%`A+$=73ml(ŻﳦtP[uw{'2EE† D/taF|3J2K]՟.J7CuW.zƥZItR+1QOC%3$k*n(>Tz[.5*H$yǩbrצy)XfUK"ʒʭjMM1ZbC#D0$$3d<2 <4˘ԩV *G$Fѿ֎FE~èdƵ[;AV?݀H|0f7COs|1)̵ HD$HٍBR'j4E;!['7>ȥI7H4gM^0N|f ,wǿgFfW_=?5jV٭el fc rۑ9q)5fȹ;qz9k̯/+ R>S(P mcҫ 9>ï߈:+PMV 8Ig^<=|;F뤪g7mhR.VA ,{,Z zmP:AvVF`{R}ԕU͍\!^[ZI(clu>t~t>$ur42=P$ɝ:{s_lon3gYwPOobX[S Ӑv=BMC?3zD_ O N6l)8e_]ENjiAbNÒ@#nI#U3o`hZ QdL tđb*J:^KܸUQ)\Pj)xHRֵ!)WpxW $sWNa\fV׶Wv~5JtjejYiQaF\mîB7Wju>@cM^=|Jң_#I9'k.E5J0hb^!yc}ZW P$Ș#evt[HӉi=4[=LG]kS4VA}A! N 4i?={Ѕ vW휬xj>z  Sn01M -$GA71}U@`A[ @(]ȃ%0M;t D`Ds!xZZT[Rsv*KyLs1냔z^.i3mе N;q2dv]SI'hC#3roJh@NV; zj)j~\vrZIE˴bFm8^@QGU4Ȓʵ6<܂{S*iInַ4dvHD*62Y}/UV^ŧU4c̘2z(r\V2Oq=&ѢX'Y'Ż:+mVjJ,"BG9p\miV[}?y Jxά`<A#N)̍8-E.L*YTTUP-͢hŪi *BKNI)Iǡkρ}k7Jd8MN:ЄR@$s{&V:gF\fAG)C+!:C8D [x{c:F<]ϟll, u㼨5adbațFvwE̷1[Ugc@3dG.:X}3 gTW-U]pɡh^CZ0Qu)k.MHZ־z,X(K!B OQ켓rI{ٚM.߿"JORrT*QӦW(Ku0yHfܭt*q\y4~u_wyV^&uN>riDG%? ijVj jwKգ5LfA buY̰. AwwauBJ73D 7>)WF}?ww}@iUp w{q+]#z:X9SUV+ ;w}M JoYwWrkj-XSbGA:xDp1J QĞ=K\gKqV ʽDZ x2 \[<̤u3j*%Bss;c%{3mK翈= ٍk-DvQCLwzfu&3EwgpW.$ir'cǦXjV[V ,qǎvWIZ ~R\iTfl4V`.jd0ؐ=);i)½L;YvB wj(.IPA!L7BvZW7ӢU*и<Դ"63`e?aSè'q#p;ؖI"Jε+Z5)CFؙͻy[k=U #Ib*uSzv#g$@<c6lR(FTʪ$ۼ\cf(G{MZX[a)Uvه8:_{1hEz(0 vl$p}0.h8–Taxʬȭ zK*}+TW]WӨh'zmq@Qqzk΀oL`v9`1nUU RٶpMli @IR UB@3}`Jо⚨b ƨ$1ig!In1lRQzUIcL&G'7Vr1Є6EW 5xoYlkg:Pi88h; K*vBI<3[^)[* &N$r{cD% a"[2-lbN/"Yo#L鰹Cً?qGMrx[lPlF̯:vKM&>[#SeJN e}j1퀄5d]t6 H٢#|؜X]lʦwtqѱMXzf ظqO*#{6ijUjga3R4KaP[R=xG4e%,i+kBT3FC*O;}0|\q5h-+0'$rqJ*lI;U 80?b7ֶt*]\ZtQeaBseC)(/} )ln0.[`HN0GcɺC3~F?Ц[e6ܭj(t#{|e_K'',C,K$B?/R = "$qkiDQD$YժHO@sM9G'2+ԢS|-LڥůR@b[dx4TAG 7NWȇvoOF*9sjZ5WqNT5)6KiSOEJ/o0|;[6 cNꐩZJɦTpUvZuFX:1`M>UՈ̊:sڟmg֤SdWjBAu,1>͞9)fEk UUM ;}Ó[7|鼲׭nS< yA)&ݫ1tUO7q;O1&Rj|m5c9eW)\ѹhDUe @6BGGI\V~ZήR ȀFFߩ)%F 7'4P %)E@!VHƸri?Ό: +NfPj  1iŒ=6[g;οs卥&Z5*bP S'[2u6?WfL>|IʳjOpMm>aƙǎ~3ɑEtw0ƿGFe O.KjtVW PT _"}3Nl宬_3RjU(e"8QQ3zF=E]L_\?_VgkV/P;$"L'mayenN+ힳK37][EEkRfStRI!*_8,ZKyIZ?0ycWjE:cTHEբOc[DDGng1ν }6YLx٥S*I} mɟ${}.ut+Y_fZ2 DNyWA#OdwXfֵRt"ՙ4&u +,O? s.4ELҝR** ppxiݜV]BC;-<Q4.UҘ,Rw;JYҺ1)'n⛧f$kU=kE- [$s~KT?1tFS< a٪xtþԵTXw|w.yo^q:uSg#uv1(NNx%u~OAjlL,kFhLA:ב4'يG,2J00Oedi4|2rHV oo3 V'OҐK ՛aKHbhEֆ\GbcJ:]dnszB2EcJACLv19vsTo*RH}\j R.5#C+H'Ƭ9@5 c#鍑̚rrxc0%K'm+"NR_P( @،E={%9+ JWuLC0q<L& 4 r?/^%._7+/ O0juOu:f*I$j T>q#I،Tz"}_gwS'F6,%z[eM޺(;75\%j :a$q#RrqPPyE_R`(Pc+=c0yӋj.322n]=m2ڵD)ǣ<-G'$$ei#(1ZfKr]beǖLֹ֛#LF;ۍ\:d4gMtSe6y](FF^i!vQsgϚiSZzu.,6Z*5B@ULuH-'/_ZWo>Vji:EJj)RU~f/HZq33KKlގRVJz:SS$LPS 7Em>Z-ye=zZM4 Hۏ>r{2gGXԴw!jPj7>+RԥY%H'_O9|~l ZYuVY{̾Se{P[R6]?T1eX'O(F\-\~ӟߧ̷OIi;~cCIN7dBec+ȳ,ًD)N88'B2IS~w/ez(ѹEj˭PvPeGVtt)\=JCƑ+1ˁc#Zf9zAv oY%5_U _]KgYYu{{gYMDR *I^ ? xK_p8+W-mnT H@~7Nj͂qqzLO賺s27 M]֫QA`$Oxl5xOa )57U[zVjtNK:7;r=arnQ}3{l_^ vʰti" 7 )hs9W,#fYufiVJ*]Ju)> T]'td*`gF?ɉsIz<*̲K74RC̸ʆ`V"--QZ]fw<`m+k,^¦M :^>W(ś rIZt>Z)W†ZSӝGmYjb['{$:vW\ZVViv¡ 5+|oL"v^y7 qNj=_:K8\Z[]T9kMlOE%:H\{MRkcӦ:4BVI,SHL25ǣLRi&Z^O QL@Ɗk2.,ëZ$fpRB5P|BҡbdzH_-5Ӯ>N <(w[E(SJ׈ۈ+܎'|HSVd`՞9͏\tX߈]-uC1߹ry#M.|R_TWEtMdl!Mt7U5O`Os%p+HLSr %wo7V7Se32˞>8Af?CrHYb71wLhS }drz bnjSC$8:@RcE`;=ppmq ar;N*,nVF.2]5B)mlKs>1dܬ"g#Bg^*=:F2`|9dihR&)0ۓ$s8v[ĕF<$|Νu{Ziw 0ST \K(xã'iuq&wӍ1rSpRs' ~<_q:tCTԱ4WϮzO*GKnJۀ9cr3cM_gGι:_܇`ɜTzQ:ſ|/I:}T~qsr+Dq^GԲ=5ab j5Gb5 Oഎ|)2>\jhP%VFp'8~Z˩7MZGGiI8? RQT$,-ANSy1)r|9%*oUgvw7kת[Q-$9?rډtQ~kd\M}w9';m\BV1ےd~`s)) _E6$6=Mq@թBj`ͫN?ʛ?cqWWFU^]%#ypvH7>9?jBI{ʔ^V HI\ c5~΍Q`>b\7^Ԭi G?{]v(Gl*L.Q4 N*Q)9܌*Svb)>nj22, zoHxF6bsB5M~O%)"W W ^( ϴWNݙ%O=ZAar@A$qR؟#L f/He`8O=~7S='*OwZ.Rp"8F-wgʚ?j |N>cwOηU_fޕZUPH e;b?\fqlˑ_vG}Ns`$HeuQ_VEo o($,WT%:6{oV*>1e#|K_:GW}f*07x-I*v?7rQ%9G'|W?NS~jT,VA@1?ڒ]c:_RgRC)ʲVE7օ!Ղ6T%]#2dA6:d%̭a=+pVM4fRO',^ro-{ IvTB*`I 46D&w%7gDdt 5njJWI[&.}GTuvpxooD CiV"BvZH49Y( ؞UkNkWI4[q;w0;Ygu_/ԮrZ-zShP q3<m?uMQ35g/iN u ::K EJ&q񤒴4ݺ9.̗3BQY`x=瘟~1ǙsA%&qޚUu/fmru-16gkM^QEvm31w {`rE8l59&uCEņuwM*:7"xۿq<5./w|l{$]aom_^T Ƕs2`{ax&^6wUoQyj&jL&b?,G1_Ǻ8rΈ=K]ytmLT5A$2,@=q8UJ͒Y0Wu J?xIqFNeUsI]VA>zo7 w6=:4UH2 L>.΍$vl/k CAH}uL<#M4ݨ[eJQ,dGƖPJ_Xu al݆ZF7LIMR i6ӯ3.˲o[[դ*arbT'Wq̆7ϓ'<TaW:pEY@*@X Mc4z),۩P*G|6Rm&FK+!iP7 D8tʧ7֒PV$o?_κ[*jZ``Al'ɛR6( D- A*[GGō9K%_6.VB1ޙ油 ۺ/a11 Q`hUj ^dI lO+ E+D}@2O~7mB'ֆg8l(F1I3UV@Ivcn1+{йKBҚ>)L"^\[k.<6Zbɪg]$Dnn:71$}Ⱥaq1Uj2vcKi"8ZrЗ`JeB?Vn`)`ptpZl.̭^W rK7zc޴_~7M[da_OJRSnumhtd$'/KZu-hQ4mYP?3' WГQLo^޳ҪaQ=#O"*95t+oE`iB1Y[c+Zz!ЫE/L/^Sp*S, z$yuRKv|[1NZtƃD4H?\T1:J55Azoǚ-̙!4!-^QR dN2懶ue;Ga۾ɚ#1sI$iZ uR l)U5jieHܑɀ}s.΄rG{M5Cx•؍a(_b(Kj9cFhuNfO'\f;T %EfMQRdU vO㥣v۴t^סQh={M*4imkPy ((&vi||'43A\uh,55/IZ+G3`<*iG^OGzG5![ZXp<2wQ T*Ol9=Bwi5m[m;ۅj +<|Üi.*ozk:ΐvoK\ܖWϊ=<C~;^,,ӥoM?T&PӹiռD1IqŞ6_ϥԵi@Ol?vg?$%]'cGAŋtOT5Sp&V=Oe@Tj,`7'9i-APStU2?)$|5SI*u0!d{"vȾBt% l'(M4KލD@3$ls՗U䆅ETv'vTn>'ֿ3J:zPK9"NC*ѫƃrUt'¾>z{#i,{OסnUc,{p3;j-!F$fܪG ybFOr'(rTL (QF Vs.LT~~zOG[\ѱI&iN9W ^tFwY g^.ˊt:-C8ө,$3ʂ[ NN?7j^s׻V6z!̘ێI{P 3=$bc*^_̱W*'LqJ. jL?}eT-W riU+/VyKjWn*$Am8䩳cQkmܾ7jJ]  jvΎePheO%k SUIz㷉KG=ZJө3"ԪH,F~d[nm5Ɲe4n^ ;ǩ|PV~d,)j޻Ğ7{VdRrV[w9m* 4c2Tkۮe*6>gkRh,oQ=YR7%Uf6o(P*yA+\4k)RԀ$~q.Gv +^ck7iԨ 5&9Lz~c1ˍJX$z{pڿ,4jڊ/`e "?8y#ZlkZ>T-kH)2 m4I]z7qtC^yOP47n8Rj/Nv=6vP]ybO6ޖfwWR^`GQ>=ܗqÌt~3Jfe;m?\l"h}++ҋfT n d2즺Ӭ59VӍЙ=ܫ-ZզQ@}A&]$B#c2Z&֒ԧZRf`Ω)۝bzldi\Yڕ5 N;QZvmd`DO EP, Ϝto㗰zKGi;*)5k Qqn;kCC 5:5HwRj.lUBWS`+RLroSb BjU oe}|"K嗅W@MGkVۊAu_$h֓W6ZZbHX rFݱ@\ 1QW;Ѡ#xcLjo-tPQnZ,w8I@ZNߦ/+\EM%ޥJJ4rH n2+u0_5iicܞ?,7 #*CQ;ib o {'HV&4HVR6ی>1M]QU f֖N SXwz +Z;G䖅)^C#_4 k'Vѥ%hm?7S)QA>i=FT+OQ\)jM#] j )Uzs0Ui10LD`=㣬EoNK(M@TL=-іR|O @~cyh( =߰6F7E%UM oXSEt =fZ,yoMc}pVWǫ7扖QJ6TT:U*D Aի*UqETdU v-DsUvtEU๡ `)gor0y+Tz3uCP^RNk-QjDZd J,gVڊgV?WYCtKծڵJqTl`i1r>O>FPI~wE)7{ViR=4E$:tZuףLY7X-JaٍTZtJEedAbIc`#m"(zN@񇶚m= YzdR`[R$})wN\xfYY\7>h[Ml|nLz54 bN1QvU(Ui( >>HZ^9]f) lNRgy[;ecLP4z4:qV+\V@1XۺdȔSȞQZVc2bDaLLj=v6^$Q9ռNn CQFX.A}_KZ`M6\jTXb&@ s]|pI/rSY :BDKMUi+*LNyᨹ 80pQK:K {b)Zx8.LՐ-Isq3"nj¡E -~T8'TLJWӤk'lEKkŇ4:JH'y'h`wC!P5"3mM/B='UҜ1tWVv ?^ WZU(]鈙mL~.-鲔HgTn#V)718 CmT{k&'Yy'l\etEmHBs9bB)-QmF3K#ajlt[*S%"N4PW-V×APD h MZHT`A߉$luJjwͤIUv""xJ_cv\ )qCրOĢԝ(eu]!H\$QQs[RYtɻ~\_ an[3TWovjت:t:5vǹ88CiiҷTPpL8Y-=;MHw 'W%5KnFjzfbHGrhaɻY;Gh{GӪiUjpiV#p<c^6S^nuB`BZKUZY[a#lM^5 @y,O`H?#"EGkucR~*e%VH2@}Lw*+C]KM'j:3WMѱk(mLy IN8:il6h- T, 6vZN>(_*3(/%Dk-Z h;q6oQ䩖֢we䓳oЕ j.`TFNܞ? sPsnDl ɼkԢe*hj$p7v8lU0` LG=pi5yb.,ҋ |aղI]IԵzT/(_[fRCrKncvуˊ)N0kjՉMzGvN:td߾7cMv-( Q]J89*v);WoG&Dw4ªm=Lg EhJDJBiݧi'6폔5g]t[;c.[zT0p F|iٝG<U]3ugP64:jAr!#F?I*NL/?}^QzjVc &I{qĒ2M6z~ }%5  m<]8?~?oKdcdU,YYX}T'K$~RЫdmK?MWE>'8ɺKnk^r*#CR%V3:.>x9MB=8i.|OYcK'eſi=EZlav*S6< >ݏqj^kҴJVPX#g8B2pdJ/3D-5S>)"yc(L>;MhT Qu!4ثd8⌯)49*Vz3xSM +dAQiՕ_21Rޢ*Ig!$O`E:Zc}s'C0I(:N1iٮ1n5IЩ= a6Jk_rP]TR`&?Ƭ2wei۫dZħ 46# „c;z=vM+y5&hS䎎ޢ7aΣ ev] v qsM^U1\Ϊ5:  }(u!+[ZS 7Nm^Fm]Ra;6]^`ZB}gX."AnF L[2pE=MQ'cމ:JI-$tJ'be1~QhuoBW JAں'/%楻.O-LFE!:ՠ\3:8cNT8auqs(}GZlzƆf}}`Y;MGk[CywFȩ4}TQ>ST4YM(73e>Uu"Li+@F.i{41[YxsRvo &ZT*1t0!<6&+} \daU mb~ƸA8A[PUP}'s ->lNR]Pm;\[I[Ȟ¬jW 3IE\<"{`RP]:NH 큭%c:5 'c-a>[z X&Iօ,e-jRX0?2hp҅zuUΡdc_a*eɐ5/{p@>_-;_Ym[e6ٕT+v:TGiLnO\qrxٱeOk.U'b}㤭:tԭJGt)!7Ի j;`T]+ΨfTUM G̘ŗ ѡ6G泬)ְQ5"['sG00Joy%%E݋9;}1ʒK.*K%ɂq['?}ԧD_1m y)Wgmʦ3.B~ rbMDңq^T)LH |7'Z&h:@IP>~ 4&ǬfUC,A }ԗYy7Nf.hT|Vt_ǾC;[.ҮTV>J`pc%*0괉dREULOͪW7e ұs0 J2KX6jި%Ӡ w0Iulب,f $BxEsi7*MXTM[ _ɓ$ ̩TfJ5"(;;D㣅B2\dKsQk5o=~odx\Wf0^UF'tZYQ*v Gi *.,S,/[KZՒRWy98yV#4xy>,u',*9Qd-ގ_ni4u,IcP,@0ToM Zӗtp aP@3x&x׳rw*Ri\caxcJ7R=`O+tIiдni\: 3mpn)4fRDWW5S9u]]U{ZtK]RkCǮN3r<8ә^ZՋL>qe9:zeeX֧Qφ@ 1mErnkׯLQ#l;[F:de)+EXiN5ii/bB r`7'4a3(ު3s|T۠Vjt@#'_"2Ϭ*ٲR B#A;m{wǪ[ d\uxֵ*A*R|F[#QW4jX3`1 jR,$12BޫBIƂ DF3N5m|G`@<϶7cO{t7L0좍0-Ɯx-u0kji?5]YUg_] Jr=qpUgK;mu!lT*)izY"IY08cqVCR:T "0`(TJ bF* 9Ӭ.+:{v94 7v@<~XE(G+5 ڰ?Q[FOvF HxO5}0B R=v]Qz$iFko cc* ԭt> RKVNG1cbh`I >qZUFӿدtD~YIޜ#i |'U*bruc )労\0.6WLq`mt Iwq0ZTͭIXX(4-fBBǾG'zkvBNqez.7Ho Yk!5}N=;ZD=2=pWJ 3S06?"C%6% , L10#MUv}#еLR _E'IlSj`SXG9tY5@*Sug>'ӡ+*ѦN|Smp~Υ{Қn^AcH^GNPnlc1r5ʳ j;F$qRZd8<[DĂbpض݌WU(?=Ͼ.p}BUWUf@Y;ooC{?=W-jomcF|73nʪӺ̟Xd+VB< ,RlaaMj5ivq=km0T5Sum@1N3KZs-LKrUdǙ dcoC{C%;}T98EW7t^]gP@(YnOЮ4R'Pw?-LCEoADup(o&~mGªU09'N m+[nIPF+$*˳*t#sS׿mY"ErRԂ4lt4;vӗM&mދ]ZVxۑmX2&~<ʭ. gMV0'C9^th]tw(f ;0&#QsV6Z&4j~9 *%O)4OmHxW(ia6<+ eOckɔTJ-Z݊e~O8VI.FQEaSXt|4mU5@,4#vi1Y*(!c0I>@k ?㎶F!k:vRyqVr-\m$cacOrVnt>[V5UYnxN"|$dV*(I O{d;nlt헇I.n\0 #a^ԈouYI$Do\1bOH6T5gs E)Zȇ\8!v~ vɩit2uQQS=\_'TZB HӖ-Av\搭Zl) LN:Z;EoVLhFI}ڥE jN.w*٢!@NLM!0z)k]톤RqLg)x:b$º*X)Bv $müc=$Z+y{MZ/JcpR Nبx.ķ`W'=? +- }&rWb-j]XiappBRi@ J2Ucdޘ'V.;{iT$Aۜɦ}U?2y)#aɕh1kb^E+L,I)'*t}&ÓQC+jmG}W$}:b @ ;qD`hdrn*5 c>G S:?QQ i I;Zm ݌G iP27aYckE&?%HOY"m\U)iRԕ9zw"2=?Ar}"-vxP2ThVF" ؒ8j!'O_=)t܈^@'11ӣokzk[4ތ7 cx{5rd&mNfE43 `r =kRݧBDoxOUD^慦GĞ0/OL'8촺S]-Z&0 ^ˇp } 9e]q\tM]+% 6N wD9}P{cTeڱ1O;s;ڗVn^ďqcn&-ױ3/KelRޝX0AըLvz MO]t?vn5VUaZdL/'Ӻ$0){.os m BV$;Ͼwj^o/l֍ !\V7 4|!D/0l4z)PRUB6IgRNKa^QZ Zk:ml*L 2OI(E={SvVmT MHO1W\}ʀV )\i6i&Q&}gKL8]Y+V34$mʄW!Ӣ:HP$L lRvmJ%4rU ?,]Cԑa+M ǯ;e|/_ Ahڸ=yX׮KwQ oz{GժH$ ՆJhd+=Zc4'+^®iFbľni'G2Q+<z9ᱍ6.sԋTH F<`PidzlBqHn( ŷ8$~ŭ$$`kcX6tBXPX(A1<|1ʓm|Ѕ$Q`YA,J ۑ)=4hƪ F {[j/ŜW`;|\.8{N岳.c ŪŖK(1'GH eiZAb j{G8N.Kt^ڒOBI$3ۺRL ^(\wNIc)Hȶj!Rf}9gRJJ)2*гOJ4rX57HE4 Jm.\DTr{?ix+V=ÍXqU)S","`J7TQ\I3'{<\ع,j6Dl1'TIIk+gkr%pblB֚55_\&J:vejh[Ùo O)YwS~U] >++ʚƫ P;o/ȅVeqomNTw8(63UTpdpF9) P‚s91}\M6!N^=Bԋ AX7#Kh|-eP{4J e'}0A|aV[$&thiќod;pf'6\N'z)CFޭ Zt 99ƛvD7+k+qBDשim6jXwK*usMiQ5t WUUB\b`?LO-$e>hM\L{|1W*ou[+ K[A]c<*Ď RDr{v&c8 ,ҥ%] (Iҿއ6ڭbJG&=}gױU/4lh^-*UQ `pRW٭iaܵҩZTqT 'oO1Ɨ&*QE_ k/BӸV*J 8+R,'Q.DRu@Y%v3 Hx˺nMAJw'LʍݖWѯZV Jʫ;:{Z+#(G&9-#cIۢ7v]շ&HIȂfHQ A뇷3%oIٙy^@>csNZݎnNp@fѥN=Ǯ8i JPc%jIĘSbθOIҏH FOLժBɓ QtXc1P.O+S Uj ԚT<0 | zEMmR -m( o]i; gl4 D8ld^ Mj̍ܜ-Zn~q`O{Tj^`_n~c *[b 9Kض{[O$0;_8;9Tt5 I }X u ?6UJ@% bD5͏TR2ŵb][Sjj&#~?O~ʭ"cej\~iaEKpm;,թhl-.!)JE60壍~›P_7eoCuEBJ)p3ՂֶUpk_ʨvu؅"x?s:x!vZh!9`jۆKN6[z!WTv,OS~lE\*5oy~KfxǓ.n7!OtF?C!'*D\jVxm\rBJGOLfoӫN G?cU#Lhβ K™ {Fhl <+voBI`w=f}0)+Im(;uS*"/u13v\q,*ѿZij;_Ci)vIsک׸ZW HL=bO *rFbxi;![FOCUa#QDTBwǸThr,Ιꋦ[kvF,8#o^~xӫ4Kwe}KG,ai 1JM[gX._S19}%Ke|#W7w2%jK&R^ 2b'-_ݩ7D(0p5 }iѹEI٪TP<qw&#ǫ)1_g~-f5*"=UZ(TKbp'-ti?7ӡFv'3uk;k85\6V32<)?D}7Fwٚx%)lUE@BS*"9RxJ/Lb*Wf1R>d ; u+eNWVu«5ڳj\$I^}"1Td'1IsQZf4àV+v8ӱ q fL&NṻI-z],UT\j0PƜxS{%4ktҥ<5Pn#,sl؝*#*qcPvm*R :[aeJbcZ.RRjo dG8R#|Wm MR ycK{-%Z`7SfJ?LT:[b .w9|6i* *-6|(PeQbԘRd+lcWCHH[h jO.ǧo|-4bW6)U5Ih8- )SUE0 O$QC3?C;$"e)e{` zJ{~_kjNĆ-<lfq_S[v, )=1Wm^ŨZ[no\ST%bWfEC MH_,?*^N򼒫( ?߮ 822zVIINBFCl~;L ݖ$}EJ;dקr7^=xU}S O`WS٢ejP4"}O|.S/mubi@|R@pٻY5:H$m=ia05{AEuJ+6|VMmSg¶W$틔]5uCPXӺ[obҧdidvi !1#s;8ѲR+[Z(]ٿ)o~QoCRkOH-0>VBod<݉SߴTֶ&eh.iSY=6N9Sro]WYՊoT< `Hm6YyfaO1T"˥P#}@f^<]B\USktgl*h8I=vjZZ]/V$}S7="wL׏Kk}TJuuh;m8͑/cV"ڥY{ϗ@c'@a .#­suj;~&Gw>Ti^H6Z³j,G{a ]JbMp̎WbO7mޤtIjB40 U <$9f4lYͳ+1@;I7(*$ړ%?`):Brd?Lejdkh%[@ҝ8`:?6m/&ZU('*n莊ohijS gepTYږik#205@46*J9C迧lh֯Qb> ߢq1צ渨 2A,km;@U B4Gw =9f+ɾ-jfҙ0s-)EnAS  No⛫gW(iIA׶޸&mr+I-Lyl*mnШMܷnot֪h TpM/FkE;ҊtU~&RadyHJRd 3 ʪV)y}A"M47R:#-Z-龂qsM2+ޥ J6H qݭr4 :&"}p%T!B㧩_ cN*6wNTjxZtDe!O;vld.kG@|]mX9]@HCK7#h~XwEJ-;eS`b67 &|kpijmtƒqbKм#%B-b2p6-~? L,O*16D{=8OmGF#qTdSQL[3m鋊dk:izoRU_TF.4t7P[Im*66ēTؑ+uRo'OQ$XU+ST}Y~bL8GTʌeOREz}QT gcZ'W.O ;F=>c%? Gq30$jXfiPˊ❊>^NYH;킋H;RU`c*3 `$a|t}lDLqi[JW\TX$Meyt.PKNQ}Zt/a>P?|ROˋWDږ[onomplOH ȟI%vYcjfy|am?fy):qD?Ce*"2C79/c#z'nOkU=4߷01A:DʗLUPR"4&pz=;pM$~l[9qrAWFӱr* e%!Nwoe{ ~\[ZI4vGX`g` Lin qMgΌCiVnZ.^jgs&gɤv"n$A|o$W%y/~5cE="%@$:0:"vtl(Z`1Ǯ=2OT6Hg,,jQ~iT]2c. iUH@n$#q\tkROHdJ/BQ!]fLNߤFUQF:Bͦo8#`H_t[]56ꪟs `8'+lj$-ٚu)9rL‰1s-A"%j-+pĀż9 .K,Ȟ*N)>޿Nz/} -CIzzLv R@^UgƥRfWrp0'!ɞx~8u'} v9MV&+ecA*Q_y;(m[ңa{|X˰/EwXSP1^D4/oDnr6sƕS-6ZPi `{my+wzRF}ǾؿG㾄dZ҄7)SE:$&b m";LUt`,$2oC}I, Lvv8"h@܁T%]ճz@KUֆ+aHT)XPA)0&],jjmOlؗдP^#}1|Iwɉ6Tem={/دUb`y1o#_t$=KJLi߶b.pKjzl29 URo@GW& $*ȁcn㝇 IOp VUR< GOԙJEweI6S#iaۈ +&WU s-sTj chظEU.t<.$zb6GR%yMSA9jPIY̮{b꽆%}4>xփV6T֨JI"t\##-F*bLLۤ3'j-H ;qdcwuΠvӿ%&YYC(D3AQn%f6eۍaR l#cLU,PAcb>1?1t2躄;A,ȺQhf)Rܻ oM~^Doϖ)-q" n?o9Ƕ.zR*V)>S7;sVaŵ@\V|cȮ;46ݵ}j5͹AqS{4tem؋kԔ)=>HFySgf_rJ^;c+O W@n l-*MV$(o IΟG%|EӦ(T6v04 -JpMia@Z9҉|jS yqz$]L֦aJ֭;)VTOߏ|GM[(qux*ի.gY=q"m_ɣv ]_O;J2ѩTUG(ga⛥av꛲dvc ob?ERpԔA 4HgUuD544lXSIjzy|yqK§UC fX t{<ʫҮIpǧmG%a.?QutOmVb' )I?Ӧ݀4٩oIγ_c'y~]Vei1yUw?, PRSNv~w,28Zvha|eбF qҴ[^⡑%*@s_'#Kǿi}mH0#9LE:ka]>u3I "xd&œU;b. s}#iFB2&8ᱚb9'K;1 9@aRVhQ@o|RpR TW;%$.sN+"i'ùc5C}Ke5ERpB\2(FXN筙ҌTQ}&IճDh 0'uGq>b#n s" rF(Q4Uw0|ߨ>uCSFOÜIW:QVW/H0HJ1'C{k"=P'a|sa]n:3[.giREsKwRA>]"? Ņ"j\5C8>|wٲUԩ tFmR'Y~bmh'n0.g?7jb72H7# TI(+ZlI lHĎgit8\r0;C-Y*\Ӫ3=c؞L7T ZrLDmk' Ar @gcwYsP̆P T#n.]ih@w m;c^)sʯm2WZgũH לuKoj7qw{~ݪ9`ǣZ1?P3i}gf_õy^AzT2J$3鎌$3՚Pr}^.b@5`sIItiXpbg|m-4KgkcF2עi ֭j^ĿhF񍑝gTSrIQ3(.H;c:*.RrWRe7,,]%sh\QekJiUJyJ qRj:'h2kE&pčqR{ݲ2zhԴj*fؙ`>}%VIo..sdh;S`r7%)l |*:B_ Qn\Km:uEv8F#)uRAڥ㺶g"iPJl#c8L5F1CՕ*4DUc0'SBB#~X(3kc],]&b7 Pҧػe’@i=1Jvc%|7U&e6z22&{ nmBIl:W)yMe"ێ0Q^oN֫4P?T!)iUQ@ui6K~ g ܃ ]!)]+mb87tM p;ǰWPW{JM@ Rt11|~8i|I` v?LRu~9=&>0]AE<;\/w-MGnOb5.+{fg}L_`mvTӦwkoއ*Y[@@yUX*;tY+1.>qٚbӦ-mQ} vBI <إ6=i-b+= ca\,XZsp$6v[K*J8 Be&+Qʪtkh*\L$oM-n^]" qMOCU\]Hg&A{ᐓ/Hln(bwl:xZGA+{cm57Tmz|p_ʅmC+r \I$̬u'~ѿDO]" p)bN2ɇ~*.`IGnR~ƹTuOm @FG}T3ڤ!{ 9=6tā^gEo컃QHc銛l$,*Rz Qlvcƌ]gce+6nvՉndڪJae5* Is?|a+frk]*-hH'N?IE. hK1gTf~Ay5t9t=cWpeQ'}7dsJsjk#)f QF0d\mmNӬY @#g8&5L9$L6Ӝe6mi^b793䭌rIw (,*xlg[{Nj6B4N$4F .؀'#鈜oD*zt $Q#|:T~M5;9Ą9'6^$ju.Ь&}>C^(IJ bﳢ9i+?[&`;&8g~OW=Ef}29rjyOkwy]_ja* I^wż9Oes=RZX/(o|zOId%MyZD9 wl]ܳ3# MZ}T-QDG(dHUozg*AѮ/eI9C igu^YP7 ET =;w9Z /.~[-v1?-f]&V@ӷ]!A9omaXlzWj-e4 b|ŀoʪ}XtR9[O?0K-c6^*)`gIeFA/дrsoN m{JZgy'xZrZ4,WQR6~["kC*i+dz ڠ{~ :0xph4BJ&?\~ inK#yEThÏl|hM>\~}]*;A3l3\>v'Xԛ#ײ4,ښK&>KpM;4x0c{Soܒي֪) 5bj8p0V$AO$*"UԶ%wmֆ8| +#C%P 0D#/A]1-;MiX3}9(d(ۥU-و 87`T`J?hXyx0r`[UkzTӦ_~9Z$ψs2}W(b5ߓn~"U]Kc$q:g1O'a,)LgPHONݢ'xb3]Sj}هȀ{/tZ@rp#?sy/HqKL S78JI-5C<\E&Rz9t4p)4oW,]*"cpPEq}eeI'Jh^:ſlt@f]&I?-Οؓn5˅Sax\9'<}['M S`(֋i4WNU[/ @WSS除dSw< 3"bsTR7k$ރ_f+9& olo`Om}~Uvę8vVIjaX]\(jS3YDy*pT=:4h!PsQ?f&l:iv>ÿ~qȭbہ\-?P|܀'H\㌓&t9)]? l>I e9`^NWv\ƒ%˾XTn UEFRAxlgpWdOBKg|O١jY5@;ɖaM69Ky92>٢ySɎ_^GMmi#تub2s )t,B|{3pToJG.Ę X۶Ӎc̜Wܼ2ǹQTѷ˜z {8nMki$ ,3-+kmz䖕,:R0vl.m7~َWZV a׷4ў{j|̫:\: e`H҂ؓE{#}'iB;1s3~ַ)>x@GcqrtGhU)IYIjKOlzjaHkbL@l"R4U!Խb~PaXV Ǻ],!: =03/vZt2D"bf6)4(i.ɺoVZv) 2i[+֡ %}_&;m֙rPpWBكo vQz}0)uzXmIjmwiťZz/\(wclC /IM Wo: L(BvBުceNU;Lv3;bT5/T!|'}ށN-W`Sװ77=J!dlSm(okZVzoELn7&vv8O`4@A7;l-X # о mD+Gd( T: ߾ ?E;m @;ZFE @)a`䘲;jXm3OjYtF'lskH ~Cm'Ԛ6{7kk؊X.;[-ղL?'TcnC*Ԡ7CR2_Mǿ=_&E6 P6÷ˌ>;76 BG)rj1y8>$Pé"$ pVa%frG8.O0NJO%Aq{bܶHQ`Z1̉߁툟{↋¡DpMk3JSfY, xelTʭCϘ96T>y&?|`d F&9߲N l)61mڱaU `fhq 7\EF ;!ȐG8Fc7[l]Q@Q RTSV%UfYƺ,*G~^qM42儯~[QjN[Z)r$DvUg\tI">\AsƘq$Ve.9wؕ7Fft:E̪%I{2c"0M'㖑/2Tje&O#mt!0u.U&*S0#?> ?6 /V*u-#ӷaruY}JAK?>p4ܓMt4]bF d4c98N1VНA_r{_\jfy&:[2=9~bil\+-ӕ@')jIwlZamoOם%]V)v݄mf.-*9u:ѤSod?D{zA͒&PbQRmޗnMJd==$ $q-.!eJNI#? %2Q L Ʌ 3hO#R aK!qz'LfY\0|Tl#QiD;Lҧ\'yYTUXo+ENU%JRiN^( (^t:跍2Yi"vG/.)1KR { DVBbbn%{Q0A?% dqP=%kX@ܒ'(G?oYu0vM{HJayT(<>NRrv]5AmLG%QO؛ٻF/*\T457g>{{`B(zI@1'Rj =j`SrdH4$$%q }ʆ\j2$v'7Hdb<ߗӿSUV*x0YkvƐ!U"I-I6 (֙xv vTh0 WV\{C^Y)ܟ{mVYF3;mp$H$ڔӎp*5Zz F)'ɾص)4޻t 'GpdGdobeGej`}qjLM2b1 ũQ#}Dlɐ4m_' JkN7~&p P\B$>2I1*Y$m.@q\Wv8RcH1o@m{3y nxzCoi <O)N!AI0ZR~ɒ>i0~R=|LCI[eF?t֏u3 6>d7}&ER v5Tُ<iyd|. W0Jv3X #}8F.9U@/ w#~>rv'k&9<댓MCl)ҷ$A11#xRR7'o45d)*)se.oP2r+l}ɪL2d_=*3aDn6IW$ld9^Z"6}a8i-ȝ\{ γ;o!)|5N͛"zI5ɑ{.Așs9+5)*0 _e E@7 [VҋM{'PbL<1?88+'+K/izRð#~LɛGFeuh(D'J.vr24KQ$؀$c\fѵ ( }f9VCТK,56'*N)P:j 0h=OTem<13ŕS`ͬôLSVU9jJ#G|*7+Z(ڧc Yj-3 2w䗣f)[#[4) 6ݱܣ]3YM=(&#T`Z"p22A^eG)J O 66JomEf L[{l󊄻ǧ#zq=|ʕH:IpZ-l7 I"W F)F4N)#>JM=2QcL++#1|Dj0ɥ{w!(`w{b_s+wqa$֡$3  `h< XRcվO4 ;=Rtk@%gizDHj'>`oV cR#|SefVbI [Ճ$ϛ)d]_~Ol u:=Wَ !}~Cl\ 7VIn9N-J5|T➍jUj"ĉ`]2(+| AaVq,WCRi@q'%aB*leRy@>%;EZs+jLXQ MR#Q8rM!ÒL2#쨦r(Kqa$A wČ߰mW]IwcM?_R[Kebji}bi,A>۵ҷblQЈ#p1 4( O8'j!^ܲGy.2%{K Ao-|V*IF)O*BD*j")3SE^9sS  ~͢)[K8Y٭͘j 6{EҚ8R"JSLrGmiSR ԩhwͦ{:aԍvp(i%ZvvƼYtdD%'O:O8Ԝn5+z`e#*؅|)?pc(Ls5VY'W2tA-4 aFkKVbjFը?Q_l ZExG0 79ߖn*ʭƦe"3$հU \ftE.s8]k GJӫDGI(me &ARrgS1В2E [phPB' KR-ON1 |A\hZ#(evcu#kd+VTQk$qiri--VdtU2Fn5'V|dM];ujxgnJmY<[V'ӌtdaț?Գ5!]Df8Ltc4},`2 m;hY hcjΪޘ nUm\[pWŹCLZ+P8*0t9 B`1/a5oQ|qM!w#lK Rh h!gh3tz Mʰ|K" A[a qL#]c- HO~`qoeOiuDAv|Z&X'DjjwKj3LVvNTݸI -" w ~)I6>|HKU@O LR$}wҫRv^=Xa^.D5oL/8Q jE0q}Q*71iJMM mE5"wK#:{@>bۥCZVmfR@l_ tJ1sv-PjUf}Ra87} }6ƌ k<O2QE:~ \Zu%%+^NddcݔFjЀLG Rb=hA>!GUkU'Ƨgǒd*%BX$ߌ9$aedUpAI=,\:vT l'ySQI\^U%dB +?lem;o.+tiRH1 kCv0ֲk-V3n vn<I(UUT?|rJTtyS*8$mST3uoLG6z5 5DӸ ;OcV Tf^ުTo YVWLJS- XH gNG M7eG#+缩|R`}Y&$mײ )z*:GH\l$) UWTX #}|G)4{,Lt LL.f/n˵%VEI!| QJ:/ V6%0gyg#8ĩ:DjR;'>я,jk#RP~ݯQm=li4*"( N$3$}lhKB S'cDDTP<vFlqp6?Lc/HӍGUEzt|:4zAu^S*n6j]?EVD{hd"X+Mh~U %Y =Liİef"{JDpTP} *A{vuH g[3UV L'69LT 26}SJFʡd$LqتVɮEjAyy`&A%<09]vi^xqJV\$*i 12=#kj 9Vu) jtp7lSz>.0@SwfU  KAnGqwƅbm$?vHlsƾ OFc" ]ڢmRIșb7+j~`@ˊN0JɈ6 q]<\e~8gmML#?qM PmRCJe┛rN4-J%Q $Sti [+j>);o+)G[O ߰_% ޅN]K-[n`o$`HBW8ĴmvG& | q..XYeVFv2V5mRqm:[r~|G&JJ Xݰj 7\-FGDnFpJHѨBY]87ъv ʎg$b ea"ʕ qNE} RJ>ʈ>N$=MF+RzF0IaJzgBbI"iH vX'Rl.n]qRuXq"`,UvY9NKV[ZӦ$11ZDˉE;]˂TkP¦LzFя˿}2BV^7629uմx'ږ)jΒXDjɟ6C%i=3¨wl4ؙ{*lʕc0bXɈ'ZB\Z} :5$1P)v R+C#eUl\,'H;|[Hbtek5 DL<$Jʗ$΢ dl< s'ݚ}>顡hǒ#o·ߣT7mSriauFxUHFoߌ xC3i[c}AmZIUO9&"}} s{L ;27QjZ EZAx8ziOJ튊3Sgn7o$Pn>? ߶#I UgxjT'O Oգ )! "Wl BtP<ß.3(i8fZGl )1qΐ8 3H09F~?)Qd3X 0OEF;JRl JA]1}l|o/)7_QI@DyL[W\*FD1`J5$(dk v ?eТp1AAXEYUF|@m%%W#Bh۟L&kS].0l+[+c>.0k`2 8~ 7F^O;A s dIqK7lD1BXPOlDK{>usoukFAGniD(1inn:A)ޘ†y.{2Q'V'nq5FFJ`{h.ٽ;Rڄ1Y?/$b}:{8/|'Mm:jɝR3l8@[ wH|G"I_0d)vg.ʮ*v|I}%bL 1voc,J#t[V}JVUP02n5צY1RM=%WP ?vdZ_EE|$4kjD<9#?}, ϡ&\I% j=I|XԤ݌m'ljĩR7:lܵB:N]eocQwF @8+eNڗUp$06;cmm7|OAm;ΥAv7 0#op6ڻ[jd'RoLe;4(*t'J o-[BBDJOc)[}(XN cѣTZ#s VMz.ڿ;y>-: UlJZWWry=5jAlvBڊTZ*EUH#P0yۏ7ZAV m$X.Ý&NjYZ֫, {zct9(Wzq{hV-˼${c/pc\_KhY'׷9ғƝbd9aX>T"v1m2bOVtGZi5jxy9ˍ/OF)Z]1?}'tL_3:r`;A?oBJ)\w |Trv -#& WZB~[a] -i ȟb(qtH"UVI?#c[dzU[]6a$jxqԄUo9Sk+]^*ij ؉y|GhK:nJĐsי\z}Oy=:U[jT﷤@%F[Jl~&d껦*0ߘAʸQ,ЄpWL#aP99wٻQwP  )hm& 7$l'AƑ7ɲKہ-3bL%UQfm[̶JsՁuvBUB|K{}p.+t͚3E WJA95QRG $"./duvA>$1+3F+'@t4kv1ֵpٸQ8/NTnb c?`ʞ!"c^}p)P`AoL$w $b Lr70} ӷѹ؂ׁOz.2ޅVՔo= )Ķd(B73IG;b0hp@]%L1%8y⃋0K 1`bNp6*/Zlv#V vȢЇ$lI-*BGExDA n1 &C#n;%DhjKH CnG%aFP#)};Fnx%+ƣRèԔ,W o)lm4۽SX*~L+$kNf!hH>*'|Y*zYEj(>hɝkC]_o٪ɩ@;y7"4cS >-g N\b5L!^XfX^ڝjl4?~Sk"ۑ_-RGRd}@w"Ms :씪"HA;>6ԨۭdkHᬈؒ#px$cMr3dcmD OYq1GjU*tI-$F5ŭ1stI)F*4u1M*ΈnWCUœ~%)Aa߷:fwHeiMAjL?f͑= |~w4\mRV1&}vp{cFNWlVFiQOQMTF7p%itpf~s؜9,3 +lUC`~~VMJh鞓ޗLktn&")sV#lUVڣr yZ~ !޿ͥ |BE%QP̝>X\ ZeV(;߾'".YR6 >؜vD.Z$N䍷;bPJ?(!1$#TRLۓSVO~JƊa!Šyb+&s[}.\B(O48 qnAܤqY*;}pشՓb$ s*^($SAFښNH0Gmk$N3#WE&*mԸp|؝! @ 3b_)6 =8?ZiU`{MjjU투*]6&QժOӡ 56&@Q~D}:Wo^jVjbex .H&& 3`eXZgR¬NN ՟#io-;V-"A罖ÂH~\|v E0|)57ZGW3ũYm J̒$[_]#!8&ވ dWlb#q^6Ԣ+^[#c }HۏĽRV)Ӟ1Iʄ*SccNNf UzjMrHGM#+ 'ocuZ@j*1"3Viձ/?4idx,ttg.XMvsv=4kYmZBcĸ5}NO{Le7 _M6d450DZל1M5lԸ]m.¡ՠ9'/fJ+a`mf eשP2>*K9-i%iP0;KRIRm,61~C3{5"4l"~9LuhԲSM$z) qra+^%8Nuv=1齄[ ȪFmy#OoD΅0F߶1eov.I&rB@Yyv0y PȫDq.I\Sy#MxG(ЩI^C>;#4%T)mcTkqIU[\Y<8wF\JU-~2A#5Us%I81ĒMzVÑQȮYD7ybi-Ɩ_]On4[S Mv4F{Q}*juI#i04(k2e$ڤgOig!JP= *)2M޳FЃ=>SxB41|IVSfmG@=4c٠u Q+#H&@XIDqwap`Y&s3.T;CͭM=Ex[eR'P枴Oq8l&V9﫛zW%GA`L9&%)vTUf%0ן渺tiT YA~"JJ@Q:V47q}h\-SL #Z*_UXmjJ"aWͬY'̰I_f/emJԪ&B&R}42j9"~?[i3!`'{>T ?-7c$lgɏ ]ִ$㛟m=4/S+e`oL~0(dy:[WWBeF1I7C29$diGSU$>ucPA\UORWJ4 mһOieҵUCN:k&]LRk:މu5(x 6D$a-$&F L.v: [5Io;mv[2CzRwl0'tpGvm+th=٣ YM&d[]1f^f#}m_۫S L;>.N˕-r`qbbG#NgJkNi DlF˶$3*O ITס=v)&Oq?.>[{EL ;HӜZcTk/`%̊ Q{{/cqMHJ#d =n"[f4o6 :Xj19荷ؐsDH3a[IBS+(;&0XCI`KaFN]uU]PZD] }_cpvc5,iH f 'oOn&5Ƈk'(Y&GG.*?XT=L>\>jVS @ 1 F}]n1辂TpI4=}7ױST9Q늜CrMӧV0\Hi?Aop-qD0@,US)%Ĵ3q K#uh6]ǰ>qȎ0HN`n+X-$c8N)JI|UR;=+qh zRED遊il6zravtș8jŴ%jZӐùO~M&B.suNhX<\n*M~еѪ0aL=έ^UiFTJN߯l\`+KKbZ6zklI|mŋ0rN3*ismRn̬azHoŝrM]^Z/5 sL:.jF!G26JrkCV7e`"ҕ dd_#e3>Q&6`Rn:X EF) DAef `.*^ :6; Oa*ULm!lhbKjQ&x@Cj!ܝޞN;+VѸqtI@kL @y>}NL75bVX$F-_E5nցu;lSx|V(#-=2qz(S YTvI\[Ǵ4d.* w;ؿ 6m=!&w1#xP;>bgw1TN/^jRkCz*ɒvQvm&Ч*M{[RRfWOlF蜥[7Tc3Q[@tn;l(cS]iԤWæ bCGh`eOLn]xa;]/7U-*eDx/4>XԁRcRXfǫgSP*p7<qpca]51;װbeHEa<߱qdڇ-&$7bI\o )ߊUDyHǞ0:XCQsK`Yʐ 'NݮCs7vWEi>RWq{Ul?'ήh\-٭ZPH.FƌQ5+Zi5DI<{8ߢUE;AzMc?CTYC@㤚lЇR`N14ћ.+TA?^gI(,ʥYH%BH8)ފorBiPŞ9<Õ5L(ܬQ>;5JTcOddm֍f[IOV+&tM+3A2E5c|*Mz48Z:CHdb$,^XtM@ XGT3rGR֕6[K,\2gApd.oye)E:!=~x|iXcغP$q'1{THF.p jJG&)d'o fѶ3qm*]׳JKb:f@j m@D1 G,l  gl~%%TeDO cZF&bU'|$RVU>o6on"C˴095`VQ3;}:r)(tR6&#a"8'Nb(*;$Qֽ (gwB&2/IРY .YJةxք@#)V16Ě ǴqR1ԖX?!\S[Jqa~|=;7|8! %@`=nqJĈs /kbNd:g;bM 4,ϙ7lBfmbQQ{5J86}XA!u:i!^ 1c 1KF }6'}i&Iن!t*a 7BI-i߶%vKVkr;bg2űYQXhP ~Q[[Ivp HG F1fJv9J NKGMTb dG7)?"3ルir5Z*A$,@} .ɪh@ l<\.Pjʌ7lIzIn} ;m ޺&9Uv$`MM䝧}).tUZY,Ds1:M9HIԎ'6U,rj J`}F| t?0f*wpAi yuE2bHʉ<\Uи*:C\Φx>ݱz`Ũ)c;q?9FZFYk3hHH 6IY1pk75_Oኲ ϶ o4UIrԚ62ټ>GI+JBie{zLmai;!ku<*1 '֒1u%kBkѨ*46#YM7L-S F?4B[{$Vޛ;m1qBKb^+k%u1v=#hãarU==QjJD$;̟O26#=EAR 'yۿTξwQ1 5I>鋔Rexim;MPI5il>*J$ N6c+ J՝Ӗ(СYi"Yti$,l:v\Sa|}W)>{-_a2ǰI R2ഈ?=j#lY!Q9ݒ Hj,GӜYqu֠ RU@"Gy^IVѥ@H"OQQA]:1 Nڿ0K Ϧ)}Zi uP؉ØG |B]lMIRA cضK0m#~~~5-QkvєÏMErVN `9 pR 3[-Qn(C ;GŨ5h|MCOGIJũi33ZXJ>SwBfe 7iĠ!" Ҽf>{l! jڑBYn!hX(PDI  *Jʴ&@H1b"4 ŶS"lWxJ6&i`g1 R~ &c\@TSgƙy1mMB 'y kT"UmrT$ޑ%UZj*㩎OqemoO oދԛ9 "F=WB\?{)O?{'*YUjU,t~Z1yq-W^Tu+)KѝK~k\-Euh2ɘc ױdvI/> bX2jD{d'ZtK%VJ(P 4iaAm)ɿ%鬡 ԪEjjHU&ñ )v?.\)%JWi߾;E["bm鍔ZJb[%֥c$~80ȦaP^]MG80 }TU `Vk+O,dgWR3 G\cVLNLzs6A7 w]6!Z QܟHGV Ï<c:U؟/o JFL4IDUf} P2W}]ސps۝}y-Z쯼m7''V"R.-z}!_TPfd;j& uح2IdA09ZCZ{ `(".΢zK`JL8R ;[v8PLH(ZA`ҽ,5 TQ DHb]-; `e IVGBm|=F4hʁ@'X;}0iH.Fcawluؒ_c1#ZD,S]_RjI +JFq$69L4ZEpWHԻj{»C1}W̊C7'8ѮOM.>QP+f ƄSNcG0b#R3N)+,UZ8#Il`iG~LtF<1eeB`4`EV*tKr UAгfh0ñWLє(F3IQdsoZl>Э9V1aѺ"4zE-Q$Cճ Iռb:T1vbfD#l@TjrJ4@ w$ b`q` ;q!/^THۉX4**. /pato\K/d@dJ  %o,:D=}hO@C4<`Mg%@I"~BbnxVAb'Ö#bݱHp ah>bgRAئ݉D1xzUIKIQ#ӌX)6 VPH{z$06;lS.K23L[vyv[j rh)R_"{IƵBTpu$piK'mhu>Qw\)6xtCUG;@a3\᫐2#Y,f0OoMd\n9DE'bDN0P^N<Ѻ{\S5;#ygR}mRqq^5RRx8c4KFW'WKmI킋j[аۚZҬFFcDmŵ#EZnLqhMU=kd(Kq;04cOAW_8Tatջ8SH9S !>h$զN RX<J4L@}LfpmYN6Yн lpbM,ZAOI,1htrRe؂~!it:x>ՅV$1PH`DDv8Mz`LiզwӶ) RZ8|Y~i]i jL1ø@P %A1NcDf88RK)Ol(LЦJGL@A RV =P H0k1 I]!@ؑ7431FHth$EF4,@@1閕3 $mDLm#41؏T^o˫~~.0wI 6dcNIٍB;`K .Yf}x8Jҳ LS!#}Y2%dOm8ߣF j4Rc~z`{ Ԉch@*~|mZE\SB5-~hl=J+zY,:{w1'>=hd>нYZ~` |}F˛fVh4UXZRtΠ7` \xJɅNbiSnʛQ9#@l PNZ#9JY$ZؾvO}0ԭBfEWWiUaD|A;A܃m$:'o3EZBν"XqIWc|ZF`a I 0tv7t>e50ҁv2$עbeRS .I$"xW[&MnX˫ڗl(c*zDzHB펨t; (v,I ďӷ*0d[Mu*0A{JzpX܁8(cJ )VrF m&&U ŦDD1H 툛w C{5GHDmq z4Jjv|xmP$x8>u37Se1&b ib6\Ui@Th:D|K( UR9 ҖmxL#u `J,=7i5 -'1,Vc( ImKhhRH1A8-tG'DL+KuTm@W'cDeA Ʈ7lL|%m"`p==ݨ)ߐqqTdHdI86_dF lD$XO>1R)]+i׾)z*N&1id˖!TE>ag,7<ǟ)l4HR $|d!(3;|R@OeYjm*`ߎ Em*\wjWyvcV8$v-HdiZb :RDʤSvc M~x͟mlxȺ4bwٶMT']6脄 ׳vNOV'V0+w~Y 3Leq>4oKS$I"{%z.di$(5p>bT+i{;ŨA`5&&RJԤ$ scfoj1T$Pw08{J8;%$o}|),tu@Rv1H1 }%&ރ/4"dj/4O% *jd$z{ d*{5olv@ Pf=\;$.LZER4=}f8f6ӤvOymխFEX.A|9eVbz4z9’5c1mE a*4%n:W&[8je7O($,)mwd룬jY IRMtTU7Fލ+j8p䫤L#r ww{$gph>VUv3$ 4ʕhdOR+$ DX:;3Ԧ6TVcǪ%@@1{]XI,[:5.o,RTIPfV ɉ0biƗCJZuP p,̍>1Ǻ dRI$vK%3ʰP ˜=t HVM'K>]$U{{u$2Ɓ[z֒C3i h}YFցNj DBD+#i닥eVٶ.C+=1ehCb)Iз+\SjTmǫi%v)Naؑm<Pq7i-MWyr)D>&n[Yev"sJTIEE>V`dHxB{ͷ0OC_z[ Hǂ.1m voPTAIf =q'㲢u(#(e *`mzbM!% 7⚵c"ԑ_"KH=?B9Rl5b銤"J!~fh*fUf@1`c [+&{Tnj*}a'nARjj:>='d҂WdW}>K_dΛ_o$>|/a!KV8[e+ @bǬҿ_Y-Xw35h\26IX˿^GsŽG*MʮΖWyTN5<<E1]y#e~ tLe6wх4 UРI'yMijmJd`A'rH(TKiV{HY&SfiDP&c -츦iBƥդkA`8x"{Rw؀䣁Q"8nh?GFv" za9+ 4DÑ0 {}qmcѶjMUcs` 8:A}Õ$4agwjP/MY 'sqUrVmOBGnFϬhֱH 8 cs'n0VAe 1,'a눮OTfXÃ$}%H-!R?0`/mm`7I "TӰ؈|E0h'I-j_ MM1rg#bй8>a'+A`XCRHqm|JQͧ״b%]MQTg RzA$t)QQ SYՔ1H$ w6Ӷ*2Ð#ʭdRn0JTBsgY϶c*JG)H$*|RO^Sď4Sz@'@`ʼnAmA(=mV @:c8솅 y$yܫE"vKSt)X*r074Bö/{"V*Bv0j R*PyV=t-( ػ(IN*)Q%HW<}󊯒(VJI=ؖ#I'A  *]Đv~XĪ0Jz֐aI x\zYhq_C8zkHl{-_S] tb«:ID}#_?&P2]L7xE$*b6#w*y޸P/v T?)>4RWAQZuQoSvuA*r y߰׾8ˌ{ bgp]┩Epһ|1RNKB[ M+ i'|`ٍt5Td5eSLǑ+,V}jVZLLLz0F~j4^ޟWQz>4/IQ,o`4Jz38)ݏN68c4tq%4I=njeԖ>[<d m+罿}L!oDeMZ;iٜҍRQ#Pw$ɍ>Df_muZ că|^)ZAUDH}Г aYy]ջҩoN@ZJFӾaWE{T&3و1;m$[jK}JzD$o߿lEF)J&VKXN@\eլv^ p'09*AIjth-*F$?i0I;RT RyBGmť{a9*+Mh( f \lkNwl74ZfN;~n%OPڈ =q/PO'v6ձP \FS0--Pi@e b'UfP1#hA(l—1ݧ~=o|3*W F`To$-MDg<#oWgj{Gs‚Uy D_cc=Ċ% W4qliwpd6Ź4 4$\7M>X܍\GvSvMTCi?|\]iAT1A o߱J@Ԣ> DI# I]l\;`Re#'CTF L)85+*2OkJUT)-J3Ϩ>Cn̳46D鷾v݄!sq27銔rZ ᩕ0Ju2+,qOnG `"?|8#T,Lǹ"x8dT)2Ruy$G? 'MYY˒RV%i]T:B; .+fijp z}cpIa  I!ߟL nJT ܱ$b h [&u@18(Qg'C"~x X#%٥eALv,#on>}~zXv\Z_ 9P T_0o_KV[k&ФhI#HѪeS?_\ktjdcbz)**q?-(:Pڛ*M4]40Dwėe)qz.B0=g:cy#r-G䆎շi_d3R<eV`X)h)%*)'r$G'$5jB@{LpkU agR]>VR#wdqw$(Qg۾.n˒* 튯Gd9ɟ H1 ,(E.:R )" Vg} jmAhK{ amGʄ ~a,\cL'vL5U %lN}k,R]Avՠ$+i㏯*HvEz ,EI; b} 4]P zDiE%@jol%fEqPj@R<7I vJ 2 SI @QsSѺM0 wDC:mMXL l"]v>|KB "~Xl >]4NN<ABt?\]P gئAI>[$}-Am}bݖ\(r-|ŀӀ;|Ivj`Iqe&hyfT)@U?beDF&^aV\_Gۖ|`Udtn$:-.5 N]nS@E!&Km٘!'VDF$80`Ngq܅*Uw- K iz%QW >+Xm/.#VӀV!NvY$=$uE $vE3 )Ԇ6_X۰vw5.Hh8Xq3 PUX*cz Dǻk˪wee}dhQN5D! ğߏ7$6WGRYI,#HPV :(LZR""yqi8'y;FC1-{s'.,mdںW!˨cq3Ub^4݃V \ɍ`2ve֭B WiՎC{`%A@wEfUO'JZawV^#ƔLu9k, p$N,9| Ҫ0f=p62$L Mge.QL0,D.^EJ؜)8aYL/#=m2VZ9t? hT$?>ÙD MtWH]TdQ-\  o#r[;jΘԨ/-UjtHFdy|`b-P&L cŝ_Ҡ* B@$Ǘ[5E.ɒg4*ЮE#U@dUU޿?L>d|][kkRε EkрK+I b;h Uu \RF QNc}'t3 ngq#*Ti>(~륶ִP hһ.vܙjdz]l4Z`T.Pi$"!P 2tsRF U!D 0 1t)| HBh$F(H$wŖ(bHE nȕ[Tq5r?(Wip)R_OcZ~^*'o|Q>oW"e&)>'2m߾-HɈ;N.tՖPj34ʭ xL@У|IėF<|SdPRHv;Z.QޅJZ{=Q{#UF <>$]16a0ԟe@Gqŷ#Kߎw=Q X_b1UgAe$ mhT w_a\L^ Lny*Mƒ%!=9KlÍBl}3S؂VN`AbE@;r 6IGɜD]NA$''mSPցeT#VYӣ2Uw~{ai;=JduzYC"LafiE[Lu<( cC"zu u;\b{"ҀHpG$+{JzH威BgP@+mtHjFZCleDn}7'c^9RbA+>{e@]E6N|f2x+)6* ӿ85A8@FYZ)MB2N٘g*ĒШɷD q`?|UCxPP23|>9bˌnIue; LRʛ3-TQ1;|&y1b[,3$&HN2յz&oCj`Gq|'hNJz/k H#| .A Ϥ~>0r;{UhUdrGxx|jCR]{kʶŦژybGćtܾoӽ7M ƙH+=ܟ5C=Z|FJ;E!,s(/ a[i{(}PA^^Cܞ'hLJ?&MNnV<Ƹbr|Zdtb iaV ,|h.OKuKf)QPTB7@H?uD ꋯ+<7w605l`ߑ/OCWjMTi;c1R+$-z |ũ=(/QJ;LvZ7ztKTPd)O`F+=1mBU3i4BR40=/MZK֪IOIL Lwn-HnTDGsF-+V3V%MUm‹odCRf$L@F5RUcͳIl6n3U0Zu5EX&|݇w'eAU<6 {o=.OעK!oL YUGܗSO{G]T A?}aM;tah7-*L}SKi31m^ˠ$bj;8zM wE⣬sM]2P,{HFNA 88 JeT{8!&m`#oBȈ<\^JYL)}W 3$7YtH>c]8 vqjAF;>8*BLF"c8˪عӦH-#qLޅ5#@;6zUDn}{ mXD7nyź Sh qA]l  -?bOQMCmz`i#i8* MXPQUF-F `$D{}qi* Y#-%n;V,;Hч&48Ǯ!%! cbTbx툒K01* Vd#x\oh\yQ!I Pdȿm* ,ƨlwd+gQ9'aS|hyM a_@h lp &RT'~NNnnHTQ'M>-Ux1kOFlC_Z^SjȊ̠T%Σݻ`SGVg]Mܟ>˟HGs; ;I~ZAhߑOrr},i5ltbd{%=7JK*¢+L`mSu(R:TuAM۾<zĽ9cN kAT;ys]#z9VSP@啽iͥ Z%]GqƸɺpTBTen :,+Ć4b`$Ssopa^Xq1Nm$8n/2Xy>81ғQ3TԀNc\B..@d:/mW6'yP N ,~7TH.w #o~_Yjb判'}a'F,;i[ծTU%dBx1nc@R[S jX>|'bN@Y$j*3fռH? TYQޣ X2=1kiZXRuΣ1'i`lV)hH ,uJWV. */ import QtQuick 2.0 import QtTest 1.0 // Note: See tst_progressbar11.qml for the newer API tests import Ubuntu.Components 1.0 TestCase { name: "ProgressBarAPI" function test_indeterminate() { compare(progressBar.indeterminate,false,"is not set by default") var newIndeterminated = true progressBar.indeterminate = newIndeterminated compare(progressBar.indeterminate,newIndeterminated,"can set/get") } function test_showProgressPercentageExists() { verify(!progressBar.hasOwnProperty("showProgressPercentage"), "Property absent") } function test_maximumValue() { compare(progressBar.maximumValue,1.0,"is set to 1.0 by default") var newMaximumValue = 20.0 progressBar.maximumValue = newMaximumValue compare(progressBar.maximumValue,newMaximumValue,"can set/get") } function test_minimumValue() { compare(progressBar.minimumValue,0,"is set to 0 by default") var newMinimumValue = -20.0 progressBar.minimumValue = newMinimumValue compare(progressBar.minimumValue,newMinimumValue,"can set/get") } function test_value() { expectFail("","https://bugs.launchpad.net/tavastia/+bug/1076764") compare(progressBar.value,0,"is set to 0 by default") var newValue = 5 progressBar.value = newValue compare(progressBar.value,newValue,"can set/get") } ProgressBar { id: progressBar } } ./tests/unit/tst_components/tst_math_utils.qml0000644000015600001650000001205712700370701022055 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import Ubuntu.Components 1.1 TestCase { name: "MathUtils" function test_clamp_positive_lower() { var minValue = 9 var maxValue = 42 var clampValue = -7 var clamped = MathUtils.clamp(clampValue, minValue, maxValue) compare(clamped, minValue, "clamped value not within range") } function test_clamp_positive_greater() { var minValue = 9 var maxValue = 42 var clampValue = 111 var clamped = MathUtils.clamp(clampValue, minValue, maxValue) compare(clamped, maxValue, "clamped value not within range") } function test_clamp_positive_within() { var minValue = 9 var maxValue = 53 var clampValue = 42 var clamped = MathUtils.clamp(clampValue, minValue, maxValue) compare(clamped, clampValue, "clamped value changed even though it shouldn't have") } function test_clamp_positive_on_border() { var minValue = 9 var maxValue = 42 var clampValue = 9 var clamped = MathUtils.clamp(clampValue, minValue, maxValue) compare(clamped, clampValue, "clamped value changed even though it shouldn't have") } function test_clamp_negative_lower() { var minValue = -42 var maxValue = -9 var clampValue = -50 var clamped = MathUtils.clamp(clampValue, minValue, maxValue) compare(clamped, minValue, "clamped value not within range") } function test_clamp_negative_greater() { var minValue = -42 var maxValue = -9 var clampValue = 50 var clamped = MathUtils.clamp(clampValue, minValue, maxValue) compare(clamped, maxValue, "clamped value not within range") } function test_clamp_postive_and_negative_greater() { var minValue = -42 var maxValue = 9 var clampValue = 50 var clamped = MathUtils.clamp(clampValue, minValue, maxValue) compare(clamped, maxValue, "clamped value not within range") } function test_clamp_positive_lower_switched() { var minValue = 42 var maxValue = 9 var clampValue = -7 var clamped = MathUtils.clamp(clampValue, minValue, maxValue) compare(clamped, maxValue, "clamped value not within range") } function test_clamp_positive_greater_switched() { var minValue = 42 var maxValue = 9 var clampValue = 111 var clamped = MathUtils.clamp(clampValue, minValue, maxValue) compare(clamped, minValue, "clamped value not within range") } function test_clamp_positive_within_switched() { var minValue = 53 var maxValue = 9 var clampValue = 42 var clamped = MathUtils.clamp(clampValue, minValue, maxValue) compare(clamped, clampValue, "clamped value changed even though it shouldn't have") } function test_clamp_positive_on_border_switched() { var minValue = 42 var maxValue = 9 var clampValue = 9 var clamped = MathUtils.clamp(clampValue, minValue, maxValue) compare(clamped, clampValue, "clamped value changed even though it shouldn't have") } function test_clamp_negative_lower_switched() { var minValue = -9 var maxValue = -42 var clampValue = -50 var clamped = MathUtils.clamp(clampValue, minValue, maxValue) compare(clamped, maxValue, "clamped value not within range") } function test_clamp_negative_greater_switched() { var minValue = -9 var maxValue = -42 var clampValue = 50 var clamped = MathUtils.clamp(clampValue, minValue, maxValue) compare(clamped, minValue, "clamped value not within range") } function test_clamp_postive_and_negative_greater_switched() { var minValue = 9 var maxValue = -42 var clampValue = 50 var clamped = MathUtils.clamp(clampValue, minValue, maxValue) compare(clamped, minValue, "clamped value not within range") } function test_lerp() { var lerped = MathUtils.lerp(0.25, 90, 0) compare(lerped, 67.5) } function test_project_value() { var projectedValue = MathUtils.projectValue(5, 1, 100, 2, 200) compare(projectedValue, 10) } function test_clamp_and_project() { var clampedAndProjectedValue = MathUtils.clampAndProject(5, 1, 10, 2, 200) compare(clampedAndProjectedValue, 90) } } ./tests/unit/tst_components/tst_styleditem13.qml0000644000015600001650000000200112700370701022217 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtTest 1.0 import Ubuntu.Components 1.3 import QtQuick 2.4 TestCase { name: "StyledItemAPI" StyledItem { id: scope StyledItem { id: inner } } function test_api() { verify(scope.theme, "Null default theme"); compare(inner.theme, scope.theme, "default themes should be inherited!"); } } ./tests/unit/tst_components/tst_ubuntu_namespace_v12.qml0000644000015600001650000000233712700370701023732 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 1.0 import Ubuntu.Components 1.2 Item { width: 100 height: 62 TestCase { function test_API() { verify(!Ubuntu.hasOwnProperty("toolkitVersion"), "toolkitVersion is part of 1.3 API!"); verify(!Ubuntu.hasOwnProperty("toolkitVersionMajor"), "toolkitVersionMajor is part of 1.3 API!"); verify(!Ubuntu.hasOwnProperty("toolkitVersionMinor"), "toolkitVersionMajor is part of 1.3 API!"); verify(!Ubuntu.hasOwnProperty("version"), "version() is part of 1.3 API!"); } } } ./tests/unit/tst_arguments/0000755000015600001650000000000012700370701016112 5ustar jenkinsjenkins./tests/unit/tst_arguments/tst_arguments.pro0000644000015600001650000000007212700370701021532 0ustar jenkinsjenkinsinclude(../test-include.pri) SOURCES += tst_arguments.cpp ./tests/unit/tst_arguments/tst_arguments.cpp0000644000015600001650000005277412700370701021534 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #define protected public #include "ucarguments.h" #undef protected #include #include #include #include #include #include "uctestcase.h" #include #include "i18n.h" class tst_UCArguments : public QObject { Q_OBJECT public: tst_UCArguments() : m_application(NULL) {} private: QVector m_arguments; int m_argumentsSize; QCoreApplication* m_application; QQmlEngine *engine = Q_NULLPTR; void clearCommandLine() { m_arguments.clear(); m_argumentsSize = 0; delete engine; engine = Q_NULLPTR; if (m_application != NULL) { delete m_application; m_application = NULL; } } void setCommandLine(QString commandLine) { clearCommandLine(); QStringList arguments = QString(commandLine).split(' ', QString::SkipEmptyParts); Q_FOREACH (QString argument, arguments) { QByteArray text = argument.toLocal8Bit(); char *data = new char[text.size() + 1]; strcpy(data, text.data()); m_arguments.append(data); } char* binaryName = (char*)"binary"; m_arguments.prepend(binaryName); m_argumentsSize = m_arguments.size(); m_application = new QCoreApplication(m_argumentsSize, m_arguments.data()); engine = new QQmlEngine; // initialize i18 only UbuntuI18n::instance(engine); } void testCommandLine(QString commandLine, bool expectedError, QString dataTag=QString()) { if (dataTag.isEmpty()) { dataTag = commandLine; } QTest::newRow(dataTag.toLocal8Bit().constData()) << commandLine << expectedError; } void testCommandLineUsage(QString commandLine, bool expectedError, bool usage=false, QString dataTag=QString()) { QTest::newRow(dataTag.toLocal8Bit().constData()) << commandLine << expectedError << usage; } void testCommandLineForUnicode(QString argumentValue) { QTest::newRow(argumentValue.toLocal8Bit().constData()) << QString("--unicodeArgument ").append(argumentValue) << argumentValue; } private Q_SLOTS: void testNoArguments() { QFETCH(QString, commandLine); QFETCH(bool, error); setCommandLine(commandLine); UCArguments arguments; arguments.componentComplete(); QCOMPARE(arguments.error(), error); } void testNoArguments_data() { QTest::addColumn("commandLine"); QTest::addColumn("error"); testCommandLine("", false, "NO ARGUMENTS"); testCommandLine("--boolArgument", false); testCommandLine("--boolArgument --boolArgument", false); testCommandLine("--boolArgument --otherBool", false); testCommandLine("--boolArgument --otherArg1=value --otherArg2 value", false); testCommandLine("--boolArgument --otherArg=value defaultValue1 defaultValue2", false); testCommandLine("--otherArg=value --boolArgument defaultValue1 defaultValue2", false); testCommandLine("--otherArg=value defaultValue1 defaultValue2 --boolArgument", false); testCommandLine("--otherArg=value defaultValue1 defaultValue2", false); } void testUsage() { QFETCH(QString, commandLine); QFETCH(bool, error); setCommandLine(commandLine); UCArguments arguments; if (error) { QString usage(arguments.usage()); QTest::ignoreMessage(QtWarningMsg, usage.toUtf8()); } arguments.componentComplete(); QCOMPARE(arguments.error(), error); } void testUsage_data() { QTest::addColumn("commandLine"); QTest::addColumn("error"); testCommandLine("", false, "NO ARGUMENTS"); testCommandLine("--usage", true); testCommandLine("--help", true); testCommandLine("-h", true); testCommandLine("--boolArgument --usage", true); testCommandLine("--boolArgument --otherArgument --usage", true); testCommandLine("--usage --boolArgument --otherArgument", true); } void testUnicodeArgument() { /* Pretend that the system is UTF-8 so that the inputted command line * that is itself UTF-8 is correctly decoded by Qt. */ QTextCodec* previousCodec = QTextCodec::codecForLocale(); QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QFETCH(QString, commandLine); QFETCH(QString, expectedValue); setCommandLine(commandLine); UCArguments arguments; QStringList valueNames; valueNames << "VALUE1"; UCArgument unicodeArgument; unicodeArgument.setName("unicodeArgument"); unicodeArgument.setValueNames(valueNames); arguments.appendArguments(&unicodeArgument); arguments.componentComplete(); QCOMPARE(arguments.values()->property("unicodeArgument").type(), QVariant::String); QCOMPARE(arguments.values()->property("unicodeArgument").toString(), expectedValue); QTextCodec::setCodecForLocale(previousCodec); } void testUnicodeArgument_data() { QTest::addColumn("commandLine"); QTest::addColumn("expectedValue"); testCommandLineForUnicode(QString("DIRECCIÓN")); testCommandLineForUnicode(QString("ファイル名を")); testCommandLineForUnicode(QString("☭☢€→☎❄♫✂▷✇♎⇧☮♻⌘⌛☘")); testCommandLineForUnicode(QString("file://Vidéos/Le.goût.des.autres.-.DIVX[www.makingoff.org]")); } void testOneRequiredNamedBoolArgument() { QFETCH(QString, commandLine); QFETCH(bool, error); QFETCH(bool, usage); setCommandLine(commandLine); UCArguments arguments; UCArgument boolArgument; boolArgument.setName("boolArgument"); arguments.appendArguments(&boolArgument); if (error) QTest::ignoreMessage(QtWarningMsg, "binary is expecting an additional argument: --boolArgument"); if (error && usage) QTest::ignoreMessage(QtWarningMsg, arguments.usage().toUtf8()); arguments.componentComplete(); QCOMPARE(arguments.values()->property("boolArgument").type(), QVariant::Bool); QCOMPARE(arguments.values()->property("boolArgument"), QVariant(!error)); QCOMPARE(arguments.error(), error); } void testOneRequiredNamedBoolArgument_data() { QTest::addColumn("commandLine"); QTest::addColumn("error"); QTest::addColumn("usage"); testCommandLineUsage("", true, true, "NO ARGUMENTS"); testCommandLineUsage("--boolArgument", false); testCommandLineUsage("--boolArgument --boolArgument", false); testCommandLineUsage("--boolArgument --otherBool", false); testCommandLineUsage("--boolArgument --otherArg1=value --otherArg2 value", false); testCommandLineUsage("--boolArgument --otherArg=value defaultValue1 defaultValue2", false); testCommandLineUsage("--otherArg=value --boolArgument defaultValue1 defaultValue2", false); testCommandLineUsage("--otherArg=value defaultValue1 defaultValue2 --boolArgument", false); testCommandLineUsage("--otherArg=value defaultValue1 defaultValue2", true, true); } void testOneRequiredNamedArgument() { QFETCH(QString, commandLine); QFETCH(bool, error); QFETCH(bool, usage); setCommandLine(commandLine); UCArguments arguments; QStringList valueNames; valueNames << "VALUE1"; UCArgument argument1; argument1.setName("argument1"); argument1.setValueNames(valueNames); arguments.appendArguments(&argument1); if (error) QTest::ignoreMessage(QtWarningMsg, "binary is expecting an additional argument: --argument1=VALUE1"); if (error && usage) QTest::ignoreMessage(QtWarningMsg, arguments.usage().toUtf8()); arguments.componentComplete(); QCOMPARE(arguments.error(), error); if (!error) { QCOMPARE(arguments.values()->property("argument1").type(), QVariant::String); QCOMPARE(arguments.values()->property("argument1").toString(), QString("value1")); } else { QCOMPARE(arguments.values()->property("argument1").type(), QVariant::Invalid); } } void testOneRequiredNamedArgument_data() { QTest::addColumn("commandLine"); QTest::addColumn("error"); QTest::addColumn("usage"); testCommandLineUsage("", true, true, "NO ARGUMENTS"); testCommandLineUsage("--argument1=value1", false); testCommandLineUsage("--argument1 value1", false); testCommandLineUsage("--otherArgument --argument1 value1", false); testCommandLineUsage("--argument1 value1 --otherArgument", false); testCommandLineUsage("--argument1 value1 defaultValue --otherArgument", false); testCommandLineUsage("--argument1=value1 defaultValue --otherArgument=value", false); testCommandLineUsage("--argument1 value1 defaultValue", false); } void testTwoRequiredNamedArguments() { QFETCH(QString, commandLine); QFETCH(bool, error); QFETCH(bool, usage); setCommandLine(commandLine); UCArguments arguments; QStringList valueNames; valueNames << "VALUE1" << "VALUE2"; UCArgument argument1; argument1.setName("argument1"); argument1.setValueNames(valueNames); arguments.appendArguments(&argument1); UCArgument argument2; argument2.setName("argument2"); argument2.setValueNames(valueNames); arguments.appendArguments(&argument2); if (error && commandLine == "--argument1=value1 value2 --argument2=value1") QTest::ignoreMessage(QtWarningMsg, "binary is expecting a value for argument: --argument2=VALUE1 VALUE2"); else if (error) QTest::ignoreMessage(QtWarningMsg, "binary is expecting an additional argument: --argument1=VALUE1 VALUE2"); if (error && usage) QTest::ignoreMessage(QtWarningMsg, arguments.usage().toUtf8()); arguments.componentComplete(); QCOMPARE(arguments.error(), error); if (!error) { QCOMPARE(arguments.values()->property("argument1").type(), QVariant::StringList); QCOMPARE(arguments.values()->property("argument1").toStringList().size(), 2); QCOMPARE(arguments.values()->property("argument2").type(), QVariant::StringList); QCOMPARE(arguments.values()->property("argument2").toStringList().size(), 2); } } void testTwoRequiredNamedArguments_data() { QTest::addColumn("commandLine"); QTest::addColumn("error"); QTest::addColumn("usage"); testCommandLineUsage("", true, "NO ARGUMENTS"); testCommandLineUsage("--argument1=value1 value2 --argument2=value1 value2", false); testCommandLineUsage("--argument1 value1 value2 --argument2 value1 value2", false); testCommandLineUsage("--otherArgument --argument1 value1 value2 --argument2 value1 value2", false); testCommandLineUsage("--argument1 value1 value2 --argument2 value1 value2 --otherArgument", false); testCommandLineUsage("--argument1 value1 value2 --argument2 value1 value2 defaultValue --otherArgument", false); testCommandLineUsage("--argument1 value1 value2 --argument2 value1 value2 defaultValue", false); testCommandLineUsage("--argument1=value1 value2 --argument2=value1", true, true); } void testRequiredDefaultArgument() { QFETCH(QString, commandLine); QFETCH(bool, error); QFETCH(bool, usage); setCommandLine(commandLine); UCArguments arguments; QStringList valueNames; valueNames << "DEFAULTVALUE1" << "DEFAULTVALUE2"; UCArgument defaultArgument; defaultArgument.setValueNames(valueNames); arguments.setDefaultArgument(&defaultArgument); if (error) QTest::ignoreMessage(QtWarningMsg, "binary is expecting additional arguments: DEFAULTVALUE1 DEFAULTVALUE2"); if (error && usage) QTest::ignoreMessage(QtWarningMsg, arguments.usage().toUtf8()); arguments.componentComplete(); QCOMPARE(arguments.error(), error); if (!error) { QCOMPARE(arguments.defaultArgument(), &defaultArgument); QCOMPARE(arguments.defaultArgument()->at(0).type(), QVariant::String); QCOMPARE(arguments.defaultArgument()->at(0).toString().isEmpty(), false); QCOMPARE(arguments.defaultArgument()->at(0).toString(), QString("defaultValue1")); QCOMPARE(arguments.defaultArgument()->at(1).type(), QVariant::String); QCOMPARE(arguments.defaultArgument()->at(1).toString().isEmpty(), false); QCOMPARE(arguments.defaultArgument()->at(1).toString(), QString("defaultValue2")); QCOMPARE(arguments.defaultArgument()->at(2).type(), QVariant::Invalid); } } void testRequiredDefaultArgument_data() { QTest::addColumn("commandLine"); QTest::addColumn("error"); QTest::addColumn("usage"); testCommandLineUsage("", true, true, "NO ARGUMENTS"); testCommandLineUsage("--boolArgument", true, true); testCommandLineUsage("--boolArgument --otherArg1=value --otherArg2 value", true, true); testCommandLineUsage("--boolArgument --otherArg=value defaultValue1 defaultValue2", false, false); testCommandLineUsage("--otherArg=value --boolArgument defaultValue1 defaultValue2", false, false); testCommandLineUsage("--otherArg=value defaultValue1 defaultValue2 --boolArgument", false, false); testCommandLineUsage("--otherArg=value defaultValue1 defaultValue2", false, false); } void testAPIdefaultArgument() { UCArguments arguments; arguments.componentComplete(); // getter UCArgument* defaultArgument = arguments.defaultArgument(); QCOMPARE(defaultArgument->name(), QString()); QCOMPARE(defaultArgument->help(), QString()); QCOMPARE(defaultArgument->required(), true); QCOMPARE(defaultArgument->valueNames().size(), 0); QCOMPARE(defaultArgument->at(0).type(), QVariant::Invalid); // setter: custom UCArgument UCArgument customDefaultArgument; QSignalSpy spy(&arguments, SIGNAL(defaultArgumentChanged())); arguments.setDefaultArgument(&customDefaultArgument); QCOMPARE(spy.count(), 1); QCOMPARE(arguments.defaultArgument(), &customDefaultArgument); // setter: NULL arguments.setDefaultArgument(NULL); QCOMPARE(arguments.defaultArgument(), (UCArgument*)NULL); } void testAPIprintUsage() { UCArguments arguments; QString usage(arguments.usage()); QTest::ignoreMessage(QtWarningMsg, usage.toUtf8()); arguments.printUsage(); } void testAPIquitWithError() { UCArguments arguments; QString errorMessage("error message"); QCOMPARE(arguments.error(), false); QCOMPARE(arguments.errorMessage(), QString()); QTest::ignoreMessage(QtWarningMsg, errorMessage.toUtf8()); arguments.quitWithError(errorMessage); QCOMPARE(arguments.error(), true); QCOMPARE(arguments.errorMessage(), errorMessage); } // unit tests for private API: only done to simplify error tracking // do not hesitate to rip off when refactoring UCArgument's implementation void testAPIbuildExpectedArguments() { UCArguments arguments; QStringList valueNames; valueNames << "VALUE1" << "VALUE2"; UCArgument argument1; argument1.setName("argument1"); argument1.setValueNames(valueNames); arguments.appendArguments(&argument1); UCArgument argument2; argument2.setName("argument2"); argument2.setValueNames(valueNames); arguments.appendArguments(&argument2); QList declaredArguments; QHash result; QHash expectedResult; result = arguments.buildExpectedArguments(declaredArguments); QCOMPARE(result, expectedResult); declaredArguments.append(&argument1); declaredArguments.append(&argument2); result = arguments.buildExpectedArguments(declaredArguments); expectedResult.insert("argument1", valueNames); expectedResult.insert("argument2", valueNames); QCOMPARE(result, expectedResult); } void testAPIparseRawArguments() { UCArguments arguments; QStringList values; values << "value1" << "value2"; QStringList rawArguments; QHash expectedArguments; QHash result; QHash expectedResult; result = arguments.parseRawArguments(rawArguments, expectedArguments); QCOMPARE(result, expectedResult); expectedArguments.insert("argument1", values); expectedArguments.insert("argument2", values); expectedResult.insert("argument1", values); expectedResult.insert("argument2", values); rawArguments << "binary" << "--argument1" << "value1" << "value2" << "--argument2" << "value1" << "value2"; result = arguments.parseRawArguments(rawArguments, expectedArguments); QCOMPARE(result, expectedResult); rawArguments.clear(); rawArguments << "binary" << "--argument1=value1" << "value2" << "--argument2" << "value1" << "value2"; result = arguments.parseRawArguments(rawArguments, expectedArguments); QCOMPARE(result, expectedResult); } void testAPIcollectArgumentValues() { UCArguments arguments; QStringList::const_iterator i; QStringList::const_iterator end; int nValues = 0; QStringList result; QStringList expectedResult; result = arguments.collectArgumentValues(i, end, nValues); QCOMPARE(result, expectedResult); QStringList rawArguments; rawArguments << "binary" << "--argument1" << "value1" << "value2" << "--argument2" << "value1" << "value2"; i = rawArguments.constBegin(); i++; // i points to "--argument1" end = rawArguments.constEnd(); nValues = 2; expectedResult << "value1" << "value2"; result = arguments.collectArgumentValues(i, end, nValues); QCOMPARE(result, expectedResult); QStringList::const_iterator iExpected = rawArguments.constBegin(); iExpected++; iExpected++; iExpected++; // iExpected points to "value2" QCOMPARE(i, iExpected); } void testAPIusageRequested() { UCArguments arguments; QStringList argumentNames; QCOMPARE(arguments.usageRequested(argumentNames), false); argumentNames.clear(); argumentNames.append("usage"); QCOMPARE(arguments.usageRequested(argumentNames), true); argumentNames.clear(); argumentNames.append("h"); QCOMPARE(arguments.usageRequested(argumentNames), true); argumentNames.clear(); argumentNames.append("help"); QCOMPARE(arguments.usageRequested(argumentNames), true); argumentNames.clear(); argumentNames.append("anything"); argumentNames.append("usage"); QCOMPARE(arguments.usageRequested(argumentNames), true); argumentNames.clear(); argumentNames.append("anything"); QCOMPARE(arguments.usageRequested(argumentNames), false); } }; // Do not use QTEST_MAIN. QTEST_MAIN is 99.99% of the times what you // want when running a Qt testcase but it creates a Q*Application and in // this case that is not wanted since we are creating and destroying them as // part of the test and Qt doesn't like when there's more than one Q*Application // at the same time, so do without creating a Q*Application in main. // This can of course have some implications but it seems that // for this testcase all is fine. int main(int argc, char *argv[]) { int myArgc = argc; char **myArgv = new char*[argc + 1]; // Eat -platform xyz, we're just using QCoreApplications here so // no need to say the gui platform to use // We are techically leaking the myArgv char** and it's strdup'ed contents // but it happens the binary just finishes after, so not a problem int j = 0; for (int i = 0; i < argc; i++) { if (argv[i] == QString("-platform")) { if (i < argc) { i++; // skip also the platform value myArgc -= 2; } else { myArgc -= 1; } } else { myArgv[j] = strdup(argv[i]); j++; } } myArgv[myArgc] = 0; tst_UCArguments tc; return QTest::qExec(&tc, myArgc, myArgv); } #include "tst_arguments.moc" ./tests/uitk_test_plan.sh0000644000015600001650000005705412700370714015634 0ustar jenkinsjenkins#!/bin/bash # Copyright 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 2.1. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # # Author: Zoltán Balogh LAZY=true SERIALNUMBER=086e443edf51b915 RESET=false COMISSION=false COMISSION_SILO=false COMISSION_FLASH=false COMISSION_BOOTSTRAP=false DONOTRUNTESTS=false PPA="ubuntu-sdk-team/staging" TIMESTAMP=`date +"%Y_%m_%d-%H_%M_%S"` DATESTAMP=`date +"%Y_%m_%d"` LOGFILENAME="ap-${TIMESTAMP}" OUTPUTDIR=$HOME FILTER=.* RTM=true REVISION=105 DISTRO="ubuntu" SERIES="vivid" CHANNEL="ubuntu-touch/rc-proposed/${DISTRO}" PASSWORD="0000" BOOTTIME=250 ONLYCOMPARE=false DISTUPGRADE=false UNLOCK_ONLY=false NORMAL_USE=false WIPE="--wipe" VERBOSE=true declare -a TEST_SUITE=( " -p mediaplayer-app-autopilot mediaplayer_app" " -p dialer-app-autopilot dialer_app" " -p reminders-app-autopilot reminders" " -p ubuntu-ui-toolkit-autopilot ubuntuuitoolkit" " -p webbrowser-app-autopilot webbrowser_app" " -p address-book-app-autopilot address_book_app" " sudoku_app" " ubuntu_calculator_app" " dropping_letters_app" " ubuntu_weather_app" " -p ubuntu-system-settings-autopilot ubuntu_system_settings" " music_app" " gallery_app" " -p messaging-app-autopilot messaging_app" " camera_app" # " filemanager" # " ubuntu_terminal_app" " -n unity8" # " ubuntu_clock_app" # " shorts_app" # " online_accounts_ui" ) UITK_PACKAGES="qtdeclarative5-ubuntu-ui-toolkit-plugin \ ubuntu-ui-toolkit-autopilot \ ubuntu-ui-toolkit-theme" #UITK_PACKAGES="unity8 unity8-common unity8-private" #UITK_PACKAGES="qtmir-android qtdeclarative5-qtmir-plugin" AP_PACKAGES="address-book-service-dummy \ python3-lxml \ ubuntu-ui-toolkit-autopilot \ gallery-app-autopilot \ reminders-app-autopilot \ address-book-app-autopilot \ # messaging-app-autopilot \ # unity8-autopilot \ dialer-app-autopilot \ camera-app-autopilot \ webbrowser-app-autopilot \ mediaplayer-app-autopilot \ unity-webapps-qml-autopilot \ ubuntu-system-settings-autopilot\ ubuntu-html5-ui-toolkit-autopilot \ ubuntu-system-settings-online-accounts-autopilot \ messaging-app-autopilot \ unity8" declare -a UNREGISTERED_APPS=( "com.ubuntu.terminal" "com.ubuntu.calculator" "com.ubuntu.shorts" ) function echo(){ if [[ $VERBOSE == true ]]; then builtin echo $@; fi } wait_for_shell() { # Waiting for device on ADB set -e adb -s ${SERIALNUMBER} wait-for-device # Start waiting for Unity8" until PIDS=$(adb -s ${SERIALNUMBER} shell pidof unity8 2>/dev/null|egrep -v "^$"); do sleep 0.1; done; echo "Unity8 is up with PID: ${PIDS}" set +e } # some apps needs special permission to access system service. fix_permissions () { APP_ID=$1 SERVICE=$2 NUMBER_OF_ROWS=`adb shell "echo 'SELECT Count(*) FROM requests;' | sqlite3 /home/phablet/.local/share/${SERVICE}/trust.db"` NUMBER_OF_ROWS="${NUMBER_OF_ROWS%"${NUMBER_OF_ROWS##*[![:space:]]}"}" NUMBER_OF_ROWS=$(( $NUMBER_OF_ROWS + 1 )) EPOCH_DATE=`date +%s%N | cut -b1-19` APP_ID=$1 adb shell "echo \"INSERT INTO requests VALUES(${NUMBER_OF_ROWS}, '${APP_ID}', 0, ${EPOCH_DATE}, 1);\"|sqlite3 /home/phablet/.local/share/${SERVICE}/trust.db" } fatal_failure () { echo -e "\e[31mFailed operation:\e[0m $1" exit } sleep_indicator () { if [ -z "$1" ]; then i=1 while [ $(adb get-state -s ${SERIALNUMBER}) == "unknown" ] do echo -ne "Wait for adb: $i seconds\r" sleep 1 i=$[$i+1] done echo -ne '\n' until pids=$(adb -s ${SERIALNUMBER} shell pidof unity-system-compositor|egrep -v "^$|initctl:"); do echo -ne "Wait for compositor: $i seconds\r" sleep 1; i=$[$i+1] done; echo -ne '\n' return fi SLEEP=$1 for (( LOOPVAR=1; LOOPVAR<= ${SLEEP}; LOOPVAR++ )) do echo -ne "Wait: $SLEEP/$LOOPVAR seconds\r" sleep 1 done echo -ne '\n' return 0 } function network { if phablet-network -s ${SERIALNUMBER} 2>&1|grep -q Error; then echo "Reset and try again." reset -f phablet-network -s ${SERIALNUMBER} 2>&1 fi } function reset { if [ ${RESET} == true -o x"$1" == x-f ]; then if [ ${UNLOCK_ONLY} == false ]; then adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S reboot 2>&1|grep -v password" sleep_indicator 120 wait_for_shell sleep_indicator 10 network fi if [ ${NORMAL_USE} == false ]; then phablet-config -s ${SERIALNUMBER} autopilot --dbus-probe enable 2>&1 > /dev/null adb -s ${SERIALNUMBER} shell powerd-cli display on |egrep -v "Display State requested, cookie is|Press ctrl-c to exit|not fully supported." & adb -s ${SERIALNUMBER} shell powerd-cli active |egrep -v "requested, cookie is|Press ctrl-c to exit|not fully supported." & #sleep_indicator 10 adb -s ${SERIALNUMBER} shell amixer -D pulse set Master 1+ mute 2>&1 > /dev/null adb -s ${SERIALNUMBER} shell "gdbus call --session --dest com.canonical.UnityGreeter --object-path / --method com.canonical.UnityGreeter.HideGreeter|grep -v '\(\)'" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S dbus-send --system --print-reply \ --dest=org.freedesktop.Accounts \ /org/freedesktop/Accounts/User32011 \ org.freedesktop.DBus.Properties.Set \ string:com.canonical.unity.AccountsService \ string:demo-edges variant:boolean:false 2>&1|grep -v password|egrep -v '\(\)|method return'" fi fi } function device_comission { if [ ${COMISSION_BOOTSTRAP} == true ]; then # bootstrap the device with the latest image ubuntu-device-flash --revision=399 touch --channel=${CHANNEL} --wipe --bootstrap --developer-mode --password=0000a elif [ ${COMISSION_FLASH} == true ]; then adb -s ${SERIALNUMBER} wait-for-device # Avoid https://bugs.launchpad.net/gallery-app/+bug/1363190 adb -s ${SERIALNUMBER} shell "echo ${PASSWORD} |sudo -S rm -rf /userdata/user-data/phablet/.cache/com.ubuntu.gallery 2>&1|grep -v password" # flash the latest image echo -e "Flashing \e[31m${CHANNEL}\e[0m" ubuntu-device-flash touch --serial=${SERIALNUMBER} --channel=${CHANNEL} ${WIPE} --developer-mode --password=${PASSWORD} fi if [[ ${COMISSION_BOOTSTRAP} == true || ${COMISSION_FLASH} == true ]]; then sleep_indicator ${BOOTTIME} reset -f echo -e "Disable the intro wizard" phablet-config -s ${SERIALNUMBER} welcome-wizard --disable echo -e "Disable the edge swiping lecture " phablet-config -s ${SERIALNUMBER} edges-intro --disable fi echo -e "Clone the network " network sleep_indicator 10 reset if [ ${NORMAL_USE} == false ]; then # skip the click setup and app configuration if teh device is provisioned for normal use echo -e "Unregister few apps" # Unregister few apps as they break phablet-click-test-setup or something else for APP_TO_UNREGISTER in "${UNREGISTERED_APPS[@]}" do echo -e "\e[31m${APP_TO_UNREGISTER}\e[0m" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S click unregister ${APP_TO_UNREGISTER} 2>&1|grep -v password" done echo -e "Configure permissions for applications" fix_permissions com.ubuntu.camera_camera PulseAudio fix_permissions com.ubuntu.camera_camera CameraService fix_permissions com.ubuntu.clock_clock UbuntuLocationService echo -e "phablet-click-test-setup \e[31m${DISTRO} ${SERIES}\e[0m" phablet-click-test-setup -s ${SERIALNUMBER} --distribution=${DISTRO} --series=${SERIES} 2>&1 || fatal_failure "phablet-click-test-setup has failed" echo "Sleep after phablet-click-test-setup"; sleep_indicator 120 fi if [ ${PPA} == "archive" ]; then echo "Set up with the archive image" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S touch /userdata/.writable_image 2>&1|grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S touch /userdata/.adb_onlock 2>&1|grep -v password > /dev/null" reset -f echo "Sleep after turning the device writable"; sleep_indicator 120 network else if [[ "$PPA" =~ ^[0-9]{3}$ ]]; then echo -e "Set up with the silo \e[31m${PPA}\e[0m" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S touch /userdata/.writable_image 2>&1|grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S touch /userdata/.adb_onlock 2>&1|grep -v password > /dev/null" reset -f echo "Sleep after turning the device writable"; sleep_indicator 120 network # TODO: hide the sudo output adb -s ${SERIALNUMBER} shell "test -e /usr/sbin/policy-rc.d && cp /usr/sbin/policy-rc.d /tmp/policy-rc.d" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S bash -c 'echo \"exit 101\" > /usr/sbin/policy-rc.d' 2>&1|grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S bash -c 'chmod +x /usr/sbin/policy-rc.d' 2>&1|grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S bash -c 'echo \"deb http://ppa.launchpad.net/ci-train-ppa-service/landing-${PPA}/${DISTRO} ${SERIES} main\" > /etc/apt/sources.list.d/silo-${PPA}.list' 2>&1|grep -v password > /dev/null " # pin up the silo adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S bash -c 'echo -e \"Package: *\nPin: release o=LP-PPA-ci-train-ppa-service-landing-${PPA}\nPin-Priority: 1100\" > /etc/apt/preferences.d/silo.pref' 2>&1|grep -v password > /dev/null " # Resynchronize the package index files from their sources. adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S apt-get update 2>&1|grep -v password > /dev/null" else echo -e "Set up with the PPA \e[31m${PPA}\e[0m" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S touch /userdata/.writable_image 2>&1|grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S touch /userdata/.adb_onlock 2>&1|grep -v password > /dev/null" reset -f echo "Sleep after turning the device writable"; sleep_indicator 120 network adb -s ${SERIALNUMBER} shell "test -e /usr/sbin/policy-rc.d && cp /usr/sbin/policy-rc.d /tmp/policy-rc.d" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S bash -c 'echo \"exit 101\" > /usr/sbin/policy-rc.d' 2>&1|grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S bash -c 'chmod +x /usr/sbin/policy-rc.d' 2>&1|grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S bash -c 'echo \"deb http://ppa.launchpad.net/${PPA}/${DISTRO} ${SERIES} main\" > /etc/apt/sources.list.d/ppa.list' 2>&1|grep -v password > /dev/null" #pin up the PPA PIN_UP_PPA=${PPA/\//-} adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S bash -c 'echo -e \"Package: *\nPin: release o=LP-PPA-${PIN_UP_PPA}\nPin-Priority: 1100\" > /etc/apt/preferences.d/ppa.pref' 2>&1|grep -v password > /dev/null " adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S apt-get update 2>&1|grep -v password > /dev/null" fi fi adb -s ${SERIALNUMBER} shell rm -rf /home/phablet/autopilot/ubuntuuitoolkit UITK_VERSION=`adb -s ${SERIALNUMBER} shell "stty cols 250; dpkg -l"|grep qtdeclarative5-ubuntu-ui-toolkit-plugin|awk '{print $3}'` echo -e "Original UITK version:\t\e[31m${UITK_VERSION}\e[0m" echo "Updating APT"; adb -s ${SERIALNUMBER} shell "echo ${PASSWORD} |sudo -S apt-get update 2>&1|grep -v password > /dev/null" if [ ${DISTUPGRADE} == true ]; then echo "Install all the upgraded packages with dist-upgrade" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S apt-get dist-upgrade --yes --force-yes 2>&1 |grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S dpkg --configure -a 2>&1 |grep -v password > /dev/null" else echo "Install the UITK packages" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S apt-get install --yes --force-yes ${UITK_PACKAGES} 2>&1 |grep -v password > /dev/null" fi UITK_VERSION=`adb -s ${SERIALNUMBER} shell "stty cols 250; dpkg -l"|grep qtdeclarative5-ubuntu-ui-toolkit-plugin|awk '{print $3}'` echo -e "New UITK version:\t\e[31m${UITK_VERSION}\e[0m" # Update APT adb -s ${SERIALNUMBER} shell "echo ${PASSWORD} |sudo -S apt-get update 2>&1|grep -v password > /dev/null" # Install the autopilot tests for the apps adb -s ${SERIALNUMBER} shell "echo ${PASSWORD} |sudo -S apt-get install --yes --force-yes ${AP_PACKAGES} 2>&1 | grep -v password > /dev/null" echo "Cleaning QML cache for the next boot" adb -s ${SERIALNUMBER} shell "rm -rf ~/.cache/QML/Apps/" } function compare_results { sed -i 's/\r//g' *tests rm ${MAINFILE} 2> /dev/null for RESULT_FILE in *${PPA}.tests; do echo "$RESULT_FILE" >> ${MAINFILE}; LAST_LINE=`tail -1 $RESULT_FILE` if [[ "$LAST_LINE" =~ OK || "$LAST_LINE" =~ FAILED ]]; then echo -e "\t"`tail -2 $RESULT_FILE` >> ${MAINFILE} else echo -e "\tBroken tests" >> ${MAINFILE} fi egrep -v "NO TAGS DATABASE" $RESULT_FILE |egrep "^ERROR:|^FAIL:" | while read -r FAILED ; do FAILED=${FAILED/ERROR:/FAIL:} echo -e "\tFailed with ${PPA} - $FAILED" >> ${MAINFILE} FAILED_TEST_CASE=${FAILED/FAIL: /} #echo ${FAILED_TEST_CASE} if grep --quiet "$FAILED_TEST_CASE" *archive.tests; then echo -e "\tSame on archive" >> ${MAINFILE} else echo -e "\tPossible regression" >> ${MAINFILE} fi done done } while getopts ":hrintduc:slqwbvi:o:p:e:f:a:" opt; do case $opt in c) COMISSION=true case $OPTARG in "flash") COMISSION_FLASH=true ;; "bootstrap") COMISSION_BOOTSTRAP=true ;; "silo") COMISSION_SILO=true ;; *) echo "Invalid parameter for for -c [silo|flash|bootstrap]" esac ;; r) RESET=true ;; s) SERIALNUMBER=$OPTARG LAZY=false ;; e) PASSWORD=$OPTARG ;; o) if [ -d "$OPTARG" ]; then OUTPUTDIR=$OPTARG else echo "$OPTARG does not exist. Using default $OUTPUTDIR" fi ;; p) PPA=$OPTARG ;; a) START_FROM=$OPTARG ;; f) FILTER=$OPTARG ;; i) REVISION=$OPTARG ;; d) ONLYCOMPARE=true ;; n) DONOTRUNTESTS=true ;; u) RTM=false CHANNEL="ubuntu-touch/devel-proposed/ubuntu" DISTRO="ubuntu" SERIES="wily" ;; w) DISTUPGRADE=true ;; l) UNLOCK_ONLY=true VERBOSE=false ;; q) NORMAL_USE=true DONOTRUNTESTS=true COMISSION=true WIPE="" ;; v) VERBOSE=true ;; h) echo "Usage: uitk_test_plan.sh -s [serial number] -m -c [mode]" echo -e "\t-v : Enable verbose output. Default: ${VERBOSE}" echo -e "\t-r : Reset after each tests. Default: ${RESET}" echo -e "\t-s : Use the device with the given serial number. Default: ${SERIALNUMBER}" echo -e "\t-c : Comission the device with the ${PPA} enabled in [silo|flash|bootstrap]" echo -e "\t-d : Only compare the -p ${PPA} results with the archive test results. Default: ${ONLYCOMPARE}" echo -e "\t-n : Do not run the test set. Default ${DONOTRUNTESTS}" echo -e "\t-o : Output directory. Default $OUTPUTDIR" echo -e "\t-p : Source PPA for the UITK. Default $PPA. Use -p archive to test stock image or -p [0-9]* to set a silo." echo -e "\t-f : Filter for the test suite. Default $FILTER" echo -e "\t-a : Start the test suite from the given test." echo -e "\t-u : Provision the Development release of Ubuntu, Wily. Default is vivid-overlay (formerly RTM)." echo -e "\t-w : dist-upgrade to the whole PPA instead of just Ubuntu UI Toolkit. Default is only UITK." echo -e "\t-q : Provision the device for normal use with the ${PPA} enabled" echo "" echo "By default tihe uitk_test_plan.sh flashes the latest vivid-overlay image on the device, installs the click application" echo "tests, configures the ppa:ubuntu-sdk-team/staging PPA, installs the UITK from the PPA and executes the test plan." echo "" echo "Provision the device for normal use without wipeing the userdata" echo -e "\t$ ./uitk_test_plan.sh -q" echo "" echo "Validate the staging branch of the UITK against the vivid-overlay image" echo -e "\t$ ./uitk_test_plan.sh -c" echo "" echo "Validate the UITK from a CI silo on an vivid-overlay image" echo -e "\t$ ./uitk_test_plan.sh -c -p 001" echo "" echo "Validate the UITK from teh archive on an vivid-overlay image" echo -e "\t$ ./uitk_test_plan.sh -c -p archive" echo "" echo "Validate the UITK from a specific CI silo on an Ubuntu Wily image" echo -e "\t$ ./uitk_test_plan.sh -c -p 001 -u" echo "" echo "Provision the device for manual testing with the latest vivid-overlay image" echo -e "\t$ ./uitk_test_plan.sh -c -p archive -n" echo "" echo "Provision the device for manual testing with the latest Ubuntu Wily image" echo -e "\t$ ./uitk_test_plan.sh -c -p archive -u -n" echo "" echo "Run the test plan on an already provisioned device" echo -e "\t$ ./uitk_test_plan.sh" echo "" echo "Run only the UITK tests on an already provisioned device" echo -e "\t$ ./uitk_test_plan.sh -f ubuntuuitoolkit" echo "" echo "Compare the archive test results with the silo 001 results" echo -e "\t$ ./uitk_test_plan.sh -d -p 001" exit ;; :) echo "Option -$OPTARG requires an argument." >&2 exit esac done MAINFILE=MAIN-ap-${DATESTAMP}-${SERIES}-${PPA} MAINFILE=${MAINFILE/\//_} if [ ${ONLYCOMPARE} == true ]; then echo "Comparing results with the archive tests" > $MAINFILE PPA=${PPA/\//_} compare_results rm ${MAINFILE}-regressing_cases 2> /dev/null egrep "regression" -B1 ${MAINFILE} |grep Failed|sort|uniq -c|grep " 2"|sed 's/2//g' >${MAINFILE}-regressing_cases rm ${MAINFILE}-regression_backtraces 2> /dev/null for i in $(cat ${MAINFILE}|egrep "regression" -B1 |grep Failed|sort|uniq -c|grep " 2"|awk '{print $7}'); do sed -n "/$i/,/=====/p" *.tests|sed -e '/Traceback/,/=====/p'|uniq -c|egrep "FAIL\:|ERROR\:| 2"|perl -p -e "s/^\s+\d //g;s/^ERROR:/\nERROR:/;s/^FAIL:/\nFAIL:/" >> ${MAINFILE}-regression_backtraces done exit fi if [ ${COMISSION_BOOTSTRAP} == false ]; then # Use the first available device for testing if [ ${LAZY} == true ]; then echo "Waiting for a device" adb wait-for-device SERIALNUMBER=`adb devices -l | grep -Ev "List of devices attached" | grep -Ev "emulator-" | sed "/^$/d"|sed "s/ .*//g"` else echo "Waiting for the device with ${SERIALNUMBER} serial number." adb -s ${SERIALNUMBER} wait-for-device fi fi echo "=== Settings ===" echo "" echo "Serial number: ${SERIALNUMBER}" echo "Output directory: ${OUTPUTDIR}" echo "PPA: $PPA" echo "Filter: ${FILTER}" echo "Start with: ${START_FROM}" echo "" echo "Unlock only: ${UNLOCK_ONLY}" echo "Reset: ${RESET}" echo "Commission: ${COMISSION}" echo "Only compare: ${ONLYCOMPARE}" echo "Do not run tests: ${DONOTRUNTESTS}" echo "Provision for normal use: ${NORMAL_USE}" echo "RTM: ${RTM}" echo "Dist-upgrade: ${DISTUPGRADE}" echo "Main logs: ${MAINFILE}" echo "=== Starting ===" echo "" if [ ${UNLOCK_ONLY} == true ]; then adb -s ${SERIALNUMBER} shell powerd-cli display on |egrep -v "Display State requested, cookie is|Press ctrl-c to exit|not fully supported." & adb -s ${SERIALNUMBER} shell powerd-cli active |egrep -v "requested, cookie is|Press ctrl-c to exit|not fully supported." & adb -s ${SERIALNUMBER} shell "gdbus call --session --dest com.canonical.UnityGreeter --object-path / --method com.canonical.UnityGreeter.HideGreeter|grep -v '\(\)'" exit fi # Check if the device need to be flashed and set up for testing if [ ${COMISSION} == true ]; then device_comission if [[ -f ${MAINFILE} ]]; then egrep "regression" -B1 ${MAINFILE} |grep Failed|sort|uniq -c|grep " 2" fi fi # Fix the PPA string as it is used in log file names PPA=${PPA/\//_} # Check if the job is only comissioning the device if [ ${DONOTRUNTESTS} != true ]; then # Reset the device for testing reset -f # Run the test suite for TEST_SET in "${TEST_SUITE[@]}" do if [[ ! -z $START_FROM ]]; then if [[ ! ${TEST_SET} =~ ${START_FROM} ]]; then continue else unset START_FROM fi fi if [[ ${TEST_SET} =~ ${FILTER} ]]; then APPNAME=${TEST_SET##* } LOGFILE="$OUTPUTDIR/${LOGFILENAME}-${APPNAME}-1-${PPA}.tests" COMMAND="phablet-test-run -r ${PASSWORD} -s ${SERIALNUMBER} $TEST_SET >> ${LOGFILE}" echo "<<<=== ${APPNAME} 1 ===>>>" >> ${LOGFILE} reset eval ${COMMAND} egrep "<<<===|Ran|OK|FAILED" ${LOGFILE} # check if the tests were successful and re-run after a reset if (tail -1 ${LOGFILE}|grep -q OK) ;then echo -e "OK - ${LOGFILE}"; else echo -e "\e[31mFailed\e[0m - ${LOGFILE}"; reset -f LOGFILE="$OUTPUTDIR/${LOGFILENAME}-${APPNAME}-2-${PPA}.tests" COMMAND="phablet-test-run -r ${PASSWORD} -s ${SERIALNUMBER} $TEST_SET >> ${LOGFILE}" echo "<<<=== ${APPNAME} 2 ===>>>" >> ${LOGFILE} eval ${COMMAND} egrep "<<<===|Ran|OK|FAILED" ${LOGFILE} if (tail -1 ${LOGFILE}|grep -q OK) ;then echo -e "OK - ${LOGFILE}"; else echo -e "\e[31mFailed\e[0m - ${LOGFILE}"; fi fi fi done fi if [[ ${NORMAL_USE} != true && ${PPA} != "archive" && ${DONOTRUNTESTS} != true ]]; then echo "Comparing results with the archive tests" > $MAINFILE compare_results fi ./tests/license/0000755000015600001650000000000012700370701013656 5ustar jenkinsjenkins./tests/license/checklicense.sh0000755000015600001650000000245512700370701016643 0ustar jenkinsjenkins#!/bin/bash -e # # Copyright 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # Based on pbuilderjenkins license checking script. include_files="\.(c(c|pp|xx)?|h(h|pp|xx)?|p(l|m)|php|py(|x)|java|js|vala|qml)$" exclude_dirs="(3rd_party|qrc_|moc_|_build|include)" allowed_licenses="(Canonical|Android|Google|Digia)" issues_count=`licensecheck --noconf -r * --copyright -m -c $include_files -i $exclude_dirs | egrep -v $allowed_licenses | wc -l` if [ $issues_count -eq 0 ]; then echo No license problems found. exit 0 else echo Found $issues_count license problems: # Run it a second time to print a nice list of issues licensecheck --noconf -r * --copyright -m -c $include_files -i $exclude_dirs | egrep -v $allowed_licenses exit 1 fi ./tests/resources/0000755000015600001650000000000012700370701014246 5ustar jenkinsjenkins./tests/resources/optionselector/0000755000015600001650000000000012700370701017317 5ustar jenkinsjenkins./tests/resources/optionselector/test.png0000644000015600001650000002243312700370701021010 0ustar jenkinsjenkinsPNG  IHDRHc"bKGD pHYs  tIME7'ܓ^ IDATx]ydUy@(* $#%hAĈVeJ-K%njR".)7*AKDfy{'{{~=ornݯ{wm{8scYs(xs{xk= h_ocp`Ъjzn%3ěJ7~Oʳbϊ6LHx|\@r^@uYtk",au8ifl|6Pu1&keȮ EX$Q8 owLNc*aC^, *_npqVf*>rz[0)MxKPGR$n&H[ ~ HɐUKurp=1(X(^1w5!A( Ц,G !xpI@M8&kq]. ,Z Zeo%_uiњ2r} }yEzubY,TV  .>sxњB=>M!S쥅%Nop6!< dQ,. sk11Y]5fvb7`(mCX'%( f]drцɴy/E>>9@Xǝ#' rfqL 5=vIA)aߤ"k6w:^sMt:h͝ޗ49"@[7>^7fb.|Hpn醿nsDbU ycđ~2B+p}!|q6}f#u5~pj cB1`6.BG/ :~cO=.1eElqi+Zq<<1ʧ3iA& 9L!F_1D=*wm-7{S\[IMC 15dHj `gFHvX0v V koFA׈y;G:{8xi,Ol^Ekdq %Qy KA~ ZB85לph3 p`j-kIpgb@a.~E! ZIDJ6L8}(OdeW4苟A/["6|Z\5Cxrg!=`T܏:JX3f `.Vќ xWs5zSVtJMFڱY2fG,Yhͭu"GW>A!@8E^hY) V+ζ`+\k[k /3quQ9#N9CǸXŸ́8@{B7!.tl{D'J2õ'z~ < RIPEC=l@\)2:j9GjE\ϓ5*ꀚTg Ǣm2ļOT?Dz/?!.- -. QSm^OeJGB\ֶ-!THW U^qy){Y) ʑP 5(n61 Q(eT2,; ^篯zX])͒1H<,^@lA&C%c );dprG0sѬ絉5;+$gg8闂6WDcϳrd%"e`j9m 8&aT s@v42Y&jq@f\ @\.qH{Θn5z0h;W2e','i4ZaTŠ9kMAmNN+;*oL#xO5Kܲ6 !D){ I GՐnGT ;١()#7_t2a4gy5y>!B^s [1fmͯYH{$ڤO3H-a,ׯ^(DK(uC]؜ŔE,-r#l<M(ZMw -VhGe \JHTl hpa{5a0hy*-'jdF9!fNh8&8eagǻKQ[AuTd5>qRB'؛|@׌Q*Bn+ #[U8x[;!9OPwD1ĄQ3})XbD_ւf;%&p؄:@ڃD8²ܯE(0 .A/Lr#CtFcW`z9n Ü#w&V.ލ]я8"ܰsY597"*52wq?ZbιiMJGIB2&~*'ȘRpaa0.%?.f% p $* .RPGz! 5nX'-#[?s;QsD Ѡ9e%x(`zV}hD=IeFuɗd\{/(kC RCK4N"?DEUNdQ;1zR:rFN'~)c aO`LNHtp$$Dsq%hb a\,jxA7! ٰO0'L]zμڠ}Te¿'n!|".N,Nhh-fXAI9;F'La滖Z5t\!8{d8 (9"d =+Sn²CR By'[]]%u.LG3ڶ=G b0U#C˒0Bw}`= S\wA:90W1ĉVp K'}(}MQ.iCU3YD2n8}ڶ)|H\J.ĭؗ2|TV?&E7n1LY;=,KMUQ1;_6x$ںH\V̹er!zhȆSkԮ)D/Oq#2ו1YpYιI^M7̡@j7'u} 64=n&I)lgåι hVњ\W5qӜ {_c@DU;h;/ ;:H 5ֲ1ǮR}n2&Ӊfp v$ ;vXVFZ{?/0 \ hQZt3f:ҩ=Y4dQs݊"èif?O2fM"[ajej"F fUi Y+<Duwez5G6A.us1⦅!U$C;h(RUʮ Dhf0w<.w$BPjϺǬ(Qv".&@@Kڗ\elF<`|Y5͐SKҤă->w)1bϒ &ɧ4F+!t21*7>^97{ZARgŢ+IC^'Q딴~uvG~EKIgϾWoA;v.Lv&C s( n1ˉуOgy.#.W9aZ \_B9^c}ճ# ^$;FDdCb 0vX}<"p,2ҍLcX@+9m=rxDӔwA4 { ;|qh 詉"68 /AAI,ZV̘I TiL3wSsD+X䷑f@-/Z7xͼ )Tt4#4kjMP^̣Oɠx^o 5V7ћ` 5:UDA(9â$ ,=&WT+!;R՚r)?As>(BU–>Z+] X&jܾ$=LD9Q6rz/|,;Z֠,\-oC'Q\chV {Z\ r/Krk>dfhr*ajod00AȮ2.Cn%a"B\v$L,i%7厘ZQ54Q?gn:4b5CCfQNƷqzJD%hw%Lj3lUl佬'bkcЖQ2B AkVH W(E© g\m$xa_($.FÚO7DaE~vbŠbe?,v QSLƦmGҮ<{I\Q47kLj&;Xj% A:6 |>8 m-[i20VpDZfBHdlz|vU2l2pQ`{0qNiZku[Pu:R$[=6uMOlcUplUz48~}- AbK0z~f$1UIZ|]mA9K!@NB`슜~Z#(~蜼Df !"᳿GhP犻Fn_dX}酮 u4\ J6Y輀E+^`$g8 4>ވbs}Z4q0͞hh񕡶Qsl h3ެxo-Y{L`!{E%v–2J}dsQ _KwUM5Re_)^@pEmoGkE|9ĕxj !U+hMiHu+ hDYb΢HuEB GC \dR¯}ͷk=_?7nMF#v68Gn|ͼGwHl꡴s xt MzpT\+~80\' 0/.GzÌ(W5x2 gyh&,ni1asth6FviU sf;iJ+Ц_d8D#SZRt|7bA3vda. t%s#1UWCm|s<G-΢gɢ21v5((\Be&@#BTʢ`,k ÈqZH`i6>@b Sh^o|8YGm1VРR<݋&AV4=9ʶZ꠲KQr]ڵ@$.uA.ڮrZΑCkgRˡX[\ o%Db p v"}'G};Pp6c$v{zeW*&8qݪ 4ΠSRI1(Jf~'DBÅP^B/t"Aj5Jeƙk+0$2\"zt^hDTq7ZmIꚐW3کt.Z;"XH?wִUd?2 YMi^_`CAmtݴyשE]^CYZeg/B,@mH]EyXР<+xb;4|{bU!N 66ͮ- nsڇ_lw1N:=T!gt)pdNѯhY(dqc!lgr ) {B.Ne!10JxjDwe&ZZ+3Lj>V,cDF`CHBٲ!lq;A.EsrrK?$J[^q%u./ n)P3j~*=ʲ!;x IQZ.KH1ڡ(A&osnJjygJ;Fd\ (zQa^h⢄uT UG!Nml Z#0gw:+V0nj+(g$Z%'t T9 RUGjS 'Yx;[Yt*J9VfEPIF*d$qFsempj WNc(7#\0݃dsC%2GhǐԊ#1$h[ϸIDAT&rPwmqEly9$)6wUnIN~X%IOE؆JzzEŸ5|OtD'ŷuэ['͹"HPZ?'Œ>FM.# kỵ]@߻q = u][ ={6 HLUk@jwp{O;K̴ S+&IW:5&f) ծ]OakV.ë, 8pf."JI6"=Fv4W'z.z&fDf D̋r -]J^40@u[ҥ|X(Խc]~9hJˏs/{_z!.cY$q5\DfE;B'J63|ubvHcLKtc(8,d0&"Nbk8p$.Yj QhZ877#꿪9=̳v `^j eGd;f.yYlc,YǚL "O".-u;w\s.Vz٤8瞈8T29lE"'kgAq/5,0UgsTA.(لN9G9FHIrʾBY\Di's Hr"25]ָD0#6HiTW͸y׋ȸ{?/刦UbIwNpC[ myYA\>/&Yj_[|qBmȚp!<⽟ q͉ q} )5[g؊x*突Vc߉6ٵf3jmA3$2̰q[{?CD_:# d2q!%0sHg&TJKIﯓ cqxZ ? F/l/Oؐ<IENDB`./tests/resources/listitems/0000755000015600001650000000000012700370716016271 5ustar jenkinsjenkins./tests/resources/listitems/ListItemExpansion.qml0000644000015600001650000001016412700370701022417 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Layouts 1.1 import Ubuntu.Components 1.3 MainView { id: main width: units.gu(40) height: units.gu(71) Action { id: deleteAction iconName: "delete" } property list contextualActions: [ Action { iconName: "edit" }, Action { iconName: "share" }, Action { iconName: "stock_website" } ] Page { title: "Expansion" Column { anchors.fill: parent spacing: units.dp(4) UbuntuListView { id: listView onEnabledChanged: print("enabled", enabled) width: parent.width height: parent.height / 2 clip: true ViewItems.onExpandedIndicesChanged: print(ViewItems.expandedIndices) ViewItems.expansionFlags: ViewItems.CollapseOnOutsidePress model: ListModel { Component.onCompleted: { for (var i = 0; i < 3; i++) { append({label: "List item #"+i, sectionData: "Locked"}); } for (i = 3; i < 11; i++) { append({label: "List item #"+i, sectionData: "Limited, live move"}); } for (i = 11; i < 25; i++) { append({label: "List item #"+i, sectionData: "Unlimited, drag'n'drop"}); } } } delegate: ListItem { id: item objectName: "ListItem-" + index leadingActions: ListItemActions { actions: deleteAction } trailingActions: ListItemActions { actions: contextualActions } expansion.height: units.gu(15) RowLayout { anchors { fill: parent margins: units.gu(0.5) leftMargin: anchors.rightMargin rightMargin: units.gu(2) } Captions { id: captions title.text: label subtitle.text: "from index #" + index } Button { text: "Enable drag mode" onClicked: listView.ViewItems.dragMode = true } } onPressAndHold: { print("expand/collapse") expansion.expanded = !expansion.expanded } } } ListItem { Label { text: "Standalone ListItem" } expansion.height: units.gu(15) onPressAndHold: expansion.expanded = !expansion.expanded; } ListItem { Label { text: "Other Standalone ListItem" } expansion.height: units.gu(15) onPressAndHold: expansion.expanded = !expansion.expanded; } Button { text: "Set ListView.ViewItems.expandedIndices" onClicked: listView.ViewItems.expandedIndices = [0, 1, 2] } } } } ./tests/resources/listitems/Dividers.qml0000644000015600001650000000243012700370701020546 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 0.1 import Ubuntu.Components.ListItems 0.1 import Ubuntu.Components.Popups 0.1 MainView { width: units.gu(50) height: units.gu(100) Component.onCompleted: Theme.name = "Ubuntu.Components.Themes.SuruDark" Column { width: parent.width Repeater { model: 5 Subtitled { text: "Caption text" subText: "Subtitle" } } ThinDivider {} Repeater { model: 5 Subtitled { text: "Caption text" subText: "Subtitle" } } } } ./tests/resources/listitems/ListItemTest.qml0000644000015600001650000002260012700370714021374 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Styles 1.3 import QtQuick.Layouts 1.1 MainView { id: main width: units.gu(50) height: units.gu(105) property bool override: false Action { objectName: "stock" id: stock iconName: "starred" text: "Staaaar" onTriggered: { print(iconName, "triggered", value) view.ViewItems.selectedIndices = [0, 2, 9]; } } ListItemActions { id: leading objectName: "StockLeading" actions: [ Action { iconName: "delete" onTriggered: print(iconName, "triggered", value) }, Action { iconName: "alarm-clock" enabled: false onTriggered: print(iconName, "triggered", value) }, Action { iconName: "camcorder" onTriggered: print(iconName, "triggered", value) }, Action { iconName: "stock_website" onTriggered: print(iconName, "triggered", value) }, Action { iconName: "starred" onTriggered: print(iconName, "triggered", value) }, Action { iconName: "go-home" onTriggered: print(iconName, "triggered", value) } ] } property bool selectable: false property list leadingArray: [ Action { iconName: "delete" onTriggered: print(iconName, "triggered", value) } ] property list trailingArray: [ Action { iconName: "search" onTriggered: print(iconName, "triggered", value) }, Action { iconName: "edit" onTriggered: print(iconName, "triggered", value) }, Action { iconName: "email" onTriggered: print(iconName, "triggered", value) } ] Column { anchors { left: parent.left right: parent.right } Button { text: "Selectable " + (selectable ? "OFF" : "ON") onClicked: selectable = !selectable } ListItem { id: testItem objectName: "single" color: "lime" height: units.gu(15) onClicked: { print("click") units.gridUnit += 2; } onPressAndHold: print("pressAndHold", objectName) RowLayout { anchors { fill: parent margins: units.gu(0.5) leftMargin: anchors.rightMargin rightMargin: units.gu(2) } Label { anchors.fill: parent text: units.gridUnit + "PX/unit" Layout.preferredWidth: paintedWidth } Button { text: "Press me" anchors.centerIn: parent onClicked: units.gridUnit -= 2 } } leadingActions: ListItemActions { objectName: "InlineLeading" actions: [stock] delegate: Column { width: height + units.gu(2) Icon { width: units.gu(3) height: width name: action.iconName color: pressed ? "blue" : "pink" anchors.horizontalCenter: parent.horizontalCenter } Label { text: action.text + index width: parent.width horizontalAlignment: Text.AlignHCenter } } } trailingActions: leading } ListItem { Label { id: label text: "No action" } onClicked: print(label.text, "clicked") } ListItem { Label { id: label2 anchors.fill: parent text: "Another standalone ListItem\nStarted with custom style, reset to theme style on first click" } leadingActions: testItem.leadingActions trailingActions: ListItemActions { actions: leading.actions } style: ListItemStyle {} onClicked: { style = undefined; label2.text = "Another standalone ListItem" } } ListView { id: view clip: true width: parent.width height: units.gu(28) model: 25 pressDelay: 0 ViewItems.selectMode: main.selectable ViewItems.selectedIndices: [9,3,4,1] ViewItems.onSelectedIndicesChanged: print("LISTVIEW INDEXES=", ViewItems.selectedIndices) delegate: ListItem { objectName: "ListItem" + index id: listItem onClicked: print(" clicked") onPressAndHold: print("pressAndHold") leadingActions: ListItemActions { actions: trailingArray } trailingActions: trailing contentItem.anchors.margins: units.gu(1) RowLayout { anchors { fill: parent margins: units.gu(0.5) leftMargin: anchors.rightMargin rightMargin: units.gu(2) } Captions { title.text: "This is one Label split in two lines.\n" + "The second line - item #" + modelData } CheckBox {} Button { text: "Pressme..." } } states: State { name: "override" when: main.override PropertyChanges { target: listItem highlightColor: "brown" } } onContentMovementStarted: print("moving started") onContentMovementEnded: print("moving ended") } } Flickable { id: flicker width: parent.width height: units.gu(28) clip: true contentHeight: column.childrenRect.height ListItemActions { id: trailing actions: leading.actions } Column { id: column width: flicker.width property alias count: repeater.count ViewItems.selectMode: main.selectable Repeater { id: repeater model: 10 ListItem { objectName: "InFlickable"+index color: UbuntuColors.silk highlightColor: "lime" divider.colorFrom: UbuntuColors.green leadingActions: ListItemActions { actions: leadingArray } trailingActions: ListItemActions { actions: trailingArray } contentItem.anchors { leftMargin: units.gu(2) rightMargin: units.gu(2) } Label { text: modelData + " Flickable item" } Row { anchors.centerIn: parent spacing: units.dp(4) Button { text: "Pressme..." } Switch {} } onClicked: divider.visible = !divider.visible } } } } ListItem { Label { text: "Switch makes this item to highlight" } Switch { id: toggle anchors.right: parent.right } Component.onCompleted: clicked.connect(toggle.clicked) } ListItem { Label { text: "With action assigned" } onClicked: print("clicked") onPressAndHold: print("longPressed") action: stock } } } ./tests/resources/listitems/ListItemDragging.qml0000644000015600001650000001676212700370701022207 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import QtQuick.Layouts 1.1 import Ubuntu.Components.ListItems 1.3 import QtQml.Models 2.1 MainView { id: main width: units.gu(40) height: units.gu(71) property bool restrictDragging: true LayoutMirroring.childrenInherit: true Action { id: deleteAction iconName: "delete" } property list contextualActions: [ Action { iconName: "edit" }, Action { iconName: "share" }, Action { iconName: "stock_website" } ] Tabs { Tab { title: "Dragging with ListModel" page: Page { ListView { onEnabledChanged: print("enabled", enabled) anchors.fill: parent ViewItems.selectMode: ViewItems.dragMode ViewItems.onSelectedIndicesChanged: print(ViewItems.selectedIndices) function handleDragStarted(event) { if (!restrictDragging) { return; } if (event.from < 3) { // the first 3 items are not draggable event.accept = false; } else if (event.from >=3 && event.from <= 10) { // dragging is limited between index 3 and 10 event.minimumIndex = 3; event.maximumIndex = 10; } else { // prevent dragging above index 10 event.minimumIndex = 11; } } function handleDragUpdates(event) { if (restrictDragging) { // deal only with indexes >= 3 if (event.to >= 3 && event.to <= 10 && event.from >= 3 && event.from <= 10) { // live update model.move(event.from, event.to, 1); } else if (event.status == ListItemDrag.Dropped) { model.move(event.from, event.to, 1); } else { event.accept = false; } } else { // no restrictions, perform live update model.move(event.from, event.to, 1); } } ViewItems.onDragUpdated: { if (event.status == ListItemDrag.Started) { handleDragStarted(event); } else { handleDragUpdates(event); } } model: ListModel { Component.onCompleted: { for (var i = 0; i < 3; i++) { append({label: "List item #"+i, sectionData: "Locked"}); } for (i = 3; i < 11; i++) { append({label: "List item #"+i, sectionData: "Limited, live move"}); } for (i = 11; i < 25; i++) { append({label: "List item #"+i, sectionData: "Unlimited, drag'n'drop"}); } } } section { property: "sectionData" criteria: ViewSection.FullString delegate: Header { text: section } } moveDisplaced: Transition { UbuntuNumberAnimation { properties: "x,y" } } delegate: ListItem { id: item objectName: "ListItem-" + index leadingActions: ListItemActions { actions: deleteAction } trailingActions: ListItemActions { actions: contextualActions } onSelectedChanged: print(selected) RowLayout { anchors { fill: parent margins: units.gu(0.5) leftMargin: anchors.rightMargin rightMargin: units.gu(2) } Captions { id: captions title.text: label subtitle.text: "from index #" + index } Captions { captionStyle: Ubuntu.SummaryCaptionStyle title.text: "LTR" subtitle.text: "RTL" MouseArea { anchors.fill: parent onClicked: item.selected = !item.selected } } } onPressAndHold: { print("entering/leaving draggable mode") ListView.view.ViewItems.dragMode = !ListView.view.ViewItems.dragMode; } onClicked: main.LayoutMirroring.enabled = !main.LayoutMirroring.enabled } } } } Tab { title: "Using DelegateModel" page: Page { ListView { anchors.fill: parent model: DelegateModel { model: ["apple", "pear", "plum", "peach", "nuts", "dates"] delegate: ListItem { Label { text: modelData } onPressAndHold: dragMode = !dragMode; } } ViewItems.onDragUpdated: { if (event.status == ListItemDrag.Moving) { event.accept = false } else if (event.status == ListItemDrag.Dropped) { var fromData = model.model[event.from]; var list = model.model; list.splice(event.from, 1); list.splice(event.to, 0, fromData); model.model = list; } } } } } } } ./tests/resources/statesaver/0000755000015600001650000000000012700370701016427 5ustar jenkinsjenkins./tests/resources/statesaver/StateSaver.qml0000644000015600001650000000317712700370701021233 0ustar jenkinsjenkins/* * Copyright (C) 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { id: app width: units.gu(40) height: units.gu(71) applicationName: "StateSaver" StateSaver.properties: "width, height" Page { id: page title: "StateSaver test" Rectangle { id: rect anchors.fill: parent color: "red" StateSaver.properties: "color" Column { anchors.centerIn: parent Button { text: app.StateSaver.enabled ? "Disable" : "Enable" + " StateSaver" onClicked: { app.StateSaver.enabled = !app.StateSaver.enabled } } Button { text: "Random color" onClicked: { rect.color = Qt.rgba(Math.random(1.0) * 1, Math.random(1.0) * 1, Math.random(1.0) * 1, 1) } } } } } } ./tests/resources/urihandler/0000755000015600001650000000000012700370701016403 5ustar jenkinsjenkins./tests/resources/urihandler/UriHandlerTest.qml0000644000015600001650000000242412700370701022015 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Loïc Molinari */ import QtQuick 2.0 import Ubuntu.Components 1.1 Item { id: mainView width: 700 height: 100 Rectangle { id: background anchors.fill: parent color: "black" } Text { id: uri anchors.fill: parent horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter font.pixelSize: 20 font.bold: true font.family: "Ubuntu" color: "white" text: "Uri: \"\"" } Connections { target: UriHandler onOpened: uri.text = "Uri: \"" + uris + "\"" } } ./tests/resources/filters/0000755000015600001650000000000012700370701015716 5ustar jenkinsjenkins./tests/resources/filters/MouseFilters.qml0000644000015600001650000000317612700370701021061 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { width: units.gu(40) height: units.gu(71) Column { anchors.fill: parent spacing: units.gu(1) Rectangle { width: parent.width height: units.gu(5) TextInput { activeFocusOnPress: true anchors.fill: parent anchors.margins: units.gu(0.5) MouseArea { anchors.fill: parent preventStealing: false propagateComposedEvents: true onPressed: mouse.accepted = false onReleased: print("released") } } } Button { text: "Button" Mouse.onPressed: print("Button pressed") } Rectangle { width: parent.width height: units.gu(5) color: "green" Mouse.onPressed: print("Rectangle pressed") } } } ./tests/resources/layouts/0000755000015600001650000000000012700370701015746 5ustar jenkinsjenkins./tests/resources/navigation/0000755000015600001650000000000012700370701016405 5ustar jenkinsjenkins./tests/resources/navigation/MyDeprecatedPage.qml0000644000015600001650000000330012700370701022257 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.0 Page { title: i18n.tr("My 1.0 page") Flickable { anchors.fill: parent contentHeight: height + units.gu(10) Label { anchors { top: parent.top topMargin: units.gu(16) horizontalCenter: parent.horizontalCenter } text: i18n.tr("This is an external page.") color: "#757373" } } tools: ToolbarItems { ToolbarButton { action: Action { iconName: "settings" text: "Settings" } } ToolbarButton { action: Action { iconName: "contact" text: "Contacts" } } ToolbarButton { action: Action { iconName: "share" text: "Share" } } ToolbarButton { action: Action { iconName: "select" text: "Select" } } } } ./tests/resources/navigation/tabView.deprecated.qml0000644000015600001650000000374712700370701022633 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { id: view width: 800 height: 600 ListModel { id: pages property int selectedIndex: 0 ListElement { title: "Tab 1" } ListElement { title: "Tab 2" } ListElement { title: "Tab 3" } ListElement { title: "Tab 4" } ListElement { title: "Tab 5" } } Header { id: header tabsModel: pages } Component { id: tabComponent Rectangle { width: ListView.view.width height: ListView.view.height Label { anchors.centerIn: parent text: title fontSize: "x-large" } color: Qt.rgba(Math.random(0.5), Math.random(1), Math.random(0.5), 1) MouseArea { anchors.fill: parent onClicked: pages.selectedIndex = index } } } ListView { id: list anchors { top: header.bottom left: parent.left right: parent.right bottom: parent.bottom } orientation: Qt.Horizontal model: pages delegate: tabComponent currentIndex: pages.selectedIndex } } ./tests/resources/navigation/repeaterTabs.deprecated.qml0000644000015600001650000000457012700370701023646 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { id: root width: units.gu(40) height: units.gu(71) ListModel { id: inputModel Component.onCompleted: { append({ "name": "tab 1" }); insert(0, { "name": "tab 0" }); append({ "name": "tab 3" }); insert(2, { "name": "tab 2" }); } } property var listModel: ["tab #0", "tab #1", "tab #2", "tab #3"]; Tabs { id: tabsWithRepeater Repeater { objectName: "first_repeater" id: tabsRepeater model: inputModel Tab { title: name page: Page { Label { anchors.centerIn: parent text: title fontSize: "large" } tools: ToolbarItems { ToolbarButton { text: "shufle" onTriggered: { inputModel.move(1, 2, 1); inputModel.move(3, 0, 1); inputModel.move(1, 3, 1); } } ToolbarButton { text: "reset" onTriggered: tabsRepeater.model = null; } } } } } Repeater { objectName: "second_repeater" id: secondRepeater model: root.listModel Tab { title: "second" + modelData page: Page { Label { text: title } } } } } } ./tests/resources/navigation/Blackbox.qml0000644000015600001650000000232512700370701020647 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 MainView { width: units.gu(40) height: units.gu(60) Component.onCompleted: pageStack.push(page1) PageStack { id: pageStack } Page { id: page1 title: "one" Button { anchors.centerIn: parent text: "next" onClicked: pageStack.push(page2) } } Page { id: page2 title: "two" visible: false head.backAction: Action { iconName: "back" onTriggered: pageStack.pop() } } } ./tests/resources/navigation/pagestack.qml0000644000015600001650000000613312700370701021065 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 as ListItem Rectangle { color: "white" width: units.gu(50) height: units.gu(70) MainView { id: mainView width: units.gu(38) height: units.gu(50) anchors.centerIn: parent PageStack { id: pageStack Component.onCompleted: push(page0) Page { id: page0 title: i18n.tr("Root page") visible: false Column { anchors.fill: parent ListItem.Standard { text: i18n.tr("Page one") onClicked: pageStack.push(page1) progression: true } ListItem.Standard { text: i18n.tr("External page") onClicked: pageStack.push(Qt.resolvedUrl("MyCustomPage.qml")) progression: true } ListItem.Standard { text: i18n.tr("External 1.0 page") onClicked: pageStack.push(Qt.resolvedUrl("MyDeprecatedPage.qml")) progression: true } } } Page { id: page1 title: i18n.tr("First page") visible: false Column { anchors.fill: parent ListItem.Standard { text: i18n.tr("Root page (again)") onClicked: pageStack.push(page0) progression: true } ListItem.Standard { text: i18n.tr("Red rectangle") onClicked: pageStack.push(page2, {color: "red"}) progression: true } } head.actions: Action { iconName: "share" } } Page { title: "Rectangle" id: page2 visible: false property alias color: rectangle.color Rectangle { id: rectangle anchors { fill: parent margins: units.gu(5) } } } } } } ./tests/resources/navigation/panels.qml0000644000015600001650000001031012700370701020375 0ustar jenkinsjenkins/* * Copyright (C) 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Rectangle { color: "grey" width: units.gu(80) height: units.gu(80) LayoutMirroring.enabled: true LayoutMirroring.childrenInherit: true Rectangle { width: units.gu(50) height: units.gu(50) color: "lightgrey" anchors.centerIn: parent Label { text: "Panels everywhere!" anchors.centerIn: parent } Panel { align: Qt.AlignLeft anchors { left: parent.left bottom: parent.bottom top: parent.top } width: units.gu(20) Rectangle { anchors.fill: parent color: "black" opacity: 1.0 } Column { width: parent.width height: childrenRect.height anchors.verticalCenter: parent.verticalCenter Slider { width: parent.width / 1.2 anchors.horizontalCenter: parent.horizontalCenter value: 50 } Button { width: parent.width text: "click me!!" onClicked: print("click!") } } } Panel { align: Qt.AlignRight anchors { right: parent.right verticalCenter: parent.verticalCenter } height: units.gu(20) width: units.gu(10) Rectangle { anchors.fill: parent color: "yellow" } } Panel { id: bottomLeftPanel align: Qt.AlignBottom anchors { bottom: parent.bottom left: parent.left right: rightPanel.left } height: toolbar.height StyledItem { id: toolbar anchors { left: parent.left right: parent.right bottom: parent.bottom } height: units.gu(8) property bool opened: bottomLeftPanel.opened property bool animating: bottomLeftPanel.animating style: Theme.createStyleComponent("ToolbarStyle.qml", toolbar) Label { anchors.centerIn: parent text: "This looks like a standard toolbar" } } } Panel { id: rightPanel align: Qt.AlignBottom anchors { bottom: parent.bottom right: parent.right top: parent.top } width: units.gu(15) Rectangle { color: "pink" anchors.fill: parent } } Panel { align: Qt.AlignTop anchors { top: parent.top right: parent.right } width: units.gu(20) height: units.gu(20) Rectangle { color: "red" anchors.fill: parent } } Panel { align: Qt.AlignTop anchors { top: parent.top left: parent.left } width: units.gu(20) height: units.gu(20) Rectangle { color: "orange" anchors.fill: parent } } } } ./tests/resources/navigation/tabs.qml0000644000015600001650000000623012700370701020052 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem MainView { width: 800 height: 600 id: mainView Tabs { id: tabs selectedTabIndex: 0 Item { // does this mess up stuff? nope. } Tab { id: simpleTab title: i18n.tr("Simple page #" + index + " to demonstrate tabs") page: Page { Label { anchors.centerIn: parent text: "Use tabs drawer to navigate" } head.actions: Action { text: "action" iconSource: "call_icon.png" onTriggered: print("action triggered") } } } Repeater { model: 3 Tab { id: tab title: "Repeater #" + tab.index page: Page { Column { anchors.centerIn: parent width: units.gu(40) Label { anchors { left: parent.left right: parent.right } text: "Repeater tab number "+index } Button { anchors { left: parent.left right: parent.right } text: "Previous" onClicked: if (tabs.selectedTabIndex > 0) tabs.selectedTabIndex-- } } } } } Tab { id: externalTab title: i18n.tr("External #" + index) page: Loader { parent: externalTab anchors.fill: parent source: (tabs.selectedTab === externalTab) ? Qt.resolvedUrl("MyCustomPage.qml") : "" } } Tab { title: i18n.tr("List view #" + index) page: Page { ListView { clip: true anchors.fill: parent model: 20 delegate: ListItem.Standard { iconSource: Qt.resolvedUrl("call_icon.png") text: "Item "+modelData } } } } } } ./tests/resources/navigation/pullToRefresh.qml0000644000015600001650000000715412700370701021725 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import QtQuick.XmlListModel 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 MainView { id: root width: units.gu(40) height: units.gu(71) PageStack { id: stack; Component.onCompleted: push(page1Holder) } Component { id: page1Holder Page { id: page title: "Design" ListView { id: view anchors.fill: parent PullToRefresh { id: pullToRefresh objectName: "XmlList" enabled: page.active refreshing: view.model.status === XmlListModel.Loading onRefresh: view.model.reload() content: Item { Icon { name: pullToRefresh.releaseToRefresh ? "search" : "" height: parent.height width: height anchors.horizontalCenter: parent.horizontalCenter } } } model: XmlListModel { source: "http://design.canonical.com/feed/" query: "/rss/channel/item" XmlRole { name: "title"; query: "title/string()" } } delegate: Standard { width: ListView.view.width height: units.gu(5) text: modelData onClicked: { stack.push(page2Holder) } } } } } Component { id: page2Holder Page { id: page2 title: "Design - Flickable" Flickable { id: view2 anchors.fill: parent contentHeight: content.childrenRect.height PullToRefresh { parent: view2 id: refresh2 refreshing: repeater.model.status === XmlListModel.Loading onRefresh: repeater.model.reload() } Column { id: content width: parent.width Repeater { id: repeater model: XmlListModel { source: "http://design.canonical.com/feed/" query: "/rss/channel/item" XmlRole { name: "title"; query: "title/string()" } } Standard { width: view2.width height: units.gu(5) text: modelData onClicked: { stack.push(page1Holder) } } } } } } } } ./tests/resources/navigation/call_icon@8.png0000644000015600001650000000267112700370701021234 0ustar jenkinsjenkinsPNG  IHDR;mGtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp =IDATxbLLJa n@l@7w6//`G1ZADXdP$C899͐EYYYH2D_EE$CDDE># 8:ؿ M!"W`nnEIɩI2x?˗/@6;BB+4߂8g#LMgE3oP܉$C@P%!xxxѣ{891 惼\+FFF IN~~@@ NG@  aff~*b!P幹:qq IIpdgPPPv4h(CIHHtlظI$ˋ@ **(.A6HJJ'1!GX :]E,rBϟ?#Ο #gϞsվ |!Hqp b&PL"}phIENDB`./tests/resources/navigation/MyCustomPage.qml0000644000015600001650000000266612700370701021507 0ustar jenkinsjenkins/* * Copyright 2012-2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.3 Page { title: i18n.tr("My custom page") Flickable { anchors.fill: parent contentHeight: height + units.gu(10) Label { anchors { top: parent.top topMargin: units.gu(16) horizontalCenter: parent.horizontalCenter } text: i18n.tr("This is an external page.") color: "#757373" } } head.actions: [ Action { text: "action 1" iconName: "outgoing-call" }, Action { text: "action 2" iconName: "missed-call" }, Action { text: "another one" iconSource: "call_icon.png" enabled: false } ] } ./tests/resources/navigation/stackWithTabs.qml0000644000015600001650000000334712700370701021702 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.2 MainView { id: mainView width: units.gu(38) height: units.gu(50) PageStack { id: pageStack Component.onCompleted: push(tabs) Tabs { id: tabs Tab { title: "Tab 1" page: Page { Label { anchors { centerIn: parent } text: "First tab" } } } Tab { title: "Tab 2" page: Page { Button { anchors.centerIn: parent onClicked: pageStack.push(page3) text: "Press" } } } } Page { id: page3 visible: false title: "Page on stack" Label { anchors.centerIn: parent text: "Press back to return to the tabs" } } } } ./tests/resources/pickers/0000755000015600001650000000000012700370701015706 5ustar jenkinsjenkins./tests/resources/pickers/PickerTest.qml0000644000015600001650000001327512700370701020506 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Pickers 1.3 MainView { width: units.gu(40) height: units.gu(71) Column{ Row { ListModel { id: pickerModel Component.onCompleted: reset(100); function reset(num) { clear(); for (var i = 0; i < num; i++) { append({"label": "Item #"+i}); } } } Picker { objectName: "Circular" id: circularPicker height: units.gu(40) model: pickerModel delegate: PickerDelegate { property string text: modelData ? modelData : "" Label { anchors.fill: parent horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter text: modelData ? modelData : "" } } onSelectedIndexChanged: print("circular index="+selectedIndex) onMovingChanged: print("MOVING?", moving) } Picker { objectName: "Linear" id: linearPicker height: units.gu(40) model: pickerModel circular: false delegate: PickerDelegate { property string text: modelData ? modelData : "" Label { anchors.fill: parent horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter text: modelData ? modelData : "" } } onSelectedIndexChanged: print("linear index="+selectedIndex) onMovingChanged: print("MOVING?", moving) } Picker { height: units.gu(40) model: pickerModel live: true delegate: PickerDelegate { Label { anchors.fill: parent horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter text: modelData } } onSelectedIndexChanged: print("circular index="+selectedIndex) onMovingChanged: print("MOVING?", moving) } Picker { height: units.gu(40) model: pickerModel circular: false live: true itemHeight: units.gu(10) delegate: PickerDelegate { Label { anchors.fill: parent horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter text: modelData } } onSelectedIndexChanged: print("linear index="+selectedIndex) onMovingChanged: print("MOVING?", moving) } } Flow { spacing: units.gu(1) width: parent.width Button { text: "move & crop from 50" onClicked: { linearPicker.selectedIndex = 50; circularPicker.selectedIndex = 50; pickerModel.remove(50, 50); print("circular: selectedIndex="+circularPicker.selectedIndex) print("linear: selectedIndex="+linearPicker.selectedIndex) } } Button { text: "crop from 50" onClicked: { pickerModel.remove(50, 50); print("circular: selectedIndex="+circularPicker.selectedIndex) print("linear: selectedIndex="+linearPicker.selectedIndex) } } Button { text: "reset" onClicked: { pickerModel.reset(100); print("circular: selectedIndex="+circularPicker.selectedIndex) print("linear: selectedIndex="+linearPicker.selectedIndex) } } Button { text: "move to 20" onClicked: { circularPicker.selectedIndex = 20; linearPicker.selectedIndex = 20; } } Button { text: "clear" onClicked: { pickerModel.clear(); print("circular: selectedIndex="+circularPicker.selectedIndex) print("linear: selectedIndex="+linearPicker.selectedIndex) } } Button { text: "append" onClicked: { pickerModel.append({"label": "Item #"+pickerModel.count}); } } } } } ./tests/resources/pickers/DatePickerTest.qml0000644000015600001650000001416512700370701021303 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Pickers 1.0 MainView { width: units.gu(40) height: units.gu(71) Page { title: "DatePicker test" Column { anchors.fill: parent DatePicker { id: picker locale: Qt.locale("en_UK") date: new Date() onDateChanged: print("CHANGED DATE=" + Qt.formatDateTime(date, "yyyy/MM/dd, hh:mm:ss")) onMovingChanged: print("MOVING?", moving) } Slider { value: 0.0//units.gu(36) live: true height: units.gu(2) minimumValue: 0.0 maximumValue: parent.width onValueChanged: picker.width = value } Flow { width: parent.width spacing: units.gu(1) Button { text: "HU" width: units.gu(5) height: units.gu(2) onClicked: picker.locale = Qt.locale("hu_HU") } Button { text: "DE" width: units.gu(5) height: units.gu(2) onClicked: picker.locale = Qt.locale("de_DE") } Button { text: "EN(US)" width: units.gu(9) height: units.gu(2) onClicked: picker.locale = Qt.locale("en_US") } Button { text: "FI" width: units.gu(5) height: units.gu(2) onClicked: { picker.locale = Qt.locale("fi_FI") picker.width = units.gu(37); } } Button { text: "infinite" height: units.gu(2) onClicked: picker.maximum = picker.maximum.getInvalidDate() } Button { text: "Jan-Mar" height: units.gu(2) onClicked: { var date = new Date(); date.setMonth(0); picker.minimum = date; date.setMonth(2); picker.maximum = date; picker.date = new Date(date); } } Button { text: "Change minimum" height: units.gu(2) onClicked: { picker.minimum = new Date(2012, 11, 1); } } Button { text: "minimum & date" height: units.gu(2) onClicked: { picker.minimum = new Date(2013, 11, 1); picker.date = new Date(2014, 11, 5); } } Button { text: "today" height: units.gu(2) onClicked: picker.date = new Date() } Repeater { model: ["Years|Months|Days", "Years|Months", "Months|Days", "Years", "Months", "Days", "Hours|Minutes|Seconds", "Hours|Minutes", "Minutes|Seconds", "Hours", "Minutes", "Seconds", "Years|Months|Days|Hours|Minutes"] Button { text: "model: " + modelData height: units.gu(2) onClicked: picker.mode = modelData } } Button { text: "disable hours" height: units.gu(2) onClicked: { picker.mode = "Hours|Minutes|Seconds"; var min = new Date(); min.setHours(23); min.setMinutes(0); min.setSeconds(0); var max = new Date(); max.setHours(23); max.setMinutes(59); max.setSeconds(59); picker.minimum = min; picker.maximum = max; } } Button { text: "disable hours and minutes" height: units.gu(2) onClicked: { picker.mode = "Hours|Minutes|Seconds"; var min = new Date(); min.setHours(23); min.setMinutes(10); min.setSeconds(0); var max = new Date(); max.setHours(23); max.setMinutes(10); max.setSeconds(59); picker.minimum = min; picker.maximum = max; } } Button { text: "second range" height: units.gu(2) onClicked: { picker.mode = "Hours|Minutes|Seconds"; var min = new Date(); min.setHours(23); min.setMinutes(10); min.setSeconds(20); var max = new Date(); max.setHours(23); max.setMinutes(10); max.setSeconds(59); picker.minimum = min; picker.maximum = max; } } } } } } ./tests/resources/pickers/PanelTest.qml0000644000015600001650000000267312700370701020330 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Pickers 1.0 MainView { width: units.gu(40) height: units.gu(71) Column { Button { id: datePickerButton property date date: new Date() text: "Date picker: " + Qt.formatDate(date, "yyyy/MMMM/dd dddd") onClicked: { var picker = PickerPanel.openDatePicker(datePickerButton, "date", "Years|Months|Days") picker.picker.locale = Qt.locale("hu_HU") } } Button { id: timePickerButton property date date: new Date() text: "Time picker: " + Qt.formatTime(date, "hh:mm:ss") onClicked: PickerPanel.openDatePicker(timePickerButton, "date", "Hours|Minutes|Seconds") } } } ./tests/resources/bottomedge/0000755000015600001650000000000012700370701016377 5ustar jenkinsjenkins./tests/resources/bottomedge/BottomEdgeTest.qml0000644000015600001650000000557312700370701022015 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { id: mainWindow width: units.gu(40) height: units.gu(70) AdaptivePageLayout { anchors.fill: parent primaryPage: page0 } Page { id: page0 header: PageHeader { title: "MainPage" } BottomEdge { id: bottomEdge anchors.fill: parent hint { flickable: page0.flickable action: Action { iconName: "contact-new" onTriggered: bottomEdge.commit() shortcut: "ctrl+n" enabled: bottomEdge.enabled } } contentComponent: editorPageBottomEdge Component { id: editorPageBottomEdge Page { height: bottomEdge.height width: bottomEdge.width - units.gu(15) anchors.left: undefined anchors.right: undefined header: PageHeader { title: "bottom edge page" flickable: flicker leadingActionBar.actions: Action { iconName: "info" onTriggered: bottomEdge.collapse() } } Rectangle { anchors.fill: parent color: "green" } Flickable { id: flicker anchors.fill: parent Column { id: view anchors.fill: parent Repeater { model: 100 TextField { height: units.gu(10) width: parent.width //border.color: "black" } } } } } } } } Component.onCompleted: QuickUtils.mouseAttached = true } ./tests/resources/popover/0000755000015600001650000000000012700370701015740 5ustar jenkinsjenkins./tests/resources/popover/PopoverTest.qml0000644000015600001650000000351612700370701020752 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Popups 1.0 import Ubuntu.Components.ListItems 1.0 as ListItem MainView { width: units.gu(80) height: units.gu(34) Component { id: popover Popover { Column { anchors { left: parent.left top: parent.top right: parent.right } ListItem.Standard { text: "Do something" } ListItem.Standard { text: "Do something else" } ListItem.Subtitled { text: "Title"; subText: "Subtitle"; showDivider: false} } } } Button { id: referenceButton visible: false } Grid { id: grid anchors.fill: parent columns: 6 rows: 8 spacing: units.gu(6) anchors.leftMargin: -referenceButton.width/2.0 anchors.topMargin: -referenceButton.height/2.0 Repeater { model: grid.columns * grid.rows delegate: Button { id: button text: "open" onClicked: PopupUtils.open(popover, button) } } } } ./tests/resources/popover/DialogTest.qml0000644000015600001650000000437112700370701020517 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.1 import Ubuntu.Components.Popups 1.0 MainView { width: units.gu(40) height: units.gu(71) Component { id: dialog Dialog { id: item title: "A long title for the Dialog that wraps into two lines at least." text: "This is a question text" Button { text: "Close" onClicked: PopupUtils.close(item) } } } Component { id: expanding Dialog { id: stylesDialog property real labelwidth: units.gu(11) // title: "Title" //text: "text" OptionSelector { model: ["One", "Two", "Three"] } Row { Label { text: "Slider" verticalAlignment: Text.AlignVCenter width: labelwidth height: fontScaleSlider.height } Slider { id: fontScaleSlider width: parent.width - labelwidth minimumValue: 0 maximumValue: 12 } } Button { text: i18n.tr("Close") onClicked: PopupUtils.close(stylesDialog) } } } Column { Button { text: "Open dialog" onClicked: PopupUtils.open(dialog) } Button { text: "Open expanding dialog" onClicked: PopupUtils.open(expanding) } } } ./tests/resources/buttons/0000755000015600001650000000000012700370701015744 5ustar jenkinsjenkins./tests/resources/buttons/ComboTest.qml0000644000015600001650000001016612700370701020362 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 MainView { width: units.gu(40) height: units.gu(71) Column { anchors.fill: parent spacing: units.gu(2) ComboButton { id: combo1 text: "collapsedHeight differs" collapsedHeight: units.gu(6) } ComboButton { text: "content is Rectangle > expanded" Rectangle { height: units.gu(40) gradient: Gradient { GradientStop { position: 0.0 color: "red" } GradientStop { position: 0.5 color: "green" } GradientStop { position: 1.0 color: "blue" } } } } ComboButton { text: "comboList is Flickable" Flickable { id: flickable objectName: "Flickable" anchors { left: parent.left right: parent.right top: parent.top } contentHeight: rect.height Rectangle { id: rect width: parent.width height: units.gu(40) gradient: Gradient { GradientStop { position: 0.0 color: "red" } GradientStop { position: 0.5 color: "green" } GradientStop { position: 1.0 color: "blue" } } } } } ComboButton { id: combo2 text: "comboList is ListView" expanded: true expandedHeight: units.gu(30) UbuntuListView { objectName: "ListView" model: 20 delegate: Standard { text: "Action #" + modelData onClicked: { combo2.text = text; combo2.expanded = false } } } } ComboButton { id: combo3 text: "auto expandHeight" expandedHeight: -1 Column { id: column anchors { left: parent.left right: parent.right } Rectangle { width: parent.width height: units.gu(6) color: "red" } Rectangle { width: parent.width height: units.gu(6) color: "green" } Rectangle { width: parent.width height: units.gu(6) color: "blue" } Rectangle { width: parent.width height: units.gu(6) color: "yellow" } } } } } ./tests/resources/sliders/0000755000015600001650000000000012700370701015713 5ustar jenkinsjenkins./tests/resources/sliders/SliderTest.qml0000644000015600001650000000507212700370701020514 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 MainView { width: units.gu(50) height: units.gu(100) Column { anchors { fill: parent margins: units.gu(1) } UbuntuListView { id: listView width: parent.width height: units.gu(20) clip: true model: 10 interactive: true delegate: Standard { control: Slider { objectName: "testSlider" + index } } } UbuntuListView { id: listView2 width: parent.width height: units.gu(20) clip: true model: 10 delegate: Slider { objectName: "testSlider" + index } } Flickable { id: flickable width: parent.width height: units.gu(20) clip: true contentHeight: column.height Column { id: column width: parent.width height: childrenRect.height Repeater { model: 10 Standard { control: Slider { objectName: "testSlider" + index } } } } } Flickable { id: flickable2 width: parent.width height: units.gu(20) clip: true contentHeight: column2.height Column { id: column2 width: parent.width height: childrenRect.height Repeater { model: 10 Slider { objectName: "testSlider" + index } } } } } } ./tests/resources/alarm/0000755000015600001650000000000012700370701015342 5ustar jenkinsjenkins./tests/resources/alarm/Alarms.qml0000644000015600001650000002045212700370701017277 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.2 // due to ListItem import Ubuntu.Components.ListItems 1.0 import Ubuntu.Components.Popups 1.0 import Ubuntu.Components.Pickers 1.0 MainView { id: mainView width: units.gu(40) height: units.gu(71) objectName: "mainView" AlarmModel{ id: alarmModel } Alarm { id: stockAlarm onStatusChanged: { print("operation " + operation + ", status= " + status + ", error=" + error); if (status !== Alarm.Ready) return; if ((operation > Alarm.NoOperation) && (operation < Alarm.Reseting)) { reset(); alarm = stockAlarm; } } } property Alarm alarm: stockAlarm Page { title: "Alarm test" Column { id: layout anchors { left: parent.left top: parent.top right: parent.right } height: childrenRect.height Standard { text: "Label" control: TextField { id: message objectName: "alarm_message" text: alarm.message } } Row { height: units.gu(6) spacing: units.gu(1) Button { id: dateChooser text: "Date: " + date.toDateString() property date date: new Date(alarm.date) onClicked: PickerPanel.openDatePicker(dateChooser, "date", "Years|Months|Days") } Button { id: timeChooser text: "Time: " + time.toTimeString() property date time: new Date(alarm.date) onClicked: PickerPanel.openDatePicker(timeChooser, "time", "Hours|Minutes") } } Standard { text: "Enabled" control: Switch { id: enabledSwitch objectName: "alarm_enabled" checked: alarm.enabled } } ItemSelector { id: recurence text: "Recurence" model: ["OneTime", "Daily", "Weekly"] selectedIndex: setRecurence(alarm) function setRecurence(alarm) { if (alarm.type == Alarm.OneTime) return 0; else if (alarm.type == Alarm.Repeating) { if (alarm.daysOfWeek === Alarm.Daily) return 1; else return 2; } } } MultiValue { id: days text: "Occurrence" values: getValues(alarm) visible: recurence.selectedIndex === 2 property int daysOfWeek: alarm.daysOfWeek onClicked: { PopupUtils.open(Qt.resolvedUrl("AlarmDays.qml"), days, {property: "daysOfWeek"}); } function getValues(alarm) { var v = []; if (alarm.daysOfWeek & Alarm.Monday) v.push("Monday"); if (alarm.daysOfWeek & Alarm.Tuesday) v.push("Tuesday"); if (alarm.daysOfWeek & Alarm.Wednesday) v.push("Wednesday"); if (alarm.daysOfWeek & Alarm.Thursday) v.push("Thursday"); if (alarm.daysOfWeek & Alarm.Friday) v.push("Friday"); if (alarm.daysOfWeek & Alarm.Saturday) v.push("Saturday"); if (alarm.daysOfWeek & Alarm.Sunday) v.push("Sunday"); return v; } } Standard { text: "Save result="+alarm.error control: Button { text: "Save" onClicked: { alarm.message = message.text; var date = new Date(); date.setTime(timeChooser.time.getTime()); date.setDate(dateChooser.date.getDate()); alarm.date = date; alarm.enabled = enabledSwitch.checked; switch (recurence.selectedIndex) { case 0: alarm.type = Alarm.OneTime; alarm.daysOfWeek = Alarm.AutoDetect; break; case 1: alarm.type = Alarm.Repeating; alarm.daysOfWeek = Alarm.Daily; break; case 2: alarm.type = Alarm.Repeating; alarm.daysOfWeek = days.daysOfWeek; break; } alarm.save(); } } } Standard { text: "Alarm count: " + alarmModel.count control: Button { text: "Reset" onClicked: { alarm = stockAlarm; alarm.reset(); } } } ThinDivider{} ListView { id: alarmList width: parent.width height: units.gu(20) clip: true model: alarmModel ListItemActions { id: leading actions: Action { iconName: "delete" onTriggered: { var data = alarmModel.get(value); data.cancel(); } } } delegate: ListItem { Label { text: message + recurring(model) + "\n" + model.date } function recurring(alarmData) { return (alarmData.type === Alarm.Repeating) ? "[Repeating]" : "[Onetime]"; } leadingActions: leading Switch { anchors { verticalCenter: parent.verticalCenter right: parent.right } checked: model.enabled onCheckedChanged: { if (checked != model.enabled) { // use a local variable, otherwise "model" role will always fetch the // original data! var alarmData = model; alarmData.enabled = checked; alarmData.save(); } } } onClicked: { alarm = alarmModel.get(index); dateChooser.date = alarm.date; timeChooser.time = alarm.date; message.text = alarm.message; enabledSwitch.checked = alarm.enabled; recurence.selectedIndex = recurence.setRecurence(alarm); } Connections { target: model onStatusChanged: print("operation", operation, "status=", model.status, "error=", model.error) } } } } } } ./tests/resources/alarm/AlarmDays.qml0000644000015600001650000000403112700370701017730 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.Popups 1.0 import Ubuntu.Components.ListItems 1.0 Dialog { id:root property string property title: "Choose days" ListModel { id: daysModel ListElement { day: "Monday" flag: Alarm.Monday } ListElement { day: "Tuesday" flag: Alarm.Tuesday } ListElement { day: "Wednesday" flag: Alarm.Wednesday } ListElement { day: "Thursday" flag: Alarm.Thursday } ListElement { day: "Friday" flag: Alarm.Friday } ListElement { day: "Saturday" flag: Alarm.Saturday } ListElement { day: "Sunday" flag: Alarm.Sunday } } Repeater { model: daysModel Standard { text: day control: CheckBox { checked: caller && ((caller[property] & flag) == flag) onCheckedChanged: { if (checked) { caller[property] |= flag; } else { caller[property] &= ~flag; } } } } } Button { text: "Done" onClicked: PopupUtils.close(root); } } ./tests/resources/inputs/0000755000015600001650000000000012700370701015570 5ustar jenkinsjenkins./tests/resources/inputs/TextInputs.qml0000644000015600001650000001042212700370701020431 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 0.1 import Ubuntu.Components.ListItems 0.1 import Ubuntu.Components.Popups 0.1 MainView { id: main width: units.gu(40) height: units.gu(71) applicationName: "TextInputs" Column { anchors.fill: parent TextArea { id: topLine autoSize: true maximumLineCount: 0 text: "Lorem Ipsum is simply dummy text\nof the printing and typesetting\nindustry.\n" } Flickable { width: parent.width height: parent.height - topLine.height objectName: "MainView_Flickable" contentHeight: column.childrenRect.height onMovingChanged: print(objectName, "moving") Column { id: column anchors.horizontalCenter: parent.horizontalCenter spacing: units.gu(1) TextField { id: field objectName: "Standard" width: units.gu(30) primaryItem: Icon { width: height height: parent.height - units.gu(1) name: "search" } text: "The orange (specifically, the sweet orange) is the fruit of the citrus species Citrus × ​sinensis in the family Rutaceae." } Button { text: "home" onClicked: field.cursorPosition = 0; } TextField { objectName: "Preserving" width: units.gu(30) text: "Second line." selectByMouse: false placeholderText: "yeeeeewww!" persistentSelection: true } TextArea { text: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum." } TextArea { text: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum." persistentSelection: true } TextArea { autoSize: true maximumLineCount: 0 text: "Lorem Ipsum is simply dummy text\nof the printing and typesetting\nindustry.\n" cursorDelegate: Rectangle { width: units.dp(4) color: "blue" } } TextArea { autoSize: true maximumLineCount: 5 } } } } } ./tests/resources/subtheming/0000755000015600001650000000000012700370701016413 5ustar jenkinsjenkins./tests/resources/subtheming/Simple.qml0000644000015600001650000000530612700370701020363 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes 1.0 MainView { objectName: "TopItem" width: units.gu(50) height: units.gu(100) theme.objectName: "MasterTheme" Column { objectName: "Column" anchors.fill: parent Label { text: "Hallo" } Button { text: "Theme change" onClicked: theme.name = "Ubuntu.Components.Themes.SuruDark" } Button { text: "Reset palette" onClicked: customTheme.theme.palette = undefined } Button { text: "Lo" } TextField { objectName: "OuterText" property string styleName: theme.name onStyleNameChanged: print(objectName, styleName) } StyledItem { id: customTheme objectName: "SuruDarkStyled" width: parent.width height: units.gu(10) theme: ThemeSettings { objectName: "InnerTheme" id: thisTheme name: parentTheme.name // name: "Ubuntu.Components.Themes.SuruDark" palette: Palette { id: config normal { foregroundText: UbuntuColors.blue overlayText: "#BAFEDC" field: "lime" } selected { field: "teal" fieldText: "brown" foregroundText: Qt.rgba(0, 0, 1, 1) overlayText: config.normal.overlayText foreground: UbuntuColors.green } } } property color myColor: theme.palette.selected.overlayText onMyColorChanged: print(myColor) TextField { objectName: "InnerText" property string styleName: theme.name onStyleNameChanged: print(objectName, styleName) } } } } ./tests/resources/header/0000755000015600001650000000000012700370701015476 5ustar jenkinsjenkins./tests/resources/header/textInput.qml0000644000015600001650000000413312700370701020216 0ustar jenkinsjenkins/* * Copyright (C) 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.1 MainView { width: units.gu(40) height: units.gu(50) useDeprecatedToolbar: false Page { id: searchPage title: "Click the icon" Label { anchors.centerIn: parent text: searchPage.state == "search" ? "search mode" : "normal mode" } head.actions: Action { id: searchAction iconName: "search" onTriggered: searchPage.state = "search" } state: "" states: [ State { name: "" PropertyChanges { target: searchPage.head // needed otherwise actions will not be // returned to its original state. actions: [ searchAction ] } }, PageHeadState { id: headerState name: "search" head: searchPage.head actions: [ Action { iconName: "contact" } ] backAction: Action { id: leaveSearchAction text: "back" iconName: "back" onTriggered: searchPage.state = "" } contents: TextField { placeholderText: "search..." } } ] } } ./tests/resources/header/toolbar.deprecated.qml0000644000015600001650000000431612700370701021756 0ustar jenkinsjenkins/* * Copyright (C) 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 MainView { width: units.gu(50) height: units.gu(80) Action { id: action1 text: "action 1" onTriggered: print("one!") iconSource: Qt.resolvedUrl("../../../examples/ubuntu-ui-toolkit-gallery/call_icon.png") } Page { title: "test page" Label { anchors.centerIn: parent text: "Hello, world" } tools: ToolbarItems { Button { // normal-styled button. anchors.verticalCenter: parent.verticalCenter width: units.gu(10) text: "yeah" onClicked: print("upa") } ToolbarButton { iconSource: Qt.resolvedUrl("../../../examples/ubuntu-ui-toolkit-gallery/small_avatar.png") text: "oh" onTriggered: print("lala") enabled: false } ToolbarButton { action: action1 } ToolbarButton { action: Action { onTriggered: print("two!") iconSource: Qt.resolvedUrl("../../../examples/ubuntu-ui-toolkit-gallery/small_avatar.png") text: "Second action" } text: "action 2" } back: ToolbarButton { text: "cancel" iconSource: Qt.resolvedUrl("../../../qml/Ubuntu/Components/artwork/back.png") anchors.verticalCenter: parent.verticalCenter } } } } ./tests/resources/header/toolsInHeader.deprecated.qml0000644000015600001650000000453512700370701023057 0ustar jenkinsjenkins/* * Copyright (C) 2013-2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.0 MainView { width: units.gu(50) height: units.gu(80) useDeprecatedToolbar: false Action { id: action1 text: "action 1" onTriggered: print("one!") iconName: "call-start" } Page { title: "This is a long title for the test page" Label { anchors.centerIn: parent text: "Hello, world" } tools: ToolbarItems { Button { // normal-styled button. anchors.verticalCenter: parent.verticalCenter width: units.gu(10) action: Action { text: "yeah" onTriggered: print("upa") iconName: "cancel" } } ToolbarButton { action: Action { iconName: "contact" text: "oh" onTriggered: print("lala") enabled: false } } ToolbarButton { action: action1 } ToolbarButton { action: Action { id: action2 onTriggered: print("two!") iconName: "contact" text: "Second action" } text: "action 2" } back: ToolbarButton { action: Action { text: "cancel" iconName: "cancel" onTriggered: { action2.visible = false; visible = false; } } } } } } ./tests/resources/header/presets.qml0000644000015600001650000000475212700370701017706 0ustar jenkinsjenkins/* * Copyright (C) 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.1 // FIXME: This example can be much simplified using PageHeadState // when bug #1345775 has been fixed. MainView { id: mainView width: units.gu(40) height: units.gu(50) useDeprecatedToolbar: false Page { id: page title: "Demo" state: "default" states: [ PageHeadState { name: "default" head: page.head actions: [ Action { iconName: "contact" text: "Contact" } ] }, State { id: selectState name: "select" property Action leaveSelect: Action { iconName: "back" text: "Back" onTriggered: page.state = "default" } property list actions: [ Action { iconName: "select" text: "Select All" }, Action { iconName: "delete" text: "Delete" } ] PropertyChanges { target: page.head backAction: selectState.leaveSelect actions: selectState.actions preset: "select" } } ] Label { anchors.centerIn: parent text: "Use back button to leave selection mode." visible: page.state == "select" } Button { anchors.centerIn: parent onClicked: page.state = "select" visible: page.state != "select" text: "selection mode" } } } ./tests/resources/header/automaticColors.qml0000644000015600001650000000522312700370701021363 0ustar jenkinsjenkins/* * Copyright (C) 2013-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { id: mainView width: units.gu(50) height: units.gu(70) Page { title: "Colors" head.actions: [ Action { iconName: "close" text: "one" }, Action { iconName: "close" text: "two" }, Action { iconName: "close" text: "three" }, Action { iconName: "close" text: "four" } ] Column { height: childrenRect.height width: parent.width - units.gu(8) spacing: units.gu(1) anchors.centerIn: parent Button { anchors { left: parent.left right: parent.right } text: "Light" onTriggered: { mainView.backgroundColor = "#eeeeee"; mainView.headerColor = mainView.backgroundColor; mainView.footerColor = mainView.backgroundColor; } } Button { anchors { left: parent.left right: parent.right } text: "Dark" onTriggered: { mainView.backgroundColor = "#333333"; mainView.headerColor = mainView.backgroundColor; mainView.footerColor = mainView.backgroundColor; } } Button { anchors { left: parent.left right: parent.right } text: "Gradient" onTriggered: { mainView.backgroundColor = "#6A69A2"; mainView.headerColor ="#343C60"; mainView.footerColor = "#8896D5"; } } } } } ./tests/resources/header/search.qml0000644000015600001650000000365612700370701017470 0ustar jenkinsjenkins/* * Copyright (C) 2013-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 MainView { id: mainView width: units.gu(50) height: units.gu(70) Page { title: "Search" id: searchPage Label { anchors.centerIn: parent text: searchPage.state == "search" ? "search mode" : "normal mode" } state: "default" states: [ PageHeadState { name: "default" head: searchPage.head actions: Action { id: searchAction iconName: "search" onTriggered: searchPage.state = "search" } }, PageHeadState { id: headerState name: "search" head: searchPage.head actions: [ Action { iconName: "contact" } ] backAction: Action { id: leaveSearchAction text: "back" iconName: "back" onTriggered: searchPage.state = "default" } contents: TextField { placeholderText: "search..." } } ] } } ./tests/resources/ubuntushape/0000755000015600001650000000000012700370701016611 5ustar jenkinsjenkins./tests/resources/ubuntushape/background.jpg0000644000015600001650000014776312700370701021454 0ustar jenkinsjenkinsJFIFHH ExifMM*bj(1 r2~iHHGIMP 2.8.42013:08:15 18:26:1702210100^^"*(2 HHJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?wdJO=V@R`QǠ>_AMI&;i"L{ 0(>7I va@G4; &}/_J0=Z7j\AQǠirʗ(/FWP~ݣ8drRcQPz~n9ϰw󢌏(7FO&Gց ϭ'>dLZ^}ޓ'dz?_ʓ@}Kǩ 0}hxK@ G4_Z>Z&OqG>j2=?Z2?ɠ#֌ZLoΌoΗZOր =h;}hր QIǩi(ǷG ^h0})p}?J?Kc@ \Rq@ԸJ?4`tvFM'Fҗ`L7>sG@ />{t`{!y֓=(m4`GʓM'>.=ZL{~9h߭dѓ`v0=(ozPQP1v\JLڌQFM_SKhϱ4};w}(0(.I'4sKqFOҎ}(94 1ޗJLJ'>RzQ@(~t>`P(R`ΗbRcK@ ?B\/RcZ99*Oʀ_ʓNɣ2(ȠA)2=h;>ր''֌CFOaGFO sE~Tg@ϵ.~ ?*?*\Ό_ր}r}E?n?ehz>dM@ zёK9T4d!ڤ;zLNi9j\M9j4dF[\?Q.E.E'44(P1AOғR)ʔ(? RʍT`z|(&@ғT/(ϸ84zRfʀ g'q?'>.*7SPϿKϡ3?PcB(84RQ@?4fi&G/cT~?~tIF(.I0?OΓihi1y@ Ό{:\Rdv {:L{ \~?ܠǵ&O?J_.O/44})O֊]E#ޏƀ_Rd?GG(P Ҍ3РbsF?4hRg'h">(8g#ր QQ@ ..Gr=1E;^=M%/F}~4qKJ7{{K(>oJN}RfF}7?4g束cIc@>&z_Ηޗ'~t N}ER4@wҌ{cgh*?JL)s\()iwQ.(F@ooҌj2=E7?e}GE7w?Oʔi?LKzOƁGF}i2(g#ȣ" J3">~tA'ތ*8"zLCKϡތz>oCK4 1iqItῺh&4s?G*OTR4QǧF@ /zP!ΌAzQ@ ӳ#ҀKS8?(ǽǵRqGgGGҁGhҁK5_@ OF}KZ8&}Ԙ4sIF/4R`z~P⍣4Q@TR( 8qE"Š(}(s(yn>(N=MP0=MGR1J{E0iSE~&(( http://ns.adobe.com/xap/1.0/ True True E15FCB2D0BEAED192E6ACBD963E37E85 3 E15FCB2D0BEAED192E6ACBD963E37E85 3 2011-03-14T22:47:46-05:00 2012-07-17T22:37:36-05:00 2012-07-17T22:37:36-05:00 Adobe Photoshop CS5.1 Windows image/jpeg xmp.iid:1D09224384D0E111B558B11D4DE1BF20 xmp.did:F8163C9C6CD0E1119F98C93DEF7AA0C5 xmp.iid:1D09224384D0E111B558B11D4DE1BF20 xmp.did:F8163C9C6CD0E1119F98C93DEF7AA0C5 1200 1200 8, 8, 8 RGB Top-left 3 72.0000 72.0000 Inch Adobe Photoshop CS5.1 Windows 2012:07:17 22:37:36 JPEG compression 72 72 Inch Exif Version 2.21 FlashPix Version 1.0 Internal error (unknown value 65535) 350 350 CC^^ ,)2LK EUcCVTjcM!!%\r2ĥjGnF" 0L E)+ H%lLH:T̴j%lҜa@EL1(Ģ6,HbUT2jZ0-0Z%H2Ka$ %\2˒ZjaB mC"E1Z!Ԕ!Պ5R2ؕDB˪TRI  1βch)$\$УU 1(C0ڪ1D2 ɫfQʩŧI hcV,!H^IX!""1L#ZdbXW%ZQɖX dsCEdˑ-(H1$LdFJ`[(ƶ%Z "Q:W.JRµ[S Ufˬ 5IY-tLi|$[-egDJkE KBjh Zi0h QʪR8U2`IJ2j!٥UfZXm" P2,JBTMZ)Qm؍ܘS,,bYfh[ejCVDB)(LeKUIa %V1GZq"Ju H JL5StKq$[0T2TTصQ+U0HT!IR C%\$j[UR[P!la@IJRY 5rD1HaˉKJiMQ*Z-]s % BZtbTBUB#jH6̺ BI-%BZ1TH贩RMM D9! ¸2ZRD(;ieKIc,Hd9+Rib^ʶLKRXiP+%@Y`)hJlЭJ.L2-:+$ՙKDR;$"İqH!)JRl[cU^t:+,E!Xdd s˒*lHAj%ImВ-FHXѨ21ENT%,JJ$+jc-M hɔXej*C 0%XP(څ@WH-sGEѪ"*%f5QQJdZ" k$eT$\B%Xb+Z1EʩB Ml,u(IJJjHDJ&,[c jƶśk-D%FIơȰ)EP ΠRLɗ [6[m*qJ0ƮDTB)bؖ1ACYJ4%DPr;X$P:'5 MV\JƓV eɢU1!ZCVJTj&Nd*,ѪL% eafTT)VUeTe\(iMhQJU8E"@P %iBjZD,$Ih'2ReB]DU-E*I+, \$Ғ [cRjbՌmXD2e+6HJaeJʊBE QޑRŷ HRH@\K.+4KbĮ@"iR*0%qD,RVKmʼnPɌ""%BjBM #QP(J%CNנKg9eGq""BrkbHRJh1LJIMR)tNa9-s\$$ $XJuG5, '[\a&ɢD) 0N" kNV"R(vM$^u[U4VسMDtXE-"!"# 0Ѳ6s˗(˗.lW8puuFh|JxT9vvppSO>_~O::?7GTa˔9NS)N}pꮨpÅ_E[DOaL+W]UªaMTL(#0#0!pQ4FƏ4tuNUL2TQGMT]Q5FWŠW_~)'ƟaFTjQ(UuWTjG˔*c[ 词_4FutttN:uuupPQjVYd˻)9J}]l#uwF\)r2W*(aMUWu_E_U[U8pQtNx:?7G_QaMUU \r0]~OT(9B2GpÏqaϾRRW,'Tp0p<;#E|jGD')p:'T%9wwNo#wwvvrTLW' }0a}S9r#vqGTy)WtneG[*]ʹFP.#ȯDn_"U|)SȮjL*)2;;;ggg(2(BaGS[u_u[un\r+GȧM#(=BF?EwWurUBº+GÅKxtNp]S4WUuS +tG?=G;u[eR. #Ta.}Y|>7¿o+mSCvF\vNˮTE2썜e뮲SR_e[eN9NS[r6F썑g.\a#DjQj讪#' YeO]6FFU2ӺvN}*?:'Ɲ4WTjny)7FϾ*UUUUr}p-e#uKhS\{趩p%>uttWƮ]T]Q|kxYeR_e[eN\;;9r!5uuN]]\:BUMM]U08JV[T7GGDhQ{>4趋ho5n# p8utF_7Ƨ_#DjQUW \:4)+08F=Jauڭ~n8N:?7S!Ça]TMUÄap9O2.\vsV[+nnW辩:GG}7_u[daW [4}  ,9|c:mnѲ6F%! 1AQaq0?LWt|/y9Vc)@hޟPMRit2 LiFɑϦSQ &F؆Y,A0L1$NˮtYp}O ãD Dӄzn=/\ɥB$1s-S%uLN&3I"hb7Y Fp3 iwL58X &u;0GwDՂBy7IJcLsK!kaF4 v1$l~B("'vNV''#KY{IdO.!c)0`f]lkBQ*Wd,%W F|PX<E]g O,xxKh~SN\ūKg%a>P]d-V5C'I5thk%t3H)g<&ORI{ItdefdN=]bx9:h> &!ȣ6cIɦOO %7h&6Ih}=IMzr[ r)T:yOf$izg8%ds, t2Ma#i8J8~>'nD:_*F)y/8>Ulc&͌G 7OVW;~nLQ.cc&1čMQPKtG Q=]kVS6zF#I3Q];YKM>hebOj5[/ԱebTtJvrXZ&KE<L$d'MG'NSs2cz15[,Hz2sG)\H4p4ur"FCNt$-G$ !0@AQ1aqP?ܘCej#) ^ɺɯn!c^WOr>迢 8r0".[GYYC> Wܮ}CFl8$aaF{j>KEr;CI-cR=b4h"ViYN1[ޤBsCk0d$_|hѢ |y<=123ABC!4qr?SA+ԂUِ!J%"XIk=vv %%K;L%6>udq+m-'uDζkn n̕Q+EHi" 8E|FOj'ڏ'KO̊[yUJ ]^a+H:Ƌ;F7y5&KO"O"ʸc&f"f_6Ϋ+pCyB+_3'}:B{^N=̙=?vD>%KlꮂQNy߬(M#ȑonҋ7rzM~FW#tnһRDԕ*TDMfm[wZZnkogBVMdL5}_͌sQNj.gNN.tAld;i>>mM½ C}޲oE&Ӹn㳩q>ҟate"zsQ28ݑ$|yyLzO2s&Z+iu_?_>sE<ͯSyԝhɮvdGKȥTUs9*ȲYoZ&J1a]F o0fʓ);O#28r2)2dNi2QY "THavW#-fN]qN<(I7jHG*I]R AN$<" ^B\] VHSv#%}1C9O|O=HkԎҪoNȺCsY\L g#dGiDPH̋Ⱥs"iivMIiq#Ur8դ1! HB)C=IINԃo!{bRsz竎j iH-l[]I]hRW^HB lc8aNÛϐ Nv7x{ w,%m:BFS+<%gAzz|>|/BU*JK! |G= OOl6ӈێ!fBfA*G.=D2 Ѓ1f<7D~D~_=U9Eֻj 3Í"Fm3s8L62 kyJD.MGDE)ԋiԙR}7*ovTqq;hϔ<#ȍ뤎.8Nӿ>RTm%[E"ɚNAufdv%MDVdVdL|WϜsש׸Sy;NsxoRoFi74täާ|9opp8Zy!hKiU%J*Z%Ԗ̕*DV%m[qG_piN623SR&mIOz޹A>.vM&=7NI%P<7N|&eWQ31fLYf,JE1E>Dbf2d&o92yKK:2}&fE*w7Q m̂[MDj Qj"LLE&u&}LɗB>Y#ta6.)ki4K] [k+mt$mIZJ8PCZp2P7&OMD48y)rӴN7v;-ߦqAV&}h7mI_qM뭦F֐ޭy3'J%Pn"k"k"kydOI\[BH}yCȇ#} w#ANO=O=Jt>'-zs2?2b7yoBvQ2"&,tYaNh;Y8f~ 3A›=-àQ4m%%ߦA<_>C{HzG,2y|J>B av%zmSfAy.ή%U̕vdUiuOquE=~]Gu%[fۨHAN' Vߙ*Quڏ2?dy3.6W3-s:.g ?7MGIMDo8Wm7QTLndT̎$"6ZG:33!aaeD 6Imm%Z z_=I]vW]fJ=HmmhR]ْKQ̟*Y%Iq"Se ΉӴݲH%i¤>dAh܈\܎Ȏ`BdNfԋH[(rчF33Y/?PovQ!E/Ț*q8qԃԃAR e;JY2F{.IݬvDŬ1k7}fOUQ*ݨhDJfA|!rf~fpfqokH]$Su7[*&w4 &cgg콽]K3h I*7kelZ!#vDvG!ȕnȗȑj܉&7IILU].AMG-vYv6zggVvzχcgȲs9,e]d;㻩]ػLz:+E:O2?'DAdFF+at/$[7doW\*o8޿R}Gk`H:$vWaȕr$}ZK _Vv vg ҨCiT>%Nr+&\ZIWdN"wUIj׷2?dWG:~:.; 4ӚEhv&E,vJvQ;IEi9܈G=1AH)T9<3EzχT̃*m̃jJ!3%ę%Ą&#wy_= Mr7Ker$H-" er RR_*JH=Iq#j#InБ IH)ƇE%Ԇ5!;2Ln̕-ґmT9H7jGG9Ѓć$_=I]wԑLT̓ik#tjnmMۭ-UovGWi8ZvD۲%Rɝ_"]5b!y %B i?PU5*Y5fD(ٓ6*MHrZmĭpmvd+/ Dya>OTG-Gy=-ԋiN\'%rQYOndRs"S2)DLMDNzO=NRVBVO=}dp89jr9kSNzfGʑ[ oRdԛiaR/u:_=Hh_&mG%R,ԎΈL!2Q ndnB+B.B."R)m[ieG%_ˏ" ZH66["W"W+CA99!>=7OmM9;3qvu8YpoL2e (ANJzzg)W'o!;W[p8Wu:SI½%ȂZLq%Z:ny#M&ˈmhhMjGԊ~G;#H;H]g[WE#~N6n[ fKwR q_*KZ)ˈ伃H4rӡ;WIڤIEiԊӸEFj&ơ̂ԟ7&"S9ÈÈó&wfG ;_ó8Xvdeٜ~d5gAS2 2VWjH567l*V ;" GdC Cl#Ȏ"-]G'II5Msd~ډFEhd7Y5LSY2YMdeɒMs5-"j8ݨꙝS2 vg :<#ֈTE֓"+m[m#ޙ7"E[q ;IG9lAe%őI^H}G9qq6SAaƝWϔ$Y'K&mͼ/?}%,Y~)eQںD/vd/R_ȓȒi%Inv,-k#sّJ.g *rR-p2?b+qC:"t#ЋG5沤]N]"+~D~fߤf-'%IevWI*\dݾ>WyAoGdq6]Qr95sQGfA\-7qyܹL^ͻ2fݙ:QQ68Y#sP|GD2/1:ˬ]g NCQk.g3 g6#+uڎl:5fk!q3Q.&j!MDq#I)?Mt#wCiIYg+(HDЕ R oL^N kЕ=΄T}΄"K)"- ]BWYL;)["f 2]2]=M疍|SY[=yܚI=I&Ԏ9qe(AH20t%Зi*ӴBIwi/IAA",i7įyJx7^t#rtAiԕh躎k+eu]D~&k6̛ kD&} Bg'}o3x2w\mډvu].f.{cv{ڍUu r&n E 7Gundoaƭ8էr[M9ӎ~OBdЙ,!2XBfB)e2&K=[g,vgrX>伆̗gh[m6*oD9/>#/%oc|7i硻+nҽ-t7i^*Jnn7mHWi^)E<&O= B)(FӅ &^q.Dmt-g[\LEk&Qa!1Aqѡ?!Tn(,`T07 4fA.7loG KYJ](lA.x_Ac^~b4(Zd 0^p3'*P>C{GBI͗a$ (v'f WdğJ/:>Ők_*%Afj6c,ɜ}Uz f[rNëMI%XZ3yM>Dato""P_FW+L& \Ux@FRKV͂Vi{Z+ dPń+.Ч9/#| "8 =@ !c ZU_U7%kh) EX:83؋ |@8oA$jwT!ظuDf.vgʺA-wbhU6^lz߃-F91}UA/$TR~/Kp|ĆԜ#!gdR̅xt̓?-`g>`_d z?]WB:"3YRF^o / .N;-0RE@݌ntGfhQD~A>ImVrr[$7=М])ў==L a!#5 Zѝщ 3\PodV "dDC=Kϰ$)Ll'Sϒ Tr@HrR^A*?wuWb_!*._F0&%TǏwQWS qjй7ܯl+ J2Yhoif+cx~;fp{&zZ޾U[{Jz/\v Ht+{ ٧A~dfOBD8Z>GG3[vوfA~C2k+]b*R-T.ڍ3,Dv/)) 68hB.C@AUx G#JbX„O1QE{AdDdb*k\}裱crgRf:U!ZEe !˦?B+B@]}+y V,ų=uLcL|oQE%uo~wUxMz;ԢWl(t"&pRm~WΎ[=E?Qb3SGGRY \=: m.pX~F]W=&+dI>ֱmejm(~9Z_Q(ުHBEX:FGx$*I'+nLYf[nd$㥡1QY`< ULNf&9{$ڞc $r >!"dئT~CU} "Q vF9*X6*ySU=!0-7¸W9)}W#N;{_k=##Hּnn}UGW{ÜKTE34|Dd?ɑ'#I<'l@w6=N.0c8Т̾z O3NDTVOr.He%b4FC\^TAjR1t9y"T6ZچJ?iSSex_^MZ;O+f~Pxc*XlQo(qGchYE>kx~c!'ыOAQְ؂U~c(jpMœ4vT/[a}YNaD(Yu2/^] L&b)z>%2:bacbOsDM rJ߱2JZ!@lKT +oy(ncYm.ۉ\ :^¢e2 s.X^L>n?֞1W!(Ia-5P<,\ck%m@sz#%@REVztI]e3~Hl|ZR+7 E? b,fpvpxY\_>T ΍.H`?C F6-V\ךEqt"Qy /AE/ xq"Uz(CѾ\OABo9B6ouξ-; ?1 ojkDj%5}t#C<yi3U-OЅ{M}#S݀%!ɍ\];pS3( OQQM8/WNbn>^?/tgU 5~ox*Sªbb1-o SCiHWp} m3b&UGXSMƫzTj".|HhL**E*tB2VjUj'*ҎXPؒ&,)y o2AY+tzأbj3BZxD b%W0)Jl%}(nNLn~W Pe+2C/eIPlHcsƦ'*\I d "XF;Fj&Pg) ɏiQXzBh a~U:lzB/_z;[PCkOjڼgUFNHU 2JH($&apnDXlEJ_ -@H/rK-M텣'wFN^+#J蚢Dȼ06ŲTX?gLNKF{iXWGd|u4݊<P>bo/B~2B#VBCtBBq_R^XNқ#x]¥7 jDPz w9AJ~[6US ul0o#&43&D$IQ_em5 j%-z_pɦi(mdnGag8 n% ;< B A I >o(AS?dr ۂ-b%.r\U0bz`e~`T^/J|$15$W$i:$%i{J"0Mf*WBOZMBGL 5My5Wg#nfXlA~;t'w7&j3~?d:rajVؾE*d7%5Orc6U)*" YL:g$Hy[Hc4ES# Dr9~w0SiT~UL4H*bEa-CD]045jY-K \ΜKadDP$حu`2ȲLL{7wVց3Ai`5 %"k5ٛU21hc )~jrrN5cq=7A`٥ā[ZX"9t v u_`DbҰSLY/P&6nw.-&h;,DNf|@m!/.6~Ayl~2[bP!֦|Z1$H1ɊY'8 YS7ՙǑ*bd㰈X4b⼁Fm,oGP0h lb q!P7,w 2&i,Q/ $/Ԟe.Xqbݾp>${zcהr?ZGߎ<o$Uw2@g &}]TsUkI7c$0B%13|aU|6澂LÎNKEdELE3sWO2dRaQ[`džZ)hYvU ݍ,IN259-5Ѷb9<.?Xܶj p)/a"-)BR m/ٹ &F/9$,P^("+mup6T+3,: t*Ā v eL&^q.{->P QfJ~"()xeOM~ 6zw]// Φ=tw[hO$j䅰9R8"pgz`oi\t?{WFĞx$PV44,G3CTdE2U>5yODL(f"aڭ^ I/L1uʽVV%n4~%޺% PZPiKș\ Ey @~<=lWK&#&:r4Ed(H (A `"F*s+c̬ء9ywk _AgË́J^{!ԵܽjOE|f bkL2-͋ nEvd/{[- E Ep@ۡꡱX~ z6,3a0_iAUڽOQL$**/pl9T۲UFbLSu:%.(?98"·pvqyr)âo? ]d[q_Sh1d6/[y& =8\Q ʰp>TDkh0)4yK5]}mbȈw4f~z V%QQNGDqS+q+ b ~9%zv\?v(9/ §!<Å9 gTc^.9 >f ' jr>k :)e_takEB%`6r,2ߒQ$X N \1B[9YB {!ɖ,H?ź/c$oW"Bv- 8J'`-m6LX <}_[ ܯh 1 9vFI4EUI!tٱx~E[Xdp.-SN|V }'j|!9"]qu!%ZI{P (Q a^Pjea d^$ɏZml*j:$0{g> EexPQ0-wؼ[3h0(ίNvi_8J xm#>^H5G!'qyer'iWe-[\-ϲЇСv[TҏK?- 4xzJB%q˓]ruK8 Xx42a@F~},xO &!1AQaq?dB7$Mx 6^'}'!(xBc{A0@|vrO BX'F3<:A؂V*}T78%SruD_8X:bcqt ߜĺ$Pox,{$~Ш$QA+]/2' X_]HB;j"7Fh*( mcY$$( c콨1LþXFfy~p*,T DhL'|O {huP_P3 V"2%` A21:$f G4DHUq3| 50 Dl"CTdLBQ::H c~z~;uO>`B&A0 E|BPAeoUϯ\%r~P$S{0 +˄ #Aa FȀ6Y| a03DY. 2rK-R@ 1y]m:1yO8 KϹH$ @m-0 |="RwoJj`Ge0ÿ $HXްHh7|Fc9(B@.|amq?p#mQH,@\>d@i/`wqFY$ƒy.@ kzKs$pF01L? <} \ ƈ[~ /9֜ gTl tK}ꁁw@c[ͅ~DMy{3`BC`cJ # ^kO)f =8. 4EpD (hKxyb@q C9H QB<w Qv0( 8K[хFCޒ":HfI2w!vq$a  b<qPa4$}L 0Yb/w0FZ`JQGѼO5r(Lc_+941a@h؇(@#}b< G9#Nt6B>%4I.`)ȠNgB&I繌W Ѝ XGH%,} Ю>Ћ,'DP2a.lJ @B4 6P{缢7|1 q@pAQ dU)Yn`׌&A{@v ۔zw׉^hK /u}KsP oϜ@w-w !t];@S ~y`|ߴ zF)BY#ML$='6AhxH({zF`/ 1X1fPP]caH.tY[8K 01$'ar>!5 IyR|yDADH`i oX3J gάPAabAjQ|b w|c&zꌀ\^Ƴ %A-BHZ-BaIAidfD׺za=nW07A1W8$ %a"l~)(I"A~[M@ 'pUq_1aBA@ :;)cxG&j>`*ʳ)J&&vಸ}a-g 2`-7D"0@ϸ/%@ɿ,oKʼB2PgS2 2 l=ځTT$9ޑ.b!H- dmNPa 29;: JH-u(2}d\ #^7xlW_8} 6x? '{*La3(۞"[`d mlL`L +{2TG/X$q$@4_9O $0oK8# _Ϸa]v@e4ۘ+ dozA{2K(BNhB 1~p1ܞ@7z$N[H CD uPpL9%o6vF+jW$S>>`$3<1 "T$*ӏlDP9'{VzoXJY4M# $!3Et;Q8 BH}}l}X>g@5"䒾6q$X$Ig L( nOM \Q8EEq;pS< /xP$j8ڄQsK__Po00P7a8ϼqIicj];6Az /y3f`EoHa3} ?ݨX7\]e}%^'&#2÷ĸ)A&HݿXE&ïln8 &0/B ?1Gpiv;hG> uЀ}(cwˀMT{ (zOH"ǚ~7R kq^?1%(QD P hH@6 gz. xm  H:nah0Mlv!+""7|oʘ0 逜 7ʝ M,6xC}!!x&b:^QnM̠@@FOh3_/ŮpavHfOYCC}2 `2>#~@= F&fM@|DY:* "LJ,OReWO$8BJc,0Z[{Ք!&A k^ n#(=:ou%p/w tn7qof02 d4ZF~q(٣–Y=P&CovZ; 4`1+4:!`tq!Qφc 0N" GwQ2KA)BA${NoË( "S\E7+#Yp^{^:ynl8)`p"//0/Qwd ?8q0{n#l]`!Z2x=9xg)`s9"$hj0yN'?_prV!M-#&)վN0!==D>1@,[ ^#?E_3'@}] >΅ 6(/y; /ޱ D\!q d+"ʿJn`YsHDQ3+}`}$HN L@=~ Vd5!< 0sS!=%̰9P :^Rn->wk0u߉Ep,Z@h*b@lPK~Ջz 3Q BCxbZRKeH?b RІ@w3JL(#g@4a: `#@ߡWdֹdfwhp$=."V3 4p@CpZ+[,!2 G$A"i >X}4AaM =ڄ,jrȉӘ X#QDm""޲>:G.Q 1.QC!?82Fh #i_({IC,B8:N`$m茒0G0BMn  5s C| 0%-Act@O60 @ Z x@df3^PPBS $wf 9'(ĺ@%n&M)w}c^Y^)N`$ 3">,n%]BmKH >)kѩCK yLo0[Cw0lSW!xxJLeP'똹H00WfGEu΄w$GȔ+/8H#G{ %0#5(SIec1,oȄy[KDD rS~{@ xJz( ` BB0B9/*@HBXhT,!ƀo$D7)ZG] 1ɾ0rPt2 ׆.2`^P "0'1嘀I *G";LSAp[q~KBFk}{ rKyj0_ !:='-I'v kfI "L!%h@[ uHK>Dfh &іp#bյ1zވRVZWn,: ̚-$Za ,`- `@P%@Ect(hP` 0vʾ/&wtǓw gαߨ!O pd0tQ#a,+'B&0r BQā ֟X opJ.?PH! x%nc%1Ndxw0׬m߈ bY6cwW̡߷0Lm 4 '۴oK yOy p9 Z#|H; xa`  9}F[N %4BEBd_D(Xda4b`#pe }bO˳gQ'09."Y"s` }dm@yD,4o2'pg`aLs3Qq hI=72!DIE¨JV&oWC?"Kްre`2`}qKH 9o1ZYdxe 5#=:<`$ OA(όe@_ s(s e$p  H=ʂ-xPK(><0k#FUOx]! 0k{ t (om z^( >-`zX m$s0AWZ8pjY? Dh"xڜ0dr}:@HЄ4jZDW 99Y;UY %6p("UL_1 ((_9 (Z; u׼1׈AL">Lo0bef$0 }SY~l(o|;LTcv"(]" /=( TUq$^N\;',.9`|"X'} ,8>00XPB8ݹBPL"ql{IoBJgHAۀ=Muon  F hxpВ*}2g{# 1p',X xAhÃ%X&PF({")!$]#c ͕guy`.dx-ڔW! OD^8P3Hƍ%uV(9y$E{Y#0Ө} 6OH p?[P8#/oߨ@ tK( 1mox qKnK' C@z g 񄅈G5ӧjC= 2X]b!_8NJ'!1AQaq ?,oP`AE[NB,Q06}Û}Fr1@1 D x P<<)e)`\F| h?c% B_Hʘ4PB 5 } qm#LD.m $# aH-Z\wy87R6 7>bD@ `%Xy` 6q=^ ';(J Uߴ\,;vXd #pPp@jIDys,!;vi4Z.bU \pD Ch[Y >!'XjXTqPBIH[0  JV#j{1K]3yr&ަS*\T[͓b\B+hC\h,DDA`"V'^r Rp$CS1%Pf@hP\w\.h@{0"楋dǥ-bgE,757}ijp-,%ބm@֕{NoD'Cl#KF m`6{Y.*o`l;!qG]2RP:hCzXP"sƖƖEf5mhHݴE;$V㼱$C J/h6o,y|ˀ"j0^1D`o/"ə z9 /c.n;T`#PD!4"qPHY͖К6Bb&9pٜ /^cH#YP2xG~#ya A<* 3 .!46ܦ,hEϋgqO;^&u=O31[O;BFs%Y"Ӗl 8g 'x@%2mB+)Xga>a-6k#n!ƙM! ̴`@1 +@¨lcbȱ8/_3w: A u}w1=:.V2(BLp7(107h rʅ`a윶)wa)B+߈EwidO*2P Z]KV!hѶfMt~%1:ݿr&ĠqJYBMp<4 їQZaL>aAl^ gJƨin"L\P!S*`c$`"oyY x@hK7"9 63P]A$ pv7"u:==` OqF ndI4a!TB"11Hu Q׉H#Z *a*/_T0v|X7X\E[wxEa A&9c0E= %\0v@ OpEbm,[d}@dP*bͰ?Pq܈8[ - 'Lbz#GjR0J`0BDe/-o1~f2ul30|ݹ~&" LA-M@04 'mce]ƀ$7fzFOkQwm8w:na L`!=z4ɏ+>Ԫ*^(-ne{J`!%k ZpQk e A.qryp7/FBK͍(wibxu*gx[؉Dw t?@׹PmL(wfqހ˃800Qc0g`F|uF hP2w\H% *  Cd+5@*>LyxwX1nyT-T !İwqyPp=RAsui@ $GIeL x0v˜02!8U0/hC,Sh7Ufqb(zz5-xp2cnr7QfQ2@AhoB[AB6z BZc1X:~&-tl uWۀX \ BPlq{ wωaf"u6j@b+!>/2cvc-Pp.Y _ 0C3,5s  )`9 PfЫ_߽Q#" KY\Z\V ؿg34 l ߟ =΄sPjڀ.Cbv$*TeXúsNE0=wj0bwuP4TS#~fA;s3(5kh|fvfU@A[pc4T! Jrrc vd\s 0* j7nU.gx(-X v1XM>{ߤhFQfsYK81Iy%XEJe,f}!vAnt4 Bj2'Q3'q_ \~b9('A_/v e#cEdF|!AWnxsM]F~4BH,Z?ދʄZsaAX #-E"o0eo 90R ]@Ap)CD85yf{=jJƉzаa/=ڣB||;ۆ.=B]v'ԿiF{id+@gġ &(qh6*m v4f,uX1z p p,(i ,eDhA*z=̀6!%4[!\Kx=3)xzl;ΗZ"'cPe{.fo} Pa(fDr[AN!Zghp:#{C w0՞ ơttDFw CU0Lـ fyZRĦrAk;JydO*1pnn[<#1#*r߈ȄMIAlEy' <ÌB*YEei'FLL V#DSuR˷7's.6{[4>gq+z,tW5$<9XaD#^kQsS7ԾU"TΉd:*jE ~k6<.ol` ͎SBbFLΒ(k0EC F$ M&YpH6:t2`w\Xxk>al9ڦom? AC;)AlF30b(@~L9}@f䒺C$͊%ר&k5{Po8J]P`>Eu@=B"t$FLLc5ڤi3HRZBi=†%)Tާ'_UU}b"j~0-Ԗ+Z"JSÎ&=z[ %͗kĎ6ځUm"`iO1N;&J|O jҊ IF̔|:]H7Y6cF8oIBGUX!=k%m#͎v_#]Ca|Sfx7jbX|3Zp.ˮ틩4#UۄBxc&Kbv5&C]MMCsSŸlG)emAu-,yV 1*5o"`<]E[Dvb1_&xwp benll^V 8 L@nр4p)!d6Yƃ)g4L6H<iov>NnMiYsC~XWbP~{ M1[&,,K|ԲC"_V!4kV+qişf07x'œcy5=MZ03dVȡ.ZV?NqFf5 Bv~nL`\6ĩ-c3:."P qz-_?1Pn9wѥ95C MMIS:Z'GWZ6n3e@c*nƾJ4+}M$0"洘Z5Mv]CiG~qa q#VY3{Е(|^S~=ܦ.6OoFky}.Xl'~)KwD.!P˶  ),E"lbN?ѓx "5N:d͘k{fٛ}[a|&.X N؃21l>XYF,M%bOyN.GDW}M,:NΖx0(#LK8 ~F+CDXh@KY p!` i"v6:'p{,T?Q wpb- SpS :A2Zґׄ$JVƯ7{c&5⪔ͮ?x$ߧ˸=ʮ hMÆf~" cl8Gt q&F"Vvd&Fr%Ul׻q(iITbܤDReW'AրΛwX6quZUS>Dʶ|Cj-"COVzH76PZj7GoaKi#6H&(BC mydM1AR&ƌi m ;E0=c*~0yF/]z*:Rw9_Eg̦ѷTŌ=9=ck\V񓹿{/Ac/!ռ)7M)s|TM( <$"kaky#[{2FýߠBܶ+:|7P6jbU`Gdźl+`P?4 eUőצPĨ#N k.Q /FQ;ӹw!>84xd7쎝tb&ARH<삞#zM{܋{gW},9g"Y2|wvU"\`=B(A{{t[\4kNVnT;"+lZRCSzL!oC#@5pt!_1)PG6pR8Ю%Giu\%mV$U"(26$SWdY}NX06P^[|\X&|y1mV^ @M=޿#{K,Шev1G~u~Xd%>EѿKpuP_MN"*a=k AnSh^㊸).z muvxwNK>=*= т()̤e)оXLǾvv彠er F={3H^~aݎg.E(fs~P&Y2>}B~HiHA_ #/{t^_' [ Ix끬CBPhjUD{k6cv>ːI {8hw){c7}y͖t=hQK5=H'ʶxzs~7kp}5"J6,҆}: Ư.? ܨno"6!`pqob)eB7WnҞOBcA{DyX~_芴H_-MP,[:j5 $/ylQ~Py^?r,6Hy` %vMJ_!Uc?L>f!8&ӯ4SEC&%2|XeB0 5椠[7hR gMb0e #Jʝm;DLSQ6/is twGpoSB,&X%zd5ooV z Iin56=H79MM~2C[[Rq& X(V_N~ ֦DhC]NyxtST}0$TGvㆎP|OvlbyntD[ЅO٨!aw-\`*{&Ɖ\wagr!WK[-Ϋi,' Z^;0Zӥ5f:!k1#t(Lf "M,yc__B/v.;!:;`}#Q۲XQ!A\IȾ. iG[ah1{DQBak S任Is%6 >r *hRoKGD{KpF+zwE͆i&p禤Yóˣ Ss*ki6-S}7'mI~faQE}?Z[Lv|!Nwף'·Mv؂AQ:evB{:0*L6@eu+> oH$ʄrluqq |cJ"]&o]v!>) ?ܼZiF倻$OE zfQ/O c Q.7'N0EdDCBR+^b2DK-D8:x+J^?eރGi>v7Njcf];%|U1TwknxJ(MEc]c0-hf;v=i}BCG߳514j IF_\Y4GmCm :uJڀ "i`kD]X#Oh؅l ;?y(U$4s(ןVM{ ڕ.*]EN2#*]%K5G |5l,!|R0(IlQj#4s@!XiZnn4uz^UW 8YJɍ>`wn۟UPK}ΕN5@`lB-kZÑ E> 15Ѡ+iٲIfh Y:8\6z,v$(A=-xX}Ig2%HX-#⮵4rO*ʺH--$q2 1սw4yjE"DD-&;~7\MBJKhV CWoq@_"*}>2i!/|j݁0)URjiXa1L4Mw}fӬjh76)`ěr5cj eWhcD5z'b\b޸ѿk[iJV/>z+'B!)Za o6C l}w|7kXb +Hu nMw W+=Do_WGRQ魫ٯC7D XK%ԨmU@bSyj< 2X>'?6;$ hX (yLؐ<1]tnojvTwgl2(1:5<V"*sH,}Q rh |m7f㤄0 -mb{@w vK$A?Y:3|g-ׂi~%'L\@~bj-"j0-l~D9ci AΝh'w"F6Wx<|$Bx5o@xEM)MEtm~# )%lXaK)c[6l)o~#8&jG}?x<5W (Y:.P/T_Se u ]]xmPqMr: )k(7qei]C]G+_DSLXj۾7b` iק `3ZF( sGl=@Уg弈zBF omwm`J"`<ԈnWF\|Uk0[jzO dcW!ܪT=-M(ovEp6,/֒5UbX;=l"#& @E}H3W@]JG 56p[D[biAf::CŻ:#nBŖYMFc̥{T]`ږ+U!*j)k+gn E+ ?yDwҟ`5iXxm# gq^7j# V頹& %IOWxUs>domvҀj݉0.ލw|Gp$֌ N :UԽJLb{Rh\SYc$a}Gܨ6Z K!p=}pb}lY7}Mx;wPb.v;Χs>K ˺OG/i|c myDXkKgzˠͫ|sNCպք*:vg޿ >F*˪k;oF)hG8ߎ >+wCWp)CI=|(YzΞ9x"/S!  c4'zė;4`3'(%&:0^UͶ8:)sr8RV£0{6R$mPw$ AwE_O 12.ؽܲ ~0O;0)j?%?w]`6S$܏xd{WLTiJ@dF_WgDH[vnpqbP7M|7F A#5nҡQkv %:xIJ+1WZM.N 6o`%~tRkt|K:#Xw麑ȣԠ"@<ɻ3J?8m]aP~uoLJ9-->a-ձT?](2.$3dab0mCRnhט8JqZ*ݸ שrwcUU~F2)S0|ͺ]{ ѻBTɢ-~`PwF7x5tj9bq Ӷ7/n cSmf:O2;c<,w rt{60d_/|SPdĹ%F:Ccs]跚 }fqi I*V [ҌYD=h7o֗=ۀ8UknO]zt{CS/Byc=\vj~ x4$liVi$w-^)`i _}AtwjO !H=Z S[g_.SS󛛚%1*12 ov(jvI/j/L+g'ABq"9Dw  l8I׹zv O'k_[c4}ɝLԼK%*IQTp~;T=-r鮱ڀv9"*g =Uq«A Xb>?5}m r$H ^kD-ĥW_Fx."Ѯy;xF~.]"pf Eyal@iL0ҩ >@d? 0kXv6NOXPMŧ!4:O2o&|~)_X|]Mf@QO0;=[l,[nb Qc""`?XԻVh?7i&<|?NMi]#_E>5ŗ͔g(CBrÈ7OXDD_f-CotHS!ZWfԭC_89M]2 #pt* 3 $Aio˔V]7jߕITfݩo%;?`B?6nSm~p ^%yGdwl@B/UiUJoMWwK~)TeZ( .ӆ|x)͛FGHZ-.;m8n~3HVB[/tFp Y0?UݳoT4S#1tj+ᔭb4gق"N)QIִd'P]5Uh@h5`2uIu3mp%vA'+E۫ZX",@\ZA2 '!K+` mƊ5u]`nwJv CC"8R ,!>y[q*kB0 Rgx@oIg69}R)q4k4+콛%WF\'6JáOW"ssbڸsHN=ގ =7g:@(%okC#lb~LM> `tdκxEW 2`':ۂwlh5A5/cGJ](Mb/bE7b.VLl@[[g繯{OmnMtU<ZxMA9{½0Xa9mת6":C`U®8R5.Sw~.QEG, zFWg]?Jx:z޲QN] *)tP y>iNRg  Cue.MOcžcZL 5|"~qbnEC 4O;7Z!Co+q&ڎ{Lz:ފ h߈sl~6OM; l6 3r" @LZh>KL-76@v|c˳m1GSCZ3|0C+EXJuӣ<׀ XwGeGv}CQ ͂:?)?Pv_c%>p4"#ڿ)ůe|W=qZ7e ^G4kj%lD.DTg xPPB #{V(kYd'@6]<Dž[Z^FExU5kFjK$KճH_ih,JjG ֝~7(>z2'Mv'YC>*euܫk*$*6椫j%nZ#0MB_ }JrlO6^Nlm{骆rRd oM{HsDz bdCt׻)} *AMrˆsi൷Uk;hW0@g/s>M~1j V)V-OX[@6=ae:;.l]?jAʤopk>':֘j<6֎a0tz~J`<u` hjWKCTނ.XVF`vc1%)-Ʊ&J!y%t6Q<¥5&aCu٫r'@wځ8'ړV&&i(?YPHpt<@ol(6Rpl[;,q=&ra^ȏkʞG0DšI;T l܎݈!@HpOH݂Ə)(mZG\"}5ik{pMӈn r}؄]+?FDPВ:Z^"k[z͕{9KαuŴv]者BrI>~Q:jnטoi#^ l \6g$y߰bWJP[R|ߌ\ɾjYw5m[B0<`O o8E]kpB4|L`!~}2 {F/v/U薸CkoM X'/NkfQuql7wI m R_]LKGhHoqF}}8qufHWID4`$i ;!LC厫@pݝU&DO s=V{/4c;e}ы[\:JLߑ@|w5]yLH4%"_s8G}ůpەT&w}"Gbl@o-z&1iT?pKzD ϋIc:UL"@:u%MEO;]|o\KއNwN6XA4wDe " 1E?4fҪ-0װN34Z,I{M/5B9ZEA/pV'Z۔_+j P T6bw'(iſ&p1-c_1|F?8눣>e8a$ӿnWs܎;ak@)v LGʬnjBnaNF})jǡCYuq`r)MOvA %J`( _ra:6, /~q^vbGFlV}eU4#Ԛ}x)іwZ]?4hX;dS} !9OczњcV0F b^;{NM2*մ6TСZIZajkO҄Ӎu&JnevtV_%'Z]Y}{Gu}\ Mrk$>Gud{F ym򁼏VQd}F[ =(2JqSC/2 cZ*k:$MQ)j`4Cm}^o4ZRӘQϭ4M>v펟 8q3=@i;K/Ibp ;)]4NXvG9|4ltV8=6i]M.S$Px_/QS9@嵾|06$c0ZlAGb&8:zްW@v5O.ll_"Ѭu޳az;P!+̂jkZezxx?PEp PF(/H%HoLn]"tskWZyk.H4]@,jCwK`1dHÄE.ja1w8DFBp:|"o5Q(֠[gpSߊ5~ӤuGw ;A<44mWgRknw)MW U}AnǕ:RMQFCOeS hv0^s K"U)J;u3ڊ[6A1;5lX*CX6&εwYDBHM`p&i܆$MP{p5?-߄~CwP.dEDIe紏nԸlXI5 45N ̫{H4sRS^dxgH5 ]ȜWf } 1,&¦K@֭k&JcK"Y>d)& 4O?i4A=Oxj&l %nY!b3R5']w3c3HkXmUB%ΤqᅩJ"oܑ^j+5.ڀ[2ٕ]l)gꋿpAR'٩<;'`%3ޖK t6\tĚM8"VAʒMD!`W]5RF.64nqhn+@Mvu.ez4y57eϩ]W#/ @г?XCRذSl7 MW`%E!u4NHUu?pwDPܖ-=_~T/L~AֆvY$gFR XzbsH&n$!6یMQ$YFayH=gr4P{tur5:|._jP rYEd|'L8)vznQ5@a= P@li)H'iی: Ӑɵ˝|_؉6$WGr"l@[A iC!sU~p4BUf}7Q;k~M򚛫tM$9sPWk],=]qyo.9;a߶SJ߂EƝ.IXbu)NbZPd*F jn&#dQޓcB- w~OX(s B:FWNl|9]u6h{1:˹QI>k iJ ;wBgvް [i;N;Kj&7&X{츁l Lxp0({iL >"JKsSJ?;) vklzΔz,nr"6iZG0MϢҿUƝ'/v4Wj%-Mlz whPCAd3Nl='dJy jO]f)w҉| ش->77 Q|@ٷ6+aQ]ZAJ歬-|oԲ&=gXR: 2vkX Ҡ%0T \BʽюKt{6-M$ӳg)C>-wD;9C%ڛ-ލlScdj"`ִw.}&E(_l%{뽻qh¡:kµz9-`Ъ',RQʝ!ܫIpma "(gZ+b_Uk'hf6jdi. */ import QtQuick 2.0 import Ubuntu.Components 1.3 Item { id: root width: 500 height: width * (15.0 / 16.0) focus: true // Zoom properties. property variant translation: Qt.point(0.0, 0.0) property real scaleBase: 1.1 property real scaleExponent: 0.0 property real minScaleExponent: 0.0 property real maxScaleExponent: 48.317715856 // Logarithm of 100 to base 1.1 (scaleBase). property real scaleFactor: 1.0 property real scale: 1.0 // Overlay text properties. property string textOverlayString: "Zoom (scroll): x " + root.scaleFactor.toFixed(1) + "\n" + "Width (a): " + shape.width.toFixed(2) + "\n" + "Height (z): " + shape.height.toFixed(2) // Main scene. Item { id: scene anchors.fill: parent Rectangle { id: background anchors.fill: parent color: "white" } ProportionalShape { id: shape anchors.centerIn: parent width: 300 source: Image { source: "music-app.png" } } } // Zoom support. ShaderEffectSource { id: shaderEffectSource anchors.fill: scene sourceItem: scene hideSource: true visible: false smooth: false } ShaderEffect { anchors.fill: scene property variant tex: shaderEffectSource property variant translation: root.translation property real scaleFactor: root.scale vertexShader: " uniform mat4 qt_Matrix; uniform float scaleFactor; uniform vec2 translation; attribute vec4 qt_Vertex; attribute vec2 qt_MultiTexCoord0; varying vec2 texCoord; void main() { texCoord = vec2(scaleFactor) * qt_MultiTexCoord0 + translation; gl_Position = qt_Matrix * qt_Vertex; }" fragmentShader: " uniform sampler2D tex; uniform float qt_Opacity; varying vec2 texCoord; void main() { gl_FragColor = texture2D(tex, texCoord) * qt_Opacity; }" } // Text overlay. Text { id: textOverlay width:200 anchors.top: parent.top anchors.topMargin: 10 anchors.left: parent.left anchors.leftMargin: 10 font.family: "Ubuntu Mono" font.pixelSize: 14 font.weight: Font.Bold color: "black" text: textOverlayString } // Mouse handling. MouseArea { id: mouseArea anchors.fill: parent acceptedButtons: Qt.LeftButton hoverEnabled: true property real lastX: 0.0 property real lastY: 0.0 onPressed: { if (pressedButtons & Qt.LeftButton) { lastX = mouseX; lastY = mouseY; } } onPositionChanged: { if (pressedButtons & Qt.LeftButton) { var tx = root.translation.x; var ty = root.translation.y; var sx = root.scale / root.width; var sy = root.scale / root.height; var x = mouseX - lastX; var y = mouseY - lastY; root.translation = Qt.point(Math.max(0.0, Math.min(1.0 - root.scale, tx - sx * x)), Math.max(0.0, Math.min(1.0 - root.scale, ty - sy * y))); lastX = mouseX; lastY = mouseY; } } onWheel: { root.scaleExponent = Math.max(minScaleExponent, Math.min(maxScaleExponent, root.scaleExponent + (wheel.angleDelta.y < 0.0 ? -1.0 : 1.0))); root.scaleFactor = Math.pow(root.scaleBase, root.scaleExponent); var oldScale = root.scale; root.scale = 1.0 / root.scaleFactor; var s = oldScale - root.scale; var tx = root.translation.x; var ty = root.translation.y; var x = mouseX / root.width; var y = mouseY / root.height; root.translation = Qt.point(Math.max(0.0, Math.min(1.0 - root.scale, tx + s * x)), Math.max(0.0, Math.min(1.0 - root.scale, ty + s * y))); } } // Keyboard handling. Keys.onPressed: { var shift = Qt.ShiftModifier; if (event.key == Qt.Key_A) { shape.width = Math.max(0.0, shape.width + ((event.modifiers & shift) ? 2.0 : -2.0)); } else if (event.key == Qt.Key_Z) { shape.height = Math.max(0.0, shape.height + ((event.modifiers & shift) ? 2.0 : -2.0)); } } } ./tests/resources/ubuntushape/UbuntuShapeOverlayTest.qml0000644000015600001650000003432712700370701024002 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Item { id: root width: 1000 height: 600 focus: true // Enum to string tables. property variant aspectTable: [ "Flat", "Inset", "DropShadow" ] property variant backgroundModeTable: [ "SolidColor", "VerticalGradient" ] property variant sourceHAlignmentTable: [ "AlignLeft", "AlignHCenter", "AlignRight" ] property variant sourceVAlignmentTable: [ "AlignTop", "AlignVCenter", "AlignBottom" ] property variant sourceFillModeTable: [ "Stretch", "PreserveAspectFit", "PreserveAspectCrop", "Pad" ] property variant wrapModeTable: [ "Transparent", "Repeat" ] property variant imageFillModeTable: [ "Stretch", "PreserveAspectFit", "PreserveAspectCrop", "Tile", "TileVertically", "TileHorizontally", "Pad" ] // Zoom properties. property variant translation: Qt.point(0.0, 0.0) property real scaleBase: 1.1 property real scaleExponent: 0.0 property real minScaleExponent: 0.0 property real maxScaleExponent: 48.317715856 // Logarithm of 100 to base 1.1 (scaleBase). property real scaleFactor: 1.0 property real scale: 1.0 // Overlay text properties. French keymapping... :) property string textOverlayString: "Zoom (scroll): x " + root.scaleFactor.toFixed(1) + "\n\n" + "Background colors (a/z): " + shape.backgroundColor + ", " + shape.secondaryBackgroundColor + "\n" + "Background mode (e): " + root.backgroundModeTable[shape.backgroundMode] + "\n\n" + "Radius (r): " + "\"" + shape.radius + "\"\n" + "Aspect (t): " + root.aspectTable[shape.aspect] + "\n" + "relativeRadius (y): " + shape.relativeRadius.toFixed(2) + "\n\n" + "Source (o): " + shape.source + "\n" + "Source opacity (p): " + shape.sourceOpacity.toFixed(2) + "\n" + "Source fill (q): " + root.sourceFillModeTable[shape.sourceFillMode] + "\n" + "Source hwrap (s): " + root.wrapModeTable[shape.sourceHorizontalWrapMode] + "\n" + "Source vwrap (d): " + root.wrapModeTable[shape.sourceVerticalWrapMode] + "\n" + "Source halign (f): " + root.sourceHAlignmentTable[shape.sourceHorizontalAlignment] + "\n" + "Source valign (g): " + root.sourceVAlignmentTable[shape.sourceVerticalAlignment] + "\n" + "Source translation (h/j): " + shape.sourceTranslation.x.toFixed(2) + ", " + shape.sourceTranslation.y.toFixed(2) + "\n" + "Source scale (k/l): " + shape.sourceScale.x.toFixed(2) + ", " + shape.sourceScale.y.toFixed(2) + "\n\n" + "Image (deprecated) (m): " + shape.image + "\n" + "Image fill (w): " + root.imageFillModeTable[img1.fillMode] + "\n" + "Image halign (x): " + img1.horizontalAlignment + "\n" + "Image valign (c): " + img1.verticalAlignment + "\n\n" + "Border (deprecated) (b): " + "\"" + shape.borderSource + "\"\n\n" + "Colors (deprecated) (n/,): " + shape.color + ", " + shape.gradientColor + "\n\n" + "Overlay color (F1): " + shape.overlayColor + "\n" + "Overlay rect (F2/F3/F4/F5): " + shape.overlayRect.x.toFixed(2) + ", " + shape.overlayRect.y.toFixed(2) + ", " + shape.overlayRect.width.toFixed(2) + ", " + shape.overlayRect.height.toFixed(2) // Main scene. Item { id: scene anchors.fill: parent Image { id: background anchors.fill: parent source: "background.jpg" fillMode: Image.Tile } // Put the UbuntuShape source image in the middle of a texture atlas. We use img1. Image { id: img1; visible: false; source: "img1.png"; } Image { id: img2; visible: false; source: "img2.png"; } Image { id: img3; visible: false; source: "img3.png"; } Image { id: img4; visible: false; source: "img4.png"; } UbuntuShapeOverlay { id: shape anchors.fill: parent anchors.leftMargin: 400 anchors.rightMargin: 100 anchors.topMargin: 100 anchors.bottomMargin: 100 } } // Zoom support. ShaderEffectSource { id: shaderEffectSource anchors.fill: scene sourceItem: scene hideSource: true visible: false smooth: false } ShaderEffect { anchors.fill: scene property variant tex: shaderEffectSource property variant translation: root.translation property real scaleFactor: root.scale vertexShader: " uniform mat4 qt_Matrix; uniform float scaleFactor; uniform vec2 translation; attribute vec4 qt_Vertex; attribute vec2 qt_MultiTexCoord0; varying vec2 texCoord; void main() { texCoord = vec2(scaleFactor) * qt_MultiTexCoord0 + translation; gl_Position = qt_Matrix * qt_Vertex; }" fragmentShader: " uniform sampler2D tex; uniform float qt_Opacity; varying vec2 texCoord; void main() { gl_FragColor = texture2D(tex, texCoord) * qt_Opacity; }" } // Text overlay. Text { id: textOverlay width:200 anchors.top: parent.top anchors.topMargin: 10 anchors.left: parent.left anchors.leftMargin: 10 font.family: "Ubuntu Mono" font.pixelSize: 14 font.weight: Font.Bold color: "black" text: textOverlayString } // Mouse handling. MouseArea { id: mouseArea anchors.fill: parent acceptedButtons: Qt.LeftButton hoverEnabled: true property real lastX: 0.0 property real lastY: 0.0 onPressed: { if (pressedButtons & Qt.LeftButton) { lastX = mouseX; lastY = mouseY; } } onPositionChanged: { if (pressedButtons & Qt.LeftButton) { var tx = root.translation.x; var ty = root.translation.y; var sx = root.scale / root.width; var sy = root.scale / root.height; var x = mouseX - lastX; var y = mouseY - lastY; root.translation = Qt.point(Math.max(0.0, Math.min(1.0 - root.scale, tx - sx * x)), Math.max(0.0, Math.min(1.0 - root.scale, ty - sy * y))); lastX = mouseX; lastY = mouseY; } } onWheel: { root.scaleExponent = Math.max(minScaleExponent, Math.min(maxScaleExponent, root.scaleExponent + (wheel.angleDelta.y < 0.0 ? -1.0 : 1.0))); root.scaleFactor = Math.pow(root.scaleBase, root.scaleExponent); var oldScale = root.scale; root.scale = 1.0 / root.scaleFactor; var s = oldScale - root.scale; var tx = root.translation.x; var ty = root.translation.y; var x = mouseX / root.width; var y = mouseY / root.height; root.translation = Qt.point(Math.max(0.0, Math.min(1.0 - root.scale, tx + s * x)), Math.max(0.0, Math.min(1.0 - root.scale, ty + s * y))); } } // Keyboard handling. Keys.onPressed: { var shift = Qt.ShiftModifier; var alt = Qt.AltModifier; // Background. if (event.key == Qt.Key_A) { shape.backgroundColor = Qt.rgba( Math.random(), Math.random(), Math.random(), Math.random()); } else if (event.key == Qt.Key_Z) { shape.secondaryBackgroundColor = Qt.rgba( Math.random(), Math.random(), Math.random(), Math.random()); } else if (event.key == Qt.Key_E) { shape.backgroundMode = (shape.backgroundMode + 1) % 3; // Styling. } else if (event.key == Qt.Key_R) { shape.radius = (shape.radius == "large") ? "small" : ((shape.radius == "small") ? "medium" : "large"); } else if (event.key == Qt.Key_T) { shape.aspect = (shape.aspect + 1) % 3; } else if (event.key == Qt.Key_Y) { shape.relativeRadius = Math.max(0.0, Math.min( 1.0, shape.relativeRadius + ((event.modifiers & shift) ? 0.01 : -0.01))); // Source. } else if (event.key == Qt.Key_O) { if (shape.source == null) { shape.source = img1; } else { shape.source = null; } } else if (event.key == Qt.Key_P) { shape.sourceOpacity = Math.max(0.0, Math.min( 1.0, shape.sourceOpacity + ((event.modifiers & shift) ? 0.01 : -0.01))); } else if (event.key == Qt.Key_Q) { shape.sourceFillMode = (shape.sourceFillMode + 1) % 4; } else if (event.key == Qt.Key_S) { shape.sourceHorizontalWrapMode = (shape.sourceHorizontalWrapMode + 1) % 3; } else if (event.key == Qt.Key_D) { shape.sourceVerticalWrapMode = (shape.sourceVerticalWrapMode + 1) % 3; } else if (event.key == Qt.Key_F) { shape.sourceHorizontalAlignment = (shape.sourceHorizontalAlignment + 1) % 3; } else if (event.key == Qt.Key_G) { shape.sourceVerticalAlignment = (shape.sourceVerticalAlignment + 1) % 3; } else if (event.key == Qt.Key_H) { shape.sourceTranslation = Qt.vector2d( shape.sourceTranslation.x + ((event.modifiers & shift) ? 0.01 : -0.01), shape.sourceTranslation.y); } else if (event.key == Qt.Key_J) { shape.sourceTranslation = Qt.vector2d( shape.sourceTranslation.x, shape.sourceTranslation.y + ((event.modifiers & shift) ? 0.01 : -0.01)); } else if (event.key == Qt.Key_K) { shape.sourceScale = Qt.vector2d( shape.sourceScale.x + ((event.modifiers & shift) ? 0.02 : -0.02), shape.sourceScale.y); } else if (event.key == Qt.Key_L) { shape.sourceScale = Qt.vector2d( shape.sourceScale.x, shape.sourceScale.y + ((event.modifiers & shift) ? 0.02 : -0.02)); // Deprecated image. } else if (event.key == Qt.Key_M) { if (shape.image == null) { shape.image = img1; } else { shape.image = null; } } else if (event.key == Qt.Key_W) { img1.fillMode = (img1.fillMode + 1) % 7; } else if (event.key == Qt.Key_X) { if (img1.horizontalAlignment == Image.AlignLeft) { img1.horizontalAlignment = Image.AlignHCenter; } else if (img1.horizontalAlignment == Image.AlignHCenter) { img1.horizontalAlignment = Image.AlignRight; } else { img1.horizontalAlignment = Image.AlignLeft; } } else if (event.key == Qt.Key_C) { if (img1.verticalAlignment == Image.AlignTop) { img1.verticalAlignment = Image.AlignVCenter; } else if (img1.verticalAlignment == Image.AlignVCenter) { img1.verticalAlignment = Image.AlignBottom; } else { img1.verticalAlignment = Image.AlignTop; } // Deprecated styling. } else if (event.key == Qt.Key_B) { if (shape.borderSource == "radius_idle.sci") { shape.borderSource = "radius_pressed.sci"; } else if (shape.borderSource == "radius_pressed.sci") { shape.borderSource = ""; } else { shape.borderSource = "radius_idle.sci"; } } else if (event.key == Qt.Key_N) { shape.color = Qt.rgba( Math.random(), Math.random(), Math.random(), Math.random()); } else if (event.key == Qt.Key_Comma) { shape.gradientColor = Qt.rgba( Math.random(), Math.random(), Math.random(), Math.random()); // Overlay. } else if (event.key == Qt.Key_F1) { shape.overlayColor = Qt.rgba( Math.random(), Math.random(), Math.random(), Math.random()); } else if (event.key == Qt.Key_F2) { var x = Math.max(0.0, Math.min(1.0, shape.overlayRect.x + ((event.modifiers & shift) ? 0.005 : -0.005))); shape.overlayRect = Qt.rect( x, shape.overlayRect.y, shape.overlayRect.width, shape.overlayRect.height); } else if (event.key == Qt.Key_F3) { var y = Math.max(0.0, Math.min(1.0, shape.overlayRect.y + ((event.modifiers & shift) ? 0.005 : -0.005))); shape.overlayRect = Qt.rect( shape.overlayRect.x, y, shape.overlayRect.width, shape.overlayRect.height); } else if (event.key == Qt.Key_F4) { var width = Math.max(0.0, Math.min(1.0, shape.overlayRect.width + ((event.modifiers & shift) ? 0.005 : -0.005))); shape.overlayRect = Qt.rect( shape.overlayRect.x, shape.overlayRect.y, width, shape.overlayRect.height); } else if (event.key == Qt.Key_F5) { var height = Math.max(0.0, Math.min(1.0, shape.overlayRect.height + ((event.modifiers & shift) ? 0.005 : -0.005))); shape.overlayRect = Qt.rect( shape.overlayRect.x, shape.overlayRect.y, shape.overlayRect.width, height); } } } ./tests/resources/ubuntushape/AnimatedShaderEffectSource.qml0000644000015600001650000000336012700370701024475 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ // Test if the UbuntuShape is correctly updated when its source is a ShaderEffectSource. import QtQuick 2.4 import Ubuntu.Components 1.2 Rectangle { id: root width: 300 height: 150 color: "#c0c0c0" Text { id: text anchors.centerIn: parent font.family: "Ubuntu" font.pixelSize: 34 color: "#c0c0c0" text: "This is a scrolling text... " font.bold: true } ShaderEffectSource { id: effectSource sourceItem: text hideSource: true visible: false } UbuntuShape { id: shape anchors.fill: parent anchors.margins: 50 backgroundColor: "black" radius: "medium" source: effectSource sourceFillMode: UbuntuShape.Pad sourceHorizontalAlignment: UbuntuShape.AlignLeft sourceHorizontalWrapMode: UbuntuShape.Repeat PropertyAnimation on sourceTranslation { from: Qt.vector2d(0.0, 0.0) to: Qt.vector2d(-text.width / shape.width, 0.0) loops: Animation.Infinite duration: 2500 } } } ./tests/resources/ubuntushape/music-app.png0000644000015600001650000017544112700370701021231 0ustar jenkinsjenkinsPNG  IHDRbKGD pHYsu85tIME g IDATxkϭYv4Z9urwۖE?X r"w$A%`;Cwۮ꺝9u}eqBT缗lٺhAݙ\tA1 K 6<t^P &mF}O d,r@}|a %*3u $_,s?zd^t9‘؈f:Ė~o(-XagIAynn` <|f;/*Fhvn-x=b7D0{u{.^<4$DuuҠ0ضf2#B/7 z ))=htKZ*5EElҜՒlK؇hAZ,N'tt}영\ \vv> a.07_xF& zP({X7nFF?*hl{7t@X2nm#}r.t\0sq5 ,uD4?~>>=H[f%DӦ'\?ͨVK4l YPkQ8i?_S^gVl Rsak}>CN)˚@_!l9^$tE#Mw} !Gݝa5m$!iX)7,2Sr!ʔyzΟyϬ%w^Vh9!mgԲ@hϻ]5Y4{g`);ƃ6~Z^ %YPsi9&-4 T^T@(h" "lk͚,ˉp%"q| <}ߺ.T]e,҆h-etMO>D1LcKs_TH?X=sۤs=u4c$vX5YF<)!ZB_ăhCDkУF(E-T NY;ҩϹce3}&HV&Hr6 Rօko j n5MIުmD!J I}a# #_DI'HH6Nf߽iJ tj5)hUM4\Xk3H5Ͷc-[H4ۢF9e >} ݚX AbH|gei_&rX>-* Oc@˩8xDA1?{[ϕ?ɫ`ZΒ>k=c/vt 3$2e׆F@~JejVğͿMj~߱>>IjZ9ӔHJ ff[ȒάNў[F.A9OM"cuϤP~)גsa`L=PLiqQ@UD AmjLuSSK[j q>\W>S狹9ҎԘ ؝t N9-eC"gaŏeY qK#)4 ]fS)Ѵc"MA@Ca?׮ Hy1QB)`lcH1Ͱ?#R!1.ԢiS=cB&}EBŬ:*GK7eI!8n-5m`_~Bbd.M)ғak fplfm|j-h@u 7SJeӆ:5]F@JO1"]ieyWUbY蓕K˝;hKAZHN(\*ڱ؆?`ɧ\3`pW>B-qǾ"!i757`נ4,am>/oL ,%*%ʛy y.t9D 6ʬ pBxy*sXo Τ~ bH;N<+6 }ꖲ&b≃V-eT^&$Z,dDP+(Yphv[:UDe5(kt,Ӡ>&5kW Zip(xf/i>&}om1)Un|Ml{bv+4͢"Pƹ}^<5ZH@ڭElh=cYf/-D L#$Z{MQFtAϬG@m@0 !L>-/cDW&KznwRndz50KR|wS< 'Go΅ēOOZh9@$kLVQ11,Ӧsjr&(@(?^ǦET\nz0[d19ݮC^20#)@KށC.:^?wD֢X282-BUY&"E9R#$*2YqVFh#sa9 x ?IyKQ2%IS~dƢVRF ;'K3a0X:a Rx:OHKKJ>z~/=:b|z=FMY޾=OߑX<4$ hcNYؽSat K9"9Di6IaSg`F)}70>xk2Jk}V ;Vbu(Ƌ7:uH绯i}+YmQbl2{1mN ȋ XL]KNInKfZu Y4gN^SyjzSϽ,`06C /? .ӇQo/c=ͷ i ^M`֝b@F[Հ\n(,ﶎ֮Êi}, -(2-Ju915)MgVjƚ,,=~DmnLX%CizM|-oMeSo9>F, E~pX{k͓Ӡޖ UTT)@B$}êfr&ΤRʊ8qфT ]ncv-QYqMN!C'lbALgt>NrEreJ=ZMeeRC}GA'~i%: RJb-zb#30>xZ'=ʔf MJck~Ûe(3u)8z :.j08@&.fShY `><&Ss,/B$8zOk_7-:(?uqkuT]F %q`a (ʼ/NkZ2(̗P=JxYvJ uBMZK0״Zc >#q:b_͟y\h'CےDT|r-)1qeGdU:\,I}t(Pٝ=V߃rP˲N[dX &Vr;q:[\K zq\ïB^*Obs/EZ~^=zo;!LT\uʸg4I570:5>h6MDgzt\"XV䅓ޠTZ"&ehHR *ӘTR xC p|SӔq$8 ,ZT dC^Y^+t2V^ƪ).2/?NtM4dTfp X.hmg>I'K)aİ/Ph6 xk7zvΌzh6H(9 &=x-rU9C5YSUC#KvloDyb }Cw҉᷶&<{ $I.?sV>'^^˳ !.U[WCb.ZPZ{F[YǐThؚUs=mD .!3)e~{rЮ33L2F&jL>4_4(w98\I'n ӂH9XK$oO'pZtP ߧaڃz#{]#:7*p!ݝdIx=ub=PFɞRnFVwQ3l.91,)~Uc5t22]{&tC\KHrFgh])nԩR,0]0Blli"$Ѝyw\K̙doGJkږXF`Jh,._ֶq%bs kj!TCGM"&)G48Q\tA'}guIjk^!B~Sew3NT_&}:g$$VS:90G4wiŽ.؊je)i-hD R&c2=1٧ޒcFlaQ8Lw+0ӢeQZ" -6?H`k_?PJ>GBF0S1CEl4pDfYm6W3vXYXeNS IDATf("x~7^wu>27]1*nOoe2KTQB:bؤ6N+nנoY4U\5{铓xB8cxC i b+5yu{a\zќLcQ<_b,?|LGrOp)(nsCH[UGoA9kSZW&Ѳq-E*Lw ɟYG.mIVvHwl)+ QKC'O6%+P+r ^+MNHj y(hwl]6͇#meNcY\v:|M)h)jUgR#RP-ѪZ ia4 PCxKwE)]Ό3eme֟@*ܺ@ŭ ۀO_*xlXc4mk,8Ih}/M"{$M+6?2SkM2J"| .=:fsNJCS4ל·tE,!iǛ gߥ[cݞmk̥]XJl~vg>..7wXdK.N-Q? rI^OXnGm2cӞz2 y|zJ8g|8 q- ^ЗM$+ Iװ$R(-C(y>ln>7-$F D ޾MzЀi6ID.'f9,^BФsw-A>E(aǖ'957ZZXꚥ$!eʶIB}cM K1kk{<h\b(L[ d8ݽ2<-PSP+vNnr/< + o)OKW0ֶ'I,M %OЪ>s6Ь358sPe$7fܑRW?~:% bgJ,]p7q)#g@6,Fͻ1K7Usu^2Q={E_$KɴB =[-I<tV@K (/ғ54}H:GYdQp*;ӈʛŴ[7).JLlm`m[;#k1GlL,-LlQc? OAqUOWifu #Ye&[v\}G;@á誨<( & }dTwf0{tOz*5 2>ےXjTkn:k]\yd(Z`()s 2 ~Jg'u&;ʚ![YG%skvz2](L7TRa:JT0\eF #eIR} 1iad`X JinOak >n$SUܔ"diǓl$Ţ2 g%).~Q󵡪'ϰ2; ? 4lrIWQ nuO:KEzaUNeF.FC/`W&vxJ}+#0mg݉+
o6:e{.M޺:-&` $_ajx=ze_^#N5#ՈAⵆf'%*ǭ$8k5Ҩ='vQu3#d]qK:kހ5u*Mqv 'g16KMDzףD,laY`4TQ  sّ}. Q>3Hm$v)Z(';'w!JTmrE;{Bi ؉+Ei6Qf7>jN3w@8ԣWg*9 %㝠ߞ vT/9DTY)], ,ViTKz \Qy)Y5jO\E<g%(mxq)Zǰў/! |x JT$RUEu;KQ6B %͈"jg (igY0d Ye ]ĐWF3V_nXRU+tS_kzC2/Vy/.6NO=9SoAN) SٸQmޒ/R<=f7m֍-F9(Pg6jyPe\thJl*Ӿ,3N6Õʊfyc#!uY?b@2.RnjÐJaft Wf 6Y\W1'l_l#ڜ@S_*yL{}PNS4 !76Ӧ9SbQzWyU^A8ػ3cFCj2qzG(fm,.>!?yva땧Ye 3n>'h6msmOYwկk/a{loc@%t39;|s'O?w}.]p.,hl+D^W2ӌl/8HI>'ܖ=I(O3Xj4br>oKu_ٲ ]RR*YPRRY]EK̘Qaqkd,[` zal+JZ!GF#8dU fH~hJK.E.S^>?qc{+8knn],LGe}@v?z c=Y r{ >ocϑwICYD%-)> BSSYx`NK})vUK" T2 ܟm(kz JXb괶{ x[k̈́v+dj^U^cU vWLfPJSLQᮄ @P+HAyg:b1RFŵ@ @d:(E=!3[mD`s՟!csN;o?5J j 7{? -Ƴ?owph1?/:y kƥ`746%eKѩ_R' LRoc.%,{ *e9fK¼d$7íW]A 2T;Rl..gb. ΃qP3,T9m]-g94cSǑ.`̈e;xn_@;C?@xX*1O~+??_3'JL_g,-^L2R{j 0].ẼDJ.mOiʵY 0 YiGpGhE4 ]0`rRSFSfuzmeGo{| J5h@lT/P⤅@Y10#eģkÿ?v>d!~y_?"ށs\?6F /Yp]e? ق(g$~ ;pd7 8Bj=1"V(ܱЃuz 2xFIa??}bc[i }x U$B{zO 7Us~2 ͙okd}z^ %sk!WMNЌE3"{_)7S+?v8BgϾm&Zuri2,˘-viHNOp`?LIZ,th#Beh3*ʳ̮{tll|c=䦭N߉M-,2\@7,h*n܇&Q[.**>m˜Ć$yȂKS^Ɵy?( 8uRxJAF!`?uIYY"˻Ҳ;3kO(aJ4 z1 _Grwܝ1^G@ͅnFuf.jgO0R6xQf%xX%buD !v^\ ɮj1J.ѣ,SBWǽIGdo=8Æђ IGBZ.Vv6 u\چZ)GUX < x l-9!;E::\LŸ)خxɳ<7 xpCLuTZEY=f=ԖTf2\ƍ'cR\<&E9ʔgϹ),4$BzO`ÿ+Fyq ~G;O]pe :8sZqBڥ5pϼ$%ޜ$riph`a[Ob,K e5v]s4|x쥾1RxlB5jq186E =$m*UO BG0?%2c#i'쿉/翂7!_h |L1N-2BdӞe2KKרq/ly+R tXqPר5{3zi[`eeC)ZVKc-v%/\:r[ ̎bW#r)k -m*؅%]J *c6~%G6Iz:p<@npl-b03DjgI.ET%44 &Yq%w+'XkD ߝM'IF v!UA8o?B%/$a|gvGN-! zZM,I9 YbZE%,8c4@(uWǯ8ΐ'-xq GL+l@J2^%-v%f3r@p@7+$ezC>s*YGa>8DSV1vC2vxW7j\Wb_KSy)+wo 7XU.3-L;\3;Ѭ֨f%IsV,ӽE IDAT?p*L_[x M[ iM02_>1/W촷3y ^%Ϡp0pž !殒#OWm\ QP9H,)))ۙ+.9V喿7Ty?6ӭ'S*ŝ]k ؆Hu] }tT垞Z6On6/s0n~3Wiefށ7sve>r˹9|ihoj-f!@IUVA4km($ouSb-D\cQ5l-54``8 %?\mlh0=N|6B́_8$􀺘FXj+" R:2 @@0iiw)Sn`tpޣ]7$)>0[yUTF eE 4nFu4%xp槭H#p\ ƚm=}IN3Q%RtEb/XĐW{F]M ,hzĻ~1}dR`IESMQm=iQd'`6 v͡$o"`4+o KM5tblfrrFƈ#N"MUsBY_,R@i${vYfqY{")_oK{et2DʹmJ2ޢ|3U4۝q鿎 QXxKZRku|`WNzP ;HFW6s,h1Oz7 aLlA9㑙|Ya} UPD?qkҔi1q$ԠҲg#x޴ pdMqoulprP'/ kX\]04&t#fH#=-=k'0^E!xa@Ԁv,;f<d)]NXuT< qj^{(5.j{9:>Hgy9;VPBͬB61?82P6{3K-kv(|H@Vv=opU|1~C_P/mYC*0W+((%0S [Sv`= ϘydSZ/<]!i EPf~d*#sӗ?bi:2x+qzeg 0Ey6[O)'r#N,xL6b^Lx`'Cp@LXYI |35.k%:?vmYXH6hw;A(BztC)H}14e(Y6yF5הMt>Sb0hQlKK*Ma,4ql4[M]уuݻQ#Į4Pۮ(SCN^XAm3Wt`io%!-B=O_ۚ[$']f1T#w0DR$6q9&fPR83g&clр2VQ֫Ct=V˂ ﲎ5Ȓ#k_X<_;lkN,eH^ԚI{a(~ue񧔨P3u%n#pg3\6wF}`.kh37Oiv4 'ٳޠ)Թ>SBɢ"CwQ_ۢ@u:ŷ@д=ִ,)VLiLQL U?>^'Ǻ#"z+.9`P+k%d !I ֌ DoSJU]aWYF1m@iYϴ-:b]k­f EF/LO (CoS탶3)m`d\tdd^۠Y$XaAnnTQPNҩOTuqU뿹_TQC{f7i; F9+qp3q#Y+dXK /+_LJfnAliSS&YHΕ^tx,F"e5uö_O3_,.f{td0K pD{iUdYiᓗq.}BCTz`E_z2sԅ3>򴖝*:g܎c/rˆ,\ٮi}:c1uK:sZ5{Km(=SZQtjJ˔ _ һcr7IdE! \=Y? j ):"8|c<>IOz?p)Wdvqy>6;Ŗ~=DhQOO{|M[fn+0awyRx%}'/fZf0F=a{ni 8.oC@9&h W0l-PW;/RT@:TqԺՉ+eG^R>r(D xbi:>xDa-}q*9rp4tk+(PE20=*`]t,i)i&)Ɠ9ܡOgakW9MJn'$u!o]%tZ'IP]g$<;f*iQWQCn[328{'XpE.Ce'DU` -<":IcgJЪjᐄWX@:>k%JY#WsZ3.U2su~>gxO>0Ǝ-wwM8`;n RtjЍ< lGU#cԼur^O.4>;|3v<> {1kN[ƼQ7EQ&*f^8.FjZ,1۲w~/M=Q6{7eH( /%] #GLf7JvF~"]⏣^B!N?N٫|??}>{Gi!sCO/mTKND1EpρG8ܻ^ǃx;x/wã /X114E8c_-SH'gėRū1O mXm8tޝر(ӘIAiZCWN5 0P|ySc0UNJ4n5MhkD35P*1bTXAG9$X.:)ZO'bɫg#HCn% +1f%9U4! -B0v;>o⻿{/>|?ɿygD+'hwܿ9鶵-ؘ2^ 77`'?R(_ ;_U`yNaK iw͍X"s c<Ge_'NA(*H#ɌBय^)#G'~X4 jjYMB pHSHI]L]n+vӚ}©īTzSN>on1P'L#:קv lEC>y2ayhoV2?ac. MS KW-ƫ%[8= MScJ[^#(["e5 (+'Ϧ7 Y06CNNvS$]gj(LPtP/x{vLr۵tD5u &O7]$uD+VB2 {[甲Q]ˬH;n6$DM 4؂2<_} 1{0Ŏ=Be 7?v"s-KMUVp[Bxo}Yj޲3^@_99)e2΃qfwؾ()_R*i?w?p{5t۴ wcr jLPcƷ??h%&ᕪ#ȱ_yOm[Ū%9pw/#q԰ ֱ!轹a dNw-i$tb~{cß"0"8csSW rm>t:Y]X1)t={ϴHvZF153o# B Y pe<޵}M$CcIv-8/+0[FbŢLPM`ŘZ_7wކپ_'C4Uak -|`.8 n %?cԽY dp7ܻ9F{$*tR>Fk |'" bv5@'Y ڒbuo9+I/m9H#۹(EC[#}iMc$u-ЇI.u b˲cGeKMJ&sHsךca17{֜so|, ͒INE'WCƱZ>S`hbPmb>j]_ irYC*qTCh7PQ-|%w!Z3ZKZZ^x#7pw-_YYqhɞEZrhަocc}M =Ͷܛf;[| ~~|#30VC)qvP#kpCzQ7!1Vp1P}5YL8 1*, KDa3y>]c6pTw!jwn*m *m:Ԗ3:wnJQmR%=y0ACT"THUUhw6ꪥH8F& gH;V dꥩ=1K;y]֝,ygAkxDʩ')~qD%vn_9|w"1SbFfB@60 @)a6qMg%a/cdjH]˨cy" ZjŵLV,}H݂2\!`*rn$H@= O]+q`IEݕK$t3D E{pŰ!{21u:ā>G VhIG+RKLSvƒG"0n-  @"TYVG IDAT2񘏮pSyyZhPŅőBF]\\4]ঀ̦Dd0/~g!wa}1a0b 0RBJe#j}_H:C^ȶ.l ;<PD-'ňr\&$gs*rpO5n4b*c{['xT.\ )R`s/~J24zgdHBY COb箠hei.5aGe7:׀4 Ub U`j$YR`.%FCp.[ htAkCCjxRwJ,dSGRb ̀!&Qhu6 /?pvup5b$`;X1h10 V> T'f.`ڽl,J\*J9I Hjш\Dfm;ځb2͊#UӔ!)7K"X'/I`[x}V_ˌ=q˜6ene)m3><.n2ń;c)f29HgyU]_L HƢxԻ1G3Pwt`6+6%D^:JwYp+HNm/X }M!E8k=z@%d0_x2sNdU(q`(6yi`:6W~OŚ)-"\L7/Ua;3N yz==bF8"#ьcy k;ak‡JVBCρϽ^O.I ,gɌĝ7 ؘPXHnvy9A$T߽YG‹sO =g}?,X\"`!Ż-5=" ʦ88PVnCBZ @gS$]UIݨ)5*>#liHtG)_$Hcr:yV.tˬ=w&!'qJ=Wkш:%0Zl&% |?V$u< r/pq>fmQ3̌ iizEMV n/2b]./cͤ#L(3/1ҊrFIjƑ1͂aNaࢮLR -l>q#0IDr/g7,~e2c3u !º 4@ TO/ҪPY8h FI2i wԚܒث ]:6; D]nƘ99q`A0 -kCb 6h2X ui'&FL $3w6av}X;-TGH%0ӑ⾟0Q4Ȁ&H]Cwp P԰l)TJkʶ^zzui ô'1dNa/?sSD;{6/t:U o笖gkd ݻb&}};}HP5ʼ\"QD4$"F1 -I(ES DʇTrt߆pe5:KKQ`,͵kX20(Q#/mbƊ}֟,H5Frrw  &#|lC"GYB4>StZfAx؁hxe \w-%ҘZ Cl4qk(4L*&h#iK]S|sp (%;߇!iVdT!r(eP zI0%P@{9rk(JHjq^Z#Oh#R&ܜ@:PB@VVvLg3C!hMo\MS*tPЏ.cjyaʗџ[U`z]@ Yxb'R59%n>hd)+VH6 AQF \YZn&$?ߗ4ͭPjX%+׼gccKվ(|LefO @Ȓ[[eϪﯡXs*.xɣLܐU5h5NV=v nJ+aֳZ\Fp]olPfpn&iCN01Hf veڻq::0FC0&LRllE&Z =T\KeZpCxS˩W:y!Sfbƛ7g|ݪ7¾sM8erq2ϸW[W8N8J *MKq׫w=i|lomI>"1`OtϿֹ]N[f\MSƊ#)Π{ԯgaɢ \>]D1d71=/{^/+-R6}G_Miy;=/j)C8+8?g[ʘ5#e+J%e-HX{q7Di+ZhUm@TE߰x0k,Dž?z~Ab PR\־_ ((Af 4= zhnkuiG: Z|ҿ};Bb=ˈ(͂ͳo#%1;`BrП},x5n@bLM Z*p1Շ_]=z1Xp8&"ɊϽaxoZ mU$zMϿ׿z{CHg~ >x^4uSxKOx_t0>^R9+rP* ilrp1 ]b\hFNX%Ɗ~2·k/7?,"D Wo!p]mYD'չ/D:Zڧcp/zt&&'~&pcVP,ϐ}H]lQ0{Hb]3j͡V[k]4ū ^ ##aeM|^*-a$W FLƝ(=IIs %؆"_4N s8+׊ 5w$baM1ʖ`TO)AhA y:MK6,;Xr_Url`S-m>ࡉ@W7l+㽂;xuc5\ih{_*Uzą"ws ;0[uW`P hVªܜtXk0H *s}肩I1;YBZ#n^A|n-Q(.'/;#HZ0.%$- XC\Q1d׳:G\ U5뛆]1{,*r;+@ oݍ#8pj(pVKH %"F`T7tۆudZDBnCB<&p.iw0`j >\; ?xçŦva~wOdR-hR@v#Zt 74&IREeOۿ*!ၿ.I/ tt'Ygvn\~Xp`4τ1+njrO\nS5 _~b<NJ'$WRE_f2? y=F4w&\?0$wE>q^G:Jx೏:ljOw36s턃]_'GqzV#cmtqW$~QGZcݚ64Og:UG)3eբ*3 "^YCQDaqU>d߭M*<,6u\* XlT)M7Ye{f a’-\FJR+59+h%9l%ܬť)XW~|h*nm}Y}gElf&!UG9MU|``afmB,IKI1{4Mi[@PPrHts#N} = J>ETH*TWȸdFrQUj*JLwd_*`5tas)VƘK~*w..{C䃹S4>/myi.fuX 42\<`Z٘64dIa,CVHW 3DKhH ETs(^0u=UOfN Je|T۩6H!&0nG`H{lֻȈqB2-/L@$S._ut, Lql_U(4:A8Jfvøm8~xFn2-yZqEOLMNR`5DWm`*;ٓ{sK\;jNCU[YV~/,2KdvkYӍO&|PFn;D0op zÃA)k K_{H9ϱKAQ/³ i3)9oki FǧȣV܋1}ɉ@t}AKFy"{kuޱ+h!\YI N[u-흀KnB%C~Olv@ZC Jk{W#I-It"rm]9q7Px"EIC)F!Oic_PtTZkr'[y2Jf@1 yjoz ނ96RZ) 3)fm?3ݭ*&--i«.9w+hϲ5Ro)B'#V|t^K(ƮM˼"5,! AmƳN\ڛ&OP.o#誚I}=6*瞭ב~kkT/~Wu% {+<;`۟wޣۑ$ūއa_elQݩD1~~x{B?<'o`-Y/<^8`"*1h/V >v)ADY Ξ? ~fx~Z0]i>w7 Ty#ؾq^9 Ԯ)%pQ@0fTY4P!ܳ ?QN-(`̈́m>SPN`, $Uv$H YإWya:4UZJ- #mTEBbD-Ѿ3= 6He>ʭ P$1] Eh;:zKA^j?UR&kF~jսh;giz_߷S%/a vCѰ˭]޼h$lPuVqdhVݾ wAӬIH ˵9ًBT*fizzYh+"}f HTx8)#uQFQtPo^:掌{I", V֠Mn+?rN?inPz}T>F:ldS;7Ბ%*@ڡ )ઃ)h"UzuNܡ")tiBB;odGĬ=1IWQEqj ,@ _eBb#Q)<yqP趣i!ؐʀ?ܱrcRۿE~FVF TS;fџs 4$~j L-I\5$؛0IU{N\ 2Z i:}.J|%J`!}RMnMKjޥ}TZs2ikq4Vl!k@S)TyӨƠ;XT")tvīC2QWQa Y"!B3FEaǐ]YxZ"=|ĽW[WMW%GoPdtÞz%Vjbޙe7)#d-*l4lS4tTSZ]ma>UsR1`Zh-+ܴXij@qD >G +\ʞE q(@2W:.\ JB**iS#S]4uB@`*MNE"'͕H;A*, ';5DU#Q[~WEKFHLhi*JNt\#$R{B~ē2r {:6` SZe2R~䀸ó/Xo&RqhB(8q"ZNd4gQG8]{aoEU+k0SZs.hPt)Xje~:1@Y= d6EBFU*C)R+ d%d:`VO.G #19ԧ|6new#y8~7s39Y`Tt/k_,h|3]^#zлqi7_i%c Qk;U-:Z{Y#8zW\ݙ/m349W!Q뛕ռ#t]2Q3 AyJBIEa0avӈYH+ isgS:V@KQ"£%t3u'~nʊOj:G%(7Nv)D}"Pf.^8YL TAwOɟpKC]9=(dθ;@R鬊LY3"83-gϟbLrJ8 Y-SK{v.nL3ξ~\VQC7# ogN܄PAMK6w= ˵$ .*Rq4 hIUjśGK@T0a#LYR]ń(6/A 8obwS .^>+n8 @d N@DX=uFwf!"Zd2-<tY]pƒ 0cl!s,M&,8 `#bHӌ.|Ƨ?Ob ΐ-yޏ'>g?Ǹxe@k gl[˓pCzJg_;EJՇ}Zh[}8+6C:Oɢc Ud|AB8}kb靍%.\V~*<ͦSmC^8pOz9p'i @as̆z#^UL- F\L֫R5%(䧎b,!!hI#Z'3ϐ)keppŸiCy]gx ?|kD7뜁9#_l7] 8zxl^{/ W("؅Q*Rp, "!{Q>6Ehչewt;rC-ng Y[/@` HD6W%ys$ q[Q,]I ; H 4TV Uń1) s&F`.Zf Ŝ3x5^W{xmڒȕ&'u1i9WBZ,Wjmr1&_=.AJR@C=>ɟ5Px#|b¦f%5cxA2iIս:h#E\lY3 %kgߥĢnd,V/;42tJ.c@Q}lڐE Z_L*xZ5Aɴ?ố 5ROk/<'"ѕpf<(oe;uӌ;Vs>ҵ^].wj9#|~w.k2͂qܝJB630 VDa Df4uNNmîҝISI=U <ӴP9}Gr 1gqbƆgC7$XkQeb&a"snb&k-%kCIkq.gp0p<v{_'ʨO RU $II"" %{ϘaLg$&h7Iw.fn≿ wGN/ g߆?I+PQjHvizi73Q՘(j(ji(P'KqY6=5lJ:T`hu'l9z ejj<&m#Ž{iU IF PcR祮 Nt[L܊p1fRhdTi`FXvZ2^~ Q8^oHyn&)vEO6 }UwN^Ev,EEp,fC(a' io>O1< o@`#Qcnb 5an-@n- (l''ԙI /% <EgȈX2ھrS>DHjN$_?isSr]vlzȬ8q%41r[K<0ߙq3pB[ gؕ'߳ot ?ҕ@q!~$ G' X [#12s-W.pa-ThMIB+P.џGA"\#Zb[yѰI :~ ժ?/qm ΰȃrDwɵ-&mJm%~U=Eu|vc e-CaE$xcemd:`,m lW.P \uMϨ~pC5GY#ڝ!ت?ocO^\PƸ /Z2gf *MBO1vpj6Ủi*Bx>ӂo︕H> m"xܑ"wH!;0oR80>zPxb.(\]U/Ъ7d (7..~>AaD3YA8O_*574i)1'in'}1SG>pm5`Ō0 eŏC$S5CS]b[Q&ϐRT1{sHHu?c{k@5ܷZjHJ :RYò h2 )O|뢴 c;lt_-Rb aU6VNfdFƣhc,pdF=JX.ү%>zU3dsubQ?K4 *> b"ULB}bp ^q$lna*}2 l ? Iފ~PT6h 7 ?G~UOe3o\CJ2W ]ɦP~a@1`5Ve]ٙ厥%EEV@-p:YTjX$__ z^lE+r;CEY&̯-ZU1h XHI1 բ˅K5hAvZnWZ94Ѯiқ@͠CqG@w;[5,bb`g\3C7ů5L0!Y:4oQٟm6=Vjȡjb`W Y“nh@D1Ʌߐgj(w{@:^c8ߩ#C h\\QrJ\F.2Z.K8* ̩XF0kD!r̵QO64d3e0l< ]jZjj6T{v-׾W`RX9 "J} ne(ddQ\OcuxǍp1pKh)ۨ7D2OҁigA; S2zr8hyhs~-c^&}O6"P# R!80$~ E1b^R-G5FlGcIAI;kK;Jk\p>/.CeNiH ]Ɵs߃ah2} cl^yg_C{Z^nQugب@Rʡș<$ |8 eH. sgsVe3&Ql~3!evΊ,f̪(G3 w5j`8R#X#@A"ci`mC]DCnK7^(8FdS48bJUFobjvDmYMdڗ j3bEVy\CǠ rN3O܀ ԴPИ@çѷM3? b$;` BDE ­bm0* – 5FЦDȘTq o޿&s"CnJH7U mE2WTEPIT|*|;Y,!AU-)Cuq>Dͫ;Hn测+{hQ(6f'~ɊSZ­*?Y|_L IDATqD{oQ\tĽS.Wx~_ĝ/|^F'yFzs_;-4#FN U[@^8ko7H %j7_ -!x`R@L{shN8GJdrHL8R]mLUQ&C,OS謥BxFe&LNޙŎS`#s5ߥhŠa#[MZ9Z*O 2jS%ŏ#kv "8'|.tw(iVA󢓫3%6 (1cp7~_?|v^r; 1o'k /$(b Nh{rl;˙%Lon X=zY~_u0C u!!tqu|> Wߪo'0)dA}|};k?x|xo]} DXϖ\6Ͼb/ng/?VG2)Oޫ>|q8bV1'7A XZo+}ȝ,Dsi:K7DTpO0"Q(Q T aV͕&Cmh)zXl\fije۴a9CҴ>nӉlc>X$Z^|ooށNZ-Bx"{ѭj*5 Ǡ!c %jqp LdԤ+Dl&Wm誈pG;jN/Q+!%n H\iHy!qH5ѲgDٞ'8A^osLJ,x:*]"y;c/q(;ۥE1deЬQs$d/d;!4C G#~RT`m:jqP%vP* L)czp9M`i)I^  i,cθb?39ͼw7qnz њ碖L_oJIȾ%J\|U7[-/Ѳ%Ho)W4϶> NR.VK.-#ڱ? O;(\@"Z UcABZT%-9>w oՇ>!ASR\\ > U|<: i?en>:h`Z OMb@Jz R\bfӪx~vȈk7Hҝ2Ah 8y2{Ϛ.Ϻ|1v~r?0o<-Ko@uگ)BxLz\rmcgiK57-u?Ԇn=bR c [lFN-`1\}G[ bU%YFѺTMwლ $ {1$9k|N9ODvXC{j,GtϽ@{~U=o`o8k1 Hu4yܤ"o.[5,P$s 1=p8BlH&7uI9.Z*Ywy1Vv=hVlϫ,J^"relo=>AFa̢]" >Qۛm/"J|Nic.{Q+Z^&S&X'Fo \,ζ3X#(q޼WlDSdo\kD:{^юkMd|ACy5/7{:Y<&SEC7aBUr99/8b'#es-{Ƭ}\UKPt^tѧtj2 b;A'/xk68䄣q@bgYZ*5: V"\zx 匍VXm j؟?`5hNӀDz:/ s'v#ζ| 5+p: *U E X'a]d 6WU PbC.&6ڸNb %-]&ҠCRF#͘2IX[5ler*=vm zS=->ُq"-r^M\al>i5=Rdz\t.)/;o ๯D''3L ~Fd}~uS\Bč[@[أJLuf}Sw^zS”:)Ӝ[կ*4ں=pKuPB[IyG3h~vKdY"$?cJ&l#%mdFw_` E@_~V eTgQ8JShՃAY}m2aoneZ+0Eh@+-eՂqzۻ2҂' J&6+8+w˿UT A((~ {.1J`b6꣏)6`[΍? mDr[@nՄժ8Csk^9W!& B6j 8DcA4"#KBnDs҂1sΊ FiRVC>1[-Rul@?ÓO'\*' cF~b .sT ] p8ρ;o1J9ud?۰O=赖sD*rڎT~EQNIP Ӽٝ;p G+6(<0͠,$e Qnɿ\Q\~rȑY P|'0YhikbvϮg{:q ))6M^JC#UT!qq\ .^pDEE#iԪuJl'8q=c9{߽{ h9ZzkKenq1m`c, vAK~~t ,4\:j4[Rdbivr&tC͉X#g_Zqi6{)Uٝ`8og}*/[J~vCwRpE;o?Oqo|C\:/D[DQQ-VMݮS\B[WNnцdHoAք*U ԄMx[.tI3d! K~Kkn^t q.-hu.VЫ÷Y/^;@ytύ?21=KݩWVw*(cxNO(ާG>'F Zp;-@q'T`gu'1/uc|}A8**.:U:ZE^=$Polu_Z:6;ں{VoY4@U*Qq Aʬ(DSҥíޝ!¬'.m[u~" oӉ;o[Aoml ï^ld=f2:TJm5~f0G`8T +k7 2jV_硲zӕ`3 DZ G;)xzܫ⫟ ;_+[_<{=pwݢʼ(@Pz);/1oښnyWD(Nhr@$Z}o_ZB4O߷qCI?Qv6[5[ kĂu62|~P1fj@tKHuFi< VGBN\_/amטh[D7U|h`\s$T i-28c_|Z+.ܺj_}Ifa|9̉@~^6slmsde /Q3\ _<8vO_=yQu4\iۘpUnk茞_K,𗓨x`<2lu6cNo4][F#[{\E0@bңAg-k,-fW4W`rssJ" a[.TdKOUDP)̛dx2I"c0LEe/kT%Bp郿|/rzm9/s|WePaMD'*ޛ`w__§O#>++?o}Kx^OE{d2*U!Bvbr=N/6%Z#/Qt}BC|"~4韟*U# `&@x8K6v#Ee y >cQkliEwrBDNe>Ӧr P(˟F3ZhV?ZZ%Z aEVUX~I@l2Uu|_">}fLoɮU=~/ps]:\SY_ǻe"Z 56sq+dEKm@XEF\ਂ'p?_ć6%| oʧƧ!Qz\p{( 8J2_@:Fww-Bm0NI7D,&B(fax}_҉,KJ*NpXpk+~% 1\6%ImŠ6ܡSM^jEַO?3=S|{W^" Ͼw ZT}I){YM na4FYwm 9Ioe[(S-;ש]ߞ0Ἑ6Ucمy̸Ʉʼn AlIcnz2DNƉi`H hxE@8 QO' ~GW»z?zoH06G?n|;B 䉓Ͱ,,"+afO~ G]嫎CZʈvAѭyr%4㻍o]*iRhau IDATp!;ߤ?7@U K] p>#}\/zJN*Ƨ=Ήĥ3>bP[ϑlwMV4=W?~lm'jfrՆr?\D)yyO:>VMK<ր^񛰶0FWوF&Q&QmP 9 [Β>a3R I6}~:U|?cim,N o52J~unoqc 6 Jeje_{{r*mذP1 L*qL쫭B:pOU MSn`e. l4܆TY+HWkõn+`꩹tՊe. +RM>./~\bjEm>kXrmӽ4;2~:p#YJAHhUn.Ybux @ `hN57 ZKOgxu$ )2 "PF{٬(L> Am*pYzƍlŏ2"} h'u&R$L@FC=\c<8הx- n8fŴUp֗Oh{4JQy)&cV$2V[#,=bǟ=QtY:Mx}L.ԲE> ELZy!;5lLhfavƄYJQ,/<;]tft r^F(WD魎57AsKtA$Cș7J4>7#%gNlm!rfsH? Y6"qӡjbn=xځ)W?_??S3>ǧD!C_e> L0e]DЉ4B,O}g[UvqGRPF{ٶp~L ly2[.U} Qr_B Dcpi/$8ᒸpA{ݽC@{P )'ߺkDadOu[F)< ߟy;3HiTPd"`׏QWG4]޿E{ * 9Oz;gIJ<"lǛ:HO$UCcG&4~])A`^ʫ(9V U5U~g?].S Ul}lW?;-@X8``d;VD;YtF4&*D :st8%~֍?uHiަ 8oh-R[6?",tyf?>x@4LuTIkSf3a)v uh%,=o9Xo|n"}e|Z.7P_BX?imś_*=+K[7@[|DzSVuNjcvD8X[wz]̢*]bZQ Lp@ 2ڵYHُ.0!>=(@WТ6n9d~^rQ4T .ײn-r%VOfPobb-A21 wr&h -ԡM8sBTMZ!<)=jNcT mP\ U޵"dFlR1&>;f'bh(0>o~9}SrK/u}#X F3xYD[4k$>WJ1^2eA?)uDlI擏vSYF2:3#dDg{Ofh asLT1 -ӕ=}dLdLpkC66iaClqjw` i^4FDɦ#7m.S'FI?#}?*Jjk$% <^  =oNnIȜlѽURQk,VT\U5K2_1?Gq_.^GmxеuH zVoG/~þ O2'EqW: }~y:%8xk0fዚ*P,SRf7a) JYO6&yf#_j34 uH7 b Y*Vl͹ZHB7-E\):4~,>_MXDBNY)=pq7Ĕ\aN! ˯o9;/U2qh,z6!YM}ȇxu\2nJ]b֛OaVŽv)E26E_̇,#Kq ²(A⸷ߏmd@b)kO(Y*6Hxm[kSǷm}/ TD#35ԫ~$j?XK9~(T3F#?{^|qxI9<.U|ͯ~odӹ/.]!Af+mFJ،sdNh-xbJzړЋ9)srK>NoRq{"vBbR1y_mۭ-˟T^)R|ө6߷3 ~ ºnƻ|w9&27B9‰&'̴9\90ʙ&͢ڤ Al|*@Vqk}]{ *'}l>uu7U{f; >?Akwӻ̌ž.P&xPU\^-sVl,QaVr\p7rno{ppE*Ok$Y($U^Limtg?޿>-DH3g-L(p¿ʸfZuJ+%˚]Ys-Q#Ƴk8{~ 9z~k^߬" m4z0,Q[uuхIN _PFƟ|No[o;>*(XXdnf6-+;cZ$ʬzĸٲÒ74F@U2,PuPR/sɭO=K&즥p% | jlB$ ]&,rotZaK6p8ᮈ86S&3'v nE]o:͡}LxhJ[~|s>_{x_r% Rt1OapQYn~Qu!U{  15jPp ̠5IM.b*c[ɪlDfvL˼kBs7b@mYW} ÔGNZLy15W͢.] Uu.YqF֨Jr@^d!SuJ-$84S Sm6ĸ6n_[{>CI[Z i%-ycVnd[34 w.rn~jX/R:@2a1b+.6 =Xgy ^ 1t݁H鷆fqkg0itc6®Ck#c{B&PW~1BGL!X1F1O2gxN콍ZR^f>F<8wo]F6[=ZBxXE$nM 9-ۀFU >:g<Ò:]3k)\kj kqhP]#ܱm{9ՐXyg>\Jpxk]QȀ6oXǬEʤ6] f^"x1ùH&SX\:XEkNuJr+0]F9$)OO Yͅ4ݎX6f]I8F ;W)1;F)|H -$nҰknh 2JY}n]cd36uXV{*hnX}yjj*&#`68t(h Ĭd3]JnӐc褢"~@w!XbVtojǯ42 2ok'%*#զ "Y׫Jc/ 2z=yGfaKTtR][-`I^YMQӔ:eQ>s @\{|D,vT F:[o˫.j[#)v^i%N%9^p:'I,M<`V橺\[BlZy跠g*5 AZSL!ke_(/P?Ա8ʳ$6%rO>x pμ3y5rာۘXX3${YU#X\2,\﫪az͍to[1z5 &kHXcy͗hVWsiDo{7+ !!d$"BbycCC~ %lx` eldHIP칥s fYCuЪK NY(m݈cЙSIۄL>D4@ȋK4JwsDw쨁~ D!i(&(Cz<8iYJZӽXg<p]f OɄU *f(mlk/ơB'={;r :ś{+ u# r_Ƥ6u>qV?}ۄ^d-3<Ԇ_9 ԺN2x l6AZZDqAcn5ɳHmec#Wh>+,Eb}>)M#40\=[ږf&,cu֩Wc0F$(j=-2B=VI_Je@")H@\>[ io'эJ7R>dbbD+&[\ r2'Y %~PXv 0/"xym/}pf~#˶KN󤅤I&'R8kz7%NÝ ДϪX,IG?R_ ?O0'&7|U@XPX?Bw6;,ҀyO:$mBh,Y,HiQ]6dQ2:Jˈr訿)eg.s< ;?4SU\Uo !#pT0+1JԱp=lu #ϣ<^YکHisY>K~d&dKο/NhbmD)VyBU#|=7KaAY+2̼Wv1%_8T `pk6 F\s2eUm27džu*pK'CHټ=Q |R%{ B_8D/F8?SrBS3 ^ߊUܑuWui w2)q-}dz9]xB/Sz\)PIEVBo۽^9hۣkcMmTFkDZ[9W]Cߌ=YU3B==IaE:&@UR;$`5R~`HxZPp%N3~/ vM;FD-*OX"J,j*xvt(QJ$i },և D,rF5û2 LbXV[RBXoD%`)N3cV~2G< @K>34 @R{] S-]o4L迦AfW캸v3ْNJj؟geEۺ}70Fi|.>8irJ`<|1㦖N.e@la>zȐ= 8@d K Wcp55k mȂ}$>r^"Xr.  %Y!4T"p,z?9N %Hzیٸ]95jʸiC +9' 1#pa2Mgݏ->6I32_"x !ҩ0In&nf2JuC' H~>[ZmCI]#3&v`">dgLyhXn*C  ۔%Ql9DJ#F5/yDm ug t*=+DsaCc;Y5F7Ԙ gPm8nSQ z VRKc,pC =f@XZIDAT{V9-P+QӈiS%pFSON/k3:K(=01^}bl~׵dX=I ~sڠڌn6e*6tW ki "CVjmUn}ܵVC5n*K?"n{Y=vZ hS՞-1.0bMpW݂D}sˌcrus&y1+gz$tpl_E$NI2~N @Σ9 b`ڰ7W d9[Wk yWaКDo~J6DQN`1-֮Pd.E8$cF 6iNFiV~uoVtOtjt>אE H0m0.)do]T]|m x<Zá*|4Q48ඛLpYOl4yo2@o#vXѵu,f۵S "σjpJ:hhEz3*H e{kO‘t>KCbY6lFl}Nmhŏp{WLRv, 皢= ҳY |iHt]i!Ȍi\sa&)#8,,*}%Ilȑ"Ay: ݃*ut;F2*QW&}8:{۸@I@iDaTv8Uޒ)hܺݵY6!#Գ!)YjM2P(LT⪭%!u2xK+3NχVO*zy/l(d'6($X\KvrRZؘ m"f@if9E{o(V/Ri'zGLyVcGaYѫ6E0rMX'ܸȉF>$^XyÝBi !|FUW!hXB%uޛΒwe]} ق[%s"㢖d!#`¼RїeY`e#,'-[qX/0NL@qS46hSdQedĺhtY'6 yn45ږ:Nru|΁hO?U9q ~y/P*K;%yzQ "J"F76̷24چGaMJeVY%"#p/ܖDK*l&}%}4,P-%P-"ȔfN܊`Ҵ̶rs/ATGf*+Tm#?@fr(9!$|$.q 'G>rs@*G&)~0&meZ> N\Hj[_NYڱw &f[Pz1%f7 bѪX|Ub'ɾ`BMqWx-M6 fRJ߹n)ncGnٜ1Ch7*%ȾcNe& ™} }A") Nf{AzI bLWBx(Eb}" t/uYAHfD_Ņ&]=$cI0A7>8Ɍ| er[ҌmGk K@xX"5KĚ3g[ha)@&鰶)s@mSgwY{ O߂1LEȞJAz2 i|V1;[򟈌eHWSss6xٹ;#7|cxV9lږY;YlQ0Y6Qb^ afcqI 9``y;*\[xPp2f[n K&646iMʀVo?@*Tv7:5u%"Qr q4|epyjvZЬݧwapVnC:%IT!nii$zKW  Di .ocA,@4dpÔց\w_;]&+̃Iʉhl@/@*J|2Ps>9g7|Da8δ" bġ~(lvlA. @%g^iEF ZLe6n K\N߈GFո YkI02mKI6 qDccg(&pH1 `4 {<=\*]K<,Co8 T37` mp-="d#4t҅(0NX9km0(n`0e H8uk paI 5GB5 }|{v[,XB%7K@7J(H"Ŀ^7Ȓ/@w\ 1<]$N'!\fHlH^fWq,Tl@rЍ>43KN>1KM% ?#}Xz@ߪWZITlO,Y)"#L`Fx|46l2bI?3*Vv; Dk pYv)b&: yDBbcCdgt$[p',BjkB]&rh3 *2=jIث5ܬѻK6+Z5dHZp]&1R Ұ۰Ϊs~Zт]zL ñ0_EJSEZPHFDXPpSH"h3j 2g#H>}e0=5Wk\.v%!ƭHGq9D]k\SڋHrr[Nu"/RvM^lU%ronoi~, ys Y(e Eh4A n4 !tzUy@s [Bn QW"8,F$u`q3m`#̦8Oc-:GoHZQY W5egE#mn6!aŽ2q c+±lR$ARJOUr̹  ~ژ@y-ϾJ'Fsٿ7(9 0PϾUNxT`ՓRaxClևGeq^Ԛ2pڍLqg[ fe¤@DZ$lDH,B.ɻbq_6UBYHŘ=.%}Iz˟c%k#; gv"_ϠVݒLR5tH Ynj3+P؈|H].Ӗ!I8E[r:@!%:*2{>Z0Y"u(-돊=$*V7EW-(4+FE?sKXAJ5n;2;ĖFhEe ]IhhG`Pl+;-7!S{cP[$djhK4hJ[[lIck>/ K.1>QcsBZ`GK.CKݎlZppH"nB1Sow3b,(&6KpzѽcgG*Rf2IزT#XKDw°dc%s hĩdW. Ӵ@H6$.[;(@1@Ɲ]ƧE@1Io#T!r'LBʜ1p^f2u!]׵pȄ X3ܬn3t;"8RM6&[1iqk-(֩@6, yfϣvj-GXmD^UVpG`3 D|s=Л _*$Vfȳ;B*'H(ISm\kƃee빰kmrr9mJA,l8FEآpQȀe4*o d6&-h p}W{ӣmUcbQ7A: 'a~|c+|H0]wQc[hWw0^N>Z 耍<>xXԓ&ƞ9 6tcPؽm}G}ydlfoY[̢#@eKcEc F>3l;L?5*AoY`M&08aD%tܶ8q6NFqʋ1hFcjZ7Д$L'GBY]t x`cr{G4 Ym@ Dq|Fxn[܀ޓ?jnU *.ǏdMfZɐ7DFp6A5Pɪ[-YIHpS2(?܋YT*n5ө/99qdy5\9oYk%ιrNzRr[ǿ5]Դݘsc2^P`A]m)  H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  tIME 0Ca_ .IDATx_uק\cR&wUR %IҘyNVI5'A JLðY?33+gffP̬ʟ?@33(ffV?3(ffVY?33+gffP̬ʟ?@33Y?33+gffP̬ʟ?@33(ffV̬`P+gXkUuzlU=Z{֎UտZk/zckmqU]Z.iQUZk着v֔?f'y8ɯdkU]e6&9xNϮ$;ǵlL!ƴyrU}3U>\s.<7eǝ]!$&9<}i&Wʟb|q}`y3cxM=$#I㿼/GjCg=#Ib".L$LϳInG$Ğ$3x5&ٞd)yXyϹ$/ۃ?'0~{&?S@$=7頻&y1 %1S.J; IT{75Ivۃ?eJ,;j(>_nvXpoL];$a~FWZʟ?Nrη$Xc>eay(ufs?d&*{L'X\$W3gUIIP|60~޼=f+fIrf$ PjΪkVx5K2!S4˒OP<$9d$[;:3tŮ (>v;tۓq*>ddKoʟO#Uz[U=bV85 :^3@+ޝd{.DZ23 ] 8pשׁvTN;{KfP܇_Oy<A\Iq玼/$y=oMZdV8W2ɇ0<:3@uU#;LTUف?bI6ʟj;jX|$ͰLr|֪e󮪺Pe#8/\ѓWWʟҫWIǼ$`i]qڌZb (&/$=ι'U1I9aS&>~@{mUq{f'YkVEv$=QSLąId)y~8?wU?OrWDVwPܣOXUmO4z,`叡$fxW]I!zkVսI.OroU5Vǟ?0bWFOs b(${ฌ/s_6jou/+`r4ϒ<3?$7$hq@33(ffVY?33+gffP̬ʟ?(ffVY?33+gffP̬ʟ?@33(ffP̬ʟ?@33(ffVY?33+gffߙY?33wX΃0,"K,IENDB`./tests/resources/ubuntushape/img3.png0000644000015600001650000000116612700370701020162 0ustar jenkinsjenkinsPNG  IHDRAVbKGD pHYs  tIME ))K}KIDATx1ð DBV2ZLLLLLLLLLLLLLLLLLLLLLLLLL0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0ALLLLLLLLLLLLLLLLLLLLLLLLL0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A8Y hIENDB`./tests/resources/ubuntushape/img2.png0000644000015600001650000000103112700370701020150 0ustar jenkinsjenkinsPNG  IHDRܵbKGD pHYs  tIME *)`PUIDATxA İV²dGK)0S` L)0S` 0S` L)0S` LS` L)0S` L)S` L)0S` L)0S` L)0S` L)0S` L)0S` L)0L)0S` L)0S)0S` L)0S` 0S` L)0S` LS` L)0S` L)S` L)0S` L)0S` L)0S` L)0` L)0S` L)0L)0S` L)0S)0S` L)0S` 0S` L)0#ܖIENDB`./tests/resources/ubuntushape/UbuntuShapeTest.qml0000644000015600001650000003067112700370701022436 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Item { id: root width: 1000 height: 600 focus: true // Enum to string tables. property variant aspectTable: [ "Flat", "Inset", "DropShadow" ] property variant backgroundModeTable: [ "SolidColor", "VerticalGradient" ] property variant sourceHAlignmentTable: [ "AlignLeft", "AlignHCenter", "AlignRight" ] property variant sourceVAlignmentTable: [ "AlignTop", "AlignVCenter", "AlignBottom" ] property variant sourceFillModeTable: [ "Stretch", "PreserveAspectFit", "PreserveAspectCrop", "Pad" ] property variant wrapModeTable: [ "Transparent", "Repeat" ] property variant imageFillModeTable: [ "Stretch", "PreserveAspectFit", "PreserveAspectCrop", "Tile", "TileVertically", "TileHorizontally", "Pad" ] // Zoom properties. property variant translation: Qt.point(0.0, 0.0) property real scaleBase: 1.1 property real scaleExponent: 0.0 property real minScaleExponent: 0.0 property real maxScaleExponent: 48.317715856 // Logarithm of 100 to base 1.1 (scaleBase). property real scaleFactor: 1.0 property real scale: 1.0 // Overlay text properties. French keymapping... :) property string textOverlayString: "Zoom (scroll): x " + root.scaleFactor.toFixed(1) + "\n\n" + "Background colors (a/z): " + shape.backgroundColor + ", " + shape.secondaryBackgroundColor + "\n" + "Background mode (e): " + root.backgroundModeTable[shape.backgroundMode] + "\n\n" + "Radius (r): " + "\"" + shape.radius + "\"\n" + "Aspect (t): " + root.aspectTable[shape.aspect] + "\n" + "relativeRadius (y): " + shape.relativeRadius.toFixed(2) + "\n\n" + "Source (o): " + shape.source + "\n" + "Source opacity (p): " + shape.sourceOpacity.toFixed(2) + "\n" + "Source fill (q): " + root.sourceFillModeTable[shape.sourceFillMode] + "\n" + "Source hwrap (s): " + root.wrapModeTable[shape.sourceHorizontalWrapMode] + "\n" + "Source vwrap (d): " + root.wrapModeTable[shape.sourceVerticalWrapMode] + "\n" + "Source halign (f): " + root.sourceHAlignmentTable[shape.sourceHorizontalAlignment] + "\n" + "Source valign (g): " + root.sourceVAlignmentTable[shape.sourceVerticalAlignment] + "\n" + "Source translation (h/j): " + shape.sourceTranslation.x.toFixed(2) + ", " + shape.sourceTranslation.y.toFixed(2) + "\n" + "Source scale (k/l): " + shape.sourceScale.x.toFixed(2) + ", " + shape.sourceScale.y.toFixed(2) + "\n\n" + "Image (deprecated) (m): " + shape.image + "\n" + "Image fill (w): " + root.imageFillModeTable[img1.fillMode] + "\n" + "Image halign (x): " + img1.horizontalAlignment + "\n" + "Image valign (c): " + img1.verticalAlignment + "\n\n" + "Border (deprecated) (b): " + "\"" + shape.borderSource + "\"\n\n" + "Colors (deprecated) (n/,): " + shape.color + ", " + shape.gradientColor // Main scene. Item { id: scene anchors.fill: parent Image { id: background anchors.fill: parent source: "background.jpg" fillMode: Image.Tile } // Put the UbuntuShape source image in the middle of a texture atlas. We use img1. Image { id: img1; visible: false; source: "img1.png"; } Image { id: img2; visible: false; source: "img2.png"; } Image { id: img3; visible: false; source: "img3.png"; } Image { id: img4; visible: false; source: "img4.png"; } UbuntuShape { id: shape anchors.fill: parent anchors.leftMargin: 400 anchors.rightMargin: 100 anchors.topMargin: 100 anchors.bottomMargin: 100 } } // Zoom support. ShaderEffectSource { id: shaderEffectSource anchors.fill: scene sourceItem: scene hideSource: true visible: false smooth: false } ShaderEffect { anchors.fill: scene property variant tex: shaderEffectSource property variant translation: root.translation property real scaleFactor: root.scale vertexShader: " uniform mat4 qt_Matrix; uniform float scaleFactor; uniform vec2 translation; attribute vec4 qt_Vertex; attribute vec2 qt_MultiTexCoord0; varying vec2 texCoord; void main() { texCoord = vec2(scaleFactor) * qt_MultiTexCoord0 + translation; gl_Position = qt_Matrix * qt_Vertex; }" fragmentShader: " uniform sampler2D tex; uniform float qt_Opacity; varying vec2 texCoord; void main() { gl_FragColor = texture2D(tex, texCoord) * qt_Opacity; }" } // Text overlay. Text { id: textOverlay width:200 anchors.top: parent.top anchors.topMargin: 10 anchors.left: parent.left anchors.leftMargin: 10 font.family: "Ubuntu Mono" font.pixelSize: 14 font.weight: Font.Bold color: "black" text: textOverlayString } // Mouse handling. MouseArea { id: mouseArea anchors.fill: parent acceptedButtons: Qt.LeftButton hoverEnabled: true property real lastX: 0.0 property real lastY: 0.0 onPressed: { if (pressedButtons & Qt.LeftButton) { lastX = mouseX; lastY = mouseY; } } onPositionChanged: { if (pressedButtons & Qt.LeftButton) { var tx = root.translation.x; var ty = root.translation.y; var sx = root.scale / root.width; var sy = root.scale / root.height; var x = mouseX - lastX; var y = mouseY - lastY; root.translation = Qt.point(Math.max(0.0, Math.min(1.0 - root.scale, tx - sx * x)), Math.max(0.0, Math.min(1.0 - root.scale, ty - sy * y))); lastX = mouseX; lastY = mouseY; } } onWheel: { root.scaleExponent = Math.max(minScaleExponent, Math.min(maxScaleExponent, root.scaleExponent + (wheel.angleDelta.y < 0.0 ? -1.0 : 1.0))); root.scaleFactor = Math.pow(root.scaleBase, root.scaleExponent); var oldScale = root.scale; root.scale = 1.0 / root.scaleFactor; var s = oldScale - root.scale; var tx = root.translation.x; var ty = root.translation.y; var x = mouseX / root.width; var y = mouseY / root.height; root.translation = Qt.point(Math.max(0.0, Math.min(1.0 - root.scale, tx + s * x)), Math.max(0.0, Math.min(1.0 - root.scale, ty + s * y))); } } // Keyboard handling. Keys.onPressed: { var shift = Qt.ShiftModifier; // Background. if (event.key == Qt.Key_A) { shape.backgroundColor = Qt.rgba( Math.random(), Math.random(), Math.random(), Math.random()); } else if (event.key == Qt.Key_Z) { shape.secondaryBackgroundColor = Qt.rgba( Math.random(), Math.random(), Math.random(), Math.random()); } else if (event.key == Qt.Key_E) { shape.backgroundMode = (shape.backgroundMode + 1) % 3; // Styling. } else if (event.key == Qt.Key_R) { shape.radius = (shape.radius == "large") ? "small" : ((shape.radius == "small") ? "medium" : "large"); } else if (event.key == Qt.Key_T) { shape.aspect = (shape.aspect + 1) % 3; } else if (event.key == Qt.Key_Y) { shape.relativeRadius = Math.max(0.0, Math.min( 1.0, shape.relativeRadius + ((event.modifiers & shift) ? 0.01 : -0.01))); // Source. } else if (event.key == Qt.Key_O) { if (shape.source == null) { shape.source = img1; } else { shape.source = null; } } else if (event.key == Qt.Key_P) { shape.sourceOpacity = Math.max(0.0, Math.min( 1.0, shape.sourceOpacity + ((event.modifiers & shift) ? 0.01 : -0.01))); } else if (event.key == Qt.Key_Q) { shape.sourceFillMode = (shape.sourceFillMode + 1) % 4; } else if (event.key == Qt.Key_S) { shape.sourceHorizontalWrapMode = (shape.sourceHorizontalWrapMode + 1) % 3; } else if (event.key == Qt.Key_D) { shape.sourceVerticalWrapMode = (shape.sourceVerticalWrapMode + 1) % 3; } else if (event.key == Qt.Key_F) { shape.sourceHorizontalAlignment = (shape.sourceHorizontalAlignment + 1) % 3; } else if (event.key == Qt.Key_G) { shape.sourceVerticalAlignment = (shape.sourceVerticalAlignment + 1) % 3; } else if (event.key == Qt.Key_H) { shape.sourceTranslation = Qt.vector2d( shape.sourceTranslation.x + ((event.modifiers & shift) ? 0.01 : -0.01), shape.sourceTranslation.y); } else if (event.key == Qt.Key_J) { shape.sourceTranslation = Qt.vector2d( shape.sourceTranslation.x, shape.sourceTranslation.y + ((event.modifiers & shift) ? 0.01 : -0.01)); } else if (event.key == Qt.Key_K) { shape.sourceScale = Qt.vector2d( shape.sourceScale.x + ((event.modifiers & shift) ? 0.02 : -0.02), shape.sourceScale.y); } else if (event.key == Qt.Key_L) { shape.sourceScale = Qt.vector2d( shape.sourceScale.x, shape.sourceScale.y + ((event.modifiers & shift) ? 0.02 : -0.02)); // Deprecated image. } else if (event.key == Qt.Key_M) { if (shape.image == null) { shape.image = img1; } else { shape.image = null; } } else if (event.key == Qt.Key_W) { img1.fillMode = (img1.fillMode + 1) % 7; } else if (event.key == Qt.Key_X) { if (img1.horizontalAlignment == Image.AlignLeft) { img1.horizontalAlignment = Image.AlignHCenter; } else if (img1.horizontalAlignment == Image.AlignHCenter) { img1.horizontalAlignment = Image.AlignRight; } else { img1.horizontalAlignment = Image.AlignLeft; } } else if (event.key == Qt.Key_C) { if (img1.verticalAlignment == Image.AlignTop) { img1.verticalAlignment = Image.AlignVCenter; } else if (img1.verticalAlignment == Image.AlignVCenter) { img1.verticalAlignment = Image.AlignBottom; } else { img1.verticalAlignment = Image.AlignTop; } // Deprecated styling. } else if (event.key == Qt.Key_B) { if (shape.borderSource == "radius_idle.sci") { shape.borderSource = "radius_pressed.sci"; } else if (shape.borderSource == "radius_pressed.sci") { shape.borderSource = ""; } else { shape.borderSource = "radius_idle.sci"; } } else if (event.key == Qt.Key_N) { shape.color = Qt.rgba( Math.random(), Math.random(), Math.random(), Math.random()); } else if (event.key == Qt.Key_Comma) { shape.gradientColor = Qt.rgba( Math.random(), Math.random(), Math.random(), Math.random()); } } } ./tests/resources/ubuntushape/FrameTest.qml0000644000015600001650000000420312700370701021215 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Private 1.3 Item { id: root width: 600 height: 600 focus: true property string textOverlayString: "thickness (t/T): " + frame.thickness.toFixed(1) + "\n" + "radius (r/R): " + frame.radius.toFixed(1) + "\n" + "color (c): " + frame.color + "\n" + "opacity (o/O): " + frame.opacity.toFixed(2) + "\n" Item { id: scene anchors.fill: parent Frame { id: frame anchors.fill: parent anchors.margins: 100.0 color: "blue" } } Text { id: textOverlay width: 200 anchors.top: parent.top anchors.topMargin: 10 anchors.left: parent.left anchors.leftMargin: 10 font.family: "Ubuntu Mono" font.pixelSize: 14 font.weight: Font.Bold color: "black" text: textOverlayString } Keys.onPressed: { var shift = event.modifiers & Qt.ShiftModifier; if (event.key == Qt.Key_T) { frame.thickness = frame.thickness + (shift ? 1.0 : -1.0); } else if (event.key == Qt.Key_R) { frame.radius = frame.radius + (shift ? 1.0 : -1.0); } else if (event.key == Qt.Key_C) { frame.color = Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0); } else if (event.key == Qt.Key_O) { frame.opacity = frame.opacity + (shift ? 0.02 : -0.02); } } } ./tests/resources/ubuntushape/img4.png0000644000015600001650000000073512700370701020164 0ustar jenkinsjenkinsPNG  IHDR,Ow2bKGD pHYs  tIME ')7jIDATxAðCw>:MV 0,0, 0, 0,0, 0, 0, 0,0, 0, 0,0, 0, 0, 0,0, 0, 0,0, 0, 0, 0,0, 0, 0,0, 0, 0, 0,0, 0, 0,0, JiSIENDB`./tests/qmlapicheck.sh0000755000015600001650000000330612700370701015056 0ustar jenkinsjenkins#!/usr/bin/env sh # # Copyright 2013 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # ################################################################################ . `dirname $0`/../build_paths.inc if [ ! -e $BUILD_DIR/qml/Ubuntu/Layouts/libUbuntuLayouts.so ]; then echo You need to build UITK before you can dump QML API! exit 1 fi CPP="Ubuntu.Components Ubuntu.Components.ListItems Ubuntu.Components.Popups Ubuntu.Components.Pickers Ubuntu.Components.Styles Ubuntu.Components.Themes Ubuntu.Layouts Ubuntu.PerformanceMetrics Ubuntu.Test" echo Dumping QML API of C++ components test -s $BUILD_DIR/components.api.new && rm $BUILD_DIR/components.api.new env ALARM_BACKEND=memory QML2_IMPORT_PATH=$BUILD_DIR/qml LD_LIBRARY_PATH=$BUILD_DIR/lib \ $BUILD_DIR/apicheck/apicheck \ --qml $CPP 1>> $BUILD_DIR/components.api.new && echo Verifying the diff between existing and generated API if [ $? -gt 0 ]; then echo Error: apicheck failed else diff -F '[.0-9]' -u $SRC_DIR/components.api $BUILD_DIR/components.api.new && \ echo API is all fine. && exit 0 echo Differences in API. Did you forget to update components.api? exit 1 fi ./CHANGES0000644000015600001650000003514312700370701012073 0ustar jenkinsjenkinsSDK Release Notes ################# .. contents:: List of Releases :depth: 1 Ubuntu.Components 1.1 ##################### API Changes *********** Compatibility Breaks ******************** Ubuntu.Components 1.0 ##################### API Changes *********** * CHANGED IN: ThinDivider: base class Image TO Rectangle * ADDED IN: all modules exported as 0.1 as well as 1.0 version * ADDED IN: PickerDelegate: readonly property Picker picker * CHANGED IN: OptionSelector: readonly property bool currentlyExpanded TO property bool currentlyExpanded * CHANGED IN: ItemSelector: readonly property bool currentlyExpanded TO property bool currentlyExpanded * ADDED IN: Action: property string iconName * ADDED IN: ActionItem: property string iconName * ADDED IN: OptionSelectorDelegate: property string iconName * ADDED IN: OptionSelectorDelegate: property url iconSource * DEPRECATED IN: OptionSelectorDelegate: property url icon * ADDED IN: ListItems.Base: property string fallbackIconName * ADDED IN: ListItems.Base: property string iconName * ADDED IN: ListItems.Base: property url iconSource * DEPRECATED IN: ListItems.Base: property variant icon * ADDED IN: ListItems.Standard: property string fallbackIconName * ADDED IN: ListItems.Standard: property string iconName * ADDED IN: ListItems.Standard: property url iconSource * DEPRECATED IN: ListItems.Standard: property variant icon * ADDED IN: TabBar: property int selectedIndex * DEPRECATED IN TabBar: property Item tabsItem * ADDED IN: OptionSelector: readonly property bool currentlyExpanded * ADDED IN: ItemSelector: readonly property bool currentlyExpanded * ADDED IN: Tab: readonly property int index * ADDED IN: ListItem.Empty: property bool confirmRemoval * ADDED IN: OptionSelector: property bool multiSelection * ADDED IN: ItemSelector: property bool multiSelection * ADDED IN: OptionSelector: readonly property real itemHeight * ADDED IN: ItemSelector: readonly property real itemHeight * ADDED IN: OptionSelector: signal expansionCompleted() * ADDED IN: ItemSelector: signal expansionCompleted() * ADDED IN: OptionSelectorDelegate: property bool constrainImage * ADDED IN: Empty: property alias divider * ADDED IN: ListItems/OptionSelector: signal delegateSelected() * REMOVED IN: OptionSelector: signal scroll() * ADDED IN: OptionSelector: signal delegateSelected() * ADDED: ListItem OptionSelector to Components/ListItems * ADDED: ListItemOptionSelectorStyle to Components/Ambiance/ListItems * ADDED: ListItemOptionSelectorStyle to Components/SuruDark/ListItems * ADDED: ListItemOptionSelectorStyle to Components/SuruGradient/ListItems * REMOVED IN ALL: attached property ItemStyle * ADDED IN OrientationHelper: property alias rotating * ADDED IN OrientationHelper: property alias __orientationHelper * ADDED IN OrientationHelper: property bool transitionEnabled * DEPRECATED IN QuickUtils: property Item rootObject * CHANGED IN OrientationHelper: property int __orientationHelper TO property int orientationHelper * CHANGED IN Toolbar: property bool active TO property bool opened * CHANGED IN Toolbar: property bool lock TO property bool locked * CHANGED IN ToolbarActions: property bool active TO property bool opened * CHANGED IN ToolbarActions: property bool lock TO property bool locked * REMOVED IN Toolbar: property bool active * REMOVED IN Toolbar: property bool lock * REMOVED IN ToolbarActions: property bool active * REMOVED IN ToolbarActions: property bool lock * CHANGED IN Page: property Header header TO property Header __propagated.header * CHANGED IN Page: property Toolbar toolbar TO property Toolbar __propagated.toolbar * CHANGED IN MainView: property Header header TO property Header __propagated.header * CHANGED IN MainView: property Toolbar toolbar TO property Toolbar __propagated.toolbar * DEPRECATED IN Page: property Header header * DEPRECATED IN Page: property Toolbar toolbar * DEPRECATED IN MainView: property Header header * DEPRECATED IN Page: property Toolbar toolbar * REMOVED in MainView: property QtObject __hud * CHANGED in ToolbarActions: INHERIT Item INSTEAD OF ActionList * CHANGED in Page: property ToolbarActions tools TO property Item tools * CHANGED IN Toolbar: property ToolbarActions tools TO property Item tools * DEPRECATED IN Action: property bool visible * DEPRECATED IN Action: property Item itemHint * REMOVED ToolbarActions (use ToolbarItems instead) * ADDED IN MainView: property bool anchorToKeyboard * CHANGED IN Tabs: property Component __headerContents TO property TabBar tabBar * CHANGED IN Header: property Component contents TO property Item contents * ADDED IN Panel: function open() * ADDED IN Panel: function close() * ADDED IN Panel: property int hideTimeout * DEPRECATED IN Panel: writable property opened. Will be made read-only. * ADDED IN: Empty: property bool waitingConfirmationForRemoval * ADDED IN: Empty: function cancelItemRemoval() * CHANGED in CrossFadeImage: readonly property size sourceSize TO property size sourceSize * DEPRECATED in Header: property Item contents * DEPRECATED IN Tabs: property TabBar tabBar Compatibility Breaks ******************** * CHANGED IN Tabs: Automatically show the header when the title of the active tab changes * CHANGED IN Page/MainView: Only enable auto-hide behavior of header when the Page's flickable can be flicked vertically, so that manual setting of anchors is no longer needed for flickables that only flick horizontally * CHANGED IN Page: Automatic detection of flickable inside a Page to control the header is now limited to Flickables that are anchored to the top of the Page or fill the Page. Header automatically shows when flickable.contentHeight becomes <= flickable.height. * CHANGED IN Action, ActionItem, OptionSelectorDelegate: Setting iconName now always selects the requested icon from ubuntu-mobile theme, not the system icon theme. * CHANGED IN TabBar: The model now needs to have a selectedIndex property. * CHANGED IN Panel: The panel no longer closes automatically when the user presses outside of the opened panel. That was deprecated behavior that was useful in the first version of the Toolbar. Set __closeOnContentsClicks to restore the old behavior, but a better solution is to deal with the press in the app and call Panel.close() when needed. SDK 0.1.46 ########## API Changes *********** * None Compatibility Breaks ******************** * None SDK 0.1.45 ########## API Changes *********** * None Compatibility Breaks ******************** * None SDK 0.1.44 ########## API Changes *********** * CHANGED IN AbstractButton: signal clicked(mouse) TO signal clicked() * CHANGED IN AbstractButton: signal pressAndHold(mouse) TO signal pressAndHold() Compatibility Breaks ******************** * CHANGED IN Tabs: Swiping to switch tabs disabled by default SDK 0.1.43 ########## (Automatic builds) SDK 0.1.42 ########## Compatibility Breaks ******************** * None API Changes *********** * Style QML type as base type for all custom style objects * provides automatic property styling of styled item and its assotiated delegate * Deprecated APIs - ComponentUtils module is deprecated (affects componentUtils.js: hasStyle(), style(), delegateProperty() functions) - StyleUtils module is deprecated (affects styleUtils.js: itemStyleProperty(), animateOrSetValue(), animate() functions) - 'itemStyle' context property is no longer exposed to delegates - use of style type, second parameter of @qml-mapping is deprecated - Deprecated theme specific styles and delegates: ButtonStyle, CheckBoxStyle, NewTabsStyle, SwitchStyle, TabButtonStyle, TextAreaStyle, TextFieldStyle, TextFieldDelegate, UbuntuShapeStyle. These components were deprecated and their properties are now in the respective delegates. SDK 0.1.41 ########## Compatibility Breaks ******************** * None API Changes *********** * None SDK 0.1.40 ########## Compatibility Breaks ******************** * Header is now hidden when it has no title or contents API Changes *********** * None SDK 0.1.39 ########## Compatibility Breaks ******************** * None API Changes *********** * ListItem.Empty: + backgroundIndicator: Defines the item background item to be showed during the item swiping + removable: Defines if the item can be removed or not + swipingState: The current swiping state ("SwipingLeft", "SwipingRight", "") + itemRemoved: This handler is called when the item is removed from the list SDK 0.1.38 ########## Compatibility Breaks ******************** * None API Changes *********** * None SDK 0.1.37 ########## Compatibility Breaks ******************** * Page, PageStack and Tabs automatically determine their anchors and height inside a MainView, so there is no need to set them explicitly. * It is now recommended to always use Pages inside Tabs or PageStack. Non-Page items can still be used, but their margins will not automatically be set-up to align with the header of the MainView. API Changes *********** * Property tools was deprecated for MainView, Tabs and PageStack. Pages now automatically update MainView.toolbar.tools when they become active. * Property page of Tab can no longer be a URL, but must be an Item (Page recommended). Use a Loader if you were using a URL first. SDK 0.1.36 ########## Bugs Fixed ********** * HUD integration to the MainView Compatibility Breaks ******************** * None API Changes ********** * None SDK 0.1.35 ########## Bugs Fixed ********** Theming-related: * [POPOVER] is themed in correctly * [TOOLKIT] Activity indicator is themed incorrectly * [TOOLKIT] dialogue is themed incorrectly Toolbar-related: * [sdk-toolbar] share button in on gallery image does not function on the first button press * Sharing after post/cancel is not possible * [sdk-toolbar] after tap to dismiss toolbar doesn't work * [sdk] toolbar trigger area too big * when first showing the toolbar after opening a photo, it shows the toolbar buttons for the overview, not for the current photo Other: * [HUD, OSK] OSK doesn't focus on input field * Popover sometimes not dismissed Compatibility Breaks ******************** * SDK now depends on libqt5graphicaleffects5 for dropshadow of Popovers. API Changes *********** * None SDK 0.1.34 ########## Compatibility Breaks ******************** * None API Changes *********** * None SDK 0.1.33 ########## Compatibility Breaks ******************** * None API Changes *********** * TextArea and TextField + popover: overrides the default popover of the text area * Slider + touched(bool onThumb): The signal is emitted when there is a click on the slider. The onThumb parameter provides information if the click, was inside of the thumb element SDK 0.1.32 ########## Compatibility Breaks ******************** * None API Changes *********** * Popover + autoClose: property to drive automatic closing of Popovers when tapped on the dismissArea *SheetBase, Dialog + modal: property to drive modal state of the sheets and dialogs SDK 0.1.31 ########## Compatibility Breaks ******************** * None API Changes *********** * Popover, Dialog + edgeMargins: specifies the margins from the dismissArea when positioning the foreground + callerMargin: specifies the margin from the caller when positioning the pointer SDK 0.1.30 ########## Compatibility Breaks ******************** * None API Changes *********** * TextField, TextArea + highlighted: enables to control highlighted state separately from focused SDK 0.1.29 ########## Compatibility Breaks ******************** * Property tools of Page and Toolbar must now be of type ToolbarActions (was: ActionList). API Changes *********** * Popover, Dialog + pointerAnchorItem: caller or a child/sibling of it where the pointer should be aligned to SDK 0.1.28 ########## Compatibility Breaks ******************** * TextArea - autoExpand: marked as deprecated. Use autoSize instead API Changes *********** * Popover + dismissArea: area where mouse events cause Popover dismissal + grabDismissAreaEvents: specifies whether to grab events from dismiss area + contentWidth, contentHeight: overrides the calculated width/height of the Popover's operative area * TextField, TextArea + paste(data): parameter added to paste custom data other than Clipboard content. * TextArea + autoSize: specifies to resize the area based on lineCount property SDK 0.1.27 ########## Compatibility Breaks ******************** * None API Changes *********** * None SDK 0.1.26 ########## Compatibility Breaks ******************** * None API Changes *********** * ThemeEngine - contains only public API, no C++ specific API * Role element removed SDK 0.1.25 ########## Compatibility Breaks ******************** * None API Changes *********** * Removed UbuntuShape::borderSource and UbuntuShape::maskSource. That API in this form reveals to be too difficult to maintain while keeping an efficient implementation. In the future, we plan to expose these features through styling properties. SDK 0.1.22 ########## Compatibility Breaks ******************** * None API Changes *********** * None SDK 0.1.21 ########## Compatibility Breaks ******************** * None API Changes *********** * None SDK 0.1.20 ########## Compatibility Breaks ******************** * None API Changes *********** * None SDK 0.1.16 ########## Compatibility Breaks ******************** * None API Changes *********** * ScrollbarStyle property changes - fadeAnimation property + interactive + overlay + overlayOpacityWhenHidden + overlayOpacityWhenShown + scrollbarFadeInAnimation + scrollbarFadeOutPause + scrollbarFadeOutAnimation SDK 0.1.15 ########## Compatibility Breaks ******************** * None API Changes *********** * TextCustom renamed to Label, TextCustom remains for backwards compatibility SDK 0.1.14 ########## Compatibility Breaks ******************** * None API Changes *********** * UbuntuShapeStyle: - 'borderSource' property renamed to 'borderIdle' - 'borderPressed' property added SDK 0.1.13 ########## Compatibility Breaks ******************** * None API Changes *********** * None SDK 0.1.12 ########## New: Scrollbar component Compatibility Breaks ******************** * Tabs component no longer has properties buttonsExpanded and separator. These two properties can now be specified in the qmltheme of the Tabs. API Changes *********** * buttonsExpanded and separator properties removed from Tabs component. SDK 0.1.11 ########## Compatibility Breaks ******************** * None API Changes *********** * None SDK 0.1.7 ######### * Rule QML type removed from public API of the components SDK 0.1.5 ######### Compatibility Breaks ******************** * Meaning of TextCustom.fontSize has changed: the 'large' and 'x-large' sizes changed to be bigger. API Changes *********** * None ./src/0000755000015600001650000000000012700370701011661 5ustar jenkinsjenkins./src/Ubuntu/0000755000015600001650000000000012700370701013143 5ustar jenkinsjenkins./src/Ubuntu/UbuntuGestures/0000755000015600001650000000000012700370716016155 5ustar jenkinsjenkins./src/Ubuntu/UbuntuGestures/damper.cpp0000644000015600001650000000145412700370701020127 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "damper_p.h" #include QDebug operator<<(QDebug dbg, const DampedPointF &p) { dbg.nospace() << "(" << p.x() << ", " << p.y() << ")"; return dbg.space(); } ./src/Ubuntu/UbuntuGestures/candidateinactivitytimer.h0000644000015600001650000000267712700370701023415 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UBUNTUGESTURES_CANDIDATE_INACTIVITY_TIMER_H #define UBUNTUGESTURES_CANDIDATE_INACTIVITY_TIMER_H #include class QQuickItem; #include "timer.h" namespace UbuntuGestures { class UBUNTUGESTURES_EXPORT CandidateInactivityTimer : public QObject { Q_OBJECT public: CandidateInactivityTimer(int touchId, QQuickItem *candidate, AbstractTimer *timer, QObject *parent = nullptr); virtual ~CandidateInactivityTimer(); const int durationMs = 1000; Q_SIGNALS: void candidateDefaulted(int touchId, QQuickItem *candidate); private Q_SLOTS: void onTimeout(); private: AbstractTimer *m_timer; int m_touchId; QQuickItem *m_candidate; }; } // namespace UbuntuGestures #endif // UBUNTUGESTURES_CANDIDATE_INACTIVITY_TIMER_H ./src/Ubuntu/UbuntuGestures/UbuntuGestures.pro0000644000015600001650000000154612700370701021703 0ustar jenkinsjenkinsTEMPLATE=lib TARGET=UbuntuGestures QT *= core-private gui-private qml qml-private quick quick-private CONFIG += dll no_keywords c++11 INCLUDEPATH+=$$PWD DEFINES += UBUNTUGESTURES_LIBRARY load(qt_build_config) load(ubuntu_qt_module) HEADERS += candidateinactivitytimer.h \ debughelpers.h \ timer.h \ timesource.h \ touchownershipevent.h \ touchregistry.h \ unownedtouchevent.h \ ubuntugesturesglobal.h \ pool.h \ ucswipearea_p.h \ ucswipearea_p_p.h \ damper_p.h \ SOURCES += candidateinactivitytimer.cpp \ debughelpers.cpp \ timer.cpp \ timesource.cpp \ touchownershipevent.cpp \ touchregistry.cpp \ unownedtouchevent.cpp \ ucswipearea.cpp \ damper.cpp ./src/Ubuntu/UbuntuGestures/timer.cpp0000644000015600001650000000641012700370701017774 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "timer.h" namespace UbuntuGestures { Timer::Timer(QObject *parent) : AbstractTimer(parent) { m_timer.setSingleShot(false); connect(&m_timer, &QTimer::timeout, this, &AbstractTimer::timeout); } int Timer::interval() const { return m_timer.interval(); } void Timer::setInterval(int msecs) { m_timer.setInterval(msecs); } void Timer::start() { m_timer.start(); AbstractTimer::start(); } void Timer::stop() { m_timer.stop(); AbstractTimer::stop(); } bool Timer::isSingleShot() const { return m_timer.isSingleShot(); } void Timer::setSingleShot(bool value) { m_timer.setSingleShot(value); } /////////////////////////////////// FakeTimer ////////////////////////////////// FakeTimer::FakeTimer(const SharedTimeSource &timeSource, QObject *parent) : UbuntuGestures::AbstractTimer(parent) , m_interval(0) , m_singleShot(false) , m_timeSource(timeSource) { } void FakeTimer::update() { if (!isRunning()) { return; } if (m_nextTimeoutTime <= m_timeSource->msecsSinceReference()) { if (isSingleShot()) { stop(); } else { m_nextTimeoutTime += interval(); } Q_EMIT timeout(); } } void FakeTimer::start() { AbstractTimer::start(); m_nextTimeoutTime = m_timeSource->msecsSinceReference() + (qint64)interval(); } int FakeTimer::interval() const { return m_interval; } void FakeTimer::setInterval(int msecs) { m_interval = msecs; } bool FakeTimer::isSingleShot() const { return m_singleShot; } void FakeTimer::setSingleShot(bool value) { m_singleShot = value; } /////////////////////////////////// FakeTimerFactory ////////////////////////////////// FakeTimerFactory::FakeTimerFactory() { m_timeSource.reset(new FakeTimeSource); } void FakeTimerFactory::updateTime(qint64 targetTime) { qint64 minTimeoutTime = targetTime; for (int i = 0; i < timers.count(); ++i) { FakeTimer *timer = timers[i].data(); if (timer && timer->isRunning() && timer->nextTimeoutTime() < minTimeoutTime) { minTimeoutTime = timer->nextTimeoutTime(); } } m_timeSource->m_msecsSinceReference = minTimeoutTime; for (int i = 0; i < timers.count(); ++i) { FakeTimer *timer = timers[i].data(); if (timer) { timer->update(); } } if (m_timeSource->msecsSinceReference() < targetTime) { updateTime(targetTime); } } AbstractTimer *FakeTimerFactory::createTimer(QObject *parent) { FakeTimer *fakeTimer = new FakeTimer(m_timeSource, parent); timers.append(fakeTimer); return fakeTimer; } } // namespace UbuntuGestures ./src/Ubuntu/UbuntuGestures/ucswipearea.cpp0000644000015600001650000010140212700370714021165 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "ucswipearea_p_p.h" #include #include #include #include #include // local #include #include #include using namespace UbuntuGestures; Q_LOGGING_CATEGORY(ucSwipeArea, "ubuntu.components.SwipeArea", QtMsgType::QtWarningMsg) Q_LOGGING_CATEGORY(ucActiveTouchInfo, "ubuntu.components.SwipeArea.ActiveTouchInfo", QtMsgType::QtWarningMsg) #define SA_TRACE(params) qCDebug(ucSwipeArea).nospace() << "[SwipeArea(" << qPrintable(objectName()) << ")] " << params #define TI_TRACE(params) qCDebug(ucActiveTouchInfo).nospace() << "[ActiveTouchInfo] " << params namespace { const char *statusToString(UCSwipeAreaPrivate::Status status) { if (status == UCSwipeAreaPrivate::WaitingForTouch) { return "WaitingForTouch"; } else if (status == UCSwipeAreaPrivate::Undecided) { return "Undecided"; } else { return "Recognized"; } } QString touchPointStateToString(Qt::TouchPointState state) { switch (state) { case Qt::TouchPointPressed: return QStringLiteral("pressed"); case Qt::TouchPointMoved: return QStringLiteral("moved"); case Qt::TouchPointStationary: return QStringLiteral("stationary"); case Qt::TouchPointReleased: return QStringLiteral("released"); default: return QStringLiteral("INVALID_STATE"); } } QString touchEventToString(const QTouchEvent *ev) { QString message; switch (ev->type()) { case QEvent::TouchBegin: message.append(QStringLiteral("TouchBegin ")); break; case QEvent::TouchUpdate: message.append(QStringLiteral("TouchUpdate ")); break; case QEvent::TouchEnd: message.append(QStringLiteral("TouchEnd ")); break; case QEvent::TouchCancel: message.append(QStringLiteral("TouchCancel ")); break; default: message.append(QStringLiteral("INVALID_TOUCH_EVENT_TYPE ")); } Q_FOREACH(const QTouchEvent::TouchPoint& touchPoint, ev->touchPoints()) { message.append( QStringLiteral("(id:%1, state:%2, scenePos:(%3,%4)) ") .arg(touchPoint.id()) .arg(touchPointStateToString(touchPoint.state())) .arg(touchPoint.scenePos().x()) .arg(touchPoint.scenePos().y()) ); } return message; } } // namespace { class Direction { public: static bool isHorizontal(UCSwipeArea::Direction type) { return type == UCSwipeArea::Leftwards || type == UCSwipeArea::Rightwards || type == UCSwipeArea::Horizontal; } static bool isVertical(UCSwipeArea::Direction type) { return type == UCSwipeArea::Upwards || type == UCSwipeArea::Downwards || type == UCSwipeArea::Vertical; } static bool isPositive(UCSwipeArea::Direction type) { return type == UCSwipeArea::Rightwards || type == UCSwipeArea::Downwards || type == UCSwipeArea::Horizontal || type == UCSwipeArea::Vertical; } }; /*! * \qmltype SwipeArea * \instantiates UCSwipeArea * \inherits Item * \inqmlmodule Ubuntu.Components 1.3 * \since Ubuntu.Components 1.3 * \ingroup ubuntu-gestures * \brief An area which detects axis-aligned single-finger drag gestures. * * The component can be used to detect gestures of a certain direction, and can * grab gestures started on a component placed behind of the SwipeArea. * The gesture is detected on the SwipeArea, therefore the size must be * chosen carefully so it can properly detect the gesture. * * The gesture direction is specified by the \l direction property. The recognized * and captured gesture is reported through the \l dragging property, which becomes * \c true when the gesture is detected. If there was a component under the * SwipeArea, the gesture will be cancelled on that component. * * The drag recognition is performed within the component area in the specified * direction. If the drag deviates too much from this, recognition will fail, * as well as if the drag or the flick is too short. Once the drag is * intercepted, the gesture will be followed even after it leaves the detection area. * * Example: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * * MainView { * width: units.gu(40) * height: units.gu(70) * * Page { * title: "SwipeArea sample" * SwipeArea { * anchors { * left: parent.left * right: parent.right * bottom: parent.bottom * } * height: units.gu(5) * direction: SwipeArea.Upwards * Label { * text: "Drag upwards" * anchors { * centerIn: parent * verticalOffset: parent.dragging ? parent.distance : 0 * } * } * } * } * } * \endqml * \note When used with a Flickable (or ListView, GridView) always put the * SwipeArea next to the Flickable as sibling. */ UCSwipeArea::UCSwipeArea(QQuickItem *parent) : QQuickItem(*(new UCSwipeAreaPrivate), parent) { Q_D(UCSwipeArea); d->init(); } /*! * \qmlproperty enum SwipeArea::direction * The direction in which the gesture should move in order to be recognized. * \table * \header * \li Direction * \li Description * \row * \li Rightwards * \li Along the positive direction of the X axis * \row * \li Leftwards * \li Along the negative direction of the X axis * \row * \li Downwards * \li Along the positive direction of the Y axis * \row * \li Upwards * \li Along the negative direction of the Y axis * \row * \li Horizontal * \li Along the X axis, in any direction * \row * \li Vertical * \li Along the Y axis, in any direction * \endtable */ UCSwipeArea::Direction UCSwipeArea::direction() const { Q_D(const UCSwipeArea); return d->direction; } void UCSwipeArea::setDirection(Direction direction) { Q_D(UCSwipeArea); if (direction != d->direction) { d->direction = direction; Q_EMIT directionChanged(d->direction); } } void UCSwipeAreaPrivate::setDistanceThreshold(qreal value) { if (distanceThreshold != value) { distanceThreshold = value; distanceThresholdSquared = distanceThreshold * distanceThreshold; } } void UCSwipeAreaPrivate::setCompositionTime(int value) { compositionTime = value; } void UCSwipeAreaPrivate::setMaxTime(int value) { if (maxTime != value) { maxTime = value; recognitionTimer->setInterval(maxTime); } } void UCSwipeAreaPrivate::setRecognitionTimer(UbuntuGestures::AbstractTimer *timer) { int interval = 0; bool timerWasRunning = false; bool wasSingleShot = false; Q_Q(UCSwipeArea); // can be null when called from the constructor if (recognitionTimer) { wasSingleShot = recognitionTimer->isSingleShot(); interval = recognitionTimer->interval(); timerWasRunning = recognitionTimer->isRunning(); if (recognitionTimer->parent() == q) { delete recognitionTimer; } } recognitionTimer = timer; timer->setInterval(interval); timer->setSingleShot(wasSingleShot); QObject::connect(timer, &UbuntuGestures::AbstractTimer::timeout, q, &UCSwipeArea::rejectGesture); if (timerWasRunning) { recognitionTimer->start(); } } void UCSwipeAreaPrivate::setTimeSource(const SharedTimeSource &timeSource) { this->timeSource = timeSource; activeTouches.m_timeSource = timeSource; } /*! * \qmlproperty real SwipeArea::distance * \readonly * The property holds the distance of the swipe from the beginning of the gesture * recognition to the current touch position. */ qreal UCSwipeArea::distance() const { Q_D(const UCSwipeArea); return d->sceneDistance; } /*! * \qmlproperty point SwipeArea::touchPosition * \readonly * Position of the touch point performing the drag relative to this item. */ QPointF UCSwipeArea::touchPosition() const { Q_D(const UCSwipeArea); return mapFromScene(d->publicScenePos); } /*! * \qmlproperty bool SwipeArea::dragging * \readonly * Reports whether a drag gesture is taking place. */ bool UCSwipeArea::dragging() const { Q_D(const UCSwipeArea); return d->status == UCSwipeAreaPrivate::Recognized; } /*! * \qmlproperty bool SwipeArea::pressed * \readonly * Reports whether the drag area is pressed. */ bool UCSwipeArea::pressed() const { Q_D(const UCSwipeArea); return d->status != UCSwipeAreaPrivate::WaitingForTouch; } /*! * \qmlproperty bool SwipeArea::immediateRecognition * Drives whether the gesture should be recognized as soon as the touch lands on * the area. With this property set it will work the same way as a MultiPointTouchArea, * * Defaults to false. In most cases this should not be set. */ bool UCSwipeArea::immediateRecognition() const { Q_D(const UCSwipeArea); return d->immediateRecognition; } void UCSwipeArea::setImmediateRecognition(bool enabled) { Q_D(UCSwipeArea); if (d->immediateRecognition != enabled) { d->immediateRecognition = enabled; Q_EMIT immediateRecognitionChanged(enabled); } } /*! * \qmlproperty bool SwipeArea::grabGesture * If true, any gestures will be grabbed and owned by the SwipeArea as usual. * If false, gestures will still be reported, but events may be grabbed by * another Qml object. * * Defaults to true. In most cases this should not be unset. */ bool UCSwipeArea::grabGesture() const { Q_D(const UCSwipeArea); return d->grabGesture; } void UCSwipeArea::setGrabGesture(bool enabled) { Q_D(UCSwipeArea); if (d->grabGesture == enabled) { return; } d->grabGesture = enabled; if (!d->grabGesture && d->status == UCSwipeAreaPrivate::Undecided) { TouchRegistry::instance()->removeCandidateOwnerForTouch(d->touchId, this); // We still wanna know when it ends for keeping the composition time window up-to-date TouchRegistry::instance()->addTouchWatcher(d->touchId, this); } Q_EMIT grabGestureChanged(enabled); } bool UCSwipeArea::event(QEvent *event) { Q_D(UCSwipeArea); if (event->type() == TouchOwnershipEvent::touchOwnershipEventType()) { d->touchOwnershipEvent(static_cast(event)); return true; } else if (event->type() == UnownedTouchEvent::unownedTouchEventType()) { d->unownedTouchEvent(static_cast(event)); return true; } else { return QQuickItem::event(event); } } void UCSwipeAreaPrivate::touchOwnershipEvent(TouchOwnershipEvent *event) { Q_Q(UCSwipeArea); if (event->gained()) { QVector ids; ids.append(event->touchId()); SA_TRACE("grabbing touch"); q->grabTouchPoints(ids); } else { // We still wanna know when it ends for keeping the composition time window up-to-date TouchRegistry::instance()->addTouchWatcher(touchId, q); setStatus(WaitingForTouch); } } void UCSwipeAreaPrivate::unownedTouchEvent(UnownedTouchEvent *unownedTouchEvent) { Q_Q(UCSwipeArea); QTouchEvent *event = unownedTouchEvent->touchEvent(); Q_ASSERT(!event->touchPointStates().testFlag(Qt::TouchPointPressed)); SA_TRACE("Unowned " << timeSource->msecsSinceReference() << " " << qPrintable(touchEventToString(event))); switch (status) { case WaitingForTouch: // do nothing break; case Undecided: Q_ASSERT(q->isEnabled() && q->isVisible()); unownedTouchEvent_undecided(unownedTouchEvent); break; default: // Recognized: if (!grabGesture) { // Treat unowned event as if we owned it, but we are really just watching it touchEvent_recognized(event); } break; } activeTouches.update(event); } void UCSwipeAreaPrivate::unownedTouchEvent_undecided(UnownedTouchEvent *unownedTouchEvent) { Q_Q(UCSwipeArea); const QTouchEvent::TouchPoint *touchPoint = fetchTargetTouchPoint(unownedTouchEvent->touchEvent()); if (!touchPoint) { qCritical() << "UCSwipeArea[status=Undecided]: touch " << touchId << "missing from UnownedTouchEvent without first reaching state Qt::TouchPointReleased. " "Considering it as released."; TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q); setStatus(WaitingForTouch); return; } const QPointF &touchScenePosition = touchPoint->scenePos(); if (touchPoint->state() == Qt::TouchPointReleased) { // touch has ended before recognition concluded SA_TRACE("Touch has ended before recognition concluded"); TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q); setStatus(WaitingForTouch); return; } previousDampedScenePos.setX(dampedScenePos.x()); previousDampedScenePos.setY(dampedScenePos.y()); dampedScenePos.update(touchScenePosition); if (!movingInRightDirection()) { SA_TRACE("Rejecting gesture because touch point is moving in the wrong direction."); TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q); // We still wanna know when it ends for keeping the composition time window up-to-date TouchRegistry::instance()->addTouchWatcher(touchId, q); setStatus(WaitingForTouch); return; } if (isWithinTouchCompositionWindow()) { // There's still time for some new touch to appear and ruin our party as it would be combined // with our touchId one and therefore deny the possibility of a single-finger gesture. SA_TRACE("Sill within composition window. Let's wait more."); return; } if (movedFarEnoughAlongGestureAxis()) { if (grabGesture) { TouchRegistry::instance()->requestTouchOwnership(touchId, q); } setStatus(Recognized); updatePosition(touchScenePosition); } else if (isPastMaxDistance()) { SA_TRACE("Rejecting gesture because it went farther than maxDistance without getting recognized."); TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q); // We still wanna know when it ends for keeping the composition time window up-to-date TouchRegistry::instance()->addTouchWatcher(touchId, q); setStatus(WaitingForTouch); } else { SA_TRACE("Didn't move far enough yet. Let's wait more."); } } void UCSwipeArea::touchEvent(QTouchEvent *event) { // FIXME: Consider when more than one touch starts in the same event (although it's not possible // with Mir's android-input). Have to track them all. Consider it a plus/bonus. Q_D(UCSwipeArea); SA_TRACE(d->timeSource->msecsSinceReference() << " " << qPrintable(touchEventToString(event))); if (!isEnabled() || !isVisible()) { QQuickItem::touchEvent(event); return; } switch (d->status) { case UCSwipeAreaPrivate::WaitingForTouch: d->touchEvent_absent(event); break; case UCSwipeAreaPrivate::Undecided: d->touchEvent_undecided(event); break; default: // Recognized: d->touchEvent_recognized(event); break; } d->activeTouches.update(event); } void UCSwipeAreaPrivate::touchEvent_absent(QTouchEvent *event) { // FIXME: accept/reject is for the whole event, not per touch id. See how that affects us. if (!event->touchPointStates().testFlag(Qt::TouchPointPressed)) { // Nothing to see here. No touch starting in this event. return; } // to be proven wrong, if that's the case bool allGood = true; if (isWithinTouchCompositionWindow()) { // too close to the last touch start. So we consider them as starting roughly at the same time. // Can't be a single-touch gesture. SA_TRACE("A new touch point came in but we're still within time composition window. Ignoring it."); allGood = false; } const QList &touchPoints = event->touchPoints(); const QTouchEvent::TouchPoint *newTouchPoint = nullptr; for (int i = 0; i < touchPoints.count() && allGood; ++i) { const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i); if (touchPoint.state() == Qt::TouchPointPressed) { if (newTouchPoint) { // more than one touch starting in this QTouchEvent. Can't be a single-touch gesture allGood = false; } else { // that's our candidate newTouchPoint = &touchPoint; } } } if (allGood) { allGood = sanityCheckRecognitionProperties(); if (!allGood) { qWarning("UCSwipeArea: recognition properties are wrongly set. Gesture recognition" " is impossible"); } } if (allGood) { Q_ASSERT(newTouchPoint); Q_Q(UCSwipeArea); startScenePos = newTouchPoint->scenePos(); touchId = newTouchPoint->id(); dampedScenePos.reset(startScenePos); updatePosition(startScenePos); updateSceneDirectionVector(); if (recognitionIsDisabled()) { // Behave like a dumb TouchArea SA_TRACE("Gesture recognition is disabled. Requesting touch ownership immediately."); setStatus(Recognized); if (grabGesture) { TouchRegistry::instance()->requestTouchOwnership(touchId, q); event->accept(); } else { watchPressedTouchPoints(touchPoints); event->ignore(); } } else { // just monitor the touch points for now. if (grabGesture) { TouchRegistry::instance()->addCandidateOwnerForTouch(touchId, q); } else { watchPressedTouchPoints(touchPoints); } setStatus(Undecided); // Let the item below have it. We will monitor it and grab it later if a gesture // gets recognized. event->ignore(); } } else { watchPressedTouchPoints(touchPoints); event->ignore(); } } void UCSwipeAreaPrivate::touchEvent_undecided(QTouchEvent *event) { Q_ASSERT(fetchTargetTouchPoint(event) == nullptr); // We're not interested in new touch points. We already have our candidate (touchId). // But we do want to know when those new touches end for keeping the composition time // window up-to-date event->ignore(); watchPressedTouchPoints(event->touchPoints()); if (event->touchPointStates().testFlag(Qt::TouchPointPressed) && isWithinTouchCompositionWindow()) { // multi-finger drags are not accepted SA_TRACE("Multi-finger drags are not accepted"); Q_Q(UCSwipeArea); TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q); // We still wanna know when it ends for keeping the composition time window up-to-date TouchRegistry::instance()->addTouchWatcher(touchId, q); setStatus(WaitingForTouch); } } void UCSwipeAreaPrivate::touchEvent_recognized(QTouchEvent *event) { const QTouchEvent::TouchPoint *touchPoint = fetchTargetTouchPoint(event); if (!touchPoint) { qCritical() << "UCSwipeArea[status=Recognized]: touch " << touchId << "missing from QTouchEvent without first reaching state Qt::TouchPointReleased. " "Considering it as released."; setStatus(WaitingForTouch); } else { updatePosition(touchPoint->scenePos()); if (touchPoint->state() == Qt::TouchPointReleased) { setStatus(WaitingForTouch); } } } void UCSwipeAreaPrivate::watchPressedTouchPoints(const QList &touchPoints) { Q_Q(UCSwipeArea); for (int i = 0; i < touchPoints.count(); ++i) { const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i); if (touchPoint.state() == Qt::TouchPointPressed) { TouchRegistry::instance()->addTouchWatcher(touchPoint.id(), q); } } } bool UCSwipeAreaPrivate::recognitionIsDisabled() const { return immediateRecognition || (distanceThreshold <= 0 && compositionTime <= 0); } bool UCSwipeAreaPrivate::sanityCheckRecognitionProperties() { return recognitionIsDisabled() || (distanceThreshold < maxDistance && compositionTime < maxTime); } const QTouchEvent::TouchPoint *UCSwipeAreaPrivate::fetchTargetTouchPoint(QTouchEvent *event) { const QList &touchPoints = event->touchPoints(); const QTouchEvent::TouchPoint *touchPoint = 0; for (int i = 0; i < touchPoints.size(); ++i) { if (touchPoints.at(i).id() == touchId) { touchPoint = &touchPoints.at(i); break; } } return touchPoint; } bool UCSwipeAreaPrivate::movingInRightDirection() const { if (direction == UCSwipeArea::Horizontal || direction == UCSwipeArea::Vertical) { return true; } else { QPointF movementVector(dampedScenePos.x() - previousDampedScenePos.x(), dampedScenePos.y() - previousDampedScenePos.y()); qreal scalarProjection = projectOntoDirectionVector(movementVector); return scalarProjection >= 0.; } } bool UCSwipeAreaPrivate::movedFarEnoughAlongGestureAxis() const { if (distanceThreshold <= 0.) { // distance threshold check is disabled return true; } else { QPointF totalMovement(dampedScenePos.x() - startScenePos.x(), dampedScenePos.y() - startScenePos.y()); qreal scalarProjection = projectOntoDirectionVector(totalMovement); SA_TRACE(" movedFarEnoughAlongGestureAxis: scalarProjection=" << scalarProjection << ", distanceThreshold=" << distanceThreshold); if (direction == UCSwipeArea::Horizontal || direction == UCSwipeArea::Vertical) { return qAbs(scalarProjection) > distanceThreshold; } else { return scalarProjection > distanceThreshold; } } } bool UCSwipeAreaPrivate::isPastMaxDistance() const { QPointF totalMovement(dampedScenePos.x() - startScenePos.x(), dampedScenePos.y() - startScenePos.y()); qreal squaredDistance = totalMovement.x()*totalMovement.x() + totalMovement.y()*totalMovement.y(); return squaredDistance > maxDistance*maxDistance; } void UCSwipeArea::giveUpIfDisabledOrInvisible() { if (!isEnabled() || !isVisible()) { Q_D(UCSwipeArea); if (d->status == UCSwipeAreaPrivate::Undecided) { TouchRegistry::instance()->removeCandidateOwnerForTouch(d->touchId, this); // We still wanna know when it ends for keeping the composition time window up-to-date TouchRegistry::instance()->addTouchWatcher(d->touchId, this); } if (d->status != UCSwipeAreaPrivate::WaitingForTouch) { SA_TRACE("Resetting status because got disabled or made invisible"); d->setStatus(UCSwipeAreaPrivate::WaitingForTouch); } } } void UCSwipeArea::rejectGesture() { Q_D(UCSwipeArea); if (d->status == UCSwipeAreaPrivate::Undecided) { SA_TRACE("Rejecting gesture because it's taking too long to drag beyond the threshold."); TouchRegistry::instance()->removeCandidateOwnerForTouch(d->touchId, this); // We still wanna know when it ends for keeping the composition time window up-to-date TouchRegistry::instance()->addTouchWatcher(d->touchId, this); d->setStatus(UCSwipeAreaPrivate::WaitingForTouch); } } void UCSwipeAreaPrivate::setStatus(Status newStatus) { if (newStatus == status) return; Status oldStatus = status; if (oldStatus == Undecided) { recognitionTimer->stop(); } Q_Q(UCSwipeArea); const bool wasDragging = q->dragging(); const bool wasPressed = q->pressed(); status = newStatus; for (int i = 0; i < statusChangeListeners.size(); i++) { statusChangeListeners[i]->swipeStatusChanged(oldStatus, status); } SA_TRACE(statusToString(oldStatus) << " -> " << statusToString(newStatus)); if (newStatus == Undecided) { recognitionTimer->start(); } const bool isDragging = q->dragging(); const bool isPressed = q->pressed(); if (isDragging != wasDragging) Q_EMIT q->draggingChanged(isDragging); if (isPressed != wasPressed) Q_EMIT q->pressedChanged(isPressed); } void UCSwipeAreaPrivate::updatePosition(const QPointF &point) { bool xChanged = publicScenePos.x() != point.x(); bool yChanged = publicScenePos.y() != point.y(); // Public position should not get updated while the gesture is still being recognized // (ie, Undecided status). Q_ASSERT(status == WaitingForTouch || status == Recognized); if (status == Recognized && !recognitionIsDisabled()) { // When the gesture finally gets recognized, the finger will likely be // reasonably far from the edge. If we made the contentX immediately // follow the finger position it would be visually unpleasant as it // would appear right next to the user's finger out of nowhere (ie, // it would jump). Instead, we make contentX go towards the user's // finger in several steps. ie., in an animated way. QPointF delta = point - publicScenePos; // the trick is not to go all the way (1.0) as it would cause a sudden jump publicScenePos.rx() += 0.4 * delta.x(); publicScenePos.ry() += 0.4 * delta.y(); } else { // no smoothing when initializing or if gesture recognition was immediate as there will // be no jump. publicScenePos = point; } if (xChanged || yChanged) { Q_Q(UCSwipeArea); Q_EMIT q->touchPositionChanged(q->touchPosition()); // handle distance change QPointF totalMovement = publicScenePos - startScenePos; sceneDistance = projectOntoDirectionVector(totalMovement); Q_EMIT q->distanceChanged(sceneDistance); } } bool UCSwipeAreaPrivate::isWithinTouchCompositionWindow() { return compositionTime > 0 && !activeTouches.isEmpty() && timeSource->msecsSinceReference() <= activeTouches.mostRecentStartTime() + (qint64)compositionTime; } void UCSwipeArea::itemChange(ItemChange change, const ItemChangeData &value) { if (change == QQuickItem::ItemSceneChange) { if (value.window != nullptr) { value.window->installEventFilter(TouchRegistry::instance()); // FIXME: Handle window->screen() changes (ie window changing screens) Q_D(UCSwipeArea); qreal pixelsPerInch = value.window->screen()->physicalDotsPerInch(); if (pixelsPerInch < 0) { // FIXME: dpi can be negative lp#1525293 // It can return garbage when run in a XVFB server (Virtual Framebuffer 'fake' X server) pixelsPerInch = 72; } d->setPixelsPerMm(pixelsPerInch / 25.4); } } if (change == ItemVisibleHasChanged) { giveUpIfDisabledOrInvisible(); } } void UCSwipeAreaPrivate::setPixelsPerMm(qreal pixelsPerMm) { dampedScenePos.setMaxDelta(1. * pixelsPerMm); setDistanceThreshold(4. * pixelsPerMm); maxDistance = 10. * pixelsPerMm; } //************************** ActiveTouchesInfo ************************** ActiveTouchesInfo::ActiveTouchesInfo(const SharedTimeSource &timeSource) : m_timeSource(timeSource) { } void ActiveTouchesInfo::update(QTouchEvent *event) { if (!(event->touchPointStates() & (Qt::TouchPointPressed | Qt::TouchPointReleased))) { // nothing to update TI_TRACE("Nothing to update"); return; } const QList &touchPoints = event->touchPoints(); for (int i = 0; i < touchPoints.count(); ++i) { const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i); if (touchPoint.state() == Qt::TouchPointPressed) { addTouchPoint(touchPoint.id()); } else if (touchPoint.state() == Qt::TouchPointReleased) { removeTouchPoint(touchPoint.id()); } } } QString ActiveTouchesInfo::toString() { QString string = QStringLiteral("("); { QTextStream stream(&string); m_touchInfoPool.forEach([&](Pool::Iterator &touchInfo) { stream << "(id=" << touchInfo->id << ",startTime=" << touchInfo->startTime << ")"; return true; }); } string.append(QStringLiteral(")")); return string; } void ActiveTouchesInfo::addTouchPoint(int touchId) { ActiveTouchInfo &activeTouchInfo = m_touchInfoPool.getEmptySlot(); activeTouchInfo.id = touchId; activeTouchInfo.startTime = m_timeSource->msecsSinceReference(); TI_TRACE(qPrintable(toString())); } qint64 ActiveTouchesInfo::touchStartTime(int touchId) { qint64 result = -1; m_touchInfoPool.forEach([&](Pool::Iterator &touchInfo) { if (touchId == touchInfo->id) { result = touchInfo->startTime; return false; } else { return true; } }); Q_ASSERT(result != -1); return result; } void ActiveTouchesInfo::removeTouchPoint(int touchId) { m_touchInfoPool.forEach([&](Pool::Iterator &touchInfo) { if (touchId == touchInfo->id) { m_touchInfoPool.freeSlot(touchInfo); return false; } else { return true; } }); TI_TRACE(qPrintable(toString())); } qint64 ActiveTouchesInfo::mostRecentStartTime() { Q_ASSERT(!m_touchInfoPool.isEmpty()); qint64 highestStartTime = -1; m_touchInfoPool.forEach([&](Pool::Iterator &activeTouchInfo) { if (activeTouchInfo->startTime > highestStartTime) { highestStartTime = activeTouchInfo->startTime; } return true; }); return highestStartTime; } void UCSwipeAreaPrivate::updateSceneDirectionVector() { QPointF localOrigin(0., 0.); QPointF localDirection; switch (direction) { case UCSwipeArea::Upwards: localDirection.rx() = 0.; localDirection.ry() = -1.; break; case UCSwipeArea::Downwards: case UCSwipeArea::Vertical: localDirection.rx() = 0.; localDirection.ry() = 1; break; case UCSwipeArea::Leftwards: localDirection.rx() = -1.; localDirection.ry() = 0.; break; default: // UCSwipeArea::Rightwards || Direction.Horizontal localDirection.rx() = 1.; localDirection.ry() = 0.; break; } Q_Q(UCSwipeArea); QPointF sceneOrigin = q->mapToScene(localOrigin); QPointF sceneDirection = q->mapToScene(localDirection); sceneDirectionVector = sceneDirection - sceneOrigin; } qreal UCSwipeAreaPrivate::projectOntoDirectionVector(const QPointF &sceneVector) const { // same as dot product as sceneDirectionVector is a unit vector return sceneVector.x() * sceneDirectionVector.x() + sceneVector.y() * sceneDirectionVector.y(); } UCSwipeAreaPrivate::UCSwipeAreaPrivate() : QQuickItemPrivate() , timeSource(new RealTimeSource) , activeTouches(timeSource) , recognitionTimer(nullptr) , distanceThreshold(0) , distanceThresholdSquared(0.) , maxDistance(0.) , sceneDistance(0.) , touchId(-1) , maxTime(400) , compositionTime(60) , status(WaitingForTouch) , direction(UCSwipeArea::Rightwards) , immediateRecognition(false) , grabGesture(true) { } void UCSwipeAreaPrivate::init() { Q_Q(UCSwipeArea); setRecognitionTimer(new Timer(q)); recognitionTimer->setInterval(maxTime); recognitionTimer->setSingleShot(true); QObject::connect(q, &QQuickItem::enabledChanged, q, &UCSwipeArea::giveUpIfDisabledOrInvisible); } void UCSwipeAreaPrivate::addStatusChangeListener(UCSwipeAreaStatusListener *listener) { if (!statusChangeListeners.contains(listener)) { statusChangeListeners.append(listener); } } void UCSwipeAreaPrivate::removeStatusChangeListener(UCSwipeAreaStatusListener *listener) { statusChangeListeners.removeAll(listener); } ./src/Ubuntu/UbuntuGestures/touchregistry.cpp0000644000015600001650000004304212700370701021571 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "touchregistry.h" #include #include #include #include "candidateinactivitytimer.h" #include "timer.h" #include "touchownershipevent.h" #include "unownedtouchevent.h" Q_LOGGING_CATEGORY(ugTouchRegistry, "libubuntugestures.TouchRegistry", QtMsgType::QtWarningMsg) #include "debughelpers.h" #define UG_DEBUG qCDebug(ugTouchRegistry) << "[TouchRegistry]" using namespace UbuntuGestures; TouchRegistry *TouchRegistry::m_instance = nullptr; TouchRegistry::TouchRegistry(QObject *parent) : QObject(parent) , m_inDispatchLoop(false) , m_timerFactory(new TimerFactory) { } TouchRegistry::~TouchRegistry() { Q_ASSERT(m_instance != nullptr); m_instance = nullptr; delete m_timerFactory; } TouchRegistry *TouchRegistry::instance() { if (m_instance == nullptr) { m_instance = new TouchRegistry; } return m_instance; } void TouchRegistry::setTimerFactory(AbstractTimerFactory *timerFactory) { delete m_timerFactory; m_timerFactory = timerFactory; } void TouchRegistry::update(const QTouchEvent *event) { UG_DEBUG << "got" << qPrintable(touchEventToString(event)); const QList &touchPoints = event->touchPoints(); for (int i = 0; i < touchPoints.count(); ++i) { const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i); if (touchPoint.state() == Qt::TouchPointPressed) { TouchInfo &touchInfo = m_touchInfoPool.getEmptySlot(); touchInfo.init(touchPoint.id()); } else if (touchPoint.state() == Qt::TouchPointReleased) { Pool::Iterator touchInfo = findTouchInfo(touchPoint.id()); touchInfo->physicallyEnded = true; } } deliverTouchUpdatesToUndecidedCandidatesAndWatchers(event); freeEndedTouchInfos(); } void TouchRegistry::deliverTouchUpdatesToUndecidedCandidatesAndWatchers(const QTouchEvent *event) { // TODO: Look into how we could optimize this whole thing. // Although it's not really a problem as we should have at most two candidates // for each point and there should not be many active points at any given moment. // But having three nested for-loops does scare. const QList &updatedTouchPoints = event->touchPoints(); // Maps an item to the touches in this event he should be informed about. // E.g.: a QTouchEvent might have three touches but a given item might be interested in only // one of them. So he will get a UnownedTouchEvent from this QTouchEvent containing only that // touch point. QHash> touchIdsForItems; // Build touchIdsForItems m_touchInfoPool.forEach([&](Pool::Iterator &touchInfo) { if (touchInfo->isOwned() && touchInfo->watchers.isEmpty()) return true; for (int j = 0; j < updatedTouchPoints.count(); ++j) { if (updatedTouchPoints[j].id() == touchInfo->id) { if (!touchInfo->isOwned()) { for (int i = 0; i < touchInfo->candidates.count(); ++i) { CandidateInfo &candidate = touchInfo->candidates[i]; Q_ASSERT(!candidate.item.isNull()); if (candidate.state != CandidateInfo::InterimOwner) { touchIdsForItems[candidate.item.data()].append(touchInfo->id); } } } const QList> &watchers = touchInfo->watchers; for (int i = 0; i < watchers.count(); ++i) { if (!watchers[i].isNull()) { touchIdsForItems[watchers[i].data()].append(touchInfo->id); } } return true; } } return true; }); // TODO: Consider what happens if an item calls any of TouchRegistry's public methods // from the event handler callback. m_inDispatchLoop = true; auto it = touchIdsForItems.constBegin(); while (it != touchIdsForItems.constEnd()) { QQuickItem *item = it.key(); const QList &touchIds = it.value(); dispatchPointsToItem(event, touchIds, item); ++it; }; m_inDispatchLoop = false; } void TouchRegistry::freeEndedTouchInfos() { m_touchInfoPool.forEach([&](Pool::Iterator &touchInfo) { if (touchInfo->ended()) { m_touchInfoPool.freeSlot(touchInfo); } return true; }); } /* Extracts the touches with the given touchIds from event and send them in a UnownedTouchEvent to the given item */ void TouchRegistry::dispatchPointsToItem(const QTouchEvent *event, const QList &touchIds, QQuickItem *item) { Qt::TouchPointStates touchPointStates = 0; QList touchPoints; const QList &allTouchPoints = event->touchPoints(); QTransform windowToCandidateTransform = QQuickItemPrivate::get(item)->windowToItemTransform(); QMatrix4x4 windowToCandidateMatrix(windowToCandidateTransform); for (int i = 0; i < allTouchPoints.count(); ++i) { const QTouchEvent::TouchPoint &originalTouchPoint = allTouchPoints[i]; if (touchIds.contains(originalTouchPoint.id())) { QTouchEvent::TouchPoint touchPoint = originalTouchPoint; translateTouchPointFromScreenToWindowCoords(touchPoint); // Set the point's local coordinates to that of the item touchPoint.setRect(windowToCandidateTransform.mapRect(touchPoint.sceneRect())); touchPoint.setStartPos(windowToCandidateTransform.map(touchPoint.startScenePos())); touchPoint.setLastPos(windowToCandidateTransform.map(touchPoint.lastScenePos())); touchPoint.setVelocity(windowToCandidateMatrix.mapVector(touchPoint.velocity()).toVector2D()); touchPoints.append(touchPoint); touchPointStates |= touchPoint.state(); } } QTouchEvent *eventForItem = new QTouchEvent(event->type(), event->device(), event->modifiers(), touchPointStates, touchPoints); eventForItem->setWindow(event->window()); eventForItem->setTimestamp(event->timestamp()); eventForItem->setTarget(event->target()); UnownedTouchEvent unownedTouchEvent(eventForItem); UG_DEBUG << "Sending unowned" << qPrintable(touchEventToString(eventForItem)) << "to" << item; QCoreApplication::sendEvent(item, &unownedTouchEvent); } void TouchRegistry::translateTouchPointFromScreenToWindowCoords(QTouchEvent::TouchPoint &touchPoint) { touchPoint.setScreenRect(touchPoint.sceneRect()); touchPoint.setStartScreenPos(touchPoint.startScenePos()); touchPoint.setLastScreenPos(touchPoint.lastScenePos()); touchPoint.setSceneRect(touchPoint.rect()); touchPoint.setStartScenePos(touchPoint.startPos()); touchPoint.setLastScenePos(touchPoint.lastPos()); } bool TouchRegistry::eventFilter(QObject *watched, QEvent *event) { Q_UNUSED(watched); switch (event->type()) { case QEvent::TouchBegin: case QEvent::TouchUpdate: case QEvent::TouchEnd: case QEvent::TouchCancel: update(static_cast(event)); break; default: // do nothing break; } // Do not filter out the event. i.e., let it be handled further as // we're just monitoring events return false; } void TouchRegistry::addCandidateOwnerForTouch(int id, QQuickItem *candidate) { UG_DEBUG << "addCandidateOwnerForTouch id" << id << "candidate" << candidate; Pool::Iterator touchInfo = findTouchInfo(id); if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); } if (touchInfo->isOwned()) { qWarning("TouchRegistry: trying to add candidate owner for a touch that's already owned"); return; } // TODO: Check if candidate already exists CandidateInfo candidateInfo; candidateInfo.state = CandidateInfo::Undecided; candidateInfo.item = candidate; candidateInfo.inactivityTimer = new CandidateInactivityTimer(id, candidate, m_timerFactory->createTimer(), this); connect(candidateInfo.inactivityTimer.data(), &CandidateInactivityTimer::candidateDefaulted, this, &TouchRegistry::rejectCandidateOwnerForTouch); touchInfo->candidates.append(candidateInfo); connect(candidate, &QObject::destroyed, this, [=](){ pruneNullCandidatesForTouch(id); }); } void TouchRegistry::addTouchWatcher(int touchId, QQuickItem *watcher) { UG_DEBUG << "addTouchWatcher id" << touchId << "watcher" << watcher; Pool::Iterator touchInfo = findTouchInfo(touchId); if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); } // TODO: Check if watcher already exists touchInfo->watchers.append(watcher); } void TouchRegistry::removeCandidateOwnerForTouch(int id, QQuickItem *candidate) { UG_DEBUG << "removeCandidateOwnerForTouch id" << id << "candidate" << candidate; Pool::Iterator touchInfo = findTouchInfo(id); if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); } // TODO: check if the candidate is in fact the owner of the touch bool removed = false; for (int i = 0; i < touchInfo->candidates.count() && !removed; ++i) { if (touchInfo->candidates[i].item == candidate) { removeCandidateOwnerForTouchByIndex(touchInfo, i); removed = true; } } } void TouchRegistry::pruneNullCandidatesForTouch(int touchId) { UG_DEBUG << "pruneNullCandidatesForTouch touchId" << touchId; Pool::Iterator touchInfo = findTouchInfo(touchId); if (!touchInfo) { // doesn't matter as touch is already gone. return; } int i = 0; while (i < touchInfo->candidates.count()) { if (touchInfo->candidates[i].item.isNull()) { removeCandidateOwnerForTouchByIndex(touchInfo, i); } else { ++i; } } } void TouchRegistry::removeCandidateOwnerForTouchByIndex(Pool::Iterator &touchInfo, int candidateIndex) { // TODO: check if the candidate is in fact the owner of the touch Q_ASSERT(candidateIndex < touchInfo->candidates.count()); if (candidateIndex == 0 && touchInfo->candidates[candidateIndex].state != CandidateInfo::Undecided) { qCritical("TouchRegistry: touch owner is being removed."); } removeCandidateHelper(touchInfo, candidateIndex); if (candidateIndex == 0) { // the top candidate has been removed. if the new top candidate // wants the touch let him know he's now the owner. if (touchInfo->isOwned()) { touchInfo->notifyCandidatesOfOwnershipResolution(); } } if (!m_inDispatchLoop && touchInfo->ended()) { m_touchInfoPool.freeSlot(touchInfo); } } void TouchRegistry::requestTouchOwnership(int id, QQuickItem *candidate) { UG_DEBUG << "requestTouchOwnership id " << id << "candidate" << candidate; Pool::Iterator touchInfo = findTouchInfo(id); if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); } Q_ASSERT(!touchInfo->isOwned()); int candidateIndex = -1; for (int i = 0; i < touchInfo->candidates.count(); ++i) { CandidateInfo &candidateInfo = touchInfo->candidates[i]; if (candidateInfo.item == candidate) { candidateInfo.state = CandidateInfo::Requested; delete candidateInfo.inactivityTimer; candidateInfo.inactivityTimer = nullptr; candidateIndex = i; break; } } // add it as a candidate if not present yet if (candidateIndex < 0) { CandidateInfo candidateInfo; candidateInfo.state = CandidateInfo::InterimOwner; candidateInfo.item = candidate; candidateInfo.inactivityTimer = nullptr; touchInfo->candidates.append(candidateInfo); // it's the last one candidateIndex = touchInfo->candidates.count() - 1; connect(candidate, &QObject::destroyed, this, [=](){ pruneNullCandidatesForTouch(id); }); } // If it's the top candidate it means it's now the owner. Let // it know about it. if (candidateIndex == 0) { touchInfo->notifyCandidatesOfOwnershipResolution(); } } Pool::Iterator TouchRegistry::findTouchInfo(int id) { Pool::Iterator touchInfo; m_touchInfoPool.forEach([&](Pool::Iterator &someTouchInfo) -> bool { if (someTouchInfo->id == id) { touchInfo = someTouchInfo; return false; } else { return true; } }); return touchInfo; } void TouchRegistry::rejectCandidateOwnerForTouch(int id, QQuickItem *candidate) { // NB: It's technically possible that candidate is a dangling pointer at this point. // Although that would most likely be due to a bug in our code. // In any case, only dereference it after it's confirmed that it indeed exists. UG_DEBUG << "rejectCandidateOwnerForTouch id" << id << "candidate" << (void*)candidate; Pool::Iterator touchInfo = findTouchInfo(id); if (!touchInfo) { UG_DEBUG << "Failed to find TouchInfo for id" << id; return; } int rejectedCandidateIndex = -1; // Check if the given candidate is valid and still undecided for (int i = 0; i < touchInfo->candidates.count() && rejectedCandidateIndex == -1; ++i) { CandidateInfo &candidateInfo = touchInfo->candidates[i]; if (candidateInfo.item == candidate) { Q_ASSERT(i > 0 || candidateInfo.state == CandidateInfo::Undecided); if (i == 0 && candidateInfo.state != CandidateInfo::Undecided) { qCritical() << "TouchRegistry: Can't reject item (" << (void*)candidate << ") as it already owns touch" << id; return; } else { // we found the guy and it's all fine. rejectedCandidateIndex = i; } } } // If we reached this point it's because the given candidate exists and is indeed undecided. Q_ASSERT(rejectedCandidateIndex >= 0 && rejectedCandidateIndex < touchInfo->candidates.size()); { TouchOwnershipEvent lostOwnershipEvent(id, false /*gained*/); QCoreApplication::sendEvent(candidate, &lostOwnershipEvent); } removeCandidateHelper(touchInfo, rejectedCandidateIndex); if (rejectedCandidateIndex == 0) { // the top candidate has been removed. if the new top candidate // wants the touch let him know he's now the owner. if (touchInfo->isOwned()) { touchInfo->notifyCandidatesOfOwnershipResolution(); } } } void TouchRegistry::removeCandidateHelper(Pool::Iterator &touchInfo, int candidateIndex) { { CandidateInfo &candidateInfo = touchInfo->candidates[candidateIndex]; delete candidateInfo.inactivityTimer; candidateInfo.inactivityTimer = nullptr; if (candidateInfo.item) { disconnect(candidateInfo.item.data(), nullptr, this, nullptr); } } touchInfo->candidates.removeAt(candidateIndex); } ////////////////////////////////////// TouchRegistry::TouchInfo //////////////////////////////////// TouchRegistry::TouchInfo::TouchInfo(int id) { init(id); } void TouchRegistry::TouchInfo::reset() { id = -1; for (int i = 0; i < candidates.count(); ++i) { CandidateInfo &candidate = candidates[i]; delete candidate.inactivityTimer; candidate.inactivityTimer.clear(); // shoundn't be needed but anyway... } } void TouchRegistry::TouchInfo::init(int id) { this->id = id; physicallyEnded = false; candidates.clear(); watchers.clear(); } bool TouchRegistry::TouchInfo::isOwned() const { return !candidates.isEmpty() && candidates.first().state != CandidateInfo::Undecided; } bool TouchRegistry::TouchInfo::ended() const { Q_ASSERT(isValid()); return physicallyEnded && (isOwned() || candidates.isEmpty()); } void TouchRegistry::TouchInfo::notifyCandidatesOfOwnershipResolution() { Q_ASSERT(isOwned()); UG_DEBUG << "sending TouchOwnershipEvent(id =" << id << " gained) to candidate" << candidates[0].item; TouchOwnershipEvent gainedOwnershipEvent(id, true /*gained*/); QCoreApplication::sendEvent(candidates[0].item, &gainedOwnershipEvent); TouchOwnershipEvent lostOwnershipEvent(id, false /*gained*/); for (int i = 1; i < candidates.count(); ++i) { UG_DEBUG << "sending TouchWonershipEvent(id =" << id << " lost) to candidate" << candidates[i].item; QCoreApplication::sendEvent(candidates[i].item, &lostOwnershipEvent); } } ./src/Ubuntu/UbuntuGestures/timer.h0000644000015600001650000000630612700370701017445 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UBUNTUGESTURES_TIMER_H #define UBUNTUGESTURES_TIMER_H #include "ubuntugesturesglobal.h" #include "timesource.h" #include #include #include namespace UbuntuGestures { /* Defines an interface for a Timer. */ class UBUNTUGESTURES_EXPORT AbstractTimer : public QObject { Q_OBJECT public: AbstractTimer(QObject *parent) : QObject(parent), m_isRunning(false) {} virtual int interval() const = 0; virtual void setInterval(int msecs) = 0; virtual void start() { m_isRunning = true; } virtual void stop() { m_isRunning = false; } bool isRunning() const { return m_isRunning; } virtual bool isSingleShot() const = 0; virtual void setSingleShot(bool value) = 0; Q_SIGNALS: void timeout(); private: bool m_isRunning; }; /* Essentially a QTimer wrapper */ class UBUNTUGESTURES_EXPORT Timer : public AbstractTimer { Q_OBJECT public: Timer(QObject *parent = nullptr); int interval() const override; void setInterval(int msecs) override; void start() override; void stop() override; bool isSingleShot() const override; void setSingleShot(bool value) override; private: QTimer m_timer; }; /* For tests */ class UBUNTUGESTURES_EXPORT FakeTimer : public AbstractTimer { Q_OBJECT public: FakeTimer(const SharedTimeSource &timeSource, QObject *parent = nullptr); void update(); qint64 nextTimeoutTime() const { return m_nextTimeoutTime; } int interval() const override; void setInterval(int msecs) override; void start() override; bool isSingleShot() const override; void setSingleShot(bool value) override; private: int m_interval; bool m_singleShot; SharedTimeSource m_timeSource; qint64 m_nextTimeoutTime; }; class UBUNTUGESTURES_EXPORT AbstractTimerFactory { public: virtual ~AbstractTimerFactory() {} virtual AbstractTimer *createTimer(QObject *parent = nullptr) = 0; }; class UBUNTUGESTURES_EXPORT TimerFactory : public AbstractTimerFactory { public: AbstractTimer *createTimer(QObject *parent = nullptr) override { return new Timer(parent); } }; class UBUNTUGESTURES_EXPORT FakeTimerFactory : public AbstractTimerFactory { public: FakeTimerFactory(); virtual ~FakeTimerFactory() {} void updateTime(qint64 msecsSinceReference); QSharedPointer timeSource() { return m_timeSource; } AbstractTimer *createTimer(QObject *parent = nullptr) override; QList> timers; private: QSharedPointer m_timeSource; }; } // namespace UbuntuGestures #endif // UBUNTUGESTURES_TIMER_H ./src/Ubuntu/UbuntuGestures/timesource.h0000644000015600001650000000341512700370701020502 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by: Daniel d'Andrada */ #ifndef UBUNTUGESTURES_TIMESOURCE_H #define UBUNTUGESTURES_TIMESOURCE_H #include "ubuntugesturesglobal.h" #include namespace UbuntuGestures { /* Interface for a time source. */ class UBUNTUGESTURES_EXPORT TimeSource { public: virtual ~TimeSource() {} /* Returns the current time in milliseconds since some reference time in the past. */ virtual qint64 msecsSinceReference() = 0; }; typedef QSharedPointer SharedTimeSource; /* Implementation of a time source */ class RealTimeSourcePrivate; class UBUNTUGESTURES_EXPORT RealTimeSource : public TimeSource { public: RealTimeSource(); virtual ~RealTimeSource(); qint64 msecsSinceReference() override; private: RealTimeSourcePrivate *d; }; /* A fake time source, useful for tests */ class FakeTimeSource : public TimeSource { public: FakeTimeSource() { m_msecsSinceReference = 0; } qint64 msecsSinceReference() override { return m_msecsSinceReference; } qint64 m_msecsSinceReference; }; } // namespace UbuntuGestures #endif // UBUNTUGESTURES_TIMESOURCE_H ./src/Ubuntu/UbuntuGestures/ubuntugesturesglobal.h0000644000015600001650000000146012700370701022606 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include #if defined(UBUNTUGESTURES_LIBRARY) # define UBUNTUGESTURES_EXPORT Q_DECL_EXPORT #else # define UBUNTUGESTURES_EXPORT Q_DECL_IMPORT #endif ./src/Ubuntu/UbuntuGestures/debughelpers.h0000644000015600001650000000177512700370701021003 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UBUNTUGESTURES_DEBUG_HELPER_H #define UBUNTUGESTURES_DEBUG_HELPER_H #include #include "ubuntugesturesglobal.h" class QMouseEvent; class QTouchEvent; QString touchPointStateToString(Qt::TouchPointState state); QString touchEventToString(const QTouchEvent *ev); QString mouseEventToString(const QMouseEvent *ev); #endif // UBUNTUGESTURES_DEBUG_HELPER_H ./src/Ubuntu/UbuntuGestures/debughelpers.cpp0000644000015600001650000000552412700370701021332 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "debughelpers.h" #include #include QString touchPointStateToString(Qt::TouchPointState state) { switch (state) { case Qt::TouchPointPressed: return QStringLiteral("pressed"); case Qt::TouchPointMoved: return QStringLiteral("moved"); case Qt::TouchPointStationary: return QStringLiteral("stationary"); case Qt::TouchPointReleased: return QStringLiteral("released"); default: return QStringLiteral("INVALID_STATE"); } } QString touchEventToString(const QTouchEvent *ev) { QString message; switch (ev->type()) { case QEvent::TouchBegin: message.append(QStringLiteral("TouchBegin ")); break; case QEvent::TouchUpdate: message.append(QStringLiteral("TouchUpdate ")); break; case QEvent::TouchEnd: message.append(QStringLiteral("TouchEnd ")); break; case QEvent::TouchCancel: message.append(QStringLiteral("TouchCancel ")); break; default: message.append(QStringLiteral("INVALID_TOUCH_EVENT_TYPE ")); } Q_FOREACH(const QTouchEvent::TouchPoint& touchPoint, ev->touchPoints()) { message.append( QStringLiteral("(id:%1, state:%2, scenePos:(%3,%4)) ") .arg(touchPoint.id()) .arg(touchPointStateToString(touchPoint.state())) .arg(touchPoint.scenePos().x()) .arg(touchPoint.scenePos().y()) ); } return message; } QString mouseEventToString(const QMouseEvent *ev) { QString message; switch (ev->type()) { case QEvent::MouseButtonPress: message.append(QStringLiteral("MouseButtonPress ")); break; case QEvent::MouseButtonRelease: message.append(QStringLiteral("MouseButtonRelease ")); break; case QEvent::MouseButtonDblClick: message.append(QStringLiteral("MouseButtonDblClick ")); break; case QEvent::MouseMove: message.append(QStringLiteral("MouseMove ")); break; default: message.append(QStringLiteral("INVALID_MOUSE_EVENT_TYPE ")); } message.append(QStringLiteral("pos(%1, %2)").arg(ev->x()).arg(ev->y())); return message; } ./src/Ubuntu/UbuntuGestures/candidateinactivitytimer.cpp0000644000015600001650000000263512700370701023742 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "candidateinactivitytimer.h" namespace UbuntuGestures { CandidateInactivityTimer::CandidateInactivityTimer(int touchId, QQuickItem *candidate, AbstractTimer *timer, QObject *parent) : QObject(parent) , m_timer(timer) , m_touchId(touchId) , m_candidate(candidate) { connect(m_timer, &AbstractTimer::timeout, this, &CandidateInactivityTimer::onTimeout); m_timer->setInterval(durationMs); m_timer->setSingleShot(true); m_timer->start(); } CandidateInactivityTimer::~CandidateInactivityTimer() { delete m_timer; } void CandidateInactivityTimer::onTimeout() { qWarning("[TouchRegistry] Candidate for touch %d defaulted!", m_touchId); Q_EMIT candidateDefaulted(m_touchId, m_candidate); } } // namespace UbuntuGestures ./src/Ubuntu/UbuntuGestures/touchownershipevent.cpp0000644000015600001650000000216312700370701023000 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "touchownershipevent.h" QEvent::Type TouchOwnershipEvent::m_touchOwnershipType = (QEvent::Type)-1; TouchOwnershipEvent::TouchOwnershipEvent(int touchId, bool gained) : QEvent(touchOwnershipEventType()) , m_touchId(touchId) , m_gained(gained) { } QEvent::Type TouchOwnershipEvent::touchOwnershipEventType() { if (m_touchOwnershipType == (QEvent::Type)-1) { m_touchOwnershipType = (QEvent::Type)registerEventType(); } return m_touchOwnershipType; } ./src/Ubuntu/UbuntuGestures/pool.h0000644000015600001650000000741312700370701017276 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UBUNTUGESTURES_POOL_H #define UBUNTUGESTURES_POOL_H #include #include "ubuntugesturesglobal.h" /* An object pool. Avoids unnecessary creations/initializations and deletions/destructions of items. Useful in a scenario where items are created and destroyed very frequently but the total number of items at any given time remains small. They're stored in a unordered fashion. To be used in Pool, ItemType needs to have the following methods: - ItemType(); A constructor that takes no parameters. An object contructed with it must return false if isValid() is called. - bool isValid() const; Returns wheter the object holds a valid , "filled" state or is empty. Used by Pool to check if the slot occupied by this object is actually available. - void reset(); Resets the object to its initial, empty, state. After calling this method, isValid() must return false. */ template class Pool { public: Pool() : m_lastUsedIndex(-1) { } class Iterator { public: Iterator() : index(-1), item(nullptr) {} Iterator(int index, ItemType *item) : index(index), item(item) {} ItemType *operator->() const { return item; } ItemType &operator*() const { return *item; } ItemType &value() const { return *item; } Iterator &operator= (const Iterator& other) { index = other.index; item = other.item; // by convention, always return *this return *this; } operator bool() const { return item != nullptr; } int index; ItemType *item; }; ItemType &getEmptySlot() { Q_ASSERT(m_lastUsedIndex < m_slots.size()); // Look for an in-between vacancy first for (int i = 0; i < m_lastUsedIndex; ++i) { ItemType &item = m_slots[i]; if (!item.isValid()) { return item; } } ++m_lastUsedIndex; if (m_lastUsedIndex >= m_slots.size()) { m_slots.resize(m_lastUsedIndex + 1); } return m_slots[m_lastUsedIndex]; } void freeSlot(Iterator &iterator) { m_slots[iterator.index].reset(); if (iterator.index == m_lastUsedIndex) { do { --m_lastUsedIndex; } while (m_lastUsedIndex >= 0 && !m_slots.at(m_lastUsedIndex).isValid()); } } // Iterates through all valid items (i.e. the occupied slots) // calling the given function, with the option of ending the loop early. // // bool Func(Iterator& item) // // Returning true means it wants to continue the "for" loop, false // terminates the loop. template void forEach(Func func) { Iterator it; for (it.index = 0; it.index <= m_lastUsedIndex; ++it.index) { it.item = &m_slots[it.index]; if (!it.item->isValid()) continue; if (!func(it)) break; } } bool isEmpty() const { return m_lastUsedIndex == -1; } private: QVector m_slots; int m_lastUsedIndex; }; #endif // UBUNTUGESTURES_POOL_H ./src/Ubuntu/UbuntuGestures/damper_p.h0000644000015600001650000000441312700370701020111 0ustar jenkinsjenkins/* * Copyright (C) 2013 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef UBUNTU_GESTURES_DAMPER_H #define UBUNTU_GESTURES_DAMPER_H #include /* Decreases the oscillations of a value along an axis. */ template class Damper { public: Damper() : m_value(0), m_maxDelta(0) { } // Maximum delta between the raw value and its dampened counterpart. void setMaxDelta(Type maxDelta) { if (maxDelta < 0) qFatal("Damper::maxDelta must be a positive number."); m_maxDelta = maxDelta; } Type maxDelta() const { return m_maxDelta; } void reset(Type value) { m_value = value; } Type update(Type value) { Type delta = value - m_value; if (delta > 0 && delta > m_maxDelta) { m_value += delta - m_maxDelta; } else if (delta < 0 && delta < -m_maxDelta) { m_value += delta + m_maxDelta; } return m_value; } Type value() const { return m_value; } private: Type m_value; Type m_maxDelta; }; /* A point that has its movement dampened. */ class DampedPointF { public: void setMaxDelta(qreal maxDelta) { m_x.setMaxDelta(maxDelta); m_y.setMaxDelta(maxDelta); } qreal maxDelta() const { return m_x.maxDelta(); } void reset(const QPointF &point) { m_x.reset(point.x()); m_y.reset(point.y()); } void update(const QPointF &point) { m_x.update(point.x()); m_y.update(point.y()); } qreal x() const { return m_x.value(); } qreal y() const { return m_y.value(); } private: Damper m_x; Damper m_y; }; QDebug operator<<(QDebug dbg, const DampedPointF &p); #endif // UBUNTU_GESTURES_DAMPER_H ./src/Ubuntu/UbuntuGestures/unownedtouchevent.cpp0000644000015600001650000000226112700370701022440 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "unownedtouchevent.h" QEvent::Type UnownedTouchEvent::m_unownedTouchEventType = (QEvent::Type)-1; UnownedTouchEvent::UnownedTouchEvent(QTouchEvent *touchEvent) : QEvent(unownedTouchEventType()) , m_touchEvent(touchEvent) { } QEvent::Type UnownedTouchEvent::unownedTouchEventType() { if (m_unownedTouchEventType == (QEvent::Type)-1) { m_unownedTouchEventType = (QEvent::Type)registerEventType(); } return m_unownedTouchEventType; } QTouchEvent *UnownedTouchEvent::touchEvent() { return m_touchEvent.data(); } ./src/Ubuntu/UbuntuGestures/touchregistry.h0000644000015600001650000002051312700370701021234 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UNITY_TOUCHREGISTRY_H #define UNITY_TOUCHREGISTRY_H #include #include #include #include #include #include "ubuntugesturesglobal.h" #include "candidateinactivitytimer.h" #include "timer.h" #include "pool.h" // logging #include namespace UbuntuGestures { class AbstractTimerFactory; } /* Where the ownership of touches is registered. Singleton used for adding a touch point ownership model analogous to the one described in the XInput 2.2 protocol[1] on top of the existing input dispatch logic in QQuickWindow. It provides a much more flexible and powerful way of dealing with pointer ownership than the existing mechanisms in Qt. Namely QQuickItem::grabTouchPoints, QuickItem::keepTouchGrab, QQuickItem::setFiltersChildMouseEvents, QQuickItem::ungrabTouchPoints and QQuickItem::touchUngrabEvent. Usage: 1- An item receives a a new touch point. If he's not sure whether he wants it yet, he calls: TouchRegistry::instance()->addCandidateOwnerForTouch(touchId, this); touchEvent->ignore(); Ignoring the event is crucial so that it can be seen by other interested parties, which will behave similarly. 2- That item will then start receiving UnownedTouchEvents for that touch from step 1. Once he's made a decision he calls either: TouchRegistry::instance()->requestTouchOwnership(touchId, this); If he wants the touch point or: TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, this); if he does not want it. Candidates are put in a priority queue. The first one to call addCandidateOwnerForTouch() will take precedence over the others for receiving ownership over the touch point (from now on called simply top-candidate). If the top-candidate calls requestTouchOwnership() he will immediately receive a TouchOwnershipEvent(gained=true) for that touch point. He can then safely call QQuickItem::grabTouchPoints to actually get the owned touch points. The other candidates will receive TouchOwnershipEvent(gained=false) and will no longer receive UnownedTouchEvents for that touch point. They will have to undo whatever action they were performing with that touch point. But if the top-candidate calls removeCandidateOwnerForTouch() instead, he's popped from the candidacy queue and ownership is given to the new top-most candidate if he has already made his decision, that is. The TouchRegistry cannot enforce the results of this pointer ownership negotiation (i.e., who gets to grab the touch points) as that would clash with QQuickWindow's input event dispatching logic. The candidates have to respect the decision and grab the touch points themselves. If an item wants ownership over touches as soon as he receives the TouchBegin for them, his step 1 would be instead: TouchRegistry::instance()->requestTouchOwnership(touchId, this); touchEvent->accept(); He won't get any UnownedTouchEvent for that touch as he is already the interim owner (ie, QQuickWindow will keep sending touch updates to him already). Eventually he will be notified once ownership has been granted to him (from TouchRegistry perspective), from which point onwards he could safely assume other TouchRegistry users wouldn't snatch this touch away from him. Items oblivious to TouchRegistry will lose their touch points without warning, just like in plain Qt. [1] - http://www.x.org/releases/X11R7.7/doc/inputproto/XI2proto.txt (see multitouch-ownership) */ class UBUNTUGESTURES_EXPORT TouchRegistry : public QObject { Q_OBJECT public: virtual ~TouchRegistry(); // Returns a pointer to the application's TouchRegistry instance. static TouchRegistry *instance(); void update(const QTouchEvent *event); // Calls update() if the given event is a QTouchEvent bool eventFilter(QObject *watched, QEvent *event) override; // An item that might later request ownership over the given touch point. // He will be kept informed about that touch point through UnownedTouchEvents // All candidates must eventually decide whether they want to own the touch point // or not. That decision is informed through requestTouchOwnership() or // removeCandidateOwnerForTouch() void addCandidateOwnerForTouch(int id, QQuickItem *candidate); // The same as rejecting ownership of a touch void removeCandidateOwnerForTouch(int id, QQuickItem *candidate); // The candidate object wants to be the owner of the touch with the given id. // If he's currently the oldest/top-most candidate, he will get an ownership // event immediately. If not, he will get ownership if (or once) he becomes the // top-most candidate. void requestTouchOwnership(int id, QQuickItem *candidate); // An item that has no interest (effective or potential) in owning a touch point // but would nonetheless like to be kept up-to-date on its state. void addTouchWatcher(int touchId, QQuickItem *watcherItem); // Useful for tests, where you should use fake timers void setTimerFactory(UbuntuGestures::AbstractTimerFactory *timerFactory); private Q_SLOTS: void rejectCandidateOwnerForTouch(int id, QQuickItem *candidate); private: // Only instance() can cronstruct one TouchRegistry(QObject *parent = nullptr); class CandidateInfo { public: enum { // A candidate owner that doesn't yet know for sure whether he wants the touch point // (gesture recognition is stilll going on) Undecided = 0, // A candidate owner that wants the touch but hasn't been granted it yet, // most likely because there's an undecided candidate with higher priority Requested = 1, // An item that is the interim owner of the touch, receiving QTouchEvents of it // from QQuickWindow. Ie, it's the actual touch owner from Qt's point of view. // It wants to keep its touch ownership but hasn't been granted it by TouchRegistry // yet because of undecided candidates higher up. InterimOwner = 2 } state; QPointer item; QPointer inactivityTimer; }; class TouchInfo { public: TouchInfo() : id(-1) {} TouchInfo(int id); bool isValid() const { return id >= 0; } void reset(); void init(int id); int id; bool physicallyEnded; bool isOwned() const; bool ended() const; void notifyCandidatesOfOwnershipResolution(); // TODO optimize storage (s/QList/Pool) QList candidates; QList> watchers; }; void pruneNullCandidatesForTouch(int touchId); void removeCandidateOwnerForTouchByIndex(Pool::Iterator &touchInfo, int candidateIndex); void removeCandidateHelper(Pool::Iterator &touchInfo, int candidateIndex); Pool::Iterator findTouchInfo(int id); void deliverTouchUpdatesToUndecidedCandidatesAndWatchers(const QTouchEvent *event); static void translateTouchPointFromScreenToWindowCoords(QTouchEvent::TouchPoint &touchPoint); static void dispatchPointsToItem(const QTouchEvent *event, const QList &touchIds, QQuickItem *item); void freeEndedTouchInfos(); Pool m_touchInfoPool; // the singleton instance static TouchRegistry *m_instance; bool m_inDispatchLoop; UbuntuGestures::AbstractTimerFactory *m_timerFactory; friend class tst_TouchRegistry; friend class tst_DirectionalDragArea; }; Q_DECLARE_LOGGING_CATEGORY(ugTouchRegistry) #endif // UNITY_TOUCHREGISTRY_H ./src/Ubuntu/UbuntuGestures/unownedtouchevent.h0000644000015600001650000000274312700370701022112 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UBUNTU_UNOWNEDTOUCHEVENT_H #define UBUNTU_UNOWNEDTOUCHEVENT_H #include #include #include "ubuntugesturesglobal.h" /* A touch event with touch points that do not belong the item receiving it. See TouchRegistry::addCandidateOwnerForTouch and TouchRegistry::addTouchWatcher */ class UBUNTUGESTURES_EXPORT UnownedTouchEvent : public QEvent { public: UnownedTouchEvent(QTouchEvent *touchEvent); static Type unownedTouchEventType(); // TODO: It might be cleaner to store the information directly in UnownedTouchEvent // instead of carrying around a synthesized QTouchEvent. But the latter option // is very convenient. QTouchEvent *touchEvent(); private: static Type m_unownedTouchEventType; QScopedPointer m_touchEvent; }; #endif // UBUNTU_UNOWNEDTOUCHEVENT_H ./src/Ubuntu/UbuntuGestures/timesource.cpp0000644000015600001650000000220612700370701021032 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by: Daniel d'Andrada */ #include "timesource.h" #include namespace UbuntuGestures { class RealTimeSourcePrivate { public: QElapsedTimer timer; }; } using namespace UbuntuGestures; RealTimeSource::RealTimeSource() : UbuntuGestures::TimeSource() , d(new RealTimeSourcePrivate) { d->timer.start(); } RealTimeSource::~RealTimeSource() { delete d; } qint64 RealTimeSource::msecsSinceReference() { return d->timer.elapsed(); } ./src/Ubuntu/UbuntuGestures/ucswipearea_p_p.h0000644000015600001650000001471012700370714021475 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifndef UCSWIPEAREAPRIVATE_H #define UCSWIPEAREAPRIVATE_H #include "ucswipearea_p.h" #include #include "damper_p.h" // Information about an active touch point struct UBUNTUGESTURES_EXPORT ActiveTouchInfo { ActiveTouchInfo() : id(-1), startTime(-1) {} bool isValid() const { return id != -1; } void reset() { id = -1; } int id; qint64 startTime; }; class UBUNTUGESTURES_EXPORT ActiveTouchesInfo { public: ActiveTouchesInfo(const UbuntuGestures::SharedTimeSource &timeSource); void update(QTouchEvent *event); qint64 touchStartTime(int id); bool isEmpty() const { return m_touchInfoPool.isEmpty(); } qint64 mostRecentStartTime(); UbuntuGestures::SharedTimeSource m_timeSource; private: void addTouchPoint(int touchId); void removeTouchPoint(int touchId); QString toString(); Pool m_touchInfoPool; }; class UCSwipeAreaStatusListener; class UBUNTUGESTURES_EXPORT UCSwipeAreaPrivate : public QQuickItemPrivate { Q_DECLARE_PUBLIC(UCSwipeArea) Q_ENUMS(Status) public: UCSwipeAreaPrivate(); void init(); static UCSwipeAreaPrivate *get(UCSwipeArea *area) { return area->d_func(); } void setMaxTime(int value); void setCompositionTime(int value); // Replaces the existing Timer with the given one. // // Useful for providing a fake timer when testing. void setRecognitionTimer(UbuntuGestures::AbstractTimer *timer); // Useful for testing, where a fake time source can be supplied void setTimeSource(const UbuntuGestures::SharedTimeSource &timeSource); // Describes the state of the directional drag gesture. enum Status { // Waiting for a new touch point to land on this area. No gesture is being processed // or tracked. WaitingForTouch, // A touch point has landed on this area but it's not know yet whether it is // performing a drag in the correct direction. // If it's decided that the touch point is not performing a directional drag gesture, // it will be rejected/ignored and status will return to WaitingForTouch. Undecided, //Recognizing, // There's a touch point in this area and it performed a drag in the correct // direction. // // Once recognized, the gesture state will move back to WaitingForTouch only once // that touch point ends. The gesture will remain in the Recognized state even if // the touch point starts moving in other directions or halts. Recognized, }; void touchEvent_absent(QTouchEvent *event); void touchEvent_undecided(QTouchEvent *event); void touchEvent_recognized(QTouchEvent *event); bool movingInRightDirection() const; bool movedFarEnoughAlongGestureAxis() const; bool isPastMaxDistance() const; const QTouchEvent::TouchPoint *fetchTargetTouchPoint(QTouchEvent *event); void setStatus(Status newStatus); void updatePosition(const QPointF &point); void setPublicScenePos(const QPointF &point); bool isWithinTouchCompositionWindow(); void updateSceneDirectionVector(); // returns the scalar projection between the given vector (in scene coordinates) // and m_sceneDirectionVector qreal projectOntoDirectionVector(const QPointF &sceneVector) const; void touchOwnershipEvent(TouchOwnershipEvent *event); void unownedTouchEvent(UnownedTouchEvent *event); void unownedTouchEvent_undecided(UnownedTouchEvent *unownedTouchEvent); void watchPressedTouchPoints(const QList &touchPoints); bool recognitionIsDisabled() const; bool sanityCheckRecognitionProperties(); void setDistanceThreshold(qreal value); void setPixelsPerMm(qreal pixelsPerMm); QString objectName() const { return q_func()->objectName(); } // manage status change listeners void addStatusChangeListener(UCSwipeAreaStatusListener *listener); void removeStatusChangeListener(UCSwipeAreaStatusListener *listener); QPointF startScenePos; // The touch position exposed in the public API. // It only starts to move once the gesture gets recognized. QPointF publicScenePos; // A movement damper is used in some of the gesture recognition calculations // to get rid of noise or small oscillations in the touch position. DampedPointF dampedScenePos; QPointF previousDampedScenePos; // Unit vector in scene coordinates describing the direction of the gesture recognition QPointF sceneDirectionVector; UbuntuGestures::SharedTimeSource timeSource; ActiveTouchesInfo activeTouches; // status change listeners QList statusChangeListeners; UbuntuGestures::AbstractTimer *recognitionTimer; // How far a touch point has to move from its initial position along the gesture axis in order // for it to be recognized as a directional drag. qreal distanceThreshold; qreal distanceThresholdSquared; // it's pow(distanceThreshold, 2) // Maximum distance the gesture can go without crossing the axis-aligned distance threshold qreal maxDistance; qreal sceneDistance; int touchId; // Maximum time (in milliseconds) the gesture can take to go beyond the distance threshold int maxTime; // Maximum time (in milliseconds) after the start of a given touch point where // subsequent touch starts are grouped with the first one into an N-touches gesture // (e.g. a two-fingers tap or drag). int compositionTime; // The current status of the directional drag gesture area. Status status; UCSwipeArea::Direction direction; bool immediateRecognition; bool grabGesture; }; class UBUNTUGESTURES_EXPORT UCSwipeAreaStatusListener { public: virtual void swipeStatusChanged(UCSwipeAreaPrivate::Status /*old*/, UCSwipeAreaPrivate::Status /*new*/) {} }; #endif // UCSWIPEAREAPRIVATE_H ./src/Ubuntu/UbuntuGestures/touchownershipevent.h0000644000015600001650000000261612700370701022450 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UBUNTU_TOUCHOWNERSHIPEVENT_H #define UBUNTU_TOUCHOWNERSHIPEVENT_H #include #include "ubuntugesturesglobal.h" /* When an item get an ownership event for a touch it can grab/steal that touch with a clean conscience. */ class UBUNTUGESTURES_EXPORT TouchOwnershipEvent : public QEvent { public: TouchOwnershipEvent(int touchId, bool gained); static Type touchOwnershipEventType(); /* Whether ownership was gained (true) or lost (false) */ bool gained() const { return m_gained; } /* Id of the touch whose ownership was granted. */ int touchId() const { return m_touchId; } private: static Type m_touchOwnershipType; int m_touchId; bool m_gained; }; #endif // UBUNTU_TOUCHOWNERSHIPEVENT_H ./src/Ubuntu/UbuntuGestures/ucswipearea_p.h0000644000015600001650000000573612700370714021166 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifndef UCSWIPEAREA_H #define UCSWIPEAREA_H #include #include "ubuntugesturesglobal.h" // lib UbuntuGestures #include #include // logging #include class TouchOwnershipEvent; class UnownedTouchEvent; class UCSwipeAreaPrivate; class UCSwipeAreaPrivate; class UBUNTUGESTURES_EXPORT UCSwipeArea : public QQuickItem { Q_OBJECT Q_PROPERTY(Direction direction READ direction WRITE setDirection NOTIFY directionChanged) Q_PROPERTY(qreal distance READ distance NOTIFY distanceChanged) Q_PROPERTY(QPointF touchPosition READ touchPosition NOTIFY touchPositionChanged) Q_PROPERTY(bool dragging READ dragging NOTIFY draggingChanged) Q_PROPERTY(bool pressed READ pressed NOTIFY pressedChanged) Q_PROPERTY(bool immediateRecognition READ immediateRecognition WRITE setImmediateRecognition NOTIFY immediateRecognitionChanged) Q_PROPERTY(bool grabGesture READ grabGesture WRITE setGrabGesture NOTIFY grabGestureChanged FINAL) Q_ENUMS(Direction) public: enum Direction { Rightwards, Leftwards, Downwards, Upwards, Horizontal, Vertical }; UCSwipeArea(QQuickItem *parent = 0); Direction direction() const; void setDirection(Direction); qreal distance() const; QPointF touchPosition() const; bool dragging() const; bool pressed() const; bool immediateRecognition() const; void setImmediateRecognition(bool enabled); bool grabGesture() const; void setGrabGesture(bool enabled); Q_SIGNALS: void directionChanged(Direction direction); void draggingChanged(bool dragging); void pressedChanged(bool pressed); void distanceChanged(qreal distance); void touchPositionChanged(const QPointF &position); void immediateRecognitionChanged(bool immediateRecognition); void grabGestureChanged(bool grabGesture); protected: bool event(QEvent *e) override; void touchEvent(QTouchEvent *event) override; void itemChange(ItemChange change, const ItemChangeData &value) override; // functors void giveUpIfDisabledOrInvisible(); void rejectGesture(); private: Q_DECLARE_PRIVATE(UCSwipeArea) }; Q_DECLARE_LOGGING_CATEGORY(ucSwipeArea) Q_DECLARE_LOGGING_CATEGORY(ucActiveTouchInfo) #endif // UCSWIPEAREA_H ./src/Ubuntu/Components/0000755000015600001650000000000012700370701015270 5ustar jenkinsjenkins./src/Ubuntu/Components/1.0/0000755000015600001650000000000012700370701015566 5ustar jenkinsjenkins./src/Ubuntu/Components/1.0/UbuntuColors.qml0000644000015600001650000000260312700370701020746 0ustar jenkinsjenkins/* Copyright 2013-2014 Canonical Ltd. * This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; version 3. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ pragma Singleton import QtQuick 2.4 /*! \internal Documentation is in UbuntuColors.qml */ QtObject { readonly property color orange: "#DD4814" readonly property color lightAubergine: "#77216F" readonly property color midAubergine: "#5E2750" readonly property color darkAubergine: "#2C001E" readonly property color warmGrey: "#AEA79F" readonly property color coolGrey: "#333333" property Gradient orangeGradient: Gradient { GradientStop { position: 0.0; color: "#DD4814" } GradientStop { position: 1.0; color: "#D9722D" } } property Gradient greyGradient: Gradient { GradientStop { position: 0.0; color: "#888888" } GradientStop { position: 1.0; color: "#BBBBBB" } } } ./src/Ubuntu/Components/1.0/Icon.qml0000644000015600001650000000475312700370701017202 0ustar jenkinsjenkins/* * Copyright (C) 2014 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.4 Item { id: icon property string name /*! \qmlproperty color color */ property alias color: colorizedImage.keyColorOut /*! \qmlproperty color keyColor */ property alias keyColor: colorizedImage.keyColorIn implicitWidth: image.implicitWidth implicitHeight: image.implicitHeight Image { id: image objectName: "image" anchors.fill: parent fillMode: Image.PreserveAspectFit sourceSize { width: icon.width height: icon.height } source: { if (icon.hasOwnProperty("source")) return icon.source; else if (icon.name) return "image://theme/%1".arg(icon.name); else return ""; } cache: true visible: !colorizedImage.visible } ShaderEffect { id: colorizedImage objectName: "shader" anchors.fill: parent // Whether or not a color has been set. visible: image.status == Image.Ready && keyColorOut != Qt.rgba(0.0, 0.0, 0.0, 0.0) property Image source: image property color keyColorOut: Qt.rgba(0.0, 0.0, 0.0, 0.0) property color keyColorIn: "#808080" property real threshold: 0.1 fragmentShader: " varying highp vec2 qt_TexCoord0; uniform sampler2D source; uniform highp vec4 keyColorOut; uniform highp vec4 keyColorIn; uniform lowp float threshold; uniform lowp float qt_Opacity; void main() { lowp vec4 sourceColor = texture2D(source, qt_TexCoord0); gl_FragColor = mix(vec4(keyColorOut.rgb, 1.0) * sourceColor.a, sourceColor, step(threshold, distance(sourceColor.rgb / sourceColor.a, keyColorIn.rgb))) * qt_Opacity; }" } } ./src/Ubuntu/Components/1.0/Button.qml0000644000015600001650000000220712700370701017555 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.0 /*! \internal Documentation in 11/Button.qml */ AbstractButton { id: button property color color: __styleInstance.defaultColor property Gradient gradient: __styleInstance.defaultGradient property font font: __styleInstance ? __styleInstance.defaultFont : Qt.font({family: "Ubuntu", pixelSize: FontUtils.sizeToPixels("medium")}) property string iconPosition: "left" style: Theme.createStyleComponent("ButtonStyle.qml", button) } ./src/Ubuntu/Components/1.0/ProgressBar.qml0000644000015600001650000000351212700370701020533 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import "../1.2" as Internals /*! \qmltype ProgressBar \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The ProgressBar component visually indicates the progress of a process of determinate or indeterminate duration. Example: \qml Item { ProgressBar { id: indeterminateBar indeterminate: true } ProgressBar { id: determinateBar minimumValue: -3.0 maximumValue: 15 } } \endqml */ Internals.AnimatedItem { id: progressBar /*! Specifies whether the progress interval is unknown. When set, altering other properties do not have any effect on the component's behavior. By default the property is set to false. */ property bool indeterminate: false /*! Specifies the minimum value of the progress. */ property real minimumValue: 0.0 /*! Specifies the maximum value of the progress. */ property real maximumValue: 1.0 /*! Specifies the current value of the progress */ property real value: 0.5 style: Theme.createStyleComponent("ProgressBarStyle.qml", progressBar) } ./src/Ubuntu/Components/1.3/0000755000015600001650000000000012700370716015577 5ustar jenkinsjenkins./src/Ubuntu/Components/1.3/CheckBox.qml0000644000015600001650000000273012700370701017774 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype CheckBox \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief CheckBox is a component with two states, checked or unchecked. It can be used to set boolean options. The behavior is the same as \l Switch, the only difference is the graphical style. \l {https://design.ubuntu.com/apps/building-blocks/selection}{See also the Design Guidelines on selection}. Example: \qml Item { CheckBox { checked: true } } \endqml */ AbstractButton { id: checkBox /*! Specifies whether the checkbox is checked or not. By default the property is set to false. */ property bool checked: false /*! \internal */ onTriggered: checked = !checked styleName: "CheckBoxStyle" } ./src/Ubuntu/Components/1.3/Toolbar.qml0000644000015600001650000001175412700370701017716 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 // FIXME: In the example code below, replace the delegate // by the new text button when it becomes available. /*! \qmltype Toolbar \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu \brief Toolbar that can be used as an extension for the edit mode header. Example: \qml PageHeader { id: editHeader property Component delegate: Component { AbstractButton { id: button action: modelData width: label.width + units.gu(4) height: parent.height Rectangle { color: UbuntuColors.slate opacity: 0.1 anchors.fill: parent visible: button.pressed } Label { anchors.centerIn: parent id: label text: action.text font.weight: text === "Confirm" ? Font.Normal : Font.Light } } } leadingActionBar { anchors.leftMargin: 0 actions: Action { text: "Cancel" iconName: "close" } delegate: editHeader.delegate } trailingActionBar { anchors.rightMargin: 0 actions: Action { text: "Confirm" iconName: "tick" } delegate: editHeader.delegate } extension: Toolbar { anchors { left: parent.left right: parent.right bottom: parent.bottom } trailingActionBar.actions: [ Action { iconName: "bookmark-new" }, Action { iconName: "add" }, Action { iconName: "edit-select-all" }, Action { iconName: "edit-copy" }, Action { iconName: "select" } ] leadingActionBar.actions: Action { iconName: "delete" text: "delete" onTriggered: print("Delete action triggered") } } } \endqml See \l PageHeader. */ StyledItem { id: toolbar styleName: "ToolbarStyle" /*! \qmlproperty ActionBar leadingActionBar The leading ActionBar that should hold at most one action. Recommneded for the delete action. Example: \qml Toolbar { leadingActionBar.actions: [ Action { iconName: "delete" text: "Delete" onTriggered: print("delete!") } ] } \endqml See \l ActionBar. */ readonly property alias leadingActionBar: leading ActionBar { id: leading anchors { left: parent.left top: parent.top bottom: parent.bottom leftMargin: units.gu(1) } numberOfSlots: 1 delegate: toolbar.__styleInstance.defaultDelegate Component.onCompleted: { if (actions && actions.length > 1) { print("WARNING: Toolbar with more than one leading actions is not supported."); } } } /*! \qmlproperty ActionBar trailingActionBar The \l ActionBar with trailing actions. Example: \qml Toolbar { trailingActionBar.actions: [ Action { iconName: "bookmark-new" }, Action { iconName: "add" }, Action { iconName: "edit-select-all" }, Action { iconName: "edit-copy" } ] } \endqml The trailing ActionBar may contain up to 8 actions. Scrolling and support for more than 8 actions will be added in the near future. See \l ActionBar. */ readonly property alias trailingActionBar: trailing ActionBar { id: trailing anchors { right: parent.right top: parent.top bottom: parent.bottom rightMargin: units.gu(1) } numberOfSlots: 8 delegate: toolbar.__styleInstance.defaultDelegate Component.onCompleted: { if (actions && actions.length > 8) { print("WARNING: Toolbar with more than one leading actions is not supported."); } } } } ./src/Ubuntu/Components/1.3/dateUtils.js0000644000015600001650000001053312700370701020067 0ustar jenkinsjenkins/* * Copyright 2013-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \qmltype dateUtils \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu \brief Various date utility functions. */ .pragma library /* Extending Date with few prototypes */ Date.msPerDay = 86400e3 Date.msPerWeek = Date.msPerDay * 7 /*! \qmlmethod Date::midnight() The function returns a Date object with the current date and hour set to midnight. */ Date.prototype.midnight = function() { this.setHours(0, 0, 0, 0); return this; } /*! \qmlmethod Date::getInvalidDate() The function returns an invalid date object. Example of use: \code var invalidDate = Date.prototype.getInvalidDate.call(); var otherInvalidDate = (new Date()).getInvalidDate(); \endcode */ Date.prototype.getInvalidDate = function() { return new Date(-1, -1); } /*! \qmlmethod Date::isValid() The function checks whether the date object is a valid one, meaning the year, month and date fields are positive numbers */ Date.prototype.isValid = function() { if (Object.prototype.toString.call(this) !== "[object Date]") { return false; } return (this.getFullYear() > 0) && (this.getMonth() >= 0) && (this.getDate() > 0); } /*! \qmlmethod Date::daysInMonth() The function returns the number of days in the month set in the Date object. */ Date.prototype.daysInMonth = function() { return [ 31/*an*/, 28/*Feb*/, 31/*Mar*/, 30/*Apr*/, 31/*May*/, 30/*Jun*/, 31/*Jul*/, 31/*Aug*/, 30/*Sep*/, 31/*Oct*/, 30/*Nov*/, 31/*Dec*/ ][this.getMonth()] + (this.getMonth() === 1) * this.leapYear(); } /*! \qmlmethod Date::leapYear() The function checks whether the year in the Date object is a leap year or not. */ Date.prototype.leapYear = function() { var year = this.getFullYear(); return year % 400 == 0 || (year % 100 !== 0 && year % 4 == 0); } /*! \qmlmethod Date::monthsTo(date) The function returns the distance in months (not calendaristic months) between the Date object and the given one as parameter. */ Date.prototype.monthsTo = function(target) { return target.getMonth() - this.getMonth() + (12 * (target.getFullYear() - this.getFullYear())); } /*! \qmlmethod Date::daysTo(date) Same as monthsTo, but returns the distance in days. */ Date.prototype.daysTo = function(target) { return !target.isValid() ? 0 : Math.ceil((target - this) / Date.msPerDay); } /*! \qmlmethod Date::hoursTo(date) Same as monthsTo, but returns the distance in hours. */ Date.prototype.hoursTo = function(target) { return !target.isValid() ? 0 : Math.ceil((target.getTime() - this.getTime()) / (1000 * 60 * 60)); } /*! \qmlmethod Date::minutesTo(date) Same as monthsTo, but returns the distance in minutes. */ Date.prototype.minutesTo = function(target) { return !target.isValid() ? 0 : Math.ceil((target.getTime() - this.getTime()) / (1000 * 60)); } /*! \qmlmethod Date::secondsTo(date) Same as monthsTo, but returns the distance in seconds. */ Date.prototype.secondsTo = function(target) { return !target.isValid() ? 0 : Math.ceil((target.getTime() - this.getTime()) / 1000); } /*! \qmlmethod Date::getWeek() The function returns the week number of the date stored in the object. */ Date.prototype.getWeek = function() { // Copy date so don't modify original var date = new Date(this); date.setHours(0, 0, 0, 0); // Set to nearest Thursday: current date + 4 - current day number // Make Sunday's day number 7 date.setDate(date.getDate() + 4 - (date.getDay() || 7)); // Get first day of year var yearStart = new Date(date.getFullYear(), 0, 1); // Calculate full weeks to nearest Thursday var weekNo = Math.ceil((((date - yearStart) / 86400000) + 1) / 7); // Return array of year and week number return weekNo; } ./src/Ubuntu/Components/1.3/PageHeadConfiguration.qml0000644000015600001650000000342512700370701022476 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \internal documented in PageHeadConfiguration.qdoc */ Object { // To be used inside a Page only. id: headerConfig property list actions property Action backAction: null property Item contents: null QtObject { id: internal property Item oldContents: null } onContentsChanged: { if (internal.oldContents) { // FIX: bug #1341814 and #1400297 // We have to force the removal of the previous head.contents // in order to show the new contents internal.oldContents.parent = null; } internal.oldContents = contents; } property string preset: "" /*! \qmlproperty PageHeadSections sections */ readonly property alias sections: headSections PageHeadSections { id: headSections } property color foregroundColor: theme.palette.normal.backgroundText property bool locked: false // auto-updated by AppHeader, but may be set by the developer property bool visible: true property string title property Flickable flickable } ./src/Ubuntu/Components/1.3/TextInputPopover.qml0000644000015600001650000000626712700370701021636 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 Popover { id: popover objectName: "text_input_contextmenu" property Item target property bool canCopy: target && target.selectedText !== "" && !popover.password property bool password: target && target.hasOwnProperty('echoMode') && target.echoMode == TextInput.Password property list actions: [ Action { text: i18n.dtr('ubuntu-ui-toolkit', "Select All") iconName: "edit-select-all" enabled: target && target.text !== "" && target.selectedText === "" visible: target && (target.selectedText === "" || popover.password) onTriggered: target.selectAll() }, Action { text: i18n.dtr('ubuntu-ui-toolkit', "Cut") iconName: "edit-cut" // If paste/editing is not possible, then disable also "Cut" operation // It is applicable for ReadOnly's TextFields and TextAreas enabled: !target.readOnly visible: popover.canCopy onTriggered: { PopupUtils.close(popover); target.cut(); } }, Action { text: i18n.dtr('ubuntu-ui-toolkit', "Copy") iconName: "edit-copy" visible: popover.canCopy onTriggered: { PopupUtils.close(popover); target.copy(); } }, Action { text: i18n.dtr('ubuntu-ui-toolkit', "Paste") iconName: "edit-paste" enabled: target && target.canPaste onTriggered: { PopupUtils.close(popover); target.paste(); } } ] function show() { visible = true; __foreground.show(); // No input focus on the context menu! } // removes hide animation function hide() { popover.visible = false; } autoClose: false contentHeight: row.childrenRect.height + padding * 2 contentWidth: row.childrenRect.width + padding * 2 property int padding: units.gu(1) Row { id: row height: units.gu(6) x: popover.padding y: popover.padding Repeater { model: actions.length AbstractButton { id: button width: Math.max(units.gu(5), implicitWidth) + units.gu(2) height: units.gu(6) action: actions[modelData] styleName: "ToolbarButtonStyle" } } } } ./src/Ubuntu/Components/1.3/TextArea.qml0000644000015600001650000007465012700370701020035 0ustar jenkinsjenkins/* * Copyright 2015-2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 as Ubuntu import Ubuntu.Components.Popups 1.3 /*! \qmltype TextArea \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The TextArea item displays a block of editable, scrollable, formatted text. The TextArea supports fix-size and auto-expanding modes. In fix-size mode the content is scrolled when exceeds the boundaries and can be scrolled both horizontally and vertically, depending on the contentWidth and contentHeight set. The following example will scroll the editing area both horizontally and vertically: \qml TextArea { width: units.gu(20) height: units.gu(12) contentWidth: units.gu(30) contentHeight: units.gu(60) } \endqml The auto-expand mode is realized using two properties: autoSize and maximumLineCount. Setting autoSize will set implicitHeight to one line, and the height will follow the line count, meaning when lines are added the area will expand and when removed the area will shrink. The maximumLineCount specifies how much the editor should be expanded. If this value is set to 0, the area will always expand vertically to fit the content. When autoSize is set, the contentHeight property value is ignored, and the expansion only happens vertically. \qml TextArea { width: units.gu(20) height: units.gu(12) contentWidth: units.gu(30) autoSize: true maximumLineCount: 0 } \endqml TextArea comes with 30 grid-units implicit width and one line height on auto-sizing mode and 4 lines on fixed-mode. The line size is calculated from the font size and the ovarlay and frame spacing specified in the style. \section2 Scrolling and text selection The input is activated when the tap or mouse is released after being pressed over the component. Scrolling the editing area can happen when the size is fixed or in auto-sizing mode when the content size is bigger than the visible area. The scrolling is realized by swipe gestures, or by navigating the cursor. The content can be selected in the following ways: \list \li - double tapping/left mouse clicking over the content, when the word that had been tapped over will be selected \li - by pressing and dragging the selection cursor over the text input. Note that there has to be a delay of approx. 200 ms between the press and drag gesture, time when the input switches from scroll mode to selection mode \endlist The input is focused (activated) upon tap/left mouse button release. The cursor will be placed at the position the mouse/tap point at release time. If the click is happening on a selected area, the selection will be cleared. Long press above a selected area brings up the clipboard context menu. When the long press happens over a non-selected area, the cursor will be moved to the position and the component enters in selection mode. The selection mode can also be activated by tapping and keeping the tap/mouse over for approx 300 ms. If there is a move during this time, the component enters into scrolling mode. The mode is exited once the scrolling finishes. During the scrolling mode the selected text is preserved. \note During text selection all interactive parent Flickables are turned off. */ Ubuntu.StyledItem { id: control implicitWidth: units.gu(30) implicitHeight: (autoSize) ? internal.minimumSize : internal.linesHeight(4) // new properties /*! The property presents whether the TextArea is highlighted or not. By default the TextArea gets highlighted when gets the focus, so can accept text input. This property allows to control the highlight separately from the focused behavior. */ property bool highlighted: activeFocus /*! Text that appears when there is no focus and no content in the component (hint text). \qmlproperty string placeholderText */ property alias placeholderText: hint.text /*! This property contains the text that is displayed on the screen. May differ from the text property value when TextEdit.RichText format is selected. \qmlproperty string displayText */ readonly property alias displayText: internal.displayText /*! The property drives whether text selection should happen with the mouse or not. The default value is true. \qmlproperty bool selectByMouse */ property alias selectByMouse: editor.selectByMouse /*! \deprecated This property specifies whether the text area expands following the entered text or not. The default value is false. The property is deprecated, use autoSize instead */ property bool autoExpand /*! \internal */ onAutoExpandChanged: console.debug("WARNING: autoExpand deprecated, use autoSize instead.") /*! This property specifies whether the text area sizes following the line count or not. The default value is false. */ property bool autoSize: false /*! The property holds the maximum amount of lines to expand when autoSize is enabled. The value of 0 does not put any upper limit and the control will expand forever. The default value is 5 lines. */ property int maximumLineCount: 5 // altered TextEdit properties /*! The property folds the width of the text editing content. This can be equal or bigger than the frame width minus the spacing between the frame and the input area defined in the current theme. The default value is the same as the visible input area's width. */ property real contentWidth: control.width - 2 * internal.frameSpacing /*! The property folds the height of the text editing content. This can be equal or bigger than the frame height minus the spacing between the frame and the input area defined in the current theme. The default value is the same as the visible input area's height. */ property real contentHeight: control.height - 2 * internal.frameSpacing /*! The property overrides the default popover of the TextArea. When set, the TextArea will open the given popover instead of the default one defined. The popover can either be a component or a URL to be loaded. */ property var popover // forwarded properties /*! This property specifies a base URL which is used to resolve relative URLs within the text. The default value is the url of the QML file instantiating the TextArea item. \qmlproperty url baseUrl */ property alias baseUrl: editor.baseUrl /*! Returns true if the TextArea is writable and the content of the clipboard is suitable for pasting into the TextArea. \qmlproperty bool canPaste */ property alias canPaste: editor.canPaste /*! Returns true if the TextArea is writable and there are undone operations that can be redone. \qmlproperty bool canRedo */ property alias canRedo: editor.canRedo /*! Returns true if the TextArea is writable and there are previous operations that can be undone. \qmlproperty bool canUndo */ property alias canUndo: editor.canUndo /*! The text color. \qmlproperty color color */ property alias color: editor.color /*! The delegate for the cursor in the TextArea. If you set a cursorDelegate for a TextArea, this delegate will be used for drawing the cursor instead of the standard cursor. An instance of the delegate will be created and managed by the text edit when a cursor is needed, and the x and y properties of delegate instance will be set so as to be one pixel before the top left of the current character. Note that the root item of the delegate component must be a QQuickItem or QQuickItem derived item. */ property Component cursorDelegate: null /*! The position of the cursor in the TextArea. \qmlproperty int cursorPosition */ property alias cursorPosition: editor.cursorPosition /*! The rectangle where the standard text cursor is rendered within the text edit. Read-only. The position and height of a custom cursorDelegate are updated to follow the cursorRectangle automatically when it changes. The width of the delegate is unaffected by changes in the cursor rectangle. \qmlproperty rectangle cursorRectangle */ property alias cursorRectangle: editor.cursorRectangle /*! If true the text edit shows a cursor. This property is set and unset when the text edit gets active focus, but it can also be set directly (useful, for example, if a KeyProxy might forward keys to it). \qmlproperty bool cursorVisible */ property alias cursorVisible: editor.cursorVisible /*! Presents the effective horizontal alignment that can be different from the one specified at horizontalAlignment due to layout mirroring. \qmlproperty enumeration effectiveHorizontalAlignment */ property alias effectiveHorizontalAlignment: editor.effectiveHorizontalAlignment /*! The property holds the font used by the editing. \qmlproperty font font */ property alias font: editor.font /*! Sets the horizontal alignment of the text within the TextAre item's width and height. By default, the text alignment follows the natural alignment of the text, for example text that is read from left to right will be aligned to the left. Valid values for effectiveHorizontalAlignment are: \list \li TextEdit.AlignLeft (default) \li TextEdit.AlignRight \li TextEdit.AlignHCenter \li TextEdit.AlignJustify \endlist \qmlproperty enumeration horizontalAlignment */ property alias horizontalAlignment: editor.horizontalAlignment /*! This property holds whether the TextArea has partial text input from an input method. While it is composing an input method may rely on mouse or key events from the TextArea to edit or commit the partial text. This property can be used to determine when to disable events handlers that may interfere with the correct operation of an input method. \qmlproperty bool inputMethodComposing */ property alias inputMethodComposing: editor.inputMethodComposing /*! Exposes the QQuickTextDocument which can be used to implement advanced formatting and syntax highlighting (QSyntaxHighlighter) with C++. \qmlproperty var textDocument */ property alias textDocument: editor.textDocument /*! Exposes the paintedWidth of the underlying text component. It's required if the application uses its own Flickable for scrolling. */ readonly property real paintedWidth: editor.paintedWidth + internal.frameSpacing /*! Exposes the paintedHeight of the underlying text component. It's required if the application uses its own Flickable for scrolling. */ readonly property real paintedHeight: editor.paintedHeight + internal.frameSpacing /*! Provides hints to the input method about the expected content of the text edit and how it should operate. The value is a bit-wise combination of flags or Qt.ImhNone if no hints are set. Flags that alter behaviour are: \list \li Qt.ImhHiddenText - Characters should be hidden, as is typically used when entering passwords. \li Qt.ImhSensitiveData - Typed text should not be stored by the active input method in any persistent storage like predictive user dictionary. \li Qt.ImhNoAutoUppercase - The input method should not try to automatically switch to upper case when a sentence ends. \li Qt.ImhPreferNumbers - Numbers are preferred (but not required). \li Qt.ImhPreferUppercase - Upper case letters are preferred (but not required). \li Qt.ImhPreferLowercase - Lower case letters are preferred (but not required). \li Qt.ImhNoPredictiveText - Do not use predictive text (i.e. dictionary lookup) while typing. \li Qt.ImhDate - The text editor functions as a date field. \li Qt.ImhTime - The text editor functions as a time field. \endlist Flags that restrict input (exclusive flags) are: \list \li Qt.ImhDigitsOnly - Only digits are allowed. \li Qt.ImhFormattedNumbersOnly - Only number input is allowed. This includes decimal point and minus sign. \li Qt.ImhUppercaseOnly - Only upper case letter input is allowed. \li Qt.ImhLowercaseOnly - Only lower case letter input is allowed. \li Qt.ImhDialableCharactersOnly - Only characters suitable for phone dialing are allowed. \li Qt.ImhEmailCharactersOnly - Only characters suitable for email addresses are allowed. \li Qt.ImhUrlCharactersOnly - Only characters suitable for URLs are allowed. \endlist Masks: \list \li Qt.ImhExclusiveInputMask - This mask yields nonzero if any of the exclusive flags are used. \endlist \qmlproperty enumeration inputMethodHints */ property alias inputMethodHints: editor.inputMethodHints /*! Returns the total number of plain text characters in the TextArea item. As this number doesn't include any formatting markup it may not be the same as the length of the string returned by the text property. This property can be faster than querying the length the text property as it doesn't require any copying or conversion of the TextArea's internal string data. \qmlproperty int length */ property alias length: editor.length /*! Returns the total number of lines in the TextArea item. \qmlproperty int lineCount */ property alias lineCount: editor.lineCount /*! Specifies how text should be selected using a mouse. \list \li TextEdit.SelectCharacters - The selection is updated with individual characters. (Default) \li TextEdit.SelectWords - The selection is updated with whole words. \endlist This property only applies when selectByMouse is true. \qmlproperty enumeration mouseSelectionMode */ property alias mouseSelectionMode: editor.mouseSelectionMode /*! Whether the TextArea should keep the selection visible when it loses active focus to another item in the scene. By default this is set to true; \qmlproperty enumeration persistentSelection */ property alias persistentSelection: editor.persistentSelection /*! Whether the user can interact with the TextArea item. If this property is set to true the text cannot be edited by user interaction. By default this property is false. \qmlproperty bool readOnly */ property alias readOnly: editor.readOnly /*! Override the default rendering type for this component. Supported render types are: \list \li Text.QtRendering - the default \li Text.NativeRendering \endlist Select Text.NativeRendering if you prefer text to look native on the target platform and do not require advanced features such as transformation of the text. Using such features in combination with the NativeRendering render type will lend poor and sometimes pixelated results. \qmlproperty enumeration renderType */ property alias renderType: editor.renderType /*! This read-only property provides the text currently selected in the text edit. \qmlproperty string selectedText */ property alias selectedText: editor.selectedText /*! The selected text color, used in selections. \qmlproperty color selectedTextColor */ property alias selectedTextColor: editor.selectedTextColor /*! The text highlight color, used behind selections. \qmlproperty color selectionColor */ property alias selectionColor: editor.selectionColor /*! The cursor position after the last character in the current selection. This property is read-only. To change the selection, use select(start, end), selectAll(), or selectWord(). See also selectionStart, cursorPosition, and selectedText. \qmlproperty int selectionEnd */ property alias selectionEnd: editor.selectionEnd /*! The cursor position before the first character in the current selection. This property is read-only. To change the selection, use select(start, end), selectAll(), or selectWord(). See also selectionEnd, cursorPosition, and selectedText. \qmlproperty int selectionStart */ property alias selectionStart: editor.selectionStart /*! The text to display. If the text format is AutoText the text edit will automatically determine whether the text should be treated as rich text. This determination is made using Qt::mightBeRichText(). \qmlproperty string text */ property alias text: editor.text /*! The way the text property should be displayed. \list \li TextEdit.AutoText \li TextEdit.PlainText \li TextEdit.RichText \endlist The default is TextEdit.PlainText. If the text format is TextEdit.AutoText the text edit will automatically determine whether the text should be treated as rich text. This determination is made using Qt::mightBeRichText(). \qmlproperty enumeration textFormat */ property alias textFormat: editor.textFormat /*! Sets the vertical alignment of the text within the TextAres item's width and height. By default, the text alignment follows the natural alignment of the text. Valid values for verticalAlignment are: \list \li TextEdit.AlignTop (default) \li TextEdit.AlignBottom \li TextEdit.AlignVCenter \endlist \qmlproperty enumeration verticalAlignment */ property alias verticalAlignment: editor.verticalAlignment /*! Set this property to wrap the text to the TextEdit item's width. The text will only wrap if an explicit width has been set. \list \li TextEdit.NoWrap - no wrapping will be performed. If the text contains insufficient newlines, then implicitWidth will exceed a set width. \li TextEdit.WordWrap - wrapping is done on word boundaries only. If a word is too long, implicitWidth will exceed a set width. \li TextEdit.WrapAnywhere - wrapping is done at any point on a line, even if it occurs in the middle of a word. \li TextEdit.Wrap - if possible, wrapping occurs at a word boundary; otherwise it will occur at the appropriate point on the line, even in the middle of a word. \endlist The default is TextEdit.Wrap \qmlproperty enumeration wrapMode */ property alias wrapMode:editor.wrapMode /*! Whether the TextArea should gain active focus on a mouse press. By default this is set to true. \qmlproperty bool activeFocusOnPress */ property alias activeFocusOnPress: editor.activeFocusOnPress // signals /*! This handler is called when the user clicks on a link embedded in the text. The link must be in rich text or HTML format and the link string provides access to the particular link. */ signal linkActivated(string link) // functions /*! Copies the currently selected text to the system clipboard. */ function copy() { editor.copy(); } /*! Moves the currently selected text to the system clipboard. */ function cut() { editor.cut(); } /*! Removes active text selection. */ function deselect() { editor.deselect(); } /*! Inserts text into the TextArea at position. */ function insert(position, text) { editor.insert(position, text); } /*! Returns the text position closest to pixel position (x, y). Position 0 is before the first character, position 1 is after the first character but before the second, and so on until position text.length, which is after all characters. */ function positionAt(x, y) { return editor.positionAt(x, y); } /*! Returns true if the natural reading direction of the editor text found between positions start and end is right to left. */ function isRightToLeft(start, end) { return editor.isRightToLeft(start, end) } /*! Moves the cursor to position and updates the selection according to the optional mode parameter. (To only move the cursor, set the cursorPosition property.) When this method is called it additionally sets either the selectionStart or the selectionEnd (whichever was at the previous cursor position) to the specified position. This allows you to easily extend and contract the selected text range. The selection mode specifies whether the selection is updated on a per character or a per word basis. If not specified the selection mode will default to whatever is given in the mouseSelectionMode property. */ function moveCursorSelection(position, mode) { if (mode === undefined) editor.moveCursorSelection(position, mouseSelectionMode); else editor.moveCursorSelection(position, mode); } /*! Places the clipboard or the data given as parameter into the text input. The selected text will be replaces with the data. */ function paste(data) { if ((data !== undefined) && (typeof data === "string") && !editor.readOnly) { var selTxt = editor.selectedText; var txt = editor.text; var pos = (selTxt !== "") ? txt.indexOf(selTxt) : editor.cursorPosition if (selTxt !== "") { editor.text = txt.substring(0, pos) + data + txt.substr(pos + selTxt.length); } else { editor.text = txt.substring(0, pos) + data + txt.substr(pos); } editor.cursorPosition = pos + data.length; } else editor.paste(); } /*! Returns the rectangle at the given position in the text. The x, y, and height properties correspond to the cursor that would describe that position. */ function positionToRectangle(position) { return editor.positionToRectangle(position); } /*! Redoes the last operation if redo is \l{canRedo}{available}. */ function redo() { editor.redo(); } /*! Causes the text from start to end to be selected. If either start or end is out of range, the selection is not changed. After calling this, selectionStart will become the lesser and selectionEnd will become the greater (regardless of the order passed to this method). See also selectionStart and selectionEnd. */ function select(start, end) { editor.select(start, end); } /*! Causes all text to be selected. */ function selectAll() { editor.selectAll(); } /*! Causes the word closest to the current cursor position to be selected. */ function selectWord() { editor.selectWord(); } /*! Returns the section of text that is between the start and end positions. The returned text will be formatted according the textFormat property. */ function getFormattedText(start, end) { return editor.getFormattedText(start, end); } /*! Returns the section of text that is between the start and end positions. The returned text does not include any rich text formatting. A getText(0, length) will result in the same value as displayText. */ function getText(start, end) { return editor.getText(start, end); } /*! Removes the section of text that is between the start and end positions from the TextArea. */ function remove(start, end) { return editor.remove(start, end); } /*! Undoes the last operation if undo is \l{canUndo}{available}. Deselects any current selection, and updates the selection start to the current cursor position. */ function undo() { editor.undo(); } // logic /*!\internal - to remove warnings */ Component.onCompleted: { editor.linkActivated.connect(control.linkActivated); } // activation area on mouse click // the editor activates automatically when pressed in the editor control, // however that one can be slightly spaced to the main control area MouseArea { anchors.fill: parent enabled: internal.frameSpacing > 0 acceptedButtons: Qt.LeftButton | Qt.RightButton // activate input when pressed on the frame preventStealing: false Ubuntu.Mouse.forwardTo: [inputHandler] cursorShape: Qt.IBeamCursor } //internals activeFocusOnPress: true activeFocusOnTab: true /*!\internal */ onVisibleChanged: { if (!visible) control.focus = false; } // Escape should close the context menu even if the menu takes no input focus Keys.onEscapePressed: { if (activeFocus && inputHandler.popover) { PopupUtils.close(inputHandler.popover) } else { event.accepted = false } } LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft LayoutMirroring.childrenInherit: true QtObject { id: internal // public property locals enabling aliasing property string displayText: editor.getText(0, editor.length) property real frameSpacing: control.__styleInstance.frameSpacing property real minimumSize: units.gu(4) function linesHeight(lines) { return inputHandler.lineSize * lines + 2 * frameSpacing; } function frameSize() { if (control.autoSize) { var max = (control.maximumLineCount <= 0) ? control.lineCount : Math.min(control.maximumLineCount, control.lineCount); control.height = linesHeight(Ubuntu.MathUtils.clamp(control.lineCount, 1, max)); } } } // grab Enter/Return keys which may be stolen from parent components of TextArea // due to forwarded keys from TextEdit Keys.onPressed: { if (readOnly) return; if ((event.key === Qt.Key_Enter) || (event.key === Qt.Key_Return)) { if (editor.textFormat === TextEdit.RichText) { // FIXME: use control.paste("
") instead when paste() gets sich text support editor.insert(editor.cursorPosition, "
"); } else { control.paste("\n"); } event.accepted = true; } else { event.accepted = false; } } Keys.onReleased: event.accepted = (event.key === Qt.Key_Enter) || (event.key === Qt.Key_Return) // holding default values Ubuntu.Label { id: fontHolder } //hint Ubuntu.Label { id: hint anchors { fill: parent margins: internal.frameSpacing } // hint is shown till user types something in the field visible: (editor.text == "") && !editor.inputMethodComposing color: theme.palette.normal.base font: editor.font elide: Text.ElideRight wrapMode: Text.WordWrap } //scrollbars and flickable Scrollbar { id: rightScrollbar flickableItem: flicker } Scrollbar { id: bottomScrollbar flickableItem: flicker align: Qt.AlignBottom } Flickable { id: flicker objectName: "input_scroller" anchors { fill: parent margins: internal.frameSpacing } clip: true contentWidth: editor.paintedWidth contentHeight: editor.paintedHeight // do not allow rebounding boundsBehavior: Flickable.StopAtBounds // editor // Images are not shown when text contains tags // bug to watch: https://bugreports.qt-project.org/browse/QTBUG-27071 TextEdit { objectName: "text_input" readOnly: false id: editor focus: true width: control.contentWidth height: Math.max(control.contentHeight, editor.contentHeight) wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere mouseSelectionMode: TextEdit.SelectWords selectByMouse: true activeFocusOnPress: true onActiveFocusChanged: if (!activeFocus && inputHandler.popover) PopupUtils.close(inputHandler.popover) cursorDelegate: TextCursor { handler: inputHandler } color: control.__styleInstance.color selectedTextColor: control.__styleInstance.selectedTextColor selectionColor: control.__styleInstance.selectionColor font.pixelSize: FontUtils.sizeToPixels("medium") // forward keys to the root element so it can be captured outside of it // as well as to InputHandler to handle PageUp/PageDown keys Keys.forwardTo: [control, inputHandler] // autosize handling onLineCountChanged: internal.frameSize() // input selection and navigation handling Ubuntu.Mouse.forwardTo: [inputHandler] InputHandler { id: inputHandler anchors.fill: parent main: control input: editor flickable: flicker } } } styleName: "TextAreaStyle" } ./src/Ubuntu/Components/1.3/Scrollbar.qml0000644000015600001650000003051012700370714020232 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 as Toolkit /*! \qmltype Scrollbar \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The Scrollbar component provides scrolling functionality for scrollable views (i.e. Flickable, ListView). \b NOTE: the Scrollbar component was revamped for OTA9 and used for the implementation of \l ScrollView. Apps targeting system version OTA9 (or newer) should use ScrollView instead of Scrollbar, as it features convergent-ready features, such as (but not limited to) keyboard input handling. The Scrollbar can be set to any flickable and has built-in anchoring setup to the attached flickable's front, rear, top or bottom. The scrollbar can also be aligned using anchors, however the built-in align functionality makes sure to have the proper alignemt applied based on theme and layout direction (RTL or LTR). The content position is driven through the attached Flickable. Therefore every style implementation should drive the position through contentX/contentY properties, depending on whether the orientation is vertical or horizontal. Example: \qml Item { ListView { id: list width: units.gu(37) height: units.gu(37) model: 30 delegate: Rectangle { width: ListView.view.width height: units.gu(5) Text { anchors.fill: parent text: "Item " + modelData } } } Scrollbar { flickableItem: list align: Qt.AlignTrailing } } \endqml \section1 Vertical Scrollbar and Flickable behaviour Since Flickable's topMargin and bottomMargin are modified by Ubuntu components such as \l BottomEdgeHint and \l Header in their positioning logic, the Scrollbar component uses the value of those properties to its top and bottom anchors margins, by default. This is to prevent any overlap with BottomEdgeHint or Header (see \l {Vertical Scrollbar and Header behaviour} for more info about that). In case you need to specify custom Flickable content margins (note: we're talking about content margins, not anchors ones), you will also have to override the top and bottom anchors margins of the Scrollbar accordingly. \section1 Vertical Scrollbar and Header behaviour The thumb of the Scrollbar should not move or resize unexpectedly. It would be confusing, for instance, if it moved under the user's finger (or pointer) while he's dragging it. Because the size and position of the thumb in a scrollbar is related to the size of the trough (or track) it slides in, it is important that the trough does not resize or move while the user is interacting with the component. In the context of a \l Page with a \l Header that slides in and out dynamically when the user flicks the surface (see \l {Header::flickable}), a vertical Scrollbar that is linked to the same flickable surface as the Header behaves as described below: \list \li - when the Header is exposed, the Scrollbar component sits right below it, \ thus avoiding overlaps; \li - when the Header hides due to the user either flicking the surface or dragging \ the thumb, the trough of the Scrollbar does not resize or move, thus avoiding \ unexpected changes in thumb's position or size. As a side effect, the space \ above the Scrollbar, previously occupied by Header, stays empty until the Header \ is exposed again. \endlist \br This behaviour is intended and makes for a less confusing User Experience. */ Toolkit.StyledItem { id: scrollbar /*! \qmlproperty Flickable Scrollbar::flickableItem This property holds the flickable item (Flickable, ListView or GridView) the Scrollbar is attached to. */ property Flickable flickableItem: null /* This property holds the other scrollbar that is attached to the same flickable, if any. For instance, if this scrollbar is horizontal, buddyScrollbar must be set to the vertical scrollbar, if any. This is to allow a correct layout of both horizontal and vertical scrollbars when a view is scrollable in both directions. */ //can't use property Scrollbar here as it would complain "Scrollbar instantiated recursively" property var __buddyScrollbar: null /*! \qmlproperty int Scrollbar::align The property defines the alignment of the scrollbar to the flickableItem. The implementation handles the alignment as follows: \list \li Qt.AlignLeading anchors to the left on LTR and to the right on RTL layouts \li Qt.AlignTrailing anchors to the right on LTR and to the left on RTL layouts \li Qt.AlignTop anchors to the top \li Qt.AlignBottom anchors to the bottom \endlist The default value is \b Qt.AlignTrailing. */ property int align: Qt.AlignTrailing /*! \internal This property holds whether the scrollbar is active or passive. It is present for testing purposes. */ property bool __interactive: __styleInstance !== null && __styleInstance.interactive /*! \internal This trough of the scrollbar, it is used to define the position of the slider. */ property Item __trough: __styleInstance !== null && __styleInstance.trough /*! \internal simulate the system setting (which will be implemented in unity8, I guess) True --> Steppers style, non-overlay scrollbars False --> Indicator and Trough styles CURRENTLY UNUSED */ property bool __alwaysOnScrollbars: false /*! internal Used by ScrollView to tweak Scrollbar's anchoring logic for the always-on scrollbars. CURRENTLY UNUSED */ property Item __viewport: null //Disable the input handling to let the events pass through in case we have an //interactive scrollbar right below us (can happen with nested views) enabled: __interactive//&& __alwaysOnScrollbars implicitWidth: internals.vertical ? units.gu(3) : (flickableItem ? flickableItem.width : 0) implicitHeight: !internals.vertical ? units.gu(3) : (flickableItem ? flickableItem.height : 0) anchors { left: (__viewport || flickableItem) ? internals.leftAnchor(__viewport ? __viewport : flickableItem) : undefined leftMargin: internals.leftAnchorMargin() right: (__viewport || flickableItem) ? internals.rightAnchor(__viewport ? __viewport : flickableItem) : undefined rightMargin: internals.rightAnchorMargin() top: (__viewport || flickableItem) ? internals.topAnchor(__viewport ? __viewport : flickableItem) : undefined topMargin: (flickableItem ? flickableItem.topMargin : 0) + internals.topAnchorMargin() bottom: (__viewport || flickableItem) ? internals.bottomAnchor(__viewport ? __viewport : flickableItem) : undefined bottomMargin: (flickableItem ? flickableItem.bottomMargin : 0) + internals.bottomAnchorMargin() } /*! \internal */ onAlignChanged: if (!internals.checkAlign()) console.log("Wrong alignment set to Scrollbar: "+align) /*! \internal Internals: contains the common logic of the scrollbar like anchoring, alignemt check, scrollability check. */ property alias __private: internals QtObject { id: internals property bool vertical: (align === Qt.AlignLeading) || (align === Qt.AlignTrailing) property bool scrollable: flickableItem && flickableItem.interactive && checkAlign() property real nonOverlayScrollbarMargin: __styleInstance ? __styleInstance.nonOverlayScrollbarMargin : 0 function checkAlign() { return (align === Qt.AlignLeading) || (align === Qt.AlignTrailing) || (align === Qt.AlignTop) || (align === Qt.AlignBottom); } // LTR and RTL are provided by LayoutMirroring, so no need to check that function leftAnchor(object) { if (!internals.vertical || (align == Qt.AlignLeading)) { return object.left; } return undefined; } function leftAnchorMargin() { if (__styleInstance === null) return 0 switch (align) { case Qt.AlignLeading: return __alwaysOnScrollbars ? -nonOverlayScrollbarMargin : 0 case Qt.AlignBottom: case Qt.AlignTop: if (!__alwaysOnScrollbars && __buddyScrollbar !== null && __buddyScrollbar.align === Qt.AlignLeading && __buddyScrollbar.__styleInstance.isScrollable) return __buddyScrollbar.__styleInstance.troughThicknessSteppersStyle // *ELSE FALLTHROUGH* default: return 0 } } function rightAnchor(object) { if (!internals.vertical || (align == Qt.AlignTrailing)) { return object.right; } return undefined; } function rightAnchorMargin() { if (__styleInstance === null) return 0 switch (align) { case Qt.AlignTrailing: return __alwaysOnScrollbars ? -nonOverlayScrollbarMargin : 0 case Qt.AlignBottom: case Qt.AlignTop: if (!__alwaysOnScrollbars && __buddyScrollbar !== null && __buddyScrollbar.align === Qt.AlignTrailing && __buddyScrollbar.__styleInstance.isScrollable) return __buddyScrollbar.__styleInstance.troughThicknessSteppersStyle // *ELSE FALLTHROUGH* default: return 0 } } function topAnchor(object) { if (internals.vertical || (align == Qt.AlignTop)) return object.top; return undefined; } function topAnchorMargin() { if (__styleInstance === null) return 0 switch (align) { case Qt.AlignTop: return __alwaysOnScrollbars ? -nonOverlayScrollbarMargin : 0 case Qt.AlignLeading: case Qt.AlignTrailing: if (!__alwaysOnScrollbars && __buddyScrollbar !== null && __buddyScrollbar.align === Qt.AlignTop && __buddyScrollbar.__styleInstance.isScrollable) return __buddyScrollbar.__styleInstance.troughThicknessSteppersStyle // *ELSE FALLTHROUGH* default: return 0 } } function bottomAnchor(object) { if (internals.vertical || (align == Qt.AlignBottom)) return object.bottom; return undefined; } function bottomAnchorMargin() { if (__styleInstance === null) return 0 switch (align) { case Qt.AlignBottom: return __alwaysOnScrollbars ? -nonOverlayScrollbarMargin : 0 case Qt.AlignLeading: case Qt.AlignTrailing: if (!__alwaysOnScrollbars && __buddyScrollbar !== null && __buddyScrollbar.align === Qt.AlignBottom && __buddyScrollbar.__styleInstance.isScrollable) return __buddyScrollbar.__styleInstance.troughThicknessSteppersStyle // *ELSE FALLTHROUGH* default: return 0 } } } styleName: "ScrollbarStyle" } ./src/Ubuntu/Components/1.3/AnimatedItem.qml0000644000015600001650000000227712700370701020655 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \qmltype AnimatedItem \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The AnimatedItem drives the animated components behavior inside a Flickable. Reports whether the component whos parent is a Flickable is in the visible area or not, so derived components can pause animations while off-screen. */ import QtQuick 2.4 import Ubuntu.Components 1.3 StyledItem { id: root /*! \deprecated Specifies whether the component is on the visible area of the Flickable or not. */ property bool onScreen: true } ./src/Ubuntu/Components/1.3/CrossFadeImage.qdoc0000644000015600001650000000550212700370701021257 0ustar jenkinsjenkins/*! \qmltype CrossFadeImage \ingroup ubuntu \brief An Image like component which smoothly fades when its source is updated. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 CrossFadeImage { width: units.gu(100) height: units.gu(75) source: "http://design.ubuntu.com/wp-content/uploads/ubuntu-logo14.png" fadeDuration: 1000 MouseArea { anchors.fill: parent onClicked: parent.source = "http://design.ubuntu.com/wp-content/uploads/canonical-logo1.png" } } \endqml */ /*! \qmlproperty url CrossFadeImage::source The image being displayed. Can be a URL to any image format supported by Qt. */ /*! \qmlproperty enumeration CrossFadeImage::fillMode Defaults to \c Image.PreserveAspectFit \list \li Image.Stretch - the image is scaled to fit \li Image.PreserveAspectFit - the image is scaled uniformly to fit without cropping \li Image.PreserveAspectCrop - the image is scaled uniformly to fill, cropping if necessary \li Image.Tile - the image is duplicated horizontally and vertically \li Image.TileVertically - the image is stretched horizontally and tiled vertically \li Image.TileHorizontally - the image is stretched vertically and tiled horizontally \li Image.Pad - the image is not transformed \endlist */ /*! \qmlproperty int CrossFadeImage::fadeDuration The time over which to fade between images. Defaults to \c UbuntuAnimation.FastDuration. \sa UbuntuAnimation */ /*! \since Ubuntu.Components 1.1 \qmlproperty string CrossFadeImage::fadeStyle Style of the fade effect Defaults to \c overlay \list \li overlay - the new fading image overlays the current one \li cross - the current one fades out while the new image fades in \endlist */ /*! \qmlproperty bool CrossFadeImage::running Whether the animation is running */ /*! \qmlproperty size CrossFadeImage::sourceSize The actual width and height of the loaded image This property holds the actual width and height of the loaded image. Unlike the width and height properties, which scale the painting of the image, this property sets the actual number of pixels stored for the loaded image so that large images do not use more memory than necessary. Note: Changing this property dynamically causes the image source to be reloaded, potentially even from the network, if it is not in the disk cache. */ /*! \qmlproperty enumeration CrossFadeImage::status This property holds the status of image loading. It can be one of: \list \li Image.Null - no image has been set \li Image.Ready - the image has been loaded \li Image.Loading - the image is currently being loaded \li Image.Error - an error occurred while loading the image \endlist */ ./src/Ubuntu/Components/1.3/UbuntuColors.qml0000644000015600001650000001163112700370701020752 0ustar jenkinsjenkins/* Copyright 2016 Canonical Ltd. * This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; version 3. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ pragma Singleton import QtQuick 2.4 /*! \qmltype UbuntuColors \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu \brief Singleton defining the Ubuntu color palette. Each color of the Ubuntu color palette is accesible from it. For more information on how to appropriately use the colors according to the context, please refer to the \l{http://design.ubuntu.com/brand/colour-palette}{Ubuntu brand guidelines}. Example of use: \qml Rectangle { color: UbuntuColors.orange } \endqml */ QtObject { /*--------------------------------------------------------------- Deprecated colors ---------------------------------------------------------------*/ /*! \deprecated Ubuntu supporting color: light aubergine */ readonly property color lightAubergine: "#77216F" /*! \deprecated Ubuntu supporting color: mid aubergine */ readonly property color midAubergine: "#5E2750" /*! \deprecated Ubuntu supporting color: dark aubergine */ readonly property color darkAubergine: "#2C001E" /*! \deprecated Ubuntu neutral color: warm grey */ readonly property color warmGrey: "#AEA79F" /*! \deprecated Ubuntu neutral color: cool grey */ readonly property color coolGrey: "#333333" /*! Ubuntu orange gradient \deprecated \sa Button::gradient */ property Gradient orangeGradient: Gradient { GradientStop { position: 0.0; color: "#DD4814" } GradientStop { position: 1.0; color: "#D9722D" } } /*! Ubuntu grey gradient \deprecated \sa Button::gradient */ property Gradient greyGradient: Gradient { GradientStop { position: 0.0; color: "#888888" } GradientStop { position: 1.0; color: "#BBBBBB" } } /*--------------------------------------------------------------- Supported colors ---------------------------------------------------------------*/ /*! Orange. Recommended for branded elements, display progress and intensity, textual links on light backgrounds. */ readonly property color orange: "#E95420" /*! \deprecated Light grey. Recommended for neutral action buttons and secondary text. \since Ubuntu.Components 1.1 */ readonly property color lightGrey: "#cdcdcd" /*! Silk. Recommended for neutral action buttons and secondary text. \since Ubuntu.Components 1.3 */ readonly property color silk: "#cdcdcd" /*! \deprecated Dark grey. Recommended for text and action icons. \since Ubuntu.Components 1.1 */ readonly property color darkGrey: "#5d5d5d" /*! Slate. Recommended for text and action icons. \since Ubuntu.Components 1.3 */ readonly property color slate: "#5d5d5d" /*! Red. Recommended for negative and irreversible action buttons, errors and alerts. \since Ubuntu.Components 1.1 */ readonly property color red: "#ed3146" /*! Green. Recommended for positive action buttons. \since Ubuntu.Components 1.1 */ readonly property color green: "#3eb34f" /*! Blue. Recommended for text selection and text cursor. \since Ubuntu.Components 1.1 */ readonly property color blue: "#19b6ee" /*! Purple. Recommended for proper nouns in list items. \since Ubuntu.Components 1.1 */ readonly property color purple: "#762572" /*! Porcelain. Recommended for foregrounds. \since Ubuntu.Components 1.3 */ readonly property color porcelain: "#f7f7f7" /*! Ash. Recommended for subtitles and other tertiary content. \since Ubuntu.Components 1.3 */ readonly property color ash: "#888888" /*! Graphite. Recommended for coloring dark themes' background. \since Ubuntu.Components 1.3 */ readonly property color graphite: "#666666" /*! Inkstone. Recommended for foreground colors in dark themes. \since Ubuntu.Components 1.3 */ readonly property color inkstone: "#3b3b3b" /*! Jet. Recommended for content coloring. \since Ubuntu.Components 1.3 */ readonly property color jet: "#111111" } ./src/Ubuntu/Components/1.3/OptionSelector.qml0000644000015600001650000002414412700370701021262 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components.ListItems 1.3 as ListItem import Ubuntu.Components 1.3 as Toolkit /*! \qmltype OptionSelector \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu-components \brief Component displaying either a single selected value or expanded multiple choice with an optional image and subtext when not expanded, when expanding it opens a listing of all the possible values for selection with an additional option of always being expanded. If multiple choice is selected the list is expanded automatically. Examples: \qml import Ubuntu.Components 1.3 Column { spacing: units.gu(3) OptionSelector { text: i18n.tr("Label") model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } OptionSelector { text: i18n.tr("Label") expanded: true model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } OptionSelector { objectName: "optionselector_multipleselection" text: i18n.tr("Multiple Selection") expanded: false multiSelection: true model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } OptionSelector { text: i18n.tr("Label") model: customModel expanded: true colourImage: true delegate: selectorDelegate } Component { id: selectorDelegate OptionSelectorDelegate { text: name; subText: description; iconSource: image } } ListModel { id: customModel ListElement { name: "Name 1"; description: "Description 1"; image: "images.png" } ListElement { name: "Name 2"; description: "Description 2"; image: "images.png" } ListElement { name: "Name 3"; description: "Description 3"; image: "images.png" } ListElement { name: "Name 4"; description: "Description 4"; image: "images.png" } } OptionSelector { text: i18n.tr("Label") model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4"), i18n.tr("Value 5"), i18n.tr("Value 6"), i18n.tr("Value 7"), i18n.tr("Value 8")] containerHeight: itemHeight * 4 } OptionSelector { text: i18n.tr("Label") expanded: true model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4"), i18n.tr("Value 5"), i18n.tr("Value 6"), i18n.tr("Value 7"), i18n.tr("Value 8")] containerHeight: itemHeight * 4 } } \endqml */ ListItem.Empty { id: optionSelector /*! The list of values that will be shown under the label text. This is a model. */ property var model /*! Specifies whether the list is always expanded. */ property bool expanded: false /*! If the multiple choice selection is enabled the list is always expanded. */ property bool multiSelection: false /*! Colours image according to the fieldText colour of the theme, otherwise source colour is maintained. */ property bool colourImage: false /*! ListView delegate. */ property Component delegate: Toolkit.OptionSelectorDelegate {} /*! Custom height for list container which allows scrolling inside the selector. */ property real containerHeight: { /*The reason for this slightly unconventional method of setting the container height is due to the fact that if we set it to the selector height by default (which is bound to the colum height) then we wouldn't be able to scroll to the end of the bottom boundary. The text is also invisible if none is set so this is taken into account too.*/ var textHeight = text === "" ? 0 : label.height + column.spacing; if (parent && parent.height < list.contentHeight) { return parent.height - textHeight; } else { list.contentHeight; } } /*! \qmlproperty int selectedIndex The index of the currently selected element in our list. */ property alias selectedIndex: list.currentIndex /*! \qmlproperty bool currentlyExpanded Is our list currently expanded? */ property alias currentlyExpanded: listContainer.currentlyExpanded /*! \qmlproperty real itemHeight Height of an individual list item. */ readonly property alias itemHeight: list.itemHeight /*! Called when delegate is clicked. */ signal delegateClicked(int index) /*! Called when the selector has finished expanding or collapsing. */ signal expansionCompleted() /*! \internal Trigger the action, passing the current index. */ onDelegateClicked: { trigger(index) } __height: column.height showDivider: false Column { id: column spacing: units.gu(2) anchors { left: parent.left right: parent.right } Toolkit.Label { id : label text: optionSelector.text visible: optionSelector.text !== "" ? true : false } Toolkit.StyledItem { id: listContainer objectName: "listContainer" activeFocusOnPress: true readonly property url chevron: __styleInstance.chevron readonly property url tick: __styleInstance.tick readonly property color themeColour: theme.palette.normal.backgroundText readonly property alias colourImage: optionSelector.colourImage property bool currentlyExpanded: expanded || multiSelection anchors { left: parent.left right: parent.right } state: optionSelector.expanded ? "expanded" : "collapsed" styleName: "OptionSelectorStyle" states: [ State { name: "expanded" when: listContainer.currentlyExpanded PropertyChanges { target: listContainer height: list.contentHeight < containerHeight ? list.contentHeight : containerHeight } }, State { name: "collapsed" when: !listContainer.currentlyExpanded PropertyChanges { target: listContainer height: list.itemHeight } } ] transitions: [ Transition { SequentialAnimation { Toolkit.UbuntuNumberAnimation { properties: "height" duration: Toolkit.UbuntuAnimation.BriskDuration } ScriptAction { script: { if (listContainer.currentlyExpanded) { expansionCompleted(); } else { list.positionViewAtIndex(selectedIndex, ListView.Beginning); } } } } } ] ListView { id: list parent: listContainer.__styleInstance.content property int previousIndex: -1 readonly property alias expanded: optionSelector.expanded readonly property alias multiSelection: optionSelector.multiSelection readonly property alias container: listContainer property real itemHeight signal delegateClicked(int index) onMovementStarted: optionSelector.requestFocus(Qt.MouseFocusReason) onFlickStarted: optionSelector.requestFocus(Qt.MouseFocusReason) Toolkit.Mouse.onClicked: optionSelector.requestFocus(Qt.MouseFocusReason) onDelegateClicked: optionSelector.delegateClicked(index); interactive: listContainer.height !== list.contentHeight && listContainer.currentlyExpanded ? true : false clip: true currentIndex: 0 model: optionSelector.model anchors.fill: parent delegate: optionSelector.delegate Behavior on contentY { Toolkit.UbuntuNumberAnimation { properties: "contentY" duration: Toolkit.UbuntuAnimation.BriskDuration } } } } } } ./src/Ubuntu/Components/1.3/Page.qml0000644000015600001650000002027012700370701017161 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import "pageUtils.js" as Utils /*! \qmltype Page \inqmlmodule Ubuntu.Components 1.3 \inherits StyledItem \ingroup ubuntu \brief A page is the basic Item that represents a single view in an Ubuntu application. It is recommended to use the Page inside the \l MainView or \l AdaptivePageLayout. \l MainView provides a header for Pages it includes if no \l header property was set. However, the application header is deprecated and it is recommended to set the \l header property instead. Anchors and height of a Page are automatically determined to align with the header of the \l MainView, but can be overridden. Page contents does not automatically leave space for the Page \l header, so this must be taken into account when anchoring the contents of the Page. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(48) height: units.gu(60) Page { header: PageHeader { id: pageHeader title: i18n.tr("Example page") trailingActionBar.actions: [ Action { iconName: "search" text: i18n.tr("Search") } ] } Label { anchors { horizontalCenter: parent.horizontalCenter top: pageHeader.bottom topMargin: units.gu(5) } text: i18n.tr("Hello world!") } } } \endqml */ PageTreeNode { id: page anchors { left: parent ? parent.left : undefined bottom: parent ? parent.bottom : undefined } // Set width and height so that a parent Loader can be automatically resized // to the size of the loaded Page. width: parentNode ? parentNode.width - page.x : undefined // FIXME: We no longer need to take the internal header height into account // when we remove MainView's AppHeader. height: parentNode ? page.flickable ? parentNode.height : parentNode.height - internal.headerHeight : undefined /*! \qmlproperty ActrionContext Page::actionContext \readonly \since Ubuntu.Components 1.3 The action context of the page. */ readonly property alias actionContext: localContext ActionContext { id: localContext active: page.active objectName: page.objectName + "Context" } /*! \since Ubuntu.Components 1.3 The header property for this page. Setting this property will reparent the header to the page and disable the \l MainView's application header. \qml Page { id: page header: PageHeader { title: "Page with header" trailingActionBar.actions: [ Action { iconName: "settings" }, Action { iconName: "info" } ] flickable: myFlickable } } \endqml To avoid Page content being occluded by the header, the contents of the Page should anchor to the bottom of the header. When the Page contents is flickable, the contents does not need to be anchored to the header, but it is recommended to use a \l PageHeader or \l Header component as the Page header, and set its \l Header::flickable property so that the Flickable gets a top-margin that leaves enough space for the header. \sa PageHeader, Header */ property Item header onHeaderChanged: internal.updateHeader() Component.onCompleted: internal.updateHeader() /*! \internal */ isLeaf: true /*! \deprecated */ property string title: parentNode && parentNode.hasOwnProperty("title") ? parentNode.title : "" /*! \deprecated */ property Flickable flickable: Utils.getFlickableChild(page) /*! \deprecated */ readonly property alias head: headerConfig PageHeadConfiguration { id: headerConfig title: page.title flickable: page.flickable onFlickableChanged: internal.printDeprecationWarning() onTitleChanged: internal.printDeprecationWarning() onActionsChanged: internal.printDeprecationWarning() onBackActionChanged: internal.printDeprecationWarning() } Object { id: internal property bool showDeprecationWarning: true function printDeprecationWarning() { if (internal.showDeprecationWarning) { var titleStr = page; if (page.title) { titleStr += "\"" + page.title + "\""; } titleStr += ": " print(titleStr + "In Ubuntu.Components 1.3, the use of Page.title, Page.flickable and" + " Page.head is deprecated. Use Page.header and the PageHeader component instead."); internal.showDeprecationWarning = false; } } property Item previousHeader: null property Item previousHeaderParent: null function updateHeader() { internal.showDeprecationWarning = false; if (internal.previousHeader) { internal.previousHeader.parent = internal.previousHeaderParent; } if (page.header) { internal.previousHeaderParent = page.header.parent; internal.previousHeader = page.header; page.header.parent = page; } else { internal.previousHeader = null; internal.previousHeaderParent = null; } } /////////////////////////////// // old header handling below // /////////////////////////////// property AppHeader header: page.__propagated && page.__propagated.header ? page.__propagated.header : null // Used to position the Page when there is no flickable. // When there is a flickable, the header will automatically position it. property real headerHeight: internal.header && internal.header.visible ? internal.header.height + internal.header.y : 0 // Note: The bindings below need to check whether headerConfig.contents // is valid in the "value", even when that is required in the Binding's "when" // property, to avoid TypeErrors while/after a page becomes (in)active. // // Note 2: contents.parent binding is made by PageHeadStyle. property bool hasParent: headerConfig.contents && headerConfig.contents.parent Binding { target: headerConfig.contents property: "visible" value: page.active when: headerConfig.contents } Binding { target: headerConfig.contents property: "anchors.verticalCenter" value: internal.hasParent ? headerConfig.contents.parent.verticalCenter : undefined when: headerConfig.contents } Binding { target: headerConfig.contents property: "anchors.left" value: internal.hasParent ? headerConfig.contents.parent.left : undefined when: headerConfig.contents } } } ./src/Ubuntu/Components/1.3/UbuntuNumberAnimation.qml0000644000015600001650000000350212700370701022577 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype UbuntuNumberAnimation \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief UbuntuNumberAnimation is a NumberAnimation that has predefined settings to ensure that Ubuntu applications are consistent in their animations. Example of use: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 Rectangle { width: 100; height: 100 color: UbuntuColors.orange UbuntuNumberAnimation on x { to: 50 } } \endqml UbuntuNumberAnimation is predefined with the following settings: \list \li \e duration: \l{UbuntuAnimation::FastDuration}{UbuntuAnimation.FastDuration} \li \e easing: \l{UbuntuAnimation::StandardEasing}{UbuntuAnimation.StandardEasing} \endlist If the standard duration and easing used by UbuntuNumberAnimation do not satisfy a use case or you need to use a different type of Animation (e.g. ColorAnimation), use standard durations and easing defined in \l UbuntuAnimation manually in order to ensure consistency. */ NumberAnimation { duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } ./src/Ubuntu/Components/1.3/AdaptivePageLayout.qml0000644000015600001650000011371512700370714022050 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Layouts 1.1 import Ubuntu.Components 1.3 import Ubuntu.Components.Private 1.3 /*! \qmltype AdaptivePageLayout \inqmlmodule Ubuntu.Components 1.3 \since Ubuntu.Components 1.3 \ingroup ubuntu \brief View with multiple columns of Pages. The component provides a flexible way of viewing a stack of pages in one or more columns. Unlike in PageStack, there can be more than one Page active at a time, depending on the number of the columns in the view. AdaptivePageLayout stores pages added in a tree. Pages are added relative to a given page, either as sibling (\l addPageToCurrentColumn) or as child (\l addPageToNextColumn). This means that removing a non-leaf page from the Page tree will remove all its children from the page tree. The columns are populated from left to right. The column a page is added to is detected based on the source page that is given to the functions adding the page. The pages can be added either to the same column the source page resides or to the column next to the source page. Giving a null value to the source page will add the page to the leftmost column of the view. The primary page, the very first page must be specified either through the \l primaryPage or \l primaryPageSource properties. \l primaryPage can only hold a Page instance, \l primaryPageSource can either be a Component or a url to a document defining a Page. \l primaryPageSource has precedence over \l primaryPage, and when set it will report the loaded Page through \l primaryPage property, and will replace any value set into that property. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(100) height: units.gu(60) AdaptivePageLayout { anchors.fill: parent primaryPage: page1 Page { id: page1 header: PageHeader { id: header title: "Main Page" } Column { anchors.top: header.bottom Button { text: "Add Page2 above " + page1.title onClicked: page1.pageStack.addPageToCurrentColumn(page1, page2) } Button { text: "Add Page3 next to " + page1.title onClicked: page1.pageStack.addPageToNextColumn(page1, page3) } } } Page { id: page2 header: PageHeader { title: "Page #2" } } Page { id: page3 header: PageHeader { title: "Page #3" } } } } \endqml \note Observe the use of the \c Page::pageStack property in the example above. The same property is used to share the AdaptivePageLayout instance the Page is used in, therefore the same page can be used in a PageStack or in an AdaptivePageLayout. However implementations must make sure the desired PageStack or AdaptivePageLayout function exists in the instance before using it. AdaptivePageLayout supports adaptive column handling. When the number of columns changes at runtime the pages are automatically rearranged. By default the component splits the layout in two columns when the width of the layout exceeds 80 grid units. The first column is sized to 40 grid unit width and the second one to fill the rest of the remaining space. When the 80 grid unit breakpoint is reached, the component will switch from one column to two, and vice versa. These defaults can be overridden through the \l layouts property by defining the possible layouts, their column sizing and the breakpoints when the layouts should be activated. PageColumn configurations must appear in the same order (from left to right) as the columns appear in the layout. If none of the layouts condition is met, a one column layout will be used. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(100) height: units.gu(60) AdaptivePageLayout { anchors.fill: parent primaryPageSource: page1Component layouts: PageColumnsLayout { when: width > units.gu(80) // column #0 PageColumn { minimumWidth: units.gu(30) maximumWidth: units.gu(60) preferredWidth: units.gu(40) } // column #1 PageColumn { fillWidth: true } } Component { id: page1Component Page { id: page1 header: PageHeader { id: header title: "Main page" } Column { anchors.top: header.bottom Button { text: "Add Page2 above " + page1.title onClicked: page1.pageStack.addPageToCurrentColumn(page1, page2) } Button { text: "Add Page3 next to " + page1.title onClicked: page1.pageStack.addPageToNextColumn(page1, page3) } } } } Page { id: page2 header: PageHeader { title: "Page #2" } } Page { id: page3 header: PageHeader { title: "Page #3" } } } } \endqml A column is considered to be resizable if the \l PageColumn::minimumWidth and \l PageColumn::maximumWidth configuration differs. This implies that if a column is not meant to be resized, it should have \l PageColumn::minimumWidth and \l PageColumn::maximumWidth set to the same value. In the example above, the first column can be resized to a minimum of 30, and a maximum of 60 grid units, and the preferred width is set to 40 grid units. This width is set every time the layout is activated. When a \l Page with the \l Page::header property set is added to an AdaptivePageLayout, the AdaptivePageLayout will synchronize the height of that header with the height of the headers in other columns, i.e., the height of each of the headers will be set to the maximum implicitHeight of all the headers. \sa PageStack, PageColumnsLayout, PageColumn */ PageTreeNode { id: layout Page { // AdaptivePageLayout has its own split headers, so // disable the application header. id: appHeaderControlPage head { locked: true visible: false } // title is set in attachPage() when the attached Page.column === 0 } /*! The property holds the first Page which will be added to the view. If the view has more than one column, the page will be added to the leftmost column. The property can only hold a Page instance. When changed runtime (not by the AdaptivePageLayout component itself), the \l primaryPageSource property will be reset. */ property Page primaryPage /*! The property specifies the source of the primaryPage in case the primary page is created from a Component or loaded from an external document. It has precedence over \l primaryPage. */ property var primaryPageSource /*! The property drives the way the pages should be loaded, synchronously or asynchronously. Defaults to true. */ property bool asynchronous: true /*! \qmlproperty int columns \readonly The property holds the number of columns shown in the layout. */ readonly property alias columns: d.columns /*! The property holds the different layout configurations overriding the default configurations. Defaults to an empty list. \sa PageColumnsLayout */ property list layouts /*! \qmlmethod object addPageToCurrentColumn(Item sourcePage, var page[, var properties]) Adds a \c page to the column the \c sourcePage resides in and removes all pages from the higher columns. \c page can be a Component or a file. \c properties is a JSON object containing properties to be set when page is created. \c sourcePage must be active. The function creates the new page asynchronously if the new \c page to be added is a Component or a QML document and the \l asynchronous property is set to true. In this case the function returns an incubator which can be used to track the page creation. For more about incubation in QML and creating components asynchronously, see \l {http://doc.qt.io/qt-5/qml-qtqml-component.html#incubateObject-method} {Component.incubateObject()}. The following example removes an element from the list model whenever the page opened in the second column is closed. Note, the example must be run on desktop or on a device with at least 90 grid units screen width. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(90) height: units.gu(70) Component { id: page2Component Page { header: PageHeader { id: header title: "Second Page" } Button { anchors.top: header.bottom text: "Close me" onClicked: pageStack.removePages(pageStack.primaryPage); } } } AdaptivePageLayout { id: pageLayout anchors.fill: parent primaryPage: Page { header: PageHeader { title: "Primary Page" flickable: listView } ListView { id: listView anchors.fill: parent model: 10 delegate: ListItem { Label { text: modelData } onClicked: { var incubator = pageLayout.addPageToNextColumn(pageLayout.primaryPage, page2Component); if (incubator && incubator.status == Component.Loading) { incubator.onStatusChanged = function(status) { if (status == Component.Ready) { // connect page's destruction to decrement model incubator.object.Component.destruction.connect(function() { listView.model--; }); } } } } } } } } } \endqml \sa {http://doc.qt.io/qt-5/qml-qtqml-component.html#incubateObject-method}{Component.incubateObject} */ function addPageToCurrentColumn(sourcePage, page, properties) { var nextColumn = d.columnForPage(sourcePage) + 1; d.tree.prune(nextColumn); return d.addPageToColumn(nextColumn - 1, sourcePage, page, properties, function() { // Clear all following columns. If we do not do this, we have no way to // determine which page needs to be on top when the view is resized // to have a single column. for (var i = nextColumn; i < d.columns; i++) { d.updatePageForColumn(i); } }); } /*! \qmlmethod Item addPageToNextColumn(Item sourcePage, var page[, var properties]) Remove all previous pages from the next column (relative to the column that holds \c sourcePage) and all following columns, and then add \c page to the next column. If \c sourcePage is located in the rightmost column, the new page will be pushed to the same column as \c sourcePage. The return value is the same as in \l addPageToCurrentColumn case. */ function addPageToNextColumn(sourcePage, page, properties) { var nextColumn = d.columnForPage(sourcePage) + 1; var wrappers = d.tree.prune(nextColumn); return d.addPageToColumn(nextColumn, sourcePage, page, properties, function() { for (var i = nextColumn; i < d.columns; i++) { d.updatePageForColumn(i); } for (var i in wrappers) { wrappers[i].destroyObject(); } }); } /*! \qmlmethod void removePages(Item page) The function removes and deletes all pages up to and including \c page is reached. If the \a page is the same as the \l primaryPage, only its child pages will be removed. */ function removePages(page) { d.removeAllPages(page, page != layout.primaryPage); } /* internals */ Component.onCompleted: { // check layout configuration if (layouts.length > 0) { d.prepareLayouts(); } else { d.relayout(); } if (primaryPageSource) { d.createPrimaryPage(primaryPageSource); } else if (primaryPage) { d.createPrimaryPage(primaryPage); } d.completed = true; } onPrimaryPageChanged: { if (!d.completed || d.internalUpdate) { return; } // reset the primaryPageSource d.internalPropertyUpdate("primaryPageSource", undefined); // clear the layout d.purgeLayout(); // add the new page if valid if (primaryPage !== null) { d.createPrimaryPage(primaryPage); } } onPrimaryPageSourceChanged: { if (!d.completed || d.internalUpdate) { return; } // remove all pages first d.purgeLayout(); // create the new primary page if a valid component is specified if (primaryPageSource) { d.createPrimaryPage(primaryPageSource); } else { d.internalPropertyUpdate("primaryPage", null); } } onLayoutsChanged: { if (d.completed) { // only deal with this if the layouts array changes after completion // to avoid unnecessary rendering d.prepareLayouts(); } } /*! \internal - for testing purposes */ readonly property alias __d:d QtObject { id: d property bool internalUpdate: false property bool completed: false property var tree: Tree{} property int columns: !layout.layouts.length ? (layout.width >= units.gu(80) ? 2 : 1) : (activeLayout ? activeLayout.data.length : 1) property PageColumnsLayout activeLayout: null property list prevLayouts property Page prevPrimaryPage /*! internal */ onColumnsChanged: { if (columns <= 0) { console.warn("There must be a minimum of one column set."); columns = 1; } d.relayout(); } property real defaultColumnWidth: units.gu(40) onDefaultColumnWidthChanged: body.applyMetrics() function internalPropertyUpdate(propertyName, value) { internalUpdate = true; layout[propertyName] = value; internalUpdate = false; } function createPrimaryPage(source) { var wrapper = d.createWrapper(source); if (wrapper.incubator) { wrapper.pageLoaded.connect(finalizeAddingPage.bind(wrapper)); wrapper.incubator.onStatusChanged = function (status) { if (status == Component.Ready) { internalPropertyUpdate("primaryPage", wrapper.incubator.object); prevPrimaryPage = wrapper.incubator.object; } } } else { finalizeAddingPage(wrapper); prevPrimaryPage = wrapper.object; } } // remove all pages, including primaryPage function purgeLayout() { if (prevPrimaryPage) { removeAllPages(prevPrimaryPage, true); prevPrimaryPage = null; } } function createWrapper(page, properties) { var wrapperObject = pageWrapperComponent.createObject(hiddenPages, {synchronous: !layout.asynchronous}); wrapperObject.pageStack = layout; wrapperObject.properties = properties; // set reference last because it will trigger creation of the object // with specified properties. wrapperObject.reference = page; return wrapperObject; } function addWrappedPage(pageWrapper) { pageWrapper.parentWrapper = d.getWrapper(pageWrapper.parentPage); tree.add(pageWrapper.column, pageWrapper.parentWrapper, pageWrapper); var targetColumn = MathUtils.clamp(pageWrapper.column, 0, d.columns - 1); // replace page holder's child var holder = body.children[targetColumn]; holder.detachCurrentPage(); holder.attachPage(pageWrapper); // sets pageWrapper.pageHolder // set the back action for Page.header: var page = pageWrapper.object; if (page && page.hasOwnProperty("header") && page.header && page.header.hasOwnProperty("navigationActions")) { // Page.header is an instance of PageHeader. var backAction = backActionComponent.createObject( pageWrapper, { 'wrapper': pageWrapper } ); page.header.navigationActions = [ backAction ] ; } } function getWrapper(page) { if (page && page.hasOwnProperty("parentNode")) { var w = page.parentNode; if (w && w.hasOwnProperty("object") && w.hasOwnProperty("reference")) { if (w.object == page) { return w; } else { console.error("Page is not wrapped by its parentNode. This should not happen!"); return null; } } else { // invalid wrapper return null; } } else { // invalid page return null; } } function columnForPage(page) { var wrapper = d.getWrapper(page); return wrapper ? wrapper.column : 0; } function finalizeAddingPage(newWrapper) { if (newWrapper === undefined) newWrapper = this; d.addWrappedPage(newWrapper); } function addPageToColumn(column, sourcePage, page, properties, cleanupFunc) { if (column < 0) { console.warn("Column must be >= 0."); return; } if (!sourcePage) { console.warn("No sourcePage specified. Page will not be added."); return; } var sourceWrapper = d.getWrapper(sourcePage); if (d.tree.index(sourceWrapper) === -1) { console.warn("sourcePage must be added to the view to add new page."); return; } // Check that the Page was not already added. if (typeof page !== "string" && !page.createObject) { // page is neither a url or a Component so it must be a Page object. var oldWrapper = getWrapper(page); if (oldWrapper && d.tree.index(oldWrapper) !== -1) { console.warn("Cannot add a Page that was already added."); return null; } } var newWrapper = d.createWrapper(page, properties); newWrapper.parentPage = sourcePage; newWrapper.column = column; if (newWrapper.incubator) { newWrapper.pageLoaded.connect(cleanupFunc); newWrapper.pageLoaded.connect(finalizeAddingPage.bind(newWrapper)); } else { cleanupFunc(); finalizeAddingPage(newWrapper); } return newWrapper.incubator; } // removes all pages from the layout, and may include the page itself function removeAllPages(page, inclusive) { inclusive = typeof inclusive !== 'undefined' ? inclusive : true; var nodeToRemove = d.getWrapper(page); var removedNodes = d.tree.chop(nodeToRemove, inclusive); for (var i = removedNodes.length-1; i >= 0; i--) { var node = removedNodes[i]; updatePageForColumn(node.column); } } // update the page for the specified column function updatePageForColumn(column) { var effectiveColumn = MathUtils.clamp(column, 0, d.columns - 1); var columnHolder = body.children[effectiveColumn]; var newWrapper = tree.top(effectiveColumn, effectiveColumn < d.columns - 1); var oldWrapper = columnHolder.pageWrapper; if (newWrapper != oldWrapper) { columnHolder.detachCurrentPage(); oldWrapper.parent = null; if (newWrapper) { columnHolder.attachPage(newWrapper); } oldWrapper.destroyObject(); } } // prepares layout management, listens on layout condition changes and performs re-layouting function prepareLayouts() { // disconnect from the previous layouts for (var i = 0; i < prevLayouts.length; i++) { prevLayouts[i].whenChanged.disconnect(updateLayout); } prevLayouts = layouts; for (var i = 0; i < layouts.length; i++) { layouts[i].whenChanged.connect(updateLayout); } // first time evaluation updateLayout(); } // function called when one of the layout condition is satisfied function updateLayout() { var newLayout = null; for (var i = 0; i < layouts.length; i++) { // get the first affirmative condition if (layouts[i].when) { newLayout = layouts[i]; break; } } d.activeLayout = newLayout; } // relayouts when column count changes function relayout() { if (body.children.length == d.columns) return; if (body.children.length > d.columns) { // need to remove few columns, the last ones while (body.children.length > d.columns) { var holder = body.children[body.children.length - 1]; holder.detachCurrentPage(); holder.parent = null; holder.destroy(); } } else { var prevColumns = body.children.length; // add columns for (var i = 0; i < d.columns - prevColumns; i++) { pageHolderComponent.createObject(body); } } rearrangePages(); } function rearrangePages() { for (var column = d.columns - 1; column >= 0; column--) { var holder = body.children[column]; var pageWrapper = tree.top(column, column < (d.columns - 1)); if (!pageWrapper) { continue; } if (!pageWrapper.parent) { // this should never happen, so if it does, we have a bug! console.error("Found a page which wasn't parented anywhere!", pageWrapper.object.title); continue; } // detach current page from holder if differs if (holder.pageWrapper != pageWrapper) { holder.detachCurrentPage(); } if (pageWrapper.parent == holder.hiddenPool || pageWrapper.parent == hiddenPages) { // add the page to the column holder.attachPage(pageWrapper); } else if (pageWrapper.pageHolder != holder) { // detach the pageWrapper from its holder if (pageWrapper.pageHolder) { pageWrapper.pageHolder.detachCurrentPage(); } // then attach to this holder holder.attachPage(pageWrapper); } } } } Component{ id: pageWrapperComponent PageWrapper{ } } // default metrics Component { id: defaultMetrics PageColumn { fillWidth: __column == d.columns minimumWidth: d.defaultColumnWidth } } // An instance will be added to each Page with Component { id: backActionComponent Action { // used when the Page has a Page.header property set. id: backAction objectName: "apl_back_action" iconName: "back" text: "Back" // set when backAction is created. property PageWrapper wrapper onTriggered: layout.removePages(wrapper.object) visible: { var parentWrapper = d.tree.parent(wrapper); if (!parentWrapper) // Root node has no parent node. return false; if (!wrapper.pageHolder) { // columns are being re-arranged. return false; } // wrapper.column is the virtual column, pageHolder.column the actual column. var column = wrapper.pageHolder.column; var nextInColumn = d.tree.top(column, column < d.columns - 1, 1); return parentWrapper === nextInColumn; } } } // Page holder component, can have only one Page as child at a time, all stacked pages // will be parented into hiddenPool Component { id: pageHolderComponent // Page uses the height of the parentNode for its height, so make // the holder a PageTreeNode that determines the Page height. PageTreeNode { id: holder active: false objectName: "ColumnHolder" + column property var pageWrapper: pageWrapperComponent.createObject() property int column property alias config: subHeader.config property PageColumn metrics: getDefaultMetrics() readonly property real dividerThickness: units.dp(1) readonly property alias hiddenPool: hiddenItem Layout.fillWidth: metrics.fillWidth Layout.fillHeight: true Layout.preferredWidth: MathUtils.clamp(metrics.preferredWidth, metrics.minimumWidth, metrics.maximumWidth) Layout.minimumWidth: metrics.minimumWidth Layout.maximumWidth: metrics.maximumWidth property var page: pageWrapper ? pageWrapper.object : null property bool customHeader: page && page.hasOwnProperty("header") && page.header onCustomHeaderChanged: { // do not change the holderBody anchors until the new page // for the column has been set to prevent geometry changes in // the current/previous page. if (page) { if (customHeader) { holderBody.anchors.top = holderBody.parent.top; } else { holderBody.anchors.top = subHeader.bottom; } } } onPageChanged: body.updateHeaderHeight(0) Connections { target: page onHeaderChanged: body.updateHeaderHeight(0) } Connections { target: page ? page.header : null onImplicitHeightChanged: body.updateHeaderHeight(page.header.implicitHeight) } // prevent the pages from taking the app header height into account. __propagated: null Item { id: holderBody objectName: parent.objectName + "Body" anchors { top: subHeader.bottom // updated in onCustomHeaderChanged bottom: parent.bottom left: parent.left right: parent.right rightMargin: dividerThickness } Item { id: hiddenItem anchors.fill: parent visible: false } } // subHeader is to be deprecated in UITK 1.4 and will be replaced // by the Page.header property (introduced in 1.3). property alias head: subHeader StyledItem { id: subHeader anchors { left: parent.left top: parent.top right: parent.right } height: body.headerHeight styleName: "PageHeadStyle" objectName: "Header" + column property real preferredHeight: subHeader.__styleInstance ? subHeader.__styleInstance.implicitHeight : 0 onPreferredHeightChanged: { body.updateHeaderHeight(preferredHeight); } property PageHeadConfiguration config: null property Item contents: null property color dividerColor: layout.__propagated.header.dividerColor property color panelColor: layout.__propagated.header.panelColor property color backgroundColor: layout.__propagated.header.backgroundColor visible: !customHeader && holder.pageWrapper && holder.pageWrapper.active // The multiColumn, page and showBackButton properties are used in // PageHeadStyle to show/hide the back button. property var multiColumn: layout property alias page: holder.page // used in PageHeadStyle for the back button. property bool showBackButton: { if (!page) { return false; } var parentWrapper = d.tree.parent(holder.pageWrapper); if (!parentWrapper) { // Root node has no parent node. return false; } var nextInColumn = d.tree.top(holder.column, holder.column < d.columns - 1, 1); return parentWrapper === nextInColumn; } } Rectangle { id: verticalDivider anchors { top: parent.top bottom: parent.bottom right: parent.right rightMargin: dividerThickness } width: (column == (d.columns - 1)) || !pageWrapper ? 0 : units.dp(1) color: theme.palette.normal.base MouseArea { id: resizerSensing objectName: "Divider" enabled: verticalDivider.width > 0 anchors { fill: parent leftMargin: enabled ? -units.gu(1) : 0 rightMargin: enabled ? -units.gu(1) : 0 } cursorShape: Qt.SizeHorCursor drag { axis: Drag.XAxis target: resizer smoothed: false minimumX: holder.Layout.minimumWidth maximumX: holder.Layout.maximumWidth } onPressed: resizer.x = holder.Layout.preferredWidth } states: State { name: "active" when: resizerSensing.pressed PropertyChanges { target: verticalDivider color: Qt.darker(theme.palette.normal.background, 1.7) } } transitions: Transition { from: "" to: "*" reversible: true ColorAnimation { target: verticalDivider property: "color" duration: UbuntuAnimation.SlowDuration } } } Item { id: resizer height: parent.height onXChanged: holder.Layout.preferredWidth = x } function attachPage(wrapper) { pageWrapper = wrapper; pageWrapper.parent = holderBody; pageWrapper.pageHolder = holder; pageWrapper.active = true; if (pageWrapper.object.hasOwnProperty("head")) { subHeader.config = pageWrapper.object.head; } if (pageWrapper.column === 0) { // set the application title appHeaderControlPage.title = pageWrapper.object.title; } } function detachCurrentPage() { if (!pageWrapper) return undefined; var wrapper = pageWrapper; // remove header wrapper.active = false; subHeader.config = null; pageWrapper = null; wrapper.parent = hiddenPool; wrapper.pageHolder = null; return wrapper; } function getDefaultMetrics() { var result = defaultMetrics.createObject(holder); result.__column = Qt.binding(function() { return holder.column + 1; }); return result; } } } /*! \internal */ // Pages declared as children will be placed directly into hiddenPages default property alias data: hiddenPages.data PageTreeNode { id: hiddenPages objectName: "HiddenPagePool" visible: false active: false // make sure nothing is shown eventually clip: true anchors.fill: parent } // Holds the columns holding the pages visible. Each column has only one page // as child, the invisible stacked ones are all stored in the hiddenPool // component within each column. The stack keeps the column index onto which // those should be moved once they become visible. RowLayout { id: body objectName: "body" anchors.fill: parent spacing: 0 property real headerHeight: 0 function updateHeaderHeight(newHeight) { var page; var i; if (newHeight > body.headerHeight) { body.headerHeight = newHeight; } else { var h = 0; var subHeight = 0; for (i = 0; i < children.length; i++) { page = children[i].page; if (page && page.hasOwnProperty("header") && page.header) { subHeight = page.header.implicitHeight; } else { subHeight = children[i].head.preferredHeight; } if (subHeight > h) h = subHeight; } body.headerHeight = h; } // Update all the Page.header heights. for (i = 0; i < body.children.length; i++) { page = body.children[i].page; if (page && page.hasOwnProperty("header") && page.header) { page.header.height = headerHeight; } } } onChildrenChanged: { // all children should have Layout.fillWidth false, except the last one for (var i = 0; i < children.length; i++) { children[i].column = i; } applyMetrics(); } function applyMetrics() { for (var i = 0; i < children.length; i++) { var holder = children[i]; // search for the column metrics var metrics = d.activeLayout ? d.activeLayout.data[i] : null; if (!metrics) { metrics = holder.getDefaultMetrics(); } holder.metrics = metrics; updateHeaderHeight(0); } } } } ./src/Ubuntu/Components/1.3/OptionSelectorDelegate.qml0000644000015600001650000002761012700370701022716 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \qmltype OptionSelectorDelegate \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu-components \brief OptionSelector delegate which can display text, subtext and an image from a custom model. Examples: \qml import Ubuntu.Components 1.3 Column { width: 250 OptionSelector { text: i18n.tr("Label") model: customModel delegate: OptionSelectorDelegate { text: name; subText: description; iconSource: image } } ListModel { id: customModel ListElement { name: "Name 1"; description: "Description 1"; image: "images.png" } ListElement { name: "Name 2"; description: "Description 2"; image: "images.png" } ListElement { name: "Name 3"; description: "Description 3"; image: "images.png" } ListElement { name: "Name 4"; description: "Description 4"; image: "images.png" } } } \endqml */ import QtQuick 2.4 import Ubuntu.Components.ListItems 1.3 as ListItem import Ubuntu.Components 1.3 as Toolkit ListItem.Empty { id: option __height: units.gu(5) /*! Subtext which appears below the main text. */ property string subText /*! \deprecated \b{Use iconName or iconSource instead.} Left icon url. */ property url icon: iconSource onIconChanged: if (icon != iconSource) { console.warn("WARNING: OptionSelectorDelegate.icon is DEPRECATED. " + "Use iconName and iconSource instead.") } /*! Constrains the size of the image to nothing greater than that of the delegate. Changes fillMode to Image.PreserveAspectFit. */ property bool constrainImage: false /*! Whether or not left image is coloured by our theme. */ property bool colourImage: listView.container.colourImage /*! Colour of left image. */ property color assetColour: listView.container.themeColour /*! OptionSelector's ListView. */ readonly property ListView listView: ListView.view /*! Colourising fragment shader. */ readonly property string fragColourShader: "varying highp vec2 qt_TexCoord0; uniform sampler2D source; uniform lowp vec4 colour; uniform lowp float qt_Opacity; void main() { lowp vec4 sourceColour = texture2D(source, qt_TexCoord0); gl_FragColor = colour * sourceColour.a * qt_Opacity; }" showDivider: index !== listView.count - 1 ? 1 : 0 highlightWhenPressed: false selected: ListView.isCurrentItem anchors { left: parent.left right: parent.right } onClicked: { if (listView.container.currentlyExpanded) { listView.delegateClicked(index); if (!listView.multiSelection) { listView.previousIndex = listView.currentIndex; listView.currentIndex = index; } else { selected = !selected; } } if (!listView.expanded && !listView.multiSelection) { listView.container.currentlyExpanded = !listView.container.currentlyExpanded; } } Component.onCompleted: { height = listView.itemHeight = childrenRect.height; } //Since we don't want to add states to our divider, we use the exposed alias provided in Empty to access it and alter it's opacity from here. states: [ State { name: "dividerExpanded" when: listView.container.state === "expanded" && index === listView.currentIndex PropertyChanges { target: option.divider opacity: 1 } }, State { name: "dividerCollapsed" when: listView.container.state === "collapsed" && index === listView.currentIndex PropertyChanges { target: option.divider opacity: 0 } } ] //As with our states, we apply the transition with our divider as the target. transitions: [ Transition { from: "dividerExpanded" to: "dividerCollapsed" Toolkit.UbuntuNumberAnimation { target: option.divider properties: "opacity" duration: Toolkit.UbuntuAnimation.SlowDuration } } ] resources: [ Connections { target: listView.container onCurrentlyExpandedChanged: { imageExpansion.stop(); selectedImageCollapse.stop(); deselectedImageCollapse.stop(); if (listView.container.currentlyExpanded === true) { if (!option.selected) { optionExpansion.start(); //Ensure a source change. This solves a bug which happens occasionaly when source is switched correctly. Probably related to the image.source binding. image.source = listView.container.tick } else { imageExpansion.start(); } } else { if (!option.selected) { optionCollapse.start(); } else { if (listView.previousIndex !== listView.currentIndex) selectedImageCollapse.start(); else { deselectedImageCollapse.start(); } } } } }, SequentialAnimation { id: imageExpansion PropertyAnimation { target: image properties: "opacity" from : 1.0 to: 0.0 duration: Toolkit.UbuntuAnimation.FastDuration } PauseAnimation { duration: Toolkit.UbuntuAnimation.BriskDuration - Toolkit.UbuntuAnimation.FastDuration } PropertyAction { target: image property: "source" value: listView.container.tick } PropertyAnimation { target: image properties: "opacity" from : 0.0 to: 1.0 duration: Toolkit.UbuntuAnimation.FastDuration } }, PropertyAnimation { id: optionExpansion target: option properties: "opacity" from : 0.0 to: 1.0 duration: Toolkit.UbuntuAnimation.SlowDuration }, SequentialAnimation { id: deselectedImageCollapse PauseAnimation { duration: Toolkit.UbuntuAnimation.BriskDuration } PropertyAnimation { target: image properties: "opacity" from : 1.0 to: 0.0 duration: Toolkit.UbuntuAnimation.FastDuration } PauseAnimation { duration: Toolkit.UbuntuAnimation.FastDuration } PropertyAction { target: image property: "source" value: listView.container.chevron } PropertyAnimation { target: image properties: "opacity" from : 0.0 to: 1.0 duration: Toolkit.UbuntuAnimation.FastDuration } }, SequentialAnimation { id: selectedImageCollapse PropertyAnimation { target: image properties: "opacity" from : 0.0 to: 1.0 duration: Toolkit.UbuntuAnimation.FastDuration } PauseAnimation { duration: Toolkit.UbuntuAnimation.BriskDuration - Toolkit.UbuntuAnimation.FastDuration } PropertyAnimation { target: image properties: "opacity" from : 1.0 to: 0.0 duration: Toolkit.UbuntuAnimation.FastDuration } PauseAnimation { duration: Toolkit.UbuntuAnimation.FastDuration } PropertyAction { target: image property: "source" value: listView.container.chevron } PropertyAnimation { target: image properties: "opacity" from : 0.0 to: 1.0 duration: Toolkit.UbuntuAnimation.FastDuration } }, PropertyAnimation { id: optionCollapse target: option properties: "opacity" from : 1.0 to: 0.0 duration: Toolkit.UbuntuAnimation.SlowDuration } ] Row { spacing: units.gu(1) anchors { left: parent.left leftMargin: units.gu(2) verticalCenter: parent.verticalCenter } Image { id: leftIcon objectName: "icon" height: constrainImage ? option.height : sourceSize.height source: option.iconSource fillMode: constrainImage ? Image.PreserveAspectFit : Image.Stretch ShaderEffect { property color colour: assetColour property Image source: parent width: source.width height: source.height visible: colourImage fragmentShader: fragColourShader } } Column { anchors { verticalCenter: parent.verticalCenter } clip: true width: option.width - leftIcon.width - image.width - parent.spacing * 2 - parent.anchors.leftMargin Toolkit.Label { text: option.text === "" ? modelData : option.text width: parent.width elide: Text.ElideRight } Toolkit.Label { text: option.subText width: parent.width elide: Text.ElideRight visible: option.subText !== "" ? true : false textSize: Toolkit.Label.Small } } Image { id: image width: units.gu(2) height: units.gu(2) source: listView.expanded || listView.multiSelection ? listView.container.tick : listView.container.chevron opacity: option.selected ? 1.0 : 0.0 anchors { verticalCenter: parent.verticalCenter } //Our behaviour is only enabled for our expanded list due to flickering bugs in relation to all this other animations running on the expanding version. Behavior on opacity { enabled: listView.expanded Toolkit.UbuntuNumberAnimation { properties: "opacity" duration: Toolkit.UbuntuAnimation.FastDuration } } ShaderEffect { property color colour: assetColour property Image source: parent width: source.width height: source.height fragmentShader: fragColourShader } } } } ./src/Ubuntu/Components/1.3/MainView.qml0000644000015600001650000002031212700370701020021 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 as Toolkit import Ubuntu.PerformanceMetrics 1.0 import QtQuick.Window 2.2 /*! \qmltype MainView \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu \inherits StyledItem \brief MainView is the root Item that should be used for all applications. The simplest way to use a MainView is to include a single \l Page object inside the MainView: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(48) height: units.gu(60) Page { header: PageHeader { id: pageHeader title: "Simple page" } Button { anchors { horizontalCenter: parent.horizontalCenter top: pageHeader.bottom topMargin: units.gu(5) } width: units.gu(15) text: "Push me" onClicked: print("Click!") } } } \endqml It is not required to set the anchors of the \l Page as it will automatically fill its parent. Do not include multiple Pages directly inside the MainView, but use \l AdaptivePageLayout inside MainView to navigate between several Pages. If the \l Page inside the MainView includes a Flickable, set the flickable property of the PageHeader to automatically hide and show the header when the user scrolls up or down: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(48) height: units.gu(60) Page { header: PageHeader { title: "Page with Flickable" flickable: myFlickable } Flickable { id: myFlickable anchors.fill: parent contentHeight: column.height Column { id: column Repeater { model: 100 Label { text: "line "+index } } } } } } \endqml The same header behavior is automatic when using a ListView instead of a Flickable in the above example. The examples above show how to include a single \l Page inside a MainView, but more advanced application structures are possible using \l AdaptivePageLayout. */ Toolkit.MainViewBase { id: mainView /*! \deprecated */ property bool automaticOrientation: false /*! \internal Use default property to ensure children added do not draw over the header. */ default property alias contentsItem: contents.data Item { id: canvas anchors { fill: parent bottomMargin: mainView.anchorToKeyboard && UbuntuApplication.inputMethod.visible ? UbuntuApplication.inputMethod.keyboardRectangle.height : 0 } Item { id: contents anchors { fill: parent } } /*! The header of the MainView. Can be used to obtain the height of the header in \l Page to determine the area for the \l Page to fill. */ AppHeader { // This objectName is used in the MainView autopilot custom proxy object // in order to select the application header. // Also used in tst_header_locked_visible.qml. objectName: "MainView_Header" id: headerItem property real bottomY: headerItem.y + headerItem.height dividerColor: Qt.darker(mainView.headerColor, 1.1) panelColor: Qt.lighter(mainView.headerColor, 1.1) backgroundColor: mainView.headerColor title: internal.activePage ? internal.activePage.title : "" pageStack: internal.activePage ? internal.activePage.pageStack : null contents: internal.activePage && internal.activePage.hasOwnProperty("__customHeaderContents") ? internal.activePage.__customHeaderContents : null Toolkit.PageHeadConfiguration { id: defaultConfig // Used when there is no active Page, or a Page 1.0 is used which // does not have a PageHeadConfiguration. } config: visible && internal.activePage && internal.activePage.hasOwnProperty("head") ? internal.activePage.head : defaultConfig // don't show the application header if the page has its own header. visible: !(internal.activePage && internal.activePage.hasOwnProperty("header") && internal.activePage.header) && internal.activePage height: visible ? implicitHeight : 0 // 'window' is defined by QML between startup and showing on the screen. // There is no signal for when it becomes available and re-declaring it is not safe. property bool windowActive: typeof window != 'undefined' onWindowActiveChanged: { window.title = headerItem.title } Connections { target: headerItem onTitleChanged: { if (headerItem.windowActive) window.title = headerItem.title } } } Connections { target: Qt.application onActiveChanged: { if (Qt.application.active) { if (!(headerItem.config && headerItem.config.hasOwnProperty("locked") && headerItem.config.locked)) { headerItem.exposed = true; } } } } } Toolkit.Object { id: internal // Even when using MainView 1.1, we still support Page 1.0. // PageBase (=Page 1.0) is the superclass of Page 1.1. property Item activePage: isPage(mainView.activeLeafNode) ? mainView.activeLeafNode : null function isPage(item) { return item && item.hasOwnProperty("__isPageTreeNode") && item.__isPageTreeNode && item.hasOwnProperty("title") && item.hasOwnProperty("flickable") && item.hasOwnProperty("active") && item.hasOwnProperty("pageStack") } } __propagated: QtObject { /*! \internal The header that will be propagated to the children in the page tree node. It is used by Tabs to bind header's tabsModel. */ property AppHeader header: headerItem /*! \internal The action manager that has the global context for the MainView's actions, and to which a local context can be added for each Page that has actions.actions. */ property var actionManager: mainView.actionManager /*! \internal Used by PageStack. This property only exists in MainView 1.2 and later. */ readonly property bool animateHeader: false } backgroundColor: theme.palette.normal.background PerformanceOverlay { id: performanceOverlay active: false } } ./src/Ubuntu/Components/1.3/pageUtils.js0000644000015600001650000000370512700370701020071 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \qmltype pageUtils \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu \internal \brief Page-related utility functions. */ /*! \qmlmethod pageUtils::isVerticalFlickable(object) Return true if the object is a Flickable that can be flicked in vertical direction. */ function isVerticalFlickable(object) { if (object && object.hasOwnProperty("flickableDirection") && object.hasOwnProperty("contentHeight")) { var direction = object.flickableDirection; if ( ((direction === Flickable.AutoFlickDirection) && (object.contentHeight !== object.height) ) || direction === Flickable.VerticalFlick || direction === Flickable.HorizontalAndVerticalFlick) { return true; } } return false; } /*! \qmlmethod pageUtils::getFlickableChild(item) Return the first child of the item that is flickable in the vertical direction. */ function getFlickableChild(item) { if (item && item.hasOwnProperty("children")) { for (var i=0; i < item.children.length; i++) { var child = item.children[i]; if (isVerticalFlickable(child)) { if (child.anchors.top === page.top || child.anchors.fill === page) { return item.children[i]; } } } } return null; } ./src/Ubuntu/Components/1.3/PageHeader.qml0000644000015600001650000002167312700370701020302 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype PageHeader \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu \brief The PageHeader shows a title with a leading and a trailing \l ActionBar that add action buttons to the header. The colors for foreground, background and the divider are configured in the style, so they may be set using \l StyleHints: \qml PageHeader { title: "Colors" StyleHints { foregroundColor: UbuntuColors.orange backgroundColor: "black" dividerColor: UbuntuColors.slate } } \endqml See \l Header properties that are inherited by PageHeader to control the visibility of the header. */ Header { id: header anchors { left: parent ? parent.left : undefined right: parent ? parent.right : undefined } /*! The title to display in the header. Note that the title will be hidden if the \l contents Item is set. */ property string title /*! The contents item to display in the header. By default the contents is undefined, and setting it will disable showing of the title in the header. Example: \qml PageHeader { id: header title: "Welcome" contents: Rectangle { anchors.fill: parent color: UbuntuColors.red Label { anchors.centerIn: parent text: header.title color: "white" } } } \endqml */ property Item contents Component.onCompleted: contentsHolder.updateContents() onContentsChanged: contentsHolder.updateContents() Item { id: contentsHolder anchors { left: leading.right right: trailing.left top: parent.top leftMargin: leading.visible ? 0 : units.gu(1) rightMargin: trailing.visible ? 0 : units.gu(1) } height: __styleInstance.contentHeight Loader { id: titleLoader anchors.fill: parent } property Item previousContents: null property Item previousContentsParent: null function updateContents() { if (previousContents) { previousContents.parent = previousContentsParent; } if (header.contents) { titleLoader.sourceComponent = null; previousContents = header.contents; previousContentsParent = header.contents.parent; header.contents.parent = contentsHolder; } else { previousContents = null; previousContentsParent = null; titleLoader.sourceComponent = __styleInstance.titleComponent; } } // When the style changes, make sure that the titleLoader loads // the new titleComponent. property Item styleInstance: __styleInstance onStyleInstanceChanged: updateContents() } /*! The actions to be shown in the leading action bar. This property is automatically set by the \l AdaptivePageLayout and other navigation components to configure the back action for the \l Page. Application developers should not set this property, because the value may be overridden by Ubuntu components that have navigation. Instead, set \l leadingActionBar's actions property. */ property list navigationActions /*! \qmlproperty ActionBar leadingActionBar The \l ActionBar for the leading navigation actions. Example: \qml PageHeader { leadingActionBar.actions: [ Action { iconName: "back" text: "Back" } ] } \endqml The default value of \l leadingActionBar actions is \l navigationActions, but that value can be changed to show different actions in front of the title. The leading action bar has only one slot. See \l ActionBar. */ readonly property alias leadingActionBar: leading ActionBar { id: leading anchors { left: parent.left top: parent.top leftMargin: units.gu(1) } height: header.__styleInstance.contentHeight numberOfSlots: 1 delegate: header.__styleInstance.defaultActionDelegate actions: header.navigationActions visible: leading.width > 0 // at least 1 visible action StyleHints { overflowIconName: "navigation-menu" } } /*! \qmlproperty ActionBar trailingActionBar The \l ActionBar with trailing actions. Example: \qml PageHeader { trailingActionBar { actions: [ Action { iconName: "settings" text: "first" }, Action { iconName: "info" text: "second" }, Action { iconName: "search" text: "third" } ] numberOfSlots: 2 } } \endqml By default the trailing action bar automatically adapts its number of slots to the available space in the range from 3 to 6. See \l ActionBar. */ readonly property alias trailingActionBar: trailing ActionBar { id: trailing anchors { right: parent.right top: parent.top rightMargin: units.gu(1) } height: header.__styleInstance.contentHeight numberOfSlots: MathUtils.clamp(0.3*header.width/units.gu(4), 3, 6) delegate: header.__styleInstance.defaultActionDelegate visible: trailing.width > 0 // at least 1 visible action } /*! Item shown at the bottom of the header. The extension can be any Item, but it must have a height so that the PageHeader correctly adjusts its height for the extension to fit. The extension Item should anchor to the left, right and bottom of its parent so that it will be automatically positioned above the header divider. This property replaces the sections property. Sections can now be added to the header as follows: \qml PageHeader { title: "Header with sections" extension: Sections { anchors { left: parent.left leftMargin: units.gu(2) bottom: parent.bottom } model: ["one", "two", "three"] } } \endqml See \l Toolbar and \l Sections. */ property Item extension onExtensionChanged: extensionHolder.updateExtension() Item { id: extensionHolder anchors { left: parent.left right: parent.right top: contentsHolder.bottom } height: header.extension ? header.extension.height : 0 property Item previousExtension: header.extension property Item previousExtensionParent: null function updateExtension() { if (previousExtension) { previousExtension.parent = previousExtensionParent; } if (header.extension) { previousExtension = header.extension; previousExtensionParent = header.extension.parent; header.extension.parent = extensionHolder; } else { previousExtension = null; previousExtensionParent = null; } } } /*! \qmlproperty Sections sections Sections shown at the bottom of the header. By default, the sections will only be visible if its actions or model is set. See \l Sections. \deprecated Use \l extension instead. */ readonly property alias sections: sectionsItem Sections { id: sectionsItem anchors { left: parent.left leftMargin: units.gu(2) top: contentsHolder.bottom } visible: model && model.length > 0 && !header.extension height: visible ? implicitHeight : 0 } styleName: "PageHeaderStyle" } ./src/Ubuntu/Components/1.3/Tabs.qml0000644000015600001650000004057012700370701017203 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 as Toolkit /*! \qmltype Tabs \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The Tabs class provides an environment where multible \l Tab children can be added, and the user is presented with a tab bar with tab buttons to select different tab pages. Tabs must be placed inside a \l MainView so that it will automatically have a header that shows the tabs that can be selected, and the toolbar which contains the tools of the \l Page in the currently selected \l Tab. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem MainView { width: units.gu(48) height: units.gu(60) Tabs { id: tabs Tab { title: i18n.tr("Simple page") page: Page { Label { id: label anchors.centerIn: parent text: "A centered label" } tools: ToolbarItems { ToolbarButton { text: "action" onTriggered: print("action triggered") } } } } Tab { id: externalTab title: i18n.tr("External") page: Loader { parent: externalTab anchors { left: parent.left right: parent.right bottom: parent.bottom } source: (tabs.selectedTab === externalTab) ? Qt.resolvedUrl("MyCustomPage.qml") : "" } } Tab { title: i18n.tr("List view") page: Page { ListView { clip: true anchors.fill: parent model: 20 delegate: ListItem.Standard { iconName: "compose" text: "Item "+modelData } } } } } } \endqml As the example above shows, an external \l Page inside a \l Tab can be loaded using a Loader. Note that setting the top anchor or the height of the Loader would override the \l Page height. We avoid this because the \l Page automatically adapts its height to accommodate for the header. It is possible to use a Repeater to generate tabs, but when doing so, ensure that the Repeater is declared inside the Tabs at the end, because otherwise the shuffling of the order of children by the Repeater can cause incorrect ordering of the tabs. The \l {http://design.ubuntu.com/apps/global-patterns/navigation}{Navigation Patterns} specify that a tabs header should never be combined with the back button of a \l PageStack. The only way to combine Tabs and \l PageStack that avoids this is by pushing the Tabs as the first page on the \l PageStack, and pushing other pages on top of that, as is shown in the following example: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { id: mainView width: units.gu(38) height: units.gu(50) PageStack { id: pageStack Component.onCompleted: push(tabs) Tabs { id: tabs Tab { title: "Tab 1" page: Page { Button { anchors.centerIn: parent onClicked: pageStack.push(page3) text: "Press" } } } Tab { title: "Tab 2" page: Page { Label { anchors.centerIn: parent text: "Use header to navigate between tabs" } } } } Page { id: page3 visible: false title: "Page on stack" Label { anchors.centerIn: parent text: "Press back to return to the tabs" } } } } \endqml */ Toolkit.PageTreeNode { id: tabs anchors.fill: parent /*! \qmlproperty int selectedTabIndex The index of the currently selected tab. The first tab is 0, and -1 means that no tab is selected. The initial value is 0 if Tabs has contents, or -1 otherwise. */ property alias selectedTabIndex: tabsModel.selectedIndex /*! The currently selected tab. */ readonly property Tab selectedTab: (selectedTabIndex < 0) || (tabsModel.count <= selectedTabIndex) ? null : tabsModel.get(selectedTabIndex).tab /*! The page of the currently selected tab. */ readonly property Item currentPage: selectedTab ? selectedTab.page : null /*! \deprecated The \l TabBar that will be shown in the header and provides scrollable tab buttons. This property is DEPRECATED. TabBar is now part of the header style. */ property TabBar tabBar: internal.header && internal.header.__styleInstance && internal.header.__styleInstance.hasOwnProperty("__tabBar") ? internal.header.__styleInstance.__tabBar : null /*! Children are placed in a separate item that has functionality to extract the Tab items. \qmlproperty list tabChildren */ default property alias tabChildren: tabStack.data /*! \qmlproperty int count Contains the number of tabs in the Tabs component. */ readonly property alias count: tabsModel.count /*! \deprecated Used by the tabs style to update the tabs header with the titles of all the tabs. This signal is used in an intermediate step in transitioning the tabs to a new implementation and may be removed in the future. */ signal modelChanged() /*! \internal tst_tabs.qml needs access to the model to verify that Repeaters inside Tabs works. */ property var __model: tabsModel /*! \internal required by TabsStyle */ ListModel { id: tabsModel property bool updateDisabled: false /*! The index of the selected tab. */ property int selectedIndex: tabsModel.count > 0 ? 0 : -1 function listModel(tab) { return {"title": tab.title, "tab": tab}; } function updateTabList(tabsList) { var offset = 0; var tabIndex; for (var i in tabsList) { var tab = tabsList[i]; if (internal.isTab(tab)) { tabIndex = i - offset; // make sure we have the right parent tab.parent = tabStack; if (!tab.__protected.inserted) { tab.__protected.index = tabIndex; tab.__protected.inserted = true; insert(tabIndex, listModel(tab)); } else if (!tab.__protected.removedFromTabs && tabsModel.count > tab.index) { get(tab.index).title = tab.title; } // always makes sure that tabsModel has the same order as tabsList move(tab.__protected.index, tabIndex, 1); reindex(); } else { // keep track of children that are not tabs so that we compute // the right index for actual tabs offset += 1; } } internal.sync(); } function reindex(from) { var start = 0; if (from !== undefined) { start = from + 1; } for (var i = start; i < count; i++) { var tab = get(i).tab; tab.__protected.index = i; } } } // FIXME: this component is not really needed, as it doesn't really bring any // value; should be removed in a later MR Item { anchors.fill: parent id: tabStack onChildrenChanged: { internal.connectToRepeaters(tabStack.children); tabsModel.updateTabList(tabStack.children); } } /* This timer is used when tabs are created using Repeaters. Repeater model element moves (shuffling) are causing re-stacking of the tab stack children which may not be realized at the time the rowsMoved/columnsMoved or layoutChanged signals are triggered. Therefore we use an idle timer to update the tabs model, so the tab stack is re-stacked by then. */ Timer { id: updateTimer interval: 1 running: false onTriggered: { tabsModel.updateTabList(tabStack.children); internal.sync(); } } Toolkit.Object { id: internal property AppHeader header: tabs.__propagated ? tabs.__propagated.header : null /* List of connected Repeaters to avoid repeater "hammering" of itemAdded() signal. */ property var repeaters: [] function sync() { if (tabBar && tabBar.__styleInstance && tabBar.__styleInstance.hasOwnProperty("sync")) { tabBar.__styleInstance.sync(); } if ((tabs.active && internal.header) && !(internal.header.config && internal.header.config.hasOwnProperty("locked") && internal.header.config.locked)) { internal.header.show(); } // deprecated, however use it till we remove it completely tabs.modelChanged(); } function isTab(item) { if (item && item.hasOwnProperty("__isPageTreeNode") && item.__isPageTreeNode && item.hasOwnProperty("title") && item.hasOwnProperty("page")) { return true; } else { return false; } } function isRepeater(item) { return (item && item.hasOwnProperty("itemAdded")); } function connectToRepeaters(children) { for (var i = 0; i < children.length; i++) { var child = children[i]; if (internal.isRepeater(child) && internal.repeaters && (internal.repeaters.indexOf(child) < 0)) { internal.connectRepeater(child); } } } /* When inserting a delegate into its parent the Repeater does it in 3 steps: 1) sets the parent of the delegate thus inserting it in the list of children in a position that does not correspond to the position of the corresponding item in the model. At that point the childrenChanged() signal is emitted. 2) reorder the delegate to match the position of the corresponding item in the model. 3) emits the itemAdded() signal. We need to update the list of tabs (tabsModel) when the children are in the adequate order hence the workaround below. It connects to the itemAdded() signal of any repeater it finds and triggers an update of the tabsModel. Somewhat related Qt bug report: https://bugreports.qt-project.org/browse/QTBUG-32438 */ function updateTabsModel() { tabsModel.updateTabList(tabStack.children); } /* Connects a Repeater and stores it so further connects will not happen to the same repeater avoiding in this way hammering. */ function connectRepeater(repeater) { // store repeater repeaters.push(repeater); // connect destruction signal so we have a proper cleanup repeater.Component.onDestruction.connect(internal.disconnectRepeater.bind(repeater)); // connect repeater's itemAdded and itemRemoved signals repeater.itemAdded.connect(internal.updateTabsModel); repeater.itemRemoved.connect(internal.removeTabFromModel); // check if the repeater's model is set, if not, connect to modelChanged to catch that if (repeater.model === undefined) { repeater.modelChanged.connect(internal.connectRepeaterModelChanges.bind(repeater)); } else { connectRepeaterModelChanges(repeater); } } /* Disconnects the given repeater signals. */ function disconnectRepeater() { this.itemAdded.disconnect(internal.updateTabsModel); this.itemRemoved.disconnect(internal.removeTabFromModel); this.modelChanged.disconnect(internal.connectRepeaterModelChanges); } /* Connects a Repeater's model change signals so we get notified whenever those change. This can be called either by the Repeater's modelChanged() signal, in which case the parameter is undefined, or from the connectRepeater() in case the model is given for the Repeater. */ function connectRepeaterModelChanges(repeater) { if (repeater === undefined) { repeater = this; } /* Omit model types which are not derived from object (i.e. are [object Number] or [object Array] typed). JS 'instanceof' operator does not return true for all types of arrays (i.e for property var array: [....] it returns false). The safest way to detect whether the model is really an object we use the toString() prototype of the generic JS Object. Inspired from http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/ */ if (Object.prototype.toString.call(repeater.model) !== "[object Object]") { return; } // other models are most likely derived from QAbstractItemModel, // therefore we can safely connect to the signals to get notified about refreshes repeater.model.rowsMoved.connect(updateTimer.restart); repeater.model.columnsMoved.connect(updateTimer.restart); repeater.model.layoutChanged.connect(updateTimer.restart); } // clean items removed trough a repeater function removeTabFromModel(index, item) { // cannot use index as that one is relative to the Repeater's model, therefore // we need to look after the Tabs models' role to find out which item to remove for (var i = 0; i < tabsModel.count; i++) { if (tabsModel.get(i).tab === item) { tabsModel.remove(i); break; } } tabsModel.reindex(); } } Binding { target: internal.header property: "tabsModel" value: tabsModel when: internal.header && tabs.active } } ./src/Ubuntu/Components/1.3/PageHeadState.qml0000644000015600001650000000657612700370701020761 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 // for Action /*! \qmltype PageHeadState \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \since Ubuntu.Components 1.1 \brief PageHeadState is a helper component to make it easier to configure the page header when changing states. This example shows how to add an action to the header that enables the user to enter search/input mode: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { id: mainView width: units.gu(40) height: units.gu(50) Page { id: searchPage title: "Click the icon" Label { anchors.centerIn: parent text: searchPage.state == "search" ? "search mode" : "normal mode" } state: "default" states: [ PageHeadState { name: "default" head: searchPage.head actions: Action { iconName: "search" onTriggered: searchPage.state = "search" } }, PageHeadState { id: headerState name: "search" head: searchPage.head actions: [ Action { iconName: "contact" } ] backAction: Action { id: leaveSearchAction text: "back" iconName: "back" onTriggered: searchPage.state = "default" } contents: TextField { placeholderText: "search..." } } ] } } \endqml */ State { id: state /*! The head property of the \l Page which will be the target of the property changes of this State. This property must always be set before the State can be used. */ property PageHeadConfiguration head /*! The actions to be shown in the header with this state. */ property list actions /*! The back action for this state. */ property Action backAction /*! The contents of the header when this state is active. */ property Item contents PropertyChanges { target: state.head backAction: state.backAction actions: state.actions contents: state.contents } } ./src/Ubuntu/Components/1.3/ListItemPopover.qml0000644000015600001650000000361212700370701021413 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 ActionSelectionPopover { id: popover objectName: 'listItemContextMenu' contentWidth: units.gu(25) delegate: ListItem { contentItem.anchors { leftMargin: units.gu(2) rightMargin: units.gu(2) topMargin: units.gu(0.5) bottomMargin: units.gu(0.5) } divider.visible: action != actions[actions.length - 1] Label { anchors.verticalCenter: parent.verticalCenter text: action.text color: '#5D5D5D' } onClicked: popover.hide() } function mergeActions(to, from) { if (from == null) return; var actions = from.actions; for (var i in actions) { var action = actions[i]; if (!action.text) action.text = action.iconName; to.push(actions[i]); } } onCallerChanged: { var all = []; mergeActions(all, caller.leadingActions); mergeActions(all, caller.trailingActions); actions = all; } // Hide the arrow Binding { target: __foreground property: "direction" value: "none" } } ./src/Ubuntu/Components/1.3/Icon.qml0000644000015600001650000001116412700370701017177 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authors: Zsombor Egri * Loic Molinari */ import QtQuick 2.4 /*! \qmltype Icon \inqmlmodule Ubuntu.Components 1.3 \inherits Item \ingroup ubuntu \brief The Icon component displays an icon from the icon theme. The icon theme contains a set of standard icons referred to by their name. Using icons whenever possible enhances consistency accross applications. Each icon has a name and can have different visual representations depending on the size requested. Icons can also be colorized. Setting the \l color property will make all pixels with the \l keyColor (by default #808080) colored. Example: \qml Icon { width: 64 height: 64 name: "search" } \endqml Example of colorization: \qml Icon { width: 64 height: 64 name: "search" color: UbuntuColors.warmGrey } \endqml Icon themes are created following the \l{http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html}{Freedesktop Icon Theme Specification}. */ Item { id: icon /*! The name of the icon to display. \qmlproperty string Icon::name If both name and source are set, name will be ignored. \note The complete list of icons available in Ubuntu is not published yet. For now please refer to the folders where the icon themes are installed: \list \li Ubuntu Touch: \l file:/usr/share/icons/suru \li Ubuntu Desktop: \l file:/usr/share/icons/ubuntu-mono-dark \endlist These 2 separate icon themes will be merged soon. */ property string name /*! The color that all pixels that originally are of color \l keyColor should take. \qmlproperty color Icon::color */ property alias color: colorizedImage.keyColorOut /*! The color of the pixels that should be colorized. By default it is set to #808080. \qmlproperty color Icon::keyColor */ property alias keyColor: colorizedImage.keyColorIn /*! The source url of the icon to display. It has precedence over name. If both name and source are set, name will be ignored. \since Ubuntu.Components 1.1 \qmlproperty url Icon::source */ property alias source: image.source /*! \qmlproperty bool Icon::asynchronous The property drives the image loading of the icon. Defaults to false. */ property alias asynchronous: image.asynchronous implicitWidth: image.implicitWidth implicitHeight: image.implicitHeight Image { id: image objectName: "image" anchors.fill: parent fillMode: Image.PreserveAspectFit sourceSize { width: icon.width height: icon.height } source: icon.name ? "image://theme/%1".arg(icon.name) : "" cache: true visible: !colorizedImage.visible asynchronous: false } ShaderEffect { id: colorizedImage objectName: "shader" anchors.fill: parent // Whether or not a color has been set. visible: image.status == Image.Ready && keyColorOut != Qt.rgba(0.0, 0.0, 0.0, 0.0) property Image source: image property color keyColorOut: Qt.rgba(0.0, 0.0, 0.0, 0.0) property color keyColorIn: "#808080" property real threshold: 0.1 fragmentShader: " varying highp vec2 qt_TexCoord0; uniform sampler2D source; uniform highp vec4 keyColorOut; uniform highp vec4 keyColorIn; uniform lowp float threshold; uniform lowp float qt_Opacity; void main() { lowp vec4 sourceColor = texture2D(source, qt_TexCoord0); gl_FragColor = mix(keyColorOut * vec4(sourceColor.a), sourceColor, step(threshold, distance(sourceColor.rgb / sourceColor.a, keyColorIn.rgb))) * qt_Opacity; }" } } ./src/Ubuntu/Components/1.3/ActionList.qml0000644000015600001650000000304012700370701020352 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype ActionList \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief List of \l Action items */ QtObject { id: list // internal objects using nested elements, // which isn't allowed by QtObject; this fix makes this possible /*! Default property to allow adding of children. \qmlproperty list children \default */ default property alias children: list.actions /*! List of already defined actions when not defining them as children of the ActionList. Note that when you set this property, the children of the ActionList will be ignored, so do not set the list and define children. The advantage of setting actions over using the children is that the same \l Action items can be used in several sets of actions. */ property list actions } ./src/Ubuntu/Components/1.3/Switch.qml0000644000015600001650000000253712700370701017554 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ // FIXME(loicm) It would be nice to have a draggable thumb to toggle the switch, // that needs to be validated with designers though. import QtQuick 2.4 /*! \qmltype Switch \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Switch is a component with two states, checked or unchecked. It can be used to set boolean options. The behavior is the same as \l CheckBox, the only difference is the graphical style. \l {https://design.ubuntu.com/apps/building-blocks/selection}{See also the Design Guidelines on selection}. Example: \qml Item { Switch { checked: true } } \endqml */ CheckBox { id: switchItem styleName: "SwitchStyle" } ./src/Ubuntu/Components/1.3/Panel.qml0000644000015600001650000005567612700370701017366 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 as Toolkit /*! \qmltype Panel \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief A panel that can be swiped in and out from an edge of the window by the user. For most applications, it is highly recommended to use the \l MainView instead which includes a toolbar at its bottom that can be swiped in or out. Unless your application has very specific needs for a Panel, use a \l MainView with the default toolbar. When using a Panel, do not theme it directly, but theme its contents, because the Panel itself should not have visible elements, since it is in the view (to detect mouse events) even when its contents should be invisible. Set the anchors and/or width/height of the Panel to specify the area that the Panel covers when opened. A black panel that can be swiped in from the lower-right of the window can be created like this: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: units.gu(80) height: units.gu(80) Panel { id: panel anchors { right: parent.right bottom: parent.bottom } width: parent.width / 2 height: units.gu(8) Rectangle { anchors.fill: parent color: theme.palette.normal.overlay Button { anchors.centerIn: parent text: "Click" } } } } \endqml A panel that looks like the standard (bottom-aligned) toolbar, but with custom contents, can be created like this: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: units.gu(80) height: units.gu(80) Panel { id: panel anchors { left: parent.left right: parent.right bottom: parent.bottom } height: units.gu(8) Item { anchors.fill: parent // two properties used by the toolbar delegate: property bool opened: panel.opened property bool animating: panel.animating Button { anchors.centerIn: parent text: "Click" } } } } \endqml Any Items can be placed inside the Panel, but MouseAreas can block mouse events from reaching the panel and thus obstruct the swiping behavior for hiding the panel. As a result, the user cannot start swiping on the buttons in the examples above in order to hide the panel. To remedy this, clicked() signals are forwarded from the panel by calling the child's trigger() function. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 Rectangle { color: theme.palette.normal.background width: units.gu(40) height: units.gu(40) Panel { id: panel anchors { left: parent.left right: parent.right bottom: parent.bottom } height: units.gu(8) Rectangle { color: theme.palette.normal.overlay anchors.fill: parent Rectangle { width: units.gu(8) height: units.gu(4) anchors.centerIn: parent color: "red" function trigger() { print("The red rectangle was clicked"); } } } } Component.onCompleted: panel.open(); } \endqml Like this, the red rectangle accepts click events, but the user can still swipe down on top of the rectangle in order to hide the panel. */ Item { id: panel /*! Default property, holds the content which will be swiped in and out. \qmlproperty list contents */ default property alias contents: bar.data /*! The property defines the alignment of the panel. The implementation supports the following values: \list \li Qt.AlignBottom to swipe in the panel from the bottom (default) \li Qt.AlignTop to swipe in the panel from the top \li Qt.AlignLeft to swipe in the panel from the left \li Qt.AlignRight to swipe in the panel from the right \li Qt.AlignLeading left when layout mirrorring is disabled, right otherwise \li Qt.AlignTrailing right when layout mirroring is disabled, left otherwise \endlist The default value is \b Qt.AlignBottom, and it is not recommended to change the default value because the left, right and top edge are already used for system functions, while the bottom edge is reserved for app-specific functionality such as a default toolbar. The use of Qt.AlignLeading and Qt.AlignTrailing is preferred over Qt.AlignLeft and Qt.AlignRight in order to more easily support right-to-left user interfaces that use LayoutMirroring. */ property int align: Qt.AlignBottom /*! When opened, the panel is visible, otherwise it is hidden. Use edge swipes to open/close the panel. The opened property is not updated until the swipe gesture is completed. */ // opened is true if state is spread, or if state is moving/hint and the previous state was spread. property bool opened: (panel.state === "spread") || (panel.state === "moving" && internal.previousState === "spread") /*! \internal */ // FIXME: When opened is made read-only, onOpenedChanged can be removed entirely. onOpenedChanged: { if (internal.openedChangedWarning) { console.log("DEPRECATED use of Panel.opened property. This property will be made read-only, please use the opened property of the Page tools or use Panel.open() and Panel.close()."); if (opened) { panel.open(); } else { panel.close(); } // re-establish the previous binding for opened. panel.opened = Qt.binding(function() { return (panel.state === "spread") || (panel.state === "moving" && internal.previousState === "spread"); }) } internal.openedChangedWarning = true; } /*! Open the panel */ function open() { // FIXME: When opened is made readonly, openedChangedWarning must be removed internal.openedChangedWarning = false; panel.state = "spread"; hideTimer.conditionalRestart(); } /*! Close the panel */ function close() { // FIXME: When opened is made readonly, openedChangedWarning must be removed. internal.openedChangedWarning = false; panel.state = ""; hideTimer.stop(); } /*! The time in milliseconds before the panel automatically hides after inactivity when it is not locked. Interacting with the panel resets the timer. Note that adding contents to the panel that accepts mouse events will prevent the panel from detecting interaction and the timer will not be reset. Setting a negative value will disable automatic hiding. Default value: -1 (automatic hiding is disabled). \qmlproperty int hideTimeout */ property alias hideTimeout: hideTimer.interval /*! Disable edge swipe to open/close the panel. False by default. */ property bool locked: false /*! \internal */ onLockedChanged: { if (state == "hint" || state == "moving") { draggingArea.finishMoving(); } if (!hideTimer.conditionalRestart()) { hideTimer.stop(); } } Timer { id: hideTimer interval: -1 running: panel.opened && !panel.locked && interval >= 0 function conditionalRestart() { if (hideTimer.interval >= 0) { if (!panel.locked && panel.opened) { hideTimer.restart(); return true; } } return false; } onIntervalChanged: { if (!conditionalRestart()) { hideTimer.stop(); } } onTriggered: { if (!panel.locked) { panel.close(); } } } // disable the timer when the application is not active to avoid closing // the panel immediately after the application becomes active again Connections { target: Qt.application onActiveChanged: { if (Qt.application.active) { hideTimer.conditionalRestart(); } else { hideTimer.stop(); } } } /*! How much of the panel to show when the user touches the panel's edge. This gives the user a hint that there is a panel hiding at that edge and invites him/her to swipe to show the panel completely. Default value: units.gu(2). */ property real hintSize: units.gu(2) /*! The size (height for top or bottom-aligned panels, width for left or right-aligned panels) of the mouse area used to detect edge swipes to open the panel, when the panel is not opened. Default value: units.gu(2). */ property real triggerSize: units.gu(2) /*! \qmlproperty real position The current position of the edge of the panel. The value is 0 when the panel is opened, and has its maximum value when the panel is closed. The maximum value is the width of the Panel for a left or right-aligned panel, and the height of the panel for top or bottom-aligned panels. When the user drags the Panel from the edge to open it, the position will change from the maximum size (closed) to 0 (fully expanded). */ readonly property alias position: bar.position states: [ State { name: "hint" PropertyChanges { target: bar position: bar.size - panel.hintSize } }, State { name: "moving" PropertyChanges { target: bar position: Toolkit.MathUtils.clamp(draggingArea.mousePosition - internal.movingDelta, 0, bar.size) } }, State { name: "spread" PropertyChanges { target: bar position: 0 } }, State { name: "" PropertyChanges { target: bar position: bar.size explicit: true } } ] /*! Animate transitions between the different panel states. */ property bool animate: true /*! The toolbar is currently not in a stable hidden or visible state. */ readonly property bool animating: draggingArea.pressed || transitionToAll.running || transitionToHint.running || transitionToSpread.running transitions: [ Transition { id: transitionToAll to: "" UbuntuNumberAnimation { target: bar properties: "position" duration: internal.transitionDuration } }, Transition { id: transitionToHint to: "hint" UbuntuNumberAnimation { target: bar properties: "position" duration: internal.transitionDuration } }, Transition { id: transitionToSpread to: "spread" UbuntuNumberAnimation { target: bar properties: "position" duration: internal.transitionDuration } }, Transition { id: transitionToMoving to: "moving" UbuntuNumberAnimation { target: bar properties: "position" duration: panel.animate ? Toolkit.UbuntuAnimation.SnapDuration : 0 } } ] QtObject { id: internal // FIXME: Remove when opened property is made readonly property bool openedChangedWarning: true /*! The duration in milliseconds of sliding in or out transitions when opening, closing, and showing the hint. Default value: 250 */ property real transitionDuration: panel.animate ? Toolkit.UbuntuAnimation.FastDuration : 0 property string previousState: "" property int movingDelta // Convert from Qt.AlignLeading to Qt.AlignTrailing to Qt.AlignLeft and Qt.AlignRight property int align: { if (panel.align === Qt.AlignLeading) { if (panel.LayoutMirroring.enabled) { return Qt.AlignRight; } else { return Qt.AlignLeft; } } else if (panel.align === Qt.AlignTrailing) { if (panel.LayoutMirroring.enabled) { return Qt.AlignLeft; } else { return Qt.AlignRight; } } else { return panel.align; } } readonly property int orientation: (panel.align === Qt.AlignTop || panel.align === Qt.AlignBottom) ? Qt.Horizontal : Qt.Vertical } /*! \internal */ onStateChanged: { if (state == "hint") { internal.movingDelta = panel.hintSize + draggingArea.initialPosition - bar.size; } else if (state == "moving" && internal.previousState == "spread") { internal.movingDelta = draggingArea.initialPosition; } } /*! \internal \deprecated Enable the InverseMouseArea that closes the panel when the user clicks outside of the panel. This functionality moved to the MainView to deal with Toolbar hiding, but this InverseMouseArea is still in the Panel for backwards compatibility in apps that use it directly. Default value is false. FIXME: Remove __closeOnContentsClicks and the IMA below when all apps use Toolbar instead of Panel. */ property bool __closeOnContentsClicks: false Toolkit.InverseMouseArea { anchors.fill: draggingArea onPressed: { mouse.accepted = false; // the mouse click may cause an update // of locked by the clicked Item behind if (!panel.locked) panel.close(); } propagateComposedEvents: true visible: panel.__closeOnContentsClicks && panel.locked == false && panel.state == "spread" } /*! \internal \deprecated Enable automatic reveal of panel on mouse hover over hint area, and hide when leaving the panel area. This is disabled by default, because Panel may be used to implement bottom edge behaviors that are completely different from the toolbar, but the property is enabled in Toolbar to make more usable on desktop. */ property bool __openOnHover: false /*! The user presses on the opened toolbar, or when the toolbar is closed but not locked, the user presses in the toolbar trigger area. \qmlproperty bool pressed */ // This is a simple alias to draggingArea.pressed, but the documentation is accurate // because of the visible definition of draggingArea. Pressed is false when draggingArea // is not visible. property alias pressed: draggingArea.pressed DraggingArea { id: draggingArea orientation: internal.orientation === Qt.Horizontal ? Qt.Vertical : Qt.Horizontal zeroVelocityCounts: true anchors { top: panel.align === Qt.AlignBottom ? undefined : parent.top bottom: panel.align === Qt.AlignTop ? undefined : parent.bottom left: panel.align === Qt.AlignRight || panel.align === Qt.AlignTrailing ? undefined : parent.left right: panel.align === Qt.AlignLeft || panel.align === Qt.AlignLeading ? undefined : parent.right } height: internal.orientation === Qt.Horizontal ? panel.opened ? bar.size + units.gu(1) : panel.triggerSize : undefined width: internal.orientation === Qt.Vertical ? panel.opened ? bar.size + units.gu(1) : panel.triggerSize : undefined visible: !panel.locked || panel.opened hoverEnabled: panel.__openOnHover property int mousePosition: getMousePosition() function getMousePosition() { switch (internal.align) { case Qt.AlignLeft: return -mouseX; case Qt.AlignRight: return mouseX; case Qt.AlignBottom: return mouseY; case Qt.AlignTop: return -mouseY; } } // set in onPressed, reset when entering "moving" state property Item pressedItem: null // find the first child with a triggered property: function getTriggerableItem(mouse) { var item = bar; // contains the children while (item && !item.hasOwnProperty("trigger")) { var coords = mapToItem(item, mouse.x, mouse.y); // FIXME: When using a ListView the highlight may be // returned instead of the Item that you are looking for item = item.childAt(coords.x, coords.y); } return item; // will be null if no item has trigger() function. } // forward trigger() events to any child Item with trigger() function. // This must also happen when the panel is locked, so the DraggingArea is // never disabled, and other signal handlers will return when panel.locked is true. onClicked: { if (pressedItem && pressedItem === getTriggerableItem(mouse)) { // Click event positioned at the Item where the user first pressed pressedItem.trigger(); } } property int initialPosition onPressed: { hideTimer.stop(); pressedItem = getTriggerableItem(mouse); if (panel.locked) return; initialPosition = getMousePosition(); if (panel.state == "") panel.state = "hint"; } /*! The minimum amount of movement while pressed before switching to "moving" state. This threshold is needed to avoid detecting unintentional small movements while "clicking" as a drag. */ property real dragThreshold: units.gu(1) onPositionChanged: { if (!pressed) return; if (panel.locked) return; if (panel.state == "hint" && mousePosition < initialPosition - dragThreshold) { internal.previousState = "hint"; panel.state = "moving"; pressedItem = null; } else if (panel.state == "spread" && mousePosition > initialPosition + dragThreshold) { internal.previousState = "spread"; panel.state = "moving"; pressedItem = null; } } onReleased: { if (panel.state == "moving" || panel.state == "hint") { finishMoving(); } else { hideTimer.conditionalRestart(); } } // Mouse cursor moving out of the window while pressed on desktop onCanceled: { if (panel.state == "moving" || panel.state == "hint") { finishMoving(); } else { hideTimer.conditionalRestart(); } } onEntered: { if (panel.__openOnHover) { panel.open(); } hideTimer.stop(); } onExited: { // panel.__openOnHover // Ensure the panel is not still opening. The draggingArea will // change after the panel finishes the opening animation. if (!animating) { hideTimer.conditionalRestart(); } } // FIXME: Make all parameters below themable and resolution-independent. // The value of 44 was copied from the Launcher. function finishMoving() { if (draggingArea.dragVelocity < -44) { if (internal.align === Qt.AlignBottom || internal.align === Qt.AlignRight) { panel.open(); } else { panel.close(); } } else if (draggingArea.dragVelocity > 44) { if (internal.align === Qt.AlignBottom || internal.align === Qt.AlignRight) { panel.close(); } else { panel.open(); } } else { if (bar.position < bar.size / 2) { panel.open(); } else { panel.close(); } } } } Item { id: bar objectName: "bar_item" height: parent.height width: parent.width anchors { left: internal.orientation === Qt.Horizontal ? parent.left : undefined right: internal.orientation === Qt.Horizontal ? parent.right : undefined top: internal.orientation === Qt.Vertical ? parent.top : undefined bottom: internal.orientation === Qt.Vertical ? parent.bottom : undefined } property real size: internal.orientation === Qt.Horizontal ? height : width //position will always be in the range 0..size, where position==0 means spread, position==size means hidden. property real position: panel.opened ? 0 : size onSizeChanged: position = panel.opened ? 0 : size y: internal.align === Qt.AlignTop ? -position : internal.align === Qt.AlignBottom ? position : 0 x: internal.align === Qt.AlignLeft ? -position : internal.align === Qt.AlignRight ? position : 0 } } ./src/Ubuntu/Components/1.3/ToolbarButton.qml0000644000015600001650000000544112700370701021106 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype ToolbarButton \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief An \l ActionItem that represents a button in the toolbar. ToolbarButtons should be included in \l ToolbarItems to define the tools of a \l Page. The behavior and look of the toolbar button can be specified by setting an \l Action for the button, or by setting the other properties inherited by the \l ActionItem. Example of different ways to define the toolbar button: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(50) height: units.gu(80) Action { id: action1 text: "action 1" iconName: "compose" onTriggered: print("one!") } Page { title: "test page" Label { anchors.centerIn: parent text: "Hello, world" } tools: ToolbarItems { // reference to an action: ToolbarButton { action: action1 } // define the action: ToolbarButton { action: Action { text: "Second action" iconName: "add" onTriggered: print("two!") } // override the text of the action: text: "action 2" } // no associated action: ToolbarButton { iconName: "cancel" text: "button" onTriggered: print("three!") } } } } \endqml See \l ToolbarItems for more information on how to use ToolbarButton. */ ActionItem { id: toolbarButton height: parent ? parent.height : undefined width: units.gu(5) styleName: "ToolbarButtonStyle" } ./src/Ubuntu/Components/1.3/OrientationHelper.qml0000644000015600001650000001562512700370701021750 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Window 2.0 import Ubuntu.Components 1.3 /*! \qmltype OrientationHelper \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The OrientationHelper automatically rotates its children following the orientation of the device. Any Item placed inside an Orientation Helper will be automatically rotated following the orientation of the device. Note that OrientationHelper is always filling its parent (anchors.parent: fill). Example: \qml Item { OrientationHelper { Label { text: "Automatically rotated" } Button { text: "Automatically rotated" } } } \endqml */ Item { id: orientationHelper /*! Sets whether it will be automatically rotating when the device is. The default value is true. \qmlproperty bool automaticOrientation */ property bool automaticOrientation: true /*! Sets whether the rotation transition is performed. The default value is true. \qmlproperty bool transitionEnabled */ property bool transitionEnabled: true /*! Exposes whether the orientationTransition is running. \qmlproperty alias rotating */ readonly property bool rotating: d.transitioning /*! \qmlproperty int __orientationAngle \deprecated Use orientationAngle instead. */ property alias __orientationAngle: orientationHelper.orientationAngle /*! \qmlproperty int orientationAngle Calculates the current orientation angle. */ property int orientationAngle: automaticOrientation ? Screen.angleBetween(Screen.primaryOrientation, Screen.orientation) : 0 // Screen.primaryOrientation and Screen.orientation can change one right after the other, // causing orientationAngle to momentarily change. To avoid responding to such // intermediate states, wait for its value to stabilize before rotating to it. onOrientationAngleChanged: { automaticOrientation ? stableOrientationAngleTimer.restart() : d.tryUpdateState(); } /*! The property holds if the OrientationHelper should automatically resize the contents when the input method appears The default value is false. */ property bool anchorToKeyboard: false x: parent ? (parent.width - width) / 2 : 0 y: parent ? (d.availableParentHeight - height) / 2 : 0 width: parent ? (d.flipDimensions ? d.availableParentHeight : parent.width) : 0 height: parent ? (d.flipDimensions ? parent.width : d.availableParentHeight) : 0 /* The attached property Screen.orientation is only valid inside Item or derived components. Inside Object it evaluates to 0 with no error. Also be aware that some apps eg. webbrowser-app set window.contentOrientation and thus can hide failure to update it from this code. See http://qt-project.org/doc/qt-5.0/qtquick/qml-qtquick-window2-screen.html */ Item { id: d property real availableParentHeight: { if (!orientationHelper.parent) return 0; var availableHeight = orientationHelper.parent.height; if (d.stateAngle === 0 && UbuntuApplication.inputMethod.visible && anchorToKeyboard) availableHeight -= UbuntuApplication.inputMethod.keyboardRectangle.height; return availableHeight; } /*! 'window' is defined by QML between startup and showing on the screen. There is no signal for when it becomes available and re-declaring it is not safe. http://qt-project.org/doc/qt-5.1/qtqml/qml-qtqml2-qt.html http://qt-project.org/doc/qt-5.1/qtquick/qmlmodule-qtquick-window2-qtquick-window-2.html */ property bool windowActive: typeof window != 'undefined' /*! Report the current orientation of the application via QWindow::contentOrientation. http://qt-project.org/doc/qt-5.0/qtgui/qwindow.html#contentOrientation-prop */ function applyOrientation() { if (windowActive && window) window.contentOrientation = Screen.orientation } onWindowActiveChanged: { if (automaticOrientation) applyOrientation(); } Timer { id: stableOrientationAngleTimer interval: 250 onTriggered: { d.tryUpdateState(); } } readonly property bool flipDimensions: d.stateAngle == 90 || d.stateAngle == 270 property bool transitioning: false onTransitioningChanged: { d.tryUpdateState(); } // NB: Using a binding would cause QML to detect a // binding loop and break the binding, thus the imperative code to update the state. function tryUpdateState() { if (!d.transitioning) { d.oldAngle = d.stateAngle; d.stateAngle = orientationHelper.orientationAngle; d.state = orientationHelper.orientationAngle.toString(); d.applyOrientation(); } } state: "0" states: [ State { name: "0" }, State { name: "90" }, State { name: "180" }, State { name: "270" } ] property int stateAngle: 0 property int oldAngle: 0 transitions: [ Transition { id: animatedTransition enabled: orientationHelper.transitionEnabled SequentialAnimation { ScriptAction { script: { d.transitioning = true; } } RotationAnimator { target: orientationHelper duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing direction: RotationAnimation.Shortest from: d.oldAngle to: d.stateAngle } ScriptAction { script: { d.transitioning = false; } } } }, Transition { enabled: !orientationHelper.transitionEnabled ScriptAction { script: { orientationHelper.rotation = d.stateAngle; } } } ] } } ./src/Ubuntu/Components/1.3/DraggingArea.qml0000644000015600001650000000673512700370701020632 0ustar jenkinsjenkins/* * Copyright (C) 2013 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 MouseArea { id: draggingArea property int orientation: Qt.Vertical property bool dragging property real dragVelocity: 0 property real dragValue: (orientation == Qt.Vertical ? (mouseY - __pressedPosition.y) : (mouseX - __pressedPosition.x)) property real lateralPosition: orientation == Qt.Horizontal ? MathUtils.clamp(mouseY, 0, height) : MathUtils.clamp(mouseX, 0, width) property point __pressedPosition: Qt.point(0, 0) property var __dragEvents: [] property bool clickValidated: true property bool zeroVelocityCounts: false signal dragStart signal dragEnd onDragValueChanged: { if (dragValue != 0 && pressed) { dragging = true } } onDraggingChanged: { if (dragging) { dragStart() } else { dragEnd() } } function updateSpeed() { var totalSpeed = 0 for (var i=0; i<__dragEvents.length; i++) { totalSpeed += __dragEvents[i][3] } if (zeroVelocityCounts || Math.abs(totalSpeed) > 0.001) { dragVelocity = totalSpeed / __dragEvents.length * 1000 } } function cullOldDragEvents(currentTime) { // cull events older than 50 ms but always keep the latest 2 events for (var numberOfCulledEvents=0; numberOfCulledEvents<__dragEvents.length-2; numberOfCulledEvents++) { // __dragEvents[numberOfCulledEvents][0] is the dragTime if (currentTime - __dragEvents[numberOfCulledEvents][0] <= 50) break } __dragEvents.splice(0, numberOfCulledEvents) } function getEventSpeed(currentTime, event) { if (__dragEvents.length != 0) { var lastDrag = __dragEvents[__dragEvents.length-1] var duration = Math.max(1, currentTime - lastDrag[0]) if (orientation == Qt.Vertical) { return (event.y - lastDrag[2]) / duration } else { return (event.x - lastDrag[1]) / duration } } else { return 0 } } function pushDragEvent(event) { var currentTime = new Date().getTime() __dragEvents.push([currentTime, event.x, event.y, getEventSpeed(currentTime, event)]) cullOldDragEvents(currentTime) updateSpeed() } onPositionChanged: { if (dragging) { pushDragEvent(mouse) } if (!draggingArea.containsMouse) clickValidated = false } onPressed: { __pressedPosition = Qt.point(mouse.x, mouse.y) __dragEvents = [] pushDragEvent(mouse) clickValidated = true } onReleased: { dragging = false __pressedPosition = Qt.point(mouse.x, mouse.y) } } ./src/Ubuntu/Components/1.3/PageColumnsLayout.qml0000644000015600001650000000727312700370701021730 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype PageColumnsLayout \inqmlmodule Ubuntu.Components 1.3 \since Ubuntu.Components 1.3 \ingroup ubuntu \brief Component configuring a layout in an AdaptivePageLayout component. The component specifies the column configuration of a specific layout. The layout will have as many columns as many PageColumn elements will be declared. The layout will be activated when the \l when property evaluates to \c true. There can be many layouts evaluated to true, only the first one evaluated to true in the \l AdaptivePageLayout::layouts list will be activated. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(100) height: units.gu(60) AdaptivePageLayout { anchors.fill: parent primaryPage: page1 layouts: [ PageColumnsLayout { when: width > units.gu(80) // column #0 PageColumn { minimumWidth: units.gu(30) maximumWidth: units.gu(60) preferredWidth: units.gu(40) } // column #1 PageColumn { fillWidth: true } }, PageColumnsLayout { when: true PageColumn { fillWidth: true minimumWidth: units.gu(10) } } ] Page { id: page1 title: "Main page" Column { Button { text: "Add Page2 above " + page1.title onClicked: page1.pageStack.addPageToCurrentColumn(page1, page2) } Button { text: "Add Page3 next to " + page1.title onClicked: page1.pageStack.addPageToNextColumn(page1, page3) } } } Page { id: page2 title: "Page #2" } Page { id: page3 title: "Page #3" } } } \endqml In the example above the second PageColumnLayout's condition is always set to true, which means that that the layout will be always active unless the first layout's condition evaluates to true. The layout overrides the single column minimumWidth default value. Note that \l PageColumn::fillWidth must be also set. \note When none of the conditions is met, a single column layout will be used. \sa PageColumn */ QtObject { id: layout /*! Condition activating the layout. Defaults to false. */ property bool when: false /*! \qmlproperty list data \default Default property holding the PageColumn elements configuring each column. */ default property alias data: layout.__data property list __data } ./src/Ubuntu/Components/1.3/PageHeadConfiguration.qdoc0000644000015600001650000001371612700370701022637 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \qmltype PageHeadConfiguration \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \since Ubuntu.Components 1.1 \brief Page.head is used to configure the header for a \l Page. For examples how to use Page.head, see \l Page. */ /*! List of actions to show in the header. Example: \qml Page { title: "Custom header actions" head.actions: [ Action { iconName: "save" text: i18n.tr("Save") }, Action { iconName: "add" text: i18n.tr("Add") } ] } \endqml \qmlproperty list PageHeadConfiguration::actions */ /*! \qmlproperty Action PageHeadConfiguration::backAction Overrides the default \l PageStack back button and the \l Tabs drawer button in the header. Example: \qml Page { title: "Back Action Page" head.backAction: Action { iconName: "close" onTriggered: { console.log("Run custom back action") } } } \endqml */ /*! \qmlproperty Item PageHeadConfiguration::contents Set this property to show this Item in the header instead of the title. Use a \l TextField here for implementing search in header. The parent of this Item will be binded while the \l Page is active. The header contents will automatically be anchored to the left and vertically centered inside the header. Example: \qml Page { title: "Invisible title" head.contents: Rectangle { color: UbuntuColors.orange height: units.gu(5) width: parent ? parent.width - units.gu(2) : undefined } } \endqml See \l PageHeadState for an example that shows how search mode can be implemented. */ // FIXME: The example below can be much simplified using PageHeadState // when bug #1345775 has been fixed. /*! \qmlproperty string PageHeadConfiguration::preset Choose a preset for the header visuals and behavior. The default is an empty string "". By setting this to "select", title will be hidden and actions will be represented by icons with a label. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 MainView { id: mainView width: units.gu(40) height: units.gu(50) Page { id: page title: "Demo" state: "default" states: [ PageHeadState { name: "default" head: page.head actions: [ Action { iconName: "contact" text: "Contact" } ] }, State { id: selectState name: "select" property Action leaveSelect: Action { iconName: "back" text: "Back" onTriggered: page.state = "default" } property list actions: [ Action { iconName: "select" text: "Select All" }, Action { iconName: "delete" text: "Delete" } ] PropertyChanges { target: page.head backAction: selectState.leaveSelect actions: selectState.actions preset: "select" } } ] Label { anchors.centerIn: parent text: "Use back button to leave selection mode." visible: page.state == "select" } Button { anchors.centerIn: parent onClicked: page.state = "select" visible: page.state != "select" text: "selection mode" } } } \endqml */ /*! \qmlproperty PageHeadSections PageHeadConfiguration::sections Defines the sections in the page header divider. */ /*! \qmlproperty color PageHeadConfiguration::foregroundColor The color of the text and icons. */ /*! \qmlproperty bool PageHeadConfiguration::locked \since 1.3 When the \l Page is active, the locked property controls the behavior of the header. A locked header stays visible or invisible, depending on the value of the \l visible property. An unlocked header automatically shows and hides if the \l Page has a flickable in which the user scrolls up or down. Default value: false */ /*! \qmlproperty bool PageHeadConfiguration::visible \since 1.3 Update the value of the visible property to show or hide the header. This works both when the header is \l locked and unlocked. An unlocked header can also become visible or hidden when the user scrolls the active \l Page's flickable. The value of the visible property will be updated at the end of the showing/hiding animation of the header. */ /*! \qmlproperty string PageHeadConfiguration::title \since 1.3 The title to show in the header. This is automatically copied from the \l Page title. */ ./src/Ubuntu/Components/1.3/ActionBar.qml0000644000015600001650000000572712700370701020161 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype ActionBar \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu \brief Show a row of buttons that trigger actions. When the number of visible actions specified is larger than \l numberOfSlots, an overflow button will be shown which triggers an overflow panel that shows the remaining actions. Example: \qml ActionBar { numberOfSlots: 2 actions: [ Action { iconName: "share" text: "Share" }, Action { iconName: "starred" text: "Favorite" }, Action { iconName: "lock" text: "Lock" } ] } \endqml */ StyledItem { id: bar styleName: "ActionBarStyle" /*! The actions to display in the bar. If more actions are specified than there are slots, an overflow button will be show which opens a popover with the actions that did not fit in the bar directly. */ property list actions /*! The number of actions to be shown in the bar directly. If the actions don't fit, an overflow button (using one slot) will be shown which opens a popover with the remaining actions. Setting numberOfSlots to 0 will always show the overflow button and no other action buttons. Default value from the Ambience theme is 3. */ property int numberOfSlots: __styleInstance.defaultNumberOfSlots /*! Set this to override the default delegate button that shows the actions in the ActionBar. Uses the defaultDelegate of ActionBarStyle by default. Example: \qml ActionBar { id: customDelegateBar anchors.right: parent.right actions: [ Action { text: "action 1" }, Action { text: "action 2" } ] delegate: Button { action: modelData width: units.gu(14) strokeColor: UbuntuColors.purple } } \endqml */ property Component delegate: __styleInstance.defaultDelegate } ./src/Ubuntu/Components/1.3/TextField.qml0000644000015600001650000010641412700370701020202 0ustar jenkinsjenkins/* * Copyright 2015-2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 as Ubuntu import Ubuntu.Components.Popups 1.3 /*! \qmltype TextField \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The TextField element displays a single line of editable plain text. Input constraints can be set through validator or inputMask. Setting echoMode to an appropriate value enables TextField to be used as password input field. \l {https://design.ubuntu.com/apps/building-blocks/text-input#text-field}{See also the Design Guidelines on the Text Field}. Example: \qml Item { TextField { placeholderText: "hint text" } TextField { placeholderText: "without clear sign" hasClearButton: false } TextField { placeholderText: "password" echoMode: TextInput.Password } TextField { placeholderText: "overlaid in front" primaryItem: Image { height: parent.height width: height source: "magnifier.png" } secondaryItem: Row { Button { height: parent.height width: height iconName: "compose" onClicked: doSomething() } Button { height: parent.height width: height iconName: "undo" onClicked: doSomething() } } } } \endqml \section2 Scrolling and text selection The input is activated when the tap or mouse is released after being pressed over the component. The text can be scrolled horizontally by swiping over the content both when the component is active or inactive. The content can be selected in the following ways: \list \li - double tapping/left mouse clicking over the content, when the word that had been tapped over will be selected \li - by pressing and dragging the selection cursor over the text input. Note that there has to be a delay of approx. 200 ms between the press and drag gesture, time when the input switches from scroll mode to selection mode \endlist The input is focused (activated) upon tap/left mouse button release. The cursor will be placed at the position the mouse/tap point at release time. If the click is happening on a selected area, the selection will be cleared. Long press above a selected area brings up the clipboard context menu. When the long press happens over a non-selected area, the cursor will be moved to the position and the component enters in selection mode. The selection mode can also be activated by tapping and keeping the tap/mouse over for approx 300 ms. If there is a move during this time, the component enters into scrolling mode. The mode is exited once the scrolling finishes. During the scrolling mode the selected text is preserved. \note During text selection all interactive parent Flickables are turned off. */ Ubuntu.ActionItem { id: control implicitWidth: units.gu(25) implicitHeight: units.gu(4) /*! The property presents whether the TextField is highlighted or not. By default the TextField gets highlighted when gets the focus, so can accept text input. This property allows to control the highlight separately from the focused behavior. */ property bool highlighted: activeFocus /*! Text that appears when there is no content in the component. \qmlproperty string placeholderText */ property alias placeholderText: hint.text /*! Specifies whether the control has a clear button or not. */ property bool hasClearButton: true /*! \deprecated Component to be shown and used instead of the default On Screen Keyboard. */ property Component customSoftwareInputPanel onCustomSoftwareInputPanelChanged: console.error("customSoftwareInputPanel property deprecated.") /*! The property overrides the default popover of the TextField. When set, the TextField will open the given popover instead of the default one defined. The popover can either be a component or a URL to be loaded. */ property var popover /*! Overlaid component that can be set for the fore side of the TextField, e.g.showing a magnifier to implement search functionality. \qmlproperty list primaryItem */ property alias primaryItem: leftPane.data /*! Overlaid component that can be set for the rear side of the TextField, e.g.showing a CAPS LOCK or NUM LOCK indication. The overlaid components will be placed right after the clear button. \qmlproperty list secondaryItem */ property alias secondaryItem: rightPane.data /*! Allows highlighting errors in the TextField. */ property bool errorHighlight: !acceptableInput // aliased properties from TextInput /*! This property is always true unless a validator or input mask has been set. If a validator or input mask has been set, this property will only be true if the current text is acceptable to the validator or input mask as a final string (not as an intermediate string). \qmlproperty bool acceptableInput */ property alias acceptableInput: editor.acceptableInput /*! Whether the TextField should gain active focus on a mouse press. By default this is set to true. \qmlproperty bool activeFocusOnPress */ property alias activeFocusOnPress: editor.activeFocusOnPress /*! Whether the TextField should scroll when the text is longer than the width. By default this is set to true. \qmlproperty bool autoScroll */ property alias autoScroll: editor.autoScroll /*! Returns true if the TextField is writable and the content of the clipboard is suitable for pasting into the TextField. \qmlproperty bool canPaste */ property alias canPaste: editor.canPaste /*! Returns true if the TextField is writable and there are undone operations that can be redone. \qmlproperty bool canRedo */ property alias canRedo: editor.canRedo /*! Returns true if the TextField is writable and there are previous operations that can be undone. \qmlproperty bool canUndo */ property alias canUndo: editor.canUndo /*! The text color. \qmlproperty color color */ property alias color: editor.color /*! Returns the height of the text, including the height past the height that is covered if the text does not fit within the set height. \qmlproperty real contentHeight */ property alias contentHeight: editor.contentHeight /*! Returns the width of the text, including the width past the width which is covered due to insufficient wrapping if wrapMode is set. \qmlproperty real contentWidth */ property alias contentWidth: editor.contentWidth /*! The delegate for the cursor in the TextField. If you set a cursorDelegate for a TextField, this delegate will be used for drawing the cursor instead of the standard cursor. An instance of the delegate will be created and managed by the TextField when a cursor is needed, and the x property of delegate instance will be set so as to be one pixel before the top left of the current character. Note that the root item of the delegate component must be a QQuickItem or QQuickItem derived item. */ property Component cursorDelegate: null /*! The position of the cursor in the TextField. \qmlproperty int cursorPosition */ property alias cursorPosition: editor.cursorPosition /*! The rectangle where the standard text cursor is rendered within the text input. Read only. The position and height of a custom cursorDelegate are updated to follow the cursorRectangle automatically when it changes. The width of the delegate is unaffected by changes in the cursor rectangle. \qmlproperty rectangle cursorRectangle */ property alias cursorRectangle: editor.cursorRectangle /*! Set to true when the TextField shows a cursor. This property is set and unset when the TextField gets active focus, so that other properties can be bound to whether the cursor is currently showing. As it gets set and unset automatically, when you set the value yourself you must keep in mind that your value may be overwritten. It can be set directly in script, for example if a KeyProxy might forward keys to it and you desire it to look active when this happens (but without actually giving it active focus). It should not be set directly on the item, like in the below QML, as the specified value will be overridden an lost on focus changes. \qml TextField { text: "Text" cursorVisible: false } \endqml In the above snippet the cursor will still become visible when the TextField gains active focus. \qmlproperty bool cursorVisible */ property alias cursorVisible: editor.cursorVisible /*! This is the text displayed in the TextField. If echoMode is set to TextInput::Normal, this holds the same value as the \l text property. Otherwise, this property holds the text visible to the user, while the text property holds the actual entered text. \qmlproperty string displayText */ property alias displayText: editor.displayText /*! Specifies how the text should be displayed in the TextField. \list \li - TextInput.Normal - Displays the text as it is. (Default) \li - TextInput.Password - Displays asterixes instead of characters. \li - TextInput.NoEcho - Displays nothing. \li - TextInput.PasswordEchoOnEdit - Displays characters as they are entered while editing, otherwise displays asterisks. \endlist \qmlproperty enumeration echoMode */ property alias echoMode: editor.echoMode /*! Font used in the TextField. \qmlproperty font font */ property alias font: editor.font /*! Allows you to set an input mask on the TextField, restricting the text inputs. See QLineEdit::inputMask for further details, as the exact same mask strings are used by TextField. Note that when using an inputMask together with echoMode to hide the input the empty TextField may still show masked characters - consider \l validator instead. \sa acceptableInput, validator \qmlproperty string inputMask */ property alias inputMask: editor.inputMask /*! This property holds whether the TextInput has partial text input from an input method. While it is composing an input method may rely on mouse or key events from the TextField to edit or commit the partial text. This property can be used to determine when to disable events handlers that may interfere with the correct operation of an input method. \qmlproperty bool inputMethodComposing */ property alias inputMethodComposing: editor.inputMethodComposing /*! Provides hints to the input method about the expected content of the text input and how it should operate. The value is a bit-wise combination of flags, or Qt.ImhNone if no hints are set. Flags that alter behaviour are: \list \li - Qt.ImhHiddenText - Characters should be hidden, as is typically used when entering passwords. This is automatically set when setting echoMode to \c TextInput.Password. \li - Qt.ImhSensitiveData - Typed text should not be stored by the active input method in any persistent storage like predictive user dictionary. \li - Qt.ImhNoAutoUppercase - The input method should not try to automatically switch to upper case when a sentence ends. \li - Qt.ImhPreferNumbers - Numbers are preferred (but not required). \li - Qt.ImhPreferUppercase - Upper case letters are preferred (but not required). \li - Qt.ImhPreferLowercase - Lower case letters are preferred (but not required). \li - Qt.ImhNoPredictiveText - Do not use predictive text (i.e. dictionary lookup) while typing. \li - Qt.ImhDate - The text editor functions as a date field. \li - Qt.ImhTime - The text editor functions as a time field. \endlist Flags that restrict input (exclusive flags) are: \list \li - Qt.ImhDigitsOnly - Only digits are allowed. \li - Qt.ImhFormattedNumbersOnly - Only number input is allowed. This includes decimal point and minus sign. \li - Qt.ImhUppercaseOnly - Only upper case letter input is allowed. \li - Qt.ImhLowercaseOnly - Only lower case letter input is allowed. \li - Qt.ImhDialableCharactersOnly - Only characters suitable for phone dialing are allowed. \li - Qt.ImhEmailCharactersOnly - Only characters suitable for email addresses are allowed. \li - Qt.ImhUrlCharactersOnly - Only characters suitable for URLs are allowed. \endlist Masks: \list \li - Qt.ImhExclusiveInputMask - This mask yields nonzero if any of the exclusive flags are used. \endlist \qmlproperty enumeration inputMethodHints */ property alias inputMethodHints: editor.inputMethodHints /*! Returns the total number of characters in the TextField item. If the TextField has an inputMask the length will include mask characters and may differ from the length of the string returned by the text property. This property can be faster than querying the length the text property as it doesn't require any copying or conversion of the TextField's internal string data. \qmlproperty int length */ property alias length: editor.length /*! The maximum permitted length of the text in the TextField. If the text is too long, it is truncated at the limit. By default, this property contains a value of 32767. \qmlproperty int maximumLength */ property alias maximumLength: editor.maximumLength /*! Specifies how text should be selected using a mouse. \list \li -TextInput.SelectCharacters - The selection is updated with individual characters. (Default) \li -TextInput.SelectWords - The selection is updated with whole words. \endlist This property only applies when selectByMouse is true. \qmlproperty enumeration mouseSelectionMode */ property alias mouseSelectionMode: editor.mouseSelectionMode /*! Whether the TextField should keep its selection when it loses active focus to another item in the scene. By default this is set to false. \qmlproperty bool persistentSelection */ property alias persistentSelection: editor.persistentSelection /*! Sets whether user input can modify the contents of the TextField. If readOnly is set to true, then user input will not affect the text property. Any bindings or attempts to set the text property will still work. \qmlproperty bool readOnly */ property alias readOnly: editor.readOnly /*! Override the default rendering type for this component. Supported render types are: \list \li - Text.QtRendering - (default) \li - Text.NativeRendering \endlist Select Text.NativeRendering if you prefer text to look native on the target platform and do not require advanced features such as transformation of the text. Using such features in combination with the NativeRendering render type will lend poor and sometimes pixelated results. \qmlproperty enumeration renderType */ property alias renderType: editor.renderType /*! Defaults to true. If false, the user cannot use the mouse to select text, only can use it to focus the input. \qmlproperty bool selectByMouse */ property alias selectByMouse: editor.selectByMouse /*! This read-only property provides the text currently selected in the text input. It is equivalent to the following snippet, but is faster and easier to use. \code myTextInput.text.toString().substring(myTextInput.selectionStart, myTextInput.selectionEnd); \endcode \qmlproperty string selectedText */ readonly property alias selectedText: editor.selectedText /*! The cursor position before the first character in the current selection. This property is read-only. To change the selection, use select(start,end), selectAll(), or selectWord(). \qmlproperty int selectionStart */ property alias selectionStart: editor.selectionStart /*! The cursor position after the last character in the current selection. This property is read-only. To change the selection, use select(start,end), selectAll(), or selectWord(). \qmlproperty int selectionEnd */ property alias selectionEnd: editor.selectionEnd /*! The text in the TextField. \qmlproperty string text */ property alias text: editor.text /*! Allows you to set a validator on the TextInput. When a validator is set the TextField will only accept input which leaves the text property in an acceptable or intermediate state. The accepted signal will only be sent if the text is in an acceptable state when enter is pressed. Currently supported validators are IntValidator, DoubleValidator and RegExpValidator. An example of using validators is shown below, which allows input of integers between 11 and 31 into the text input: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 TextField{ validator: IntValidator{bottom: 11; top: 31;} focus: true } \endqml The next example is for a use case of typing a PIN with masked characters. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 TextField { echoMode: TextInput.Password validator: RegExpValidator { regExp: /^\d{4}$/ } inputMethodHints: Qt.ImhDigitsOnly } \endqml \sa acceptableInput, inputMask \qmlproperty Validator validator */ property alias validator: editor.validator /*! Sets the horizontal alignment of the text within the item's width and height. By default, the text alignment follows the natural alignment of the text, for example text that is read from left to right will be aligned to the left. TextField does not have vertical alignment, as the natural height is exactly the height of the single line of text. If you set the height manually to something larger, TextInput will always be top aligned vertically. You can use anchors to align it however you want within another item. The valid values for horizontalAlignment are TextInput.AlignLeft, TextInput.AlignRight and TextInput.AlignHCenter. Valid values for verticalAlignment are TextInput.AlignTop (default), TextInput.AlignBottom TextInput.AlignVCenter. When using the attached property LayoutMirroring::enabled to mirror application layouts, the horizontal alignment of text will also be mirrored. However, the property horizontalAlignment will remain unchanged. To query the effective horizontal alignment of TextField, use the read-only property effectiveHorizontalAlignment. \qmlproperty enumeration horizontalAlignment */ property alias horizontalAlignment: editor.horizontalAlignment /*! \qmlproperty enumeration effectiveHorizontalAlignment See \l horizontalAlignment for details. */ property alias effectiveHorizontalAlignment: editor.effectiveHorizontalAlignment /*! \qmlproperty enumeration verticalAlignment See \l horizontalAlignment for details. */ property alias verticalAlignment: editor.verticalAlignment /*! This is the character displayed when echoMode is set to Password or PasswordEchoOnEdit. By default it is the unicode character 2022. If this property is set to a string with more than one character, the first character is used. If the string is empty, the value is ignored and the property is not set. \qmlproperty string passwordCharacter */ property alias passwordCharacter: editor.passwordCharacter /*! The text highlight color, used behind selections. \qmlproperty color selectionColor */ property alias selectionColor: editor.selectionColor /*! The highlighted text color, used in selections. \qmlproperty color selectedTextColor */ property alias selectedTextColor: editor.selectedTextColor /*! This handler is called when the Return or Enter key is pressed. Note that if there is a validator or inputMask set on the text input, the handler will only be emitted if the input is in an acceptable state. */ signal accepted() /*! \internal If used with an action or Option accepting propagates the new text. */ onAccepted: { control.triggered(control.text) } /*! Copies the currently selected text to the system clipboard. */ function copy() { editor.copy(); } /*! Moves the currently selected text to the system clipboard. */ function cut() { editor.cut(); } /*! Places the clipboard or the data given as parameter into the text input. The selected text will be replaces with the data. */ function paste(data) { if ((data !== undefined) && (typeof data === "string") && !editor.readOnly) { var selTxt = editor.selectedText; var txt = editor.text; var pos = (selTxt !== "") ? txt.indexOf(selTxt) : editor.cursorPosition if (selTxt !== "") { editor.text = txt.substring(0, pos) + data + txt.substr(pos + selTxt.length); } else { editor.text = txt.substring(0, pos) + data + txt.substr(pos); } editor.cursorPosition = pos + data.length; } else editor.paste(); } /*! Removes active text selection. */ function deselect() { editor.deselect(); } /*! Inserts \a text into the TextField at \a position. */ function insert(position, text) { editor.insert(position, text); } /*! This function returns the character position at x pixels from the left of the TextField. Position 0 is before the first character, position 1 is after the first character but before the second, and so on until position text.length, which is after all characters. This means that for all x values before the first character this function returns 0, and for all x values after the last character this function returns text.length. The cursor position type specifies how the cursor position should be resolved. \list \li - TextInput.CursorBetweenCharacters - Returns the position between characters that is nearest x. \li - TextInput.CursorOnCharacter - Returns the position before the character that is nearest x. \endlist */ function positionAt(x, position) { if (position == undefined) return editor.positionAt(x); else return editor.positionAt(x, position); } /*! This function takes a character position and returns the rectangle that the cursor would occupy, if it was placed at that character position. This is similar to setting the cursorPosition, and then querying the cursor rectangle, but the cursorPosition is not changed. */ function positionToRectangle(pos) { return editor.positionToRectangle(pos); } /*! Causes the text from start to end to be selected. If either start or end is out of range, the selection is not changed. After calling this, selectionStart will become the lesser and selectionEnd will become the greater (regardless of the order passed to this method). */ function select(start, end) { editor.select(start, end); } /*! Causes all text to be selected. */ function selectAll() { editor.selectAll(); } /*! Causes the word closest to the current cursor position to be selected. */ function selectWord() { editor.selectWord(); } /*! Returns true if the natural reading direction of the editor text found between positions start and end is right to left. */ function isRightToLeft(start, end) { return editor.isRightToLeft(start, end); } /*! Moves the cursor to position and updates the selection according to the optional mode parameter. (To only move the cursor, set the cursorPosition property.) When this method is called it additionally sets either the selectionStart or the selectionEnd (whichever was at the previous cursor position) to the specified position. This allows you to easily extend and contract the selected text range. The selection mode specifies whether the selection is updated on a per character or a per word basis. If not specified the selection mode will default to TextInput.SelectCharacters. \list \li - TextInput.SelectCharacters - Sets either the selectionStart or selectionEnd (whichever was at the previous cursor position) to the specified position. \li - TextInput.SelectWords - Sets the selectionStart and selectionEnd to include all words between the specified position and the previous cursor position. Words partially in the range are included. \endlist For example, take this sequence of calls: \code cursorPosition = 5 moveCursorSelection(9, TextInput.SelectCharacters) moveCursorSelection(7, TextInput.SelectCharacters) \endcode This moves the cursor to position 5, extend the selection end from 5 to 9 and then retract the selection end from 9 to 7, leaving the text from position 5 to 7 selected (the 6th and 7th characters). The same sequence with TextInput.SelectWords will extend the selection start to a word boundary before or on position 5 and extend the selection end to a word boundary on or past position 9. */ function moveCursorSelection(position, mode) { editor.moveCursorSelection(position, mode) } /*! Redoes the last operation if redo is \l {canRedo}{available}. */ function redo() { editor.redo(); } /*! Undoes the last operation if undo is \l {canUndo}{available}. Deselects any current selection, and updates the selection start to the current cursor position. */ function undo() { editor.undo(); } /*! Removes the section of text that is between the start and end positions from the TextField. */ function remove(start, end) { editor.remove(start, end); } /*! Returns the section of text that is between the start and end positions. If the TextField has an inputMask the length will include mask characters. */ function getText(start, end) { return editor.getText(start, end); } // internals activeFocusOnPress: true activeFocusOnTab: true /*! \internal */ onVisibleChanged: { if (!visible) control.focus = false; } // Escape should close the context menu even if the menu takes no input focus Keys.onEscapePressed: { if (activeFocus && inputHandler.popover) { PopupUtils.close(inputHandler.popover) } else { event.accepted = false } } LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft LayoutMirroring.childrenInherit: true // grab clicks from the area between the frame and the input MouseArea { anchors.fill: parent acceptedButtons: Qt.LeftButton | Qt.RightButton // use it only when there is space between the frame and input enabled: internal.spacing > 0 preventStealing: false // forward mouse events to input so we can handle those uniformly Ubuntu.Mouse.forwardTo: [inputHandler] cursorShape: Qt.IBeamCursor } Text { id: fontHolder } //internals QtObject { id: internal // array of borders in left, top, right, bottom order property real spacing: control.__styleInstance.frameSpacing property int type: action ? action.parameterType : Ubuntu.Action.None onTypeChanged: { // Don't undo explicitly specified hints if (inputMethodHints != Qt.ImhNone) return if (type == Ubuntu.Action.Integer || type == Ubuntu.Action.Real) inputMethodHints = Qt.ImhDigitsOnly } } //left pane Item { id: leftPane anchors { left: parent.left leftMargin: internal.spacing verticalCenter: parent.verticalCenter } // the left pane width depends on its children width height: parent.height width: childrenRect.width // Overlay needs to have priority z: 1 onChildrenChanged: { // reparenting for (var i = 0; i < children.length; i++) { var child = children[i]; child.parent = leftPane; child.anchors.verticalCenter = verticalCenter; if (child.hasOwnProperty("activeFocusOnPress")) { child.activeFocusOnPress = false; } child.activeFocusOnTab = false; } } } // right pane Item { id: rightPane anchors { right: parent.right rightMargin: internal.spacing verticalCenter: parent.verticalCenter } // the right pane width depends on its children width height: parent.height width: childrenRect.width // Overlay needs to have priority z: 1 onChildrenChanged: { // reparenting for (var i = 0; i < children.length; i++) { var child = children[i]; child.parent = rightPane; child.anchors.verticalCenter = verticalCenter; if (child.hasOwnProperty("activeFocusOnPress")) { child.activeFocusOnPress = false; } child.activeFocusOnTab = false; } } } Ubuntu.AbstractButton { id: clearButton objectName: "clear_button" activeFocusOnPress: false activeFocusOnTab: false anchors { top: parent.top right: rightPane.left bottom: parent.bottom margins: internal.spacing } /* draggedItemMouseArea and dragger in TextCursor are reparented to the TextField and end up being on top of the clear button. Ensure that the clear button receives touch/mouse events first. */ z: 100 width: visible ? icon.width : 0 visible: control.hasClearButton && !control.readOnly && (control.activeFocus && ((editor.text != "") || editor.inputMethodComposing)) Ubuntu.Icon { id: icon anchors.verticalCenter: parent.verticalCenter width: units.gu(2.5) height: width // use icon from icon-theme name: control.hasClearButton && !control.readOnly ? "edit-clear" : "" } onClicked: editor.text = "" } // hint text Ubuntu.Label { id: hint verticalAlignment: Text.AlignVCenter horizontalAlignment: editor.horizontalAlignment anchors { left: leftPane.right right: clearButton.left top: parent.top bottom: parent.bottom margins: internal.spacing } // hint is shown till user types something in the field visible: (editor.text == "") && !editor.inputMethodComposing color: theme.palette.normal.baseText font: editor.font elide: Text.ElideRight } // text input Flickable { id: flicker objectName: "input_scroller" anchors { left: leftPane.right right: clearButton.left top: parent.top bottom: parent.bottom margins: internal.spacing } topMargin: internal.spacing // do not allow rebounding boundsBehavior: Flickable.StopAtBounds // need to forward events as events occurred on topMargin area are not grabbed by the MouseArea. Ubuntu.Mouse.forwardTo: [inputHandler] clip: true contentWidth: editor.contentWidth contentHeight: editor.contentHeight TextInput { id: editor objectName: "text_input" // FocusScope will forward focus to this component focus: true anchors.verticalCenter: parent.verticalCenter verticalAlignment: TextInput.AlignVCenter width: flicker.width height: flicker.height cursorDelegate: TextCursor { handler: inputHandler } color: control.__styleInstance.color selectedTextColor: control.__styleInstance.selectedTextColor selectionColor: control.__styleInstance.selectionColor font.pixelSize: FontUtils.sizeToPixels("medium") passwordCharacter: "\u2022" // forward keys to the root element so it can be captured outside of it // as well as to InputHandler to handle PageUp/PageDown keys Keys.forwardTo: [control, inputHandler] // overrides selectByMouse: true activeFocusOnPress: true onActiveFocusChanged: if (!activeFocus && inputHandler.popover) PopupUtils.close(inputHandler.popover) // input selection and navigation handling Ubuntu.Mouse.forwardTo: [inputHandler] InputHandler { id: inputHandler anchors.fill: parent main: control input: editor flickable: flicker } } } Component.onCompleted: { editor.accepted.connect(control.accepted); cursorPosition = 0; } styleName: "TextFieldStyle" } ./src/Ubuntu/Components/1.3/Tab.qml0000644000015600001650000001337112700370701017017 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 as Toolkit /*! \qmltype Tab \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Component to represent a single tab in a \l Tabs environment. Examples: See \l Tabs. */ Toolkit.PageTreeNode { id: tab anchors.fill: parent ? parent : undefined /*! The title that is shown on the tab button used to select this tab. */ property string title /*! \deprecated The location of the icon that is displayed inside the button used to select this tab (optional). Either \l title or iconSource, or both must be defined. Deprecated because our new tab buttons in the header do not display an icon. */ property url iconSource /*! The contents of the Tab. Use a \l Page or a Loader that instantiates a Component or loads an external \l Page. When using a Loader, do not set the anchors or dimensions of the Loader so that the \l Page can control the height and prevent overlapping the header. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(40) height: units.gu(50) Component { id: pageComponent Page { Label { anchors.centerIn: parent text: "Loaded when tab is selected." } } } Tabs { id: tabs Tab { title: i18n.tr("Simple page") page: Page { Label { anchors.centerIn: parent text: i18n.tr("Always loaded") } } } Tab { id: loaderTab title: i18n.tr("Page loader") page: Loader { // no anchors id: loader sourceComponent: tabs.selectedTab == loaderTab ? pageComponent : null onStatusChanged: if (loader.status == Loader.Ready) console.log('Loaded') } } } } \endqml */ property Item page: null // In case the page is a Loader with a Page inside, the Loader needs to be // anchored to the bottom of the Tab. Width and height are set by the Page. Binding { target: page property: "anchors.bottom" value: tab.bottom when: page } /*! \qmlproperty int index \readonly The property holds the index of the tab within the Tabs. */ readonly property alias index: internal.index /*! When page is updated, set its parent to be tab. */ onPageChanged: if (page) page.parent = tab /*! The tab is active when it is the selected tab of its parent Tabs item. Setting tab to active will automatically make child nodes active. */ active: parentNode && parentNode.active && parentNode.hasOwnProperty("selectedTab") && parentNode.selectedTab === tab visible: active /*! \internal */ onTitleChanged: { if (active) { // ensure the parent node is an instance of Tabs if (parentNode.hasOwnProperty("selectedTab")) { parentNode.modelChanged(); } } } /*! \internal */ property alias __protected: internal Toolkit.Object { id: internal /* Specifies the index of the Tab in Tabs. */ property int index: -1 /* Specifies whether the Tab has already been inserted in Tabs model or not. Pre-declared tabs are added one by one automatically before Tabs component completion, therefore we need this flag to exclude adding those Tab elements again which were already added. */ property bool inserted: false /* Specifies whether the Tab was created dynamically or not. A dynamically created Tab is destroyed upon removal. */ property bool dynamic: false /* This flag is used by the Tabs to determine whether the pre-declared Tab was removed from the Tabs model or not. The flag guards adding back pre-declared tabs upon Tabs component stack (children) change. */ property bool removedFromTabs: false /*! Triggering this action will select the tab. Used by the tabs OverflowPanel. */ property alias action: selectTabAction Toolkit.Action { id: selectTabAction text: tab.title objectName: "select_tab_"+index iconSource: tab.iconSource onTriggered: { if (internal.index < 0) return; if (tab.parentNode && tab.parentNode.hasOwnProperty("selectedTabIndex")) { tab.parentNode.selectedTabIndex = internal.index; } } } } } ./src/Ubuntu/Components/1.3/Captions.qml0000644000015600001650000001230012700370701020060 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Layouts 1.1 import Ubuntu.Components 1.3 /*! \qmltype Captions \inqmlmodule Ubuntu.Components 1.2 \ingroup ubuntu-listitem \since Ubuntu.Components 1.2 \brief Container providing captionStyles for a twin-label column that can be used in RowLayout or GridLayout. The labels are placed in a column and can be accessed through \l title and \l subtitle properties. The default spacing between the labels is 0.5 grid units. The container only shows the labels which has its text property set to a valid string. The labels not having any text set are not occupying the space. When embedded in a positioner or in a RowLayout, the container is aligned vertically centered. It is recommended to be used in context with RowLayout or GridLayout, however can be used with any component. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 ListItem { RowLayout { Captions { title.text: "Caption" subtitle.text: "Subtitle text" // attached properties of an Item type property // can be changed only with assignment Component.onCompleted: subtitle.Layout.alignment = Qt.AlignRight } Captions { captionStyle: Ubuntu.SummaryCaptionStyle title.text: "Text" subtitle.text: "Text" } } } \endqml Additional items can also be added to the layout after the two labels. \qml Captions { title.text: "Caption" subtitle.text: "Subtitle" Label { text: "third line" textSize: Label.XxSmall } } \endqml */ ColumnLayout { id: captions /*! \qmlproperty enumeration captionStyle The property configures the arrangement and font sizes of the Labels in the component. It can take the following values: \list \li \b Ubuntu.TitleCaptionStyle - (default) typical configuration for a left aligned twin-label setup, where the text covers the remaining area on a list layout. \li \b Ubuntu.SummaryCaptionStyle - configuration for a right-aligned twin label setup, with 6 grid units width. \endlist */ property int captionStyle: Ubuntu.TitleCaptionStyle /*! \qmlproperty Label title \readonly Label occupying the top area of the container. */ property alias title: titleLabel /*! \qmlproperty Label subtitle \readonly Label occupying the bottom area of the container. */ property alias subtitle: subtitleLabel clip: true spacing: units.gu(0.5) Layout.fillWidth: (captionStyle == Ubuntu.TitleCaptionStyle) Layout.alignment: Qt.AlignVCenter | ((captionStyle == Ubuntu.SummaryCaptionStyle) ? Qt.AlignRight : Qt.AlignLeft) Layout.minimumWidth: 0 Layout.maximumWidth: (captionStyle == Ubuntu.SummaryCaptionStyle) ? units.gu(6) : parent.width Layout.preferredWidth: (captionStyle == Ubuntu.SummaryCaptionStyle) ? Layout.maximumWidth : 0 Layout.minimumHeight: 0 Layout.maximumHeight: parent ? parent.height : childrenRect.height Layout.preferredHeight: childrenRect.height // handle visibility, do not override visible property! // 'hide' column if title and subtitle is an empty string and // there's no more children added states: State { name: "__q_invisible" when: (title.text === "" && subtitle.text === "") && (captions.children.length == 2) PropertyChanges { target: captions visible: false } } Label { id: titleLabel anchors { left: parent.left right: parent.right } textSize: (captionStyle == Ubuntu.SummaryCaptionStyle) ? Label.Small : Label.Medium horizontalAlignment: (captionStyle == Ubuntu.SummaryCaptionStyle) ? Text.AlignRight : Text.AlignLeft visible: text !== "" elide: (captionStyle == Ubuntu.TitleCaptionStyle) ? Text.ElideRight : Text.ElideNone } Label { id: subtitleLabel anchors { left: parent.left right: parent.right } textSize: Label.Small horizontalAlignment: (captionStyle == Ubuntu.SummaryCaptionStyle) ? Text.AlignRight : Text.AlignLeft visible: text !== "" maximumLineCount: (captionStyle == Ubuntu.TitleCaptionStyle) ? 2 : 1 wrapMode: (captionStyle == Ubuntu.TitleCaptionStyle) ? Text.Wrap : Text.NoWrap elide: (captionStyle == Ubuntu.TitleCaptionStyle) ? Text.ElideRight : Text.ElideNone } } ./src/Ubuntu/Components/1.3/PullToRefresh.qml0000644000015600001650000001775612700370701021062 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype PullToRefresh \inqmlmodule Ubuntu.Components 0.1 \ingroup ubuntu \since Ubuntu.Components 1.1 \brief Pull-to-refresh component for Flickables to reload a model upon pull. The component provides ability to initiate data model refresh by pulling the attached Flickable's content. The refresh can be initiated when the flickable content is at its top boundary. By dragging the content further, reaching the threshold value defined by the style will initiate the manual refresh by emitting the \l refresh signal. The progress of the refresh must be notified to the component by defining the completion clause to the \l refreshing property. \qml import QtQuick 2.4 import QtQuick.XmlListModel 2.0 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 MainView { width: units.gu(40) height: units.gu(71) XmlListModel { id: listModel source: "http://feeds.reuters.com/reuters/topNews" query: "/rss/channel/item" XmlRole { name: "title"; query: "title/string()" } } Page { title: "Reuters" ListView { id: view anchors.fill: parent model: listModel delegate: Standard { width: ListView.view.width height: units.gu(5) text: title } PullToRefresh { refreshing: view.model.status === XmlListModel.Loading onRefresh: view.model.reload() } } } } \endqml \note UbuntuListView has a built-in PullToRefresh, therefore it is recommended to use UbuntuListView instead of ListView. The component will also show the progress of the model's update when the refresh gets initiated by the model or from other party. Style implementations can decide whether to visualize that or not. As default, the component displays a Label visualizing the two states of the component, which is pull to refresh and release to refresh. As mentioned, this is driven by the threshold value specified by the style, and the state is reported by the \l releaseToRefresh property. The \l content specifies the visuals to be shown by the component. Custom implementations can hold any component, which will be anchor filled to the component itself. \qml import QtQuick 2.4 import QtQuick.XmlListModel 2.0 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 MainView { width: units.gu(40) height: units.gu(71) XmlListModel { id: listModel source: "http://feeds.reuters.com/reuters/topNews" query: "/rss/channel/item" XmlRole { name: "title"; query: "title/string()" } } Page { title: "Reuters" ListView { id: view anchors.fill: parent model: listModel delegate: Standard { width: ListView.view.width height: units.gu(5) text: title } PullToRefresh { id: pullToRefresh refreshing: view.model.status === XmlListModel.Loading onRefresh: view.model.reload() content: Item { Icon { name: pullToRefresh.releaseToRefresh ? "search" : "" height: parent.height width: height anchors.horizontalCenter: parent.horizontalCenter } } } } } } \endqml \note When declared as child of Flickable, set parent to the flickable explicitly so the component does not land in the \c content of Flickable. \qml import QtQuick 2.4 import QtQuick.XmlListModel 2.0 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 MainView { id: main width: units.gu(40) height: units.gu(71) XmlListModel { id: rssFeed source: "http://feeds.reuters.com/reuters/topNews" query: "/rss/channel/item" XmlRole { name: "title"; query: "title/string()" } } Page { title: "Reuters" Flickable { id: flickable anchors.fill: parent contentHeight: column.childrenRect.height contentWidth: column.childrenRect.width Column { id: column Repeater { model: rssFeed Standard { width: main.width height: units.gu(5) text: title } } } PullToRefresh { parent: flickable refreshing: rssFeed.status === XmlListModel.Loading onRefresh: rssFeed.reload() } } } } \endqml \section2 Styling The component style API is defined by the \l PullToRefreshStyle component. Styles may define different ways to initiate refresh upon dragging. */ StyledItem { id: control /*! The property specifies when the component is ready to trigger the refresh() signal. The logic is defined by the style and the value is transferred from the style's releaseToRefresh property. The property can be used to define custom visuals for \l content. */ readonly property bool releaseToRefresh: __styleInstance.releaseToRefresh /*! The property holds the offset the component is pulled from the \l target Flickable's \a topMargin. The property can be used to provide animations in custom contents. */ readonly property real offset: -(target.topMargin - (y + height)) /*! The property holds the visuals to be displayed when the component is revealed upon manual refresh. The default value is a Label showing "Pull to refresh..." text when the component is pulled down till the activation threshold, and "Release to refresh..." after that. */ property Component content: __styleInstance.defaultContent /*! The Flickable or derivate the component is attached to. This can only be the parent or a sibling of the component. Defaults to the parent. */ property Flickable target: parent /*! The property notifies the component about the ongoing refresh operation. */ property bool refreshing: false /*! Signal emitted when the model refresh is initiated by the component. */ signal refresh() styleName: "PullToRefreshStyle" implicitHeight: __styleInstance.implicitHeight anchors { left: target.left right: target.right } y: -(internals.contentY + height) QtObject { id: internals property bool completed: false property real contentY: target.contentY - target.originY } Component.onCompleted: { internals.completed = true; } } ./src/Ubuntu/Components/1.3/TextCursor.qml0000644000015600001650000002637412700370701020442 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 as Ubuntu import Ubuntu.Components.Popups 1.3 Ubuntu.StyledItem { id: cursorItem height: cursorRectangle.height /* Property holding the text input's cursor position property. Can be one of the following ones: cursorPosition, selectionStart and selectionEnd. */ property string positionProperty: "cursorPosition" /* Input handler instance */ property InputHandler handler /* Cursor delegate used. This is the visual component from the main */ readonly property Component cursorDelegate: handler.main.cursorDelegate ? handler.main.cursorDelegate : __styleInstance.cursorDelegate styleName: "TextCursorStyle" objectName: "textCursor" //Caret instance from the style. property Item caret: __styleInstance.caret property int absX: { return fakeCursor.parent.mapFromItem(handler.main, cursorItem.x, cursorItem.y).x } property int absY: { // Take parent flickable movement into account var flickable = handler.main; do { flickable = flickable.parent; } while (flickable && !flickable.contentY && flickable != fakeCursor.parent); return fakeCursor.parent.mapFromItem(handler.main, cursorItem.x, cursorItem.y).y } // Returns "x" or "y" relative to the item handlers are a child of function mappedCursorPosition(coordinate) { var cpos = cursorItem["abs" + coordinate.toUpperCase()]; cpos += handler.frameDistance[coordinate]; cpos += handler.input[coordinate]; cpos -= handler.flickable["content" + coordinate.toUpperCase()]; return cpos; } /* The function opens the text input popover setting the text cursor as caller. */ Connections { target: handler onPressAndHold: { // open context menu only for cursorPosition or selectionStart as to // ensure that only one popover gets opened if (positionProperty !== "selectionEnd") { openPopover(fromTouch); } } onTextModified: typing = true onTap: { typing = false if (handler.popover != null) { PopupUtils.close(handler.popover); } } } Binding { target: handler property: "cursorPositionCursor" value: cursorItem } function openPopover() { if (!visible || opacity === 0.0 || dragger.dragActive) { return; } if (handler.popover != null) { PopupUtils.close(handler.popover); } var component = handler.main.popover; if (component === undefined) component = Qt.resolvedUrl("TextInputPopover.qml"); // if the cursor is out of the visible viewport, anchor the // contextual menu to the input field var anchor = caret.visible ? draggedItem : handler.main var popup = PopupUtils.open(component, anchor, { "target": handler.main, }); // hide the arrow popup.__foreground.direction = "none"; cursorItem.Component.onDestruction.connect(popup.__closePopup); contextMenuVisible = true; popup.onVisibleChanged.connect(contextMenuHidden.bind(undefined, popup)); // do not grab focus! popup.__foreground.activeFocusOnPress = false; handler.popover = popup; } visible: handler.main.cursorVisible && !(positionProperty === "cursorPosition" && handler.main.selectedText !== "") // cursor visual loader Loader { id: cursorLoader sourceComponent: cursorDelegate height: parent.height } /* * Caret dragging handling. We need a separate item which is dragged along the * component's area, which can move freely and not attached to the caret itself. * This area will then be used to update the caret position. */ Binding { target: caret when: caret property: "visible" value: QuickUtils.touchScreenAvailable && (contextMenuVisible || !typing) && handler.main.text !== "" } property bool typing: false property bool contextMenuVisible: false property bool readOnly: handler.main.readOnly function contextMenuHidden(p) { contextMenuVisible = false } //dragged item property Item draggedItem: Item { objectName: cursorItem.positionProperty + "_draggeditem" width: caret.width + units.gu(2) onWidthChanged: draggedItem.moveToCaret() height: cursorItem.height + caret.height + threshold property real threshold: units.gu(4) parent: fakeCursor.parent visible: caret.visible /* Mouse area to turn on dragging or selection mode when pressed on the handler area. The drag mode is turned off when the drag gets inactive or when the LeftButton is released. */ MouseArea { id: draggedItemMouseArea objectName: cursorItem.positionProperty + "_activator" anchors.fill: parent acceptedButtons: Qt.LeftButton preventStealing: true cursorShape: Qt.IBeamCursor enabled: parent.width && parent.height && parent.visible && !handler.doubleTapInProgress onPressedChanged: { if (!pressed) { // when the dragging ends, reposition the dragger back to caret draggedItem.moveToCaret(); } } Ubuntu.Mouse.forwardTo: [dragger] Ubuntu.Mouse.onClicked: openPopover() Ubuntu.Mouse.onPressAndHold: { handler.main.selectWord(); handler.pressAndHold(-1, false); } Ubuntu.Mouse.onDoubleClicked: handler.main.selectWord() Ubuntu.Mouse.enabled: enabled // Visible touch target area for debugging purposes Rectangle { anchors.fill: parent color: 'red' opacity: 0.1 visible: false // draggedItemMouseArea.enabled } } // aligns the draggedItem to the caret and resets the dragger function moveToCaret() { if (!caret) { return; } // The style may render handlers either on top or bottom var flip = caret.rotation == 180; draggedItem.x = fakeCursor.x + (flip ? -caret.width : -draggedItem.width + caret.width); draggedItem.y = fakeCursor.y + caret.y + caret.height - threshold; } // positions caret to the dragged position function positionCaret() { if (dragger.dragActive) { var dx = dragger.dragStartX + dragger.dragAmountX + handler.flickable.contentX; var dy = dragger.dragStartY + dragger.dragAmountY + handler.flickable.contentY; dx -= handler.frameDistance.x; dy -= handler.frameDistance.y; handler.positionCaret(positionProperty, dx, dy); } } } MouseArea { id: dragger objectName: cursorItem.positionProperty + "_dragger" cursorShape: Qt.IBeamCursor // fill the entire component area parent: handler.main anchors.fill: parent enabled: draggedItemMouseArea.enabled && draggedItemMouseArea.pressed && caret.visible onEnabledChanged: { if (enabled) { dragAmountX = 0; dragAmountY = 0; firstMouseXChange = true; firstMouseYChange = true; } else { dragActive = false; } } property int dragStartX property int dragAmountX property int dragStartY property int dragAmountY property bool dragActive: false property int dragThreshold: units.gu(2) property bool firstMouseXChange: true property bool firstMouseYChange: true onMouseXChanged: { if (firstMouseXChange) { dragStartX = mouseX; firstMouseXChange = false; } else { var amount = mouseX - dragStartX; if (Math.abs(amount) >= dragThreshold) { dragActive = true; } if (dragActive) { dragAmountX = amount; draggedItem.positionCaret(); } } } onMouseYChanged: { if (firstMouseYChange) { dragStartY = mouseY; firstMouseYChange = false; } else { var amount = mouseY - dragStartY; if (Math.abs(amount) >= dragThreshold) { dragActive = true; } if (dragActive) { dragAmountY = amount; draggedItem.positionCaret() } } } onDragActiveChanged: { // close contextual menu when dragging and reopen it at the end of the drag if (dragActive) { if (handler.popover != null) { PopupUtils.close(handler.popover); } } else { handler.pressAndHold(-1, false); } } } // fake cursor, caret is reparented to it to avoid caret clipping Item { id: fakeCursor objectName: positionProperty + "FakeCursor" parent: QuickUtils.rootItem(handler.main) width: cursorItem.width height: cursorItem.height Component.onCompleted: caret.parent = fakeCursor x: mappedCursorPosition("x") y: mappedCursorPosition("y") onXChanged: draggedItem.moveToCaret() onYChanged: draggedItem.moveToCaret() // manual clipping: the caret should be visible only while the cursor's // top/bottom falls into the text area visible: { if (!caret || !cursorItem.visible || cursorItem.opacity < 1.0) return false; var pos = handler.main.mapFromItem(fakeCursor.parent, fakeCursor.x, fakeCursor.y); var leftTop = Qt.point(pos.x - handler.frameDistance.x, pos.y + handler.frameDistance.y + handler.lineSpacing); var rightBottom = Qt.point(pos.x - handler.frameDistance.x, pos.y + height - handler.frameDistance.y - handler.lineSpacing); return (handler.visibleArea.contains(leftTop) || handler.visibleArea.contains(rightBottom)); } } } ./src/Ubuntu/Components/1.3/PageColumn.qml0000644000015600001650000000351112700370701020336 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype PageColumn \inqmlmodule Ubuntu.Components 1.3 \since Ubuntu.Components 1.3 \ingroup ubuntu \brief Component configuring the metrics of a column in AdaptivePageLayout. */ QtObject { /*! 1-based value identifying the column the metrics to be applied to. \internal */ property int __column /*! Specifies whether the width of the column should fill the available space of the AdaptivePageLayout column or not. Defaults to \a false. */ property bool fillWidth: false /*! Specifies the minimum width of the column. Defaults to 0. */ property real minimumWidth: 0 /*! Specifies the maximum width of the column. A maximum value of 0 will be ignored. Defaults to the maximum positive value. */ property real maximumWidth: Number.POSITIVE_INFINITY /*! Specifies the preferred width of the column when the layout is initialized. Defaults to 0. AdaptivePageLayout clamps the given value between \l minimumWidth and \l maximumWidth. The value must be set if the \l fillWidth and \l minimumWidth are not set. */ property real preferredWidth: 0 } ./src/Ubuntu/Components/1.3/Button.qml0000644000015600001650000000736712700370701017574 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype Button \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Standard Ubuntu button. \l {http://design.ubuntu.com/apps/building-blocks/buttons}{See also the Design Guidelines on Buttons}. Examples: \qml Column { Button { text: "Send" onClicked: print("clicked text-only Button") } Button { iconName: "compose" gradient: UbuntuColors.greyGradient onClicked: print("clicked icon-only Button") } Button { iconName: "compose" text: "Icon on left" iconPosition: "left" onClicked: print("clicked text and icon Button") } } \endqml An \l Action can be used to specify \b clicked, iconSource and text. Example: \qml Item { Action { id: action1 text: "Click me" onTriggered: print("action!") iconName: "compose" } Button { anchors.centerIn: parent action: action1 color: UbuntuColors.warmGrey } } \endqml*/ AbstractButton { id: button /*! \since Ubuntu.Components 1.1 If set to a color, the button has a stroke border instead of a filled shape. */ property color strokeColor: Qt.rgba(0.0, 0.0, 0.0, 0.0) /*! \qmlproperty url Button::iconSource The source URL of the icon to display inside the button. Leave this value blank for a text-only button. If \l action is set, the default iconSource is that of the action. */ /*! The text to display in the button. If an icon was defined, the text will be shown next to the icon, otherwise it will be centered. Leave blank for an icon-only button. If \l action is set, the default text is that of the action. \qmlproperty string Button::text */ /*! The background color of the button. \sa gradient */ property color color: __styleInstance.defaultColor /*! The gradient used to fill the background of the button. Standard Ubuntu gradients are defined in \l UbuntuColors. If both a gradient and a color are specified, the gradient will be used. \sa color */ property Gradient gradient: __styleInstance.defaultGradient /*! The font used for the button's text. */ property font font: __styleInstance.defaultFont /*! The position of the icon relative to the text. Options are "left" and "right". The default value is "left". If only text or only an icon is defined, this property is ignored and the text or icon is centered horizontally and vertically in the button. Currently this is a string value. We are waiting for support for enums: https://bugreports.qt-project.org/browse/QTBUG-14861 */ property string iconPosition: "left" styleName: "ButtonStyle" } ./src/Ubuntu/Components/1.3/CrossFadeImage.qml0000644000015600001650000001320712700370701021123 0ustar jenkinsjenkins/* * Copyright (C) 2014 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.4 // FIXME: When a module contains QML, C++ and JavaScript elements exported, // we need to use named imports otherwise namespace collision is reported // by the QML engine. As workaround, we use Ubuntu named import. // Bug to watch: https://bugreports.qt-project.org/browse/QTBUG-27645 import Ubuntu.Components 1.3 as Ubuntu /*! \internal Documentation is in CrossFadeImage.qdoc */ Item { id: crossFadeImage property url source property int fillMode : Image.PreserveAspectFit property int fadeDuration: Ubuntu.UbuntuAnimation.FastDuration // FIXME: Support resetting sourceSize property size sourceSize: internals.loadingImage ? Qt.size(internals.loadingImage.sourceSize.width, internals.loadingImage.sourceSize.height) : Qt.size(0, 0) property string fadeStyle: "overlay" readonly property bool running: nextImageFadeIn.running readonly property int status: internals.loadingImage ? internals.loadingImage.status : Image.Null Binding { target: crossFadeImage property: "sourceSize" value: internals.loadingImage ? Qt.size(internals.loadingImage.sourceSize.width, internals.loadingImage.sourceSize.height) : Qt.size(0, 0) when: internals.forcedSourceSize === undefined } /*! \internal */ onSourceSizeChanged: { if (internals.loadingImage && (sourceSize != Qt.size(internals.loadingImage.sourceSize.width, internals.loadingImage.sourceSize.height))) { internals.forcedSourceSize = sourceSize; } } QtObject { id: internals /*! \internal Source size specified by the setting crossFadeImage.sourceSize. */ property size forcedSourceSize /*! \internal Defines the image currently being shown */ property Image currentImage: image1 /*! \internal Defines the image being changed to */ property Image nextImage: image2 property Image loadingImage: currentImage function swapImages() { internals.currentImage.z = 0; internals.nextImage.z = 1; nextImageFadeIn.start(); var tmpImage = internals.currentImage; internals.currentImage = internals.nextImage; internals.nextImage = tmpImage; } } QtObject { // dummy object used to disable crossfade animation id: fadeOutDummy property real opacity } Image { id: image1 anchors.fill: parent cache: false asynchronous: true fillMode: parent.fillMode z: 1 Binding { target: image1 property: "sourceSize" value: internals.forcedSourceSize when: internals.forcedSourceSize !== undefined } } Image { id: image2 anchors.fill: parent cache: false asynchronous: true fillMode: parent.fillMode z: 0 Binding { target: image2 property: "sourceSize" value: internals.forcedSourceSize when: internals.forcedSourceSize !== undefined } } /*! \internal Do the fading when the source is updated */ onSourceChanged: { // On creation, the souce handler is called before image pointers are set. if (internals.currentImage === null) { internals.currentImage = image1; internals.nextImage = image2; } nextImageFadeIn.stop(); // Don't fade in initial picture, only fade changes if (internals.currentImage.source == "") { internals.currentImage.source = source; internals.loadingImage = internals.currentImage; } else { nextImageFadeIn.stop(); internals.nextImage.opacity = 0.0; internals.nextImage.source = source; internals.loadingImage = internals.nextImage; // If case the image is still in QML's cache, status will be "Ready" immediately if (internals.nextImage.status === Image.Ready || internals.nextImage.source === "") { internals.swapImages(); } } } Connections { target: internals.nextImage onStatusChanged: { if (internals.nextImage.status == Image.Ready) { internals.swapImages(); } } } ParallelAnimation { id: nextImageFadeIn Ubuntu.UbuntuNumberAnimation { id: currentImageFadeOut target: fadeStyle == "cross" ? internals.currentImage : fadeOutDummy property: "opacity" to: 0.0 duration: crossFadeImage.fadeDuration } Ubuntu.UbuntuNumberAnimation { target: internals.nextImage property: "opacity" to: 1.0 duration: crossFadeImage.fadeDuration } onRunningChanged: { if (!running) { internals.nextImage.source = ""; } } } } ./src/Ubuntu/Components/1.3/ScrollView.qml0000644000015600001650000003556412700370714020416 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype ScrollView \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu \inherits StyledItem \brief ScrollView is a scrollable view that features scrollbars and scrolling via keyboard keys. ScrollView is the recommended component to use in the implementation of scrollable content. It features scrollbars and handles keyboard input. Old applications that implemented scrollable views directly using the \l Scrollbar component should migrate to ScrollView, to ensure the UX is ready for convergent devices and is consistent with the rest of the platform. ScrollView wraps \l {Scrollbar}(s) in a view, and provides additional features such as: \list \li - Keyboard navigation and focus handling, for a complete convergent experience. \li - Automatic position handling of vertical and horizontal scrollbars, preventing them from overlapping one another when both on screen. \endlist Adding scrollbars and keyboard input handling to a QML item is as simple as wrapping that item in a ScrollView, as shown in the following example: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 ScrollView { width: units.gu(40) height: units.gu(30) Rectangle { width: units.gu(140) height: units.gu(40) gradient: Gradient { GradientStop { position: 0.0; color: "lightsteelblue" } GradientStop { position: 1.0; color: "blue" } } } } \endqml NOTE: the items that are wrapped in the ScrollView are reparanted to \l viewport. */ StyledItem { id: root implicitWidth: 240 implicitHeight: 150 activeFocusOnPress: true //TODO: add horizontalScrollbarPolicy //TODO: add verticalScrollbarPolicy //Currently we want to push the platform towards overlay scrollbars //readonly property bool alwaysOnScrollbars: false /*! \qmlproperty Item ScrollView::viewport This property holds the viewport Item. The children of the ScrollView element are reparented to this item to make sure the scrollbars are correctly positioned and the items are clipped at their boundaries. */ readonly property alias viewport: viewportItem /*! \qmlproperty Item ScrollView::flickableItem The flickableItem of the ScrollView. If the contentItem provided to the ScrollView is a Flickable, that will be the \l flickableItem. Otherwise ScrollView will create a Flickable which will hold the items provided as children. */ readonly property alias flickableItem: internal.flickableItem /*! The contentItem of the ScrollView. This is set by the user. Note that the definition of contentItem is somewhat different to that of a Flickable, where the contentItem is implicitly created. */ default property Item contentItem Keys.enabled: true Keys.onLeftPressed: { if (horizontalScrollbar.__styleInstance !== null) { horizontalScrollbar.__styleInstance.scrollBy(-flickableItem.width*internal.shortScrollingRatio, true) } } Keys.onRightPressed: { if (horizontalScrollbar.__styleInstance !== null) { horizontalScrollbar.__styleInstance.scrollBy(flickableItem.width*internal.shortScrollingRatio, true) } } Keys.onDownPressed: { if (verticalScrollbar.__styleInstance !== null) { verticalScrollbar.__styleInstance.scrollBy(flickableItem.height*internal.shortScrollingRatio, true) } } Keys.onUpPressed: { if (verticalScrollbar.__styleInstance !== null) { verticalScrollbar.__styleInstance.scrollBy(-flickableItem.height*internal.shortScrollingRatio, true) } } Keys.onPressed: { if (event.key == Qt.Key_Escape) { var scrollbarWithActiveDrag = (horizontalScrollbar.__styleInstance && horizontalScrollbar.__styleInstance.draggingThumb && horizontalScrollbar) || (verticalScrollbar.__styleInstance && verticalScrollbar.__styleInstance.draggingThumb && verticalScrollbar) || null if (scrollbarWithActiveDrag !== null) { scrollbarWithActiveDrag.__styleInstance.resetScrollingToPreDrag() event.accepted = true } } else if (verticalScrollbar.__styleInstance !== null) { if (event.key == Qt.Key_PageDown) { verticalScrollbar.__styleInstance.scrollBy(flickableItem.height*internal.longScrollingRatio, true) event.accepted = true } else if (event.key == Qt.Key_PageUp) { verticalScrollbar.__styleInstance.scrollBy(-flickableItem.height*internal.longScrollingRatio, true) event.accepted = true } else if (event.key == Qt.Key_Home) { verticalScrollbar.__styleInstance.scrollToBeginning(true) event.accepted = true } else if (event.key == Qt.Key_End) { verticalScrollbar.__styleInstance.scrollToEnd(true) event.accepted = true } } } onContentItemChanged: { // Check if the item provided is a Flickable if (QuickUtils.inherits(contentItem, "QQuickFlickable")) { internal.flickableItem = contentItem internal.flickableItem.parent = viewportItem } else { //Create a dummy Flickable if the app dev didn't provide any internal.flickableItem = flickableComponent.createObject(viewportItem) contentItem.parent = internal.flickableItem.contentItem } internal.flickableItem.anchors.fill = viewportItem } /*! \qmlproperty Scrollbar ScrollView::horizontalScrollbar This property holds the horizontal scrollbar used in the ScrollView. It provides access to the scrollbar thus making it possible to change its properties or completely replace it with a custom \l Scrollbar object. This property defaults to an instance of \l Scrollbar. \b NOTE: some \l Scrollbar properties are already handled by ScrollView, and their value should hence not be overridden. These properties are: \list \li anchors margins, such as anchors.topMargin etc. \li the parent Item \li \l Scrollbar::flickableItem \endlist */ property Scrollbar horizontalScrollbar: Scrollbar { objectName: "horizontalScrollbar" align: Qt.AlignBottom focus: false } /*! \qmlproperty Scrollbar ScrollView::verticalScrollbar This property holds the vertical scrollbar used in the ScrollView. It provides access to the scrollbar thus making it possible to change its properties or completely replace it with a custom \l Scrollbar object. This property defaults to an instance of \l Scrollbar. \b NOTE: some \l Scrollbar properties are already handled by ScrollView, and their value should hence not be overridden. These properties are: \list \li anchors margins, such as anchors.topMargin etc. \li the parent Item \li \l Scrollbar::flickableItem \endlist */ property Scrollbar verticalScrollbar: Scrollbar { objectName: "verticalScrollbar" align: Qt.AlignTrailing focus: false } children: [ Item { id: viewportItem anchors.fill: parent anchors.topMargin: (horizontalScrollbar.align === Qt.AlignTop && horizontalScrollbar.__alwaysOnScrollbars) ? internal.nonOverlayScrollbarMargin : 0 anchors.leftMargin: (verticalScrollbar.align === Qt.AlignLeading && horizontalScrollbar.__alwaysOnScrollbars) ? internal.nonOverlayScrollbarMargin : 0 anchors.rightMargin: (verticalScrollbar.align === Qt.AlignTrailing && horizontalScrollbar.__alwaysOnScrollbars) ? internal.nonOverlayScrollbarMargin : 0 anchors.bottomMargin: (horizontalScrollbar.align === Qt.AlignBottom && horizontalScrollbar.__alwaysOnScrollbars) ? internal.nonOverlayScrollbarMargin : 0 clip: true focus: true }, Item { id: internal anchors.fill: parent property Flickable flickableItem property real nonOverlayScrollbarMargin: verticalScrollbar.__styleInstance ? verticalScrollbar.__styleInstance.nonOverlayScrollbarMargin : 0 //shortScrollingRation is used for arrow keys, longScrollingRatio is used for pgUp/pgDown //0.1 means we will scroll 10% of the *visible* flickable area property real shortScrollingRatio: __styleInstance ? __styleInstance.shortScrollingRatio : 0.1 property real longScrollingRatio: __styleInstance ? __styleInstance.longScrollingRatio : 0.9 Component { id: flickableComponent Flickable {} } //if the flickable is not coming from the user but from our internal Component... Binding { target: flickableItem when: contentItem !== flickableItem property: "contentHeight" value: contentItem ? contentItem.height : 0 } Binding { target: flickableItem when: contentItem !== flickableItem property: "contentWidth" value: contentItem ? contentItem.width : 0 } Binding { when: root.verticalScrollbar target: root.verticalScrollbar property: "parent" value: root } Binding { when: root.horizontalScrollbar target: root.horizontalScrollbar property: "parent" value: root } //The viewport MUST be set, when Scrollbar is used inside a ScrollView, because that is the //item it will anchor to. Binding { //NOTE: we have to wait for the parent to be set before setting the viewport item or that //will trigger anchoring errors when: root.horizontalScrollbar && root.horizontalScrollbar.parent target: root.horizontalScrollbar property: "__viewport" value: viewportItem } Binding { when: root.verticalScrollbar && root.verticalScrollbar.parent target: root.verticalScrollbar property: "__viewport" value: viewportItem } Binding { //wait for viewport to be set, otherwise Scrollbar will try anchoring to flickableItem, which //is not a parent or sibling (see definition of Scrollbar anchors) when Scrollbar is inside //a ScrollView (it is a sibling usually when Scrollbar is used directly, without ScrollView) when: root.horizontalScrollbar && root.horizontalScrollbar.__viewport target: root.horizontalScrollbar property: "flickableItem" value: internal.flickableItem } Binding { when: root.verticalScrollbar && root.verticalScrollbar.__viewport target: root.verticalScrollbar property: "flickableItem" value: internal.flickableItem } Binding { when: root.verticalScrollbar target: root.verticalScrollbar property: "__buddyScrollbar" value: root.horizontalScrollbar } Binding { when: root.horizontalScrollbar target: root.horizontalScrollbar property: "__buddyScrollbar" value: root.verticalScrollbar } //When you click outside of a child of the scrollview, this restores the focus to the ScrollView //Why is this needed? // Suppose the viewport has a child ScrollView (or another Item which handles some or all of the hw keys we handle). // Now, if that child is coded to set its focus to true when you tap on it (which is, for instance, what // StyledItem's activeFocusOnPress does), tapping on that child will set viewportItem.focus = false, because // that child is just another Item inside "root" and "root" is a FocusScope, and that's how FocusScope works. // At this point, we need something to restore the focus to the viewportItem once you tap on viewportItem, outside // any other child. And that's what the MouseArea below does. // //The alternative could be making the viewport a StyledItem and using activeFocusOnPress:true, but that wouldn't work //because it would make viewportItem a focus scope, and we don't want that, because at that point, //being in a similar situation as described above, we wouldn't be able to transfer the focus to viewportItem, because //being a focus scope means viewportItem would forward the focus to the one between its children who asked it most //recently MouseArea { anchors.fill: parent onPressed: { //FIXME: we can't force focus on the viewport, this breaks text selection inside scrollview! //+ it still doesn't work in Sliders page, for yet unknown reasons //Without this we can't shift focus from a child ScrollView to a parent ScrollView //viewportItem.focus = true //activeFocusOnPress only works if *all* the parents have activeFocusOnPress enabled //Some applications (like messaging-app at the moment) have activeFocusOnPress:false on //the MainView, and that would make focusing the scrollview impossible. Hence we also //force it from QML side root.forceActiveFocus() mouse.accepted = false } } } ] } ./src/Ubuntu/Components/1.3/ComboButton.qml0000644000015600001650000003367212700370701020552 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 /*! \qmltype ComboButton \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Ubuntu button providing a drop-down panel visualizing custom options. The component is composed of three main blocks: \b {main button}, \b {dropdown} and \b {combo list}. The \a {main button} holds the main functionailty of the component, and it is located at the left-top side of the expanded button. The \a clicked() signal is triggered only when this button is pressed. The \a {dropdown} is a button located on the right of the main button. Its functionality is to drive the component's expanded state. The \a {combo list} is a panel showing the content specified in \l comboList property when expanded. The content is stretched horizontally to the component's width, and its height is controlled by the \l expandedHeight property as follows: \list \li If the content height is smaller than the value of \l expandedHeight, the combo list will be expanded only to the height of the content. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 ComboButton { text: "smaller content" Rectangle { height: units.gu(5) // smaller than the default expandedHeight color: "blue" } } \endqml \li If the content height is greater than \l expandedHeight, the combo list will expand till the height specified by the property and the content will be scrolled; in case the combo list content is one single Flickable, ListView, GridView or PathView, the content scrolling will be provided by the content itself. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 ComboButton { text: "long scrolled content" Column { Repeater { model: 5 spacing: units.gu(1) Rectangle { height: units.gu(5) color: "blue" } } } } \endqml \li In case the content is a single Flickable, ListView, GridView or PathView, the content will be filling the entire combo list area defined. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 ComboButton { text: "listview" ListView { model: 10 delegate: Standard { text: "Item #" + modelData } } } \endqml \li Vertical anchoring of combo list content to its parent is not possible as the expansion calculation is done based on the combo list content height. If the content wants to take the size of the entire combo list, it should bind its height to the \l comboListHeight property. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 ComboButton { id: combo text: "smaller content" Rectangle { height: combo.comboListHeight color: "blue" } } \endqml \li In case the expansion needs to be the size of the combo list content, the \l expandedHeight should be set to -1. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 ComboButton { text: "auto-sized content" expandedHeight: -1 Column { Repeater { model: 5 spacing: units.gu(1) Button { text: "Button #" + modelData } } } } \endqml \endlist The combo list can be expanded/collapsed either through the \l expanded property or by clicking on the dropdown button. It is not collapsed when pressing the main button or clicking on the combo list. In order to do an auto-collapsing button you must reset the expanded property (set it to false) when the main button is clicked or when a selection is taken from the combo list content. The following example illustrates a possible implementation. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 ComboButton { id: combo text: "Auto closing" expanded: true expandedHeight: units.gu(30) onClicked: expanded = false UbuntuListView { width: parent.width height: combo.comboListHeight model: 20 delegate: Standard { text: "Action #" + modelData onClicked: { combo.text = text; combo.expanded = false; } } } } \endqml \section2 Styling The style of the component is defined in \l ComboButtonStyle. */ AbstractButton { id: combo /*! \deprecated If set to a color, the button has a stroke border instead of a filled shape. */ property color strokeColor onStrokeColorChanged: console.warn( "WARNING: ComboButton.strokeColor is deprecated." ) /*! \deprecated The background color of the button. */ property color color onColorChanged: console.warn("WARNING: ComboButton.color is deprecated.") /*! \deprecated The gradient used to fill the background of the button. Standard Ubuntu gradients are defined in \l UbuntuColors. If both a gradient and a color are specified, the gradient will be used. */ property Gradient gradient onGradientChanged: console.warn( "WARNING: ComboButton.gradient is deprecated." ) /*! \deprecated The property specifies the color of the dropdown button and the combo list for both collapsed and expanded states. You can use \l expanded to define different colors for expanded or collapsed states. */ property color dropdownColor onDropdownColorChanged: console.warn( "WARNING: ComboButton.dropdownColor is deprecated." ) /*! The font used for the button's text. */ property font font: __styleInstance.defaultFont /*! The position of the icon relative to the text. Options are "left" and "right". The default value is "left". If only text or only an icon is defined, this property is ignored and the text or icon is centered horizontally and vertically in the button. Currently this is a string value. We are waiting for support for enums: https://bugreports.qt-project.org/browse/QTBUG-14861 */ property string iconPosition: "left" /*! Specifies whether the combo list is expanded or not. The default falue is false. */ property bool expanded: false /*! The property holds the height of the component when collapsed. By default the value is the implicit height of the component. */ property real collapsedHeight: implicitHeight /*! The property holds the maximum height value the component should expand. When setting the property, remember to take into account the \l collapsedHeight value. The best practice is to use bind it with collapsedHeight. \qml ComboButton { text: "altered expandedHeight" expandedHeight: collapsedHeight + units.gu(25) } \endqml A value of -1 will instruct the component to expand the combo list as much as its content height is. The default value is \l collapsedHeight + 19.5 GU, so at least 3 ListItems can fit in the combo list. \sa collapsedHeight */ property real expandedHeight: collapsedHeight + units.gu(19.5) /*! The property holds the maximum combo list height allowed based on the \l expandedHeight and \l collapsedHeight values. It is a convenience property that can be used to size the combo list content. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 ComboButton { id: combo text: "Full comboList size" ListView { anchors { left: parent.left right: parent.right } height: combo.comboListHeight model: 20 delegate: Standard { text: "Action #" + modelData } } } \endqml \sa collapsedHeight, expandedHeight */ readonly property real comboListHeight: (expandedHeight < 0) ? comboListHolder.height : (expandedHeight - collapsedHeight - (combo.__styleInstance ? combo.__styleInstance.comboListMargin : 0)) /*! \qmlproperty list comboList \default Property holding the list of items to be shown in the combo list. Being a default property children items declared will land in the combo list. \note The component is not responsible for layouting the content. It only provides scrolling abilities for the case the content exceeds the defined expanded height. */ default property alias comboList: comboListHolder.data styleName: "ComboButtonStyle" // update sensing area to report clicks only on the main button area // area excluding dropDown button and combo list sensingMargins { bottom: -(combo.height - combo.collapsedHeight) right: -combo.__styleInstance.dropDownWidth } __mouseArea.objectName: "combobutton_mainbutton" height: collapsedHeight + __styleInstance.comboListPanel.height // dropdown button AbstractButton { id: dropDown objectName: "combobutton_dropdown" anchors { right: parent.right top: parent.top } width: combo.__styleInstance ? combo.__styleInstance.dropDownWidth : 0 height: combo.collapsedHeight // open dropdown when pressed, not when clicked onClicked: { // toggle expanded combo.expanded = !combo.expanded; } } // expansion list Flickable { id: comboHolder objectName: "combobutton_contentflicker" parent: combo.__styleInstance ? combo.__styleInstance.comboListHolder : combo anchors.fill: parent interactive: combo.expanded && !contentIsFlickable() && (combo.expandedHeight > 0) flickableDirection: Flickable.VerticalFlick contentHeight: comboListHolder.height // consider PathView as Flickable in this case as well! function contentIsFlickable() { return (comboListHolder.children.length === 1) && comboListHolder.children[0].hasOwnProperty("flicking"); } Item { id: comboListHolder objectName: "combobutton_combolist" anchors { left: parent.left right: parent.right } // stretch children width to holder's width // must do binding to height manually to avoid binding loops caused // by the vertical stretching when the component is a single flickable property bool stretch: (combo.expandedHeight > 0 && comboHolder.contentIsFlickable()) onStretchChanged: stretchChildren() onChildrenChanged: stretchChildren() function stretchChildren() { for (var i in comboListHolder.children) { var child = comboListHolder.children[i]; if (comboListHolder.stretch) { child.anchors.left = undefined; child.anchors.right = undefined; child.anchors.fill = comboListHolder; comboListHolder.height = Qt.binding(function() { return combo.comboListHeight; }); } else { child.anchors.left = comboListHolder.left; child.anchors.right = comboListHolder.right; comboListHolder.height = Qt.binding(function() { return comboListHolder.childrenRect.height; }); } } } } } Scrollbar { flickableItem: comboHolder } /* Drive the expansion height of the combo list holder This is a common functionaity in all combo buttons, therefore we can have it in the main component. */ Binding { target: combo.__styleInstance.comboListPanel property: "height" value: { if (!expanded) { return 0; } if (comboListHolder.stretch) { return combo.comboListHeight + combo.__styleInstance.comboListMargin; } var h = comboListHolder.height; var max = combo.comboListHeight + combo.__styleInstance.comboListMargin; if (combo.expandedHeight < 0) { return max; } return MathUtils.clamp(h, 0, max); } } } ./src/Ubuntu/Components/1.3/UbuntuListView.qml0000644000015600001650000001425612700370701021265 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 as Toolkit /*! \qmltype UbuntuListView \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \inherits ListView \brief A ListView with special features tailored for a look and feel fitting the Ubuntu Touch platform. The UbuntuListView works just like a regular ListView, but it adds special features such as expanding/collapsing items (when used together with the Expandable item). It provides features like automatically positioning the expanding item when it expands and collapsing it again when the user taps outside of it. Examples: \qml import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem Item { ListModel { id: listModel } UbuntuListView { id: ubuntuListView anchors { left: parent.left; right: parent.right } height: units.gu(24) model: listModel delegate: ListItem.Expandable { id: expandingItem expandedHeight: units.gu(30) onClicked: { ubuntuListView.expandedIndex = index; } } } } \endqml */ ListView { id: root /*! \deprecated The index of the currently expanded item. -1 if no item is expanded. \b {THIS PROPERTY IS DEPRECATED. USE THE NEW ListItem TO HANDLE EXPANSION} */ property int expandedIndex: -1 /*! \qmlproperty pullToRefresh UbuntuListView::pullToRefresh \readonly \since Ubuntu.Components 1.1 Attached PullToRefresh to control manual model refresh. The component is disabled by default. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 UbuntuListView { width: units.gu(40) height: units.gu(71) model: XmlListModel { source: "http://feeds.reuters.com/reuters/topNews" query: "/rss/channel/item" XmlRole { name: "title"; query: "title/string()" } } // let refresh control know when the refresh gets completed pullToRefresh { enable: true refreshing: model.status === XmlListModel.Loading onRefresh: model.reload() } delegate: ListItem { ListItemLayout { title.text: modelData } onClicked: { ListView.view.model.reload(); } } } \endqml */ readonly property alias pullToRefresh: refreshItem PullToRefresh { objectName: "listview_pulltorefresh" id: refreshItem enabled: false } QtObject { id: priv function positionViewAtIndexAnimated(expandedIndex) { animation.from = root.contentY; root.currentIndex = expandedIndex; if (expandedIndex == root.count - 1) { root.positionViewAtIndex(expandedIndex, ListView.End); } else { root.positionViewAtIndex(expandedIndex + 1, ListView.End); } var effectiveExpandedHeight = Math.min(root.currentItem.expandedHeight, root.height - root.currentItem.collapsedHeight); if (root.contentY - root.originY == 0) { if (((root.currentIndex + 1) * root.currentItem.collapsedHeight) + effectiveExpandedHeight > root.height) { animation.to = ((root.currentIndex + 1) * root.currentItem.collapsedHeight + effectiveExpandedHeight) - root.height + root.originY } else { animation.to = root.originY } } else { animation.to = root.contentY + (effectiveExpandedHeight - root.currentItem.collapsedHeight); } animation.start(); } function requestFocus(reason) { // lookup for the currentItem, and if it is a FocusScope, focus the view // this will also focus the currentItem if (root.currentItem && root.currentItem.hasOwnProperty("activeFocusOnPress")) { // is the currentItem a ListItem? if (QuickUtils.inherits(root.currentItem, "UCListItem")) { root.currentItem.requestFocus(reason); } else { root.forceActiveFocus(reason); } } } } focus: true /*! \internal Grab focus when moved, flicked or clicked */ onMovementStarted: priv.requestFocus(Qt.MouseFocusReason) onFlickStarted: priv.requestFocus(Qt.MouseFocusReason) Toolkit.Mouse.onClicked: priv.requestFocus(Qt.MouseFocusReason) /*! Expand the item at the given index. */ onExpandedIndexChanged: { if (expandedIndex < 0) { return; } priv.positionViewAtIndexAnimated(expandedIndex, ListView.End) } UbuntuNumberAnimation { id: animation target: root property: "contentY" } MouseArea { parent: contentItem anchors.fill: parent z: 2 enabled: root.expandedIndex != -1 onClicked: root.expandedIndex = -1; } // animate move displaced moveDisplaced: Transition { UbuntuNumberAnimation { properties: "x,y" } } // highlight current item highlight: Rectangle { color: theme.palette.selected.background } highlightMoveDuration: 0 } ./src/Ubuntu/Components/1.3/ActivityIndicator.qml0000644000015600001650000000346112700370701021741 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype ActivityIndicator \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The ActivityIndicator component visually indicates that a task of unknown duration is in progress, e.g. busy indication, connection in progress indication, etc. Note: for time consuming JavaScript operations use WorkerScript, otherwise no UI interaction will be possible and the ActicityIndicator animation will freeze. Example: \qml Item { ActivityIndicator { id: activity } Button { id: toggleActive text: (activity.running) ? "Deactivate" : "Activate" onClicked: activity.running = !activity.running } } \endqml */ AnimatedItem { id: indicator /*! Presents whether there is activity to be visualized or not. The default value is false. When activated (set to true), an animation is shown indicating an ongoing activity, which continues until deactivated (set to false). */ property bool running: false implicitWidth: units.gu(3) implicitHeight: units.gu(3) styleName: "ActivityIndicatorStyle" } ./src/Ubuntu/Components/1.3/InputHandler.qml0000644000015600001650000004423012700370701020704 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /* This component is a unified text selection and scrolling handler for both TextField and TextArea components. */ MultiPointTouchArea { id: inputHandler objectName: "input_handler" // the root control property Item main // the input instance property Item input // the Flickable holding the input instance property Flickable flickable // item filling the visible text input area used to check handler visibility property Item visibleArea: Item { parent: flickable anchors.fill: parent } // line size and spacing property real lineSpacing: units.dp(3) property real lineSize: input.font.pixelSize + lineSpacing // input x/y distance from the frame property point frameDistance: Qt.point(flickable.x, flickable.y) // signal triggered when popup should be opened signal pressAndHold(int pos, bool fromTouch) signal tap(int pos) property string oldText: "" signal textModified() function activateInput() { if (!input.activeFocus) { input.forceActiveFocus(); } showInputPanel(); } function showInputPanel() { if (!UbuntuApplication.inputMethod.visible) { UbuntuApplication.inputMethod.show(); } textChanged = false; } // internal properties/functions readonly property bool singleLine: input.hasOwnProperty("validator") property var flickableList: new Array() property bool textChanged: false property var popover property bool suppressReleaseEvent: false property int pressedPosition: -1 // move properties property int moveStarts: -1 property int moveEnds: -1 // set scroller to the first Flickable that scrolls the input // this can be the internal Flickable if the full autosize is disabled // or one of the input's parent Flickable readonly property bool scrollingDisabled: main && main.hasOwnProperty("autoSize") ? (main.autoSize && (main.maximumLineCount <= 0)) : false onScrollingDisabledChanged: if (state == "") flickable.interactive = !scrollingDisabled readonly property Flickable grandScroller: firstFlickableParent(main) readonly property Flickable scroller: (scrollingDisabled && grandScroller) ? grandScroller : flickable // ensures the text cursorRectangle is always in the internal Flickable's visible area function ensureVisible(rect) { if (flickable.moving || flickable.flicking) return; if (flickable.contentX >= rect.x) flickable.contentX = rect.x; else if (flickable.contentX + flickable.width <= rect.x + rect.width) flickable.contentX = rect.x + rect.width - flickable.width; if (flickable.contentY >= rect.y) flickable.contentY = rect.y; else if (flickable.contentY + flickable.height <= rect.y + rect.height) flickable.contentY = rect.y + rect.height - flickable.height; } // returns the cursor position from x,y pair function unadulteratedCursorPosition(x, y) { return singleLine ? input.positionAt(x, TextInput.CursorOnCharacter) : input.positionAt(x, y, TextInput.CursorOnCharacter); } // returns the cursor position taking frame into account function cursorPosition(x, y) { var frameSpacing = main.__styleInstance.frameSpacing; var cursorPosition = unadulteratedCursorPosition(x, y); if (cursorPosition == 0) cursorPosition = unadulteratedCursorPosition(x + frameSpacing, y + frameSpacing); if (cursorPosition == text.length) cursorPosition = unadulteratedCursorPosition(x - frameSpacing, y - frameSpacing); return cursorPosition } // returns the mouse position function mousePosition(mouse) { return cursorPosition(mouse.x, mouse.y); } // checks whether the position is in the selected text function positionInSelection(pos) { return (input.selectionStart !== input.selectionEnd) && (pos >= Math.min(input.selectionStart, input.selectionEnd)) && (pos <= Math.max(input.selectionStart, input.selectionEnd)); } // check whether the mouse is inside a selected text area function mouseInSelection(mouse) { var pos = mousePosition(mouse); return positionInSelection(pos); } // selects text function selectText(mouse) { state = "select"; moveEnds = mousePosition(mouse); if (moveStarts < 0) { moveStarts = moveEnds; } input.select(moveStarts, moveEnds); } // returns the first Flickable parent of a given item function firstFlickableParent(item) { var p = item ? item.parent : null; while (p && !p.hasOwnProperty("flicking")) { p = p.parent; } return p; } // focuses the input if not yet focused, and shows the context menu function openContextMenu(mouse, noAutoselect, fromTouch) { var pos = mousePosition(mouse); if (!main.focus || !mouseInSelection(mouse)) { activateInput(); input.cursorPosition = pressedPosition = mousePosition(mouse); if (!noAutoselect) { input.selectWord(); } } // open context menu at the cursor position inputHandler.pressAndHold(input.cursorPosition, fromTouch); // if opened with left press (touch falls into this criteria as well), we need to set state to inactive // so the mouse moves won't result in selected text loss/change if (mouse.button === Qt.LeftButton) { state = "inactive"; } } // disables interactive Flickable parents, stops at the first non-interactive flickable. function toggleFlickablesInteractive(turnOn) { var p; if (!turnOn) { // handle the scroller separately p = firstFlickableParent(scroller) while (p) { if (p.interactive) { flickableList.push(p); p.interactive = false; } else { break; } p = firstFlickableParent(p); } } else { while (flickableList.length > 0) { p = flickableList.pop(); p.interactive = true; } } } // moves the specified position, called by the cursor handler // positioner = "currentPosition/selectionStart/selectionEnd" function positionCaret(positioner, x, y) { if (positioner === "cursorPosition") { input[positioner] = cursorPosition(x, y); } else { var pos = cursorPosition(x, y); if (positioner === "selectionStart" && (pos < input.selectionEnd)) { input.select(pos, input.selectionEnd); } else if (positioner === "selectionEnd" && (pos > input.selectionStart)) { input.select(input.selectionStart, pos); } } } // moves the cursor one page forward with or without positioning the cursor function movePage(forward) { var cx = input.cursorRectangle.x; var cy = input.cursorRectangle.y; if (forward) { if (singleLine) { cx += visibleArea.width; } else { cy += visibleArea.height; } } else { if (singleLine) { cx -= visibleArea.width; } else { cy -= visibleArea.height; } } input.cursorPosition = cursorPosition(cx, cy); } Component.onCompleted: { state = (main.focus) ? "" : "inactive"; // FIXME: Qt5.3 related! mouseEnabled is a 5.3 related property which has a positive // default value. That value messes up teh current understanding (5.2) of the // MultiPointTouchArea functioning. We need to set it to false until 5.3 will be the // default supported Qt version, when we can have a clean property value assignment if (inputHandler.hasOwnProperty("mouseEnabled")) { inputHandler.mouseEnabled = false; } } // states states: [ // override default state to turn on the saved Flickable interactive mode State { name: "" StateChangeScript { // restore interactive for all Flickable parents script: toggleFlickablesInteractive(true); } }, State { name: "inactive" // we do not disable scroller here as in case the internal scrolling // is disabled (scrollingDisabled = true) the outer scroller (grandScroller) // would be blocked as well, which we don't want to PropertyChanges { target: flickable interactive: false } }, State { name: "scrolling" StateChangeScript { script: { // stop scrolling all the parents toggleFlickablesInteractive(false); // stop touch timers touchPoint.reset(); } } }, State { name: "select" // during select state all the flickables are blocked (interactive = false) // we can use scroller here as we need to disable the outer scroller too! PropertyChanges { target: scroller interactive: false } StateChangeScript { script: { // turn off interactive for all parent flickables toggleFlickablesInteractive(false); if (!positionInSelection(pressedPosition)) { input.cursorPosition = pressedPosition; } } } } ] // brings the state back to default when the component looses focus // and ensures input has active focus when component regains focus Connections { target: main ignoreUnknownSignals: true onFocusChanged: { UbuntuApplication.inputMethod.commit() state = (main.focus) ? "" : "inactive"; if (main.focus) { input.forceActiveFocus() } } } // input specific signals Connections { target: input onCursorRectangleChanged: ensureVisible(input.cursorRectangle) onTextChanged: { textChanged = true; if (oldText != input.text) { textModified() oldText = text } } // make sure we show the OSK onActiveFocusChanged: showInputPanel() } // inner or outer Flickable controlling Connections { target: scroller // turn scrolling state on onFlickStarted: toggleScrollingState(true) onMovementStarted: toggleScrollingState(true) // reset to default state onMovementEnded: toggleScrollingState(false) function toggleScrollingState(turnOn) { if (!main.focus) { return; } inputHandler.state = (turnOn) ? "scrolling" : "" } } // PageUp and PageDown handling Keys.onPressed: { if (event.key === Qt.Key_PageUp && event.modifiers === Qt.NoModifier) { movePage(false); } else if (event.key === Qt.Key_PageDown && event.modifiers === Qt.NoModifier) { movePage(true); } } // touch and mous handling function handlePressed(event, touch) { if (touch) { // we do not have longTap or double tap, therefore we need to generate those event.touch(); } else { // consume event so it does not get forwarded to the input event.accepted = true; } // remember pressed position as we need it when entering into selection state pressedPosition = mousePosition(event); } function handleReleased(event, touch) { if (touch) { event.untouch(); } if ((!main.focus && !main.activeFocusOnPress) || suppressReleaseEvent === true) { suppressReleaseEvent = false; return; } activateInput(); if (state === "" || touch) { input.cursorPosition = mousePosition(event); } moveStarts = moveEnds = -1; state = ""; // check if we get right-click from the frame or the area that has no text if (event.button === Qt.RightButton) { // open the popover inputHandler.pressAndHold(input.cursorPosition, touch); } else { inputHandler.tap(input.cursorPosition); } } function handleMove(event, touch ) { // leave if not focus, not the left button or not in select state if (!input.activeFocus || (!touch && event.button !== Qt.LeftButton) || !main.selectByMouse) { return; } selectText(event); } function handleDblClick(event, touch) { if (main.selectByMouse) { openContextMenu(event, false, touch); // turn selection state temporarily so the selection is not cleared on release state = "selection"; suppressReleaseEvent = true; } } // Mouse handling Mouse.forwardTo: [main] Mouse.onPressed: handlePressed(mouse, false) Mouse.onReleased: handleReleased(mouse, false) Mouse.onPositionChanged: handleMove(mouse, false) Mouse.onDoubleClicked: handleDblClick(mouse, false) // right button handling MouseArea { anchors.fill: parent acceptedButtons: Qt.RightButton // trigger pressAndHold onReleased: openContextMenu(mouse, true, false) cursorShape: Qt.IBeamCursor } Keys.onMenuPressed: inputHandler.pressAndHold(input.cursorPosition, false); // touch handling touchPoints: TouchPoint { id: touchPoint function touch() { longTap.restart(); if (!doubleTap.running) { doubleTap.restart(); } else if (doubleTap.tapCount > 0) { doubleTap.running = false; handleDblClick(touchPoint, true); } } function untouch() { longTap.running = false; } function reset() { longTap.running = false; doubleTap.running = false; } } Timer { id: longTap // sync with QQuickMouseArea constant interval: 800 onTriggered: { // do not open context menu if the input is not focus if (!main.focus) { return; } // do not open context menu if this is scrolling if (touchPoint.startY - touchPoint.y < -units.gu(2)) return; openContextMenu(touchPoint, false, true); suppressReleaseEvent = true; } } property bool doubleTapInProgress: doubleTap.running Timer { id: doubleTap property int tapCount: 0 interval: 400 onRunningChanged: { tapCount = running; } } onPressed: handlePressed(touchPoints[0], true) onReleased: handleReleased(touchPoints[0], true) property Item cursorPositionCursor: null property Item selectionStartCursor: null property Item selectionEndCursor: null // cursors to use when text is selected Connections { target: input onSelectedTextChanged: { if (selectedText !== "") { if (!selectionStartCursor) { selectionStartCursor = input.cursorDelegate.createObject( input, { "positionProperty": "selectionStart", "handler": inputHandler, } ); moveSelectionCursor(selectionStartCursor); selectionEndCursor = input.cursorDelegate.createObject( input, { "positionProperty": "selectionEnd", "handler": inputHandler, } ); moveSelectionCursor(selectionEndCursor); } } else { if (selectionStartCursor) { selectionStartCursor.destroy(); selectionStartCursor = null; selectionEndCursor.destroy(); selectionEndCursor = null; } } } onSelectionStartChanged: moveSelectionCursor(selectionStartCursor, true); onSelectionEndChanged: moveSelectionCursor(selectionEndCursor, true); function moveSelectionCursor(cursor, updateProperty) { if (!cursor) { return; } // workaround for https://bugreports.qt-project.org/browse/QTBUG-38704 // selectedTextChanged signal is not emitted for TextEdit when selectByMouse is false if (updateProperty && QuickUtils.className(input) === "QQuickTextEdit") { input.selectedTextChanged(); } var pos = input.positionToRectangle(input[cursor.positionProperty]); cursor.x = pos.x; cursor.y = pos.y; cursor.height = pos.height; ensureVisible(pos); } } } ./src/Ubuntu/Components/1.3/PageStack.qml0000644000015600001650000002731212700370701020153 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import "../1.2/stack.js" as Stack import Ubuntu.Components 1.3 import Ubuntu.Components.Private 1.3 /*! \qmltype PageStack \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief A stack of \l Page items that is used for inter-Page navigation. Pages on the stack can be popped, and new Pages can be pushed. The page on top of the stack is the visible one. PageStack should be used inside a \l MainView in order to automatically add a header and toolbar to control the stack. The PageStack will automatically set the header title to the title of the \l Page that is currently on top of the stack, and the tools of the toolbar to the tools of the \l Page on top of the stack. When more than one Pages are on the stack, the toolbar will automatically feature a back-button that pop the stack when triggered. The anchors of the PageStack are set to fill its parent by default. To use left/right/top/bottom anchors, explicitly set anchors.fill of the PageStack to undefined: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(40) height: units.gu(71) PageStack { id: mainStack anchors { fill: undefined // unset the default to make the other anchors work left: parent.left right: parent.right top: parent.top bottom: rect.top } } Rectangle { id: rect color: UbuntuColors.red anchors { left: parent.left right: parent.right bottom: parent.bottom } height: units.gu(10) } Component.onCompleted: mainStack.push(Qt.resolvedUrl("MyPage.qml")) } \endqml Pages that are defined inside the PageStack must initially set their visibility to false to avoid the pages occluding the PageStack before they are pushed. When pushing a \l Page, its visibility is automatically updated. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem MainView { width: units.gu(48) height: units.gu(60) PageStack { id: pageStack Component.onCompleted: push(page0) Page { id: page0 title: i18n.tr("Root page") visible: false Column { anchors.fill: parent ListItem.Standard { text: i18n.tr("Page one") onClicked: pageStack.push(page1, {color: UbuntuColors.orange}) progression: true } ListItem.Standard { text: i18n.tr("External page") onClicked: pageStack.push(Qt.resolvedUrl("MyCustomPage.qml")) progression: true } } } Page { title: "Rectangle" id: page1 visible: false property alias color: rectangle.color Rectangle { id: rectangle anchors { fill: parent margins: units.gu(5) } } } } } \endqml As shown in the example above, the push() function can take an Item, Component or URL as input. */ PageTreeNode { id: pageStack anchors.fill: parent /*! \internal Please do not use this property any more. \l MainView now has a header property that controls when the header is shown/hidden. */ property bool __showHeader: true QtObject { property alias showHeader: pageStack.__showHeader onShowHeaderChanged: print("__showHeader is deprecated. Do not use it.") } /*! The current size of the stack */ //FIXME: would prefer this be readonly, but readonly properties are only bound at //initialisation. Trying to update it in push or pop fails. Not sure how to fix. property int depth: 0 /*! The currently active page */ property Item currentPage: null /*! Push a page to the stack, and apply the given (optional) properties to the page. The pushed page may be an Item, Component or URL. The function returns the Item that was pushed, or the Item that was created from the Component or URL. Depending on the animation of the header, the returned Page may or may not be active and on top of the PageStack yet. */ function push(page, properties) { internal.finishPreviousAction(); internal.pageWrapper = internal.createWrapper(page, properties); var pageObject = internal.pageWrapper.object; if (internal.animateHeader && internal.stack.size() > 0) { internal.headStyle.animateOutFinished.connect(internal.pushWrapperObject); internal.headStyle.animateOut(); } else { internal.pushWrapperObject(); } // set the back action for Page.header: if (pageObject && pageObject.hasOwnProperty("header") && pageObject.header && pageObject.header.hasOwnProperty("navigationActions")) { // Page.header is an instance of PageHeader. pageObject.header.navigationActions = [ backAction ]; } return pageObject; } /*! Pop the top item from the stack if the stack size is at least 1. Do not do anything if 0 or 1 items are on the stack. */ function pop() { internal.finishPreviousAction(); if (internal.stack.size() < 1) { print("WARNING: Trying to pop an empty PageStack. Ignoring."); return; } // do not animate if there is no page to animate back in after popping if (internal.animateHeader && internal.stack.size() > 1) { internal.headStyle.animateOutFinished.connect(internal.popAndDestroy); internal.headStyle.animateOut(); } else { internal.popAndDestroy(); } } /*! Deactivate the active page and clear the stack. */ function clear() { internal.finishPreviousAction(); while (internal.stack.size() > 0) { internal.stack.top().active = false; if (internal.stack.top().canDestroy) internal.stack.top().destroyObject(); internal.stack.pop(); } internal.stackUpdated(); } Action { // used when the Page has a Page.header property set. id: backAction visible: pageStack.depth > 0 iconName: "back" text: "Back" onTriggered: pageStack.pop() objectName: "pagestack_back_action" } Component { id: pageWrapperComponent PageWrapper{ } } QtObject { id: internal property Item headStyle: (pageStack.__propagated && pageStack.__propagated.header && pageStack.__propagated.header.__styleInstance) ? pageStack.__propagated.header.__styleInstance : null property bool animateHeader: pageStack.__propagated && pageStack.__propagated.hasOwnProperty("animateHeader") && pageStack.__propagated.animateHeader // Call this function before pushing or popping to ensure correct order // of pushes/pops on the stack. This terminates any currently running // header transition. function finishPreviousAction() { // no action required when animating IN because the PageStack was // already updated before that transition started. if (internal.animateHeader && internal.headStyle.state == "OUT") { // force instant update of the PageStack without waiting for // the OUT animation to finish: internal.headStyle.animateOutFinished(); } } // The PageWrapper to be pushed on the stack by pushWrapperObject(). property var pageWrapper: null // Called when the header animate OUT transition finishes for push() or instantly // when header animations are disabled. function pushWrapperObject() { if (internal.animateHeader) { headStyle.animateOutFinished.disconnect(internal.pushWrapperObject); } if (internal.stack.size() > 0) internal.stack.top().active = false; internal.stack.push(internal.pageWrapper); internal.pageWrapper = null; internal.stackUpdated(); } // Called when header animate OUT transition finishes for pop() or instantly // when header animations are disabled. function popAndDestroy() { if (internal.animateHeader) { headStyle.animateOutFinished.disconnect(internal.popAndDestroy); } internal.stack.top().active = false; if (internal.stack.top().canDestroy) internal.stack.top().destroyObject(); internal.stack.pop(); internal.stackUpdated(); } /*! The instance of the stack from javascript */ property var stack: new Stack.Stack() function createWrapper(page, properties) { var wrapperObject = pageWrapperComponent.createObject(pageStack); wrapperObject.pageStack = pageStack; wrapperObject.properties = properties; // set reference last because it will trigger creation of the object // with specified properties. wrapperObject.reference = page; return wrapperObject; } // Update depth and makes the Item on top of the stack active, and // then animates IN the new header contents if header animations are enabled. function stackUpdated() { pageStack.depth = stack.size(); if (pageStack.depth > 0) { internal.stack.top().active = true; currentPage = stack.top().object; if (internal.animateHeader) { headStyle.animateIn(); } } else { currentPage = null; } } } /*! \qmlproperty list data Children of PageStack are placed in a separate item such that they are not active by default until they are pushed on the PageStack. */ default property alias data: inactiveNode.data PageTreeNode { anchors.fill: parent id: inactiveNode active: false } } ./src/Ubuntu/Components/1.3/ToolbarItems.qml0000644000015600001650000001701612700370701020715 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype ToolbarItems \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \deprecated \brief Row of Items to be placed in a toolbar. \b DEPRECATED: DO NOT USE THIS. USE \b head.actions IN \l Page INSTEAD. Each \l Page has a tools property that can be set to change the tools of toolbar supplied by \l MainView when the \l Page is active. Each ToolbarItems consists of a set of Items and several properties that specify the behavior of the toolbar when the \l Page is active. When a \l Page is used inside a \l MainView, \l Tabs or \l PageStack, the toolbar will automatically show the tools of the active \l Page. When the active \l Page inside the \l Tabs or \l PageStack is updated by changing the selected \l Tab or by pushing/popping a \l Page on the \l PageStack, the toolbar will automatically hide, except if the new active \l Page has the \l locked property set. It is recommended to use \l ToolbarButton inside the ToolbarItems to define the buttons that will be visible to the user: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(50) height: units.gu(50) Page { title: "Tools example" Label { anchors.centerIn: parent text: "Custom back button\nToolbar locked" } tools: ToolbarItems { ToolbarButton { action: Action { text: "button" iconName: "compose" onTriggered: print("success!") } } locked: true opened: true } } } \endqml However, it is possible to include non-\l ToolbarButton Items inside ToolbarItems, and to mix ToolbarButtons and other Items (for example standard Buttons). ToolbarButtons automatically span the full height of the toolbar, and other Items you will probably want to center vertically: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(50) height: units.gu(50) Page { title: "Tools example" Label { anchors.centerIn: parent text: "buttons!" } tools: ToolbarItems { ToolbarButton { action: Action { text: "toolbar" iconName: "compose" onTriggered: print("success!") } } Button { anchors.verticalCenter: parent.verticalCenter text: "standard" } } } } \endqml */ Item { id: toolbarItems anchors.fill: parent /*! Default property, holds the content which will shown in the toolbar. \qmlproperty list contents */ default property alias contents: toolsContainer.data /*! The back button. If it is visible, it will be shown on the left-side of the toolbar. If there is a \l PageStack with depth greater than 1, the back button will be visible and triggering it will pop the page on top of the stack. If there is no \l PageStack with depth greater than 1, the back button is hidden by default The following example shows how to have a classic cancel button that is always visible in the toolbar, instead of the default toolbar-styled back button: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(50) height: units.gu(50) Page { title: "Custom back button" tools: ToolbarItems { back: Button { text: "cancel" } } } } \endqml */ property Item back: ToolbarButton { objectName: "back_toolbar_button" iconSource: Qt.resolvedUrl("../artwork/back.png") text: i18n.dtr('ubuntu-ui-toolkit', "Back") visible: toolbarItems.pageStack && toolbarItems.pageStack.depth > 1 /*! If there is a \l PageStack of sufficient depth, triggering the back button will pop the \l Page on top of the \l PageStack. */ onTriggered: if (toolbarItems.pageStack && toolbarItems.pageStack.depth > 1) toolbarItems.pageStack.pop() } /*! PageStack for the back button. \l Page will automatically set the pageStack property of its tools. */ property Item pageStack: null /*! The toolbar is opened. When the toolbar is not locked, this value is automatically updated when the toolbar is opened/closed by user interaction or by other events (such as changing the active \l Page). */ property bool opened: false /*! The toolbar cannot be opened/closed by bottom-edge swipes. If the ToolbarItems contains no visible Items, it is automatically locked (in closed state). */ property bool locked: !internal.hasVisibleItems() QtObject { id: internal /* Determine whether this ToolbarItems has any visible Items */ function hasVisibleItems() { if (back && back.visible) return true; for (var i=0; i < toolsContainer.children.length; i++) { if (toolsContainer.children[i].visible) return true; } return false; } } Item { id: backContainer anchors { left: parent.left top: parent.top bottom: parent.bottom leftMargin: units.gu(2) } width: childrenRect.width // internal link to the previous back Item to unset its parent // when toolbarItems.back is updated. property Item previousBackItem: null function updateBackItem() { if (backContainer.previousBackItem) backContainer.previousBackItem.parent = null; backContainer.previousBackItem = toolbarItems.back; if (toolbarItems.back) toolbarItems.back.parent = backContainer; } Connections { target: toolbarItems onBackChanged: backContainer.updateBackItem() Component.onCompleted: backContainer.updateBackItem() } } Row { id: toolsContainer anchors { right: parent.right bottom: parent.bottom top: parent.top rightMargin: units.gu(2) } spacing: units.gu(1) } } ./src/Ubuntu/Components/1.3/Slider.qml0000644000015600001650000001722412700370701017534 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ // FIXME(loicm) Add support for keyboard shortcuts (basically left/right). import QtQuick 2.4 import Ubuntu.Components 1.3 as Toolkit /*! \qmltype Slider \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Slider is a component to select a value from a continuous range of values. The slider's sensing area is defined by the width and height, therefore styles should take this into account when defining the visuals, and alter these values to align the graphics' sizes. \l {https://design.ubuntu.com/apps/building-blocks/selection#slider}{See also the Design Guidelines on Sliders}. Example: \qml Item { Slider { function formatValue(v) { return v.toFixed(2) } minimumValue: -3.14 maximumValue: 3.14 value: 0.0 live: true } } \endqml */ Toolkit.StyledItem { id: slider /*! The minimum value from the continuous range of values. If this value is greater than maximumValue, the component will be in an inconsistent state. */ property real minimumValue: 0.0 /*! The maximum value from the continuous range of values. If this value is lesser than minimumValue, the component will be in an inconsistent state. */ property real maximumValue: 100.0 // FIXME(loicm) Add Support for the stepSize property. /*! The distance between two selectable values in the range defined by [minimumValue, maximumValue]. */ property real stepSize: (Math.abs(minimumValue) + Math.abs(maximumValue)) / 100.0 /*! The current value of the slider. This property is not changed while the thumb is dragged unless the live property is set to true. */ property real value: 0.0 /*! Defines whether the value is updated while the thumb is dragged or just when the thumb is released. */ property bool live: false /*! \qmlproperty bool pressed Whether the Slider is currently being pressed. */ property alias pressed: mouseArea.pressed /*! The signal is emitted when there is a click on the slider. The onThumb parameter provides information if the click, was inside of the thumb element. */ signal touched(bool onThumb) /*! This function is used by the value indicator to show the current value. Reimplement this function if you want to show different information. By default, the value v is rounded to the nearest integer value. */ function formatValue(v) { return v.toFixed(0) } // Private symbols. /*! \internal */ property alias __internals: mouseArea /*! \internal */ onValueChanged: mouseArea.liveValue = slider.value activeFocusOnPress: true Binding { target: slider property: "value" value: mouseArea.liveValue when: slider.live } MouseArea { id: mouseArea anchors.fill: parent property Item bar: slider.__styleInstance ? slider.__styleInstance.bar : null property Item thumb: slider.__styleInstance ? slider.__styleInstance.thumb : null property real thumbSpacing: slider.__styleInstance ? slider.__styleInstance.thumbSpacing : 0 property real barMinusThumb: bar && thumb ? bar.width - (thumb.width + 2.0*thumbSpacing) : 0.0 property real liveValue: 0.0 property real normalizedValue: normalizedValueFromValue(liveValue) property real dragInitMouseX: 0.0 property real dragInitNormalizedValue: 0.0 property Flickable flickable: { // traverse parents to catch whether we have an ancestor Flickable var pl = slider.parent; while (pl) { if (pl.hasOwnProperty("flicking")) { return pl; } pl = pl.parent; } return null; } states: State { name: "sliding" when: mouseArea.flickable && mouseArea.pressed PropertyChanges { target: mouseArea.flickable interactive: false } } function normalizedValueFromValue(value) { if (Qt.application.layoutDirection == Qt.RightToLeft) { return Toolkit.MathUtils.clampAndProject(value, slider.minimumValue, slider.maximumValue, 1.0, 0.0); } else { return Toolkit.MathUtils.clampAndProject(value, slider.minimumValue, slider.maximumValue, 0.0, 1.0); } } function valueFromNormalizedValue(normalizedValue) { if (Qt.application.layoutDirection == Qt.RightToLeft) { return Toolkit.MathUtils.lerp(Toolkit.MathUtils.clamp(normalizedValue, 0.0, 1.0), slider.maximumValue, slider.minimumValue); } else { return Toolkit.MathUtils.lerp(Toolkit.MathUtils.clamp(normalizedValue, 0.0, 1.0), slider.minimumValue, slider.maximumValue); } } function adjustValue(increment) { if (Qt.application.layoutDirection == Qt.RightToLeft) increment *= -1; slider.value = Toolkit.MathUtils.clamp(slider.value + increment, slider.minimumValue, slider.maximumValue); } /* Mimic the behaviour of the 'pressed' property with one important difference: 'pressed' is set to true only after the onPressed handler has been executed. That prevents us from doing interesting animations upon press. */ property bool isPressed: false onPressed: { isPressed = true; var thumbPressed = mouse.x >= thumb.x && mouse.x <= thumb.x + thumb.width; if (!thumbPressed) { var normalizedX = (mouseX - thumbSpacing - thumb.width * 0.5) / barMinusThumb; liveValue = valueFromNormalizedValue(normalizedX); } dragInitMouseX = mouse.x; dragInitNormalizedValue = normalizedValue; slider.touched(thumbPressed); } onReleased: { isPressed = false; if (!slider.live) { slider.value = liveValue; } } onPositionChanged: { // Left button dragging var normalizedOffsetX = (mouseArea.mouseX - dragInitMouseX) / barMinusThumb; liveValue = valueFromNormalizedValue(dragInitNormalizedValue + normalizedOffsetX); } onClicked: slider.requestFocus(Qt.MouseFocusReason) onLiveValueChanged: if (isPressed) slider.requestFocus(Qt.MouseFocusReason) } Keys.onLeftPressed: { if (event.modifiers === Qt.NoModifier) __internals.adjustValue(-slider.stepSize); } Keys.onRightPressed: { if (event.modifiers === Qt.NoModifier) __internals.adjustValue(slider.stepSize); } styleName: "SliderStyle" } ./src/Ubuntu/Components/1.3/AppHeader.qml0000644000015600001650000001204312700370701020135 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components.Private 1.3 as Privates /*! \internal \qmltype AppHeader \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu */ Privates.AppHeaderBase { // Note: styleName is set to "PageHeadStyle" in UCAppHeaderBase. id: header anchors { left: parent.left right: parent.right } /*! The background color of the header. Value set by MainView. */ property color backgroundColor /*! The background color of the divider. Value set by MainView. */ property color dividerColor /*! The background color of the panel. Value set by MainView. */ property color panelColor // prevent triggering buttons in the header when it is moving enabled: header.exposed && !header.moving /*! The text to display in the header */ property string title: "" /*! The contents of the header. If this is set, \l title will be ignored. DEPRECATED and replaced by Page.head.contents. */ property Item contents: null /*! A model of tabs to represent in the header. This is automatically set by \l Tabs. */ property var tabsModel: null /*! If it is possible to pop this PageStack, a back button will be shown in the header. */ property var pageStack: null /*! \deprecated \qmlproperty list actions The list of actions actions that will be shown in the header. DEPRECATED. Use Page.head.actions instead. */ property var actions onActionsChanged: print("WARNING: Header.actions property is DEPRECATED. "+ "Use Page.head.actions instead.") /*! \internal \deprecated Action shown before the title. Setting this will disable the back button and tabs drawer button in the new header and replace it with a button representing the action below. DEPRECATED. Use Page.head.backAction property instead. */ property var __customBackAction: null // FIXME: Currently autopilot can only get visual items, but once bug #1273956 // is fixed to support non-visual items, a QtObject may be used. // --timp - 2014-03-20 Item { // FIXME: This is a workaround to be able to get the properties of // tabsModel in an autopilot test. objectName: "tabsModelProperties" property int count: tabsModel ? tabsModel.count : 0 property int selectedIndex: tabsModel ? tabsModel.selectedIndex : -1 } Item { // FIXME: This is a workaround to be able to get the properties of // the sections in an autopilot test. objectName: "sectionsProperties" property int selectedIndex: header.config ? header.config.sections.selectedIndex : -1 } /*! Configuration of the header. FIXME: Must be of type PageHeadConfiguration. Setting that as the property type however will use the latest version (1.3) and a Page that uses an older version (1.1) will no longer work. */ property QtObject config: null animate: false exposed: false Component.onCompleted: { internal.updateProperties(); header.animate = true; } onConfigChanged: internal.updateProperties() onExposedChanged: { if(header.config) { header.config.visible = exposed; } } Connections { target: header.config ignoreUnknownSignals: true onVisibleChanged: { header.exposed = header.config.visible; } onLockedChanged: { if (header.config.locked) { header.flickable = null; } else { header.flickable = header.config.flickable; } } onFlickableChanged: { if (!header.config.locked) { header.flickable = header.config.flickable; } } } QtObject { id: internal function updateProperties() { if (header.config.locked) { header.flickable = null; } else { header.flickable = header.config.flickable; } if (!header.flickable && !header.config.visible) { // locked. header.exposed = false; } else { header.config.visible = true; header.exposed = true; } } } } ./src/Ubuntu/Components/1.3/ProgressionSlot.qml0000644000015600001650000000351312700370701021462 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype ProgressionSlot \inqmlmodule Ubuntu.Components 1.3 \inherits Icon \ingroup ubuntu \brief ProgressionSlot holds an icon representing the progression symbol. ProgressionSlot is designed to provide an easy way for developers to add a progression symbol to the list item created using \l ListItemLayout or \l SlotsLayout. \l ListItemLayout will automatically accomodate the progression symbol as the last trailing slot inside the layout. For more details, see \l ListItemLayout documentation. The following is an example of how easy it is to implement list items using \l ListItem with \l ListItemLayout and ProgressionSlot: \qml ListItem { height: layout.height onClicked: pushPageOnStack() ListItemLayout { id: layout title.text: "Push a new page on the PageStack" ProgressionSlot {} } } \endqml \sa ListItemLayout */ Icon { height: units.gu(2) width: height name: LayoutMirroring.enabled ? "go-previous" : "go-next" SlotsLayout.position: SlotsLayout.Last } ./src/Ubuntu/Components/1.3/ProgressBar.qml0000644000015600001650000000362412700370701020542 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype ProgressBar \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The ProgressBar component visually indicates the progress of a process of determinate or indeterminate duration. Example: \qml Item { ProgressBar { id: indeterminateBar indeterminate: true } ProgressBar { id: determinateBar minimumValue: -3.0 maximumValue: 15 } } \endqml */ AnimatedItem { id: progressBar /*! Specifies whether the progress interval is unknown. When set, altering other properties do not have any effect on the component's behavior. By default the property is set to false. */ property bool indeterminate: false /*! Specifies the minimum value of the progress. */ property real minimumValue: 0.0 /*! Specifies the maximum value of the progress. */ property real maximumValue: 1.0 /*! Specifies the current value of the progress */ property real value: 0.5 /*! \since Ubuntu.Components 1.1 Specifies if the value of the progress is visible */ property bool showProgressPercentage: true styleName: "ProgressBarStyle" } ./src/Ubuntu/Components/1.3/PageHeadSections.qml0000644000015600001650000000541112700370701021453 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype PageHeadSections \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \since Ubuntu.Components 1.1 \brief PageHeadSections is used to configure the sections for a \l Page. These sections will be shown in the bottom part of the header. This component does not need to be instantiated by the developer, it is automatically part of \l PageHeadConfiguration. See also \l Sections. */ QtObject { // To be used inside PageHeadConfiguration id: sections /*! Set this property to false to disable user interaction to change the selected section. Default value: true */ property bool enabled: true /*! The input model for the sections. By default model takes the \l actions as input, but if no trigger functions need to be specified, it can be simplified to a list of strings naming the sections: \qml import Ubuntu.Components 1.3 import QtQuick 2.4 MainView { width: units.gu(50) height: units.gu(80) Page { id: page title: "Sections" head { sections { model: ["one", "two", "three"] } } Label { anchors.centerIn: parent text: "Section " + page.head.sections.selectedIndex } } } \endqml It is strongly recommended to limit the number of sections to two or three. */ property var model: actions /*! List of actions that represent the sections. The text of each action is displayed as the section name and clicking a section will update the \l selectedIndex. When \l selectedIndex is changed (by user interaction or by setting the value), actions[selectedIndex] will be triggered. \since Ubuntu.Components 1.3 */ property list actions /*! The index of the currently selected section in \l model. */ property int selectedIndex: model ? 0 : -1 } ./src/Ubuntu/Components/1.3/TabBar.qml0000644000015600001650000001306612700370701017445 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 as Toolkit /*! \qmltype TabBar \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Tab bar that will be shown in the header when \l Tabs is active. This component does not need to be instantiated by the developer, it is automatically created by the \l Tabs. */ Toolkit.StyledItem { id: tabBar /*! \deprecated The \l Tabs item that tab bar belongs to. Will be automatically set by \l Tabs when the TabBar is created. */ // tabsItem is of type Tabs, but using that type would cause an include loop property Item tabsItem /*! \internal */ onTabsItemChanged: console.error("tabsItem property is deprecated. TabBar functionality no longer requires it.") /*! The model containing the tabs to be controlled by the TabBar. The tabs are visualized by the style, displaying controlling elements based on the data specified by the roles. The default style mandates the existence of either the \b title or \b tab role, but different styles may require to have other roles (e.g. image, color). The order the role existence is checked is also determined by the style component, Default style checks the existence of the \b tab role first, and if not defined will use the \b title role. */ property var model: null /*! The user is interacting with the tab bar. Depends on the style pressed property. */ readonly property bool pressed: __styleInstance !== null && __styleInstance.hasOwnProperty("pressed") ? __styleInstance.pressed : false /*! An inactive tab bar only displays the currently selected tab, and an active tab bar can be interacted with to select a tab. */ property bool selectionMode: true /*! The property holds the index of the selected Tab item. Note: Setting this property is DEPRECATED. Set the selectedIndex of the model instead. */ property int selectedIndex: (model && internal.modelChecked) ? model.selectedIndex : -1 /*! \internal */ onSelectedIndexChanged: { if (!model) return; if (tabBar.selectedIndex !== model.selectedIndex) { console.warn("Setting TabBar.selectedIndex is DEPRECATED. Set selectedIndex of the model instead"); tabBar.selectedIndex = Qt.binding(function() { return (model && internal.modelChecked) ? model.selectedIndex : -1 }); } } /*! Do not deactivate the tab bar after a specified idle time or when the user selects a new tab. Off by default. */ property bool alwaysSelectionMode: false /*! Automatically activate the tab bar when \l alwaysSelectionMode is set. */ onAlwaysSelectionModeChanged: { if (tabBar.alwaysSelectionMode) selectionMode = true; } /*! Show animations when the state changes. Default: true. */ property bool animate: true implicitHeight: units.gu(7.5) activeFocusOnPress: true styleName: "TabBarStyle" QtObject { id: internal property bool modelChecked: true; // returns true if the roles are good, false otherwise. function checkRoles() { if (tabBar.model.count <= 0) return false; modelChecked = true; var f = tabBar.model.get(0); if (f.tab === undefined && f.title === undefined) { console.error("TabBar model must provide either tab or title role."); tabBar.model = null; return false; } if (f.tab !== undefined && f.tab.title === undefined) { console.error("TabBar model's tab role must have title property."); tabBar.model = null; return false; } return true; } } /*! \internal */ onModelChanged: { internal.modelChecked = true; if (!model) return; if (!model.hasOwnProperty("selectedIndex")) { console.error("TabBar model must have selectedIndex property defined."); tabBar.model = null; return; } if (!model.hasOwnProperty("count")) { console.error("TabBar model must have count property defined."); tabBar.model = null; return; } if (!model.hasOwnProperty("get")) { console.error("TabBar model must provide get() function."); tabBar.model = null; return; } if (model.count > 0) { if (internal.checkRoles()) { model.selectedIndex = Math.max(Math.min(model.selectedIndex, model.count - 1), 0); } } else { internal.modelChecked = false; } } Connections { target: !internal.modelChecked ? tabBar.model : null onCountChanged: internal.checkRoles(); } } ./src/Ubuntu/Components/1.3/Sections.qml0000644000015600001650000001035512700370701020077 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype Sections \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu \since Ubuntu.Components 1.3 \brief Display a list of sections that the user can select. By tapping on a section name the \l selectedIndex will be updated, and the associated \l Action is triggered. */ StyledItem { id: sections styleName: "SectionsStyle" /*! List of actions that represent the sections. The text of each action is displayed as the section name and clicking a section will update the \l selectedIndex. When \l selectedIndex is changed (by user interaction or by setting the value), actions[selectedIndex] will be triggered. Example: \qml Sections { actions: [ Action { text: "first" onTriggered: print("one") }, Action { text: "second" onTriggered: print("two") }, Action { text: "third" onTriggered: print("three") } ] } \endqml It is strongly recommended to limit the number of sections to two or three. The actions are used as the model for the Sections by default. If no trigger functions need to be specified, \l model may be used directly without setting the actions property. If both \l actions and \l model are set, model overrides the actions. */ property list actions /*! The input model for the sections. By default model takes the \l actions as input, but if no trigger functions need to be specified, it can be simplified to a list of strings naming the sections: \qml Sections { model: [ "one", "two", "three" ] onSelectedIndexChanged: { print("Selected section " + model[selectedIndex]); } } \endqml */ property var model: actions onModelChanged: { if (internal.done) { if (!model || model.length === 0) { selectedIndex = -1; } else if (selectedIndex === 0) { // selectedIndex does not change, but action 0 should be triggered. internal.triggerAction(0); } else { // change selectedIndex, which will trigger action 0. selectedIndex = 0; } } } Component.onCompleted: { internal.done = true; internal.triggerAction(selectedIndex); } QtObject { id: internal property bool done: false /*! Triggers the action associated with the given index, if that action exists. */ function triggerAction(index) { if ((index >= 0) && (index < model.length)) { if (model[index].hasOwnProperty("trigger")) { model[index].trigger(); } } } } /*! The index of the currently selected section in \l model. The default value is 0 if there is at least 1 section, or -1 for no sections. When the model is changed, selectedIndex is reset to 0 and the first action is triggered. Upon completion of the Sections component, if there is an Action associated with the selected index, that Action will be triggered. */ property int selectedIndex: model ? 0 : -1 onSelectedIndexChanged: { internal.triggerAction(selectedIndex); } } ./src/Ubuntu/Components/Styles/0000755000015600001650000000000012700370701016553 5ustar jenkinsjenkins./src/Ubuntu/Components/Styles/1.3/0000755000015600001650000000000012700370701017054 5ustar jenkinsjenkins./src/Ubuntu/Components/Styles/1.3/PageHeaderStyle.qml0000644000015600001650000000314412700370701022577 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype PageHeaderStyle \inqmlmodule Ubuntu.Components.Styles 1.3 \ingroup style-api \brief Style API for page header. The component defines the style API for the \l PageHeader component. */ Item { /*! The color of the title and the action buttons in the header. */ property color foregroundColor /*! The color of the background of the header. */ property color backgroundColor /*! The color of the divider at the bottom of the header. */ property color dividerColor /*! The delegate used for the buttons in the leading and trailing \l ActionBar in the header. */ property Component defaultActionDelegate /*! The default contents that will be loaded when no contents Item was set. */ property Component titleComponent /*! The height of the header excluding the divider and extension. */ property real contentHeight } ./src/Ubuntu/Components/Styles/1.3/PageHeadStyle.qml0000644000015600001650000000455212700370701022254 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype PageHeadStyle \inqmlmodule Ubuntu.Components.Styles 1.1 \ingroup style-api \brief Style API for page header. The component defines the style API for the page header component. */ Item { /*! The height of the header excluding the height of the bottom divider and the (optional) row that displays the sections. */ property real contentHeight /*! The source of the image that separates the header from the contents of a \l MainView. The separator will be drawn over the contents. Set to empty string to use the new header separator. \deprecated */ property url separatorSource /*! The source of an additional image attached to the bottom of the separator. The contents of the \l MainView will be drawn on top of the separator bottom image. This property is ignored when separatorSource is an empty string. \deprecated */ property url separatorBottomSource /*! The size of the title font. \deprecated */ property string fontSize /*! The size of the title Label. */ property int textSize /*! The weight of the title font. */ property int fontWeight /*! \deprecated */ property color textColor /*! Left margin of title text. */ property real textLeftMargin /*! The number of slots for actions in the header, including the optional (custom or automatic) back button in the left side of the header. If the number of actions defined is larger than the numer of actions specified here, extra actions are put into an overflow. */ property int maximumNumberOfActions } ./src/Ubuntu/Components/Styles/1.3/ToolbarStyle.qml0000644000015600001650000000201512700370701022210 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype ToolbarStyle \inqmlmodule Ubuntu.Components.Styles 1.3 \ingroup style-api \brief Style API for toolbar. The component defines the style API for the \l Toolbar component. */ Item { /*! The default action delegate if the styled item does not provide a different delegate. */ property Component defaultDelegate } ./src/Ubuntu/Components/Styles/1.3/ActionBarStyle.qml0000644000015600001650000000306312700370701022454 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype ActionBarStyle \inqmlmodule Ubuntu.Components.Styles 1.1 \ingroup style-api \brief Style API for action bar. The component defines the style API for the \l ActionBar component. */ Item { /*! The default action delegate if the styled item does not provide a different delegate. */ property Component defaultDelegate /*! The default number of slots for the action bar. */ property int defaultNumberOfSlots /*! The icon name for action of the overflow button. */ property string overflowIconName /*! The icon source for the action of the overflow button. Setting the icon source will override the icon name. */ property url overflowIconSource /*! The text for the action of the overflow button, which may be used in the action delegate. */ property string overflowText } ./src/Ubuntu/Components/Styles/1.2/0000755000015600001650000000000012700370701017053 5ustar jenkinsjenkins./src/Ubuntu/Components/Styles/1.2/PageHeadStyle.qml0000644000015600001650000000441112700370701022245 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype PageHeadStyle \inqmlmodule Ubuntu.Components.Styles 1.1 \ingroup style-api \brief Style API for page header. The component defines the style API for the page header component. */ Item { /*! The height of the header excluding the height of the bottom divider and the (optional) row that displays the sections. */ property real contentHeight /*! The source of the image that separates the header from the contents of a \l MainView. The separator will be drawn over the contents. Set to empty string to use the new header separator. \deprecated */ property url separatorSource /*! The source of an additional image attached to the bottom of the separator. The contents of the \l MainView will be drawn on top of the separator bottom image. This property is ignored when separatorSource is an empty string. \deprecated */ property url separatorBottomSource /*! The size of the title font. */ property string fontSize /*! The weight of the title font. */ property int fontWeight /*! \deprecated */ property color textColor /*! Left margin of title text. */ property real textLeftMargin /*! The number of slots for actions in the header, including the optional (custom or automatic) back button in the left side of the header. If the number of actions defined is larger than the numer of actions specified here, extra actions are put into an overflow. */ property int maximumNumberOfActions } ./src/Ubuntu/Components/Styles/1.2/ComboButtonStyle.qml0000644000015600001650000000436112700370701023046 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype ComboButtonStyle \inqmlmodule Ubuntu.Components.Styles 1.1 \ingroup style-api \brief Style API for ComboButton component. The component defines the style API for the ComboButton component. */ Item { /*! Width of the drop down button. */ property real dropDownWidth /*! Width of the dropdown button separator. */ property real dropDownSeparatorWidth /*! Distance between the combo list and the main button. */ property real comboListMargin /*! The item which will hold the combo list data. Implementations can point both this and \l comboListPanel to the same component, however separate items should be used if a gap between the panel and the content is required. See Ambiance theme. */ property Item comboListHolder /*! The item pointing to the panel holding the combo list and additional design artifacts. It is used by the component to drive the expansion size. */ property Item comboListPanel /*! Default color for the main button. */ property color defaultColor /*! Default gradient for the main button. */ property Gradient defaultGradient /*! Default color for the dropdown button and the combo list both when expanded and collapsed. Implementations can define different color for expanded/collapsed using the \a styledItem.expanded property. */ property color defaultDropdownColor /*! Default font used in the main button. */ property font defaultFont } ./src/Ubuntu/Components/Styles/1.2/PullToRefreshStyle.qml0000644000015600001650000000317112700370701023347 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype PullToRefreshStyle \inqmlmodule Ubuntu.Components.Styles 1.1 \ingroup style-api \brief Style API for PullToRefresh component. The component defines the style API for the PullToRefresh component. */ //![0] Item { /*! The property holds the style provided default content component. The value is assigned to the \l PullToRefresh::content property. */ property Component defaultContent /*! The property holds the threshold value when the component should enter into \a ready-to-refresh state when dragged manually. The default value is the height of the component styled. */ property real activationThreshold: styledItem.height /*! The property informs the component when a manual refresh can be triggered. Style implementations (themes) can decide when to flip the component to be ready to trigger reftesh signal. */ property bool releaseToRefresh: false } //![0] ./src/Ubuntu/Components/Styles/Styles.pro0000644000015600001650000000063212700370701020561 0ustar jenkinsjenkinsTARGETPATH = Ubuntu/Components/Styles ARTWORK_FILES = $$system(find artwork -type f) QML_FILES += 1.2/ComboButtonStyle.qml \ 1.2/PageHeadStyle.qml \ 1.2/PullToRefreshStyle.qml \ 1.3/PageHeadStyle.qml \ 1.3/ActionBarStyle.qml \ 1.3/PageHeaderStyle.qml \ 1.3/ToolbarStyle.qml \ $$ARTWORK_FILES load(ubuntu_qml_module) OTHER_FILES+=qmldir ./src/Ubuntu/Components/Styles/qmldir0000644000015600001650000000060312700370701017765 0ustar jenkinsjenkinsmodule Ubuntu.Components.Styles ComboButtonStyle 1.1 1.2/ComboButtonStyle.qml PullToRefreshStyle 1.1 1.2/PullToRefreshStyle.qml PageHeadStyle 1.1 1.2/PageHeadStyle.qml #version 1.2 introduced by ListItemStyle #version 1.3 PageHeadStyle 1.3 1.3/PageHeadStyle.qml ActionBarStyle 1.3 1.3/ActionBarStyle.qml PageHeaderStyle 1.3 1.3/PageHeaderStyle.qml ToolbarStyle 1.3 1.3/ToolbarStyle.qml ./src/Ubuntu/Components/tools/0000755000015600001650000000000012700370701016430 5ustar jenkinsjenkins./src/Ubuntu/Components/tools/shape.svg0000644000015600001650000000467012700370701020260 0ustar jenkinsjenkins image/svg+xml ./src/Ubuntu/Components/tools/tools.pro0000644000015600001650000000021412700370701020307 0ustar jenkinsjenkinsTEMPLATE = app TARGET = createshapetextures QT += gui svg QMAKE_CXXFLAGS += -Werror -Wno-unused-variable SOURCES += createshapetextures.cpp ./src/Ubuntu/Components/tools/3rd_party/0000755000015600001650000000000012700370701020337 5ustar jenkinsjenkins./src/Ubuntu/Components/tools/3rd_party/edtaa3func.c0000644000015600001650000004610012700370701022521 0ustar jenkinsjenkins/* * edtaa3() * * Sweep-and-update Euclidean distance transform of an * image. Positive pixels are treated as object pixels, * zero or negative pixels are treated as background. * An attempt is made to treat antialiased edges correctly. * The input image must have pixels in the range [0,1], * and the antialiased image should be a box-filter * sampling of the ideal, crisp edge. * If the antialias region is more than 1 pixel wide, * the result from this transform will be inaccurate. * * By Stefan Gustavson (stefan.gustavson@gmail.com). * * Originally written in 1994, based on a verbal * description of the SSED8 algorithm published in the * PhD dissertation of Ingemar Ragnemalm. This is his * algorithm, I only implemented it in C. * * Updated in 2004 to treat border pixels correctly, * and cleaned up the code to improve readability. * * Updated in 2009 to handle anti-aliased edges. * * Updated in 2011 to avoid a corner case infinite loop. * * Updated 2012 to change license from LGPL to MIT. */ /* Copyright (C) 2009-2012 Stefan Gustavson (stefan.gustavson@gmail.com) The code in this file is distributed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* * Compute the local gradient at edge pixels using convolution filters. * The gradient is computed only at edge pixels. At other places in the * image, it is never used, and it's mostly zero anyway. */ void computegradient(double *img, int w, int h, double *gx, double *gy) { int i,j,k,p,q; double glength, phi, phiscaled, ascaled, errsign, pfrac, qfrac, err0, err1, err; #define SQRT2 1.4142136 for(i = 1; i < h-1; i++) { // Avoid edges where the kernels would spill over for(j = 1; j < w-1; j++) { k = i*w + j; if((img[k]>0.0) && (img[k]<1.0)) { // Compute gradient for edge pixels only gx[k] = -img[k-w-1] - SQRT2*img[k-1] - img[k+w-1] + img[k-w+1] + SQRT2*img[k+1] + img[k+w+1]; gy[k] = -img[k-w-1] - SQRT2*img[k-w] - img[k+w-1] + img[k-w+1] + SQRT2*img[k+w] + img[k+w+1]; glength = gx[k]*gx[k] + gy[k]*gy[k]; if(glength > 0.0) { // Avoid division by zero glength = sqrt(glength); gx[k]=gx[k]/glength; gy[k]=gy[k]/glength; } } } } // TODO: Compute reasonable values for gx, gy also around the image edges. // (These are zero now, which reduces the accuracy for a 1-pixel wide region // around the image edge.) 2x2 kernels would be suitable for this. } /* * A somewhat tricky function to approximate the distance to an edge in a * certain pixel, with consideration to either the local gradient (gx,gy) * or the direction to the pixel (dx,dy) and the pixel greyscale value a. * The latter alternative, using (dx,dy), is the metric used by edtaa2(). * Using a local estimate of the edge gradient (gx,gy) yields much better * accuracy at and near edges, and reduces the error even at distant pixels * provided that the gradient direction is accurately estimated. */ double edgedf(double gx, double gy, double a) { double df, glength, temp, a1; if ((gx == 0) || (gy == 0)) { // Either A) gu or gv are zero, or B) both df = 0.5-a; // Linear approximation is A) correct or B) a fair guess } else { glength = sqrt(gx*gx + gy*gy); if(glength>0) { gx = gx/glength; gy = gy/glength; } /* Everything is symmetric wrt sign and transposition, * so move to first octant (gx>=0, gy>=0, gx>=gy) to * avoid handling all possible edge directions. */ gx = fabs(gx); gy = fabs(gy); if(gx 1.0) a = 1.0; if(a < 0.0) a = 0.0; // Clip grayscale values outside the range [0,1] if(a == 0.0) return 1000000.0; // Not an object pixel, return "very far" ("don't know yet") dx = (double)xi; dy = (double)yi; di = sqrt(dx*dx + dy*dy); // Length of integer vector, like a traditional EDT if(di==0) { // Use local gradient only at edges // Estimate based on local gradient only df = edgedf(gx, gy, a); } else { // Estimate gradient based on direction to edge (accurate for large di) df = edgedf(dx, dy, a); } return di + df; // Same metric as edtaa2, except at edges (where di=0) } // Shorthand macro: add ubiquitous parameters dist, gx, gy, img and w and call distaa3() #define DISTAA(c,xc,yc,xi,yi) (distaa3(img, gx, gy, w, c, xc, yc, xi, yi)) void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, short *disty, double *dist) { int x, y, i, c; int offset_u, offset_ur, offset_r, offset_rd, offset_d, offset_dl, offset_l, offset_lu; double olddist, newdist; int cdistx, cdisty, newdistx, newdisty; int changed; double epsilon = 1e-3; /* Initialize index offsets for the current image width */ offset_u = -w; offset_ur = -w+1; offset_r = 1; offset_rd = w+1; offset_d = w; offset_dl = w-1; offset_l = -1; offset_lu = -w-1; /* Initialize the distance images */ for(i=0; i 0) // If non-zero distance or not set yet { c = i + offset_u; // Index of candidate for testing cdistx = distx[c]; cdisty = disty[c]; newdistx = cdistx; newdisty = cdisty+1; newdist = DISTAA(c, cdistx, cdisty, newdistx, newdisty); if(newdist < olddist-epsilon) { distx[i]=newdistx; disty[i]=newdisty; dist[i]=newdist; olddist=newdist; changed = 1; } c = i+offset_ur; cdistx = distx[c]; cdisty = disty[c]; newdistx = cdistx-1; newdisty = cdisty+1; newdist = DISTAA(c, cdistx, cdisty, newdistx, newdisty); if(newdist < olddist-epsilon) { distx[i]=newdistx; disty[i]=newdisty; dist[i]=newdist; changed = 1; } } i++; /* Middle pixels have all neighbors */ for(x=1; x 0) // If not already zero distance { c = i+offset_l; cdistx = distx[c]; cdisty = disty[c]; newdistx = cdistx+1; newdisty = cdisty; newdist = DISTAA(c, cdistx, cdisty, newdistx, newdisty); if(newdist < olddist-epsilon) { distx[i]=newdistx; disty[i]=newdisty; dist[i]=newdist; olddist=newdist; changed = 1; } c = i+offset_lu; cdistx = distx[c]; cdisty = disty[c]; newdistx = cdistx+1; newdisty = cdisty+1; newdist = DISTAA(c, cdistx, cdisty, newdistx, newdisty); if(newdist < olddist-epsilon) { distx[i]=newdistx; disty[i]=newdisty; dist[i]=newdist; olddist=newdist; changed = 1; } c = i+offset_u; cdistx = distx[c]; cdisty = disty[c]; newdistx = cdistx; newdisty = cdisty+1; newdist = DISTAA(c, cdistx, cdisty, newdistx, newdisty); if(newdist < olddist-epsilon) { distx[i]=newdistx; disty[i]=newdisty; dist[i]=newdist; changed = 1; } } /* Move index to second rightmost pixel of current row. */ /* Rightmost pixel is skipped, it has no right neighbor. */ i = y*w + w-2; /* scan left, propagate distance from right */ for(x=w-2; x>=0; x--, i--) { olddist = dist[i]; if(olddist <= 0) continue; // Already zero distance c = i+offset_r; cdistx = distx[c]; cdisty = disty[c]; newdistx = cdistx-1; newdisty = cdisty; newdist = DISTAA(c, cdistx, cdisty, newdistx, newdisty); if(newdist < olddist-epsilon) { distx[i]=newdistx; disty[i]=newdisty; dist[i]=newdist; changed = 1; } } } /* Scan rows in reverse order, except last row */ for(y=h-2; y>=0; y--) { /* move index to rightmost pixel of current row */ i = y*w + w-1; /* Scan left, propagate distances from below & right */ /* Rightmost pixel is special, has no right neighbors */ olddist = dist[i]; if(olddist > 0) // If not already zero distance { c = i+offset_d; cdistx = distx[c]; cdisty = disty[c]; newdistx = cdistx; newdisty = cdisty-1; newdist = DISTAA(c, cdistx, cdisty, newdistx, newdisty); if(newdist < olddist-epsilon) { distx[i]=newdistx; disty[i]=newdisty; dist[i]=newdist; olddist=newdist; changed = 1; } c = i+offset_dl; cdistx = distx[c]; cdisty = disty[c]; newdistx = cdistx+1; newdisty = cdisty-1; newdist = DISTAA(c, cdistx, cdisty, newdistx, newdisty); if(newdist < olddist-epsilon) { distx[i]=newdistx; disty[i]=newdisty; dist[i]=newdist; changed = 1; } } i--; /* Middle pixels have all neighbors */ for(x=w-2; x>0; x--, i--) { olddist = dist[i]; if(olddist <= 0) continue; // Already zero distance c = i+offset_r; cdistx = distx[c]; cdisty = disty[c]; newdistx = cdistx-1; newdisty = cdisty; newdist = DISTAA(c, cdistx, cdisty, newdistx, newdisty); if(newdist < olddist-epsilon) { distx[i]=newdistx; disty[i]=newdisty; dist[i]=newdist; olddist=newdist; changed = 1; } c = i+offset_rd; cdistx = distx[c]; cdisty = disty[c]; newdistx = cdistx-1; newdisty = cdisty-1; newdist = DISTAA(c, cdistx, cdisty, newdistx, newdisty); if(newdist < olddist-epsilon) { distx[i]=newdistx; disty[i]=newdisty; dist[i]=newdist; olddist=newdist; changed = 1; } c = i+offset_d; cdistx = distx[c]; cdisty = disty[c]; newdistx = cdistx; newdisty = cdisty-1; newdist = DISTAA(c, cdistx, cdisty, newdistx, newdisty); if(newdist < olddist-epsilon) { distx[i]=newdistx; disty[i]=newdisty; dist[i]=newdist; olddist=newdist; changed = 1; } c = i+offset_dl; cdistx = distx[c]; cdisty = disty[c]; newdistx = cdistx+1; newdisty = cdisty-1; newdist = DISTAA(c, cdistx, cdisty, newdistx, newdisty); if(newdist < olddist-epsilon) { distx[i]=newdistx; disty[i]=newdisty; dist[i]=newdist; changed = 1; } } /* Leftmost pixel is special, has no left neighbors */ olddist = dist[i]; if(olddist > 0) // If not already zero distance { c = i+offset_r; cdistx = distx[c]; cdisty = disty[c]; newdistx = cdistx-1; newdisty = cdisty; newdist = DISTAA(c, cdistx, cdisty, newdistx, newdisty); if(newdist < olddist-epsilon) { distx[i]=newdistx; disty[i]=newdisty; dist[i]=newdist; olddist=newdist; changed = 1; } c = i+offset_rd; cdistx = distx[c]; cdisty = disty[c]; newdistx = cdistx-1; newdisty = cdisty-1; newdist = DISTAA(c, cdistx, cdisty, newdistx, newdisty); if(newdist < olddist-epsilon) { distx[i]=newdistx; disty[i]=newdisty; dist[i]=newdist; olddist=newdist; changed = 1; } c = i+offset_d; cdistx = distx[c]; cdisty = disty[c]; newdistx = cdistx; newdisty = cdisty-1; newdist = DISTAA(c, cdistx, cdisty, newdistx, newdisty); if(newdist < olddist-epsilon) { distx[i]=newdistx; disty[i]=newdisty; dist[i]=newdist; changed = 1; } } /* Move index to second leftmost pixel of current row. */ /* Leftmost pixel is skipped, it has no left neighbor. */ i = y*w + 1; for(x=1; x. * * Author: Loïc Molinari */ // This program creates the texture (as a C header) used by the UbuntuShape for its shape, shadows // and bevel. It uses distance fields to create efficient anti-aliased and resolution independent // contours. The EDTAA3 algorithm and implementation comes from Stefan Gustavson, for more // information see http://webstaff.itn.liu.se/~stegu/aadist/readme.pdf. // In order to generate a new file, the following commands must be used: // $ cd tools // $ qmake && make // $ ./createshapetextures shape.svg ../plugin/ucubuntushapetexture.h #include #include #include #include #include #include // Needed by edtaa3func.c. #include "3rd_party/edtaa3func.c" // Input data. const int textureCount = 2; const double distanceScale = 4.0; const double shapeOffset = 0.0625; // Sizes (must be power-of-2). const int width = 32; const int height = 32; const int size = width * height; const int widthMipmap = 256; const int heightMipmap = 256; const int sizeMipmap = widthMipmap * heightMipmap; const int mipmapCount = 9; // Minimum size is 1. const int biggestSize = size > sizeMipmap ? size : sizeMipmap; // Shape buffers. static uint renderBuffer[biggestSize]; static double renderBufferNormalized[biggestSize]; // Distance field buffers. static double distanceIn[biggestSize]; static double distanceOut[biggestSize]; // Temporary buffers used by the computegradient() and edtaa3() functions exposed by edtaa3func.c. static short distanceX[biggestSize]; static short distanceY[biggestSize]; static double gradientX[biggestSize]; static double gradientY[biggestSize]; // Final texture buffers. static uint textureData[size]; static uint textureDataMipmap[sizeMipmap]; // Clear rendering buffer. static void clearRenderBuffer() { memset(renderBuffer, 0, biggestSize * sizeof(uint)); } // Clear gradient buffers. static void clearGradientBuffers() { memset(gradientX, 0, biggestSize * sizeof(double)); memset(gradientY, 0, biggestSize * sizeof(double)); } // Creates the inset and flat aspect texture. static void createTexture1( QSvgRenderer* svg, QPainter* painter, uint* data, int width, int height, bool useEdtaa3) { // Input data. const double shadowScale = 7.5; const double shadowTranslucency = 0.37; const double distanceBottomTY = 0.0546875; // From shapeOffset. const double shadowTopTX = -0.01171875; // From shapeOffset. const double shadowTopTY = 0.03125; // From shapeOffset. const double shadowBottomTX = -0.01171875; // From shapeOffset. const double shadowBottomTY = -0.00390625; // From shapeOffset. const int size = width * height; const double imageScale = 255.0 / width; if (useEdtaa3) { // Render and store the distance field used for masking the top of the shape, for masking // the bevel and for masking the unstyled shape. clearRenderBuffer(); painter->resetTransform(); painter->translate(shapeOffset * width, shapeOffset * height); svg->render(painter); for (int i = 0; i < size; i++) { renderBufferNormalized[i] = static_cast(renderBuffer[i] >> 24) / 255.0; } computegradient(renderBufferNormalized, width, height, gradientX, gradientY); edtaa3(renderBufferNormalized, gradientX, gradientY, width, height, distanceX, distanceY, distanceOut); for (int i = 0; i < size; i++) { renderBufferNormalized[i] = 1.0 - renderBufferNormalized[i]; } clearGradientBuffers(); computegradient(renderBufferNormalized, width, height, gradientX, gradientY); edtaa3(renderBufferNormalized, gradientX, gradientY, width, height, distanceX, distanceY, distanceIn); for (int i = 0; i < size; i++) { const double distance = qMax(0.0, distanceIn[i]) - qMax(0.0, distanceOut[i]); const uint value = qBound(0, qRound(distance * distanceScale * imageScale + 127.5), 255); data[i] = value << 16; // Stored in channel R (B in shaders). } // Render and store the distance field used for masking the bottom of the shape and for // masking the bevel. clearRenderBuffer(); painter->resetTransform(); painter->translate(shapeOffset * width, (shapeOffset + distanceBottomTY) * height); svg->render(painter); for (int i = 0; i < size; i++) { renderBufferNormalized[i] = static_cast(renderBuffer[i] >> 24) / 255.0; } computegradient(renderBufferNormalized, width, height, gradientX, gradientY); edtaa3(renderBufferNormalized, gradientX, gradientY, width, height, distanceX, distanceY, distanceOut); for (int i = 0; i < size; i++) { renderBufferNormalized[i] = 1.0 - renderBufferNormalized[i]; } clearGradientBuffers(); computegradient(renderBufferNormalized, width, height, gradientX, gradientY); edtaa3(renderBufferNormalized, gradientX, gradientY, width, height, distanceX, distanceY, distanceIn); for (int i = 0; i < size; i++) { const double distance = qMax(0.0, distanceIn[i]) - qMax(0.0, distanceOut[i]); const uint value = qBound(0, qRound(distance * distanceScale * imageScale + 127.5), 255); data[i] |= value << 24; // Stored in channel A. } } else { // Render and store the mask for the top of the shape, the bevel and the unstyled shape. clearRenderBuffer(); painter->resetTransform(); painter->translate(shapeOffset * width, shapeOffset * height); svg->render(painter); for (int i = 0; i < size; i++) { const uint value = renderBuffer[i] >> 24; data[i] = value << 16; // Stored in channel R (B in shaders). } // Render and store the mask for the bottom of the shape and for the bevel. clearRenderBuffer(); painter->resetTransform(); painter->translate(shapeOffset * width, (shapeOffset + distanceBottomTY) * height); svg->render(painter); for (int i = 0; i < size; i++) { const uint value = renderBuffer[i] >> 24; data[i] |= value << 24; // Stored in channel A. } } // Render and store the top inner shadow. clearRenderBuffer(); painter->resetTransform(); painter->translate((shapeOffset + shadowTopTX) * width, (shapeOffset + shadowTopTY) * height); svg->render(painter); for (int i = 0; i < size; i++) { renderBufferNormalized[i] = 1.0 - (static_cast(renderBuffer[i] >> 24) / 255.0); } computegradient(renderBufferNormalized, width, height, gradientX, gradientY); edtaa3(renderBufferNormalized, gradientX, gradientY, width, height, distanceX, distanceY, distanceIn); for (int i = 0; i < size; i++) { double shadow = qBound(0.0, (distanceIn[i] * shadowScale * imageScale) / 255.0, 1.0); shadow = (1.0 - (2.0 * shadow - shadow * shadow)) * 255.0; const uint value = qBound(0, qRound(shadow * shadowTranslucency), 255); data[i] |= value << 0; // Stored in channel B (R in shaders). } // Render and store the bottom inner shadow. clearRenderBuffer(); painter->resetTransform(); painter->translate( (shapeOffset + shadowBottomTX) * width, (shapeOffset + shadowBottomTY) * height); svg->render(painter); for (int i = 0; i < size; i++) { renderBufferNormalized[i] = 1.0 - (static_cast(renderBuffer[i] >> 24) / 255.0); } computegradient(renderBufferNormalized, width, height, gradientX, gradientY); edtaa3(renderBufferNormalized, gradientX, gradientY, width, height, distanceX, distanceY, distanceIn); for (int i = 0; i < size; i++) { double shadow = qBound(0.0, (distanceIn[i] * shadowScale * imageScale) / 255.0, 1.0); shadow = (1.0 - (2.0 * shadow - shadow * shadow)) * 255.0; const uint value = qBound(0, qRound(shadow * shadowTranslucency), 255); data[i] |= value << 8; // Stored in channel G. } } // Creates the drop shadow aspect texture. static void createTexture2( QSvgRenderer* svg, QPainter* painter, uint* data, int width, int height, bool useEdtaa3) { // Input data. const double shadowScale = 4.5; const double shadowTranslucency = 0.8; const double distanceBottomTY = 0.0546875; // From shapeOffset. const double distanceTx = distanceBottomTY * 0.5; // From shapeOffset. const int size = width * height; const double imageScale = 255.0 / width; if (useEdtaa3) { // Render and store the distance field used for masking the top of the shape. clearRenderBuffer(); painter->resetTransform(); painter->translate((shapeOffset + distanceTx) * width, shapeOffset * height); svg->render(painter); for (int i = 0; i < size; i++) { renderBufferNormalized[i] = static_cast(renderBuffer[i] >> 24) / 255.0; } computegradient(renderBufferNormalized, width, height, gradientX, gradientY); edtaa3(renderBufferNormalized, gradientX, gradientY, width, height, distanceX, distanceY, distanceOut); for (int i = 0; i < size; i++) { renderBufferNormalized[i] = 1.0 - renderBufferNormalized[i]; } clearGradientBuffers(); computegradient(renderBufferNormalized, width, height, gradientX, gradientY); edtaa3(renderBufferNormalized, gradientX, gradientY, width, height, distanceX, distanceY, distanceIn); for (int i = 0; i < size; i++) { const double distance = qMax(0.0, distanceIn[i]) - qMax(0.0, distanceOut[i]); const uint value = qBound(0, qRound(distance * distanceScale * imageScale + 127.5), 255); data[i] = value << 0; // Stored in channel B (R in shaders). } // Render and store the distance field used for masking the bottom of the shape. clearRenderBuffer(); painter->resetTransform(); painter->translate( (shapeOffset + distanceTx) * width, (shapeOffset + distanceBottomTY) * height); svg->render(painter); for (int i = 0; i < size; i++) { renderBufferNormalized[i] = static_cast(renderBuffer[i] >> 24) / 255.0; } computegradient(renderBufferNormalized, width, height, gradientX, gradientY); edtaa3(renderBufferNormalized, gradientX, gradientY, width, height, distanceX, distanceY, distanceOut); for (int i = 0; i < size; i++) { renderBufferNormalized[i] = 1.0 - renderBufferNormalized[i]; } clearGradientBuffers(); computegradient(renderBufferNormalized, width, height, gradientX, gradientY); edtaa3(renderBufferNormalized, gradientX, gradientY, width, height, distanceX, distanceY, distanceIn); for (int i = 0; i < size; i++) { const double distance = qMax(0.0, distanceIn[i]) - qMax(0.0, distanceOut[i]); const uint value = qBound(0, qRound(distance * distanceScale * imageScale + 127.5), 255); data[i] |= value << 8; // Stored in channel G. } } else { // Render and store the mask for the top of the shape. clearRenderBuffer(); painter->resetTransform(); painter->translate((shapeOffset + distanceTx) * width, shapeOffset * height); svg->render(painter); for (int i = 0; i < size; i++) { const uint value = renderBuffer[i] >> 24; data[i] = value << 0; // Stored in channel B (R in shaders). } // Render and store the mask for the bottom of the shape. clearRenderBuffer(); painter->resetTransform(); painter->translate( (shapeOffset + distanceTx) * width, (shapeOffset + distanceBottomTY) * height); svg->render(painter); for (int i = 0; i < size; i++) { const uint value = renderBuffer[i] >> 24; data[i] |= value << 8; // Stored in channel G. } } // Render and store the bottom drop shadow. clearRenderBuffer(); painter->resetTransform(); painter->translate(shapeOffset * width, shapeOffset * height); svg->render(painter); for (int i = 0; i < size; i++) { renderBufferNormalized[i] = 1.0 - (static_cast(renderBuffer[i] >> 24) / 255.0); } computegradient(renderBufferNormalized, width, height, gradientX, gradientY); edtaa3(renderBufferNormalized, gradientX, gradientY, width, height, distanceX, distanceY, distanceIn); for (int i = 0; i < size; i++) { double shadow = qBound(0.0, (distanceIn[i] * shadowScale * imageScale) / 255.0, 1.0); shadow = (2.0 * shadow - shadow * shadow) * 255.0; const uint value = qBound(0, qRound(shadow * shadowTranslucency), 255); data[i] |= value << 16; // Stored in channel R (B in shaders). } } static void dumpTexture(QTextStream& cppOut, const uint* data, int size) { cppOut.setIntegerBase(16); cppOut.setFieldWidth(2); cppOut.setPadChar('0'); if (size >= 16) { for (int i = 0; i < size; i += 4) { cppOut << " \"" << "\\x" << (data[i] & 0xff) << "\\x" << ((data[i] >> 8) & 0xff) << "\\x" << ((data[i] >> 16) & 0xff) << "\\x" << ((data[i] >> 24) & 0xff) << "\\x" << (data[i+1] & 0xff) << "\\x" << ((data[i+1] >> 8) & 0xff) << "\\x" << ((data[i+1] >> 16) & 0xff) << "\\x" << ((data[i+1] >> 24) & 0xff) << "\\x" << (data[i+2] & 0xff) << "\\x" << ((data[i+2] >> 8) & 0xff) << "\\x" << ((data[i+2] >> 16) & 0xff) << "\\x" << ((data[i+2] >> 24) & 0xff) << "\\x" << (data[i+3] & 0xff) << "\\x" << ((data[i+3] >> 8) & 0xff) << "\\x" << ((data[i+3] >> 16) & 0xff) << "\\x" << ((data[i+3] >> 24) & 0xff); cppOut.setFieldWidth(0); cppOut << "\"\n"; cppOut.setFieldWidth(2); } cppOut.setIntegerBase(10); cppOut.setFieldWidth(0); cppOut.setPadChar(' '); } else { cppOut << " \""; for (int i = 0; i < size; i++) { cppOut << "\\x" << (data[i] & 0xff) << "\\x" << ((data[i] >> 8) & 0xff) << "\\x" << ((data[i] >> 16) & 0xff) << "\\x" << ((data[i] >> 24) & 0xff); } cppOut.setIntegerBase(10); cppOut.setFieldWidth(0); cppOut.setPadChar(' '); cppOut << "\"\n"; } } int main(int argc, char* argv[]) { if (argc != 3) { qWarning("Usage: createshapetextures input_svg output_cpp"); return 1; } const char* svgFilename = argv[1]; const char* cppFilename = argv[2]; // Open files. QSvgRenderer svg; if (!svg.load(QString(svgFilename))) { qWarning("Can't open input SVG file \'%s\'", svgFilename); return 1; } QFile cppFile(cppFilename); if (!cppFile.open(QIODevice::WriteOnly | QIODevice::Text)) { qWarning("Can't create output C++ file \'%s\'", cppFilename); return 1; } QTextStream cppOut(&cppFile); cppOut << "// Copyright 2015 Canonical Ltd.\n" << "// Automatically generated by the createshapetextures tool.\n\n"; // Create the distance field textures and write them to the C++ file. QImage shape(reinterpret_cast(renderBuffer), width, height, width * 4, QImage::Format_ARGB32_Premultiplied); QPainter painter(&shape); cppOut << "const int shapeTextureCount = " << textureCount << ";\n" << "const int shapeTextureWidth = " << width << ";\n" << "const int shapeTextureHeight = " << height << ";\n" << "const float shapeTextureOffset = " << shapeOffset << ";\n" << "const int shapeTextureDistanceAA = " << distanceScale << ";\n" << "static const unsigned char shapeTextureData[" << textureCount << "][" << width * height * 4 + 1 << "] = {\n"; createTexture1(&svg, &painter, textureData, width, height, true); dumpTexture(cppOut, textureData, width * height); cppOut << " ,\n"; createTexture2(&svg, &painter, textureData, width, height, true); dumpTexture(cppOut, textureData, width * height); cppOut << "};\n\n"; painter.end(); // Create the mipmap textures and write them to the C++ file. cppOut << "const int shapeTextureMipmapWidth = " << widthMipmap << ";\n" << "const int shapeTextureMipmapHeight = " << heightMipmap << ";\n" << "const int shapeTextureMipmapCount = " << mipmapCount << ";\n" << "static const int shapeTextureMipmapOffset[" << mipmapCount << "] = {\n" << " 0"; int size = 0, i = 0; for (int i = 0; i < mipmapCount-1; i++) { size += (widthMipmap >> i) * (heightMipmap >> i) * 4; cppOut << ", " << size; } size += (widthMipmap >> (mipmapCount-1)) * (heightMipmap >> (mipmapCount-1)) * 4; cppOut << "\n};\n"; cppOut << "static const unsigned char shapeTextureMipmapData[" << textureCount << "][" << size + 1 << "] = {\n"; for (int i = 0; i < mipmapCount; i++) { const int width = widthMipmap >> i; const int height = heightMipmap >> i; QImage shapeMipmap(reinterpret_cast(renderBuffer), width, height, width * 4, QImage::Format_ARGB32_Premultiplied); painter.begin(&shapeMipmap); createTexture1(&svg, &painter, textureDataMipmap, width, height, false); cppOut << " // Mipmap level " << i << ".\n"; dumpTexture(cppOut, textureDataMipmap, width * height); painter.end(); } cppOut << " ,\n"; for (int i = 0; i < mipmapCount; i++) { const int width = widthMipmap >> i; const int height = heightMipmap >> i; QImage shapeMipmap(reinterpret_cast(renderBuffer), width, height, width * 4, QImage::Format_ARGB32_Premultiplied); painter.begin(&shapeMipmap); createTexture2(&svg, &painter, textureDataMipmap, width, height, false); cppOut << " // Mipmap level " << i << ".\n"; dumpTexture(cppOut, textureDataMipmap, width * height); painter.end(); } cppOut << "};\n"; return 0; } ./src/Ubuntu/Components/tools/privates/0000755000015600001650000000000012700370701020265 5ustar jenkinsjenkins./src/Ubuntu/Components/tools/privates/privates.pro0000644000015600001650000000023212700370701022641 0ustar jenkinsjenkinsTEMPLATE = app TARGET = createprivateshapetextures QT += gui svg QMAKE_CXXFLAGS += -Werror -Wno-unused-variable SOURCES += createprivateshapetextures.cpp ./src/Ubuntu/Components/tools/privates/createprivateshapetextures.cpp0000644000015600001650000001031412700370701026453 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Loïc Molinari */ // FIXME(loicm) // - Merge that with createshapetextures. // - Generate a class providing access to all the textures per context. #include #include #include #include #include #include const double shapeOffset = 0.0625; const int widthMipmap = 256; const int heightMipmap = 256; const int sizeMipmap = widthMipmap * heightMipmap; const int mipmapCount = 9; // Minimum size is 1. static uint renderBuffer[sizeMipmap]; static uint textureDataMipmap[sizeMipmap]; static void clearRenderBuffer() { memset(renderBuffer, 0, sizeMipmap * sizeof(uint)); } static void createTexture(QSvgRenderer* svg, QPainter* painter, uint* data, int width, int height) { const int size = width * height; clearRenderBuffer(); painter->resetTransform(); painter->translate(shapeOffset * width, shapeOffset * height); svg->render(painter); for (int i = 0; i < size; i++) { data[i] = renderBuffer[i] >> 24; } } static void dump(QTextStream& cppOut, const uint* data, int size) { cppOut.setIntegerBase(16); for (int i = 0; i < size; i++) { cppOut << ((i % 16 != 0) ? "," : ((i != 0) ? ",\n " : " ")) << "0x" << qSetFieldWidth(2) << qSetPadChar('0') << data[i] << qSetFieldWidth(0) << qSetPadChar(' '); } cppOut.setIntegerBase(10); } int main(int argc, char* argv[]) { if (argc != 3) { qWarning("Usage: createshapetextures input_svg output_cpp"); return 1; } const char* svgFilename = argv[1]; const char* cppFilename = argv[2]; // Open files. QSvgRenderer svg; if (!svg.load(QString(svgFilename))) { qWarning("Can't open input SVG file \'%s\'", svgFilename); return 1; } QFile cppFile(cppFilename); if (!cppFile.open(QIODevice::WriteOnly | QIODevice::Text)) { qWarning("Can't create output C++ file \'%s\'", cppFilename); return 1; } QTextStream cppOut(&cppFile); cppOut << "// Copyright 2015 Canonical Ltd.\n" << "// Automatically generated by the createshapetextures tool.\n\n"; // Create the mipmap textures and write them to the C++ file. cppOut << "const float shapeOffset = " << shapeOffset << "f;\n" << "const int shapeMipmapBaseSize = " << widthMipmap << ";\n" << "const int shapeMipmapCount = " << mipmapCount << ";\n" << "static const int shapeMipmapOffsets[" << mipmapCount << "] = {\n" << " 0"; int size = 0, i = 0; for (int i = 0; i < mipmapCount-1; i++) { size += (widthMipmap >> i) * (heightMipmap >> i); cppOut << ", " << size; } size += (widthMipmap >> (mipmapCount-1)) * (heightMipmap >> (mipmapCount-1)); cppOut << "\n};\n"; cppOut << "static const unsigned char shapeMipmapData[" << size << "] = {\n"; QPainter painter; for (int i = 0; i < mipmapCount; i++) { const int width = widthMipmap >> i; const int height = heightMipmap >> i; QImage shapeMipmap(reinterpret_cast(renderBuffer), width, height, width * 4, QImage::Format_ARGB32_Premultiplied); painter.begin(&shapeMipmap); createTexture(&svg, &painter, textureDataMipmap, width, height); if (i) { cppOut << ",\n"; } cppOut << " // Mipmap level " << i << ".\n"; dump(cppOut, textureDataMipmap, width * height); painter.end(); } cppOut << "\n};\n"; return 0; } ./src/Ubuntu/Components/artwork/0000755000015600001650000000000012700370701016761 5ustar jenkinsjenkins./src/Ubuntu/Components/artwork/ListItemDivider6px@8.png0000644000015600001650000000022112700370701023351 0ustar jenkinsjenkinsPNG  IHDR1bKGD pHYs  tIME "6k/IDATc```df```db```@ ? 4fBIENDB`./src/Ubuntu/Components/artwork/delete@8.png0000644000015600001650000000076012700370701021124 0ustar jenkinsjenkinsPNG  IHDR$$hsBITO pHYs B(xtEXtSoftwarewww.inkscape.org<PLTES(#+tRNS !HLQSW[\zHGIDAT8Թ0(ʢ`D#φ2뤰/B UNӋr<]̯j,/{^֞;e76@HtQ&љFDWU=h4I4Nu3+;^%s]`%nD Ӓ7]/&DoO_~x2IENDB`./src/Ubuntu/Components/artwork/chevron@27.png0000644000015600001650000000306012700370701021403 0ustar jenkinsjenkinsPNG  IHDRD}>0tEXtSoftwareAdobe ImageReadyqe<$iTXtXML:com.adobe.xmp ́IDATxKHQǿkWmQ.\hֺa06F^D). aٻ  PEz@4[7z\?f.wKRAw%)$`7y(RXb7 ZJyF)(C|^EJ  JzqAcu8-ԶkVϔvCTgT,Ӂ )!9ѥ3O#.IENDB`./src/Ubuntu/Components/Pickers/0000755000015600001650000000000012700370701016670 5ustar jenkinsjenkins./src/Ubuntu/Components/Pickers/1.3/0000755000015600001650000000000012700370716017177 5ustar jenkinsjenkins./src/Ubuntu/Components/Pickers/1.3/YearModel.qml0000644000015600001650000000364512700370701021575 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 PickerModelBase { // local properties property int from circular: false autoExtend: !maximum.isValid() function reset() { resetting = true; clear(); from = (minimum.getFullYear() <= 0) ? date.getFullYear() : minimum.getFullYear(); var to = (maximum < minimum) ? -1 : maximum.getFullYear(); extend(from, to - from); } function resetLimits(label, margin) { label.text = "9999"; narrowFormatLimit = shortFormatLimit = longFormatLimit = label.paintedWidth + 2 * margin; } function extend(baseYear, items) { if (items === undefined || items < 0) { items = 50; } for (var i = baseYear; i <= baseYear + items; i++) { append({"modelData" : i}); } } function indexOf() { var index = date.getFullYear() - from; if (index >= count) { index = -1; } return index; } function dateFromIndex(index) { if (index < 0 || index >= count) { return date; } var newDate = new Date(date); newDate.setFullYear(index + from); return newDate; } function text(value) { return (value) ? value : ""; } } ./src/Ubuntu/Components/Pickers/1.3/PickerModelBase.qml0000644000015600001650000001052212700370701022675 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /* Base model type for DatePicker */ ListModel { /* Holds the picker instance, the component the model is attached to. Should not be confused with the DatePicker. */ property Item pickerItem /* Property holding the composit picker component. */ property Item mainComponent /* The property holds the width of the picker tumbler to be set. */ property real pickerWidth: 0 /* Specifies whether the model is circular or not. */ property bool circular: false /* The property specifies whenther the Picker should auto-extend the model. Typical for year model. */ property bool autoExtend: false /* Narow, normal and long format limits. */ property real narrowFormatLimit: 0.0 property real shortFormatLimit: 0.0 property real longFormatLimit: 0.0 /* The function resets the model and the attached Picker specified in the item. The Picker must have a resetPicker() function available. */ function reset() {} /* The function completes the reset operation. */ function resetCompleted() { resetting = false; } /* Function called by the Picker to re-calculate values for the limit properties. The locale is retrieved from pickerItem. */ function resetLimits(label, margin) {} /* The function is called by the Picker component when a value gets selected to keep the pickers in sync. */ function syncModels() {} /* The function extends the model starting from a certain \a baseValue. */ function extend(baseValue) {} /* Returns the index of the value from the model. */ function indexOf() { return -1; } /* Returns a Date object from the model's \a index, relative to the given \a date. */ function dateFromIndex(index) { return new Date(); } /* Returns the date string for the value relative to the date, which fits into the given width. Uses the locale from pickerItem to fetch the localized date string. */ function text(value) { return ""; } /* Readonly properties to the composit picker's date properties */ readonly property date date: mainComponent.date readonly property date minimum: mainComponent.minimum readonly property date maximum: mainComponent.maximum property bool pickerCompleted: false /* The property specifies whether there is a reset operation in progress or not. Derivates overwriting reset() function must also set this flag to avoid unwanted date changes that may occur during reset operation due to selectedIndex changes. */ property bool resetting: false /* Call reset() whenever minimum or maximum changes, and update selected index of pickerItem whenever date changes. */ onMinimumChanged: { if (pickerCompleted && pickerItem && !resetting) { pickerItem.resetPicker(); } } onMaximumChanged: { if (pickerCompleted && pickerItem && !resetting) { pickerItem.resetPicker(); } } onDateChanged: { if (!pickerCompleted || !pickerItem || resetting) { return; } // use animated index update only if the change had happened because of the delegate update if (pickerItem.__clickedIndex >= 0) { pickerItem.selectedIndex = indexOf(); } else { // in case the date property was changed due to binding/update, // position tumbler without animating pickerItem.positionViewAtIndex(indexOf()); } } } ./src/Ubuntu/Components/Pickers/1.3/DayModel.qml0000644000015600001650000000542412700370701021407 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 PickerModelBase { circular: true function reset() { resetting = true; clear(); for (var i = 0; i < date.daysInMonth(); i++) { append({"day": i}); } } function resetLimits(label, margin) { label.text = '9999'; narrowFormatLimit = label.paintedWidth + 2 * margin; shortFormatLimit = longFormatLimit = 0.0; for (var day = 1; day <= 7; day++) { label.text = '99 ' + mainComponent.locale.dayName(day, Locale.ShortFormat) shortFormatLimit = Math.max(label.paintedWidth + 2 * margin, shortFormatLimit); label.text = '99 ' + mainComponent.locale.dayName(day, Locale.LongFormat) longFormatLimit = Math.max(label.paintedWidth + 2 * margin, longFormatLimit); } } function syncModels() { var newDaysCount = mainComponent.date.daysInMonth(mainComponent.year, mainComponent.month); var modelCount = count; var daysDiff = newDaysCount - modelCount; if (daysDiff < 0) { remove(modelCount + daysDiff, -daysDiff); } else if (daysDiff > 0) { for (var d = modelCount; d < modelCount + daysDiff; d++) { append({"day": d}); } } } function indexOf() { return date.getDate() - 1; } function dateFromIndex(index) { if (index < 0 || index >= count) { return date; } var newDate = new Date(date); newDate.setDate(index + 1); return newDate; } function text(value) { if (value === undefined) { return ""; } var thisDate = new Date(date); thisDate.setDate(value + 1); if (pickerWidth >= longFormatLimit) { return Qt.formatDate(thisDate, "dd ") + mainComponent.locale.dayName(thisDate.getDay(), Locale.LongFormat); } if (pickerWidth >= shortFormatLimit) { return Qt.formatDate(thisDate, "dd ") + mainComponent.locale.dayName(thisDate.getDay(), Locale.ShortFormat); } return Qt.formatDate(thisDate, "dd"); } } ./src/Ubuntu/Components/Pickers/1.3/DialerHand.qml0000644000015600001650000002005512700370701021701 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype DialerHand \inqmlmodule Ubuntu.Components.Pickers 1.0 \ingroup ubuntu-pickers \brief DialerHand represents a value selector on a Dialer. \deprecated DialerHand components have meaning only if those are placed inside Dialer components. The dialer hand presents a value selection from the given dialer's minimum and maximum values. By default all hands are placed on the dialer's hand space, on the outer dialer disk. By default all hands have teh same size, 0.5GU width and height same as the handSpace specified in \l Dialer, however themes can specify preset values for each hand. Hands can also be placed onto the inner disk by setting \a hand.toCenterItem property to true. \qml Dialer { DialerHand { // this dialer hand will take the space as defined by the theme. } DialerHand { hand.height: units.gu(3) // this hand will have its width as defined by the theme // but height as 3 GU } } \endqml Items declared as children will be placed over the hands. These items will not be rotated togehther with the hand, these will always be shown horizontally. The hand can be hidden by setting false to \a hand.visible property, but that does not hide the overlay content. The following example demonstrates how to create a hidden dialer hand having an overlay component on the hand. \qml Dialer { DialerHand { id: selector hand.visible: false Rectangle { anchors.centerIn: parent width: height height: units.gu(3) radius: width / 2 color: theme.palette.normal.background antialiasing: true Label { text: Math.round(selector.value) anchors.centerIn: parent } } } } \endqml */ StyledItem { id: dialerHand /*! The property holds the selected value the dialer hand points to. */ property real value /*! \qmlproperty real hand.width \qmlproperty real hand.height \qmlproperty bool hand.draggable \qmlproperty bool hand.toCenterItem \qmlproperty bool hand.visible The \b hand.width and \b hand.height properties define the size of the hand. The height of the hand must be in the [0..dialer.handSpace] range in order to have the hand displayed in the hand area, however there is no restriction applied on the size of the dialer hand. If no value is set, the width and height will be defined by the style. \b draggable property specifies whether the hand is draggable or not. When set to not draggable, the hand is used only to indicate the given value. The default value is true. \b toCenterItem property specifies whether the hand should be placed on the hand space (on the outer disk - false) or onto the center disk (inner disk - true). The default value is false, meaning the hand will be placed onto the hand space disk. \b visible property specifies whether to show the hand marker or not. The default value is true. */ property DialerHandGroup hand: DialerHandGroup { width: __styleInstance.handPreset(index, "width") height: __styleInstance.handPreset(index, "height") draggable: __styleInstance.handPreset(index, "draggable") visible: __styleInstance.handPreset(index, "visible") toCenterItem: __styleInstance.handPreset(index, "toCenterItem") } /*! The property holds the dialer instance the hand is assigned to. This is a helper property to enable access to the dialer component hosting the hand. */ readonly property Dialer dialer: parent /*! \qmlproperty list overlay \default The property holds the items that can be added on top of the hand. Note that these items will not be rotated together with the hand pointer and pointer visibility does not affect the overlay items visibility. */ default property alias overlay: contentItem.data /*! \qmlproperty int index \readonly The property holds the index of the hand. Note that this is not the child index of the dialer children, this represents the index of the DialerHand component added to the \l dialer. */ readonly property alias index: grabber.index z: __styleInstance.handPreset(index, "z") anchors.centerIn: parent width: parent.width height: parent.height activeFocusOnPress: true styleName: "DialerHandStyle" /*! \internal */ onParentChanged: { if (dialer && !dialer.hasOwnProperty("handSpace")) { console.log("WARNING: DialerHand can be a child of Dialer only."); } } /*! \internal */ onValueChanged: grabber.updateHand(); /*! \internal */ Component.onCompleted: grabber.updateHand(); /*! \internal */ property alias __grabber: grabber Item { id: grabber property int index: -1 parent: __styleInstance.handPointer width: units.gu(4) height: parent.height anchors { top: parent.top horizontalCenter: parent.horizontalCenter } Item { id: contentItem anchors.fill: parent rotation: 360 - __styleInstance.rotation } function updateHand() { if (!dialer || !__styleInstance) return; __styleInstance.rotation = MathUtils.projectValue(value, dialer.minimumValue, dialer.maximumValue, 0.0, 360.0); dialer.handUpdated(dialerHand); } MouseArea{ anchors.fill: parent; preventStealing: true; enabled: dialerHand.hand.draggable; property real centerX : dialerHand.width / 2 property real centerY : dialerHand.height / 2 property bool internalChange: false onPositionChanged: { if (internalChange) return; internalChange = true; dialerHand.requestFocus(Qt.MouseFocusReason); var point = mapToItem (dialerHand, mouse.x, mouse.y); var diffX = (point.x - centerX); var diffY = -1 * (point.y - centerY); var rad = Math.atan (diffY / diffX); var deg = (rad * 180 / Math.PI); if (diffX > 0 && diffY > 0) { __styleInstance.rotation = 90 - Math.abs (deg); } else if (diffX > 0 && diffY < 0) { __styleInstance.rotation = 90 + Math.abs (deg); } else if (diffX < 0 && diffY > 0) { __styleInstance.rotation = 270 + Math.abs (deg); } else if (diffX < 0 && diffY < 0) { __styleInstance.rotation = 270 - Math.abs (deg); } dialerHand.value = MathUtils.projectValue(__styleInstance.rotation, 0.0, 360.0, dialer.minimumValue, dialer.maximumValue); internalChange = false; } } } } ./src/Ubuntu/Components/Pickers/1.3/DialerHandGroup.qml0000644000015600001650000000173612700370701022723 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \internal Component serving as group property for DialerHhand.hand property. */ QtObject { property real width: units.gu(0.5) property real height: parent.dialer.handSize property bool draggable: true property bool visible: true property bool toCenterItem: false } ./src/Ubuntu/Components/Pickers/1.3/PickerPanel.qml0000644000015600001650000002054212700370701022104 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ pragma Singleton import QtQuick 2.4 import QtQuick.Window 2.0 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 import Ubuntu.Components.Popups 1.3 /*! \qmltype PickerPanel \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu-pickers \brief Provides a panel for opening a DatePicker in place of the input panel or as Popover, depending on the form factor. PickerPanel is a singleton component designed to open a DatePicker in the input panel area or in a Popover, depending on the form factor, following the design guides on date pickers. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainWindow { width: units.gu(40) height: units.gu(71) Page { title: "PickerPanel" Button { id: dateButton property date date: new Date() text: Qt.formatDateTime(date, "yyyy/MMMM") onClicked: PickerPanel.openDatePicker(dateButton, "date", "Years|Months") } } } \endqml The opened panel is closed automatically when the user taps/presses outside of the panel or Popover area. */ Object { /*! The function opens a DatePicker component in the input method area or in a popover, depending on the availability of an input method provider in the system and whether the size of the main screen width/height defines a phone form factor. The picked date will be read from and reported to the \a property of the \a caller as date type. This implies that the caller must have defined the given property of type date. On failure, the function returns null. On success, the returned object has the following properties: \code Object { property DatePicker picker property string pickerMode property date date property Item caller property string callerProperty signal closed() } \endcode \table \header \li Property \li Description \row \li \b picker \li instance of the DatePicker component shown in the panel/popup \row \li \b pickerMode \li represents the \l DatePicker::mode to be used. This is an optional parameter and if not defined, the default mode will be used. \row \li \b date \li represents the date selected \row \li \b caller \li the instance of the component opening the panel \row \li \b callerProperty \li the property of the caller holding the date value which will be updated by the picker. \header \li Signal \li Description \row \li closed() \li the signal is emitted when the panel or popover gets closed. The signal is handy when actions are performed upon panel close. \endtable */ function openDatePicker(caller, property, mode) { if (mode === undefined) { mode = "Years|Months|Days"; } var params = { "date": caller[property], "pickerMode": mode, "callerProperty": property } // hide OSK if eventually open if (Qt.inputMethod.visible) { Qt.inputMethod.hide(); } if (!internal.isPhone) { // we have no input panel defined, or the therefore we show the picker in a Popover return internal.openPopover(caller, params); } // OSK panel return internal.openPanel(caller, params); } QtObject { id: internal objectName: "PickerPanel_Internals" property bool formFactorPhone: Screen.width <= units.gu(40) && Screen.height <= units.gu(71) // present in a property so we can test it in property bool isPhone: false Component.onCompleted: isPhone = formFactorPhone && (QuickUtils.inputMethodProvider !== "") function openPopover(caller, params) { var popover = PopupUtils.open(datePickerPopover, caller, params); popover.parent = QuickUtils.rootItem(null); return popover; } function openPanel(caller, params) { params["caller"] = caller; var panel = datePickerPanel.createObject(QuickUtils.rootItem(null), params); return panel; } } // popover Component { id: datePickerPopover Popover { property alias picker: picker property alias date: picker.date property alias pickerMode: picker.mode property string callerProperty signal closed() contentWidth: frame.width contentHeight: frame.height Item { id: frame width: picker.width + units.gu(4) height: picker.height + units.gu(4) DatePicker { id: picker anchors.centerIn: parent Binding { target: caller property: callerProperty when: callerProperty != undefined value: picker.date } } } Component.onDestruction: closed() } } // OSK panel Component { id: datePickerPanel Rectangle { property alias picker: picker property alias date: picker.date property alias pickerMode: picker.mode property string callerProperty property Item caller signal closed() id: panel // no additional styling is needed color: theme.palette.normal.overlay width: parent.width height: Qt.inputMethod.keyboardRectangle.height > 0 ? Qt.inputMethod.keyboardRectangle.height : units.gu(26) y: parent.height ThinDivider { anchors.bottom: parent.top } DatePicker { id: picker anchors { fill: panel margins: units.gu(2) } Binding { target: caller property: callerProperty when: callerProperty != undefined value: picker.date } } InverseMouseArea { anchors.fill: parent onPressed: panel.state = '' } Component.onCompleted: state = 'opened' states: [ State { name: 'opened' PropertyChanges { target: panel y: parent.height - height } } ] transitions: [ Transition { from: '' to: 'opened' UbuntuNumberAnimation { target: panel property: 'y' } }, Transition { from: 'opened' to: '' SequentialAnimation { UbuntuNumberAnimation { target: panel property: 'y' } ScriptAction { script: { closed(); panel.destroy(); } } } } ] } } } ./src/Ubuntu/Components/Pickers/1.3/MinutesModel.qml0000644000015600001650000000344112700370701022313 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 PickerModelBase { property int from circular: count >= 60 function reset() { resetting = true; clear(); from = minimum.getMinutes(); var distance = (!maximum.isValid() || (minimum.daysTo(maximum) > 1) || (minimum.minutesTo(maximum) >= 60)) ? 60 : minimum.minutesTo(maximum); for (var i = 0; i < distance; i++) { append({"minute": (from + i) % 60}); } resetting = false; } function resetLimits(label, margin) { label.text = "99"; narrowFormatLimit = shortFormatLimit = longFormatLimit = label.paintedWidth + 2 * margin; } function indexOf() { var index = date.getMinutes() - from; if (index >= count) { index = -1; } return index; } function dateFromIndex(index) { if (index < 0 || index >= count) { return date; } var newDate = new Date(date); newDate.setMinutes(index + from); return newDate; } function text(value) { return (value !== undefined) ? ("00" + value).slice(-2) : ""; } } ./src/Ubuntu/Components/Pickers/1.3/Dialer.qml0000644000015600001650000001226012700370701021105 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype Dialer \inqmlmodule Ubuntu.Components.Pickers 1.0 \ingroup ubuntu-pickers \brief Dialer is a phone dialer style picker component. \deprecated The Dialer component is dedicated for value selection where the value is compound of several sections, i.e. hour, minute and second, or integral and decimal values. Each section is defined by a DialerHand, which shares the same range as the dialer is having. Dialer hand visuals are placed on the same dialer disk, however this can be altered by setting different values to DialerHand propertries. The following example shows how to create a dialer component to select a value between 0 and 50. \qml import QtQuick 2.4 import Ubuntu.Components.Pickers 1.0 Dialer { size: units.gu(20) minimumValue: 0 maximumValue: 50 DialerHand { id: mainHand onValueChanged: console.log(value) } } \endqml \sa DialerHand */ StyledItem { /*! \qmlproperty real minimumValue: 0 \qmlproperty real maximumValue: 360 These properties define the value range the dialer hand values can take. The default values are 0 and 360. */ property real minimumValue: 0.0 /*! \internal - documented in previous block*/ property real maximumValue: 360.0 /*! The property holds the size of the dialer. The component should be sized using this property instead of using width and/or height properties. Sizing with this property it is made sure that the component will scale evenly. */ property real size: units.gu(32) /*! The property holds the height reserved for the dialer hands, being the distance between the outer and the inner dialer disks. This value cannot be higher than the half of the dialer \l size. */ property real handSpace: units.gu(6.5) /*! \qmlproperty Item centerItem The property holds the component from the center of the Dialer. Items wanted to be placed into the center of the Dialer must be reparented to this component, or listed in the \l centerContent property. Beside that, the property helps anchoring the center disk content to the item. \qml Dialer { DialerHand { id: hand Label { parent: hand.centerItem // [...] } } // [...] } \endqml */ readonly property alias centerItem: centerHolder /*! \qmlproperty list centerContent The property holds the list of items to be placed inside of the center disk. Items placed inside the center disk can either be listed in this property or reparented to \l centerItem property. \qml Dialer { DialerHand { id: hand centerContent: [ Label { // [...] } // [...] ] } // [...] } \endqml */ property alias centerContent: centerHolder.data /*! \qmlproperty list hands \readonly The property holds the list of DialerHands added to Dialer. This may be the same as the children, however will contain only DialerHand objects. */ readonly property alias hands: internal.hands /*! \qmlmethod void handUpdated(DialerHand hand) The signal is emited when the hand value is updated. */ signal handUpdated(var hand) id: dialer implicitWidth: size implicitHeight: size activeFocusOnPress: true styleName: "DialerStyle" Item { id: internal // internal property holding only the list of DialerHand components // workaround for readonly public property property var hands: [] height: size - handSpace * 2 width: size - handSpace * 2 anchors.centerIn: parent Item { id: centerHolder anchors.fill: parent z: 1 } } /*! \internal */ onChildrenChanged: { // apply dialer presets if the hand sizes were not set // check dialers only var idx = 0; var stack = []; for (var i in children) { if (children[i].hasOwnProperty("hand")) { children[i].__grabber.index = idx++; stack.push(children[i]); } internal.hands = stack; } } } ./src/Ubuntu/Components/Pickers/1.3/HoursModel.qml0000644000015600001650000000340412700370701021766 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 PickerModelBase { property int from circular: count >= 24 function reset() { resetting = true; clear(); from = minimum.getHours(); var distance = (!Date.prototype.isValid.call(maximum) || (minimum.daysTo(maximum) > 1)) ? 24 : minimum.hoursTo(maximum); for (var i = 0; i < distance; i++) { append({"hour": (from + i) % 24}); } resetting = false; } function resetLimits(label, margin) { label.text = "99"; narrowFormatLimit = shortFormatLimit = longFormatLimit = label.paintedWidth + 2 * margin; } function indexOf() { var index = date.getHours() - from; if (index >= count) { index = -1; } return index; } function dateFromIndex(index) { if (index < 0 || index >= count) { return date; } var newDate = new Date(date); newDate.setHours(index + from); return newDate; } function text(value) { return (value !== undefined) ? ("00" + value).slice(-2) : ""; } } ./src/Ubuntu/Components/Pickers/1.3/PickerRow.qml0000644000015600001650000001035612700370701021616 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Row { id: row /* Reference to the main composit component holding this row. */ property Item mainComponent /* The model populating the row. */ property alias model: rowRepeater.model /* Picker label margins */ property real margins: units.gu(1.5) /* Reports whether either of the pickers is moving */ property bool moving // the following functions/properties should be kept private in case the // component is ever decided to be published function pickerMoving(isMoving) { if (isMoving === undefined) { isMoving = this.moving; } if (isMoving) { row.moving = true; } else { for (var i = 0; i < row.model.count; i++) { var pickerItem = model.get(i).pickerModel.pickerItem; if (!pickerItem) return; if (pickerItem.moving) { row.moving = true; return; } } row.moving = false; } } function disconnectPicker(index) { var pickerItem = model.get(index).pickerModel.pickerItem; if (pickerItem) { pickerItem.onMovingChanged.disconnect(pickerMoving); } } Connections { target: row.model onPickerRemoved: disconnectPicker(index) } objectName: "PickerRow_Positioner"; Repeater { id: rowRepeater onModelChanged: row.pickerMoving(true) Picker { id: unitPicker objectName: "PickerRow_" + pickerName model: pickerModel enabled: pickerModel.count > 1 circular: pickerModel.circular live: false width: pickerModel.pickerWidth height: parent ? parent.height : 0 style: Rectangle { anchors.fill: parent color: (unitPicker.Positioner.index % 2) ? Qt.rgba(0, 0, 0, 0.03) : Qt.rgba(0, 0, 0, 0.07) } delegate: PickerDelegate { Label { objectName: "PickerRow_PickerLabel" + (pickerModel ? modelData : "") text: pickerModel ? pickerModel.text(modelData) : "" anchors.fill: parent verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter } Component.onCompleted: { if (pickerModel && pickerModel.autoExtend && (index === (pickerModel.count - 1))) { pickerModel.extend(modelData + 1); } } } onSelectedIndexChanged: { if (pickerModel && !pickerModel.resetting) { mainComponent.date = pickerModel.dateFromIndex(selectedIndex); pickerModel.syncModels(); } } /* Resets the Picker model and updates the new format limits. */ function resetPicker() { pickerModel.reset(); pickerModel.resetLimits(textSizer, margins); pickerModel.resetCompleted(); positionViewAtIndex(pickerModel.indexOf()); } Component.onCompleted: { // update model with the item instance pickerModel.pickerItem = unitPicker; unitPicker.onMovingChanged.connect(pickerMoving.bind(unitPicker)); row.pickerMoving(unitPicker.moving); } } } } ./src/Ubuntu/Components/Pickers/1.3/DatePicker.qml0000644000015600001650000005747312700370714021743 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype DatePicker \inqmlmodule Ubuntu.Components.Pickers 1.0 \ingroup ubuntu-pickers \brief DatePicker component provides date and time value picking functionality. DatePicker combines up to three Picker elements providing different date or time value selection possibilities. It can be used to select full date (year, month, day), full time (hours, minutes, seconds) as well as to select a combination of year and month, month and day, hours and minutes, minutes and seconds or individual time units (i.e. year, month or day as well as hours, minutes or seconds). The selected date as well as the initial one is provided by the \l date property. For convenience the component provides also the \a year, \a month, \a day, \a week, \a hours, \a minutes and \a seconds values as separate properties, however these properties are not writable, and their initialization can happen only through the \l date property. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Pickers 1.0 Column { Label { text: "Selected date: W" + datePicker.week + " - " + Qt.formatDate(datePicker.date, "dddd, dd-MMMM-yyyy") } DatePicker { id: datePicker } } \endqml The \l mode property specifies what time units should be shown by the picker. The property holds a string, combining \b Years, \b Months, \b Days, \b Hours, \b Minutes and \b Seconds strings sepatared with '|' character. A DatePicker which shows only year and month date units would look as follows: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Pickers 1.0 Column { Label { text: "Selected month: " + Qt.formatDate(datePicker.date, "MMMM-yyyy") } DatePicker { id: datePicker mode: "Years|Months" } } \endqml The \b mode of the DatePicker is set to date picking. In case time picking is needed, the model should be set to contain the time specific mode flags. The following example demonstrates how to use DatePicker for time picking. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Pickers 1.0 Column { Label { text: "Selected time: " + Qt.formatTime(datePicker.date, "hh:mm:ss") } DatePicker { id: datePicker mode: "Hours|Minutes|Seconds" } } \endqml Note that the order in which the mode flags are specified does not influence the order the pickers are arranged. That is driven by the date format of the \l locale used in the picker. Also not all combinations of mode flags are supported. See \l mode for the supported combinations. The default interval the date values are chosen is a window starting at the current date ending 50 years later. This window is defined by the \a minimum and \a maximum properties. The interval can be altered considering the following rules: \list \li \a minimum must be less or equal than the \l date; if the \a date value is less than the given \a minimum, the date will be set to the minimum's value \li \a maximum value must be greater than the \a minimum, or invalid. When the maximum is smaller than the \l date, the \l date property will be updated to get the maximum value. When set to invalid date (see Date.getInvalidDate()), the upper limit of the date interval becomes infinite, meaning the year picker will extend infinitely. This leads to increased memory use and should be avoided if possible. Invalid date will make hours picker presenting 24 hours. \endlist \qml import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Pickers 1.0 Column { Label { text: "Selected date: " + Qt.formatDate(datePicker.date, "dddd, dd-MMMM-yyyy") } DatePicker { id: datePicker minimum: { var d = new Date(); d.setFullYear(d.getFullYear() - 1); return d; } maximum: Date.prototype.getInvalidDate.call() } } \endqml \b Note: do not use the \l date property when initializing minimum and maximum as it will cause binding loops. \section2 Layout As mentioned earlier, DatePicker combines up to three Picker tumblers depending on the mode requested. These tumblers are laid out in a row in the order the default date format of the \l locale is. \section3 Date picker layout rules The date picker consist of three pickers: year, month, and date. The exact contents of the month and date pickers depends on the available width: \list \li full name for month, number and full day for date (“August” “28 Wednesday”) \li otherwise full name for month, number and abbreviated day for date (“August” “28 Wed”); \li otherwise full name for month, number for date (“August” “28”); \li otherwise abbreviated name for month, number for date (“Aug” “28”). \li otherwise number for month, number for date (“08” “28”). \endlist \a{If the currently selected date becomes impossible due to year change (from a leap to a non-leap year when the date is set to February 29) or month change (e.g. from a month that has 31 days to one that has fewer when the date is set to 31), the date reduces automatically to the last day of the month (i.e February 28 or 30th day of the month).} \section3 Time picker layout rules Time units are shown in fixed width picker tumblers, numbers padded with leading zeroes. There is no other special rule on the formatting of the time unit numbers. \section3 How minimum/maximum affects the tumblers If minimum and maximum are within the same year, the year picker will be insensitive. If minimum and maximum are within the same month, the month picker will also be insensitive. */ StyledItem { id: datePicker /*! Specifies what kind of date value selectors should be shown by the picker. This is a string of 'flags' separated by '|' separator, where flags are: \table \header \li {2, 1} Date picker modes \header \li Value \li Description \row \li Years \li Specifies to show the year picker \row \li Months \li Specifies to show the month picker \row \li Days \li Specifies to show the day picker \header \li {2, 1} Time picker modes \header \li Value \li Description \row \li Hours \li Specifies to show the hours picker \row \li Minutes \li Specifies to show the minutes picker \row \li Seconds \li Specifies to show the seconds picker \endtable With some exceptions, any combination of these flags is allowed within the same group. Date and time picker modes cannot be combined. The supported combinations are: \a{Years|Months|Days}, \a{Years|Months}, \a{Months|Days}, \a{Hours|Minutes|Seconds}, \a{Hours|Minutes} and \a{Minutes|Seconds}, as well as each mode flag individually. The default value is "\a{Years|Months|Days}". */ property string mode: "Years|Months|Days" /*! The date chosen by the DatePicker. The default value is the date at the component creation time. The property automatically updates year, month and day properties. */ property date date: Date.prototype.midnight.call(new Date()) /*! \qmlproperty int minimum The minimum date (inclusive) to be shown in the picker. Both year and month values will be considered from the properties. The year and month picker values are filled based on these values. The year picker will be infinite (extending infinitely) if the maximum is an invalid date. If the distance between maximum and minimum is less than a year, the year picker will be shown disabled. The month picker will be circular if the distance between maximum and minimum is at least one year, or if the maximum date is invalid. The default values are the current date for the minimum, and 50 year distance value for maximum. */ property date minimum: Date.prototype.midnight.call(new Date()) /*! \qmlproperty int maximum The maximum date (inclusive) to be shown in the picker. Both year and month values will be considered from the properties. See \l minimum for more details. */ property date maximum: { var d = Date.prototype.midnight.call(new Date()); d.setFullYear(d.getFullYear() + 50); return d; } /*! For convenience, the \b year value of the \l date property. */ readonly property int year: datePicker.date.getFullYear() /*! For convenience, the \b month value of the \l date property. */ readonly property int month: datePicker.date.getMonth() /*! For convenience, the \b day value of the \l date property. */ readonly property int day: datePicker.date.getDate() /*! For convenience, the \b week value of the \l date property. */ readonly property int week: datePicker.date.getWeek() /*! For convenience, the \b hours value of the \l date property. */ readonly property int hours: datePicker.date.getHours() /*! For convenience, the \b minutes value of the \l date property. */ readonly property int minutes: datePicker.date.getMinutes() /*! For convenience, the \b seconds value of the \l date property. */ readonly property int seconds: datePicker.date.getSeconds() /*! The property defines the locale used in the picker. The default value is the system locale. \qml DatePicker { locale: Qt.locale("hu_HU") } \endqml */ property var locale: Qt.locale() /*! \qmlproperty bool moving \readonly The property holds whether the component's pickers are moving. \sa Picker::moving */ readonly property alias moving: positioner.moving implicitWidth: units.gu(36) implicitHeight: units.gu(20) activeFocusOnPress: true /*! \internal */ onMinimumChanged: { if (internals.completed && !minimum.isValid()) { // set the minimum to the date minimum = date; } // adjust date if (date !== undefined && Date.prototype.isValid.call(minimum) && date < minimum && internals.completed) { date = minimum; } } /*! \internal */ onMaximumChanged: { // adjust date if (date !== undefined && Date.prototype.isValid.call(maximum) && date > maximum && maximum > minimum && internals.completed) { date = maximum; } } /*! \internal */ onWidthChanged: { // use dayPicker narrowFormatLimit even if the dayPicker is hidden // and clamp the width so it cannot have less width that the sum of // the three tumblers' narrowFormatLimit var minWidth = 0.0; for (var i = 0; i < tumblerModel.count; i++) { minWidth += tumblerModel.get(i).pickerModel.narrowFormatLimit; } width = Math.max(width, minWidth); } /*! \internal */ onModeChanged: internals.updatePickers() /*! \internal */ onLocaleChanged: internals.updatePickers() Component.onCompleted: { if (minimum === undefined) { minimum = date; } internals.completed = true; internals.updatePickers(); } // models YearModel { id: yearModel mainComponent: datePicker pickerCompleted: internals.completed && internals.showYearPicker pickerWidth: (!pickerItem) ? 0 : narrowFormatLimit function syncModels() { dayModel.syncModels(); } } MonthModel { id: monthModel mainComponent: datePicker pickerCompleted: internals.completed && internals.showMonthPicker pickerWidth: { if (!pickerItem) { return 0; } return MathUtils.clamp(datePicker.width - yearModel.pickerWidth - dayModel.pickerWidth, narrowFormatLimit, longFormatLimit); } function syncModels() { dayModel.syncModels(); } } DayModel { id: dayModel mainComponent: datePicker pickerCompleted: internals.completed && internals.showDayPicker pickerWidth: { if (!pickerItem) { return 0; } var w = Math.max(datePicker.width * internals.dayPickerRatio, narrowFormatLimit); if (w < longFormatLimit && w >= shortFormatLimit) { return shortFormatLimit; } return w; } } HoursModel { id: hoursModel mainComponent: datePicker pickerCompleted: internals.completed && internals.showHoursPicker pickerWidth: { if (!pickerItem) { return 0; } return narrowFormatLimit; } } MinutesModel { id: minutesModel mainComponent: datePicker pickerCompleted: internals.completed && internals.showMinutesPicker pickerWidth: { if (!pickerItem) { return 0; } return narrowFormatLimit; } } SecondsModel { id: secondsModel mainComponent: datePicker pickerCompleted: internals.completed && internals.showSecondsPicker pickerWidth: { if (!pickerItem) { return 0; } return narrowFormatLimit; } } styleName: "DatePickerStyle" Binding { target: __styleInstance property: "view" value: positioner } Binding { target: __styleInstance property: "pickerModels" value: tumblerModel } Binding { target: __styleInstance property: "unitSeparator" value: (internals.showHoursPicker || internals.showMinutesPicker || internals.showSecondsPicker) ? ":" : "" } // tumbler positioner PickerRow { id: positioner parent: (datePicker.__styleInstance && datePicker.__styleInstance.hasOwnProperty("tumblerHolder")) ? datePicker.__styleInstance.tumblerHolder : datePicker mainComponent: datePicker model: tumblerModel margins: internals.margin anchors { top: parent.top bottom: parent.bottom horizontalCenter: parent.horizontalCenter } } // tumbler model ListModel { /* Model to hold tumbler order for repeaters. Roles: - pickerModel - pickerName */ id: tumblerModel /* Signal triggered when the model is about to remove a picker. We cannot rely on rowAboutToBeRemoved, as by the time the signal is called the list element is already removed from the model. */ signal pickerRemoved(int index) // the function checks whether a pickerModel was added or not // returns the index of the model object the pickerModel was found // or -1 on error. function pickerModelIndex(name) { for (var i = 0; i < count; i++) { if (get(i).pickerName === name) { return i; } } return -1; } // the function checks whether a pickerModel is present in the list; // moves the existing one to the given index or inserts it if not present function setPickerModel(model, name, index) { var idx = pickerModelIndex(name); if (idx >= 0) { move(idx, index, 1); } else { append({"pickerModel": model, "pickerName": name}); } } // removes the given picker function removePicker(name) { var idx = pickerModelIndex(name); if (idx >= 0) { pickerRemoved(idx); remove(idx); } } } // component to calculate text fitting Label { id: textSizer; visible: false } QtObject { id: internals property bool completed: false property real margin: units.gu(1.5) property real dayPickerRatio: 0.1 property bool showYearPicker: true property bool showMonthPicker: true property bool showDayPicker: true property bool showHoursPicker: false property bool showMinutesPicker: false property bool showSecondsPicker: false /* Update pickers. */ function updatePickers() { if (completed) { // check mode flags first // FIXME: The js split(/\W/g) terminates the process on armhf with Qt 5.3 (v4 js) (https://bugreports.qt-project.org/browse/QTBUG-39255) var modes = datePicker.mode.match(/\w+/g); showYearPicker = showMonthPicker = showDayPicker = showHoursPicker = showMinutesPicker = showSecondsPicker = false; while (modes.length > 0) { var modeFlag = modes.pop(); switch (modeFlag) { case "Years": showYearPicker = true; break; case "Months": showMonthPicker = true; break; case "Days": showDayPicker = true; break; case "Hours": showHoursPicker = true; break; case "Minutes": showMinutesPicker = true; break; case "Seconds": showSecondsPicker = true; break; default: console.warn("Unhandled mode flag: " + modeFlag + ". Mode will not be set!"); return; } } // filter unaccepted date picking mode if (!showMonthPicker && showYearPicker && showDayPicker) { console.warn("Invalid DatePicker mode: " + datePicker.mode); return; } // filter unaccepted time picking mode if (showHoursPicker && showSecondsPicker && !showMinutesPicker) { console.warn("Invalid DatePicker mode: " + datePicker.mode); return; } // date and time picking not allowed at the same time if ((showYearPicker || showMonthPicker || showDayPicker) && (showHoursPicker || showMinutesPicker || showSecondsPicker)) { console.warn("Date and Time picking not allowed at the same time."); return; } arrangeTumblers(); resetPickers(); } } /* Resets the pickers. Pickers will update their models with the given date, minimum and maximum values. */ function resetPickers() { if (!completed) return; for (var i = 0; i < tumblerModel.count; i++) { var pickerItem = tumblerModel.get(i).pickerModel.pickerItem; pickerItem.resetPicker(); } // calculate the ratio for the dayPicker var maxWidth = 0.0; maxWidth += showYearPicker ? yearModel.longFormatLimit : 0.0; maxWidth += showMonthPicker ? monthModel.longFormatLimit : 0.0; maxWidth += showDayPicker ? dayModel.longFormatLimit : 0.0; if (showDayPicker && maxWidth > 0.0) { dayPickerRatio = (dayModel.longFormatLimit / maxWidth).toPrecision(3); } } /* Detects the tumbler order from the date format of the locale */ function arrangeTumblers() { // disable completion so avoid accidental date changes completed = false; // use short format to exclude any extra characters // FIXME: The js split(/\W/g) terminates the process on armhf with Qt 5.3 (v4 js) (https://bugreports.qt-project.org/browse/QTBUG-39255) var format = datePicker.locale.dateFormat(Locale.ShortFormat).match(/\w+/g); // loop through the format to decide the position of the tumbler var formatIndex = 0; for (var i in format) { if (!format[i].length) continue; // check the first two characters switch (format[i].substr(0, 1).toLowerCase()) { case 'y': if (showYearPicker) { tumblerModel.setPickerModel(yearModel, "YearPicker", formatIndex); formatIndex++; } else { tumblerModel.removePicker("YearPicker"); } break; case 'm': if (showMonthPicker) { tumblerModel.setPickerModel(monthModel, "MonthPicker", formatIndex); formatIndex++; } else { tumblerModel.removePicker("MonthPicker"); } break; case 'd': if (showDayPicker) { tumblerModel.setPickerModel(dayModel, "DayPicker", formatIndex); formatIndex++; } else { tumblerModel.removePicker("DayPicker"); } break; } } // check hms if (showHoursPicker) { tumblerModel.setPickerModel(hoursModel, "HoursPicker", formatIndex); formatIndex++; } else { tumblerModel.removePicker("HoursPicker"); } if (showMinutesPicker) { tumblerModel.setPickerModel(minutesModel, "MinutesPicker", formatIndex); formatIndex++; } else { tumblerModel.removePicker("MinutesPicker"); } if (showSecondsPicker) { tumblerModel.setPickerModel(secondsModel, "SecondsPicker", formatIndex); formatIndex++; } else { tumblerModel.removePicker("SecondsPicker"); } // re-enable completion completed = true; } } } ./src/Ubuntu/Components/Pickers/1.3/SecondsModel.qml0000644000015600001650000000344312700370701022267 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 PickerModelBase { property int from circular: count >= 60 function reset() { resetting = true; clear(); from = minimum.getSeconds(); var distance = (!maximum.isValid() || (minimum.daysTo(maximum) > 1) || (minimum.secondsTo(maximum) >= 60)) ? 59 : minimum.secondsTo(maximum); for (var i = 0; i <= distance; i++) { append({"seconds": (from + i) % 60}); } resetting = false; } function resetLimits(label, margin) { label.text = "99"; narrowFormatLimit = shortFormatLimit = longFormatLimit = label.paintedWidth + 2 * margin; } function indexOf() { var index = date.getSeconds() - from; if (index >= count) { index = -1; } return index; } function dateFromIndex(index) { if (index < 0 || index >= count) { return date; } var newDate = new Date(date); newDate.setSeconds(index + from); return newDate; } function text(value) { return (value !== undefined) ? ("00" + value).slice(-2) : ""; } } ./src/Ubuntu/Components/Pickers/1.3/MonthModel.qml0000644000015600001650000000640612700370701021760 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 PickerModelBase { circular: (count >= 11) // local properties property int from function reset() { resetting = true; clear(); var modelDate = new Date(date); modelDate.setDate(1); // if maximum is invalid, we have full model (12 months to show) var distance, to; distance = to = maximum.isValid() ? minimum.monthsTo(maximum) : 11; if (to < 0 || to > 11) to = 11; from = (to < 11) ? minimum.getMonth() : 0; // fill the model for (var i = from; i <= from + to; i++) { modelDate.setMonth(i); append({"month": modelDate.getMonth()}); } } function resetLimits(label, margin) { label.text = '9999'; narrowFormatLimit = label.paintedWidth + 2 * margin; shortFormatLimit = longFormatLimit = 0.0; for (var month = 0; month < 12; month++) { label.text = mainComponent.locale.monthName(month, Locale.LongFormat); shortFormatLimit = Math.max(label.paintedWidth + 2 * margin, shortFormatLimit); label.text = mainComponent.locale.monthName(month, Locale.LongFormat); longFormatLimit = Math.max(label.paintedWidth + 2 * margin, longFormatLimit); } } function indexOf() { var index = date.getMonth() - from; if (index >= count) { index = -1; } return index; } function dateFromIndex(index) { if (index < 0 || index >= count) { return date; } var newDate = new Date(date); // check if the days are in the diff zone (29-31) var fromDay = newDate.getDate(); // move the day to the 1st of the month so we don't overflow when setting the month newDate.setDate(1); newDate.setMonth(get(index).month); var maxDays = newDate.daysInMonth(); // check whether the original day would overflow // and trim to the mont's maximum date newDate.setDate((fromDay > maxDays) ? maxDays : fromDay); return newDate; } function text(value) { if (!mainComponent || value === undefined) { return ""; } if (pickerWidth >= longFormatLimit) { return mainComponent.locale.monthName(value, Locale.LongFormat); } if (pickerWidth >= shortFormatLimit) { return mainComponent.locale.monthName(value, Locale.ShortFormat); } var thisDate = new Date(date); thisDate.setDate(1); thisDate.setMonth(value); return Qt.formatDate(thisDate, "MM"); } } ./src/Ubuntu/Components/Pickers/1.3/Picker.qml0000644000015600001650000004022012700370701021117 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype Picker \inqmlmodule Ubuntu.Components.Pickers 1.0 \ingroup ubuntu-pickers \inherits StyledItem \brief Picker is a slot-machine style value selection component. The Picker lists the elements specified by the \l model using the \l delegate vertically using a slot-machine tumbler-like list. The selected item is always the one in the center of the component, and it is represented by the \l selectedIndex property. The elements can be either in a circular list or in a normal list. Delegates must be composed using PickerDelegate. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Pickers 1.0 Picker { model: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"] delegate: PickerDelegate { Label { text: modelData } } selectedIndex: 5 onSelectedIndexChanged: { print("selected month: " + selectedIndex); } } \endqml \b Note: the \l selectedIndex must be set explicitly to the desired index if the model is set, filled or changed after the component is complete. In the following example the selected item must be set after the model is set. \qml Picker { selectedIndex: 5 // this will be set to 0 at the model completion delegate: PickerDelegate { Label { text: modelData } } Component.onCompleted: { var stack = []; for (var i = 0; i < 10; i++) { stack.push("Line " + i); } model = stack; // selectedIndex must be set explicitly selectedIndex = 3; } } \endqml \section3 Known issues \list \li [1] Circular picker does not react on touch generated flicks (on touch enabled devices) when nested into a Flickable - \l {https://bugreports.qt-project.org/browse/QTBUG-30840} \li [2] Circular picker sets \l selectedIndex to 0 when the model is cleared, contrary to linear one, which sets it to -1 - \l {https://bugreports.qt-project.org/browse/QTBUG-35400} \endlist */ StyledItem { id: picker /*! Property specifying whether the tumbler list is wrap-around (\a true), or normal (\a false). Default value is true. */ property bool circular: true /*! Specifies the model listing the content of the picker. */ property var model /*! The delegate visualizing the model elements. Any kind of component can be used as delegate, however it is recommended to use \l PickerDelegate, which integrates selection functionality into the Picker. */ property Component delegate /*! The property holds the index of the selected item */ property int selectedIndex /*! Defines whether the \l selectedIndex should be updated while the tumbler changes the selected item during draggingm or only when the tumbler's motion ends. The default behavior is non-live update. */ property bool live: false /*! The property holds whether the picker's view is moving due to the user interaction either by dragging, flicking or due to the manual change of the selectedIndex property. */ readonly property bool moving: (loader.item ? loader.item.moving : false) || movingPoll.indexChanging /*! \since Ubuntu.Components.Pickers 1.3 The property specifies the defautl height of the PickerDelegates. It is recommended to change the delegate height through this property rather than changing it from the delegate itself. */ property real itemHeight: units.gu(4) /*! The function positions the picker's view to the given index without animating the view. The component must be ready when calling the function, e.g. to make sure the Picker shows up at the given index, do the following: \qml Picker { model: 120 delegate: PickerDelegate { Label { anchors.fill: parent verticalCenter: Text.AlignVCenter text: modelData } } Component.onCompleted: positionViewAtIndex(10) } \endqml */ function positionViewAtIndex(index) { if (!loader.item || !internals.completed) { return; } loader.item.positionViewAtIndex(index, loader.isListView ? ListView.SnapPosition : PathView.SnapPosition); // update selectedIndex selectedIndex = loader.item.currentIndex; } activeFocusOnPress: true styleName: "PickerStyle" /*! \internal */ property int __clickedIndex: -1 // bind style instance's view property to the Loader's item Binding { target: __styleInstance property: "view" value: loader.item when: __styleInstance.hasOwnProperty("view") && loader.item } /* ListView/PathView do not change moding property when the current index is changed manually. Therefore we use an idle timer to poll the contentY to detect whether the views are still moving. PathView's currentIndex changes while the component is moving, however this is not true for ListView. */ Timer { id: movingPoll interval: 50 running: false property bool indexChanging: false property real prevContentY onTriggered: { if (prevContentY === loader.item.contentY) { indexChanging = false; } else { kick(); } } function kick() { if (!loader.item) return; indexChanging = true; prevContentY = loader.item.contentY; running = true; } } // tumbler Loader { id: loader objectName: "Picker_ViewLoader" asynchronous: false parent: __styleInstance.hasOwnProperty("tumblerHolder") ? __styleInstance.tumblerHolder : picker anchors.fill: parent sourceComponent: circular ? wrapAround : linear // property for loading completion property bool completed: item && (status === Loader.Ready) && item.viewCompleted // do we have a ListView or PathView? property bool isListView: (item && QuickUtils.className(item) === "QQuickListView") // update curentItem automatically when selectedIndex changes Binding { target: loader.item property: "currentIndex" value: picker.selectedIndex when: loader.completed && (picker.selectedIndex > 0) } // selectedIndex updater, live or non-live ones Connections { target: loader.item ignoreUnknownSignals: true onMovementEnded: { if (!loader.completed || !model) return; if (!picker.live) { picker.selectedIndex = loader.item.currentIndex; } } onCurrentIndexChanged: { movingPoll.kick(); if (!loader.completed) return; if (picker.live || (modelWatcher.modelSize() <= 0) || (picker.__clickedIndex >= 0 && (picker.__clickedIndex === loader.item.currentIndex)) || modelWatcher.cropping) { picker.selectedIndex = loader.item.currentIndex; modelWatcher.cropping = false; picker.__clickedIndex = -1; } } onModelChanged: { modelWatcher.connectModel(picker.model); if (!loader.completed) return; loader.moveToIndex((loader.completed) ? 0 : picker.selectedIndex); if (loader.completed && !picker.live) { picker.selectedIndex = 0; } } // focus handling onMoveStarted: picker.requestFocus(Qt.MouseFocusReason) onFlickStarted: picker.requestFocus(Qt.MouseFocusReason) } function moveToIndex(toIndex) { var count = (loader.item && loader.item.model) ? modelWatcher.modelSize() : -1; if (completed && count > 0) { if (loader.isListView) { loader.item.currentIndex = toIndex; return; } else { loader.item.positionViewAtIndex(count - 1, PathView.Center); loader.item.positionViewAtIndex(toIndex, PathView.Center); } } } Component.onCompleted: modelWatcher.connectModel(picker.model); Component.onDestruction: modelWatcher.disconnectModel() } // circular list Component { id: wrapAround PathView { id: pView objectName: "Picker_WrapAround" // property declared for PickerDelegate to be able to access the main component property Item pickerItem: picker // property holding view completion property bool viewCompleted: false // declared to ease moving detection property real contentY: offset anchors { top: parent ? parent.top : undefined bottom: parent ? parent.bottom : undefined horizontalCenter: parent ? parent.horizontalCenter : undefined } width: parent ? parent.width : 0 clip: true focus: true model: picker.model delegate: picker.delegate currentIndex: picker.selectedIndex // put the currentItem to the center of the view preferredHighlightBegin: 0.5 preferredHighlightEnd: 0.5 pathItemCount: pView.height / picker.itemHeight snapMode: PathView.SnapToItem flickDeceleration: 100 property int contentHeight: pathItemCount * picker.itemHeight path: Path { startX: pView.width / 2 startY: -(pView.contentHeight - pView.height) / 2 PathLine { x: pView.width / 2 y: pView.height + (pView.contentHeight - pView.height) / 2 } } Component.onCompleted: { var complete = true if (modelWatcher.isObjectModel()) { complete = (model.count > 0); if (model.count >= 2) { positionViewAtIndex(1, PathView.SnapPosition); positionViewAtIndex(0, PathView.SnapPosition); } } else if (Object.prototype.toString.call(model) === "[object Number]") { if (model >= 2) { positionViewAtIndex(1, PathView.SnapPosition); positionViewAtIndex(0, PathView.SnapPosition); } } viewCompleted = complete; } } } // linear list Component { id: linear ListView { id: lView objectName: "Picker_Linear" // property declared for PickerDelegate to be able to access the main component property Item pickerItem: picker // property holding view completion property bool viewCompleted: false anchors { top: parent ? parent.top : undefined bottom: parent ? parent.bottom : undefined horizontalCenter: parent ? parent.horizontalCenter : undefined } width: parent ? parent.width : 0 clip: true focus: true Mouse.onClicked: picker.requestFocus(Qt.MouseFocusReason) model: picker.model delegate: picker.delegate currentIndex: picker.selectedIndex preferredHighlightBegin: (height - (currentItem ? currentItem.height : 0)) / 2 preferredHighlightEnd: preferredHighlightBegin + (currentItem ? currentItem.height : 0) highlightRangeMode: ListView.StrictlyEnforceRange highlightMoveDuration: 300 flickDeceleration: 100 Component.onCompleted: viewCompleted = true } } /* Watch Picker's model to catch when elements are removed ro model is cleared. We need this to detect currentIndex changes in List/PathViews when non-live update mode is chosen, to know when do we need to update selectedIndex. */ QtObject { id: modelWatcher property var prevModel property bool cropping: false function isObjectModel() { return (prevModel && Object.prototype.toString.call(prevModel) === "[object Object]"); } function modelSize() { if (prevModel) { if (Object.prototype.toString.call(model) === "[object Object]") { return prevModel.count; } else if (Object.prototype.toString.call(model) === "[object Array]") { return prevModel.length; } else if (Object.prototype.toString.call(model) === "[object Number]") { return prevModel; } } return -1; } function connectModel(model) { disconnectModel(); prevModel = model; // check if the model is derived from QAbstractListModel if (model && Object.prototype.toString.call(model) === "[object Object]") { model.rowsAboutToBeRemoved.connect(itemsAboutToRemove); model.rowsInserted.connect(updateView); } } function disconnectModel() { if (isObjectModel()) { prevModel.rowsAboutToBeRemoved.disconnect(itemsAboutToRemove); prevModel.rowsInserted.disconnect(updateView); } } function updateView() { if (!loader.isListView && loader.item.count === 2) { // currentItem gets set upon first flick or move when the model is empty // at the time the component gets completed. Disable viewCompleted till // we move the view so selectedIndex doesn't get altered loader.item.viewCompleted = false; loader.item.positionViewAtIndex(1, PathView.SnapPosition); loader.item.positionViewAtIndex(0, PathView.SnapPosition); loader.item.viewCompleted = true; } } function itemsAboutToRemove(parent, start, end) { if ((end - start + 1) === loader.item.count) { cropping = true; } else if (selectedIndex >= start) { // Notify views that the model got cleared or got cropped // the loader.item.currentIndex is not yet updated, so we simply remember // that we need to update when currentIndex change is notified cropping = true; if (selectedIndex <= (start + end)) { // the selection is in between the removed indexes, so move the selection // to the closest available one loader.item.positionViewAtIndex(Math.max(start - 1, 0), (loader.isListView) ? ListView.SnapPosition : PathView.SnapPosition); } } } } } ./src/Ubuntu/Components/Pickers/1.3/PickerDelegate.qml0000644000015600001650000000350312700370701022555 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype PickerDelegate \inqmlmodule Ubuntu.Components.Pickers 1.0 \ingroup ubuntu-pickers \inherits AbstractButton \brief PickerDelegate component serves as base for Picker delegates. PickerDelegate is a holder component for delegates used in a Picker element. Each picker delegate must be derived from this type. */ AbstractButton { id: pickerDelegate /*! \qmlproperty Picker picker \readonly The property holds the Picker component the delegate belongs to. */ readonly property alias picker: internal.picker /*! \internal */ onClicked: { if (internal.itemList.currentIndex === index) return; picker.__clickedIndex = index; internal.itemList.currentIndex = index; } styleName: "PickerDelegateStyle" QtObject { id: internal property bool inListView: pickerDelegate.parent && (QuickUtils.className(pickerDelegate.parent) !== "QQuickPathView") property Item itemList: !inListView ? pickerDelegate.PathView.view : pickerDelegate.ListView.view property Picker picker: itemList ? itemList.pickerItem : null } } ./src/Ubuntu/Components/Pickers/Pickers.pro0000644000015600001650000000211112700370701021005 0ustar jenkinsjenkinsTARGETPATH = Ubuntu/Components/Pickers QML_FILES += 1.2/DatePicker.qml \ 1.2/DayModel.qml \ 1.2/DialerHandGroup.qml \ 1.2/DialerHand.qml \ 1.2/Dialer.qml \ 1.2/HoursModel.qml \ 1.2/MinutesModel.qml \ 1.2/MonthModel.qml \ 1.2/PickerDelegate.qml \ 1.2/PickerModelBase.qml \ 1.2/PickerPanel.qml \ 1.2/Picker.qml \ 1.2/PickerRow.qml \ 1.2/SecondsModel.qml \ 1.2/YearModel.qml \ 1.3/DatePicker.qml \ 1.3/DayModel.qml \ 1.3/DialerHandGroup.qml \ 1.3/DialerHand.qml \ 1.3/Dialer.qml \ 1.3/HoursModel.qml \ 1.3/MinutesModel.qml \ 1.3/MonthModel.qml \ 1.3/PickerDelegate.qml \ 1.3/PickerModelBase.qml \ 1.3/PickerPanel.qml \ 1.3/Picker.qml \ 1.3/PickerRow.qml \ 1.3/SecondsModel.qml \ 1.3/YearModel.qml load(ubuntu_qml_module) ./src/Ubuntu/Components/Pickers/1.2/0000755000015600001650000000000012700370716017176 5ustar jenkinsjenkins./src/Ubuntu/Components/Pickers/1.2/YearModel.qml0000644000015600001650000000364512700370701021574 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 PickerModelBase { // local properties property int from circular: false autoExtend: !maximum.isValid() function reset() { resetting = true; clear(); from = (minimum.getFullYear() <= 0) ? date.getFullYear() : minimum.getFullYear(); var to = (maximum < minimum) ? -1 : maximum.getFullYear(); extend(from, to - from); } function resetLimits(label, margin) { label.text = "9999"; narrowFormatLimit = shortFormatLimit = longFormatLimit = label.paintedWidth + 2 * margin; } function extend(baseYear, items) { if (items === undefined || items < 0) { items = 50; } for (var i = baseYear; i <= baseYear + items; i++) { append({"modelData" : i}); } } function indexOf() { var index = date.getFullYear() - from; if (index >= count) { index = -1; } return index; } function dateFromIndex(index) { if (index < 0 || index >= count) { return date; } var newDate = new Date(date); newDate.setFullYear(index + from); return newDate; } function text(value) { return (value) ? value : ""; } } ./src/Ubuntu/Components/Pickers/1.2/PickerModelBase.qml0000644000015600001650000001052212700370701022674 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /* Base model type for DatePicker */ ListModel { /* Holds the picker instance, the component the model is attached to. Should not be confused with the DatePicker. */ property Item pickerItem /* Property holding the composit picker component. */ property Item mainComponent /* The property holds the width of the picker tumbler to be set. */ property real pickerWidth: 0 /* Specifies whether the model is circular or not. */ property bool circular: false /* The property specifies whenther the Picker should auto-extend the model. Typical for year model. */ property bool autoExtend: false /* Narow, normal and long format limits. */ property real narrowFormatLimit: 0.0 property real shortFormatLimit: 0.0 property real longFormatLimit: 0.0 /* The function resets the model and the attached Picker specified in the item. The Picker must have a resetPicker() function available. */ function reset() {} /* The function completes the reset operation. */ function resetCompleted() { resetting = false; } /* Function called by the Picker to re-calculate values for the limit properties. The locale is retrieved from pickerItem. */ function resetLimits(label, margin) {} /* The function is called by the Picker component when a value gets selected to keep the pickers in sync. */ function syncModels() {} /* The function extends the model starting from a certain \a baseValue. */ function extend(baseValue) {} /* Returns the index of the value from the model. */ function indexOf() { return -1; } /* Returns a Date object from the model's \a index, relative to the given \a date. */ function dateFromIndex(index) { return new Date(); } /* Returns the date string for the value relative to the date, which fits into the given width. Uses the locale from pickerItem to fetch the localized date string. */ function text(value) { return ""; } /* Readonly properties to the composit picker's date properties */ readonly property date date: mainComponent.date readonly property date minimum: mainComponent.minimum readonly property date maximum: mainComponent.maximum property bool pickerCompleted: false /* The property specifies whether there is a reset operation in progress or not. Derivates overwriting reset() function must also set this flag to avoid unwanted date changes that may occur during reset operation due to selectedIndex changes. */ property bool resetting: false /* Call reset() whenever minimum or maximum changes, and update selected index of pickerItem whenever date changes. */ onMinimumChanged: { if (pickerCompleted && pickerItem && !resetting) { pickerItem.resetPicker(); } } onMaximumChanged: { if (pickerCompleted && pickerItem && !resetting) { pickerItem.resetPicker(); } } onDateChanged: { if (!pickerCompleted || !pickerItem || resetting) { return; } // use animated index update only if the change had happened because of the delegate update if (pickerItem.__clickedIndex >= 0) { pickerItem.selectedIndex = indexOf(); } else { // in case the date property was changed due to binding/update, // position tumbler without animating pickerItem.positionViewAtIndex(indexOf()); } } } ./src/Ubuntu/Components/Pickers/1.2/DayModel.qml0000644000015600001650000000542412700370701021406 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 PickerModelBase { circular: true function reset() { resetting = true; clear(); for (var i = 0; i < date.daysInMonth(); i++) { append({"day": i}); } } function resetLimits(label, margin) { label.text = '9999'; narrowFormatLimit = label.paintedWidth + 2 * margin; shortFormatLimit = longFormatLimit = 0.0; for (var day = 1; day <= 7; day++) { label.text = '99 ' + mainComponent.locale.dayName(day, Locale.ShortFormat) shortFormatLimit = Math.max(label.paintedWidth + 2 * margin, shortFormatLimit); label.text = '99 ' + mainComponent.locale.dayName(day, Locale.LongFormat) longFormatLimit = Math.max(label.paintedWidth + 2 * margin, longFormatLimit); } } function syncModels() { var newDaysCount = mainComponent.date.daysInMonth(mainComponent.year, mainComponent.month); var modelCount = count; var daysDiff = newDaysCount - modelCount; if (daysDiff < 0) { remove(modelCount + daysDiff, -daysDiff); } else if (daysDiff > 0) { for (var d = modelCount; d < modelCount + daysDiff; d++) { append({"day": d}); } } } function indexOf() { return date.getDate() - 1; } function dateFromIndex(index) { if (index < 0 || index >= count) { return date; } var newDate = new Date(date); newDate.setDate(index + 1); return newDate; } function text(value) { if (value === undefined) { return ""; } var thisDate = new Date(date); thisDate.setDate(value + 1); if (pickerWidth >= longFormatLimit) { return Qt.formatDate(thisDate, "dd ") + mainComponent.locale.dayName(thisDate.getDay(), Locale.LongFormat); } if (pickerWidth >= shortFormatLimit) { return Qt.formatDate(thisDate, "dd ") + mainComponent.locale.dayName(thisDate.getDay(), Locale.ShortFormat); } return Qt.formatDate(thisDate, "dd"); } } ./src/Ubuntu/Components/Pickers/1.2/DialerHand.qml0000644000015600001650000002010512700370701021674 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype DialerHand \inqmlmodule Ubuntu.Components.Pickers 1.0 \ingroup ubuntu-pickers \brief DialerHand represents a value selector on a Dialer. DialerHand components have meaning only if those are placed inside Dialer components. The dialer hand presents a value selection from the given dialer's minimum and maximum values. By default all hands are placed on the dialer's hand space, on the outer dialer disk. By default all hands have teh same size, 0.5GU width and height same as the handSpace specified in \l Dialer, however themes can specify preset values for each hand. Hands can also be placed onto the inner disk by setting \a hand.toCenterItem property to true. \qml Dialer { DialerHand { // this dialer hand will take the space as defined by the theme. } DialerHand { hand.height: units.gu(3) // this hand will have its width as defined by the theme // but height as 3 GU } } \endqml Items declared as children will be placed over the hands. These items will not be rotated togehther with the hand, these will always be shown horizontally. The hand can be hidden by setting false to \a hand.visible property, but that does not hide the overlay content. The following example demonstrates how to create a hidden dialer hand having an overlay component on the hand. \qml Dialer { DialerHand { id: selector hand.visible: false Rectangle { anchors.centerIn: parent width: height height: units.gu(3) radius: width / 2 color: Theme.palette.normal.background antialiasing: true Label { text: Math.round(selector.value) anchors.centerIn: parent } } } } \endqml */ StyledItem { id: dialerHand /*! The property holds the selected value the dialer hand points to. */ property real value /*! \qmlproperty real hand.width \qmlproperty real hand.height \qmlproperty bool hand.draggable \qmlproperty bool hand.toCenterItem \qmlproperty bool hand.visible The \b hand.width and \b hand.height properties define the size of the hand. The height of the hand must be in the [0..dialer.handSpace] range in order to have the hand displayed in the hand area, however there is no restriction applied on the size of the dialer hand. If no value is set, the width and height will be defined by the style. \b draggable property specifies whether the hand is draggable or not. When set to not draggable, the hand is used only to indicate the given value. The default value is true. \b toCenterItem property specifies whether the hand should be placed on the hand space (on the outer disk - false) or onto the center disk (inner disk - true). The default value is false, meaning the hand will be placed onto the hand space disk. \b visible property specifies whether to show the hand marker or not. The default value is true. */ property DialerHandGroup hand: DialerHandGroup { width: __styleInstance.handPreset(index, "width") height: __styleInstance.handPreset(index, "height") draggable: __styleInstance.handPreset(index, "draggable") visible: __styleInstance.handPreset(index, "visible") toCenterItem: __styleInstance.handPreset(index, "toCenterItem") } /*! The property holds the dialer instance the hand is assigned to. This is a helper property to enable access to the dialer component hosting the hand. */ readonly property Dialer dialer: parent /*! \qmlproperty list overlay \default The property holds the items that can be added on top of the hand. Note that these items will not be rotated together with the hand pointer and pointer visibility does not affect the overlay items visibility. */ default property alias overlay: contentItem.data /*! \qmlproperty int index \readonly The property holds the index of the hand. Note that this is not the child index of the dialer children, this represents the index of the DialerHand component added to the \l dialer. */ readonly property alias index: grabber.index z: __styleInstance.handPreset(index, "z") anchors.centerIn: parent width: parent.width height: parent.height activeFocusOnPress: true style: Theme.createStyleComponent("DialerHandStyle.qml", dialerHand) /*! \internal */ onParentChanged: { if (dialer && !dialer.hasOwnProperty("handSpace")) { console.log("WARNING: DialerHand can be a child of Dialer only."); } } /*! \internal */ onValueChanged: grabber.updateHand(); /*! \internal */ Component.onCompleted: grabber.updateHand(); /*! \internal */ property alias __grabber: grabber Item { id: grabber property int index: -1 parent: __styleInstance.handPointer width: units.gu(4) height: parent.height anchors { top: parent.top horizontalCenter: parent.horizontalCenter } Item { id: contentItem anchors.fill: parent rotation: 360 - __styleInstance.rotation } function updateHand() { if (!dialer || !__styleInstance) return; __styleInstance.rotation = MathUtils.projectValue(value, dialer.minimumValue, dialer.maximumValue, 0.0, 360.0); dialer.handUpdated(dialerHand); } MouseArea{ anchors.fill: parent; preventStealing: true; enabled: dialerHand.hand.draggable; property real centerX : dialerHand.width / 2 property real centerY : dialerHand.height / 2 property bool internalChange: false onPositionChanged: { if (internalChange) return; internalChange = true; dialerHand.requestFocus(Qt.MouseFocusReason); var point = mapToItem (dialerHand, mouse.x, mouse.y); var diffX = (point.x - centerX); var diffY = -1 * (point.y - centerY); var rad = Math.atan (diffY / diffX); var deg = (rad * 180 / Math.PI); if (diffX > 0 && diffY > 0) { __styleInstance.rotation = 90 - Math.abs (deg); } else if (diffX > 0 && diffY < 0) { __styleInstance.rotation = 90 + Math.abs (deg); } else if (diffX < 0 && diffY > 0) { __styleInstance.rotation = 270 + Math.abs (deg); } else if (diffX < 0 && diffY < 0) { __styleInstance.rotation = 270 - Math.abs (deg); } dialerHand.value = MathUtils.projectValue(__styleInstance.rotation, 0.0, 360.0, dialer.minimumValue, dialer.maximumValue); internalChange = false; } } } } ./src/Ubuntu/Components/Pickers/1.2/DialerHandGroup.qml0000644000015600001650000000173612700370701022722 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \internal Component serving as group property for DialerHhand.hand property. */ QtObject { property real width: units.gu(0.5) property real height: parent.dialer.handSize property bool draggable: true property bool visible: true property bool toCenterItem: false } ./src/Ubuntu/Components/Pickers/1.2/PickerPanel.qml0000644000015600001650000002054212700370701022103 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ pragma Singleton import QtQuick 2.4 import QtQuick.Window 2.0 import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 import Ubuntu.Components.Popups 1.0 /*! \qmltype PickerPanel \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu-pickers \brief Provides a panel for opening a DatePicker in place of the input panel or as Popover, depending on the form factor. PickerPanel is a singleton component designed to open a DatePicker in the input panel area or in a Popover, depending on the form factor, following the design guides on date pickers. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 MainWindow { width: units.gu(40) height: units.gu(71) Page { title: "PickerPanel" Button { id: dateButton property date date: new Date() text: Qt.formatDateTime(date, "yyyy/MMMM") onClicked: PickerPanel.openDatePicker(dateButton, "date", "Years|Months") } } } \endqml The opened panel is closed automatically when the user taps/presses outside of the panel or Popover area. */ Object { /*! The function opens a DatePicker component in the input method area or in a popover, depending on the availability of an input method provider in the system and whether the size of the main screen width/height defines a phone form factor. The picked date will be read from and reported to the \a property of the \a caller as date type. This implies that the caller must have defined the given property of type date. On failure, the function returns null. On success, the returned object has the following properties: \code Object { property DatePicker picker property string pickerMode property date date property Item caller property string callerProperty signal closed() } \endcode \table \header \li Property \li Description \row \li \b picker \li instance of the DatePicker component shown in the panel/popup \row \li \b pickerMode \li represents the \l DatePicker::mode to be used. This is an optional parameter and if not defined, the default mode will be used. \row \li \b date \li represents the date selected \row \li \b caller \li the instance of the component opening the panel \row \li \b callerProperty \li the property of the caller holding the date value which will be updated by the picker. \header \li Signal \li Description \row \li closed() \li the signal is emitted when the panel or popover gets closed. The signal is handy when actions are performed upon panel close. \endtable */ function openDatePicker(caller, property, mode) { if (mode === undefined) { mode = "Years|Months|Days"; } var params = { "date": caller[property], "pickerMode": mode, "callerProperty": property } // hide OSK if eventually open if (Qt.inputMethod.visible) { Qt.inputMethod.hide(); } if (!internal.isPhone) { // we have no input panel defined, or the therefore we show the picker in a Popover return internal.openPopover(caller, params); } // OSK panel return internal.openPanel(caller, params); } QtObject { id: internal objectName: "PickerPanel_Internals" property bool formFactorPhone: Screen.width <= units.gu(40) && Screen.height <= units.gu(71) // present in a property so we can test it in property bool isPhone: false Component.onCompleted: isPhone = formFactorPhone && (QuickUtils.inputMethodProvider !== "") function openPopover(caller, params) { var popover = PopupUtils.open(datePickerPopover, caller, params); popover.parent = QuickUtils.rootItem(null); return popover; } function openPanel(caller, params) { params["caller"] = caller; var panel = datePickerPanel.createObject(QuickUtils.rootItem(null), params); return panel; } } // popover Component { id: datePickerPopover Popover { property alias picker: picker property alias date: picker.date property alias pickerMode: picker.mode property string callerProperty signal closed() contentWidth: frame.width contentHeight: frame.height Item { id: frame width: picker.width + units.gu(4) height: picker.height + units.gu(4) DatePicker { id: picker anchors.centerIn: parent Binding { target: caller property: callerProperty when: callerProperty != undefined value: picker.date } } } Component.onDestruction: closed() } } // OSK panel Component { id: datePickerPanel Rectangle { property alias picker: picker property alias date: picker.date property alias pickerMode: picker.mode property string callerProperty property Item caller signal closed() id: panel // no additional styling is needed color: Theme.palette.normal.overlay width: parent.width height: Qt.inputMethod.keyboardRectangle.height > 0 ? Qt.inputMethod.keyboardRectangle.height : units.gu(26) y: parent.height ThinDivider { anchors.bottom: parent.top } DatePicker { id: picker anchors { fill: panel margins: units.gu(2) } Binding { target: caller property: callerProperty when: callerProperty != undefined value: picker.date } } InverseMouseArea { anchors.fill: parent onPressed: panel.state = '' } Component.onCompleted: state = 'opened' states: [ State { name: 'opened' PropertyChanges { target: panel y: parent.height - height } } ] transitions: [ Transition { from: '' to: 'opened' UbuntuNumberAnimation { target: panel property: 'y' } }, Transition { from: 'opened' to: '' SequentialAnimation { UbuntuNumberAnimation { target: panel property: 'y' } ScriptAction { script: { closed(); panel.destroy(); } } } } ] } } } ./src/Ubuntu/Components/Pickers/1.2/MinutesModel.qml0000644000015600001650000000344112700370701022312 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 PickerModelBase { property int from circular: count >= 60 function reset() { resetting = true; clear(); from = minimum.getMinutes(); var distance = (!maximum.isValid() || (minimum.daysTo(maximum) > 1) || (minimum.minutesTo(maximum) >= 60)) ? 60 : minimum.minutesTo(maximum); for (var i = 0; i < distance; i++) { append({"minute": (from + i) % 60}); } resetting = false; } function resetLimits(label, margin) { label.text = "99"; narrowFormatLimit = shortFormatLimit = longFormatLimit = label.paintedWidth + 2 * margin; } function indexOf() { var index = date.getMinutes() - from; if (index >= count) { index = -1; } return index; } function dateFromIndex(index) { if (index < 0 || index >= count) { return date; } var newDate = new Date(date); newDate.setMinutes(index + from); return newDate; } function text(value) { return (value !== undefined) ? ("00" + value).slice(-2) : ""; } } ./src/Ubuntu/Components/Pickers/1.2/Dialer.qml0000644000015600001650000001230412700370701021103 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype Dialer \inqmlmodule Ubuntu.Components.Pickers 1.0 \ingroup ubuntu-pickers \brief Dialer is a phone dialer style picker component. The Dialer component is dedicated for value selection where the value is compound of several sections, i.e. hour, minute and second, or integral and decimal values. Each section is defined by a DialerHand, which shares the same range as the dialer is having. Dialer hand visuals are placed on the same dialer disk, however this can be altered by setting different values to DialerHand propertries. The following example shows how to create a dialer component to select a value between 0 and 50. \qml import QtQuick 2.4 import Ubuntu.Components.Pickers 1.0 Dialer { size: units.gu(20) minimumValue: 0 maximumValue: 50 DialerHand { id: mainHand onValueChanged: console.log(value) } } \endqml \sa DialerHand */ StyledItem { /*! \qmlproperty real minimumValue: 0 \qmlproperty real maximumValue: 360 These properties define the value range the dialer hand values can take. The default values are 0 and 360. */ property real minimumValue: 0.0 /*! \internal - documented in previous block*/ property real maximumValue: 360.0 /*! The property holds the size of the dialer. The component should be sized using this property instead of using width and/or height properties. Sizing with this property it is made sure that the component will scale evenly. */ property real size: units.gu(32) /*! The property holds the height reserved for the dialer hands, being the distance between the outer and the inner dialer disks. This value cannot be higher than the half of the dialer \l size. */ property real handSpace: units.gu(6.5) /*! \qmlproperty Item centerItem The property holds the component from the center of the Dialer. Items wanted to be placed into the center of the Dialer must be reparented to this component, or listed in the \l centerContent property. Beside that, the property helps anchoring the center disk content to the item. \qml Dialer { DialerHand { id: hand Label { parent: hand.centerItem // [...] } } // [...] } \endqml */ readonly property alias centerItem: centerHolder /*! \qmlproperty list centerContent The property holds the list of items to be placed inside of the center disk. Items placed inside the center disk can either be listed in this property or reparented to \l centerItem property. \qml Dialer { DialerHand { id: hand centerContent: [ Label { // [...] } // [...] ] } // [...] } \endqml */ property alias centerContent: centerHolder.data /*! \qmlproperty list hands \readonly The property holds the list of DialerHands added to Dialer. This may be the same as the children, however will contain only DialerHand objects. */ readonly property alias hands: internal.hands /*! \qmlmethod void handUpdated(DialerHand hand) The signal is emited when the hand value is updated. */ signal handUpdated(var hand) id: dialer implicitWidth: size implicitHeight: size activeFocusOnPress: true style: Theme.createStyleComponent("DialerStyle.qml", dialer) Item { id: internal // internal property holding only the list of DialerHand components // workaround for readonly public property property var hands: [] height: size - handSpace * 2 width: size - handSpace * 2 anchors.centerIn: parent Item { id: centerHolder anchors.fill: parent z: 1 } } /*! \internal */ onChildrenChanged: { // apply dialer presets if the hand sizes were not set // check dialers only var idx = 0; var stack = []; for (var i in children) { if (children[i].hasOwnProperty("hand")) { children[i].__grabber.index = idx++; stack.push(children[i]); } internal.hands = stack; } } } ./src/Ubuntu/Components/Pickers/1.2/HoursModel.qml0000644000015600001650000000340412700370701021765 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 PickerModelBase { property int from circular: count >= 24 function reset() { resetting = true; clear(); from = minimum.getHours(); var distance = (!Date.prototype.isValid.call(maximum) || (minimum.daysTo(maximum) > 1)) ? 24 : minimum.hoursTo(maximum); for (var i = 0; i < distance; i++) { append({"hour": (from + i) % 24}); } resetting = false; } function resetLimits(label, margin) { label.text = "99"; narrowFormatLimit = shortFormatLimit = longFormatLimit = label.paintedWidth + 2 * margin; } function indexOf() { var index = date.getHours() - from; if (index >= count) { index = -1; } return index; } function dateFromIndex(index) { if (index < 0 || index >= count) { return date; } var newDate = new Date(date); newDate.setHours(index + from); return newDate; } function text(value) { return (value !== undefined) ? ("00" + value).slice(-2) : ""; } } ./src/Ubuntu/Components/Pickers/1.2/PickerRow.qml0000644000015600001650000001035612700370701021615 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Row { id: row /* Reference to the main composit component holding this row. */ property Item mainComponent /* The model populating the row. */ property alias model: rowRepeater.model /* Picker label margins */ property real margins: units.gu(1.5) /* Reports whether either of the pickers is moving */ property bool moving // the following functions/properties should be kept private in case the // component is ever decided to be published function pickerMoving(isMoving) { if (isMoving === undefined) { isMoving = this.moving; } if (isMoving) { row.moving = true; } else { for (var i = 0; i < row.model.count; i++) { var pickerItem = model.get(i).pickerModel.pickerItem; if (!pickerItem) return; if (pickerItem.moving) { row.moving = true; return; } } row.moving = false; } } function disconnectPicker(index) { var pickerItem = model.get(index).pickerModel.pickerItem; if (pickerItem) { pickerItem.onMovingChanged.disconnect(pickerMoving); } } Connections { target: row.model onPickerRemoved: disconnectPicker(index) } objectName: "PickerRow_Positioner"; Repeater { id: rowRepeater onModelChanged: row.pickerMoving(true) Picker { id: unitPicker objectName: "PickerRow_" + pickerName model: pickerModel enabled: pickerModel.count > 1 circular: pickerModel.circular live: false width: pickerModel.pickerWidth height: parent ? parent.height : 0 style: Rectangle { anchors.fill: parent color: (unitPicker.Positioner.index % 2) ? Qt.rgba(0, 0, 0, 0.03) : Qt.rgba(0, 0, 0, 0.07) } delegate: PickerDelegate { Label { objectName: "PickerRow_PickerLabel" + (pickerModel ? modelData : "") text: pickerModel ? pickerModel.text(modelData) : "" anchors.fill: parent verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter } Component.onCompleted: { if (pickerModel && pickerModel.autoExtend && (index === (pickerModel.count - 1))) { pickerModel.extend(modelData + 1); } } } onSelectedIndexChanged: { if (pickerModel && !pickerModel.resetting) { mainComponent.date = pickerModel.dateFromIndex(selectedIndex); pickerModel.syncModels(); } } /* Resets the Picker model and updates the new format limits. */ function resetPicker() { pickerModel.reset(); pickerModel.resetLimits(textSizer, margins); pickerModel.resetCompleted(); positionViewAtIndex(pickerModel.indexOf()); } Component.onCompleted: { // update model with the item instance pickerModel.pickerItem = unitPicker; unitPicker.onMovingChanged.connect(pickerMoving.bind(unitPicker)); row.pickerMoving(unitPicker.moving); } } } } ./src/Ubuntu/Components/Pickers/1.2/DatePicker.qml0000644000015600001650000005754312700370714021740 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype DatePicker \inqmlmodule Ubuntu.Components.Pickers 1.0 \ingroup ubuntu-pickers \brief DatePicker component provides date and time value picking functionality. DatePicker combines up to three Picker elements providing different date or time value selection possibilities. It can be used to select full date (year, month, day), full time (hours, minutes, seconds) as well as to select a combination of year and month, month and day, hours and minutes, minutes and seconds or individual time units (i.e. year, month or day as well as hours, minutes or seconds). The selected date as well as the initial one is provided by the \l date property. For convenience the component provides also the \a year, \a month, \a day, \a week, \a hours, \a minutes and \a seconds values as separate properties, however these properties are not writable, and their initialization can happen only through the \l date property. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.Pickers 1.0 Column { Label { text: "Selected date: W" + datePicker.week + " - " + Qt.formatDate(datePicker.date, "dddd, dd-MMMM-yyyy") } DatePicker { id: datePicker } } \endqml The \l mode property specifies what time units should be shown by the picker. The property holds a string, combining \b Years, \b Months, \b Days, \b Hours, \b Minutes and \b Seconds strings sepatared with '|' character. A DatePicker which shows only year and month date units would look as follows: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.Pickers 1.0 Column { Label { text: "Selected month: " + Qt.formatDate(datePicker.date, "MMMM-yyyy") } DatePicker { id: datePicker mode: "Years|Months" } } \endqml The \b mode of the DatePicker is set to date picking. In case time picking is needed, the model should be set to contain the time specific mode flags. The following example demonstrates how to use DatePicker for time picking. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.Pickers 1.0 Column { Label { text: "Selected time: " + Qt.formatTime(datePicker.date, "hh:mm:ss") } DatePicker { id: datePicker mode: "Hours|Minutes|Seconds" } } \endqml Note that the order in which the mode flags are specified does not influence the order the pickers are arranged. That is driven by the date format of the \l locale used in the picker. Also not all combinations of mode flags are supported. See \l mode for the supported combinations. The default interval the date values are chosen is a window starting at the current date ending 50 years later. This window is defined by the \a minimum and \a maximum properties. The interval can be altered considering the following rules: \list \li \a minimum must be less or equal than the \l date; if the \a date value is less than the given \a minimum, the date will be set to the minimum's value \li \a maximum value must be greater than the \a minimum, or invalid. When the maximum is smaller than the \l date, the \l date property will be updated to get the maximum value. When set to invalid date (see Date.getInvalidDate()), the upper limit of the date interval becomes infinite, meaning the year picker will extend infinitely. This leads to increased memory use and should be avoided if possible. Invalid date will make hours picker presenting 24 hours. \endlist \qml import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.Pickers 1.0 Column { Label { text: "Selected date: " + Qt.formatDate(datePicker.date, "dddd, dd-MMMM-yyyy") } DatePicker { id: datePicker minimum: { var d = new Date(); d.setFullYear(d.getFullYear() - 1); return d; } maximum: Date.prototype.getInvalidDate.call() } } \endqml \b Note: do not use the \l date property when initializing minimum and maximum as it will cause binding loops. \section2 Layout As mentioned earlier, DatePicker combines up to three Picker tumblers depending on the mode requested. These tumblers are laid out in a row in the order the default date format of the \l locale is. \section3 Date picker layout rules The date picker consist of three pickers: year, month, and date. The exact contents of the month and date pickers depends on the available width: \list \li full name for month, number and full day for date (“August” “28 Wednesday”) \li otherwise full name for month, number and abbreviated day for date (“August” “28 Wed”); \li otherwise full name for month, number for date (“August” “28”); \li otherwise abbreviated name for month, number for date (“Aug” “28”). \li otherwise number for month, number for date (“08” “28”). \endlist \a{If the currently selected date becomes impossible due to year change (from a leap to a non-leap year when the date is set to February 29) or month change (e.g. from a month that has 31 days to one that has fewer when the date is set to 31), the date reduces automatically to the last day of the month (i.e February 28 or 30th day of the month).} \section3 Time picker layout rules Time units are shown in fixed width picker tumblers, numbers padded with leading zeroes. There is no other special rule on the formatting of the time unit numbers. \section3 How minimum/maximum affects the tumblers If minimum and maximum are within the same year, the year picker will be insensitive. If minimum and maximum are within the same month, the month picker will also be insensitive. */ StyledItem { id: datePicker /*! Specifies what kind of date value selectors should be shown by the picker. This is a string of 'flags' separated by '|' separator, where flags are: \table \header \li {2, 1} Date picker modes \header \li Value \li Description \row \li Years \li Specifies to show the year picker \row \li Months \li Specifies to show the month picker \row \li Days \li Specifies to show the day picker \header \li {2, 1} Time picker modes \header \li Value \li Description \row \li Hours \li Specifies to show the hours picker \row \li Minutes \li Specifies to show the minutes picker \row \li Seconds \li Specifies to show the seconds picker \endtable With some exceptions, any combination of these flags is allowed within the same group. Date and time picker modes cannot be combined. The supported combinations are: \a{Years|Months|Days}, \a{Years|Months}, \a{Months|Days}, \a{Hours|Minutes|Seconds}, \a{Hours|Minutes} and \a{Minutes|Seconds}, as well as each mode flag individually. The default value is "\a{Years|Months|Days}". */ property string mode: "Years|Months|Days" /*! The date chosen by the DatePicker. The default value is the date at the component creation time. The property automatically updates year, month and day properties. */ property date date: Date.prototype.midnight.call(new Date()) /*! \qmlproperty int minimum The minimum date (inclusive) to be shown in the picker. Both year and month values will be considered from the properties. The year and month picker values are filled based on these values. The year picker will be infinite (extending infinitely) if the maximum is an invalid date. If the distance between maximum and minimum is less than a year, the year picker will be shown disabled. The month picker will be circular if the distance between maximum and minimum is at least one year, or if the maximum date is invalid. The default values are the current date for the minimum, and 50 year distance value for maximum. */ property date minimum: Date.prototype.midnight.call(new Date()) /*! \qmlproperty int maximum The maximum date (inclusive) to be shown in the picker. Both year and month values will be considered from the properties. See \l minimum for more details. */ property date maximum: { var d = Date.prototype.midnight.call(new Date()); d.setFullYear(d.getFullYear() + 50); return d; } /*! For convenience, the \b year value of the \l date property. */ readonly property int year: datePicker.date.getFullYear() /*! For convenience, the \b month value of the \l date property. */ readonly property int month: datePicker.date.getMonth() /*! For convenience, the \b day value of the \l date property. */ readonly property int day: datePicker.date.getDate() /*! For convenience, the \b week value of the \l date property. */ readonly property int week: datePicker.date.getWeek() /*! For convenience, the \b hours value of the \l date property. */ readonly property int hours: datePicker.date.getHours() /*! For convenience, the \b minutes value of the \l date property. */ readonly property int minutes: datePicker.date.getMinutes() /*! For convenience, the \b seconds value of the \l date property. */ readonly property int seconds: datePicker.date.getSeconds() /*! The property defines the locale used in the picker. The default value is the system locale. \qml DatePicker { locale: Qt.locale("hu_HU") } \endqml */ property var locale: Qt.locale() /*! \qmlproperty bool moving \readonly The property holds whether the component's pickers are moving. \sa Picker::moving */ readonly property alias moving: positioner.moving implicitWidth: units.gu(36) implicitHeight: units.gu(20) activeFocusOnPress: true /*! \internal */ onMinimumChanged: { if (internals.completed && !minimum.isValid()) { // set the minimum to the date minimum = date; } // adjust date if (date !== undefined && Date.prototype.isValid.call(minimum) && date < minimum && internals.completed) { date = minimum; } } /*! \internal */ onMaximumChanged: { // adjust date if (date !== undefined && Date.prototype.isValid.call(maximum) && date > maximum && maximum > minimum && internals.completed) { date = maximum; } } /*! \internal */ onWidthChanged: { // use dayPicker narrowFormatLimit even if the dayPicker is hidden // and clamp the width so it cannot have less width that the sum of // the three tumblers' narrowFormatLimit var minWidth = 0.0; for (var i = 0; i < tumblerModel.count; i++) { minWidth += tumblerModel.get(i).pickerModel.narrowFormatLimit; } width = Math.max(width, minWidth); } /*! \internal */ onModeChanged: internals.updatePickers() /*! \internal */ onLocaleChanged: internals.updatePickers() Component.onCompleted: { if (minimum === undefined) { minimum = date; } internals.completed = true; internals.updatePickers(); } // models YearModel { id: yearModel mainComponent: datePicker pickerCompleted: internals.completed && internals.showYearPicker pickerWidth: (!pickerItem) ? 0 : narrowFormatLimit function syncModels() { dayModel.syncModels(); } } MonthModel { id: monthModel mainComponent: datePicker pickerCompleted: internals.completed && internals.showMonthPicker pickerWidth: { if (!pickerItem) { return 0; } return MathUtils.clamp(datePicker.width - yearModel.pickerWidth - dayModel.pickerWidth, narrowFormatLimit, longFormatLimit); } function syncModels() { dayModel.syncModels(); } } DayModel { id: dayModel mainComponent: datePicker pickerCompleted: internals.completed && internals.showDayPicker pickerWidth: { if (!pickerItem) { return 0; } var w = Math.max(datePicker.width * internals.dayPickerRatio, narrowFormatLimit); if (w < longFormatLimit && w >= shortFormatLimit) { return shortFormatLimit; } return w; } } HoursModel { id: hoursModel mainComponent: datePicker pickerCompleted: internals.completed && internals.showHoursPicker pickerWidth: { if (!pickerItem) { return 0; } return narrowFormatLimit; } } MinutesModel { id: minutesModel mainComponent: datePicker pickerCompleted: internals.completed && internals.showMinutesPicker pickerWidth: { if (!pickerItem) { return 0; } return narrowFormatLimit; } } SecondsModel { id: secondsModel mainComponent: datePicker pickerCompleted: internals.completed && internals.showSecondsPicker pickerWidth: { if (!pickerItem) { return 0; } return narrowFormatLimit; } } style: Theme.createStyleComponent("DatePickerStyle.qml", datePicker) Binding { target: __styleInstance property: "view" value: positioner } Binding { target: __styleInstance property: "pickerModels" value: tumblerModel } Binding { target: __styleInstance property: "unitSeparator" value: (internals.showHoursPicker || internals.showMinutesPicker || internals.showSecondsPicker) ? ":" : "" } // tumbler positioner PickerRow { id: positioner parent: (datePicker.__styleInstance && datePicker.__styleInstance.hasOwnProperty("tumblerHolder")) ? datePicker.__styleInstance.tumblerHolder : datePicker mainComponent: datePicker model: tumblerModel margins: internals.margin anchors { top: parent.top bottom: parent.bottom horizontalCenter: parent.horizontalCenter } } // tumbler model ListModel { /* Model to hold tumbler order for repeaters. Roles: - pickerModel - pickerName */ id: tumblerModel /* Signal triggered when the model is about to remove a picker. We cannot rely on rowAboutToBeRemoved, as by the time the signal is called the list element is already removed from the model. */ signal pickerRemoved(int index) // the function checks whether a pickerModel was added or not // returns the index of the model object the pickerModel was found // or -1 on error. function pickerModelIndex(name) { for (var i = 0; i < count; i++) { if (get(i).pickerName === name) { return i; } } return -1; } // the function checks whether a pickerModel is present in the list; // moves the existing one to the given index or inserts it if not present function setPickerModel(model, name, index) { var idx = pickerModelIndex(name); if (idx >= 0) { move(idx, index, 1); } else { append({"pickerModel": model, "pickerName": name}); } } // removes the given picker function removePicker(name) { var idx = pickerModelIndex(name); if (idx >= 0) { pickerRemoved(idx); remove(idx); } } } // component to calculate text fitting Label { id: textSizer; visible: false } QtObject { id: internals property bool completed: false property real margin: units.gu(1.5) property real dayPickerRatio: 0.1 property bool showYearPicker: true property bool showMonthPicker: true property bool showDayPicker: true property bool showHoursPicker: false property bool showMinutesPicker: false property bool showSecondsPicker: false /* Update pickers. */ function updatePickers() { if (completed) { // check mode flags first // FIXME: The js split(/\W/g) terminates the process on armhf with Qt 5.3 (v4 js) (https://bugreports.qt-project.org/browse/QTBUG-39255) var modes = datePicker.mode.match(/\w+/g); showYearPicker = showMonthPicker = showDayPicker = showHoursPicker = showMinutesPicker = showSecondsPicker = false; while (modes.length > 0) { var modeFlag = modes.pop(); switch (modeFlag) { case "Years": showYearPicker = true; break; case "Months": showMonthPicker = true; break; case "Days": showDayPicker = true; break; case "Hours": showHoursPicker = true; break; case "Minutes": showMinutesPicker = true; break; case "Seconds": showSecondsPicker = true; break; default: console.warn("Unhandled mode flag: " + modeFlag + ". Mode will not be set!"); return; } } // filter unaccepted date picking mode if (!showMonthPicker && showYearPicker && showDayPicker) { console.warn("Invalid DatePicker mode: " + datePicker.mode); return; } // filter unaccepted time picking mode if (showHoursPicker && showSecondsPicker && !showMinutesPicker) { console.warn("Invalid DatePicker mode: " + datePicker.mode); return; } // date and time picking not allowed at the same time if ((showYearPicker || showMonthPicker || showDayPicker) && (showHoursPicker || showMinutesPicker || showSecondsPicker)) { console.warn("Date and Time picking not allowed at the same time."); return; } arrangeTumblers(); resetPickers(); } } /* Resets the pickers. Pickers will update their models with the given date, minimum and maximum values. */ function resetPickers() { if (!completed) return; for (var i = 0; i < tumblerModel.count; i++) { var pickerItem = tumblerModel.get(i).pickerModel.pickerItem; pickerItem.resetPicker(); } // calculate the ratio for the dayPicker var maxWidth = 0.0; maxWidth += showYearPicker ? yearModel.longFormatLimit : 0.0; maxWidth += showMonthPicker ? monthModel.longFormatLimit : 0.0; maxWidth += showDayPicker ? dayModel.longFormatLimit : 0.0; if (showDayPicker && maxWidth > 0.0) { dayPickerRatio = (dayModel.longFormatLimit / maxWidth).toPrecision(3); } } /* Detects the tumbler order from the date format of the locale */ function arrangeTumblers() { // disable completion so avoid accidental date changes completed = false; // use short format to exclude any extra characters // FIXME: The js split(/\W/g) terminates the process on armhf with Qt 5.3 (v4 js) (https://bugreports.qt-project.org/browse/QTBUG-39255) var format = datePicker.locale.dateFormat(Locale.ShortFormat).match(/\w+/g); // loop through the format to decide the position of the tumbler var formatIndex = 0; for (var i in format) { if (!format[i].length) continue; // check the first two characters switch (format[i].substr(0, 1).toLowerCase()) { case 'y': if (showYearPicker) { tumblerModel.setPickerModel(yearModel, "YearPicker", formatIndex); formatIndex++; } else { tumblerModel.removePicker("YearPicker"); } break; case 'm': if (showMonthPicker) { tumblerModel.setPickerModel(monthModel, "MonthPicker", formatIndex); formatIndex++; } else { tumblerModel.removePicker("MonthPicker"); } break; case 'd': if (showDayPicker) { tumblerModel.setPickerModel(dayModel, "DayPicker", formatIndex); formatIndex++; } else { tumblerModel.removePicker("DayPicker"); } break; } } // check hms if (showHoursPicker) { tumblerModel.setPickerModel(hoursModel, "HoursPicker", formatIndex); formatIndex++; } else { tumblerModel.removePicker("HoursPicker"); } if (showMinutesPicker) { tumblerModel.setPickerModel(minutesModel, "MinutesPicker", formatIndex); formatIndex++; } else { tumblerModel.removePicker("MinutesPicker"); } if (showSecondsPicker) { tumblerModel.setPickerModel(secondsModel, "SecondsPicker", formatIndex); formatIndex++; } else { tumblerModel.removePicker("SecondsPicker"); } // re-enable completion completed = true; } } } ./src/Ubuntu/Components/Pickers/1.2/SecondsModel.qml0000644000015600001650000000344312700370701022266 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 PickerModelBase { property int from circular: count >= 60 function reset() { resetting = true; clear(); from = minimum.getSeconds(); var distance = (!maximum.isValid() || (minimum.daysTo(maximum) > 1) || (minimum.secondsTo(maximum) >= 60)) ? 59 : minimum.secondsTo(maximum); for (var i = 0; i <= distance; i++) { append({"seconds": (from + i) % 60}); } resetting = false; } function resetLimits(label, margin) { label.text = "99"; narrowFormatLimit = shortFormatLimit = longFormatLimit = label.paintedWidth + 2 * margin; } function indexOf() { var index = date.getSeconds() - from; if (index >= count) { index = -1; } return index; } function dateFromIndex(index) { if (index < 0 || index >= count) { return date; } var newDate = new Date(date); newDate.setSeconds(index + from); return newDate; } function text(value) { return (value !== undefined) ? ("00" + value).slice(-2) : ""; } } ./src/Ubuntu/Components/Pickers/1.2/MonthModel.qml0000644000015600001650000000640612700370701021757 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 PickerModelBase { circular: (count >= 11) // local properties property int from function reset() { resetting = true; clear(); var modelDate = new Date(date); modelDate.setDate(1); // if maximum is invalid, we have full model (12 months to show) var distance, to; distance = to = maximum.isValid() ? minimum.monthsTo(maximum) : 11; if (to < 0 || to > 11) to = 11; from = (to < 11) ? minimum.getMonth() : 0; // fill the model for (var i = from; i <= from + to; i++) { modelDate.setMonth(i); append({"month": modelDate.getMonth()}); } } function resetLimits(label, margin) { label.text = '9999'; narrowFormatLimit = label.paintedWidth + 2 * margin; shortFormatLimit = longFormatLimit = 0.0; for (var month = 0; month < 12; month++) { label.text = mainComponent.locale.monthName(month, Locale.LongFormat); shortFormatLimit = Math.max(label.paintedWidth + 2 * margin, shortFormatLimit); label.text = mainComponent.locale.monthName(month, Locale.LongFormat); longFormatLimit = Math.max(label.paintedWidth + 2 * margin, longFormatLimit); } } function indexOf() { var index = date.getMonth() - from; if (index >= count) { index = -1; } return index; } function dateFromIndex(index) { if (index < 0 || index >= count) { return date; } var newDate = new Date(date); // check if the days are in the diff zone (29-31) var fromDay = newDate.getDate(); // move the day to the 1st of the month so we don't overflow when setting the month newDate.setDate(1); newDate.setMonth(get(index).month); var maxDays = newDate.daysInMonth(); // check whether the original day would overflow // and trim to the mont's maximum date newDate.setDate((fromDay > maxDays) ? maxDays : fromDay); return newDate; } function text(value) { if (!mainComponent || value === undefined) { return ""; } if (pickerWidth >= longFormatLimit) { return mainComponent.locale.monthName(value, Locale.LongFormat); } if (pickerWidth >= shortFormatLimit) { return mainComponent.locale.monthName(value, Locale.ShortFormat); } var thisDate = new Date(date); thisDate.setDate(1); thisDate.setMonth(value); return Qt.formatDate(thisDate, "MM"); } } ./src/Ubuntu/Components/Pickers/1.2/Picker.qml0000644000015600001650000004002112700370701021115 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype Picker \inqmlmodule Ubuntu.Components.Pickers 1.0 \ingroup ubuntu-pickers \brief Picker is a slot-machine style value selection component. The Picker lists the elements specified by the \l model using the \l delegate vertically using a slot-machine tumbler-like list. The selected item is always the one in the center of the component, and it is represented by the \l selectedIndex property. The elements can be either in a circular list or in a normal list. Delegates must be composed using PickerDelegate. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.Pickers 1.0 Picker { model: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"] delegate: PickerDelegate { Label { text: modelData } } selectedIndex: 5 onSelectedIndexChanged: { print("selected month: " + selectedIndex); } } \endqml \b Note: the \l selectedIndex must be set explicitly to the desired index if the model is set, filled or changed after the component is complete. In the following example the selected item must be set after the model is set. \qml Picker { selectedIndex: 5 // this will be set to 0 at the model completion delegate: PickerDelegate { Label { text: modelData } } Component.onCompleted: { var stack = []; for (var i = 0; i < 10; i++) { stack.push("Line " + i); } model = stack; // selectedIndex must be set explicitly selectedIndex = 3; } } \endqml \section3 Known issues \list \li [1] Circular picker does not react on touch generated flicks (on touch enabled devices) when nested into a Flickable - \l {https://bugreports.qt-project.org/browse/QTBUG-13690} and \l {https://bugreports.qt-project.org/browse/QTBUG-30840} \li [2] Circular picker sets \l selectedIndex to 0 when the model is cleared, contrary to linear one, which sets it to -1 - \l {https://bugreports.qt-project.org/browse/QTBUG-35400} \endlist */ StyledItem { id: picker /*! Property specifying whether the tumbler list is wrap-around (\a true), or normal (\a false). Default value is true. */ property bool circular: true /*! Specifies the model listing the content of the picker. */ property var model /*! The delegate visualizing the model elements. Any kind of component can be used as delegate, however it is recommended to use \l PickerDelegate, which integrates selection functionality into the Picker. */ property Component delegate /*! The property holds the index of the selected item */ property int selectedIndex /*! Defines whether the \l selectedIndex should be updated while the tumbler changes the selected item during draggingm or only when the tumbler's motion ends. The default behavior is non-live update. */ property bool live: false /*! The property holds whether the picker's view is moving due to the user interaction either by dragging, flicking or due to the manual change of the selectedIndex property. */ readonly property bool moving: (loader.item ? loader.item.moving : false) || movingPoll.indexChanging /*! The function positions the picker's view to the given index without animating the view. The component must be ready when calling the function, e.g. to make sure the Picker shows up at the given index, do the following: \qml Picker { model: 120 delegate: PickerDelegate { Label { anchors.fill: parent verticalCenter: Text.AlignVCenter text: modelData } } Component.onCompleted: positionViewAtIndex(10) } \endqml */ function positionViewAtIndex(index) { if (!loader.item || !internals.completed) { return; } loader.item.positionViewAtIndex(index, loader.isListView ? ListView.SnapPosition : PathView.SnapPosition); // update selectedIndex selectedIndex = loader.item.currentIndex; } activeFocusOnPress: true style: Theme.createStyleComponent("PickerStyle.qml", picker) /*! \internal */ property int __clickedIndex: -1 /*! \internal - required by bug1419667 */ property real __itemHeight: units.gu(4) // bind style instance's view property to the Loader's item Binding { target: __styleInstance property: "view" value: loader.item when: __styleInstance.hasOwnProperty("view") && loader.item } /* ListView/PathView do not change moding property when the current index is changed manually. Therefore we use an idle timer to poll the contentY to detect whether the views are still moving. PathView's currentIndex changes while the component is moving, however this is not true for ListView. */ Timer { id: movingPoll interval: 50 running: false property bool indexChanging: false property real prevContentY onTriggered: { if (prevContentY === loader.item.contentY) { indexChanging = false; } else { kick(); } } function kick() { if (!loader.item) return; indexChanging = true; prevContentY = loader.item.contentY; running = true; } } // tumbler Loader { id: loader objectName: "Picker_ViewLoader" asynchronous: false parent: __styleInstance.hasOwnProperty("tumblerHolder") ? __styleInstance.tumblerHolder : picker anchors.fill: parent sourceComponent: circular ? wrapAround : linear // property for loading completion property bool completed: item && (status === Loader.Ready) && item.viewCompleted // do we have a ListView or PathView? property bool isListView: (item && QuickUtils.className(item) === "QQuickListView") // update curentItem automatically when selectedIndex changes Binding { target: loader.item property: "currentIndex" value: picker.selectedIndex when: loader.completed && (picker.selectedIndex > 0) } // selectedIndex updater, live or non-live ones Connections { target: loader.item ignoreUnknownSignals: true onMovementEnded: { if (!loader.completed || !model) return; if (!picker.live) { picker.selectedIndex = loader.item.currentIndex; } } onCurrentIndexChanged: { movingPoll.kick(); if (!loader.completed) return; if (picker.live || (modelWatcher.modelSize() <= 0) || (picker.__clickedIndex >= 0 && (picker.__clickedIndex === loader.item.currentIndex)) || modelWatcher.cropping) { picker.selectedIndex = loader.item.currentIndex; modelWatcher.cropping = false; picker.__clickedIndex = -1; } } onModelChanged: { modelWatcher.connectModel(picker.model); if (!loader.completed) return; loader.moveToIndex((loader.completed) ? 0 : picker.selectedIndex); if (loader.completed && !picker.live) { picker.selectedIndex = 0; } } // focus handling onMoveStarted: picker.requestFocus(Qt.MouseFocusReason) onFlickStarted: picker.requestFocus(Qt.MouseFocusReason) } function moveToIndex(toIndex) { var count = (loader.item && loader.item.model) ? modelWatcher.modelSize() : -1; if (completed && count > 0) { if (loader.isListView) { loader.item.currentIndex = toIndex; return; } else { loader.item.positionViewAtIndex(count - 1, PathView.Center); loader.item.positionViewAtIndex(toIndex, PathView.Center); } } } Component.onCompleted: modelWatcher.connectModel(picker.model); Component.onDestruction: modelWatcher.disconnectModel() } // circular list Component { id: wrapAround PathView { id: pView objectName: "Picker_WrapAround" // property declared for PickerDelegate to be able to access the main component property Item pickerItem: picker // property holding view completion property bool viewCompleted: false // declared to ease moving detection property real contentY: offset anchors { top: parent ? parent.top : undefined bottom: parent ? parent.bottom : undefined horizontalCenter: parent ? parent.horizontalCenter : undefined } width: parent ? parent.width : 0 clip: true focus: true model: picker.model delegate: picker.delegate currentIndex: picker.selectedIndex // put the currentItem to the center of the view preferredHighlightBegin: 0.5 preferredHighlightEnd: 0.5 pathItemCount: pView.height / picker.__itemHeight snapMode: PathView.SnapToItem flickDeceleration: 100 property int contentHeight: pathItemCount * picker.__itemHeight path: Path { startX: pView.width / 2 startY: -(pView.contentHeight - pView.height) / 2 PathLine { x: pView.width / 2 y: pView.height + (pView.contentHeight - pView.height) / 2 } } Component.onCompleted: { var complete = true if (modelWatcher.isObjectModel()) { complete = (model.count > 0); if (model.count >= 2) { positionViewAtIndex(1, PathView.SnapPosition); positionViewAtIndex(0, PathView.SnapPosition); } } else if (Object.prototype.toString.call(model) === "[object Number]") { if (model >= 2) { positionViewAtIndex(1, PathView.SnapPosition); positionViewAtIndex(0, PathView.SnapPosition); } } viewCompleted = complete; } } } // linear list Component { id: linear ListView { id: lView objectName: "Picker_Linear" // property declared for PickerDelegate to be able to access the main component property Item pickerItem: picker // property holding view completion property bool viewCompleted: false anchors { top: parent ? parent.top : undefined bottom: parent ? parent.bottom : undefined horizontalCenter: parent ? parent.horizontalCenter : undefined } width: parent ? parent.width : 0 clip: true focus: true Mouse.onClicked: picker.requestFocus(Qt.MouseFocusReason) model: picker.model delegate: picker.delegate currentIndex: picker.selectedIndex preferredHighlightBegin: (height - (currentItem ? currentItem.height : 0)) / 2 preferredHighlightEnd: preferredHighlightBegin + (currentItem ? currentItem.height : 0) highlightRangeMode: ListView.StrictlyEnforceRange highlightMoveDuration: 300 flickDeceleration: 100 Component.onCompleted: viewCompleted = true } } /* Watch Picker's model to catch when elements are removed ro model is cleared. We need this to detect currentIndex changes in List/PathViews when non-live update mode is chosen, to know when do we need to update selectedIndex. */ QtObject { id: modelWatcher property var prevModel property bool cropping: false function isObjectModel() { return (prevModel && Object.prototype.toString.call(prevModel) === "[object Object]"); } function modelSize() { if (prevModel) { if (Object.prototype.toString.call(model) === "[object Object]") { return prevModel.count; } else if (Object.prototype.toString.call(model) === "[object Array]") { return prevModel.length; } else if (Object.prototype.toString.call(model) === "[object Number]") { return prevModel; } } return -1; } function connectModel(model) { disconnectModel(); prevModel = model; // check if the model is derived from QAbstractListModel if (model && Object.prototype.toString.call(model) === "[object Object]") { model.rowsAboutToBeRemoved.connect(itemsAboutToRemove); model.rowsInserted.connect(updateView); } } function disconnectModel() { if (isObjectModel()) { prevModel.rowsAboutToBeRemoved.disconnect(itemsAboutToRemove); prevModel.rowsInserted.disconnect(updateView); } } function updateView() { if (!loader.isListView && loader.item.count === 2) { // currentItem gets set upon first flick or move when the model is empty // at the time the component gets completed. Disable viewCompleted till // we move the view so selectedIndex doesn't get altered loader.item.viewCompleted = false; loader.item.positionViewAtIndex(1, PathView.SnapPosition); loader.item.positionViewAtIndex(0, PathView.SnapPosition); loader.item.viewCompleted = true; } } function itemsAboutToRemove(parent, start, end) { if ((end - start + 1) === loader.item.count) { cropping = true; } else if (selectedIndex >= start) { // Notify views that the model got cleared or got cropped // the loader.item.currentIndex is not yet updated, so we simply remember // that we need to update when currentIndex change is notified cropping = true; if (selectedIndex <= (start + end)) { // the selection is in between the removed indexes, so move the selection // to the closest available one loader.item.positionViewAtIndex(Math.max(start - 1, 0), (loader.isListView) ? ListView.SnapPosition : PathView.SnapPosition); } } } } } ./src/Ubuntu/Components/Pickers/1.2/PickerDelegate.qml0000644000015600001650000000352212700370701022555 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype PickerDelegate \inqmlmodule Ubuntu.Components.Pickers 1.0 \ingroup ubuntu-pickers \brief PickerDelegate component serves as base for Picker delegates. PickerDelegate is a holder component for delegates used in a Picker element. Each picker delegate must be derived from this type. */ AbstractButton { id: pickerDelegate /*! \qmlproperty Picker picker \readonly The property holds the Picker component the delegate belongs to. */ readonly property alias picker: internal.picker /*! \internal */ onClicked: { if (internal.itemList.currentIndex === index) return; picker.__clickedIndex = index; internal.itemList.currentIndex = index; } style: Theme.createStyleComponent("PickerDelegateStyle.qml", pickerDelegate) QtObject { id: internal property bool inListView: pickerDelegate.parent && (QuickUtils.className(pickerDelegate.parent) !== "QQuickPathView") property Item itemList: !inListView ? pickerDelegate.PathView.view : pickerDelegate.ListView.view property Picker picker: itemList ? itemList.pickerItem : null } } ./src/Ubuntu/Components/Pickers/qmldir0000644000015600001650000000133712700370701020107 0ustar jenkinsjenkinsmodule Ubuntu.Components.Pickers Picker 0.1 1.2/Picker.qml PickerDelegate 0.1 1.2/PickerDelegate.qml Dialer 0.1 1.2/Dialer.qml DialerHand 0.1 1.2/DialerHand.qml DatePicker 0.1 1.2/DatePicker.qml singleton PickerPanel 0.1 1.2/PickerPanel.qml #version 1.0 Picker 1.0 1.2/Picker.qml PickerDelegate 1.0 1.2/PickerDelegate.qml Dialer 1.0 1.2/Dialer.qml DialerHand 1.0 1.2/DialerHand.qml DatePicker 1.0 1.2/DatePicker.qml singleton PickerPanel 1.0 1.2/PickerPanel.qml ################################################# #version 1.3 Picker 1.3 1.3/Picker.qml PickerDelegate 1.3 1.3/PickerDelegate.qml Dialer 1.3 1.3/Dialer.qml DialerHand 1.3 1.3/DialerHand.qml DatePicker 1.3 1.3/DatePicker.qml singleton PickerPanel 1.3 1.3/PickerPanel.qml ./src/Ubuntu/Components/1.1/0000755000015600001650000000000012700370701015567 5ustar jenkinsjenkins./src/Ubuntu/Components/1.1/UbuntuColors.qml0000644000015600001650000000702112700370701020746 0ustar jenkinsjenkins/* Copyright 2014 Canonical Ltd. * This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; version 3. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ pragma Singleton import QtQuick 2.4 /*! \qmltype UbuntuColors \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Singleton defining the Ubuntu color palette. Each color of the Ubuntu color palette is accesible from it. For more information on how to appropriately use the colors according to the context, please refer to the \l{http://design.ubuntu.com/brand/colour-palette}{Ubuntu brand guidelines}. Example of use: \qml Rectangle { color: UbuntuColors.orange } \endqml */ QtObject { // old colors from UbuntuColors 1.0: /*! Orange. Recommended for branded elements, display progress and intensity, textual links on light backgrounds. */ readonly property color orange: "#DD4814" /*! \deprecated Ubuntu supporting color: light aubergine */ readonly property color lightAubergine: "#77216F" /*! \deprecated Ubuntu supporting color: mid aubergine */ readonly property color midAubergine: "#5E2750" /*! \deprecated Ubuntu supporting color: dark aubergine */ readonly property color darkAubergine: "#2C001E" /*! \deprecated Ubuntu neutral color: warm grey */ readonly property color warmGrey: "#AEA79F" /*! \deprecated Ubuntu neutral color: cool grey */ readonly property color coolGrey: "#333333" /*! Ubuntu orange gradient \sa Button::gradient */ property Gradient orangeGradient: Gradient { GradientStop { position: 0.0; color: "#DD4814" } GradientStop { position: 1.0; color: "#D9722D" } } /*! Ubuntu grey gradient \sa Button::gradient */ property Gradient greyGradient: Gradient { GradientStop { position: 0.0; color: "#888888" } GradientStop { position: 1.0; color: "#BBBBBB" } } // New colors introduced in UbuntuColors 1.1: /*! Light grey. Recommended for neutral action buttons and secondary text. \since Ubuntu.Components 1.1 */ readonly property color lightGrey: "#929292" /*! Dark grey. Recommended for text and action icons. \since Ubuntu.Components 1.1 */ readonly property color darkGrey: "#5d5d5d" /*! Red. Recommended for negative and irreversible action buttons, errors and alerts. \since Ubuntu.Components 1.1 */ readonly property color red: "#f32c36" /*! Green. Recommended for positive action buttons. \since Ubuntu.Components 1.1 */ readonly property color green: "#00a132" /*! Blue. Recommended for text selection and text cursor. \since Ubuntu.Components 1.1 */ readonly property color blue: "#12a3d8" /*! Purple. Recommended for proper nouns in list items. \since Ubuntu.Components 1.1 */ readonly property color purple: "#762572" } ./src/Ubuntu/Components/1.1/Icon.qml0000644000015600001650000000137512700370701017200 0ustar jenkinsjenkins/* * Copyright (C) 2014 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.4 import "../1.0" as Toolkit10 Toolkit10.Icon { property url source: name ? "image://theme/%1".arg(name) : "" } ./src/Ubuntu/Components/1.1/Button.qml0000644000015600001650000000757012700370701017566 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.1 /*! \qmltype Button \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Standard Ubuntu button. \l {http://design.ubuntu.com/apps/building-blocks/buttons}{See also the Design Guidelines on Buttons}. Examples: \qml Column { Button { text: "Send" onClicked: print("clicked text-only Button") } Button { iconName: "compose" gradient: UbuntuColors.greyGradient onClicked: print("clicked icon-only Button") } Button { iconName: "compose" text: "Icon on left" iconPosition: "left" onClicked: print("clicked text and icon Button") } } \endqml An \l Action can be used to specify \b clicked, iconSource and text. Example: \qml Item { Action { id: action1 text: "Click me" onTriggered: print("action!") iconName: "compose" } Button { anchors.centerIn: parent action: action1 color: UbuntuColors.warmGrey } } \endqml*/ AbstractButton { id: button /*! \since Ubuntu.Components 1.1 If set to a color, the button has a stroke border instead of a filled shape. */ property color strokeColor: Qt.rgba(0.0, 0.0, 0.0, 0.0) /*! \qmlproperty url Button::iconSource The source URL of the icon to display inside the button. Leave this value blank for a text-only button. If \l action is set, the default iconSource is that of the action. */ /*! The text to display in the button. If an icon was defined, the text will be shown next to the icon, otherwise it will be centered. Leave blank for an icon-only button. If \l action is set, the default text is that of the action. \qmlproperty string Button::text */ /*! The background color of the button. \sa gradient */ property color color: __styleInstance.defaultColor /*! The gradient used to fill the background of the button. Standard Ubuntu gradients are defined in \l UbuntuColors. If both a gradient and a color are specified, the gradient will be used. \sa color */ property Gradient gradient: __styleInstance.defaultGradient /*! The font used for the button's text. */ property font font: __styleInstance ? __styleInstance.defaultFont : Qt.font({family: "Ubuntu", pixelSize: FontUtils.sizeToPixels("medium")}) /*! The position of the icon relative to the text. Options are "left" and "right". The default value is "left". If only text or only an icon is defined, this property is ignored and the text or icon is centered horizontally and vertically in the button. Currently this is a string value. We are waiting for support for enums: https://bugreports.qt-project.org/browse/QTBUG-14861 */ property string iconPosition: "left" style: Theme.createStyleComponent("ButtonStyle.qml", button) } ./src/Ubuntu/Components/1.1/Haptics.qml0000644000015600001650000000470212700370701017700 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtFeedback 5.0 import Ubuntu.Components 1.1 Object { readonly property alias enabled: vibra.otherVibrate property alias effect: effect function play(customEffect) { if (!vibra.otherVibrate) { return; } if (effectData.data) { // we have a custom effect playing, stop it effect.stop(); } if (effect.running) { // this is a global effect, leave return; } if (customEffect) { effectData.backup(customEffect); } effect.start(); } QtObject { id: effectData property var data function backup(customEffect) { data = customEffect; for (var p in data) { var value = data[p]; data[p] = effect[p]; effect[p] = value; } } function restore() { for (var p in data) { effect[p] = data[p]; } data = undefined; } } // local feedback component used to play feedback HapticsEffect { id: effect attackIntensity: 0.0 attackTime: 50 intensity: 1.0 duration: 10 fadeTime: 50 fadeIntensity: 0.0 onStateChanged: { if (state == HapticsEffect.Stopped) { effectData.restore(); } } } // watch system settings for otherVibrate ServiceProperties { objectName: "system_effect_settings" id: vibra service: "org.freedesktop.Accounts" serviceInterface: "org.freedesktop.Accounts" path: "/org/freedesktop/Accounts" adaptorInterface: "com.ubuntu.touch.AccountsService.Sound" property bool otherVibrate: true } } ./src/Ubuntu/Components/1.1/ProgressBar.qml0000644000015600001650000000140112700370701020527 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import "../1.0" as Toolkit10 Toolkit10.ProgressBar { property bool showProgressPercentage: true } ./src/Ubuntu/Components/plugin/0000755000015600001650000000000012700370716016574 5ustar jenkinsjenkins./src/Ubuntu/Components/plugin/ucscalingimageprovider.cpp0000644000015600001650000000613612700370701024026 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include "ucscalingimageprovider.h" #include #include /*! \internal The UCScalingImageProvider class loads and scales images. It responds to URLs of the form "image://scaling/scale/path" where: - 'scale' is the scaling factor applied to the image - 'path' is the full path of the image on the filesystem Example: * image://scaling/0.5/arrow.png */ UCScalingImageProvider::UCScalingImageProvider() : QQuickImageProvider(QQuickImageProvider::Image) { } QImage UCScalingImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize) { int separatorPosition = id.indexOf("/"); float scaleFactor = id.left(separatorPosition).toFloat(); int fragmentPosition = id.lastIndexOf("#"); int pathLength = fragmentPosition > -1 ? fragmentPosition - separatorPosition - 1 : -1; QString path = id.mid(separatorPosition + 1, pathLength); QFile file(path); if (file.open(QIODevice::ReadOnly)) { QImage image; QImageReader imageReader(&file); QSize realSize = imageReader.size(); QSize scaledSize = realSize; QSize constrainedSize; if (!qFuzzyCompare(scaleFactor, (float)1.0)) { scaledSize = realSize * scaleFactor; } if (requestedSize.isValid() && (requestedSize.width() < realSize.width() || requestedSize.height() < realSize.height())) { if (requestedSize.width() > 0 && requestedSize.height() == 0 && scaledSize.width() > 0) { constrainedSize.setWidth(requestedSize.width()); constrainedSize.setHeight(scaledSize.height() * requestedSize.width() / scaledSize.width()); } else if (requestedSize.height() > 0 && requestedSize.width() == 0 && scaledSize.height() > 0) { constrainedSize.setHeight(requestedSize.height()); constrainedSize.setWidth(scaledSize.width() * requestedSize.height() / scaledSize.height()); } else { constrainedSize = scaledSize.scaled(requestedSize, Qt::KeepAspectRatio); } } if (!constrainedSize.isEmpty()) { imageReader.setScaledSize(constrainedSize); } else if (scaledSize != realSize) { imageReader.setScaledSize(scaledSize); } imageReader.read(&image); *size = scaledSize; return image; } else { return QImage(); } } ./src/Ubuntu/Components/plugin/quickutils.h0000644000015600001650000000567412700370714021154 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #ifndef QUICKUTILS_P_H #define QUICKUTILS_P_H #include #include #include class QQuickItem; class QQmlEngine; class QQmlComponent; class QuickUtils : public QObject { Q_OBJECT Q_PROPERTY(QQuickItem *rootObject READ rootObject NOTIFY rootObjectChanged) Q_PROPERTY(QString inputMethodProvider READ inputMethodProvider) Q_PROPERTY(bool touchScreenAvailable READ touchScreenAvailable NOTIFY touchScreenAvailableChanged) Q_PROPERTY(bool mouseAttached MEMBER m_mouseAttached NOTIFY mouseAttachedChanged) Q_PROPERTY(bool keyboardAttached MEMBER m_keyboardAttached NOTIFY keyboardAttachedChanged) public: static QuickUtils *instance(QObject *parent = Q_NULLPTR) { if (!m_instance) { if (!parent) { qFatal("Creating QuickUtils singleton requires a parent object!"); } m_instance = new QuickUtils(parent); } return m_instance; } ~QuickUtils() { m_instance = Q_NULLPTR; } QQuickItem *rootObject(); Q_INVOKABLE QQuickItem *rootItem(QObject *object); QString inputMethodProvider() const; bool touchScreenAvailable() const; Q_INVOKABLE static QString className(QObject *item); Q_REVISION(1) Q_INVOKABLE static bool inherits(QObject *object, const QString &fromClass); QObject* createQmlObject(const QUrl &url, QQmlEngine *engine); static bool showDeprecationWarnings(); static bool descendantItemOf(QQuickItem *item, const QQuickItem *parent); Q_INVOKABLE static QQuickItem *firstFocusableChild(QQuickItem *item); Q_INVOKABLE static QQuickItem *lastFocusableChild(QQuickItem *item); bool mouseAttached() { return m_mouseAttached; } bool keyboardAttached() { return m_keyboardAttached; } Q_SIGNALS: void rootObjectChanged(); void activated(); void deactivated(); void touchScreenAvailableChanged(); void mouseAttachedChanged(); void keyboardAttachedChanged(); protected: bool eventFilter(QObject *, QEvent *); private: explicit QuickUtils(QObject *parent = 0); QPointer m_rootView; QStringList m_omitIM; bool m_mouseAttached; bool m_keyboardAttached; static QuickUtils *m_instance; void lookupQuickView(); }; #endif // QUICKUTILS_P_H ./src/Ubuntu/Components/plugin/statesaverbackend_p.cpp0000644000015600001650000002166312700370701023312 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "statesaverbackend_p.h" #include "ucapplication.h" #include #include #include #include #include #include #include #include "i18n.h" #include "quickutils.h" #include #include "unixsignalhandler_p.h" StateSaverBackend *StateSaverBackend::m_instance = nullptr; StateSaverBackend::StateSaverBackend(QObject *parent) : QObject(parent) , m_archive(0) , m_globalEnabled(true) { // connect to application quit signal so when that is called, we can clean the states saved QObject::connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, &StateSaverBackend::cleanup); QObject::connect(QuickUtils::instance(), &QuickUtils::activated, this, &StateSaverBackend::reset); QObject::connect(QuickUtils::instance(), &QuickUtils::deactivated, this, &StateSaverBackend::initiateStateSaving); // catch eventual app name changes so we can have different path for the states if needed QObject::connect(UCApplication::instance(), &UCApplication::applicationNameChanged, this, &StateSaverBackend::initialize); if (!UCApplication::instance()->applicationName().isEmpty()) { initialize(); } UnixSignalHandler::instance().connectSignal(UnixSignalHandler::Terminate); UnixSignalHandler::instance().connectSignal(UnixSignalHandler::Interrupt); QObject::connect(&UnixSignalHandler::instance(), SIGNAL(signalTriggered(int)), this, SLOT(signalHandler(int))); } StateSaverBackend::~StateSaverBackend() { if (m_archive) { delete m_archive; } m_instance = nullptr; } void StateSaverBackend::initialize() { if (m_archive) { // delete previous archive QFile archiveFile(m_archive.data()->fileName()); archiveFile.remove(); delete m_archive.data(); m_archive.clear(); } QString applicationName(UCApplication::instance()->applicationName()); if (applicationName.isEmpty()) { qCritical() << "[StateSaver] Cannot create appstate file, application name not defined."; return; } // make sure the path is in sync with https://wiki.ubuntu.com/SecurityTeam/Specifications/ApplicationConfinement // the file must be saved under XDG_RUNTIME_DIR/ path. // NOTE!!: we cannot use QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation) // as that is going to perform a chmod +w on the path, see bug #1359831. Therefore we must // fetch the XDG_RUNTIME_DIR either from QStandardPaths::standardLocations() or from env var // see bug https://bugreports.qt-project.org/browse/QTBUG-41735 QString runtimeDir = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation); if (runtimeDir.isEmpty()) { runtimeDir = qgetenv("XDG_RUNTIME_DIR"); } if (runtimeDir.isEmpty()) { qCritical() << "[StateSaver] No XDG_RUNTIME_DIR path set, cannot create appstate file."; return; } m_archive = new QSettings(QString("%1/%2/statesaver.appstate"). arg(runtimeDir). arg(applicationName), QSettings::NativeFormat); m_archive->setFallbacksEnabled(false); } void StateSaverBackend::cleanup() { reset(); m_archive.clear(); } void StateSaverBackend::signalHandler(int type) { if (type == UnixSignalHandler::Interrupt) { Q_EMIT initiateStateSaving(); // disconnect aboutToQuit() so the state file doesn't get wiped upon quit QObject::disconnect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, &StateSaverBackend::cleanup); } QCoreApplication::quit(); } bool StateSaverBackend::enabled() const { return m_globalEnabled; } void StateSaverBackend::setEnabled(bool enabled) { if (m_globalEnabled != enabled) { m_globalEnabled = enabled; Q_EMIT enabledChanged(m_globalEnabled); if (!m_globalEnabled) { reset(); } } } bool StateSaverBackend::registerId(const QString &id) { if (m_register.contains(id)) { return false; } m_register.insert(id); return true; } void StateSaverBackend::removeId(const QString &id) { m_register.remove(id); } int StateSaverBackend::load(const QString &id, QObject *item, const QStringList &properties) { if (m_archive.isNull()) { return 0; } int result = 0; // save the previous group bool restorePreviousGroup = !m_archive->group().isEmpty(); if (restorePreviousGroup) { m_groupStack.push(m_archive->group()); // leave the group so we can read the next one m_archive->endGroup(); } m_archive.data()->beginGroup(id); QStringList propertyNames = m_archive.data()->childKeys(); Q_FOREACH(const QString &propertyName, propertyNames) { QVariant value = m_archive.data()->value(propertyName); if (!properties.contains(propertyName)) { // skip the property continue; } QQmlProperty qmlProperty(item, propertyName.toLocal8Bit().constData(), qmlContext(item)); if (qmlProperty.isValid() && qmlProperty.isWritable()) { QVariant type = m_archive.data()->value(propertyName + "_TYPE"); value.convert(type.toInt()); bool writeSuccess = qmlProperty.write(value); if (writeSuccess) { result++; } else { qmlInfo(item) << QStringLiteral("property \"%1\" of " "object %2 has type %3 and cannot be set to value \"%4\" of" " type %5").arg(propertyName) .arg(qmlContext(item)->nameForObject(item)) .arg(qmlProperty.propertyTypeName()) .arg(value.toString()) .arg(value.typeName()); } } else { qmlInfo(item) << QStringLiteral("property \"%1\" does not exist or is not writable for object %2") .arg(propertyName).arg(qmlContext(item)->nameForObject(item)); } } // drop cache once properties are successfully restored m_archive.data()->remove(""); m_archive.data()->endGroup(); // restore leaved group if needed if (restorePreviousGroup) { m_archive->beginGroup(m_groupStack.pop()); } return result; } int StateSaverBackend::save(const QString &id, QObject *item, const QStringList &properties) { if (m_archive.isNull()) { return 0; } m_archive.data()->beginGroup(id); int result = 0; Q_FOREACH(const QString &propertyName, properties) { QQmlProperty qmlProperty(item, propertyName.toLocal8Bit().constData()); if (qmlProperty.isValid()) { QVariant value = qmlProperty.read(); if (static_cast(value.type()) != QMetaType::QObjectStar) { if (value.userType() == qMetaTypeId()) { value = value.value().toVariant(); } m_archive.data()->setValue(propertyName, value); /* Save the type of the property along with its value. * This is important because QSettings deserializes values as QString. * Setting these strings to QML properties usually works because the * implicit type conversion from string to the type of the QML property * usually works. In some cases cases however (e.g. enum) it fails. * * See Qt Bug: https://bugreports.qt-project.org/browse/QTBUG-40474 */ m_archive.data()->setValue(propertyName + "_TYPE", QVariant::fromValue((int)value.type())); result++; } } } m_archive.data()->endGroup(); m_archive.data()->sync(); return result; } /* * The method resets the register and the state archive for the application. */ bool StateSaverBackend::reset() { m_register.clear(); if (m_archive) { QFile archiveFile(m_archive.data()->fileName()); return archiveFile.remove(); } return true; } ./src/Ubuntu/Components/plugin/qquickmimedata.h0000644000015600001650000000443512700370701021744 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef QQUICKMIMEDATA_H #define QQUICKMIMEDATA_H #include #include #include #include #include "qquickclipboard.h" class QQuickMimeData : public QObject { Q_OBJECT Q_PROPERTY(QStringList formats READ formats NOTIFY formatsChanged) Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) Q_PROPERTY(QString html READ html WRITE setHtml NOTIFY htmlChanged) Q_PROPERTY(QList urls READ urls WRITE setUrls NOTIFY urlsChanged) Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) Q_PROPERTY(QVariant data READ mimeData WRITE setMimeData NOTIFY dataChanged) public: explicit QQuickMimeData(QObject *parent = 0); QQuickMimeData(const QMimeData *refData, bool localData = true, QObject *parent = 0); ~QQuickMimeData(); QStringList formats() const; QString text() const; void setText(const QString &text); QString html() const; void setHtml(const QString &html); QList urls() const; void setUrls(const QList &urls); QColor color() const; void setColor(const QColor &color); QVariant mimeData() const; void setMimeData(const QVariant &mimeData); void fromMimeData(const QMimeData *data); QMimeData *toMimeData(); Q_SIGNALS: void formatsChanged(); void textChanged(); void htmlChanged(); void urlsChanged(); void colorChanged(); void typeChanged(); void dataChanged(); private: friend class QQuickClipboard; bool m_refData; QMimeData *m_mimeData; }; #endif // QQUICKMIMEDATA_H ./src/Ubuntu/Components/plugin/ucubuntushapeoverlay.h0000644000015600001650000000621612700370701023241 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Loïc Molinari */ #ifndef UCUBUNTUSHAPEOVERLAY_H #define UCUBUNTUSHAPEOVERLAY_H #include "ucubuntushape.h" // --- Scene graph shader --- class ShapeOverlayShader : public ShapeShader { public: ShapeOverlayShader(); virtual char const* const* attributeNames() const; }; // --- Scene graph material --- class ShapeOverlayMaterial : public ShapeMaterial { public: virtual QSGMaterialType* type() const; virtual QSGMaterialShader* createShader() const; }; // --- Scene graph node --- class ShapeOverlayNode : public QSGGeometryNode { public: struct Vertex { float position[2]; float shapeCoordinate[2]; float sourceCoordinate[4]; float yCoordinate; quint32 backgroundColor; float overlayCoordinate[2]; quint32 overlayColor; }; static const QSGGeometry::AttributeSet& attributeSet(); ShapeOverlayNode(); QSGGeometry* geometry() { return &m_geometry; } void preprocess() { m_material.updateTextures(); } private: ShapeOverlayMaterial m_material; QSGGeometry m_geometry; }; // --- QtQuick item --- class UCUbuntuShapeOverlay : public UCUbuntuShape { Q_OBJECT // Overlay properties. Q_PROPERTY(QRectF overlayRect READ overlayRect WRITE setOverlayRect NOTIFY overlayRectChanged) Q_PROPERTY(QColor overlayColor READ overlayColor WRITE setOverlayColor NOTIFY overlayColorChanged) public: UCUbuntuShapeOverlay(QQuickItem* parent=0); QRectF overlayRect() const { const float u16ToF32 = 1.0f / static_cast(0xffff); return QRectF(m_overlayX * u16ToF32, m_overlayY * u16ToF32, m_overlayWidth * u16ToF32, m_overlayHeight * u16ToF32); } void setOverlayRect(const QRectF& overlayRect); QColor overlayColor() const { return m_overlayColor; } void setOverlayColor(const QColor& overlayColor); Q_SIGNALS: void overlayRectChanged(); void overlayColorChanged(); protected: virtual QSGNode* createSceneGraphNode() const; virtual void updateGeometry( QSGNode* node, const QSizeF& itemSize, float radius, float shapeOffset, const QVector4D& sourceCoordTransform, const QVector4D& sourceMaskTransform, const quint32 backgroundColor[3]); private: quint16 m_overlayX; quint16 m_overlayY; quint16 m_overlayWidth; quint16 m_overlayHeight; QRgb m_overlayColor; Q_DISABLE_COPY(UCUbuntuShapeOverlay) }; QML_DECLARE_TYPE(UCUbuntuShapeOverlay) #endif // UCUBUNTUSHAPEOVERLAY_H ./src/Ubuntu/Components/plugin/listener.cpp0000644000015600001650000000210612700370701021116 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "listener.h" #include ContextPropertyChangeListener::ContextPropertyChangeListener(QQmlContext *context, const QString &contextProperty) : QObject(context), m_context(context), m_contextProperty(contextProperty) { } void ContextPropertyChangeListener::updateContextProperty() { QVariant value = m_context->contextProperty(m_contextProperty); m_context->setContextProperty(m_contextProperty, value); } ./src/Ubuntu/Components/plugin/ucaction.h0000644000015600001650000001173712700370701020555 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCACTION_H #define UCACTION_H #include #include #include #include #include #include #include // the function detects whether QML has an overridden trigger() slot available // and invokes the one with the appropriate signature template inline void invokeTrigger(T *object, const QVariant &value) { bool invoked = false; const QMetaObject *mo = object->metaObject(); int offset = mo->methodOffset(); int paramlessTriggerIndex = mo->indexOfSlot("trigger()") - offset; int paramTriggerIndex = mo->indexOfSlot("trigger(QVariant)") - offset; /* if we have the parametered version, call that even if the value given is invalid */ if (paramTriggerIndex >= 0) { invoked = QMetaObject::invokeMethod(object, "trigger", Q_ARG(QVariant, value)); } else if (paramlessTriggerIndex >= 0) { invoked = QMetaObject::invokeMethod(object, "trigger"); } if (!invoked) { object->trigger(value); } } class QQmlComponent; class QQuickItem; class UCActionAttached; class UCAction : public QObject { Q_OBJECT // transferred from Unity Actions Q_ENUMS(Type) Q_PROPERTY(QString name MEMBER m_name WRITE setName NOTIFY nameChanged) Q_PROPERTY(QString text READ text WRITE setText RESET resetText NOTIFY textChanged) Q_PROPERTY(QString iconName MEMBER m_iconName WRITE setIconName NOTIFY iconNameChanged) Q_PROPERTY(QString description MEMBER m_description NOTIFY descriptionChanged) Q_PROPERTY(QString keywords MEMBER m_keywords NOTIFY keywordsChanged) Q_PROPERTY(bool enabled MEMBER m_enabled NOTIFY enabledChanged) Q_PROPERTY(Type parameterType MEMBER m_parameterType NOTIFY parameterTypeChanged) // Toolkit Actions API Q_PROPERTY(QUrl iconSource MEMBER m_iconSource WRITE setIconSource NOTIFY iconSourceChanged) Q_PROPERTY(bool visible MEMBER m_visible NOTIFY visibleChanged) Q_PROPERTY(QQmlComponent *itemHint MEMBER m_itemHint WRITE setItemHint) // QtQuickControls.Action Q_PROPERTY(QVariant shortcut MEMBER m_shortcut WRITE setShortcut RESET resetShortcut NOTIFY shortcutChanged REVISION 1) public: enum Type { None, String, Integer, Bool, Real, Object = 0xFF }; explicit UCAction(QObject *parent = 0); ~UCAction(); inline bool isPublished() const { return m_published; } inline bool isEnabled() const { return m_enabled; } inline QQuickItem *lastOwningItem() const { return m_owningItems.count() > 0 ? m_owningItems.at(m_owningItems.count() - 1) : Q_NULLPTR; } void addOwningItem(QQuickItem *item); void removeOwningItem(QQuickItem *item); void setName(const QString &name); QString text(); void setText(const QString &text); void resetText(); void setIconName(const QString &name); void setIconSource(const QUrl &url); void setItemHint(QQmlComponent *); void setShortcut(const QVariant&); void resetShortcut(); Q_SIGNALS: void nameChanged(); void textChanged(); void iconNameChanged(); void descriptionChanged(); void keywordsChanged(); void enabledChanged(); void parameterTypeChanged(); void iconSourceChanged(); void visibleChanged(); void shortcutChanged(); void triggered(const QVariant &value); public Q_SLOTS: void trigger(const QVariant &value = QVariant()); private: QPODVector m_owningItems; QString m_name; QString m_text; QString m_iconName; QUrl m_iconSource; QString m_description; QString m_keywords; QVariant m_shortcut; QKeySequence m_mnemonic; QQmlComponent *m_itemHint; Type m_parameterType; bool m_factoryIconSource:1; bool m_enabled:1; bool m_visible:1; bool m_published:1; friend class UCActionContext; friend class UCActionItem; friend class UCActionItemPrivate; friend class UCListItemPrivate; friend class UCListItemAttached; friend class UCListItemActionsPrivate; bool isValidType(QVariant::Type valueType); void generateName(); void setMnemonicFromText(const QString &text); bool event(QEvent *event); void onKeyboardAttached(); }; QML_DECLARE_TYPE(UCAction) #endif // UCACTION_H ./src/Ubuntu/Components/plugin/ucubuntushape.h0000644000015600001650000003562412700370701021644 0ustar jenkinsjenkins/* * Copyright 2013-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Loïc Molinari */ #ifndef UCUBUNTUSHAPE_H #define UCUBUNTUSHAPE_H #include #include #include #include #include "ucimportversionchecker_p.h" // --- Scene graph shader --- class ShapeShader : public QSGMaterialShader { public: ShapeShader(); virtual char const* const* attributeNames() const; virtual void initialize(); virtual void updateState( const RenderState& state, QSGMaterial* newEffect, QSGMaterial* oldEffect); bool useDistanceFields() const { return m_useDistanceFields; } private: QOpenGLFunctions* m_functions; bool m_useDistanceFields; int m_matrixId; int m_opacityFactorsId; int m_sourceOpacityId; int m_distanceAAId; int m_texturedId; int m_aspectId; }; // --- Scene graph material --- class ShapeMaterial : public QSGMaterial { public: struct Data { enum { Textured = (1 << 0), HorizontallyRepeated = (1 << 1), VerticallyRepeated = (1 << 2), Repeated = (HorizontallyRepeated | VerticallyRepeated), Flat = (1 << 3), Inset = (1 << 4), DropShadow = (1 << 5), AspectMask = (Flat | Inset | DropShadow), Pressed = (1 << 6) }; QSGTextureProvider* sourceTextureProvider; quint32 shapeTextureId; quint8 distanceAAFactor; quint8 sourceOpacity; quint8 flags; }; ShapeMaterial(); virtual QSGMaterialType* type() const; virtual QSGMaterialShader* createShader() const; virtual int compare(const QSGMaterial* other) const; virtual void updateTextures(); const Data* constData() const { return &m_data; } Data* data() { return &m_data; } private: Data m_data; }; // --- Scene graph node --- class ShapeNode : public QSGGeometryNode { public: struct Vertex { float position[2]; float shapeCoordinate[2]; float sourceCoordinate[4]; float yCoordinate; quint32 backgroundColor; }; static const int indexCount = 14; static const int indexType = GL_UNSIGNED_SHORT; static const int indexTypeSize = sizeof(unsigned short); static const int vertexCount = 9; static const QSGGeometry::DataPattern indexDataPattern = QSGGeometry::StaticPattern; static const QSGGeometry::DataPattern vertexDataPattern = QSGGeometry::AlwaysUploadPattern; static const GLenum drawingMode = GL_TRIANGLE_STRIP; static const unsigned short* indices(); static const QSGGeometry::AttributeSet& attributeSet(); ShapeNode(); ShapeMaterial* material() { return &m_material; } QSGGeometry* geometry() { return &m_geometry; } void preprocess() { m_material.updateTextures(); } private: ShapeMaterial m_material; QSGGeometry m_geometry; }; // --- QtQuick item --- class UCUbuntuShape : public QQuickItem, public UCImportVersionChecker { Q_OBJECT // Shape properties. Q_ENUMS(Aspect) Q_PROPERTY(QString radius READ radius WRITE setRadius NOTIFY radiusChanged) Q_PROPERTY(Aspect aspect READ aspect WRITE setAspect NOTIFY aspectChanged REVISION 1) Q_PROPERTY(qreal relativeRadius READ relativeRadius WRITE setRelativeRadius NOTIFY relativeRadiusChanged REVISION 2) // Source properties. Q_ENUMS(FillMode) Q_ENUMS(WrapMode) Q_ENUMS(HAlignment) Q_ENUMS(VAlignment) Q_PROPERTY(QVariant source READ source WRITE setSource NOTIFY sourceChanged REVISION 1) Q_PROPERTY(qreal sourceOpacity READ sourceOpacity WRITE setSourceOpacity NOTIFY sourceOpacityChanged REVISION 1) Q_PROPERTY(FillMode sourceFillMode READ sourceFillMode WRITE setSourceFillMode NOTIFY sourceFillModeChanged REVISION 1) Q_PROPERTY(WrapMode sourceHorizontalWrapMode READ sourceHorizontalWrapMode WRITE setSourceHorizontalWrapMode NOTIFY sourceHorizontalWrapModeChanged REVISION 1) Q_PROPERTY(WrapMode sourceVerticalWrapMode READ sourceVerticalWrapMode WRITE setSourceVerticalWrapMode NOTIFY sourceVerticalWrapModeChanged REVISION 1) Q_PROPERTY(HAlignment sourceHorizontalAlignment READ sourceHorizontalAlignment WRITE setSourceHorizontalAlignment NOTIFY sourceHorizontalAlignmentChanged REVISION 1) Q_PROPERTY(VAlignment sourceVerticalAlignment READ sourceVerticalAlignment WRITE setSourceVerticalAlignment NOTIFY sourceVerticalAlignmentChanged REVISION 1) Q_PROPERTY(QVector2D sourceTranslation READ sourceTranslation WRITE setSourceTranslation NOTIFY sourceTranslationChanged REVISION 1) Q_PROPERTY(QVector2D sourceScale READ sourceScale WRITE setSourceScale NOTIFY sourceScaleChanged REVISION 1) // Background properties. Q_ENUMS(BackgroundMode) Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor NOTIFY backgroundColorChanged REVISION 1) Q_PROPERTY(QColor secondaryBackgroundColor READ secondaryBackgroundColor WRITE setSecondaryBackgroundColor NOTIFY secondaryBackgroundColorChanged REVISION 1) Q_PROPERTY(BackgroundMode backgroundMode READ backgroundMode WRITE setBackgroundMode NOTIFY backgroundModeChanged REVISION 1) // Deprecated properties. Q_PROPERTY(QString borderSource READ borderSource WRITE setBorderSource NOTIFY borderSourceChanged) Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) Q_PROPERTY(QColor gradientColor READ gradientColor WRITE setGradientColor NOTIFY gradientColorChanged) Q_PROPERTY(QVariant image READ image WRITE setImage NOTIFY imageChanged) Q_PROPERTY(bool stretched READ stretched WRITE setStretched NOTIFY stretchedChanged) Q_PROPERTY(HAlignment horizontalAlignment READ horizontalAlignment WRITE setHorizontalAlignment NOTIFY horizontalAlignmentChanged) Q_PROPERTY(VAlignment verticalAlignment READ verticalAlignment WRITE setVerticalAlignment NOTIFY verticalAlignmentChanged) public: UCUbuntuShape(QQuickItem* parent=0); static bool useDistanceFields(const QOpenGLContext* openglContext); enum Version { Version12 = 0 /* Or lesser */, Version13 = 1 }; enum Aspect { Flat = 0, Inset = 1, DropShadow = 2 }; // Don't forget to update private enum. enum BackgroundMode { SolidColor = 0, VerticalGradient = 1 }; enum HAlignment { AlignLeft = 0, AlignHCenter = 1, AlignRight = 2 }; enum VAlignment { AlignTop = 0, AlignVCenter = 1, AlignBottom = 2 }; enum FillMode { Stretch = 0, PreserveAspectFit = 1, PreserveAspectCrop = 2, Pad = 3 }; enum WrapMode { Transparent = 0, Repeat = 1 }; QString radius() const { return (m_radius == Small) ? "small" : ((m_radius == Medium) ? "medium" : "large"); } void setRadius(const QString& radius); Aspect aspect() const { return (m_flags & AspectSet) ? static_cast(m_aspect) : Flat; } void setAspect(Aspect aspect); qreal relativeRadius() const { return m_relativeRadius * 0.01; } void setRelativeRadius(qreal relativeRadius); QVariant source() const { return QVariant::fromValue((m_flags & SourceApiSet) ? m_source : NULL); } void setSource(const QVariant& source); qreal sourceOpacity() const { return m_sourceOpacity / static_cast(0xff); } void setSourceOpacity(qreal sourceOpacity); FillMode sourceFillMode() const { return m_sourceFillMode; } void setSourceFillMode(FillMode sourceFillMode); WrapMode sourceHorizontalWrapMode() const { return m_sourceHorizontalWrapMode; } void setSourceHorizontalWrapMode(WrapMode sourceHorizontalWrapMode); WrapMode sourceVerticalWrapMode() const { return m_sourceVerticalWrapMode; } void setSourceVerticalWrapMode(WrapMode sourceVerticalWrapMode); HAlignment sourceHorizontalAlignment() const { return m_sourceHorizontalAlignment; } void setSourceHorizontalAlignment(HAlignment sourceHorizontalAlignment); VAlignment sourceVerticalAlignment() const { return m_sourceVerticalAlignment; } void setSourceVerticalAlignment(VAlignment sourceVerticalAlignment); QVector2D sourceTranslation() const { return m_sourceTranslation; } void setSourceTranslation(const QVector2D& sourceTranslation); QVector2D sourceScale() const { return m_sourceScale; } void setSourceScale(const QVector2D& sourceScale); QColor backgroundColor() const { return (m_flags & BackgroundApiSet) ? QColor(qRed(m_backgroundColor), qGreen(m_backgroundColor), qBlue(m_backgroundColor), qAlpha(m_backgroundColor)) : QColor(0, 0, 0, 0); } void setBackgroundColor(const QColor& backgroundColor); QColor secondaryBackgroundColor() const { return (m_flags & BackgroundApiSet) ? QColor(qRed(m_secondaryBackgroundColor), qGreen(m_secondaryBackgroundColor), qBlue(m_secondaryBackgroundColor), qAlpha(m_secondaryBackgroundColor)) : QColor(0, 0, 0, 0); } void setSecondaryBackgroundColor(const QColor& secondaryBackgroundColor); BackgroundMode backgroundMode() const { return m_backgroundMode; } void setBackgroundMode(BackgroundMode backgroundMode); QString borderSource() const { return (m_flags & AspectSet) ? "" : ((m_aspect == Flat) ? "" : ((m_aspect == Inset) ? "radius_idle.sci" : "radius_pressed.sci")); } void setBorderSource(const QString& borderSource); QColor color() const { return (m_flags & BackgroundApiSet) ? QColor(0, 0, 0, 0) : QColor(qRed(m_backgroundColor), qGreen(m_backgroundColor), qBlue(m_backgroundColor), qAlpha(m_backgroundColor)); } void setColor(const QColor& color); QColor gradientColor() const { return (m_flags & BackgroundApiSet) ? QColor(0, 0, 0, 0) : QColor(qRed(m_secondaryBackgroundColor), qGreen(m_secondaryBackgroundColor), qBlue(m_secondaryBackgroundColor), qAlpha(m_secondaryBackgroundColor)); } void setGradientColor(const QColor& gradientColor); QVariant image() const { return QVariant::fromValue((m_flags & SourceApiSet) ? NULL : m_source); } void setImage(const QVariant& image); bool stretched() const { return !!(m_flags & Stretched); } void setStretched(bool stretched); HAlignment horizontalAlignment() const { return m_imageHorizontalAlignment; } void setHorizontalAlignment(HAlignment horizontalAlignment); VAlignment verticalAlignment() const { return m_imageVerticalAlignment; } void setVerticalAlignment(VAlignment verticalAlignment); Q_SIGNALS: void radiusChanged(); Q_REVISION(1) void aspectChanged(); Q_REVISION(2) void relativeRadiusChanged(); Q_REVISION(1) void sourceChanged(); Q_REVISION(1) void sourceOpacityChanged(); Q_REVISION(1) void sourceFillModeChanged(); Q_REVISION(1) void sourceHorizontalWrapModeChanged(); Q_REVISION(1) void sourceVerticalWrapModeChanged(); Q_REVISION(1) void sourceHorizontalAlignmentChanged(); Q_REVISION(1) void sourceVerticalAlignmentChanged(); Q_REVISION(1) void sourceTranslationChanged(); Q_REVISION(1) void sourceScaleChanged(); Q_REVISION(1) void backgroundColorChanged(); Q_REVISION(1) void secondaryBackgroundColorChanged(); Q_REVISION(1) void backgroundModeChanged(); void borderSourceChanged(); void colorChanged(); void gradientColorChanged(); void imageChanged(); void stretchedChanged(); void horizontalAlignmentChanged(); void verticalAlignmentChanged(); protected: virtual QString propertyForVersion(quint16 version) const; virtual void componentComplete(); virtual QSGNode* updatePaintNode(QSGNode* oldNode, UpdatePaintNodeData* data); virtual void geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry); // Virtual functions for extended shapes. virtual QSGNode* createSceneGraphNode() const; virtual void updateMaterial(QSGNode* node, float radius, quint32 shapeTextureId, bool textured); virtual void updateGeometry( QSGNode* node, const QSizeF& itemSize, float radius, float shapeOffset, const QVector4D& sourceCoordTransform, const QVector4D& sourceMaskTransform, const quint32 backgroundColor[3]); private Q_SLOTS: void _q_imagePropertiesChanged(); void _q_gridUnitChanged(); void _q_providerDestroyed(QObject* object=0); void _q_textureChanged(); private: bool isVersionGreaterThanOrEqual(Version version); void updateFromImageProperties(QQuickItem* image); void connectToPropertyChange( QObject* sender, const char* property, QObject* receiver, const char* slot); void connectToImageProperties(QQuickItem* image); void dropColorSupport(); void dropImageSupport(); void updateSourceTransform( float itemWidth, float itemHeight, FillMode fillMode, HAlignment horizontalAlignment, VAlignment verticalAlignment, const QSize& textureSize); enum Radius { Small = 0, Medium = 1, Large = 2 }; enum { Pressed = 3 }; // Aspect extension (to keep support for deprecated aspects). enum { AspectSet = (1 << 0), GradientColorSet = (1 << 1), BackgroundApiSet = (1 << 2), SourceApiSet = (1 << 3), Stretched = (1 << 4), DirtySourceTransform = (1 << 5) }; QQuickItem* m_source; QSGTextureProvider* m_sourceTextureProvider; QRgb m_backgroundColor; QRgb m_secondaryBackgroundColor; QVector2D m_sourceScale; QVector2D m_sourceTranslation; QVector4D m_sourceTransform; quint8 m_relativeRadius; Radius m_radius : 2; quint8 m_aspect : 3; HAlignment m_imageHorizontalAlignment : 2; VAlignment m_imageVerticalAlignment : 2; BackgroundMode m_backgroundMode : 1; HAlignment m_sourceHorizontalAlignment : 2; VAlignment m_sourceVerticalAlignment : 2; FillMode m_sourceFillMode : 2; WrapMode m_sourceHorizontalWrapMode : 1; WrapMode m_sourceVerticalWrapMode : 1; Version m_version : 1; quint8 __explicit_padding : 5; quint8 m_sourceOpacity; quint8 m_flags; Q_DISABLE_COPY(UCUbuntuShape) }; QML_DECLARE_TYPE(UCUbuntuShape) #endif // UCUBUNTUSHAPE_H ./src/Ubuntu/Components/plugin/ucbottomedgehint_p.h0000644000015600001650000000247212700370701022627 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: Zsombor Egri */ #ifndef UCBOTTOMEDGEHINT_P #define UCBOTTOMEDGEHINT_P #include "ucbottomedgehint.h" #include "ucactionitem_p.h" class UCBottomEdgeHintPrivate : public UCActionItemPrivate { Q_DECLARE_PUBLIC(UCBottomEdgeHint) public: static UCBottomEdgeHintPrivate *get(UCBottomEdgeHint *item) { return item->d_func(); } UCBottomEdgeHintPrivate(); void init(); QBasicTimer deactivationTimer; UCSwipeArea *swipeArea; QQuickFlickable *flickable; PropertyChange *flickableBottomMargin; int deactivateTimeout; UCBottomEdgeHint::Status status; bool pressed:1; }; #endif // UCBOTTOMEDGEHINT_P ./src/Ubuntu/Components/plugin/ucbottomedgestyle.h0000644000015600001650000000357512700370701022513 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCBOTTOMEDGESTYLE_H #define UCBOTTOMEDGESTYLE_H #include class QQuickItem; class QQuickAbstractAnimation; class UCBottomEdge; class UCBottomEdgeStyle : public QQuickItem { Q_OBJECT Q_PROPERTY(QQuickItem* panel MEMBER m_panel NOTIFY panelChanged FINAL) Q_PROPERTY(QQuickItem* contentItem MEMBER m_contentItem NOTIFY contentItemChanged FINAL) Q_PROPERTY(QQuickAbstractAnimation *panelAnimation MEMBER m_panelAnimation NOTIFY panelAnimationChanged FINAL) Q_PROPERTY(qreal revealThreshold MEMBER m_revealThreshold NOTIFY revealThresholdChanged FINAL) public: explicit UCBottomEdgeStyle(QQuickItem *parent = 0) : QQuickItem(parent) {} void setConsumeMouse(bool consume); Q_SIGNALS: void panelChanged(); void contentItemChanged(); void panelAnimationChanged(); void revealThresholdChanged(); protected: void mousePressEvent(QMouseEvent *event); private: QQuickItem *m_panel = nullptr; QQuickItem *m_contentItem = nullptr; QQuickAbstractAnimation *m_panelAnimation = nullptr; qreal m_revealThreshold = 0.; friend class UCBottomEdge; friend class UCBottomEdgePrivate; }; #endif // UCBOTTOMEDGESTYLE_H ./src/Ubuntu/Components/plugin/livetimer.h0000644000015600001650000000351412700370701020742 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef LIVETIMER_H #define LIVETIMER_H #include #include class LiveTimer : public QObject { Q_OBJECT Q_ENUMS(Frequency) Q_PROPERTY(Frequency frequency READ frequency WRITE setFrequency NOTIFY frequencyChanged) Q_PROPERTY(QDateTime relativeTime READ relativeTime WRITE setRelativeTime NOTIFY relativeTimeChanged) public: explicit LiveTimer(QObject *parent = 0); ~LiveTimer(); enum Frequency { Disabled = 0, Second = 1, Minute = 2, Hour = 3, Relative = 4 }; Frequency frequency() const { return m_frequency; } void setFrequency(Frequency frequency); QDateTime relativeTime() const { return m_relativeTime; } void setRelativeTime(const QDateTime& relativeTime); Frequency effectiveFrequency() const { return m_effectiveFrequency; } Q_SIGNALS: void frequencyChanged(); void relativeTimeChanged(); void trigger(); private: void registerTimer(); void unregisterTimer(); void setEffectiveFrequency(Frequency frequency); Frequency m_frequency; Frequency m_effectiveFrequency; QDateTime m_relativeTime; quint64 m_lastUpdate; friend class SharedLiveTimer; }; #endif // LIVETIMER_H ./src/Ubuntu/Components/plugin/ucqquickimageextension.h0000644000015600001650000000342112700370701023524 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #ifndef QQUICKIMAGEEXTENSION_H #define QQUICKIMAGEEXTENSION_H #include #include #include #include #include #include class QQuickImageBase; class UCQQuickImageExtension : public QObject { Q_OBJECT Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY extendedSourceChanged) public: explicit UCQQuickImageExtension(QObject *parent = 0); QUrl source() const; virtual void setSource(const QUrl& url); Q_SIGNALS: void extendedSourceChanged(); protected Q_SLOTS: void reloadSource(); protected: bool rewriteSciFile(const QString &sciFilePath, const QString &scaleFactor, QTextStream& output); QString scaledBorder(const QString &border, const QString &scaleFactor); QString scaledSource(QString source, const QString &sciFilePath, const QString &scaleFactor); private: QQuickImageBase* m_image; QUrl m_source; static QHash > s_rewrittenSciFiles; }; #endif // QQUICKIMAGEEXTENSION_H ./src/Ubuntu/Components/plugin/shaders/0000755000015600001650000000000012700370701020217 5ustar jenkinsjenkins./src/Ubuntu/Components/plugin/shaders/shape.frag0000644000015600001650000001233712700370701022166 0ustar jenkinsjenkins#extension GL_OES_standard_derivatives : enable // Enable dFdy() on OpenGL ES 2. // Copyright © 2015 Canonical Ltd. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; version 3. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see . // // Author: Loïc Molinari // Static flow control (branching on a uniform value) is fast on most GPUs (including ultra-low // power ones) because it allows to use the same shader execution path for an entire draw call. We // rely on that technique here (also known as "uber-shader" solution) to avoid the complexity of // dealing with a multiple shaders solution. // FIXME(loicm) Validate GPU behavior with regards to static flow control. uniform sampler2D shapeTexture; uniform sampler2D sourceTexture; uniform lowp vec2 opacityFactors; uniform lowp float sourceOpacity; uniform lowp float distanceAA; uniform bool textured; uniform mediump int aspect; varying mediump vec2 shapeCoord; varying mediump vec4 sourceCoord; varying lowp float yCoord; varying lowp vec4 backgroundColor; const mediump int FLAT = 0x08; // 1 << 3 const mediump int INSET = 0x10; // 1 << 4 const mediump int DROP_SHADOW = 0x20; // 1 << 5 void main(void) { lowp vec4 shapeData = texture2D(shapeTexture, shapeCoord); lowp vec4 color = backgroundColor; if (textured) { // Blend the source over the current color. // FIXME(loicm) sign() is far from optimal. Call texture2D() at beginning of scope. lowp vec2 axisMask = -sign((sourceCoord.zw * sourceCoord.zw) - vec2(1.0)); lowp float mask = clamp(axisMask.x + axisMask.y, 0.0, 1.0); lowp vec4 source = texture2D(sourceTexture, sourceCoord.st) * vec4(sourceOpacity * mask); color = vec4(1.0 - source.a) * color + source; } // Get the normalized distance between two pixels using screen-space derivatives of shape // texture coordinate. dFd*() functions have to be called outside of branches in order to work // correctly with VMware's "Gallium 0.4 on SVGA3D". lowp float dist = length(vec2(dFdx(shapeCoord.s), dFdy(shapeCoord.s))); if (aspect == FLAT) { // Mask the current color with an anti-aliased and resolution independent shape mask built // from distance fields. lowp float distanceMin = abs(dist) * -distanceAA + 0.5; lowp float distanceMax = abs(dist) * distanceAA + 0.5; color *= smoothstep(distanceMin, distanceMax, shapeData.b); } else if (aspect == INSET) { // The vertex layout of the shape is made so that the derivative is negative from top to // middle and positive from middle to bottom. lowp float shapeSide = yCoord <= 0.0 ? 0.0 : 1.0; // Blend the shape inner shadow over the current color. The shadow color is black, its // translucency is stored in the texture. lowp float shadow = shapeData[int(shapeSide)]; color = vec4(1.0 - shadow) * color + vec4(0.0, 0.0, 0.0, shadow); // Get the anti-aliased and resolution independent shape mask using distance fields. lowp float distanceMin = abs(dist) * -distanceAA + 0.5; lowp float distanceMax = abs(dist) * distanceAA + 0.5; lowp vec2 mask = smoothstep(distanceMin, distanceMax, shapeData.ba); // Get the bevel color. The bevel is made of the top mask masked with the bottom mask. A // gradient from the bottom (1) to the middle (0) of the shape is used to factor out values // resulting from the mask anti-aliasing. The bevel color is white with 60% opacity. lowp float bevel = (mask.x * -mask.y) + mask.x; // -ab + a = a(1 - b) lowp float gradient = clamp((shapeSide * -shapeCoord.t) + shapeSide, 0.0, 1.0); bevel *= gradient * 0.6; // Mask the current color then blend the bevel over the resulting color. We simply use // additive blending since the bevel has already been masked. color = (color * vec4(mask[int(shapeSide)])) + vec4(bevel); } else if (aspect == DROP_SHADOW) { // Get the anti-aliased and resolution independent shape mask using distance fields. lowp float distanceMin = abs(dist) * -distanceAA + 0.5; lowp float distanceMax = abs(dist) * distanceAA + 0.5; lowp int shapeSide = yCoord <= 0.0 ? 0 : 1; lowp float mask = smoothstep(distanceMin, distanceMax, shapeData[shapeSide]); // Get the shadow color outside of the shape mask. lowp float shadow = (shapeData.b * -mask) + shapeData.b; // -ab + a = a(1 - b) // Mask the current color then blend the shadow over the resulting color. We simply use // additive blending since the shadow has already been masked. color = (color * vec4(mask)) + vec4(0.0, 0.0, 0.0, shadow); } gl_FragColor = color * opacityFactors.xxxy; } ./src/Ubuntu/Components/plugin/shaders/shapeoverlay.vert0000644000015600001650000000326412700370701023630 0ustar jenkinsjenkins// Copyright © 2015 Canonical Ltd. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; version 3. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see . // // Author: Loïc Molinari uniform highp mat4 matrix; // mediump was interpreted as lowp on PowerVR Rogue G6200 (arale). uniform bool textured; attribute highp vec4 positionAttrib; // highp because of matrix precision qualifier. attribute mediump vec2 shapeCoordAttrib; attribute mediump vec4 sourceCoordAttrib; attribute lowp float yCoordAttrib; attribute lowp vec4 backgroundColorAttrib; attribute mediump vec2 overlayCoordAttrib; attribute lowp vec4 overlayColorAttrib; // FIXME(loicm) Optimize by reducing/packing varyings. varying mediump vec2 shapeCoord; varying mediump vec4 sourceCoord; varying lowp float yCoord; varying lowp vec4 backgroundColor; varying mediump vec2 overlayCoord; varying lowp vec4 overlayColor; void main() { shapeCoord = shapeCoordAttrib; if (textured) { sourceCoord = sourceCoordAttrib; } yCoord = yCoordAttrib; backgroundColor = backgroundColorAttrib; overlayCoord = overlayCoordAttrib; overlayColor = overlayColorAttrib; gl_Position = matrix * positionAttrib; } ./src/Ubuntu/Components/plugin/shaders/shapeoverlay_mipmap.frag0000644000015600001650000001112412700370701025124 0ustar jenkinsjenkins// Copyright © 2015 Canonical Ltd. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; version 3. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see . // // Author: Loïc Molinari // Static flow control (branching on a uniform value) is fast on most GPUs (including ultra-low // power ones) because it allows to use the same shader execution path for an entire draw call. We // rely on that technique here (also known as "uber-shader" solution) to avoid the complexity of // dealing with a multiple shaders solution. // FIXME(loicm) Validate GPU behavior with regards to static flow control. uniform sampler2D shapeTexture; uniform sampler2D sourceTexture; uniform lowp vec2 opacityFactors; uniform lowp float dfdtFactor; uniform lowp float sourceOpacity; uniform lowp float distanceAA; uniform bool textured; uniform mediump int aspect; varying mediump vec2 shapeCoord; varying mediump vec4 sourceCoord; varying lowp float yCoord; varying lowp vec4 backgroundColor; varying mediump vec2 overlayCoord; varying lowp vec4 overlayColor; const mediump int FLAT = 0x08; // 1 << 3 const mediump int INSET = 0x10; // 1 << 4 const mediump int DROP_SHADOW = 0x20; // 1 << 5 void main(void) { lowp vec4 shapeData = texture2D(shapeTexture, shapeCoord); lowp vec4 color = backgroundColor; if (textured) { // Blend the source over the current color. // FIXME(loicm) sign() is far from optimal. Call texture2D() at beginning of scope. lowp vec2 axisMask = -sign((sourceCoord.zw * sourceCoord.zw) - vec2(1.0)); lowp float mask = clamp(axisMask.x + axisMask.y, 0.0, 1.0); lowp vec4 source = texture2D(sourceTexture, sourceCoord.st) * vec4(sourceOpacity * mask); color = vec4(1.0 - source.a) * color + source; } // Blend the overlay over the current color. // FIXME(loicm) sign() is far from optimal. lowp vec2 overlayAxisMask = -sign((overlayCoord * overlayCoord) - vec2(1.0)); lowp float overlayMask = clamp(overlayAxisMask.x + overlayAxisMask.y, 0.0, 1.0); lowp vec4 overlay = overlayColor * vec4(overlayMask); color = vec4(1.0 - overlay.a) * color + overlay; if (aspect == FLAT) { // Mask the current color. color *= shapeData.b; } else if (aspect == INSET) { // The vertex layout of the shape is made so that the derivative is negative from top to // middle and positive from middle to bottom. lowp float shapeSide = yCoord <= 0.0 ? 0.0 : 1.0; // Blend the shape inner shadow over the current color. The shadow color is black, its // translucency is stored in the texture. lowp float shadow = shapeData[int(shapeSide)]; color = vec4(1.0 - shadow) * color + vec4(0.0, 0.0, 0.0, shadow); // Get the shape mask. lowp vec2 mask = shapeData.ba; // Get the bevel color. The bevel is made of the top mask masked with the bottom mask. A // gradient from the bottom (1) to the middle (0) of the shape is used to factor out values // resulting from the mask anti-aliasing. The bevel color is white with 60% opacity. lowp float bevel = (mask.x * -mask.y) + mask.x; // -ab + a = a(1 - b) lowp float gradient = clamp((shapeSide * -shapeCoord.t) + shapeSide, 0.0, 1.0); bevel *= gradient * 0.6; // Mask the current color then blend the bevel over the resulting color. We simply use // additive blending since the bevel has already been masked. color = (color * vec4(mask[int(shapeSide)])) + vec4(bevel); } else if (aspect == DROP_SHADOW) { // Get the shape mask. lowp int shapeSide = yCoord <= 0.0 ? 0 : 1; lowp float mask = shapeData[shapeSide]; // Get the shadow color outside of the shape mask. lowp float shadow = (shapeData.b * -mask) + shapeData.b; // -ab + a = a(1 - b) // Mask the current color then blend the shadow over the resulting color. We simply use // additive blending since the shadow has already been masked. color = (color * vec4(mask)) + vec4(0.0, 0.0, 0.0, shadow); } gl_FragColor = color * opacityFactors.xxxy; } ./src/Ubuntu/Components/plugin/shaders/shape.vert0000644000015600001650000000272012700370701022222 0ustar jenkinsjenkins// Copyright © 2015 Canonical Ltd. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; version 3. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see . // // Author: Loïc Molinari uniform highp mat4 matrix; // mediump was interpreted as lowp on PowerVR Rogue G6200 (arale). uniform bool textured; attribute highp vec4 positionAttrib; // highp because of matrix precision qualifier. attribute mediump vec2 shapeCoordAttrib; attribute mediump vec4 sourceCoordAttrib; attribute lowp float yCoordAttrib; attribute lowp vec4 backgroundColorAttrib; // FIXME(loicm) Optimize by reducing/packing varyings. varying mediump vec2 shapeCoord; varying mediump vec4 sourceCoord; varying lowp float yCoord; varying lowp vec4 backgroundColor; void main() { shapeCoord = shapeCoordAttrib; if (textured) { sourceCoord = sourceCoordAttrib; } yCoord = yCoordAttrib; backgroundColor = backgroundColorAttrib; gl_Position = matrix * positionAttrib; } ./src/Ubuntu/Components/plugin/shaders/shapeoverlay.frag0000644000015600001650000001323212700370701023563 0ustar jenkinsjenkins#extension GL_OES_standard_derivatives : enable // Enable dFdy() on OpenGL ES 2. // Copyright © 2015 Canonical Ltd. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; version 3. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see . // // Author: Loïc Molinari // Static flow control (branching on a uniform value) is fast on most GPUs (including ultra-low // power ones) because it allows to use the same shader execution path for an entire draw call. We // rely on that technique here (also known as "uber-shader" solution) to avoid the complexity of // dealing with a multiple shaders solution. // FIXME(loicm) Validate GPU behavior with regards to static flow control. uniform sampler2D shapeTexture; uniform sampler2D sourceTexture; uniform lowp vec2 opacityFactors; uniform lowp float sourceOpacity; uniform lowp float distanceAA; uniform bool textured; uniform mediump int aspect; varying mediump vec2 shapeCoord; varying mediump vec4 sourceCoord; varying lowp float yCoord; varying lowp vec4 backgroundColor; varying mediump vec2 overlayCoord; varying lowp vec4 overlayColor; const mediump int FLAT = 0x08; // 1 << 3 const mediump int INSET = 0x10; // 1 << 4 const mediump int DROP_SHADOW = 0x20; // 1 << 5 void main(void) { lowp vec4 shapeData = texture2D(shapeTexture, shapeCoord); lowp vec4 color = backgroundColor; if (textured) { // Blend the source over the current color. // FIXME(loicm) sign() is far from optimal. Call texture2D() at beginning of scope. lowp vec2 axisMask = -sign((sourceCoord.zw * sourceCoord.zw) - vec2(1.0)); lowp float mask = clamp(axisMask.x + axisMask.y, 0.0, 1.0); lowp vec4 source = texture2D(sourceTexture, sourceCoord.st) * vec4(sourceOpacity * mask); color = vec4(1.0 - source.a) * color + source; } // Blend the overlay over the current color. // FIXME(loicm) sign() is far from optimal. lowp vec2 overlayAxisMask = -sign((overlayCoord * overlayCoord) - vec2(1.0)); lowp float overlayMask = clamp(overlayAxisMask.x + overlayAxisMask.y, 0.0, 1.0); lowp vec4 overlay = overlayColor * vec4(overlayMask); color = vec4(1.0 - overlay.a) * color + overlay; // Get the normalized distance between two pixels using screen-space derivatives of shape // texture coordinate. dFd*() functions have to be called outside of branches in order to work // correctly with VMware's "Gallium 0.4 on SVGA3D". lowp float dist = length(vec2(dFdx(shapeCoord.s), dFdy(shapeCoord.s))); if (aspect == FLAT) { // Mask the current color with an anti-aliased and resolution independent shape mask built // from distance fields. lowp float distanceMin = abs(dist) * -distanceAA + 0.5; lowp float distanceMax = abs(dist) * distanceAA + 0.5; color *= smoothstep(distanceMin, distanceMax, shapeData.b); } else if (aspect == INSET) { // The vertex layout of the shape is made so that the derivative is negative from top to // middle and positive from middle to bottom. lowp float shapeSide = yCoord <= 0.0 ? 0.0 : 1.0; // Blend the shape inner shadow over the current color. The shadow color is black, its // translucency is stored in the texture. lowp float shadow = shapeData[int(shapeSide)]; color = vec4(1.0 - shadow) * color + vec4(0.0, 0.0, 0.0, shadow); // Get the anti-aliased and resolution independent shape mask using distance fields. lowp float distanceMin = abs(dist) * -distanceAA + 0.5; lowp float distanceMax = abs(dist) * distanceAA + 0.5; lowp vec2 mask = smoothstep(distanceMin, distanceMax, shapeData.ba); // Get the bevel color. The bevel is made of the top mask masked with the bottom mask. A // gradient from the bottom (1) to the middle (0) of the shape is used to factor out values // resulting from the mask anti-aliasing. The bevel color is white with 60% opacity. lowp float bevel = (mask.x * -mask.y) + mask.x; // -ab + a = a(1 - b) lowp float gradient = clamp((shapeSide * -shapeCoord.t) + shapeSide, 0.0, 1.0); bevel *= gradient * 0.6; // Mask the current color then blend the bevel over the resulting color. We simply use // additive blending since the bevel has already been masked. color = (color * vec4(mask[int(shapeSide)])) + vec4(bevel); } else if (aspect == DROP_SHADOW) { // Get the anti-aliased and resolution independent shape mask using distance fields. lowp float distanceMin = abs(dist) * -distanceAA + 0.5; lowp float distanceMax = abs(dist) * distanceAA + 0.5; lowp int shapeSide = yCoord <= 0.0 ? 0 : 1; lowp float mask = smoothstep(distanceMin, distanceMax, shapeData[shapeSide]); // Get the shadow color outside of the shape mask. lowp float shadow = (shapeData.b * -mask) + shapeData.b; // -ab + a = a(1 - b) // Mask the current color then blend the shadow over the resulting color. We simply use // additive blending since the shadow has already been masked. color = (color * vec4(mask)) + vec4(0.0, 0.0, 0.0, shadow); } gl_FragColor = color * opacityFactors.xxxy; } ./src/Ubuntu/Components/plugin/shaders/shape_mipmap.frag0000644000015600001650000001013112700370701023517 0ustar jenkinsjenkins// Copyright © 2015 Canonical Ltd. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; version 3. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see . // // Author: Loïc Molinari // Static flow control (branching on a uniform value) is fast on most GPUs (including ultra-low // power ones) because it allows to use the same shader execution path for an entire draw call. We // rely on that technique here (also known as "uber-shader" solution) to avoid the complexity of // dealing with a multiple shaders solution. // FIXME(loicm) Validate GPU behavior with regards to static flow control. uniform sampler2D shapeTexture; uniform sampler2D sourceTexture; uniform lowp vec2 opacityFactors; uniform lowp float sourceOpacity; uniform bool textured; uniform mediump int aspect; varying mediump vec2 shapeCoord; varying mediump vec4 sourceCoord; varying lowp float yCoord; varying lowp vec4 backgroundColor; const mediump int FLAT = 0x08; // 1 << 3 const mediump int INSET = 0x10; // 1 << 4 const mediump int DROP_SHADOW = 0x20; // 1 << 5 void main(void) { lowp vec4 shapeData = texture2D(shapeTexture, shapeCoord); lowp vec4 color = backgroundColor; if (textured) { // Blend the source over the current color. // FIXME(loicm) sign() is far from optimal. Call texture2D() at beginning of scope. lowp vec2 axisMask = -sign((sourceCoord.zw * sourceCoord.zw) - vec2(1.0)); lowp float mask = clamp(axisMask.x + axisMask.y, 0.0, 1.0); lowp vec4 source = texture2D(sourceTexture, sourceCoord.st) * vec4(sourceOpacity * mask); color = vec4(1.0 - source.a) * color + source; } if (aspect == FLAT) { // Mask the current color. color *= shapeData.b; } else if (aspect == INSET) { // The vertex layout of the shape is made so that the derivative is negative from top to // middle and positive from middle to bottom. lowp float shapeSide = yCoord <= 0.0 ? 0.0 : 1.0; // Blend the shape inner shadow over the current color. The shadow color is black, its // translucency is stored in the texture. lowp float shadow = shapeData[int(shapeSide)]; color = vec4(1.0 - shadow) * color + vec4(0.0, 0.0, 0.0, shadow); // Get the shape mask. lowp vec2 mask = shapeData.ba; // Get the bevel color. The bevel is made of the top mask masked with the bottom mask. A // gradient from the bottom (1) to the middle (0) of the shape is used to factor out values // resulting from the mask anti-aliasing. The bevel color is white with 60% opacity. lowp float bevel = (mask.x * -mask.y) + mask.x; // -ab + a = a(1 - b) lowp float gradient = clamp((shapeSide * -shapeCoord.t) + shapeSide, 0.0, 1.0); bevel *= gradient * 0.6; // Mask the current color then blend the bevel over the resulting color. We simply use // additive blending since the bevel has already been masked. color = (color * vec4(mask[int(shapeSide)])) + vec4(bevel); } else if (aspect == DROP_SHADOW) { // Get the shape mask. lowp int shapeSide = yCoord <= 0.0 ? 0 : 1; lowp float mask = shapeData[shapeSide]; // Get the shadow color outside of the shape mask. lowp float shadow = (shapeData.b * -mask) + shapeData.b; // -ab + a = a(1 - b) // Mask the current color then blend the shadow over the resulting color. We simply use // additive blending since the shadow has already been masked. color = (color * vec4(mask)) + vec4(0.0, 0.0, 0.0, shadow); } gl_FragColor = color * opacityFactors.xxxy; } ./src/Ubuntu/Components/plugin/label_p.h0000644000015600001650000000260112700370714020340 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef LABEL_P #define LABEL_P #include "uclabel.h" class UCLabelPrivate { Q_DECLARE_PUBLIC(UCLabel) public: explicit UCLabelPrivate(UCLabel *qq); UCLabelPrivate(UCLabel *qq, UCLabel::ColorProviderFunc func); static UCLabelPrivate *get(UCLabel *q) { return q->d_func(); } void init(); // slots void updateRenderType(); // methods void updatePixelSize(); // members enum { TextSizeSet = 1, PixelSizeSet = 2, ColorSet = 4 }; UCLabel *q_ptr; QFont defaultFont; UCLabel::ColorProviderFunc defaultColor; UCLabel::TextSize textSize; quint8 flags; protected: static QColor getDefaultColor(QQuickItem *item, UCTheme *theme); }; #endif // LABEL_P ./src/Ubuntu/Components/plugin/ucactionmanager.cpp0000644000015600001650000001167512700370701022444 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "ucactionmanager.h" #include "adapters/actionsproxy_p.h" #include "ucactioncontext.h" #include "ucaction.h" /*! * \qmltype ActionManager * \instantiates UCActionManager * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu * \brief ActionManager manages actions and action contexts withion an application. * * Acts as an interface between the application and external components. Maintains * the global context action registration. * * There can be many ActionManager instances in an application, and all instances * will have the ActionContexts shared between each other. If individual ActionManager * instances add more Action objects, those will be published as well. */ UCActionManager::UCActionManager(QObject *parent) : QObject(parent) { } void UCActionManager::componentComplete() { // publish global context to system ActionProxy::instance().globalContext->setActive(true); ActionProxy::publishGlobalContext(); } /*! * \qmlproperty list ActionManager::actions * \default * A list of actions in the global context. */ QQmlListProperty UCActionManager::actions() { return QQmlListProperty(this, 0, actionAppend, actionCount, 0, actionClear); } void UCActionManager::actionAppend(QQmlListProperty *list, UCAction *action) { Q_UNUSED(list); ActionProxy::instance().globalContext->m_actions.insert(action); } void UCActionManager::actionClear(QQmlListProperty *list) { Q_UNUSED(list); UCActionContext *context = ActionProxy::instance().globalContext; context->m_actions.clear(); } int UCActionManager::actionCount(QQmlListProperty *list) { Q_UNUSED(list); return ActionProxy::instance().globalContext->m_actions.count(); } /*! * \qmlproperty list ActionManager::localContexts * List of local contexts. */ QQmlListProperty UCActionManager::localContexts() { return QQmlListProperty(this, 0, contextAppend, contextCount, 0, contextClear); } void UCActionManager::contextAppend(QQmlListProperty *list, UCActionContext *context) { Q_UNUSED(list); ActionProxy::addContext(context); } void UCActionManager::contextClear(QQmlListProperty *list) { Q_UNUSED(list); Q_FOREACH(UCActionContext *context, ActionProxy::instance().localContexts().toList()) { ActionProxy::removeContext(context); } } int UCActionManager::contextCount(QQmlListProperty *list) { Q_UNUSED(list); return ActionProxy::instance().localContexts().count(); } /*! * \qmlproperty ActionContext ActionManager::globalContext * The globalContext of the Application. * \note Setting the \l ActionContext::active on the global context has no effect. */ UCActionContext *UCActionManager::globalContext() const { return ActionProxy::instance().globalContext; } /*! * \qmlmethod ActionManager::addAction(Action action) * \deprecated * This is a shorthand for \c ActionManager.globalContext.addAction(action) call. */ void UCActionManager::addAction(UCAction *action) { if (!action) { return; } ActionProxy::instance().globalContext->addAction(action); } /*! * \qmlmethod ActionManager::removeAction(Action action) * \deprecated * This is a shorthand for \c ActionManager.globalContext.removeAction(action) call. */ void UCActionManager::removeAction(UCAction *action) { if (!action) { return; } ActionProxy::instance().globalContext->removeAction(action); } /*! * \qmlmethod ActionManager::addLocalContext(ActionContext context) * \deprecated * Adds the local context. * * This is deprecated. ActionContext instances are added autimatically to the * action management stystem when declared and removed when destroyed. */ void UCActionManager::addLocalContext(UCActionContext *context) { if (!context) { return; } ActionProxy::addContext(context); } /*! * \qmlmethod ActionManager::removeLocalContext(ActionContext context) * \deprecated * Removes the local context. * * This is deprecated. ActionContext instances are added autimatically to the * action management stystem when declared and removed when destroyed. */ void UCActionManager::removeLocalContext(UCActionContext *context) { if (!context) { return; } ActionProxy::removeContext(context); } ./src/Ubuntu/Components/plugin/timeutils_p.h0000644000015600001650000001031012700370701021270 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef TIMEUTILS_P_H #define TIMEUTILS_P_H #include "livetimer.h" #include #include #include #include /* Check the system locale setting to see if the format is 24-hour time or 12-hour time */ inline bool isLocale12h(void) { QString strTimeFormat = QLocale::system().timeFormat(); QStringList includes; includes << "AP"; includes << "ap"; QStringList excludes; excludes << "H"; excludes << "HH"; Q_FOREACH(const QString& exclude, excludes) { if (strTimeFormat.contains(exclude)) { return false; } } Q_FOREACH(const QString& include, includes) { if (strTimeFormat.contains(include)) { return true; } } return false; } typedef enum { DATE_PROXIMITY_NOW, DATE_PROXIMITY_HOUR, DATE_PROXIMITY_TODAY, DATE_PROXIMITY_YESTERDAY, DATE_PROXIMITY_TOMORROW, DATE_PROXIMITY_LAST_WEEK, DATE_PROXIMITY_NEXT_WEEK, DATE_PROXIMITY_FAR_BACK, DATE_PROXIMITY_FAR_FORWARD } date_proximity_t; inline date_proximity_t getDateProximity(const QDateTime& now, const QDateTime& time) { int now_day = now.date().day(); int now_month = now.date().month(); int now_year = now.date().year(); int time_day = time.date().day(); int time_month = time.date().month(); int time_year = time.date().year(); qint64 diff = time.toMSecsSinceEpoch() - now.toMSecsSinceEpoch(); if (qAbs(diff) < 30000) return DATE_PROXIMITY_NOW; else if (qAbs(diff) < 3600000) return DATE_PROXIMITY_HOUR; // does it happen today? if ((now_year == time_year) && (now_month == time_month) && (now_day == time_day)) { return DATE_PROXIMITY_TODAY; } // did it happen yesterday? QDateTime yesterday(now.addDays(-1)); int yesterday_day = yesterday.date().day(); int yesterday_month = yesterday.date().month(); int yesterday_year = yesterday.date().year(); if ((yesterday_year == time_year) && (yesterday_month == time_month) && (yesterday_day == time_day)) { return DATE_PROXIMITY_YESTERDAY; } // does it happen tomorrow? QDateTime tomorrow(now.addDays(1)); int tomorrow_day = tomorrow.date().day(); int tomorrow_month = tomorrow.date().month(); int tomorrow_year = tomorrow.date().year(); if ((tomorrow_year == time_year) && (tomorrow_month == time_month) && (tomorrow_day == time_day)) { return DATE_PROXIMITY_TOMORROW; } if (time < now) { QDateTime lastWeek(now.addDays(-6)); QDateTime lastWeekBound(lastWeek.date(), QTime(0, 0, 0, 0)); // does it happen last week? if (time >= lastWeekBound) { return DATE_PROXIMITY_LAST_WEEK; } return DATE_PROXIMITY_FAR_BACK; } else { QDateTime nextWeek(now.addDays(6)); QDateTime nextWeekBound(nextWeek.date(), QTime(23, 59, 59, 999)); // does it happen this week? if (time <= nextWeekBound) { return DATE_PROXIMITY_NEXT_WEEK; } return DATE_PROXIMITY_FAR_FORWARD; } } inline LiveTimer::Frequency frequencyForProximity(date_proximity_t proximity) { switch(proximity) { case DATE_PROXIMITY_NOW: return LiveTimer::Second; case DATE_PROXIMITY_HOUR: return LiveTimer::Minute; case DATE_PROXIMITY_TODAY: case DATE_PROXIMITY_TOMORROW: case DATE_PROXIMITY_YESTERDAY: case DATE_PROXIMITY_LAST_WEEK: case DATE_PROXIMITY_NEXT_WEEK: case DATE_PROXIMITY_FAR_FORWARD: return LiveTimer::Hour; case DATE_PROXIMITY_FAR_BACK: default: break; } return LiveTimer::Disabled; } #endif // TIMEUTILS_P_H ./src/Ubuntu/Components/plugin/ucurihandler.h0000644000015600001650000000237312700370701021431 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Loïc Molinari */ #include class UCUriHandler; class UriHandlerObject : public QObject { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.freedesktop.Application") public: UriHandlerObject(UCUriHandler* uriHandler); public Q_SLOTS: void Open(const QStringList& uris, const QHash& platformData); private: UCUriHandler* m_uriHandler; }; class UCUriHandler : public QObject { Q_OBJECT public: UCUriHandler(); Q_SIGNALS: void opened(const QStringList& uris); private: UriHandlerObject m_uriHandlerObject; }; ./src/Ubuntu/Components/plugin/inversemouseareatype.cpp0000644000015600001650000004424612700370701023563 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "inversemouseareatype.h" #include #include "quickutils.h" /*! \qmltype InverseMouseArea \instantiates InverseMouseAreaType \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The InverseMouseArea captures mouse events happening outside of a given area. A typical use case is hiding of a popup or tooltip when the user presses or taps outside of the popup or tooltip area. The following example illustrates the use of InverseMouseArea in a Popup. Popup.qml \qml import QtQuick 2.4 import Ubuntu.Components 1.2 Rectangle { anchors.centerIn: parent width: 200; height: 200 color: "darkgray" radius: 10 InverseMouseArea { anchors.fill: parent acceptedButtons: Qt.LeftButton onPressed: parent.destroy() } } \endqml In the Popup above the mouse presses happening outside the area will cause closing and destroying the popup. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 Item { width: 640 height: 480 Button { id: button text: "Press me" onClicked: { var component = Qt.createComponent("Popup.qml"); var obj = component.create(parent); obj.visible = true; } } } \endqml By default the InverseMouseArea sensing area (the area from which the mouse clicks will be taken) is the application's root component, or the Window in which the topmost parent component of the mouse area resides. This area can be however altered to a different area by setting the \l sensingArea property to a component which is either a parent of the mouse area or a sibling of it. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 Item { width: units.gu(40) height: units.gu(71) MouseArea { anchors.fill: parent onClicked: console.log("clicked on the root component") } Rectangle { id: blueRect width: units.gu(30) height: units.gu(51) anchors.centerIn: parent color: "blue" Rectangle { width: units.gu(20) height: units.gu(20) anchors.centerIn: parent color: "red" InverseMouseArea { anchors.fill: parent sensingArea: blueRect onClicked: console.log("clicked on the blue rect") } } } } \endqml In this example the inverse mouse area will get mouse presses only when those happen on the blue rectangle area. When clicked outside of the blue rectangle or inside the red rectangle, the mouse area covering the root item will get click signals. InverseMouseArea, being derived from MouseArea respects the stacking and z-order of the components. This should be taken into account when combining it with MouseAreas within the same level of the component hierarchy or when combined with MouseArea siblings. In these cases it is recommended to have the InverseMouseArea declared as last component, having it in this way as last one oin the component stack. \qml Item { id: page width: units.gu(40) height: units.gu(71) Rectangle { id: label anchors { horizontalCenter: parent.horizontalCenter top: parent.top } height: units.gu(5) width: parent.width color: "red" MouseArea { anchors.fill: parent z: 1 onPressed: console.log("red band") } } Rectangle { anchors { top: label.bottom topMargin: units.gu(2) horizontalCenter: parent.horizontalCenter } height: units.gu(10) width: parent.width color: "green" Button { id: button anchors.centerIn: parent text: "I'm a button, I do nothing." } MouseArea { anchors.fill: parent onPressed: console.log("green band") } InverseMouseArea { anchors.fill: button onPressed: console.log("all over except button") } } } \endqml When this is not enough, and you want to grab all the mouse events that have been sent to the sensingArea, you can use \l topmostItem to place the mouse area above all the components that were instantiated under the sensing area. Beware that setting this property will no longer consider neither the z-order nor the component stack order anymore, as it will steal all the mouse events from the component set as \l sensingArea. \qml Item { width: units.gu(40) height: units.gu(71) Rectangle { id: firstRect anchors { left: parent.left top: parent.top leftMargin: units.gu(10) topMargin: units.gu(10) } width: units.gu(15) height: width color: "blue" InverseMouseArea { anchors.fill: parent objectName: "IMA" topmostItem: true onPressed: print("IMA") } } Rectangle { anchors { left: firstRect.right top: firstRect.bottom } width: units.gu(10) height: width color: "red" MouseArea { anchors.fill: parent objectName: "MA" onPressed: print("MA") } } } \endqml */ /*! \internal */ InverseMouseAreaType::InverseMouseAreaType(QQuickItem *parent) : QQuickMouseArea(parent), m_ready(false), m_topmostItem(false), m_sensingArea(QuickUtils::instance()->rootItem(this)) { /* * QQuickMouseArea overrides enabledChanged() signal, therefore we must make sure * we connect to the proper signal. */ QObject::connect(this, &QQuickMouseArea::enabledChanged, this, &InverseMouseAreaType::update); QObject::connect(this, &QQuickMouseArea::visibleChanged, this, &InverseMouseAreaType::update); /* * Also connect to windowChanged() to get the proper window to filter */ QObject::connect(this, &QQuickMouseArea::windowChanged, this, &InverseMouseAreaType::resetFilterOnWindowUpdate); } InverseMouseAreaType::~InverseMouseAreaType() { } void InverseMouseAreaType::updateEventFilter(bool enable) { m_filteredEvent = false; if (!enable && m_filterHost) { m_filterHost->removeEventFilter(this); m_filterHost.clear(); } else if (enable) { QQuickWindow *currentWindow = window(); if (!currentWindow || (m_filterHost == currentWindow)) { return; } if (m_filterHost) { m_filterHost->removeEventFilter(this); } currentWindow->installEventFilter(this); m_filterHost = currentWindow; } } /*! \internal Slot connected to enabledChanged signal to update the state of the handler. */ void InverseMouseAreaType::update() { if (!m_ready) { return; } // update sensing area if (!m_sensingArea) { m_sensingArea = QuickUtils::instance()->rootItem(this); } updateEventFilter(isEnabled() && isVisible() && m_topmostItem); QQuickMouseArea::update(); } /*! \internal Slot connected to windowChanged signal to refresh filter host. */ void InverseMouseAreaType::resetFilterOnWindowUpdate(QQuickWindow *win) { Q_UNUSED(win); updateEventFilter(m_topmostItem); } void InverseMouseAreaType::itemChange(ItemChange change, const ItemChangeData &data) { if (change == ItemParentHasChanged && data.item) { update(); } QQuickMouseArea::itemChange(change, data); } void InverseMouseAreaType::componentComplete() { QQuickMouseArea::componentComplete(); // by now the parents should have been resolved so we can look after the // topmost component for the sensingArea in case it has not been set yet m_ready = true; update(); } /* * Translate mouse, wheel and hover event positions to component's local coordinates. */ QEvent *InverseMouseAreaType::mapEventToArea(QObject *target, QEvent *event, QPoint &point) { QQuickItem *targetItem = qobject_cast(target); // target can be the QQuickView or QQuickWindow, then we need to get the root item from it if (!targetItem) { QQuickView *view = qobject_cast(target); if (view) { targetItem = view->rootObject(); } else { QQuickWindow *window = qobject_cast(target); if (window) { targetItem = window->contentItem(); } } } Q_ASSERT(target); m_filteredEvent = true; switch (event->type()) { case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::MouseButtonDblClick: case QEvent::MouseMove: if (targetItem != this) { // translate coordinates to local QMouseEvent *ev = static_cast(event); QMouseEvent *mev = new QMouseEvent(ev->type(), mapFromScene(ev->windowPos()), ev->windowPos(), ev->screenPos(), ev->button(), ev->buttons(), ev->modifiers()); point = mev->pos(); return mev; } break; case QEvent::Wheel: if (targetItem != this) { QWheelEvent *ev = static_cast(event); QWheelEvent *wev = new QWheelEvent(mapFromScene(ev->globalPos()), ev->globalPos(), ev->delta(), ev->buttons(), ev->modifiers(), ev->orientation()); point = wev->pos(); return wev; } break; case QEvent::HoverEnter: case QEvent::HoverLeave: case QEvent::HoverMove: { if (targetItem && targetItem != this) { QHoverEvent *ev = static_cast(event); QPointF spos = targetItem->mapToScene(ev->posF()); QPointF sopos = targetItem->mapToScene(ev->oldPosF()); QHoverEvent *hev = new QHoverEvent(ev->type(), mapFromScene(spos), mapFromScene(sopos), ev->modifiers()); point = hev->pos(); return hev; } } break; // convert touch events into mouse events and continue handling as such case QEvent::TouchBegin: { QTouchEvent *tev = static_cast(event); QList points = tev->touchPoints(); const QTouchEvent::TouchPoint &primaryPoint = points.first(); m_touchId = primaryPoint.id(); QPointF pos = targetItem->mapToScene(primaryPoint.pos()); QMouseEvent *mev = new QMouseEvent(QEvent::MouseButtonPress, mapFromScene(pos), primaryPoint.scenePos(), primaryPoint.screenPos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); point = mev->pos(); return mev; } break; case QEvent::TouchUpdate: { QTouchEvent *tev = static_cast(event); QList points = tev->touchPoints(); const QTouchEvent::TouchPoint &primaryPoint = points.first(); QPointF pos = targetItem->mapToScene(primaryPoint.pos()); QMouseEvent *mev = new QMouseEvent(QEvent::MouseMove, mapFromScene(pos), primaryPoint.scenePos(), primaryPoint.screenPos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier); point = mev->pos(); return mev; } break; case QEvent::TouchEnd: { QMouseEvent *mev = 0; QTouchEvent *tev = static_cast(event); QList points = tev->touchPoints(); for (int i = 0; i < points.count(); i++) { const QTouchEvent::TouchPoint &point = points.at(i); if (point.id() != m_touchId) { continue; } QPointF pos = targetItem->mapToScene(point.pos()); mev = new QMouseEvent(QEvent::MouseButtonRelease, mapFromScene(pos), point.scenePos(), point.screenPos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); break; } point = mev->pos(); return mev; } break; default: m_filteredEvent = false; point = QPoint(); break; } return event; } bool InverseMouseAreaType::eventFilter(QObject *object, QEvent *event) { if (object != this) { bool captured = true; QPoint point; QEvent *mappedEvent = mapEventToArea(object, event, point); switch (mappedEvent->type()) { case QEvent::MouseButtonPress: mousePressEvent(static_cast(mappedEvent)); break; case QEvent::MouseButtonRelease: mouseReleaseEvent(static_cast(mappedEvent)); break; case QEvent::MouseButtonDblClick: mouseDoubleClickEvent(static_cast(mappedEvent)); break; case QEvent::MouseMove: mouseMoveEvent(static_cast(mappedEvent)); break; case QEvent::Wheel: wheelEvent(static_cast(mappedEvent)); break; case QEvent::HoverEnter: hoverEnterEvent(static_cast(mappedEvent)); break; case QEvent::HoverLeave: hoverLeaveEvent(static_cast(mappedEvent)); break; case QEvent::HoverMove: hoverMoveEvent(static_cast(mappedEvent)); break; default: captured = false; break; } if (mappedEvent != event) { event->setAccepted(mappedEvent->isAccepted()); delete mappedEvent; } m_filteredEvent = false; if (captured && event->isAccepted() && contains(point)) { // consume the event return true; } } return false; } void InverseMouseAreaType::mousePressEvent(QMouseEvent *event) { // overload QQuickMouseArea mousePress event as the original one sets containsMouse // to true automatically, however ion our case this can be false in case the press // happens inside the "hole" if (!m_topmostItem || (m_topmostItem && m_filteredEvent && contains(event->localPos()))) { QQuickMouseArea::mousePressEvent(event); } else { // we do not consume the mouse event // this is not the same as setting the accepted flag in the signal handler // as in this way we only tell to the event handling that the event can be // propagated to other filters event->setAccepted(false); } } void InverseMouseAreaType::mouseDoubleClickEvent(QMouseEvent *event) { // same as with mousePressEvent if (!m_topmostItem || (m_topmostItem && m_filteredEvent && contains(event->localPos()))) { QQuickMouseArea::mouseDoubleClickEvent(event); } else { // we do not consume the mouse event // this is not the same as setting the accepted flag in the signal handler // as in this way we only tell to the event handling that the event can be // propagated to other filters event->setAccepted(false); } } /*! \qmlproperty Item InverseMouseArea::sensingArea This property holds the sensing area of the inverse mouse area. By default it is the root item but it can be set to any other area. The area can be reset to the root item by setting null to the property. */ QQuickItem *InverseMouseAreaType::sensingArea() const { return m_sensingArea; } void InverseMouseAreaType::setSensingArea(QQuickItem *sensing) { if (!sensing) sensing = QuickUtils::instance()->rootItem(this); if (sensing != m_sensingArea) { // clear previous filter updateEventFilter(false); m_sensingArea = sensing; updateEventFilter(m_topmostItem); Q_EMIT sensingAreaChanged(); } } /*! \qmlproperty bool InverseMouseArea::topmostItem The property specifies whether the InverseMouseArea should be above all components taking all mouse, wheel and hover events from the application's or from the area specified by the \l sensingArea (true), or only from the siblings (false). The default value is false. */ bool InverseMouseAreaType::topmostItem() const { return m_topmostItem; } void InverseMouseAreaType::setTopmostItem(bool value) { if (m_topmostItem != value) { m_topmostItem = value; updateEventFilter(m_topmostItem); Q_EMIT topmostItemChanged(); } } /* * Overrides QQuickItem's contains method. Point is in local coordinates. */ bool InverseMouseAreaType::contains(const QPointF &point) const { QPointF scenePos = mapToScene(point); QRectF oskRect = QGuiApplication::inputMethod()->keyboardRectangle(); bool pointInArea = QQuickMouseArea::contains(point); bool pointInOSK = oskRect.contains(scenePos); bool pointOutArea = (m_sensingArea && m_sensingArea->contains(m_sensingArea->mapFromScene(scenePos))); return !pointInArea && !pointInOSK && pointOutArea; } ./src/Ubuntu/Components/plugin/unitythemeiconprovider.h0000644000015600001650000000213212700370714023560 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: Lars Uebernickel */ #ifndef UNITY_THEME_ICON_PROVIDER_H #define UNITY_THEME_ICON_PROVIDER_H #include class UnityThemeIconProvider: public QQuickImageProvider { public: UnityThemeIconProvider(const QString &themeName = QStringLiteral("suru")); QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize); private: QSharedPointer theme; }; #endif ./src/Ubuntu/Components/plugin/ucstylehints.h0000644000015600001650000000570112700370701021500 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCSTYLEHINTS_H #define UCSTYLEHINTS_H #include #define foreach Q_FOREACH #include #include #include #undef foreach #include class UCStyleHintsParser; class UCStyledItemBase; class QQuickItem; class PropertyChange; class UCStyleHints : public QObject, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(bool ignoreUnknownProperties MEMBER m_ignoreUnknownProperties) public: explicit UCStyleHints(QObject *parent = 0); ~UCStyleHints(); private Q_SLOTS: void _q_applyStyleHints(); protected: void classBegin(); void componentComplete(); private: class Expression { public: Expression(const QString &name, QQmlBinding::Identifier id, const QString& expr, const QUrl &url, int line, int column) : name(name), id(id), expression(expr), url(url), line(line), column(column) {} QString name; QQmlBinding::Identifier id; QString expression; QUrl url; int line; int column; }; bool m_decoded:1; bool m_completed:1; bool m_ignoreUnknownProperties:1; QPointer m_styledItem; QList m_expressions; QList< QPair > m_values; QList< PropertyChange* > m_propertyBackup; QQmlRefPointer m_cdata; friend class UCStyleHintsParser; void propertyNotFound(const QString &styleName, const QString &property); void decodeBinding(const QString &propertyPrefix, const QV4::CompiledData::Unit *qmlUnit, const QV4::CompiledData::Binding *binding); }; class UCStyleHintsParser : public QQmlCustomParser { public: UCStyleHintsParser() : QQmlCustomParser(QQmlCustomParser::AcceptsSignalHandlers) {} virtual void verifyBindings(const QV4::CompiledData::Unit *qmlUnit, const QList &bindings); virtual void applyBindings(QObject *obj, QQmlCompiledData *cdata, const QList &bindings); private: void verifyProperty(const QV4::CompiledData::Unit *qmlUnit, const QV4::CompiledData::Binding *binding); }; #endif // UCSTYLEHINTS_H ./src/Ubuntu/Components/plugin/ucalarm.cpp0000644000015600001650000004742712700370701020734 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "ucalarm.h" #include "ucalarm_p.h" #include "alarmmanager_p.h" #include "i18n.h" #include UCAlarmPrivate::UCAlarmPrivate(UCAlarm *qq) : q_ptr(qq) , changes(0) , error(UCAlarm::NoError) , status(UCAlarm::Ready) { } UCAlarmPrivate::~UCAlarmPrivate() { } void UCAlarmPrivate::setDefaults() { QDateTime date = AlarmUtils::normalizeDate(QDateTime::currentDateTime()); setDate(date); setMessage(UbuntuI18n::instance()->tr("Alarm")); setType(UCAlarm::OneTime); setDaysOfWeek(UCAlarm::AutoDetect); } void UCAlarmPrivate::_q_syncStatus(int operation, int status, int error) { UCAlarm::Status alarmStatus = static_cast(status); if (this->status != alarmStatus || this->error != error) { this->status = alarmStatus; this->error = error; Q_Q(UCAlarm); if (this->status == UCAlarm::Ready) { // sync field changes occured during operation if (changes & AlarmManager::Enabled) Q_EMIT q->enabledChanged(); if (changes & AlarmManager::Date) Q_EMIT q->dateChanged(); if (changes & AlarmManager::Message) Q_EMIT q->messageChanged(); if (changes & AlarmManager::Sound) Q_EMIT q->soundChanged(); if (changes & AlarmManager::Type) Q_EMIT q->typeChanged(); if (changes & AlarmManager::Days) Q_EMIT q->daysOfWeekChanged(); changes = 0; } Q_EMIT q->statusChanged(static_cast(operation)); Q_EMIT q->errorChanged(); } } UCAlarm::DayOfWeek UCAlarmPrivate::dayOfWeek(const QDateTime &dt) { return (UCAlarm::DayOfWeek)(1 << (dt.date().dayOfWeek() - 1)); } int UCAlarmPrivate::firstDayOfWeek(UCAlarm::DaysOfWeek days) { for (int d = Qt::Monday; d <= Qt::Sunday; d++) { if ((1 << (d - 1)) & days) { return d; } } return 0; } int UCAlarmPrivate::nextDayOfWeek(UCAlarm::DaysOfWeek days, int fromDay) { if (fromDay <= 0 || fromDay >= Qt::Sunday) { // start from the beginning of the week fromDay = Qt::Monday; } else { // start checking from the next day onwards fromDay++; } for (int d = fromDay; d <= Qt::Sunday; d++) { if ((1 << (d - 1)) & days) { return d; } } // none found for the rest of the week, return the fist day set return firstDayOfWeek(days); } // checks whether the given num has more than one bit set bool UCAlarmPrivate::multipleDaysSet(UCAlarm::DaysOfWeek days) { unsigned bits; int num = static_cast(days); for (bits = 0; num; bits++) { num &= num - 1; // clears the least significant bit } return (bits > 1); } // adjust dayOfWeek UCAlarm::Error UCAlarmPrivate::adjustDow() { UCAlarm::DaysOfWeek dow = daysOfWeek(); if (!dow) { return UCAlarm::NoDaysOfWeek; } else if (dow == UCAlarm::AutoDetect) { setDaysOfWeek(dayOfWeek(date())); changes |= AlarmManager::Days; } return UCAlarm::NoError; } UCAlarm::Error UCAlarmPrivate::checkOneTime() { // check days, days can be set for only one day in this case UCAlarm::DaysOfWeek dow = daysOfWeek(); if (multipleDaysSet(dow)) { return UCAlarm::OneTimeOnMoreDays; } UCAlarm::Error result = adjustDow(); if (result != UCAlarm::NoError) { return result; } // fetch the dow again as adjustment may alter it! dow = daysOfWeek(); // fix lp:1319401 - dayOfWeek omitted if set to other than AutoDetect QDateTime alarmDate = date(); int dayOfWeek = alarmDate.date().dayOfWeek(); if (!isDaySet(dayOfWeek, dow)) { // dayOfWeek has been set by the user, adjust the date to it int nextOccurrence = nextDayOfWeek(dow, dayOfWeek); if (nextOccurrence < dayOfWeek) { // the starting date should be moved to the next week's occurrence alarmDate = alarmDate.addDays(7 - dayOfWeek + nextOccurrence); } else { // the starting date is still this week alarmDate = alarmDate.addDays(nextOccurrence - dayOfWeek); } setDate(alarmDate); changes |= AlarmManager::Date; } // start date should be later then the current date/time if (alarmDate <= AlarmUtils::normalizeDate(QDateTime::currentDateTime())) { return UCAlarm::EarlyDate; } return UCAlarm::NoError; } UCAlarm::Error UCAlarmPrivate::checkRepeatingWeekly() { // start date is adjusted depending on the days value; // start date can be set to be the current time, as scheduling will move // it to the first occurence. UCAlarm::Error result = adjustDow(); if (result != UCAlarm::NoError) { return result; } // move start time of the first occurence if needed QDateTime alarmDate = date(); UCAlarm::DaysOfWeek dow = daysOfWeek(); int dayOfWeek = alarmDate.date().dayOfWeek(); if (!isDaySet(dayOfWeek, dow) || (alarmDate <= QDateTime::currentDateTime())) { // check the next occurence of the alarm int nextOccurrence = nextDayOfWeek(dow, dayOfWeek); if (nextOccurrence == dayOfWeek) { // move the date to the same day next week alarmDate = alarmDate.addDays(7); } else if (nextOccurrence < dayOfWeek) { // the starting date should be moved to the next week's occurrence alarmDate = alarmDate.addDays(7 - dayOfWeek + nextOccurrence); } else { // the starting date is still this week alarmDate = alarmDate.addDays(nextOccurrence - dayOfWeek); } setDate(alarmDate); changes |= AlarmManager::Date; } return UCAlarm::NoError; } /*! * \qmltype Alarm * \instantiates UCAlarm * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu-services * \brief Alarm component is a representation of an alarm event. * * The Alarm element encapsulates alarm event data. Supports one time and repeating * alarms, where repeating can be either daily or weekly on one or several selected * days. * * The alarm data is validated upon \l save operation, which can be used to save * a new alarm or update existing alarm's properties. * * During data validation the alarm properties may suffer changes. These changes * will be reported back to each changed property. See what changes can occurr at * \l save function documentation. * * Example usage: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * * Rectangle { * width: units.gu(40) * height: units.gu(20) * * Alarm{ * id: alarm * } * Column { * spacing: units.gu(1) * Row { * spacing: units.gu(1) * Label { * id: date * text: "Date:" * anchors.verticalCenter: parent.verticalCenter * } * TextField { * text: alarm.date.toString() * onAccepted: alarm.date = new Date(text) * } * } * Row { * spacing: units.gu(1) * Label { * id: msg * text: "Message:" * anchors.verticalCenter: parent.verticalCenter * } * TextField { * text: alarm.message * onAccepted: alarm.message = text * } * } * Button { * text: "Save" * onClicked: { * alarm.save(); * if (alarm.error != Alarm.NoError) * print("Error saving alarm, code: " + alarm.error); * } * } * } * } * \endqml * * An alarm can be cancelled using \l cancel function but only if the event has * previously been stored in the alarm collection. * * The \l reset function clears the properties of the alarm bringing them to the * default values. In this way the same alarm component can be used to save several * alarms at the same time. * \note Do not call reset function on an alarm event object when that was returned * by the \l AlarmModel::get function, as that will reset the alarm cache data! */ UCAlarm::UCAlarm(QObject *parent) : QObject(parent) , d_ptr(AlarmManager::createAlarmData(this)) { d_ptr->setDefaults(); } UCAlarm::UCAlarm(const QDateTime &dt, const QString &message, QObject *parent) : QObject(parent) , d_ptr(AlarmManager::createAlarmData(this)) { d_ptr->setDate(AlarmUtils::normalizeDate(dt)); if (!message.isEmpty()) { d_ptr->setMessage(message); } d_ptr->setDaysOfWeek(UCAlarmPrivate::dayOfWeek(AlarmUtils::normalizeDate(dt))); } UCAlarm::UCAlarm(const QDateTime &dt, DaysOfWeek days, const QString &message, QObject *parent) : QObject(parent) , d_ptr(AlarmManager::createAlarmData(this)) { d_ptr->setDate(AlarmUtils::normalizeDate(dt)); d_ptr->setType(Repeating); if (days == AutoDetect) { d_ptr->setDaysOfWeek(UCAlarmPrivate::dayOfWeek(dt)); } else { d_ptr->setDaysOfWeek(days); } if (!message.isEmpty()) { d_ptr->setMessage(message); } } UCAlarm::~UCAlarm() { } bool UCAlarm::operator==(const UCAlarm &that) const { return date() == that.date() && message() == that.message() && type() == that.type() && daysOfWeek() == that.daysOfWeek(); } /*! * \qmlproperty bool Alarm::enabled * The property specifies whether the alarm is enabled or not. Disable dalarms * are not scheduled. * The default value is true; */ bool UCAlarm::enabled() const { return d_ptr->enabled(); } void UCAlarm::setEnabled(bool enabled) { if (d_ptr->setEnabled(enabled)) { d_ptr->changes |= AlarmManager::Enabled; Q_EMIT enabledChanged(); } } /*! * \qmlproperty Date Alarm::date * The property holds the date the alarm will be triggered. The default * value is the current date and time the alarm object was created. Further * \l reset calls will bring the value back to the time the \l reset was called. */ QDateTime UCAlarm::date() const { return d_ptr->date(); } void UCAlarm::setDate(const QDateTime &date) { if (d_ptr->setDate(AlarmUtils::normalizeDate(date))) { d_ptr->changes |= AlarmManager::Date; Q_EMIT dateChanged(); return; } } /*! * \qmlproperty string Alarm::message * The property holds the message string which will be displayed when the alarm * is triggered. The default value is the localized "Alarm" text. */ QString UCAlarm::message() const { return d_ptr->message(); } void UCAlarm::setMessage(const QString &message) { if (d_ptr->setMessage(message)) { d_ptr->changes |= AlarmManager::Message; Q_EMIT messageChanged(); } } /*! * \qmlproperty AlarmType Alarm::type * The property holds the type of the alarm, which can have one of the * following values: * \table * \header * \li {2, 1} Alarm.AlarmType enum: * \header * \li Type * \li Description * \row * \li Alarm.OneTime * \li The alarm occurs only once. * \row * \li Alarm.Repeating * \li The alarm is a repeating one, either daily, weekly on a given day or on * selected days. * \endtable * *The default value is Alarm.OneTime. */ UCAlarm::AlarmType UCAlarm::type() const { return d_ptr->type(); } void UCAlarm::setType(UCAlarm::AlarmType type) { if (d_ptr->setType(type)) { d_ptr->changes |= AlarmManager::Type; Q_EMIT typeChanged(); } } /*! * \qmlproperty DaysOfWeek Alarm::daysOfWeek * The property holds the days of the week the alarm is scheduled. This property * can have only one day set for one time alarms and multiple days for repeating * alarms. * The following flags can be set: * \table * \header * \li {3, 1} Alarm.DayOfWeek enum: * \header * \li Type * \li Value * \li Description * \row * \li Alarm.Monday * \li 0x01 * \li The alarm will kick on Mondays. * \row * \li Alarm.Tuesday * \li 0x02 * \li The alarm will kick on Tuesdays. * \row * \li Alarm.Wednesday * \li 0x04 * \li The alarm will kick on Wednesdays. * \row * \li Alarm.Thursday * \li 0x08 * \li The alarm will kick on Thursdays. * \row * \li Alarm.Friday * \li 0x10 * \li The alarm will kick on Fridays. * \row * \li Alarm.Saturday * \li 0x20 * \li The alarm will kick on Saturdays. * \row * \li Alarm.Sunday * \li 0x40 * \li The alarm will kick on Sundays. * \row * \li Alarm.AutoDetect * \li 0x80 * \li The alarm day will be detected from the alarm date at the time the alarm * is saved. * \endtable * * The default value is Alarm.AutoDetect. */ UCAlarm::DaysOfWeek UCAlarm::daysOfWeek() const { return d_ptr->daysOfWeek(); } void UCAlarm::setDaysOfWeek(UCAlarm::DaysOfWeek days) { if (d_ptr->setDaysOfWeek(days)) { d_ptr->changes |= AlarmManager::Days; Q_EMIT daysOfWeekChanged(); } } /*! * \qmlproperty url Alarm::sound * The property holds the alarm's sound to be played when the alarm is triggered. * An empty url will mean to play the default sound. * * The defaul tvalue is an empty url. */ QUrl UCAlarm::sound() const { return d_ptr->sound(); } void UCAlarm::setSound(const QUrl &sound) { if (d_ptr->setSound(sound)) { d_ptr->changes |= AlarmManager::Sound; Q_EMIT soundChanged(); } } /*! * \qmlproperty Error Alarm::error * The property holds the error code occurred during the last performed operation. * * \table * \header * \li Error code * \li Value * \li Description * \row * \li NoError * \li 0 * \li Successful operation completion. * \row * \li InvalidDate * \li 1 * \li The date specified for the alarm was invalid. * \row * \li EarlyDate * \li 2 * \li The date specified for the alarm is an earlier date than the current one. * \row * \li NoDaysOfWeek * \li 3 * \li The daysOfWeek parameter of the alarm was not specified. * \row * \li OneTimeOnMoreDays * \li 4 * \li The one-time alarm was set to be kicked in several days. * \row * \li InvalidEvent * \li 5 * \li The alarm event is invalid. * \row * \li AdaptationError * \li 100 * \li The error occurred in alarm adaptation layer. Adaptations may define * additional behind this value. * \endtable */ int UCAlarm::error() const { return d_ptr->error; } /*! * \qmlproperty Status Alarm::status * The property holds the status of the last performed operation. It can take one * of the following values: * \table * \header * \li Status code * \li Value * \li Description * \row * \li Ready * \li 1 * \li Specifies either that the Alarm object is ready to perform any operation * or that the previous operation has been successfully completed. * \row * \li InProgress * \li 2 * \li Specifies that there is an operation pending on Alarm object. * \row * \li Fail * \li 3 * \li Specifies that the last alarm operation has failed. The failure code is * set in \l error property. * \endtable * * The notification signal has a parameter specifying the \a operation the status * refers to. The operation can take the following values: * \table * \header * \li Operation code * \li Description * \row * \li NoOperation * \li There is no operation pending. This may be set when an error occured * in the alarm adapters and the operation cannot be determined. * \row * \li Saving * \li The status reported refers to an operation requested through save(). * \row * \li Canceling * \li The status reported refers to an operation requested through cancel(). * \row * \li Reseting * \li The status reported refers to an operation requested through reset(). * \endtable * * For example an implementation which resets the alarm data whenever * the save or cancel operations succeed would look as follows: * * \qml * Alarm { * onStatusChanged: { * if (status !== Alarm.Ready) * return; * if ((operation > Alarm.NoOperation) && (operation < Alarm.Reseting)) { * reset(); * } * } * } * \endqml */ UCAlarm::Status UCAlarm::status() const { return d_ptr->status; } /*! * \qmlmethod Alarm::save() * Updates or adds an alarm to the alarm collection. The operation aligns properties * according to the following rules: * \list * \li - the \l daysOfWeek will be set to the alarm day if the daysOfWeek was set * to Alarm.AutoDetect. * \li - if the \l daysOfWeek is set to a day other than the one specified in the \l date * field, the \l date will be moved ahead to match the day from the \l daysOfWeek. * \endlist * * The function will fail if * \list * \li - the \l date property is invalid * \li - for one time alarm, the \l date property falue is earlier than the current time * \li - the \l daysOfWeek property is set to multiple days for one time alarm * \endlist * * The operation is asynchronous, and its status is reported through the \l status * property. Further operations should wait till the previous operation is completed. * The operation result is stored in the \l error property. */ void UCAlarm::save() { if (d_ptr->status == InProgress) { qmlInfo(this) << QStringLiteral("Alarm has a pending operation."); return; } d_ptr->error = NoError; d_ptr->status = Ready; if (d_ptr->message().isEmpty()) { d_ptr->setMessage(UbuntuI18n::instance()->tr("Alarm")); d_ptr->changes |= AlarmManager::Message; } UCAlarm::Error result = d_ptr->checkAlarm(); if (result != UCAlarm::NoError) { d_ptr->_q_syncStatus(Saving, Fail, result); } else { d_ptr->save(); } } /*! * \qmlmethod Alarm::cancel() * The function removes the alarm from the collection. The function will fail * for alarms which are not yet registered to the collection. * * The operation is asynchronous, and its status is reported through the \l status * property. Further operations should wait till the previous operation is completed. * The operation result is stored in the \l error property. */ void UCAlarm::cancel() { if (d_ptr->status == InProgress) { qmlInfo(this) << QStringLiteral("Alarm has a pending operation."); return; } d_ptr->error = NoError; d_ptr->status = Ready; d_ptr->cancel(); } /*! * \qmlmethod Alarm::reset() * The function resets the alarm properties to its defaults. After this call the * object can be used to create a new alarm event. * * \b Note: do not call this function on alarm objects retrieved from AlarmModel, as * calling it will result in the model being out of sync from the alarm database. */ void UCAlarm::reset() { d_ptr->_q_syncStatus(Reseting, InProgress, NoError); d_ptr->reset(); d_ptr->setDefaults(); d_ptr->changes = AlarmManager::AllFields; d_ptr->_q_syncStatus(Reseting, Ready, NoError); } /*! * \internal * The method returns the alarm cookie. */ QVariant UCAlarm::cookie() const { return d_ptr->cookie(); } #include "moc_ucalarm.cpp" ./src/Ubuntu/Components/plugin/ucnamespace.cpp0000644000015600001650000000421512700370701021560 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "ucnamespace.h" /*! * \qmltype Ubuntu * \instantiates UCNamespace * \inqmlmodule Ubuntu.Components 1.2 * \ingroup ubuntu * \since Ubuntu.Components 1.2 * \brief Provides global object with different enums. * * \section2 Enums * * \section4 CaptionStyle enum * The enumeration configures the Captions component style. * \table * \header * \li Enum * \li Description * \row * \li TitleCaptionStyle * \li The Captions labels are configured to represent caption behavior. * \row * \li SummaryCaptionStyle * \li The Captions labels are configured to represent a summary-like description. * \endtable */ UCNamespace::UCNamespace(QObject *parent) : QObject(parent) { } /*! * \qmlproperty uint16 Ubuntu::toolkitVersion * \since Ubuntu.Components 1.3 * \readonly * The property holds the version of the current toolkit imported. */ /*! * \qmlproperty uint16 Ubuntu::toolkitVersionMajor * \since Ubuntu.Components 1.3 * \readonly * The property holds the major version of the current toolkit imported. */ /*! * \qmlproperty uint16 Ubuntu::toolkitVersionMinor * \since Ubuntu.Components 1.3 * \readonly * The property holds the minor version of the current toolkit imported. */ /*! * \qmlmethod uint16 Ubuntu::version(int major, int minor) * \since Ubuntu.Components 1.3 * The function builds a version identifier using a major and minor components. */ quint16 UCNamespaceV13::version(quint8 major, quint8 minor) { return BUILD_VERSION(major, minor); } ./src/Ubuntu/Components/plugin/ucactionitem.h0000644000015600001650000000472712700370701021435 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCACTIONITEM_H #define UCACTIONITEM_H #include "ucstyleditembase.h" class UCAction; class UCActionItemPrivate; class UCActionItem : public UCStyledItemBase { Q_OBJECT Q_PROPERTY(UCAction *action READ action WRITE setAction NOTIFY actionChanged FINAL) Q_PROPERTY(QString text READ text WRITE setText RESET resetText NOTIFY textChanged) Q_PROPERTY(QUrl iconSource READ iconSource WRITE setIconSource RESET resetIconSource NOTIFY iconSourceChanged) Q_PROPERTY(QString iconName READ iconName WRITE setIconName RESET resetIconName NOTIFY iconNameChanged) // overrides Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled2 NOTIFY enabledChanged2) Q_PROPERTY(bool visible READ isVisible WRITE setVisible2 NOTIFY visibleChanged2 FINAL) public: explicit UCActionItem(QQuickItem *parent = 0); UCAction *action() const; void setAction(UCAction *action); QString text(); void setText(const QString &text); void resetText(); QUrl iconSource(); void setIconSource(const QUrl &iconSource); void resetIconSource(); QString iconName(); void setIconName(const QString &iconName); void resetIconName(); void setVisible2(bool visible); void setEnabled2(bool enabled); Q_SIGNALS: void actionChanged(); void textChanged(); void iconSourceChanged(); void iconNameChanged(); void triggered(const QVariant &value); void enabledChanged2(); void visibleChanged2(); public Q_SLOTS: void trigger(const QVariant &value = QVariant()); protected: UCActionItem(UCActionItemPrivate &, QQuickItem *parent); Q_DECLARE_PRIVATE(UCActionItem) Q_PRIVATE_SLOT(d_func(), void _q_visibleBinding()) Q_PRIVATE_SLOT(d_func(), void _q_enabledBinding()) Q_PRIVATE_SLOT(d_func(), void _q_invokeActionTrigger(const QVariant &value)) }; #endif // UCACTIONITEM_H ./src/Ubuntu/Components/plugin/ucalarm_p.h0000644000015600001650000000553012700370701020705 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCALARM_P_H #define UCALARM_P_H #include "ucalarm.h" #include "alarmmanager_p.h" #include #include #include class UCAlarmPrivate { Q_DECLARE_PUBLIC(UCAlarm) public: UCAlarmPrivate(UCAlarm *qq); virtual ~UCAlarmPrivate(); static UCAlarmPrivate *get(const UCAlarm *alarm) { return const_cast(alarm)->d_ptr.data(); } void setDefaults(); // adaptation API virtual bool enabled() const = 0; virtual bool setEnabled(bool enabled) = 0; virtual QDateTime date() const = 0; virtual bool setDate(const QDateTime &date) = 0; virtual QString message() const = 0; virtual bool setMessage(const QString &message) = 0; virtual UCAlarm::AlarmType type() const = 0; virtual bool setType(UCAlarm::AlarmType type) = 0; virtual UCAlarm::DaysOfWeek daysOfWeek() const = 0; virtual bool setDaysOfWeek(UCAlarm::DaysOfWeek days) = 0; virtual QUrl sound() const = 0; virtual bool setSound(const QUrl &sound) = 0; virtual QVariant cookie() const = 0; virtual UCAlarm::Error checkAlarm() = 0; virtual void save() = 0; virtual void cancel() = 0; virtual void reset() = 0; virtual void completeSave() = 0; virtual void completeCancel() = 0; virtual void copyAlarmData(const UCAlarm &other) = 0; // common privates UCAlarm *q_ptr; unsigned int changes; int error; UCAlarm::Status status; // utility functions static UCAlarm::DayOfWeek dayOfWeek(const QDateTime &dt); static inline bool isDaySet(int dayNumber, UCAlarm::DaysOfWeek days); static int firstDayOfWeek(UCAlarm::DaysOfWeek days); static int nextDayOfWeek(UCAlarm::DaysOfWeek days, int fromDay); static bool multipleDaysSet(UCAlarm::DaysOfWeek days); UCAlarm::Error adjustDow(); UCAlarm::Error checkOneTime(); UCAlarm::Error checkRepeatingWeekly(); // private slots void _q_syncStatus(int operation, int status, int error); }; inline bool UCAlarmPrivate::isDaySet(int dayNumber, UCAlarm::DaysOfWeek days) { return (days & (1 << (dayNumber - 1))) == (1 << (dayNumber - 1)); } #endif // UUALARM_P_H ./src/Ubuntu/Components/plugin/livetimer.cpp0000644000015600001650000001031112700370701021266 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "livetimer.h" #include "livetimer_p.h" /*! \qmltype LiveTimer \instantiates LiveTimer \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu \since Ubuntu.Components 1.3 \brief A live timing source providing peridioc updates. The LiveTimer is a source for periodic signals triggered on second/minute/hour boundaries. The timer can also be set up to provide signals with an increasing frequency the closer a given time is to current time. Examples: \qml import Ubuntu.Components 1.3 LiveTimer { frequency: LiveTimer.Second onTrigger: console.log("The time is now", new Date().toString()); } \endqml \qml import Ubuntu.Components 1.3 LiveTimer { frequency: LiveTimer.Relative relativeTime: new Date() } \endqml */ LiveTimer::LiveTimer(QObject *parent) : QObject(parent) , m_frequency(Disabled) , m_effectiveFrequency(Disabled) , m_lastUpdate(0) { } LiveTimer::~LiveTimer() { unregisterTimer(); } /*! * \qmlsignal LiveTimer::trigger() * Signal called when the timer is triggered */ /*! \qmlproperty enumeration LiveTimer::frequency \since Ubuntu.Components 1.3 This properties defines the frequency at which the LiveTimer signals notifications. \list \li \b LiveTimer.Disabled - disable the LiveTimer \l trigger signal \li \b LiveTimer.Second - emit the \l trigger signal on every change of second. \li \b LiveTimer.Minute - emit the \l trigger signal on every change of minute. \li \b LiveTimer.Hour - emit the \l trigger signal on every change of hour. \li \b LiveTimer.Relative - emit the \l trigger signal periodically depending on how close current time is to to \l relativeTime. If \l relativeTime is within 30 seconds of the current time, trigger every 30 seconds. Within an hour, trigger every minute. Otherwise, trigger every hour until the relative time is more than a week past current time, after which updates are disabled. \note Setting the frequency to LiveTimer.Relative will disable the timer until a \l relativeTime is set. \endlist */ void LiveTimer::setFrequency(LiveTimer::Frequency frequency) { if (m_frequency != frequency) { m_frequency = frequency; Q_EMIT frequencyChanged(); if (m_frequency != Disabled && (m_frequency != Relative || m_relativeTime.isValid())) { registerTimer(); } else { unregisterTimer(); } } } /*! \qmlproperty datetime LiveTimer::relativeTime \since Ubuntu.Components 1.3 This properties defines the value used for proximity evaluation when using Relative mode. \note This property has no impact unless the \l frequency is set to LiveTimer.Relative */ void LiveTimer::setRelativeTime(const QDateTime &relativeTime) { if (m_relativeTime != relativeTime) { m_relativeTime = relativeTime; Q_EMIT relativeTimeChanged(); if (m_frequency == Relative) { if (m_relativeTime.isValid()) { registerTimer(); } else { unregisterTimer(); } } } } void LiveTimer::registerTimer() { SharedLiveTimer::instance().registerTimer(this); QObject::connect(&SharedLiveTimer::instance(), &SharedLiveTimer::trigger, this, &LiveTimer::trigger); } void LiveTimer::unregisterTimer() { QObject::disconnect(&SharedLiveTimer::instance(), &SharedLiveTimer::trigger, this, 0); SharedLiveTimer::instance().unregisterTimer(this); } void LiveTimer::setEffectiveFrequency(LiveTimer::Frequency frequency) { m_effectiveFrequency = frequency; } ./src/Ubuntu/Components/plugin/ucstatesaver_p.h0000644000015600001650000000247112700370701021773 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCSTATESAVER_P_H #define UCSTATESAVER_P_H #include "ucstatesaver.h" #include class UCStateSaverAttachedPrivate { Q_DECLARE_PUBLIC(UCStateSaverAttached) public: UCStateSaverAttachedPrivate(UCStateSaverAttached *qq, QObject *attachee); UCStateSaverAttached *q_ptr; QObject *m_attachee; bool m_enabled:1; QString m_id; QString m_absoluteId; QStringList m_properties; QString absoluteId(const QString &id); void restore(); void watchComponent(bool watch); void _q_init(); void _q_save(); void _q_globalEnableChanged(bool); }; #endif // UCSTATESAVER_P_H ./src/Ubuntu/Components/plugin/ucalarmmodel.h0000644000015600001650000000352112700370701021405 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCALARMSMODEL_H #define UCALARMSMODEL_H #include #include #include "ucalarm.h" class UCAlarm; class UCAlarmModel : public QAbstractListModel, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(int count READ count NOTIFY countChanged) public: explicit UCAlarmModel(QObject *parent = 0); ~UCAlarmModel(); void classBegin(); void componentComplete(); int rowCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; QHash roleNames() const; // invokables Q_INVOKABLE UCAlarm *get(int index); // property getters int count() const; Q_SIGNALS: void countChanged(); public Q_SLOTS: Q_REVISION(1) void refresh(); private Q_SLOTS: void refreshStart(); void refreshEnd(); void update(int index); void removeStarted(int index); void removeFinished(); void insertStarted(int index); void insertFinished(); void moveStarted(int from, int to); void moveFinished(); private: bool m_moved:1; }; #endif // UCALARMSMODEL_H ./src/Ubuntu/Components/plugin/adapters/0000755000015600001650000000000012700370701020371 5ustar jenkinsjenkins./src/Ubuntu/Components/plugin/adapters/actionsproxy_p.cpp0000644000015600001650000001142512700370701024161 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "actionsproxy_p.h" #include "ucactioncontext.h" #include Q_LOGGING_CATEGORY(ucActionProxy, "ubuntu.components.ActionProxy", QtMsgType::QtWarningMsg) #define AP_TRACE(params) qCDebug(ucActionProxy) << params ActionProxy::ActionProxy() : globalContext(new UCActionContext) { // for testing purposes globalContext->setObjectName("GlobalActionContext"); } ActionProxy::~ActionProxy() { // clear context explicitly, as global context is not connected to clearContextActions(globalContext); delete globalContext; } const QSet &ActionProxy::localContexts() { return instance().m_localContexts; } // function called by the ActionManager when completed to publish global ActionContext // actions. void ActionProxy::publishGlobalContext() { if (instance().globalContext) { instance().publishContextActions(instance().globalContext); instance().globalContext->markActionsPublished(true); } } // add a local context void ActionProxy::addContext(UCActionContext *context) { if (!context) { return; } if (instance().m_localContexts.contains(context)) { return; } instance().m_localContexts.insert(context); AP_TRACE("ADD CONTEXT" << context); } // Remove a local context. If the context was active, removes the actions from the system. void ActionProxy::removeContext(UCActionContext *context) { if (!context) { return; } // make sure the context is deactivated context->setActive(false); instance().m_localContexts.remove(context); AP_TRACE("REMOVE CONTEXT FROM REGISTRY" << context); } // publishes/removes context actions on activation/deactivation void ActionProxy::activateContext(UCActionContext *context) { if (!context) { return; } // if a context to be activated is a popup one, we must deactivate all other ones // and then activate this if (context->active()) { // publish the context's actions to the system instance().publishContextActions(context); context->markActionsPublished(true); if (context->isPopup()) { instance().addPopupContext(static_cast(context)); } else { AP_TRACE("ACTIVATE CONTEXT" << context); } } else { // remove actions from the system instance().clearContextActions(context); context->markActionsPublished(false); if (context->isPopup()) { instance().removePopupContext(static_cast(context)); } else { AP_TRACE("DEACTIVATE CONTEXT" << context); } } } void ActionProxy::addPopupContext(UCPopupContext *context) { // deactivate last context and append UCPopupContext *lastActive = m_popupContexts.isEmpty() ? Q_NULLPTR : m_popupContexts.top(); if (lastActive) { lastActive->setEffectiveActive(false); AP_TRACE("DEACTIVATE POPUPCONTEXT" << lastActive); } m_popupContexts.push(context); AP_TRACE("ACTIVATE POPUPCONTEXT" << context); } void ActionProxy::removePopupContext(UCPopupContext *context) { UCPopupContext *last = m_popupContexts.isEmpty() ? Q_NULLPTR : m_popupContexts.top(); if (last == context) { // we are about to remove the last one AP_TRACE("DEACTIVATE POPUPCONTEXT" << last); m_popupContexts.pop(); // and then re-activate the second last one last = m_popupContexts.isEmpty() ? Q_NULLPTR : m_popupContexts.top(); if (last) { AP_TRACE("REACTIVATE POPUPCONTEXT" << last); last->setEffectiveActive(true); } } else { // we simply remove the context and leave AP_TRACE("REMOVE POPUPCONTEXT" << context); m_popupContexts.removeAll(context); } } // empty functions for context activation/deactivation, connect to HUD void ActionProxy::clearContextActions(UCActionContext *context) { Q_UNUSED(context); } /* * Publish actions of a context to the system. Implementations should make sure * only unpublished actions are exported. */ void ActionProxy::publishContextActions(UCActionContext *context) { Q_UNUSED(context); } ./src/Ubuntu/Components/plugin/adapters/alarmsadapter_organizer.cpp0000644000015600001650000006540612700370701026010 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "ucalarm.h" #include "ucalarm_p.h" #include "alarmmanager_p.h" #include "alarmsadapter_p.h" #include #include #include #include #include #include #include #include #include #define ALARM_DATABASE "%1/alarms.json" /* * The main alarm manager engine used from Saucy onwards is EDS (Evolution Data * Server) based. Any previous release uses the generic "memory" manager engine * which does not store alarm data, does not schedule organizer events and does * not give visual or audible reminding. */ #define ALARM_MANAGER "eds" #define ALARM_MANAGER_FALLBACK "memory" #define ALARM_COLLECTION "Alarms" // special tags used as workaround for bug #1361702 const char *tagAlarmService = "x-canonical-alarm"; const char *tagDisabledAlarm = "x-canonical-disabled"; QTORGANIZER_USE_NAMESPACE /*----------------------------------------------------------------------------- * Adaptation layer for Alarm Data. */ AlarmDataAdapter::AlarmDataAdapter(UCAlarm *qq) : UCAlarmPrivate(qq) { reset(); } AlarmDataAdapter::~AlarmDataAdapter() { } bool AlarmDataAdapter::enabled() const { return !event.tags().contains(tagDisabledAlarm); } bool AlarmDataAdapter::setEnabled(bool enabled) { if (enabled == this->enabled()) { return false; } if (enabled) { // remove eventual x-canonical-disabled tag as agreed in bug #1361702 QStringList tags = event.tags(); tags.removeAll(tagDisabledAlarm); event.setTags(tags); } else { // tag the alarm as disabled, using x-canonical-disabled as agreed in bug #1361702 event.addTag(tagDisabledAlarm); } return true; } QDateTime AlarmDataAdapter::date() const { return QDateTime(event.startDateTime().date(), event.startDateTime().time(), Qt::LocalTime); } bool AlarmDataAdapter::setDate(const QDateTime &date) { if (this->date() == date) { return false; } QDateTime dt = AlarmUtils::normalizeDate(date); if (AlarmsAdapter::get()->manager->managerName() == ALARM_MANAGER) { // use invalid timezone to simulate floating time for EDS backend dt = QDateTime(dt.date(), dt.time(), QTimeZone()); } event.setStartDateTime(dt); return true; } QString AlarmDataAdapter::message() const { return event.displayLabel(); } bool AlarmDataAdapter::setMessage(const QString &message) { if (event.displayLabel() == message) { return false; } event.setDisplayLabel(message); // set the visual attachment QOrganizerItemVisualReminder visual = event.detail(QOrganizerItemDetail::TypeVisualReminder); if (!visual.isEmpty()) { // remove previous attachment event.removeDetail(&visual); } visual.setSecondsBeforeStart(0); visual.setMessage(message); event.saveDetail(&visual); return true; } UCAlarm::AlarmType AlarmDataAdapter::type() const { return alarmType; } bool AlarmDataAdapter::setType(UCAlarm::AlarmType type) { if (alarmType == type) { return false; } alarmType = type; return true; } UCAlarm::DaysOfWeek AlarmDataAdapter::daysOfWeek() const { return dow; } bool AlarmDataAdapter::setDaysOfWeek(UCAlarm::DaysOfWeek days) { if (days == dow) { return false; } dow = days; return true; } QUrl AlarmDataAdapter::sound() const { QOrganizerItemAudibleReminder audible = event.detail(QOrganizerItemDetail::TypeAudibleReminder); return audible.dataUrl(); } bool AlarmDataAdapter::setSound(const QUrl &sound) { QOrganizerItemAudibleReminder audible = event.detail(QOrganizerItemDetail::TypeAudibleReminder); if (audible.dataUrl() == sound) { return false; } // make sure we have the attachments saved in any case if (!audible.isEmpty()) { // remove previous attachment event.removeDetail(&audible); } audible.setSecondsBeforeStart(0); audible.setDataUrl(sound); event.saveDetail(&audible); return true; } QVariant AlarmDataAdapter::cookie() const { return QVariant::fromValue(event.id()); } UCAlarm::Error AlarmDataAdapter::checkAlarm() { QDateTime dt = date(); if (!dt.isValid()) { return UCAlarm::InvalidDate; } setDate(AlarmUtils::normalizeDate(dt)); // check type first as it may alter start day UCAlarm::Error result = UCAlarm::NoError; UCAlarm::AlarmType alarmType = type(); if (alarmType == UCAlarm::OneTime) { result = checkOneTime(); } else if (alarmType == UCAlarm::Repeating) { result = checkRepeatingWeekly(); } if (result == UCAlarm::NoError) { // update recurrence adjustDowSettings(alarmType, dow); } return result; } // create a request and push the job /* * Save or update an alarm. Returns false on operation error. */ void AlarmDataAdapter::save() { // if we have an inactive request, delete it if (request && !request->isActive()) { delete request; } if (event.id().managerUri().isEmpty()) { changes = AlarmManager::AllFields; } QOrganizerItemSaveRequest *saveRequest = new QOrganizerItemSaveRequest(q_ptr); saveRequest->setItem(event); request = saveRequest; startOperation(UCAlarm::Saving, SLOT(completeSave())); } void AlarmDataAdapter::cancel() { // if we have an inactive request, delete it if (request && !request->isActive()) { delete request; } if (event.id().managerUri().isEmpty()) { _q_syncStatus(UCAlarm::Canceling, UCAlarm::Fail, UCAlarm::InvalidEvent); return; } QOrganizerItemRemoveByIdRequest *cancelRequest = new QOrganizerItemRemoveByIdRequest(q_ptr); cancelRequest->setItemId(event.id()); request = cancelRequest; startOperation(UCAlarm::Canceling, SLOT(completeCancel())); } void AlarmDataAdapter::reset() { setData(QOrganizerTodo()); } // starts an outstanding organizer operation void AlarmDataAdapter::startOperation(UCAlarm::Operation operation, const char *completionSlot) { request->setManager(AlarmsAdapter::get()->manager); _q_syncStatus(operation, UCAlarm::InProgress, UCAlarm::NoError); QObject::connect(request.data(), SIGNAL(stateChanged(QOrganizerAbstractRequest::State)), q_ptr, completionSlot); if (!request->start()) { _q_syncStatus(operation, UCAlarm::Fail, AlarmsAdapter::UnhandledRequest); } } // complete save operation; new alarms will be fetched when itemsModified() signal is received. void AlarmDataAdapter::completeSave() { // we either get error or success if (request->state() != QOrganizerAbstractRequest::FinishedState) { return; } int error = request->error(); if (error != QOrganizerManager::NoError) { _q_syncStatus(UCAlarm::Saving, UCAlarm::Fail, AlarmsAdapter::OrganizerError + error); } else { // complete save QOrganizerItemSaveRequest *save = static_cast(request.data()); if (save->items().count() <= 0) { _q_syncStatus(UCAlarm::Saving, UCAlarm::Fail, UCAlarm::InvalidEvent); } else { setData(save->items()[0]); changes = AlarmManager::NoChange; _q_syncStatus(UCAlarm::Saving, UCAlarm::Ready, UCAlarm::NoError); } } } void AlarmDataAdapter::completeCancel() { // we either get error or success if (request->state() != QOrganizerAbstractRequest::FinishedState) { return; } int error = request->error(); if (error != QOrganizerManager::NoError) { _q_syncStatus(UCAlarm::Canceling, UCAlarm::Fail, AlarmsAdapter::OrganizerError + error); } else { // complete save setData(QOrganizerTodo()); changes = AlarmManager::NoChange; _q_syncStatus(UCAlarm::Canceling, UCAlarm::Ready, UCAlarm::NoError); } } void AlarmDataAdapter::copyAlarmData(const UCAlarm &other) { AlarmDataAdapter *pOther = static_cast(AlarmDataAdapter::get(&other)); setData(pOther->data()); } void AlarmDataAdapter::adjustDowSettings(UCAlarm::AlarmType type, UCAlarm::DaysOfWeek days) { QOrganizerItemRecurrence old = event.detail(QOrganizerItemDetail::TypeRecurrence); event.removeDetail(&old); switch (type) { case UCAlarm::OneTime: { break; } case UCAlarm::Repeating: { QOrganizerRecurrenceRule rule; if (days == UCAlarm::AutoDetect) { rule.setFrequency(QOrganizerRecurrenceRule::Weekly); rule.setDaysOfWeek(daysToSet(dayOfWeek(date()))); } else if (days == UCAlarm::Daily) { rule.setFrequency(QOrganizerRecurrenceRule::Daily); } else if (days) { rule.setFrequency(QOrganizerRecurrenceRule::Weekly); rule.setDaysOfWeek(daysToSet(days)); } event.setRecurrenceRule(rule); break; } default: break; } } QSet AlarmDataAdapter::daysToSet(int days) { QSet result; for (Qt::DayOfWeek day = Qt::Monday; day <= Qt::Sunday; day = static_cast(static_cast(day) + 1)) { if (days & (1 << (static_cast(day) - 1))) result << day; } return result; } UCAlarm::DaysOfWeek AlarmDataAdapter::daysFromSet(const QSet &set) { UCAlarm::DaysOfWeek days = 0; QSetIterator i(set); while (i.hasNext()) { int day = static_cast(i.next()); days |= static_cast(1 << (day - 1)); } return days; } void AlarmDataAdapter::setData(const QOrganizerTodo &data) { event = data; // add x-canonical-alarm tag as agreed in bug #1361702 if (!event.tags().contains(tagAlarmService)) { event.addTag(tagAlarmService); } event.setCollectionId(AlarmsAdapter::get()->collection.id()); event.setAllDay(false); QOrganizerRecurrenceRule rule = event.recurrenceRule(); switch (rule.frequency()) { case QOrganizerRecurrenceRule::Weekly: { alarmType = UCAlarm::Repeating; dow = daysFromSet(rule.daysOfWeek()); break; } case QOrganizerRecurrenceRule::Daily: { alarmType = UCAlarm::Repeating; dow = UCAlarm::Daily; break; } default: alarmType = UCAlarm::OneTime; dow = dayOfWeek(date()); break; } } /*----------------------------------------------------------------------------- * Adaptation layer for Alarms. */ AlarmManagerPrivate * createAlarmsAdapter(AlarmManager *alarms) { return new AlarmsAdapter(alarms); } AlarmsAdapter::AlarmsAdapter(AlarmManager *qq) : QObject(qq) , AlarmManagerPrivate(qq) , manager(0) { // register QOrganizerItemId comparators so QVariant == operator can compare them QMetaType::registerComparators(); QString envManager(qgetenv("ALARM_BACKEND")); if (envManager.isEmpty()) envManager = ALARM_MANAGER; if (!QOrganizerManager::availableManagers().contains(envManager)) { qWarning() << "WARNING: alarm manager" << envManager << "not installed, using" << QString(ALARM_MANAGER_FALLBACK); envManager = ALARM_MANAGER_FALLBACK; } manager = new QOrganizerManager(envManager); manager->setParent(q_ptr); QList collections = manager->collections(); if (collections.count() > 0) { Q_FOREACH(const QOrganizerCollection &c, collections) { if (c.metaData(QOrganizerCollection::KeyName).toString() == ALARM_COLLECTION) { collection = c; break; } } } if (collection.id().isNull()) { // create alarm collection collection.setMetaData(QOrganizerCollection::KeyName, ALARM_COLLECTION); // EDS requires extra metadata to be set collection. setExtendedMetaData("collection-type", "Task List"); if (!manager->saveCollection(&collection)) { qWarning() << "WARNING: Creating dedicated collection for alarms was not possible, alarms will be saved into the default collection!"; collection = manager->defaultCollection(); } } } void AlarmsAdapter::alarmOperation(QList > list) { typedef QPair OperationPair; Q_FOREACH(const OperationPair &op, list) { switch (op.second) { case QOrganizerManager::Add: { insertAlarm(op.first); break; } case QOrganizerManager::Change: { updateAlarm(op.first); break; } case QOrganizerManager::Remove: { removeAlarm(op.first); // save alarm data break; } } } saveAlarms(); } void AlarmsAdapter::init() { completed = true; loadAlarms(); // connect to manager to receive changes QObject::connect(manager, SIGNAL(itemsModified(QList >)), this, SLOT(alarmOperation(QList >))); QObject::connect(manager, SIGNAL(dataChanged()), this, SLOT(fetchAlarms())); } AlarmsAdapter::~AlarmsAdapter() { } UCAlarmPrivate * AlarmsAdapter::createAlarmData(UCAlarm *alarm) { return new AlarmDataAdapter(alarm); } // load fallback manager data void AlarmsAdapter::loadAlarms() { if (manager->managerName() != ALARM_MANAGER_FALLBACK) { return; } QFile file(QString(ALARM_DATABASE).arg(QStandardPaths::writableLocation(QStandardPaths::DataLocation))); if (!file.open(QFile::ReadOnly)) { return; } QByteArray data = file.readAll(); QJsonDocument document(QJsonDocument::fromJson(data)); QJsonArray array = document.array(); for (int i = 0; i < array.size(); i++) { QJsonObject object = array[i].toObject(); // use UCAlarm to save store JSON data UCAlarm alarm; alarm.setMessage(object["message"].toString()); alarm.setDate(QDateTime::fromString(object["date"].toString())); alarm.setSound(object["sound"].toString()); alarm.setType(static_cast(object["type"].toInt())); alarm.setDaysOfWeek(static_cast(object["days"].toInt())); alarm.setEnabled(object["enabled"].toBool()); AlarmDataAdapter *pAlarm = static_cast(UCAlarmPrivate::get(&alarm)); // call checkAlarm to complete field checks (i.e. type vs daysOfWeek, kick date, etc) pAlarm->checkAlarm(); QOrganizerTodo event = pAlarm->data(); manager->saveItem(&event); } file.close(); } // save fallback manager data only void AlarmsAdapter::saveAlarms() { if (manager->managerName() != ALARM_MANAGER_FALLBACK) { return; } QDir dir(QStandardPaths::writableLocation(QStandardPaths::DataLocation)); if (!dir.exists()) { dir.mkpath(QStandardPaths::writableLocation(QStandardPaths::DataLocation)); } QFile file(QString(ALARM_DATABASE).arg(dir.path())); if (!file.open(QFile::WriteOnly | QFile::Truncate)) { return; } QJsonArray data; for(int i = 0; i < alarmList.count(); i++) { // create an UCAlarm and set its event to ease conversions const UCAlarm *alarm = alarmList[i]; QJsonObject object; object["message"] = alarm->message(); object["date"] = alarm->date().toString(); object["sound"] = alarm->sound().toString(); object["type"] = QJsonValue(alarm->type()); object["days"] = QJsonValue(alarm->daysOfWeek()); object["enabled"] = QJsonValue(alarm->enabled()); data.append(object); } QJsonDocument document(data); file.write(document.toJson()); file.close(); } /*----------------------------------------------------------------------------- * Abstract methods * verify the adaptation layer for the stored data * expected value type based on change: * - AlarmData::Enabled - bool * - AlarmData::Date - QDateTime * - AlarmData::Message - QString * - AlarmData::Sound - QString * - AlarmData::Type - UCAlarm::Type * - AlarmData::Days - UCAlarm::DaysOfWeek */ bool AlarmsAdapter::verifyChange(UCAlarm *alarm, AlarmManager::Change change, const QVariant &value) { AlarmDataAdapter *pAlarm = static_cast(UCAlarmPrivate::get(alarm)); QOrganizerItemId id = pAlarm->data().id(); QOrganizerTodo todo = static_cast(manager->item(id)); if (todo.isEmpty()) { return false; } switch (change) { case AlarmManager::Enabled: { Q_ASSERT(value.type() == QVariant::Bool); if (value.toBool()) { return !todo.tags().contains(tagDisabledAlarm) && todo.tags().contains(tagAlarmService); } else { return todo.tags().contains(tagDisabledAlarm) && todo.tags().contains(tagAlarmService); } } case AlarmManager::Date: { return todo.startDateTime() == value.toDateTime(); } case AlarmManager::Message: { return todo.displayLabel() == value.toString(); } case AlarmManager::Sound: { // it is enough to check the audible presence, as they are added/removed in pair with visual reminder QOrganizerItemAudibleReminder audible = todo.detail(QOrganizerItemDetail::TypeAudibleReminder); return audible.dataUrl().toString() == value.toString(); } case AlarmManager::Type: { QOrganizerRecurrenceRule rule = todo.recurrenceRule(); QOrganizerRecurrenceRule::Frequency frequency = rule.frequency(); UCAlarm::AlarmType type = static_cast(value.toInt()); return (type == UCAlarm::OneTime && frequency == QOrganizerRecurrenceRule::Invalid) || (type == UCAlarm::Repeating && (frequency == QOrganizerRecurrenceRule::Daily || frequency == QOrganizerRecurrenceRule::Weekly)); } case AlarmManager::Days: { // this only checks the days set QOrganizerRecurrenceRule rule = todo.recurrenceRule(); QOrganizerRecurrenceRule::Frequency frequency = rule.frequency(); if (frequency == QOrganizerRecurrenceRule::Invalid) { return false; } int days = value.toInt(); if (days == UCAlarm::Daily && frequency == QOrganizerRecurrenceRule::Daily) { return true; } if (frequency == QOrganizerRecurrenceRule::Weekly) { return rule.daysOfWeek() == AlarmDataAdapter::daysToSet(days); } return false; } default: return false; break; } } bool AlarmsAdapter::fetchAlarms() { if (fetchRequest && fetchRequest->isActive()) { // there is already a fetch request ongoing, exit return false; } if (!fetchRequest) { fetchRequest = new QOrganizerItemFetchRequest(this); fetchRequest->setManager(manager); // set sort order QOrganizerItemSortOrder sortOrder; sortOrder.setDirection(Qt::AscendingOrder); sortOrder.setDetail(QOrganizerItemDetail::TypeTodoTime, QOrganizerTodoTime::FieldStartDateTime); fetchRequest->setSorting(QList() << sortOrder); // set filter QOrganizerItemCollectionFilter filter; filter.setCollectionId(collection.id()); fetchRequest->setFilter(filter); // start request QObject::connect(fetchRequest, SIGNAL(stateChanged(QOrganizerAbstractRequest::State)), this, SLOT(completeFetchAlarms())); } Q_EMIT q_ptr->alarmsRefreshStarted(); return fetchRequest->start(); } int AlarmsAdapter::alarmCount() { return alarmList.count(); } UCAlarm *AlarmsAdapter::getAlarmAt(int index) const { Q_ASSERT(index >= 0 && index < alarmList.count()); return const_cast(alarmList[index]); } bool AlarmsAdapter::findAlarm(const UCAlarm &alarm, const QVariant &cookie) const { QOrganizerItemId id = cookie.value(); QOrganizerItem item = manager->item(id); if (item.type() == QOrganizerItemType::TypeTodo) { AlarmDataAdapter *pAlarm = static_cast(UCAlarmPrivate::get(&alarm)); pAlarm->setData(static_cast(item)); return true; } return false; } // returns a todo event from an ID, which can be an occurence QOrganizerTodo AlarmsAdapter::todoItem(const QOrganizerItemId &id) { QOrganizerTodo event; if (!id.isNull()) { const QOrganizerItem item = manager->item(id); if (item.type() == QOrganizerItemType::TypeTodoOccurrence) { QOrganizerTodoOccurrence occurrence = static_cast(item); QOrganizerItemId eventId = occurrence.parentId(); event = static_cast(manager->item(eventId)); } else if (item.type() == QOrganizerItemType::TypeTodo){ event = static_cast(item); } } return event; } void AlarmsAdapter::insertAlarm(const QOrganizerItemId &id) { QOrganizerTodo event = todoItem(id); if (event.isEmpty()) { return; } // if we have the alarm registered, leave if (alarmList.indexOf(event.id()) >= 0) { return; } // use UCAlarm to fix date UCAlarm alarm; AlarmDataAdapter *pAlarm = static_cast(UCAlarmPrivate::get(&alarm)); pAlarm->setData(event); adjustAlarmOccurrence(*pAlarm); // insert and get the index int index = alarmList.insert(alarm); Q_EMIT q_ptr->alarmInsertStarted(index); Q_EMIT q_ptr->alarmInsertFinished(); } // updates an alarm and returns the index, -1 on error void AlarmsAdapter::updateAlarm(const QOrganizerItemId &id) { QOrganizerTodo event = todoItem(id); if (event.isEmpty()) { return; } // update alarm data int index = alarmList.indexOf(event.id()); if (index < 0) { // it can be that the organizer item ID is not an alarm or it is an occurrence of // an organizer event return; } // use UCAlarm to ease conversions UCAlarm alarm; AlarmDataAdapter *pAlarm = static_cast(UCAlarmPrivate::get(&alarm)); pAlarm->setData(event); adjustAlarmOccurrence(*pAlarm); int newIndex = alarmList.update(index, alarm); if (newIndex == index) { Q_EMIT q_ptr->alarmUpdated(index); } else { Q_EMIT q_ptr->alarmMoveStarted(index, newIndex); Q_EMIT q_ptr->alarmMoveFinished(); } } // removes an alarm from the list void AlarmsAdapter::removeAlarm(const QOrganizerItemId &id) { if (id.isNull()) { return; } int index = alarmList.indexOf(id); if (index < 0) { // this may be an item we don't handle, organizer manager may report us // other calendar event removals as well. return; } // emit removal start Q_EMIT q_ptr->alarmRemoveStarted(index); alarmList.removeAt(index); Q_EMIT q_ptr->alarmRemoveFinished(); } void AlarmsAdapter::completeFetchAlarms() { if (fetchRequest->state() != QOrganizerAbstractRequest::FinishedState) { return; } alarmList.clear(); QSet parentId; QOrganizerTodo event; Q_FOREACH(const QOrganizerItem &item, fetchRequest->items()) { // repeating alarms may be fetched as occurences, therefore check their parent event if (item.type() == QOrganizerItemType::TypeTodoOccurrence) { QOrganizerTodoOccurrence occurrence = static_cast(item); QOrganizerItemId eventId = occurrence.parentId(); if (parentId.contains(eventId)) { continue; } parentId << eventId; event = static_cast(manager->item(eventId)); } else if (item.type() == QOrganizerItemType::TypeTodo){ event = static_cast(item); } else { continue; } // use UCAlarm to ease conversions UCAlarm alarm; AlarmDataAdapter *pAlarm = static_cast(UCAlarmPrivate::get(&alarm)); pAlarm->setData(event); adjustAlarmOccurrence(*pAlarm); alarmList.insert(alarm); } completed = true; Q_EMIT q_ptr->alarmsRefreshed(); } void AlarmsAdapter::adjustAlarmOccurrence(AlarmDataAdapter &alarm) { if (alarm.type() == UCAlarm::OneTime) { return; } // with EDS we need to query the occurrences separately as the fetch reports only the main events // with fallback manager this does not reduce the performance and does work the same way. QDateTime currentDate = AlarmUtils::normalizeDate(QDateTime::currentDateTime()); if (alarm.date() > currentDate) { // no need to adjust date, the event occurs in the future return; } QDateTime startDate; QDateTime endDate; if (alarm.type() == UCAlarm::Repeating) { // 8 days is enough from the starting date (or current date depending on the start date) startDate = (alarm.date() > currentDate) ? alarm.date() : currentDate; endDate = startDate.addDays(8); } QList occurrences = manager->itemOccurrences(alarm.data(), startDate, endDate, 10); // get the first occurrence and use the date from it if ((occurrences.length() > 0) && (occurrences[0].type() == QOrganizerItemType::TypeTodoOccurrence)) { // loop till we get a proper future due date for (int i = 0; i < occurrences.count(); i++) { QOrganizerTodoOccurrence occurrence = static_cast(occurrences[i]); // check if the date is after the current datetime // the first occurrence is the one closest to the currentDate, therefore we can safely // set that startDate to the alarm alarm.setDate(occurrence.startDateTime()); if (alarm.date() > currentDate) { // we have the proper date set, leave break; } } } } ./src/Ubuntu/Components/plugin/adapters/alarmsadapter_p.h0000644000015600001650000001423512700370701023706 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef ALARMSADAPTER_P_H #define ALARMSADAPTER_P_H #include "alarmmanager_p_p.h" #include #include #include QTORGANIZER_USE_NAMESPACE /*----------------------------------------------------------------------------- * Adaptation layer for Alarms. */ class AlarmDataAdapter : public UCAlarmPrivate { public: AlarmDataAdapter(UCAlarm *qq); ~AlarmDataAdapter(); bool enabled() const; bool setEnabled(bool enabled); QDateTime date() const; bool setDate(const QDateTime &date); QString message() const; bool setMessage(const QString &message); UCAlarm::AlarmType type() const; bool setType(UCAlarm::AlarmType type); UCAlarm::DaysOfWeek daysOfWeek() const; bool setDaysOfWeek(UCAlarm::DaysOfWeek days); QUrl sound() const; bool setSound(const QUrl &sound); QVariant cookie() const; UCAlarm::Error checkAlarm(); void save(); void cancel(); void reset(); bool wait(int msec); void completeSave(); void completeCancel(); void copyAlarmData(const UCAlarm &other); // adaptation specific data void adjustDowSettings(UCAlarm::AlarmType type, UCAlarm::DaysOfWeek days); static QSet daysToSet(int days); static UCAlarm::DaysOfWeek daysFromSet(const QSet &set); inline QOrganizerTodo const &data() { return event; } void setData(const QOrganizerTodo &data); protected: QOrganizerTodo event; UCAlarm::AlarmType alarmType; UCAlarm::DaysOfWeek dow; QPointer request; void startOperation(UCAlarm::Operation operation, const char *completionSlot); }; // list of alarms class AlarmList { public: AlarmList(){} void clear() { qDeleteAll(data); data.clear(); idHash.clear(); } int count() const { return data.count(); } const UCAlarm *operator[](int index) const { QPair key = data.keys()[index]; return data.value(key); } // update event at index, returns the new event index int update(int index, const UCAlarm &alarm) { // take alarm from previous index, update its data and insert it again UCAlarm *oldAlarm = takeAt(index); // copy the other alarm data AlarmDataAdapter *pAlarm = static_cast(AlarmDataAdapter::get(oldAlarm)); pAlarm->copyAlarmData(alarm); // and insert it back QDateTime dt = oldAlarm->date(); QOrganizerItemId id = oldAlarm->cookie().value(); idHash.insert(id, dt); data.insert(QPair(dt, id), oldAlarm); return indexOf(id); } // insert an alarm event into the list int insert(const UCAlarm &alarm) { QDateTime dt = alarm.date(); QOrganizerItemId id = alarm.cookie().value(); idHash.insert(id, dt); UCAlarm *newAlarm = new UCAlarm; UCAlarmPrivate::get(newAlarm)->copyAlarmData(alarm); data.insert(QPair(dt, id), newAlarm); return indexOf(id); } // returns the index of the alarm matching the id, -1 on error int indexOf(const QOrganizerItemId &id) { QDateTime dt = idHash.value(id); QPair key(dt, id); return data.keys().indexOf(key); } // remove alarm at index void removeAt(int index) { UCAlarm *alarm = takeAt(index); delete alarm; } protected: // removes alarm data at index and returns the alarm pointer UCAlarm *takeAt(int index) { QPair key = data.keys()[index]; UCAlarm *alarm = data.take(key); idHash.remove(key.second); return alarm; } private: // ordered map by occurrence date + event id, ascending QMap< QPair, UCAlarm*> data; // alarms ordered based on even id QHash idHash; }; class AlarmsAdapter : public QObject, public AlarmManagerPrivate { Q_OBJECT public: enum Error { FetchedEventEmpty = UCAlarm::AdaptationError + 1, // 101 UnhandledEventType, // 102 UnhandledRequest, // 103 OrganizerError // 104 onwards }; AlarmsAdapter(AlarmManager *qq); virtual ~AlarmsAdapter(); static AlarmsAdapter* get(AlarmManager *instance = 0) { return static_cast(AlarmManagerPrivate::get(instance)); } QOrganizerManager *manager; QOrganizerCollection collection; void init(); int alarmCount(); UCAlarm *getAlarmAt(int index) const; bool findAlarm(const UCAlarm &alarm, const QVariant &cookie) const; void adjustAlarmOccurrence(AlarmDataAdapter &alarm); void loadAlarms(); void saveAlarms(); bool verifyChange(UCAlarm *alarm, AlarmManager::Change change, const QVariant &value); UCAlarmPrivate *createAlarmData(UCAlarm *alarm); void insertAlarm(const QOrganizerItemId &id); void updateAlarm(const QOrganizerItemId &id); void removeAlarm(const QOrganizerItemId &id); private Q_SLOTS: void completeFetchAlarms(); bool fetchAlarms(); void alarmOperation(QList >); protected: QPointer fetchRequest; AlarmList alarmList; QOrganizerTodo todoItem(const QOrganizerItemId &id); }; #endif // ALARMSADAPTER_P_H ./src/Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp0000644000015600001650000001607512700370701025545 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "dbuspropertywatcher_p.h" #include #include #include #include "i18n.h" #include #define DYNAMIC_PROPERTY "__q_property" UCServicePropertiesPrivate *createServicePropertiesAdapter(UCServiceProperties *owner) { return new DBusServiceProperties(owner); } DBusServiceProperties::DBusServiceProperties(UCServiceProperties *qq) : UCServicePropertiesPrivate(qq) , connection("") , watcher(0) , iface(0) { } bool DBusServiceProperties::init() { // crear previous connections setStatus(UCServiceProperties::Inactive); delete iface; iface = 0; delete watcher; watcher = 0; setError(QString()); if (service.isEmpty() || path.isEmpty()) { setStatus(UCServiceProperties::ConnectionError); setError("No service/path specified"); return false; } switch (type) { case UCServiceProperties::System: { connection = QDBusConnection::systemBus(); break; } case UCServiceProperties::Session: { connection = QDBusConnection::sessionBus(); break; } default: { setStatus(UCServiceProperties::ConnectionError); setError(QStringLiteral("Invalid bus type: %1.").arg(type)); return false; } } Q_Q(UCServiceProperties); // connect dbus watcher to catch OwnerChanged watcher = new QDBusServiceWatcher(service, connection, QDBusServiceWatcher::WatchForOwnerChange, q); // connect interface iface = new QDBusInterface(service, path, interface, connection, q); if (!iface->isValid()) { setStatus(UCServiceProperties::ConnectionError); setError(iface->lastError().message()); return false; } // connect watcher to get owner changes QObject::connect(watcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)), this, SLOT(changeServiceOwner(QString,QString,QString))); return setupInterface(); } /* * Connect dbus signal identified by (service, path, iface, name) quaduple to a * slot to receive property changes. */ bool DBusServiceProperties::setupInterface() { QDBusReply dbusObjectPath = iface->call("FindUserById", qlonglong(getuid())); if (dbusObjectPath.isValid()) { objectPath = dbusObjectPath.value().path(); iface->connection().connect( service, objectPath, "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(updateProperties(QString,QVariantMap,QStringList))); return true; } setStatus(UCServiceProperties::ConnectionError); setError(dbusObjectPath.error().message()); return false; } bool DBusServiceProperties::fetchPropertyValues() { scannedProperties = properties; Q_FOREACH(QString property, properties) { readProperty(property); } return true; } /* * Reads a property value from the adaptorInterface asynchronously. */ bool DBusServiceProperties::readProperty(const QString &property) { if ((status < UCServiceProperties::Synchronizing) || objectPath.isEmpty()) { return false; } Q_Q(UCServiceProperties); QDBusInterface readIFace(iface->interface(), objectPath, "org.freedesktop.DBus.Properties", connection); if (!readIFace.isValid()) { // report invalid interface only if the property's first letter was with capital one! if (property[0].isUpper()) { warning(readIFace.lastError().message()); } return false; } QDBusPendingCall pending = readIFace.asyncCall("Get", adaptor, property); if (pending.isError()) { warning(pending.error().message()); return false; } QDBusPendingCallWatcher *callWatcher = new QDBusPendingCallWatcher(pending, q); QObject::connect(callWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(readFinished(QDBusPendingCallWatcher*))); // set a dynamic property so we know which property are we reading callWatcher->setProperty(DYNAMIC_PROPERTY, property); return true; } /* * Writes a property value to theadaptorInterface synchronously. It is for pure testing purposes. */ bool DBusServiceProperties::testProperty(const QString &property, const QVariant &value) { if (objectPath.isEmpty()) { return false; } QDBusInterface writeIFace(iface->interface(), objectPath, "org.freedesktop.DBus.Properties", connection); if (!writeIFace.isValid()) { // invalid interface return false; } QDBusMessage msg = writeIFace.call("Set", adaptor, property, QVariant::fromValue(QDBusVariant(value))); return msg.type() == QDBusMessage::ReplyMessage; } /* * Slot called when the async read operation finishes. */ void DBusServiceProperties::readFinished(QDBusPendingCallWatcher *call) { Q_Q(UCServiceProperties); QDBusPendingReply reply = *call; QString property = call->property(DYNAMIC_PROPERTY).toString(); scannedProperties.removeAll(property); if (reply.isError()) { // remove the property from being watched, as it has no property like that properties.removeAll(property); if (property[0].isUpper()) { // report error! warning(reply.error().message()); } } else { // update watched property value // make sure we have lower case when the property value is updated property[0] = property[0].toLower(); q->setProperty(property.toLocal8Bit().constData(), reply.value()); } if ((status == UCServiceProperties::Synchronizing) && scannedProperties.isEmpty()) { // set status to active setStatus(UCServiceProperties::Active); } // delete watcher call->deleteLater(); } /* * Slot called when service owner is changed. */ void DBusServiceProperties::changeServiceOwner(const QString &serviceName, const QString &oldOwner, const QString &newOwner) { Q_UNUSED(oldOwner); Q_UNUSED(newOwner); if (serviceName != service) { return; } setupInterface(); } /* * Slot called when the properties are changed in the service. */ void DBusServiceProperties::updateProperties(const QString &onInterface, const QVariantMap &map, const QStringList &invalidated) { Q_UNUSED(onInterface); Q_UNUSED(map); Q_FOREACH(const QString &property, invalidated) { readProperty(property); } } ./src/Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.h0000644000015600001650000000343212700370701025203 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef DBUSPROPERTYWATCHER_P_H #define DBUSPROPERTYWATCHER_P_H #include #include #include #include #include "ucserviceproperties_p.h" class QDBusPendingCallWatcher; class DBusServiceProperties : public QObject, public UCServicePropertiesPrivate { Q_OBJECT Q_DECLARE_PUBLIC(UCServiceProperties) public: DBusServiceProperties(UCServiceProperties *qq); bool init(); bool fetchPropertyValues(); bool readProperty(const QString &property); // for testing purposes only!!! bool testProperty(const QString &property, const QVariant &value); QStringList scannedProperties; QDBusConnection connection; QDBusServiceWatcher *watcher; QDBusInterface *iface; QString objectPath; bool setupInterface(); public Q_SLOTS: void readFinished(QDBusPendingCallWatcher *watcher); void changeServiceOwner(const QString &serviceName, const QString &oldOwner, const QString &newOwner); void updateProperties(const QString &iface, const QVariantMap &map, const QStringList &invalidated); }; #endif // DBUSPROPERTYWATCHER_P_H ./src/Ubuntu/Components/plugin/adapters/actionsproxy_p.h0000644000015600001650000000326312700370701023627 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef ACTIONSPROXY_P_H #define ACTIONSPROXY_P_H #include #include #include #include "ucaction.h" class UCActionContext; class UCPopupContext; class ActionProxy { public: ~ActionProxy(); static ActionProxy &instance() { static ActionProxy instance; return instance; } UCActionContext *globalContext; static const QSet &localContexts(); static void publishGlobalContext(); static void addContext(UCActionContext *context); static void removeContext(UCActionContext *context); static void activateContext(UCActionContext *context); protected: ActionProxy(); protected: virtual void clearContextActions(UCActionContext *context); virtual void publishContextActions(UCActionContext *context); private: QSet m_localContexts; QStack m_popupContexts; void addPopupContext(UCPopupContext *context); void removePopupContext(UCPopupContext *context); }; #endif // ACTIONSPROXY_P_H ./src/Ubuntu/Components/plugin/unitythemeiconprovider.cpp0000644000015600001650000002227112700370714024121 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: Lars Uebernickel */ #include "unitythemeiconprovider.h" #include #include #include #include #include #include #include class IconTheme { public: typedef QSharedPointer IconThemePointer; // Returns the icon theme named @name, creating it if it didn't exist yet. static IconThemePointer get(const QString &name) { static QHash themes; IconThemePointer theme = themes[name]; if (theme.isNull()) { theme = IconThemePointer(new IconTheme(name)); themes[name] = theme; } return theme; } // Does a breadth-first search for an icon with any name in @names. Parent // themes are only looked at if the current theme doesn't contain any icon // in @names. QPixmap findBestIcon(const QStringList &names, const QSize &size, QSet *alreadySearchedThemes) { if (alreadySearchedThemes) { if (alreadySearchedThemes->contains(name)) return QPixmap(); alreadySearchedThemes->insert(name); } Q_FOREACH(const QString &name, names) { QPixmap pixmap = lookupIcon(name, size); if (!pixmap.isNull()) return pixmap; } Q_FOREACH(IconThemePointer theme, parents) { QPixmap pixmap = theme->findBestIcon(names, size, alreadySearchedThemes); if (!pixmap.isNull()) return pixmap; } return QPixmap(); } private: enum SizeType { Fixed, Scalable, Threshold }; struct Directory { QString path; SizeType sizeType; int size, minSize, maxSize, threshold; }; IconTheme(const QString &name): name(name) { QStringList paths = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation); Q_FOREACH(const QString &path, paths) { QDir dir(path + "/icons/" + name); if (dir.exists()) baseDirs.append(dir.absolutePath()); } Q_FOREACH(const QString &baseDir, baseDirs) { QString filename = baseDir + "/index.theme"; if (QFileInfo::exists(filename)) { QSettings settings(filename, QSettings::IniFormat); Q_FOREACH(const QString &path, settings.value("Icon Theme/Directories").toStringList()) { Directory dir; dir.path = path; dir.sizeType = sizeTypeFromString(settings.value(path + "/Type", "Fixed").toString()); dir.size = settings.value(path + "/Size", 32).toInt(); dir.minSize = settings.value(path + "/MinSize", 0).toInt(); dir.maxSize = settings.value(path + "/MaxSize", 0).toInt(); dir.threshold = settings.value(path + "/Threshold", 0).toInt(); directories.append(dir); } Q_FOREACH(const QString &name, settings.value("Icon Theme/Inherits").toStringList()) { if (name != QLatin1String("hicolor")) { parents.append(IconTheme::get(name)); } } // there can only be one index.theme break; } } } SizeType sizeTypeFromString(const QString &string) { if (string == QLatin1String("Fixed")) return Fixed; if (string == QLatin1String("Scalable")) return Scalable; if (string == QLatin1String("Threshold")) return Threshold; qWarning() << "IconTheme: unknown size type '" << string << "'. Assuming 'Fixed'."; return Fixed; } static QPixmap loadIcon(const QString &filename, const QSize &size) { QPixmap pixmap; const bool anyZero = size.width() <= 0 || size.height() <= 0; const Qt::AspectRatioMode scaleMode = anyZero ? Qt::KeepAspectRatioByExpanding : Qt::KeepAspectRatio; if (filename.endsWith(QLatin1String(".png"))) { pixmap = QPixmap(filename); if (!pixmap.isNull() && !size.isNull() && (pixmap.width() != size.width() || pixmap.height() != size.height())) { const QSize newSize = pixmap.size().scaled(size.width(), size.height(), scaleMode); pixmap = pixmap.scaled(newSize); } } else if (filename.endsWith(QLatin1String(".svg"))) { QSvgRenderer renderer(filename); pixmap = QPixmap(renderer.defaultSize().scaled(size.width(), size.height(), scaleMode)); pixmap.fill(Qt::transparent); QPainter painter(&pixmap); renderer.render(&painter); painter.end(); } return pixmap; } QString lookupIconFile(const QString &dir, const QString &name) { QString png = QStringLiteral("%1/%2.png").arg(dir, name); QString svg = QStringLiteral("%1/%2.svg").arg(dir, name); Q_FOREACH(const QString &baseDir, baseDirs) { QString filename = baseDir + "/" + png; if (QFileInfo::exists(filename)) return filename; filename = baseDir + "/" + svg; if (QFileInfo::exists(filename)) return filename; } return QString(); } QPixmap lookupIcon(const QString &iconName, const QSize &size) { const int iconSize = qMax(size.width(), size.height()); if (iconSize > 0) return lookupBestMatchingIcon(iconName, size); else return lookupLargestIcon(iconName); } QPixmap lookupBestMatchingIcon(const QString &iconName, const QSize &size) { int minDistance = 10000; QString bestFilename; Q_FOREACH(const Directory &dir, directories) { int dist = directorySizeDistance(dir, size); if (dist >= minDistance) continue; QString filename = lookupIconFile(dir.path, iconName); if (!filename.isNull()) { minDistance = dist; bestFilename = filename; // bail out early if we can't get a better size match if (minDistance == 0) break; } } if (!bestFilename.isNull()) return loadIcon(bestFilename, size); return QPixmap(); } QPixmap lookupLargestIcon(const QString &iconName) { int maxSize = 0; QString bestFilename; Q_FOREACH(const Directory &dir, directories) { int size = dir.sizeType == Scalable ? dir.maxSize : dir.size; if (size < maxSize) continue; QString filename = lookupIconFile(dir.path, iconName); if (!filename.isNull()) { maxSize = size; bestFilename = filename; } } if (!bestFilename.isNull()) return loadIcon(bestFilename, QSize(maxSize, maxSize)); return QPixmap(); } int directorySizeDistance(const Directory &dir, const QSize &iconSize) { const int size = qMax(iconSize.width(), iconSize.height()); switch (dir.sizeType) { case Fixed: return qAbs(size - dir.size); case Scalable: return qAbs(size - qBound(dir.minSize, size, dir.maxSize)); case Threshold: return qAbs(size - qBound(dir.size - dir.threshold, size, dir.size + dir.threshold)); default: return 10000; } } QString name; QStringList baseDirs; QList directories; QList parents; }; UnityThemeIconProvider::UnityThemeIconProvider(const QString &themeName): QQuickImageProvider(QQuickImageProvider::Pixmap) { theme = IconTheme::get(themeName); } QPixmap UnityThemeIconProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) { // The hicolor theme will be searched last as per // https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html QSet alreadySearchedThemes; const QStringList names = id.split(QLatin1Char(','), QString::SkipEmptyParts); QPixmap pixmap = theme->findBestIcon(names, requestedSize, &alreadySearchedThemes); if (pixmap.isNull()) { IconTheme::IconThemePointer theme = IconTheme::get(QStringLiteral("hicolor")); return theme->findBestIcon(names, requestedSize, nullptr); } *size = pixmap.size(); return pixmap; } ./src/Ubuntu/Components/plugin/plugin.h0000644000015600001650000000302312700370701020233 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Juhapekka Piiroinen */ #ifndef UBUNTU_COMPONENTS_PLUGIN_H #define UBUNTU_COMPONENTS_PLUGIN_H #include #include class QWindow; class UbuntuComponentsPlugin : public QQmlExtensionPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") public: void registerTypes(const char *uri); void initializeEngine(QQmlEngine *engine, const char *uri); static const QUrl &pluginUrl() { return m_baseUrl; } static void initializeContextProperties(QQmlEngine*); private Q_SLOTS: void registerWindowContextProperty(); void setWindowContextProperty(QWindow* focusWindow); private: static QUrl m_baseUrl; void initializeBaseUrl(); void registerTypesToVersion(const char *uri, int major, int minor); }; #endif // UBUNTU_COMPONENTS_PLUGIN_H ./src/Ubuntu/Components/plugin/ucdefaulttheme.cpp0000644000015600001650000000517012700370701022274 0ustar jenkinsjenkins/* * Copyright 2013-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: Zsombor Egri * Florian Boucault */ #include "ucdefaulttheme.h" #include "uctheme.h" #include #include #include #include /* User theme settings are stored in $XDG_CONFIG_HOME/ubuntu-ui-toolkit/theme.ini file, which contains the current global theme name. */ const QString SETTINGS_FILE_FORMAT("%1/ubuntu-ui-toolkit/theme.ini"); const QString THEME_KEY("theme"); const QString DEFAULT_THEME("Ubuntu.Components.Themes.Ambiance"); UCDefaultTheme::UCDefaultTheme(QObject *parent) : QObject(parent), m_settings(SETTINGS_FILE_FORMAT.arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)), QSettings::IniFormat) { // fundamental features rely on the default theme, so bail out if it's absent if (!pathFromThemeName(DEFAULT_THEME).isValid()) { qWarning() << "Mandatory default theme" << DEFAULT_THEME << "missing!"; } // check if there is a theme settings file, if not, create one if (!QFile::exists(m_settings.fileName())) { // create the file by writing the default theme m_settings.setValue(THEME_KEY, DEFAULT_THEME); m_settings.sync(); } QObject::connect(&m_settingsFileWatcher, &QFileSystemWatcher::fileChanged, this, &UCDefaultTheme::reloadSettings); reloadSettings(); } void UCDefaultTheme::reloadSettings() { m_settings.sync(); m_settingsFileWatcher.addPath(m_settings.fileName()); QString themeName = m_settings.value(THEME_KEY).toString(); if (themeName != m_themeName) { m_themeName = themeName; Q_EMIT themeNameChanged(); } } QString UCDefaultTheme::themeName() const { return m_themeName; } void UCDefaultTheme::setThemeName(const QString &themeName) { if (themeName != m_themeName) { m_themeName = themeName; m_settings.setValue(THEME_KEY, themeName); Q_EMIT themeNameChanged(); } } ./src/Ubuntu/Components/plugin/ucstylehints.cpp0000644000015600001650000002332712700370714022043 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "ucstylehints.h" #include "ucstyleditembase_p.h" #include "propertychange_p.h" #include // verifies property declaration correctness void UCStyleHintsParser::verifyBindings(const QV4::CompiledData::Unit *qmlUnit, const QList &bindings) { Q_FOREACH(const QV4::CompiledData::Binding *binding, bindings) { verifyProperty(qmlUnit, binding); } } void UCStyleHintsParser::verifyProperty(const QV4::CompiledData::Unit *qmlUnit, const QV4::CompiledData::Binding *binding) { if (binding->type == QV4::CompiledData::Binding::Type_Object) { error(qmlUnit->objectAt(binding->value.objectIndex), "StyleHints does not support creating state-specific objects."); return; } // group properties or attached properties, we do handle those as well if (binding->type == QV4::CompiledData::Binding::Type_GroupProperty || binding->type == QV4::CompiledData::Binding::Type_AttachedProperty) { const QV4::CompiledData::Object *subObj = qmlUnit->objectAt(binding->value.objectIndex); const QV4::CompiledData::Binding *subBinding = subObj->bindingTable(); for (quint32 i = 0; i < subObj->nBindings; ++i, ++subBinding) { verifyProperty(qmlUnit, subBinding); } } // filter out signals! QString propertyName = qmlUnit->stringAt(binding->propertyNameIndex); if (propertyName.startsWith("on") && propertyName.at(2).isUpper()) { error(binding, "Signal properties are not supported."); return; } } // decodes property declarations, stores the bindings and values void UCStyleHintsParser::applyBindings(QObject *obj, QQmlCompiledData *cdata, const QList &bindings) { UCStyleHints *hints = static_cast(obj); QV4::CompiledData::Unit *qmlUnit = cdata->compilationUnit->data; UCStyledItemBase *styledItem = qobject_cast(hints->parent()); if (!styledItem) { // error will be reported in componentCompleted return; } Q_FOREACH(const QV4::CompiledData::Binding *binding, bindings) { hints->decodeBinding(QString(), qmlUnit, binding); } hints->m_cdata = cdata; hints->m_decoded = true; } void UCStyleHints::decodeBinding(const QString &propertyPrefix, const QV4::CompiledData::Unit *qmlUnit, const QV4::CompiledData::Binding *binding) { QString propertyName = propertyPrefix + qmlUnit->stringAt(binding->propertyNameIndex); // handle grouped properties first if (binding->type == QV4::CompiledData::Binding::Type_GroupProperty || binding->type == QV4::CompiledData::Binding::Type_AttachedProperty) { const QV4::CompiledData::Object *subObj = qmlUnit->objectAt(binding->value.objectIndex); const QV4::CompiledData::Binding *subBinding = subObj->bindingTable(); QString pre = propertyName + "."; for (quint32 i = 0; i < subObj->nBindings; ++i, ++subBinding) { decodeBinding(pre, qmlUnit, subBinding); } return; } switch (binding->type) { case QV4::CompiledData::Binding::Type_Script: { QString expression = binding->valueAsScriptString(qmlUnit); QUrl url = QUrl(); int line = -1; int column = -1; QQmlData *ddata = QQmlData::get(this); if (ddata && ddata->outerContext) { #if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) QUrl outerContextUrl(ddata->outerContext->url()); #else QUrl outerContextUrl(ddata->outerContext->url); #endif if (!outerContextUrl.isEmpty()) { url = outerContextUrl; line = ddata->lineNumber; column = ddata->columnNumber; } } m_expressions << Expression(propertyName, binding->value.compiledScriptIndex, expression, url, line, column); break; } case QV4::CompiledData::Binding::Type_Translation: case QV4::CompiledData::Binding::Type_TranslationById: case QV4::CompiledData::Binding::Type_String: { m_values << qMakePair(propertyName, binding->valueAsString(qmlUnit)); break; } case QV4::CompiledData::Binding::Type_Number: { m_values << qMakePair(propertyName, binding->valueAsNumber()); break; } case QV4::CompiledData::Binding::Type_Boolean: { m_values << qMakePair(propertyName, binding->valueAsBoolean()); break; } } } void UCStyleHints::propertyNotFound(const QString &styleName, const QString &property) { if (!m_ignoreUnknownProperties) { qmlInfo(this) << QString("Style '%1' has no property called '%2'.").arg(styleName).arg(property); } } /*! * \qmltype StyleHints * \instantiates UCStyleHints * \inmodule Ubuntu Components 1.3 * \ingroup ubuntu * \since Ubuntu.Components 1.3 * \brief Component holding style specific properties to configure a particular * StyledItem's style runtime. * * StyleHints is a custom parser, meaning style properties can be listed without * any property declaration, same way as in PropertyChanges or Connections, which * are similar custom parsers. Properties enumerated do not have to be present in * the component's style as default, behavior which can be chenged by setting \l * ignoreUnknownProperties to true. In this case properties not found in the style * will be displayed as warnings. * * In the following example the Button will be drawn as white when not pressed, and * colored as blue when pressed. * \qml * Button { * id: button * StyleHints { * defaultColor: button.pressed ? "blue" : "white" * } * } * \endqml * * StyleHints does not support signal properties (i.e signal handlers) and object * declarations as property values. * * StyleHints can be only declared in a \l StyledItem or as a derivate of it. */ /*! * \qmlproperty bool StyleHints::ignoreUnknownProperties * The property drives whether component should warn on properties not found in * the component's style. The default setting is not to warn. */ UCStyleHints::UCStyleHints(QObject *parent) : QObject(parent) , m_decoded(false) , m_completed(false) , m_ignoreUnknownProperties(true) { } UCStyleHints::~UCStyleHints() { qDeleteAll(m_propertyBackup); m_propertyBackup.clear(); } void UCStyleHints::classBegin() { m_styledItem = qobject_cast(parent()); if (m_styledItem) { connect(m_styledItem, SIGNAL(styleInstanceChanged()), this, SLOT(_q_applyStyleHints())); } else { qmlInfo(this) << "StyleHints must be declared in a StyledItem or a derivate of it."; } } void UCStyleHints::componentComplete() { m_completed = (m_styledItem != Q_NULLPTR); _q_applyStyleHints(); } // apply the style hints and check each property existence void UCStyleHints::_q_applyStyleHints() { if (!m_completed || !m_decoded || !m_styledItem || !UCStyledItemBasePrivate::get(m_styledItem)->styleItem) { return; } // restore properties first qDeleteAll(m_propertyBackup); m_propertyBackup.clear(); QQuickItem *item = UCStyledItemBasePrivate::get(m_styledItem)->styleItem; const QMetaObject *mo = item->metaObject(); const QString styleName = UCStyledItemBasePrivate::get(m_styledItem)->styleName(); // apply values first for (int i = 0; i < m_values.size(); i++) { if (mo->indexOfProperty(m_values[i].first.toUtf8()) < 0) { propertyNotFound(styleName, m_values[i].first); continue; } PropertyChange *change = new PropertyChange(item, m_values[i].first.toUtf8()); PropertyChange::setValue(change, m_values[i].second); m_propertyBackup << change; } QQmlContext *context = qmlContext(this); // then apply expressions/bindings for (int ii = 0; ii < m_expressions.count(); ii++) { Expression e = m_expressions[ii]; PropertyChange *change = new PropertyChange(item, e.name.toUtf8()); if (!change->property().isValid()) { propertyNotFound(styleName, e.name); delete change; continue; } // create a binding object from the expression using the palette context QQmlContextData *cdata = QQmlContextData::get(context); QQmlBinding *newBinding = 0; if (e.id != QQmlBinding::Invalid) { QV4::Scope scope(QQmlEnginePrivate::getV4Engine(qmlEngine(this))); #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) QV4::ScopedValue function(scope, QV4::FunctionObject::createQmlFunction(cdata, item, m_cdata->compilationUnit->runtimeFunctions[e.id])); #else QV4::ScopedValue function(scope, QV4::QmlBindingWrapper::createQmlCallableForFunction(cdata, item, m_cdata->compilationUnit->runtimeFunctions[e.id])); #endif newBinding = new QQmlBinding(function, item, cdata); } if (!newBinding) { newBinding = new QQmlBinding(e.expression, item, cdata, e.url.toString(), e.line, e.column); } newBinding->setTarget(change->property()); PropertyChange::setBinding(change, newBinding); } } ./src/Ubuntu/Components/plugin/ucstyleditembase.h0000644000015600001650000000671612700370714022323 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCSTYLEDITEMBASE_H #define UCSTYLEDITEMBASE_H #include #include "ucthemingextension.h" class UCStyledItemBasePrivate; class UCTheme; class UCStyleHints; class UCStyledItemBase : public QQuickItem, public UCThemingExtension { Q_OBJECT Q_INTERFACES(UCThemingExtension) Q_PROPERTY(bool keyNavigationFocus READ keyNavigationFocus NOTIFY keyNavigationFocusChanged REVISION 2) Q_PROPERTY(bool activeFocusOnPress READ activefocusOnPress WRITE setActiveFocusOnPress NOTIFY activeFocusOnPressChanged REVISION 1) // FIXME Re-expose property that would be inaccessible due to a QML bug // https://bugs.launchpad.net/ubuntu/+source/qtdeclarative-opensource-src/+bug/1389721 Q_PROPERTY(bool activeFocusOnTab READ activeFocusOnTab2 WRITE setActiveFocusOnTab2 NOTIFY activeFocusOnTabChanged2 FINAL) Q_PRIVATE_PROPERTY(UCStyledItemBase::d_func(), QQmlComponent *style READ style WRITE setStyle RESET resetStyle NOTIFY styleChanged FINAL DESIGNABLE false) Q_PRIVATE_PROPERTY(UCStyledItemBase::d_func(), QQuickItem *__styleInstance READ styleInstance NOTIFY styleInstanceChanged FINAL DESIGNABLE false) Q_PRIVATE_PROPERTY(UCStyledItemBase::d_func(), QString styleName READ styleName WRITE setStyleName NOTIFY styleNameChanged FINAL REVISION 2) Q_PROPERTY(UCTheme *theme READ getTheme WRITE setTheme RESET resetTheme NOTIFY themeChanged FINAL REVISION 2) public: explicit UCStyledItemBase(QQuickItem *parent = 0); virtual bool keyNavigationFocus() const; bool activefocusOnPress() const; void setActiveFocusOnPress(bool value); bool activeFocusOnTab2() const; void setActiveFocusOnTab2(bool value); public Q_SLOTS: Q_REVISION(1) bool requestFocus(Qt::FocusReason reason = Qt::OtherFocusReason); Q_SIGNALS: void styleChanged(); void styleInstanceChanged(); Q_REVISION(2) void keyNavigationFocusChanged(); Q_REVISION(1) void activeFocusOnPressChanged(); Q_REVISION(1) void activeFocusOnTabChanged2(); Q_REVISION(2) void themeChanged(); Q_REVISION(2) void styleNameChanged(); protected: UCStyledItemBase(UCStyledItemBasePrivate &, QQuickItem *parent); // from UCThemingExtension interface virtual void preThemeChanged(); virtual void postThemeChanged(); void classBegin(); void componentComplete(); void itemChange(ItemChange change, const ItemChangeData &data); void focusInEvent(QFocusEvent *key); void focusOutEvent(QFocusEvent *key); void mousePressEvent(QMouseEvent *event); bool childMouseEventFilter(QQuickItem *child, QEvent *event); private: Q_DECLARE_PRIVATE(UCStyledItemBase) Q_PRIVATE_SLOT(d_func(), void _q_styleResized()) }; #endif // UCSTYLEDITEMBASE_H ./src/Ubuntu/Components/plugin/ucscalingimageprovider.h0000644000015600001650000000205312700370701023465 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #ifndef SCALINGIMAGEPROVIDER_H #define SCALINGIMAGEPROVIDER_H #include #include class UCScalingImageProvider : public QQuickImageProvider { public: explicit UCScalingImageProvider(); QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize); }; #endif // SCALINGIMAGEPROVIDER_H ./src/Ubuntu/Components/plugin/alarmmanager_p_p.h0000644000015600001650000000362412700370701022231 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef ALARMMANAGER_P_H #define ALARMMANAGER_P_H #include "ucalarm.h" #include "ucalarm_p.h" #include "alarmmanager_p.h" #include class AlarmManagerPrivate { Q_DECLARE_PUBLIC(AlarmManager) public: AlarmManagerPrivate(AlarmManager *qq); virtual ~AlarmManagerPrivate(); static AlarmManagerPrivate *get(AlarmManager *instance = 0) { if (!instance) { return AlarmManager::instance().d_ptr.data(); } else { return instance->d_ptr.data(); } } AlarmManager *q_ptr; bool completed:1; virtual void init() = 0; virtual bool fetchAlarms() = 0; virtual int alarmCount() = 0; virtual UCAlarm *getAlarmAt(int index) const = 0; virtual bool findAlarm(const UCAlarm &alarm, const QVariant &cookie) const = 0; // function to verify whether the given alarm property has a given value set // used for testing purposes virtual bool verifyChange(UCAlarm *alarm, AlarmManager::Change change, const QVariant &value) = 0; // creates an alarm data adaptation object virtual UCAlarmPrivate *createAlarmData(UCAlarm *alarm) = 0; }; AlarmManagerPrivate * createAlarmsAdapter(AlarmManager *alarms); #endif // ALARMMANAGER_P_H ./src/Ubuntu/Components/plugin/uclistitemactions_p.h0000644000015600001650000000275412700370701023031 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCLISTITEMACTIONS_P_H #define UCLISTITEMACTIONS_P_H #include "uclistitemactions.h" #include "QtCore/private/qobject_p.h" #include class UCListItem; class UCListItemActionsPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(UCListItemActions) public: UCListItemActionsPrivate(); ~UCListItemActionsPrivate(); static UCListItemActionsPrivate* get(UCListItemActions *actions) { return actions ? actions->d_func() : 0; } QQmlComponent *delegate; QList actions; QList data; static int actions_count(QQmlListProperty *p); static void actions_append(QQmlListProperty *p, UCAction *v); static UCAction *actions_at(QQmlListProperty*, int); static void actions_clear(QQmlListProperty*); }; #endif // UCLISTITEMACTIONS_P_H ./src/Ubuntu/Components/plugin/sortfiltermodel.cpp0000644000015600001650000001640012700370701022511 0ustar jenkinsjenkins/* * Copyright (C) 2012-2014 Canonical, Ltd. * * Authors: * Michal Hruby * Christian Dywan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "sortfiltermodel.h" /*! * \qmltype SortFilterModel * \instantiates QSortFilterProxyModelQML * \inqmlmodule Ubuntu.Components 0.1 * \ingroup ubuntu * \brief SortFilterModel sorts and filters rows from an existing model. * * The SortFilterModel takes an existing model such as a ListModel or * any QAbstractItemModel implementation. The original rows and role names * show up in the SortFilterModel with two basic differences. For one if * \l sort.property is set all rows will be sorted. Further more if * \l filter.property is set only rows matching the filter will be in the model. * * Example usage: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * import Ubuntu.Components.ListItems 1.1 * * MainView { * width: units.gu(80) * height: units.gu(40) * * ListModel { * id: movies * ListElement { * title: "Esign" * producer: "Chris Larkee" * } * ListElement { * title: "Elephants Dream" * producer: "Blender" * } * ListElement { * title: "Big Buck Bunny" * producer: "Blender" * } * } * * SortFilterModel { * id: sortedMovies * model: movies * sort.property: "title" * sort.order: Qt.DescendingOrder * // case insensitive sorting * sortCaseSensitivity: Qt.CaseInsensitive * * filter.property: "producer" * filter.pattern: /blender/ * } * * ListView { * model: sortedMovies * anchors.fill: parent * * delegate: Subtitled { * text: title * subText: producer * } * * section.delegate: ListItem.Header { text: i18n.tr(section) } * section.property: "title" * section.criteria: ViewSection.FirstCharacter * } * } * \endqml * * Pay attention to the differences between the original model and the result: * \list * \li Big Buck Bunny will be the first row, because it's sorted by title * \li Esign won't be visible, because it's from the wrong producer * \endlist */ QSortFilterProxyModelQML::QSortFilterProxyModelQML(QObject *parent) : QSortFilterProxyModel(parent) { // This is virtually always what you want in QML setDynamicSortFilter(true); connect(this, SIGNAL(modelReset()), SIGNAL(countChanged())); connect(this, SIGNAL(rowsInserted(QModelIndex,int,int)), SIGNAL(countChanged())); connect(this, SIGNAL(rowsRemoved(QModelIndex,int,int)), SIGNAL(countChanged())); connect(&m_sortBehavior, &SortBehavior::propertyChanged, this, &QSortFilterProxyModelQML::sortChangedInternal); connect(&m_sortBehavior, &SortBehavior::orderChanged, this, &QSortFilterProxyModelQML::sortChangedInternal); connect(&m_filterBehavior, &FilterBehavior::propertyChanged, this, &QSortFilterProxyModelQML::filterChangedInternal); connect(&m_filterBehavior, &FilterBehavior::patternChanged, this, &QSortFilterProxyModelQML::filterChangedInternal); } int QSortFilterProxyModelQML::roleByName(const QString& roleName) const { const QHash roles = roleNames(); QHashIterator i(roles); while (i.hasNext()) { i.next(); if (i.value() == roleName) return i.key(); } return 0; } /*! * \qmlproperty string SortFilterModel::sort.property * * If set to a valid role name, all rows will be sorted according to \l sort.order. */ /*! * \qmlproperty string SortFilterModel::sort.order * * The order, if \l sort.property is set. * Qt::AscendingOrder sorts results from A to Z or 0 to 9. * Qt::DescendingOrder sorts results from Z to A or 9 to 0. */ SortBehavior* QSortFilterProxyModelQML::sortBehavior() { return &m_sortBehavior; } /*! * \qmlproperty string SortFilterModel::filter.pattern * * The pattern all rows must match, if \l filter.property is set. * * Some examples: * \list * \li /possible/ matches anywhere in a word, so both "impossible" and "possible". * \li /^sign/ matches "sign". But not "assignment" because ^ means start. * \li /vest$/ matches "safety vest" and "vest" but not "vested". * \endlist * * For more advanced uses it's recommended to read up on Javascript regular expressions. */ /*! * \qmlproperty string SortFilterModel::filter.property * * If set to a valid role name, only rows matching \l filter.pattern will be in the model. */ FilterBehavior* QSortFilterProxyModelQML::filterBehavior() { return &m_filterBehavior; } void QSortFilterProxyModelQML::sortChangedInternal() { setSortRole(roleByName(m_sortBehavior.property())); sort(sortColumn() != -1 ? sortColumn() : 0, m_sortBehavior.order()); Q_EMIT sortChanged(); } void QSortFilterProxyModelQML::filterChangedInternal() { setFilterRole(roleByName(m_filterBehavior.property())); setFilterRegExp(m_filterBehavior.pattern()); Q_EMIT filterChanged(); } QHash QSortFilterProxyModelQML::roleNames() const { return sourceModel() ? sourceModel()->roleNames() : QHash(); } /*! * \qmlproperty QAbstractItemModel SortFilterModel::model * * The source model to sort and/ or filter. */ void QSortFilterProxyModelQML::setModel(QAbstractItemModel *itemModel) { if (itemModel == NULL) { return; } if (itemModel != sourceModel()) { if (sourceModel() != NULL) { sourceModel()->disconnect(this); } setSourceModel(itemModel); // Roles mapping to role names may change setSortRole(roleByName(m_sortBehavior.property())); setFilterRole(roleByName(m_filterBehavior.property())); Q_EMIT modelChanged(); } } QVariantMap QSortFilterProxyModelQML::get(int row) { QVariantMap res; const QHash roles = roleNames(); QHashIterator i(roles); while (i.hasNext()) { i.next(); res.insert(i.value(), data(row, i.key())); } return res; } QVariant QSortFilterProxyModelQML::data(int row, int role) { if (sourceModel() == NULL) { return QVariant(); } return index(row, 0).data(role); } int QSortFilterProxyModelQML::count() { return rowCount(); } bool QSortFilterProxyModelQML::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { if (filterRegExp().isEmpty()) { return true; } bool result = QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); return result; } #include "moc_sortfiltermodel.cpp" ./src/Ubuntu/Components/plugin/ucdeprecatedtheme.cpp0000644000015600001650000001171012700370701022745 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: Zsombor Egri */ #include "ucnamespace.h" #include "ucdeprecatedtheme.h" #include "uctheme.h" #include "quickutils.h" #include "listener.h" #include #include #include #include /*! \qmltype Theme \instantiates UCTheme \inqmlmodule Ubuntu.Components 1.1 \ingroup theming \brief The Theme class provides facilities to interact with the current theme. A global instance is exposed as the \b Theme context property. The theme defines the visual aspect of the Ubuntu components. Example changing the current theme: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 Item { Button { onClicked: Theme.name = "Ubuntu.Components.Themes.Ambiance" } } \endqml Example creating a style component: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 StyledItem { id: myItem style: Theme.createStyleComponent("MyItemStyle.qml", myItem) } \endqml \sa {StyledItem} */ UCDeprecatedTheme::UCDeprecatedTheme(UCTheme *theme) : QObject(theme) { m_notes = QHash(); connect(theme, SIGNAL(nameChanged()), this, SIGNAL(nameChanged())); connect(theme, SIGNAL(paletteChanged()), this, SIGNAL(paletteChanged())); } UCTheme *UCDeprecatedTheme::defaultTheme() { QQmlEngine *engine = qmlEngine(this); Q_ASSERT(engine); return UCTheme::defaultTheme(engine); } void UCDeprecatedTheme::showDeprecatedNote(QObject *onItem, const char *note) { if (!QuickUtils::showDeprecationWarnings()) return; QQmlContext ctx(QQmlEngine::contextForObject(onItem)); // No warnings due to deprecated code used in the components themselves if (ctx.baseUrl().toString().contains("/Ubuntu/Components/")) return; // Warnings without a filename are not helpful if (ctx.baseUrl().isEmpty()) return; QString noteId(QString("%1.%2").arg(note).arg(onItem->metaObject()->className())); if (m_notes.contains(noteId)) return; QByteArray suppressNote = qgetenv("SUPPRESS_DEPRECATED_NOTE"); qmlInfo(onItem) << note; m_notes.insert(noteId, true); } /*! \qmlproperty string Theme::name The name of the current theme. */ QString UCDeprecatedTheme::name() { showDeprecatedNote(this, "Theme.name is deprecated. Use ThemeSettings instead."); return defaultTheme()->name(); } void UCDeprecatedTheme::setName(const QString& name) { showDeprecatedNote(this, "Theme.name is deprecated. Use ThemeSettings instead."); defaultTheme()->setName(name); } void UCDeprecatedTheme::resetName() { showDeprecatedNote(this, "Theme.name is deprecated. Use ThemeSettings instead."); defaultTheme()->resetName(); } /*! \qmlproperty Palette Theme::palette The palette of the current theme. */ QObject* UCDeprecatedTheme::palette() { showDeprecatedNote(this, "Theme.palette is deprecated. Use ThemeSettings instead."); // force loading 1.2 palette! return defaultTheme()->palette(BUILD_VERSION(1, 2)); } /*! \qmlmethod Component Theme::createStyleComponent(string styleName, object parent) Returns an instance of the style component named \a styleName. */ QQmlComponent* UCDeprecatedTheme::createStyleComponent(const QString& styleName, QObject* parent) { showDeprecatedNote(parent, "Theme.createStyleComponent() is deprecated. Use ThemeSettings instead."); return defaultTheme()->createStyleComponent(styleName, parent, BUILD_VERSION(1, 2)); } void UCDeprecatedTheme::registerToContext(QQmlContext* context) { // the default theme must be set up prior to this call QQmlEngine *engine = context->engine(); UCTheme *theme = UCTheme::defaultTheme(engine); Q_ASSERT(theme); // initialize deprecated theme using the default theme from the engine UCDeprecatedTheme *oldTheme = new UCDeprecatedTheme(theme); QQmlEngine::setContextForObject(oldTheme, context); // register deprecated Theme property context->setContextProperty("Theme", oldTheme); ContextPropertyChangeListener *themeChangeListener = new ContextPropertyChangeListener(context, "Theme"); QObject::connect(oldTheme, SIGNAL(nameChanged()), themeChangeListener, SLOT(updateContextProperty())); } ./src/Ubuntu/Components/plugin/plugin.qrc0000644000015600001650000000066012700370701020575 0ustar jenkinsjenkins shaders/shape.frag shaders/shape_mipmap.frag shaders/shape.vert shaders/shapeoverlay.frag shaders/shapeoverlay_mipmap.frag shaders/shapeoverlay.vert privates/shaders/frame.frag privates/shaders/frame.vert ./src/Ubuntu/Components/plugin/ucubuntuanimation.cpp0000644000015600001650000000672512700370701023056 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "ucubuntuanimation.h" #include /*! * \qmltype UbuntuAnimation * \instantiates UCUbuntuAnimation * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu * \brief Singleton defining standard Ubuntu durations and easing for animations * that should be used to ensure that Ubuntu applications are consistent * in their animations. * * Example of use: * * \qml * RotationAnimation { * duration: UbuntuAnimation.SlowDuration * easing: UbuntuAnimation.StandardEasing * } * \endqml * * Animation durations should be selected depending on the frequency and * disruptiveness of the animation. The more frequent an animation is, the * faster it should be. The more disruptive an animation is, the slower it should * be. Rule of thumb to select durations: * \list * \li SnapDuration: very frequent, non-disruptive. * \li FastDuration: frequent, non-disruptive. * \li SlowDuration: less frequent, non-disruptive. * \li SleepyDuration: disruptive. * \endlist * * Note that \l UbuntuNumberAnimation provides a standard NumberAnimation for * Ubuntu applications. * */ UCUbuntuAnimation::UCUbuntuAnimation(QObject *parent) : QObject(parent), m_standardEasing(QEasingCurve::OutQuad), m_StandardEasingReverse(QEasingCurve::InQuad) { } /*! * \qmlproperty int UbuntuAnimation::SnapDuration * Used for very frequent and non-disruptive transitions on small objects. * The user would perceive the change as instant but smooth. * * The value is 100ms. */ /*! * \qmlproperty int UbuntuAnimation::FastDuration * Used for frequent and non-disruptive transitions. * * The value is 165ms. */ /*! * \qmlproperty int UbuntuAnimation::BriskDuration * Used for frequent and non-disruptive transitions. * Used when objects have more distance to travel or when they are larger in size. * * The value is 333ms. */ /*! * \qmlproperty int UbuntuAnimation::SlowDuration * Used for delay after key press and for less frequent and non-disruptive * transitions. * * The value is 500ms. */ /*! * \qmlproperty int UbuntuAnimation::SleepyDuration * Used for disruptive transitions. * * The value is 1000ms. */ /*! * \qmlproperty QEasingCurve UbuntuAnimation::StandardEasing * Used for animations trigerred by user actions. */ /*! * \qmlproperty QEasingCurve UbuntuAnimation::StandardEasingReverse * * StandardEasingReverse is mainly used in combination with StandardEasing. * For example, if animating an object that bounces, you will want the object * to slow down as it reaches the apex of its bounce and slowly speed back up * as it descends. * * StandardEasingReverse should not be used to introduce a new object or screen * to the user. * In general, it should only be used if StandardEasing is visually inappropriate * and even so, will usually be proceeded by StandardEasing. */ ./src/Ubuntu/Components/plugin/ucubuntushape.cpp0000644000015600001650000016077512700370701022205 0ustar jenkinsjenkins/* * Copyright 2013-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Loïc Molinari */ // The UbuntuShape uses a simple and efficient method described by Chris Green in this paper from // 2007 (http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf) // to create its anti-aliased and resolution independent contour. // FIXME(loicm) Storing lower precision data types in the vertex buffer could be more efficent. Note // that on PowerVR GPUs (and certainly others), it requires a conversion in the USSE pipeline so // the trade-off between shader cycles and bandwidth requirements needs to be precisely // evaluated. #include "ucubuntushape.h" #include "ucubuntushapetexture.h" #include "ucunits.h" #include "ucnamespace.h" #include #include #include #include // This private header uses the emit keyword while we build with QT_NO_KEYWORDS set. See #1507910. #define emit Q_EMIT #include #undef emit // Anti-aliasing distance of the contour in pixels. const float distanceAApx = 1.75f; // For cosmetic reasons, we add an offset to the radius size to avoid having values less than 2 to // look as if it has no rounded corners. const float radiusSizeOffset = 2.0f; // Factor by which the final fragment RGB color must be multiplied for the pressed aspect. const float pressedFactor = 0.85f; // --- Scene graph shader --- ShapeShader::ShapeShader() : m_useDistanceFields(UCUbuntuShape::useDistanceFields(QOpenGLContext::currentContext())) { setShaderSourceFile(QOpenGLShader::Vertex, QStringLiteral(":/uc/shaders/shape.vert")); setShaderSourceFile(QOpenGLShader::Fragment, useDistanceFields() ? QStringLiteral(":/uc/shaders/shape.frag") : QStringLiteral(":/uc/shaders/shape_mipmap.frag")); } char const* const* ShapeShader::attributeNames() const { static char const* const attributes[] = { "positionAttrib", "shapeCoordAttrib", "sourceCoordAttrib", "yCoordAttrib", "backgroundColorAttrib", 0 }; return attributes; } void ShapeShader::initialize() { QSGMaterialShader::initialize(); program()->bind(); program()->setUniformValue("shapeTexture", 0); program()->setUniformValue("sourceTexture", 1); m_functions = QOpenGLContext::currentContext()->functions(); m_matrixId = program()->uniformLocation("matrix"); m_opacityFactorsId = program()->uniformLocation("opacityFactors"); m_sourceOpacityId = program()->uniformLocation("sourceOpacity"); m_distanceAAId = program()->uniformLocation("distanceAA"); m_texturedId = program()->uniformLocation("textured"); m_aspectId = program()->uniformLocation("aspect"); } void ShapeShader::updateState( const RenderState& state, QSGMaterial* newEffect, QSGMaterial* oldEffect) { Q_UNUSED(oldEffect); const ShapeMaterial::Data* data = static_cast(newEffect)->constData(); // Bind shape texture. glBindTexture(GL_TEXTURE_2D, data->shapeTextureId); // Bind source texture on the 2nd texture unit and update uniforms. bool textured = false; if (data->flags & ShapeMaterial::Data::Textured) { QSGTextureProvider* provider = data->sourceTextureProvider; QSGTexture* sourceTexture = provider ? provider->texture() : NULL; if (sourceTexture) { if (data->flags & ShapeMaterial::Data::Repeated) { if (sourceTexture->isAtlasTexture()) { // A texture in an atlas can't be repeated with builtin GPU facility (exposed by // GL_REPEAT with OpenGL), so we extract it and create a new dedicated one. sourceTexture = sourceTexture->removedFromAtlas(); } sourceTexture->setHorizontalWrapMode( data->flags & ShapeMaterial::Data::HorizontallyRepeated ? QSGTexture::Repeat : QSGTexture::ClampToEdge); sourceTexture->setVerticalWrapMode( data->flags & ShapeMaterial::Data::VerticallyRepeated ? QSGTexture::Repeat : QSGTexture::ClampToEdge); } m_functions->glActiveTexture(GL_TEXTURE1); sourceTexture->bind(); m_functions->glActiveTexture(GL_TEXTURE0); program()->setUniformValue(m_sourceOpacityId, data->sourceOpacity / 255.0f); textured = true; } } program()->setUniformValue(m_texturedId, textured); program()->setUniformValue(m_aspectId, data->flags & ShapeMaterial::Data::AspectMask); // The pressed aspect is implemented by scaling the final RGB fragment color. It's not a real // blending as it was done before deprecation, so for instance transparent colors remain the // same, but we consider it would be too costly to maintain for a deprecated feature that was // actually only used in the toolkit and never documented. The factor is multiplied with the Qt // opacity to avoid useless operations in the shader. const float opacity = state.opacity(); const QVector2D opacityFactorsVector( data->flags & ShapeMaterial::Data::Pressed ? pressedFactor * opacity : opacity, opacity); program()->setUniformValue(m_opacityFactorsId, opacityFactorsVector); if (useDistanceFields()) { // Send anti-aliasing distance in distance field space, needs to be divided by 2 for the // shader and by 255 for distanceAAFactor dequantization. The factor is 1 most of the time // apart when the radius size is low, it linearly goes from 1 to 0 to make the corners // prettier and to prevent the opacity of the whole shape to slightly lower. const float distanceAA = (shapeTextureDistanceAA * distanceAApx) / (2.0 * 255.0f); program()->setUniformValue(m_distanceAAId, data->distanceAAFactor * distanceAA); } // Update QtQuick engine uniforms. if (state.isMatrixDirty()) { program()->setUniformValue(m_matrixId, state.combinedMatrix()); } } // --- Scene graph material --- ShapeMaterial::ShapeMaterial() { // The whole struct (with the padding bytes) must be initialized for memcmp() to work as // expected in ShapeMaterial::compare(). memset(&m_data, 0x00, sizeof(Data)); setFlag(Blending); } QSGMaterialType* ShapeMaterial::type() const { static QSGMaterialType type; return &type; } QSGMaterialShader* ShapeMaterial::createShader() const { return new ShapeShader; } int ShapeMaterial::compare(const QSGMaterial* other) const { // Repeat wrap modes require textures to be extracted from their atlases. Since we just store // the texture provider in the material data (not the texture as we want to do the extraction at // QSGShader::updateState() time), we make the comparison fail when repeat wrapping is set. const ShapeMaterial::Data* otherData = static_cast(other)->constData(); return memcmp(&m_data, otherData, sizeof(m_data)) | (m_data.flags & ShapeMaterial::Data::Repeated); } void ShapeMaterial::updateTextures() { if (m_data.flags & ShapeMaterial::Data::Textured && m_data.sourceTextureProvider) { if (QSGLayer* texture = qobject_cast(m_data.sourceTextureProvider->texture())) { texture->updateTexture(); } } } // --- Scene graph node --- ShapeNode::ShapeNode() : QSGGeometryNode() , m_material() , m_geometry(attributeSet(), vertexCount, indexCount, indexType) { QSGNode::setFlag(UsePreprocess, true); memcpy(m_geometry.indexData(), indices(), indexCount * indexTypeSize); m_geometry.setDrawingMode(drawingMode); m_geometry.setIndexDataPattern(indexDataPattern); m_geometry.setVertexDataPattern(vertexDataPattern); setMaterial(&m_material); setGeometry(&m_geometry); #ifdef QSG_RUNTIME_DESCRIPTION qsgnode_set_description(this, QLatin1String("ubuntushape")); #endif } // static const unsigned short* ShapeNode::indices() { // The geometry is made of 9 vertices indexed with a triangle strip mode. // 0 - 1 - 2 // | / | / | // 3 - 4 - 5 // | / | / | // 6 - 7 - 8 static const unsigned short indices[] = { 0, 3, 1, 4, 2, 5, 5, 3, // Degenerate triangles. 3, 6, 4, 7, 5, 8 }; return indices; } // static const QSGGeometry::AttributeSet& ShapeNode::attributeSet() { static const QSGGeometry::Attribute attributes[] = { QSGGeometry::Attribute::create(0, 2, GL_FLOAT, true), QSGGeometry::Attribute::create(1, 2, GL_FLOAT), QSGGeometry::Attribute::create(2, 4, GL_FLOAT), QSGGeometry::Attribute::create(3, 1, GL_FLOAT), QSGGeometry::Attribute::create(4, 4, GL_UNSIGNED_BYTE) }; static const QSGGeometry::AttributeSet attributeSet = { 5, sizeof(Vertex), attributes }; return attributeSet; } // --- QtQuick item --- const float implicitWidthGU = 8.0f; const float implicitHeightGU = 8.0f; const float radiusGuMap[3] = { 1.45f, 2.55f, 3.65f }; const int maxShapeTextures = 16; static struct { QOpenGLContext* openglContext; quint32 textureId[shapeTextureCount]; } shapeTextures[maxShapeTextures]; static int getShapeTexturesIndex(const QOpenGLContext* openglContext); /*! \qmltype UbuntuShape \instantiates UCUbuntuShape \inqmlmodule Ubuntu.Components 1.2 \ingroup ubuntu \brief Rounded rectangle containing a source image blended over a background color. The UbuntuShape is a rounded rectangle (based on a \l {https://en.wikipedia.org/wiki/Squircle}{squircle}) containing an optional source image blended over a background color (solid or linear gradient). Different properties allow to change the look of the shape. Examples: \qml import Ubuntu.Components 1.2 UbuntuShape { backgroundColor: "green" } \endqml \qml import Ubuntu.Components 1.2 UbuntuShape { source: Image { source: "ubuntu.png" } } \endqml */ UCUbuntuShape::UCUbuntuShape(QQuickItem* parent) : QQuickItem(parent) , m_source(NULL) , m_sourceTextureProvider(NULL) , m_backgroundColor(qRgba(0, 0, 0, 0)) , m_secondaryBackgroundColor(qRgba(0, 0, 0, 0)) , m_sourceScale(1.0f, 1.0f) , m_sourceTranslation(0.0f, 0.0f) , m_sourceTransform(1.0f, 1.0f, 0.0f, 0.0f) , m_relativeRadius(0) , m_radius(Small) , m_aspect(Inset) , m_imageHorizontalAlignment(AlignHCenter) , m_imageVerticalAlignment(AlignVCenter) , m_backgroundMode(SolidColor) , m_sourceHorizontalAlignment(AlignHCenter) , m_sourceVerticalAlignment(AlignVCenter) , m_sourceFillMode(Stretch) , m_sourceHorizontalWrapMode(Transparent) , m_sourceVerticalWrapMode(Transparent) , m_version(Version12) , m_sourceOpacity(255) , m_flags(Stretched) { setFlag(ItemHasContents); QObject::connect(UCUnits::instance(), SIGNAL(gridUnitChanged()), this, SLOT(_q_gridUnitChanged())); _q_gridUnitChanged(); } // static bool UCUbuntuShape::useDistanceFields(const QOpenGLContext* openglContext) { static bool mipmaps = !qgetenv("UC_SHAPE_MIPMAPS").isEmpty(); return !mipmaps && // OpenGL 2.0 supports standard derivatives by default and the implementations ignore the // extension activation at the beginning of fragment shaders, so we use the same shaders for // OpenGL and OpenGL ES with standard derivatives. (!openglContext->isOpenGLES() || openglContext->hasExtension(QByteArrayLiteral("GL_OES_standard_derivatives"))); } bool UCUbuntuShape::isVersionGreaterThanOrEqual(Version version) { return static_cast(m_version) >= static_cast(version); } /*! \qmlproperty string UbuntuShape::radius This property defines the corner radius. Three fixed values are supported: \c "small", \c "medium" and \c "large". The default value is \c "small". \note Setting a non-zero \l relativeRadius value disables this property temporarily. */ void UCUbuntuShape::setRadius(const QString& radius) { const Radius newRadius = (radius == "medium") ? Medium : ((radius == "large") ? Large : Small); if (m_radius != newRadius) { m_radius = newRadius; update(); Q_EMIT radiusChanged(); } } /*! \qmlproperty enumeration UbuntuShape::aspect This property defines the graphical style of the UbuntuShape. The default value is \c UbuntuShape.Inset. \note Setting this disables support for the deprecated \l borderSource property. Use the UbuntuShapeOverlay item in order to provide the inset "pressed" aspect previously supported by that property. \list \li \b UbuntuShape.Flat - no effects applied \li \b UbuntuShape.Inset - inner shadow slightly moved downwards and bevelled bottom \endlist */ void UCUbuntuShape::setAspect(Aspect aspect) { if (!(m_flags & AspectSet)) { m_flags |= AspectSet; m_aspect = Flat; update(); Q_EMIT borderSourceChanged(); } const quint8 newAspect = aspect; if (m_aspect != newAspect) { m_aspect = newAspect; update(); Q_EMIT aspectChanged(); } } /*! \qmlproperty real UbuntuShape::relativeRadius \since Ubuntu.Components 1.3 This property defines a radius relative to the size of the UbuntuShape. It is specified as a number between 0.0 (0%) and 0.75 (75%) corresponding to the proportion of the radius with regards to the smallest side (divided by 2 since a side has 2 angles). The default value is 0.0. \note Setting a non-zero value takes over the \l radius property. */ void UCUbuntuShape::setRelativeRadius(qreal relativeRadius) { const quint8 relativeRadiusPacked = qRound(qBound(0.0, relativeRadius, 0.75) * 100.0); if (m_relativeRadius != relativeRadiusPacked) { m_relativeRadius = relativeRadiusPacked; update(); Q_EMIT relativeRadiusChanged(); } } // Deprecation layer. void UCUbuntuShape::dropImageSupport() { if (!(m_flags & SourceApiSet)) { m_flags |= SourceApiSet; if (m_source) { QObject::disconnect(m_source); m_source = NULL; update(); Q_EMIT imageChanged(); } } } /*! \qmlproperty variant UbuntuShape::source \since Ubuntu.Components 1.2 This property sets the source provider of a texture rendered in the UbuntuShape. Supported types are \c Image, \c AnimatedImage (to render a GIF image for instance) and \c ShaderEffectSource (to embed a UI previously rendered with QML). It is blended over the background color. The default value is \c null. It can be set either with an inlined \c Image: \qml Item { UbuntuShape { source: Image { source: "ubuntu.png" } } } \endqml or with an \c Image \c id: \qml Item { Image { id: img visible: false source: "ubuntu.png" } UbuntuShape { source: img } } \endqml Note that in this case, the \c Image is stored in the scene tree as any other items. So setting it as not visible might be needed. The \l{https://en.wikipedia.org/wiki/Texture_filtering}{sampling filter} is set through the given Item's \c smooth property. Set it to \c false for nearest-neighbor filtering or to \c true for bilinear filtering. The fill modes and alignments set on the \c Image and \c AnimatedImage are not monitored, use the appropriate UbuntuShape properties instead (\l sourceFillMode, \l sourceHorizontalAlignment and \l sourceVerticalAlignment). \note Setting this disables support for the deprecated \l image property. */ void UCUbuntuShape::setSource(const QVariant& source) { dropImageSupport(); QQuickItem* newSource = qobject_cast(qvariant_cast(source)); if (m_source != newSource) { if (newSource) { if (!newSource->parentItem()) { // Inlined images need a parent and must not be visible. newSource->setParentItem(this); newSource->setVisible(false); } m_flags |= DirtySourceTransform; } m_source = newSource; update(); Q_EMIT sourceChanged(); } } /*! \qmlproperty real UbuntuShape::sourceOpacity \since Ubuntu.Components 1.2 This property holds the opacity of the \l source texture. Opacity is specified as a number between 0.0 (fully transparent) and 1.0 (fully opaque). The default value is 1.0. \note Setting this disables support for the deprecated \l image property. */ void UCUbuntuShape::setSourceOpacity(qreal sourceOpacity) { dropImageSupport(); const quint8 sourceOpacityPacked = qBound(0.0, sourceOpacity, 1.0) * static_cast(0xff); if (m_sourceOpacity != sourceOpacityPacked) { m_sourceOpacity = sourceOpacityPacked; update(); Q_EMIT sourceOpacityChanged(); } } /*! \qmlproperty enumeration UbuntuShape::sourceFillMode \since Ubuntu.Components 1.2 This properties defines how the \l source texture fills the UbuntuShape. The modes are the same as the ones used by \c Image, minus the tiling which is exposed through wrapping properties (\l sourceHorizontalWrapMode and \l sourceVerticalWrapMode). The default value is \c UbuntuShape.Stretch. \note Setting this disables support for the deprecated \l image property. \list \li \b UbuntuShape.Stretch - the source is scaled non-uniformly to fit \li \b UbuntuShape.PreserveAspectFit - the source is scaled uniformly to fit without cropping \li \b UbuntuShape.PreserveAspectCrop - the source is scaled uniformly to fit with cropping \li \b UbuntuShape.Pad - the source is not scaled \endlist */ void UCUbuntuShape::setSourceFillMode(UCUbuntuShape::FillMode sourceFillMode) { dropImageSupport(); if (m_sourceFillMode != sourceFillMode) { m_sourceFillMode = sourceFillMode; m_flags |= DirtySourceTransform; update(); Q_EMIT sourceFillModeChanged(); } } /*! \qmlproperty enumeration UbuntuShape::sourceHorizontalWrapMode \qmlproperty enumeration UbuntuShape::sourceVerticalWrapMode \since Ubuntu.Components 1.2 When the \l sourceFillMode is set to \c UbuntuShape.Pad or \c UbuntuShape.PreserveAspectFit or when the \l sourceScale and/or \l sourceTranslation properties are changed, the \l source texture might not cover the entire UbuntuShape area. This property defines how the source texture wraps outside of its content area. The default value is \c UbuntuShape.Transparent. Ensure \c UbuntuShape.Repeat is used only when necessary (in case of an \c Image or \c AnimatedImage source) as it requires the underlying texture to be extracted from its atlas. That slows down the rendering speed since it prevents the QtQuick renderer to batch the UbuntuShape with others. \note Some OpenGL ES 2 implementations do not support \c UbuntuShape.Repeat with non-power-of-two sized source textures. \note Setting this disables support for the deprecated \l image property. \list \li \b UbuntuShape.Transparent - the source is clamped to transparent \li \b UbuntuShape.Repeat - the source is repeated indefinitely \endlist */ void UCUbuntuShape::setSourceHorizontalWrapMode(UCUbuntuShape::WrapMode sourceHorizontalWrapMode) { dropImageSupport(); if (m_sourceHorizontalWrapMode != sourceHorizontalWrapMode) { m_sourceHorizontalWrapMode = sourceHorizontalWrapMode; update(); Q_EMIT sourceHorizontalWrapModeChanged(); } } void UCUbuntuShape::setSourceVerticalWrapMode(UCUbuntuShape::WrapMode sourceVerticalWrapMode) { dropImageSupport(); if (m_sourceVerticalWrapMode != sourceVerticalWrapMode) { m_sourceVerticalWrapMode = sourceVerticalWrapMode; update(); Q_EMIT sourceVerticalWrapModeChanged(); } } /*! \qmlproperty enumeration UbuntuShape::sourceHorizontalAlignment \since Ubuntu.Components 1.2 This property defines how the \l source texture is horizontally aligned inside the UbuntuShape area. The default value is \c UbuntuShape.AlignLeft. \note Setting this disables support for the deprecated \l image property. \list \li \b UbuntuShape.AlignLeft - the source is aligned to the left \li \b UbuntuShape.AlignHCenter - the source is aligned to the horizontal center \li \b UbuntuShape.AlignRight - the source is aligned to the right \endlist */ void UCUbuntuShape::setSourceHorizontalAlignment( UCUbuntuShape::HAlignment sourceHorizontalAlignment) { dropImageSupport(); if (m_sourceHorizontalAlignment != sourceHorizontalAlignment) { m_sourceHorizontalAlignment = sourceHorizontalAlignment; m_flags |= DirtySourceTransform; update(); Q_EMIT sourceHorizontalAlignmentChanged(); } } /*! \qmlproperty enumeration UbuntuShape::sourceVerticalAlignment \since Ubuntu.Components 1.2 This property defines how the \l source texture is vertically aligned inside the UbuntuShape area. The default value is \c UbuntuShape.AlignTop. \note Setting this disables support for the deprecated \l image property. \list \li \b UbuntuShape.AlignTop - the source is aligned to the top \li \b UbuntuShape.AlignVCenter - the source is aligned to the vertical center \li \b UbuntuShape.AlignBottom - the source is aligned to the bottom \endlist */ void UCUbuntuShape::setSourceVerticalAlignment(UCUbuntuShape::VAlignment sourceVerticalAlignment) { dropImageSupport(); if (m_sourceVerticalAlignment != sourceVerticalAlignment) { m_sourceVerticalAlignment = sourceVerticalAlignment; m_flags |= DirtySourceTransform; update(); Q_EMIT sourceVerticalAlignmentChanged(); } } /*! \qmlproperty vector2d UbuntuShape::sourceTranslation \since Ubuntu.Components 1.2 This property defines the two-component vector in normalized item coordinates used to translate the \l source texture. The default value is \c {Qt.vector2d(0.0,0.0)}. That can be used to put the \l source texture at a precise position, to create infinite scrolling animations (using the \c UbuntuShape.Repeat wrap mode), etc. \note Setting this disables support for the deprecated \l image property. */ void UCUbuntuShape::setSourceTranslation(const QVector2D& sourceTranslation) { dropImageSupport(); if (m_sourceTranslation != sourceTranslation) { m_sourceTranslation = sourceTranslation; m_flags |= DirtySourceTransform; update(); Q_EMIT sourceTranslationChanged(); } } /*! \qmlproperty vector2d UbuntuShape::sourceScale \since Ubuntu.Components 1.2 This property defines the two-component vector used to scale the \l source texture. The texture is scaled at the alignment point defined by \l sourceHorizontalAlignment and \l sourceVerticalAlignment. The default value is \c {Qt.vector2d(1.0,1.0)}. That can be used to change the size of the \l source texture, to flip it horizontally and/or vertically, to achieve pulsing animations, etc. Here is a code sample showing how to apply an horizontal flip: \qml UbuntuShape { source: Image { source: "ubuntu.png" } sourceScale: Qt.vector2d(-1.0, 1.0) } \endqml \note Setting this disables support for the deprecated \l image property. */ void UCUbuntuShape::setSourceScale(const QVector2D& sourceScale) { dropImageSupport(); if (m_sourceScale != sourceScale) { m_sourceScale = sourceScale; m_flags |= DirtySourceTransform; update(); Q_EMIT sourceScaleChanged(); } } // Deprecation layer. void UCUbuntuShape::dropColorSupport() { if (!(m_flags & BackgroundApiSet)) { m_flags |= BackgroundApiSet; if (m_backgroundColor) { m_backgroundColor = qRgba(0, 0, 0, 0); Q_EMIT colorChanged(); } if (m_secondaryBackgroundColor) { m_secondaryBackgroundColor = qRgba(0, 0, 0, 0); Q_EMIT gradientColorChanged(); } } } /*! \qmlproperty color UbuntuShape::backgroundColor \since Ubuntu.Components 1.2 This property defines the background color. The default value is transparent black. \note Setting this disables support for the deprecated \l color and \l gradientColor properties. */ void UCUbuntuShape::setBackgroundColor(const QColor& backgroundColor) { dropColorSupport(); const QRgb backgroundColorRgb = qRgba( backgroundColor.red(), backgroundColor.green(), backgroundColor.blue(), backgroundColor.alpha()); if (m_backgroundColor != backgroundColorRgb) { m_backgroundColor = backgroundColorRgb; update(); Q_EMIT backgroundColorChanged(); } } /*! \qmlproperty color UbuntuShape::secondaryBackgroundColor \since Ubuntu.Components 1.2 This property defines the secondary background color. It is used when \l backgroundMode is set to \c UbuntuShape.VerticalGradient. The default value is transparent black. \note Setting this disables support for the deprecated \l color and \l gradientColor properties. */ void UCUbuntuShape::setSecondaryBackgroundColor(const QColor& secondaryBackgroundColor) { dropColorSupport(); const QRgb secondaryBackgroundColorRgb = qRgba( secondaryBackgroundColor.red(), secondaryBackgroundColor.green(), secondaryBackgroundColor.blue(), secondaryBackgroundColor.alpha()); if (m_secondaryBackgroundColor != secondaryBackgroundColorRgb) { m_secondaryBackgroundColor = secondaryBackgroundColorRgb; update(); Q_EMIT secondaryBackgroundColorChanged(); } } /*! \qmlproperty enumeration UbuntuShape::backgroundMode \since Ubuntu.Components 1.2 This property defines the background rendering mode. The default value is \c UbuntuShape.SolidColor. \note Setting this disables support for the deprecated \l color and \l gradientColor properties. \list \li \b UbuntuShape.SolidColor - the color is \l backgroundColor \li \b UbuntuShape.VerticalGradient - the color is a vertical gradient from \l backgroundColor to \l secondaryBackgroundColor. \endlist */ void UCUbuntuShape::setBackgroundMode(BackgroundMode backgroundMode) { dropColorSupport(); if (m_backgroundMode != backgroundMode) { m_backgroundMode = backgroundMode; update(); Q_EMIT backgroundModeChanged(); } } /*! \qmlproperty string UbuntuShape::borderSource \deprecated This property defines the look of the shape borders. The supported strings are \c "radius_idle.sci" providing an idle button aspect and \c "radius_pressed.sci" providing a pressed button aspect. Any other strings (like the empty one \c "") provides a shape with no borders. The default value is \c "radius_idle.sci". \note Use \l aspect instead. */ void UCUbuntuShape::setBorderSource(const QString& borderSource) { // FIXME(loicm) Commented for now since even if it's deprecated, buttons have to use it in order // to get a pressed aspect. This is a temporary solution before using a dedicated button // shape. // qmlInfo(this) << "'borderSource' is deprecated. Use 'aspect' instead."; if (!(m_flags & AspectSet)) { quint8 aspect; if (borderSource.endsWith(QString("radius_idle.sci"))) { aspect = Inset; } else if (borderSource.endsWith(QString("radius_pressed.sci"))) { aspect = Pressed; } else { aspect = Flat; } if (m_aspect != aspect) { m_aspect = aspect; update(); Q_EMIT borderSourceChanged(); } } } /*! \qmlproperty color UbuntuShape::color \deprecated This property defines the color used to fill the UbuntuShape when there is no \l image set. If \l gradientColor is set, this property defines the top color of the gradient. The default value is transparent black. \note Use \l backgroundColor, \l secondaryBackgroundColor and \l backgroundMode instead. */ void UCUbuntuShape::setColor(const QColor& color) { Q_UNUSED(color); if (isVersionGreaterThanOrEqual(Version13)) UC_QML_DEPRECATION_WARNING("'color' is deprecated. Use 'backgroundColor', 'secondaryBackgroundColor' and 'backgroundMode' instead."); if (!(m_flags & BackgroundApiSet)) { const QRgb colorRgb = qRgba(color.red(), color.green(), color.blue(), color.alpha()); if (m_backgroundColor != colorRgb) { m_backgroundColor = colorRgb; // gradientColor has the same value as color unless it was explicitly set. if (!(m_flags & GradientColorSet)) { m_secondaryBackgroundColor = colorRgb; Q_EMIT gradientColorChanged(); } update(); Q_EMIT colorChanged(); } } } /*! \qmlproperty color UbuntuShape::gradientColor \deprecated This property defines the bottom color used for the vertical gradient filling the UbuntuShape when there is no \l image set. As long as this property is not set, a single color (defined by \l color) is used to fill the UbuntuShape. \note Use \l backgroundColor, \l secondaryBackgroundColor and \l backgroundMode instead. */ void UCUbuntuShape::setGradientColor(const QColor& gradientColor) { if (isVersionGreaterThanOrEqual(Version13)) UC_QML_DEPRECATION_WARNING("'gradientColor' is deprecated. Use 'backgroundColor', 'secondaryBackgroundColor' and 'backgroundMode' instead."); if (!(m_flags & BackgroundApiSet)) { m_flags |= GradientColorSet; const QRgb gradientColorRgb = qRgba( gradientColor.red(), gradientColor.green(), gradientColor.blue(), gradientColor.alpha()); if (m_secondaryBackgroundColor != gradientColorRgb) { m_secondaryBackgroundColor = gradientColorRgb; update(); Q_EMIT gradientColorChanged(); } } } /*! \qmlproperty Image UbuntuShape::image \deprecated This property holds the \c Image or \c ShaderEffectSource rendered in the UbuntuShape. In case of an \c Image, it watches for fillMode (\c Image.Stretch and\c Image.PreserveAspectCrop), \c horizontalAlignment and \c verticalAlignment property changes. The default value is \c null. \note Use \l source instead. */ void UCUbuntuShape::setImage(const QVariant& image) { if (isVersionGreaterThanOrEqual(Version13)) UC_QML_DEPRECATION_WARNING("'image' is deprecated. Use 'source' instead."); if (!(m_flags & SourceApiSet)) { QQuickItem* newImage = qobject_cast(qvariant_cast(image)); if (m_source != newImage) { if (newImage) { // Watch for property changes. updateFromImageProperties(newImage); connectToImageProperties(newImage); if (!newImage->parentItem()) { // Inlined images need a parent and must not be visible. newImage->setParentItem(this); newImage->setVisible(false); } m_flags |= DirtySourceTransform; } QObject::disconnect(m_source); update(); m_source = newImage; Q_EMIT imageChanged(); } } } // Deprecation layer. Even though "stretched" is exposed as a QML property, it's only been used when // there was a QML UbuntuShape proxy. This is why we don't provide doc for it. We'll still have to // maintain it for a while for compatibility reasons. void UCUbuntuShape::setStretched(bool stretched) { if (!(m_flags & SourceApiSet)) { if (!!(m_flags & Stretched) != stretched) { if (stretched) { m_flags |= Stretched; } else { m_flags &= ~Stretched; } m_flags |= DirtySourceTransform; update(); Q_EMIT stretchedChanged(); } } } // Deprecation layer. Same comment as setStretched(). void UCUbuntuShape::setHorizontalAlignment(HAlignment horizontalAlignment) { if (!(m_flags & SourceApiSet)) { if (m_imageHorizontalAlignment != horizontalAlignment) { m_imageHorizontalAlignment = horizontalAlignment; m_flags |= DirtySourceTransform; update(); Q_EMIT horizontalAlignmentChanged(); } } } // Deprecation layer. Same comment as setStretched(). void UCUbuntuShape::setVerticalAlignment(VAlignment verticalAlignment) { if (!(m_flags & SourceApiSet)) { if (m_imageVerticalAlignment != verticalAlignment) { m_imageVerticalAlignment = verticalAlignment; m_flags |= DirtySourceTransform; update(); Q_EMIT verticalAlignmentChanged(); } } } // Deprecation layer. void UCUbuntuShape::updateFromImageProperties(QQuickItem* image) { int alignment; // UbuntuShape::stretched depends on Image::fillMode. QQuickImage::FillMode fillMode = (QQuickImage::FillMode)image->property("fillMode").toInt(); if (fillMode == QQuickImage::PreserveAspectCrop) { setStretched(false); } else { setStretched(true); } // UbuntuShape::horizontalAlignment depends on Image::horizontalAlignment. int imageHorizontalAlignment = image->property("horizontalAlignment").toInt(); if (imageHorizontalAlignment == Qt::AlignLeft) { alignment = AlignLeft; } else if (imageHorizontalAlignment == Qt::AlignRight) { alignment = AlignRight; } else { alignment = AlignHCenter; } setHorizontalAlignment(static_cast(alignment)); // UbuntuShape::verticalAlignment depends on Image::verticalAlignment. int imageVerticalAlignment = image->property("verticalAlignment").toInt(); if (imageVerticalAlignment == Qt::AlignTop) { alignment = AlignTop; } else if (imageVerticalAlignment == Qt::AlignBottom) { alignment = AlignBottom; } else { alignment = AlignVCenter; } setVerticalAlignment(static_cast(alignment)); } // Deprecation layer. void UCUbuntuShape::connectToPropertyChange( QObject* sender, const char* property, QObject* receiver, const char* slot) { int propertyIndex = sender->metaObject()->indexOfProperty(property); if (propertyIndex != -1) { QMetaMethod changeSignal = sender->metaObject()->property(propertyIndex).notifySignal(); int slotIndex = receiver->metaObject()->indexOfSlot(slot); QMetaMethod updateSlot = receiver->metaObject()->method(slotIndex); QObject::connect(sender, changeSignal, receiver, updateSlot); } } // Deprecation layer. void UCUbuntuShape::connectToImageProperties(QQuickItem* image) { connectToPropertyChange(image, "fillMode", this, "_q_imagePropertiesChanged()"); connectToPropertyChange(image, "horizontalAlignment", this, "_q_imagePropertiesChanged()"); connectToPropertyChange(image, "verticalAlignment", this, "_q_imagePropertiesChanged()"); } // Deprecation layer. void UCUbuntuShape::_q_imagePropertiesChanged() { updateFromImageProperties(qobject_cast(sender())); } void UCUbuntuShape::_q_gridUnitChanged() { const float gridUnitInDevicePixels = UCUnits::instance()->gridUnit() / qGuiApp->devicePixelRatio(); setImplicitWidth(implicitWidthGU * gridUnitInDevicePixels); setImplicitHeight(implicitHeightGU * gridUnitInDevicePixels); update(); } void UCUbuntuShape::_q_providerDestroyed(QObject* object) { Q_UNUSED(object); m_sourceTextureProvider = NULL; } void UCUbuntuShape::_q_textureChanged() { m_flags |= DirtySourceTransform; update(); } QString UCUbuntuShape::propertyForVersion(quint16 version) const { if (MINOR_VERSION(version) == 3) { return QStringLiteral("relativeRadius"); } else { return QString(); } } void UCUbuntuShape::componentComplete() { QQuickItem::componentComplete(); m_version = MINOR_VERSION(importVersion(this)) == 3 ? Version13 : Version12; } void UCUbuntuShape::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry) { QQuickItem::geometryChanged(newGeometry, oldGeometry); m_flags |= DirtySourceTransform; } // Gets the shapeTextures' slot used by the given context, or -1 if not stored. static int getShapeTexturesIndex(const QOpenGLContext* openglContext) { int index = 0; while (shapeTextures[index].openglContext != openglContext) { index++; if (index == maxShapeTextures) { return -1; } } return index; } // Gets an empty shapeTextures' slot. static int getEmptyShapeTexturesIndex() { int index = 0; while (shapeTextures[index].openglContext) { index++; if (index == maxShapeTextures) { // Don't bother with a dynamic array, let's just set a high enough maxShapeTextures and // increase the static array size if ever needed. qFatal("reached maximum number of OpenGL contexts supported by UbuntuShape"); } } return index; } // Create and setup shape textures. static void createShapeTextures(QOpenGLContext* openglContext, int index) { glGenTextures(shapeTextureCount, shapeTextures[index].textureId); if (UCUbuntuShape::useDistanceFields(openglContext)) { // Create distance field textures. for (int i = 0; i < shapeTextureCount; i++) { glBindTexture(GL_TEXTURE_2D, shapeTextures[index].textureId[i]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, shapeTextureWidth, shapeTextureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, shapeTextureData[i]); } } else { // Create mipmap textures. for (int i = 0; i < shapeTextureCount; i++) { glBindTexture(GL_TEXTURE_2D, shapeTextures[index].textureId[i]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); for (int j = 0; j < shapeTextureMipmapCount; j++) { glTexImage2D(GL_TEXTURE_2D, j, GL_RGBA, shapeTextureMipmapWidth >> j, shapeTextureMipmapHeight >> j, 0, GL_RGBA, GL_UNSIGNED_BYTE, &shapeTextureMipmapData[i][shapeTextureMipmapOffset[j]]); } } } } // Gets the nearest boundary to coord in the texel grid of the given size. static Q_DECL_CONSTEXPR float roundTextureCoord(float coord, float size) { return roundf(coord * size) / size; } void UCUbuntuShape::updateSourceTransform( float itemWidth, float itemHeight, FillMode fillMode, HAlignment horizontalAlignment, VAlignment verticalAlignment, const QSize& textureSize) { float fillSx, fillSy; if (fillMode == PreserveAspectFit) { const float textureRatio = static_cast(textureSize.width()) / textureSize.height(); const float itemRatio = itemWidth / itemHeight; fillSx = (textureRatio < itemRatio) ? (itemRatio / textureRatio) : 1.0f; fillSy = (textureRatio < itemRatio) ? 1.0f : (textureRatio / itemRatio); } else if (fillMode == PreserveAspectCrop) { const float textureRatio = static_cast(textureSize.width()) / textureSize.height(); const float itemRatio = itemWidth / itemHeight; fillSx = (textureRatio < itemRatio) ? 1.0f : (itemRatio / textureRatio); fillSy = (textureRatio < itemRatio) ? (textureRatio / itemRatio) : 1.0f; } else if (fillMode == Pad) { fillSx = itemWidth / textureSize.width(); fillSy = itemHeight / textureSize.height(); } else { fillSx = 1.0f; fillSy = 1.0f; } const float sourceSxInv = 1.0f / m_sourceScale.x(); const float sourceSyInv = 1.0f / m_sourceScale.y(); // Multiplied by fillS* so that the translation unit is in normalized item coordinates. const float sourceTx = (m_sourceTranslation.x() * sourceSxInv) * fillSx; const float sourceTy = (m_sourceTranslation.y() * sourceSyInv) * fillSy; const float sx = fillSx * sourceSxInv; const float sy = fillSy * sourceSyInv; const float factorTable[3] = { 0.0f, 0.5f, 1.0f }; const float hFactor = factorTable[static_cast(horizontalAlignment)]; const float vFactor = factorTable[static_cast(verticalAlignment)]; const float tx = hFactor * (1.0f - sx) - sourceTx; const float ty = vFactor * (1.0f - sy) - sourceTy; // Rounding is important to get padded texture perfectly mapped to the pixel grid. It shouldn't // be necessary when there's a scaling but we make it consistent by applying the scale factors // to the texture size, so that there's no ugly position jumps with big scaling values. m_sourceTransform = QVector4D( sx, sy, roundTextureCoord(tx, textureSize.width() * m_sourceScale.x()), roundTextureCoord(ty, textureSize.height() * m_sourceScale.y())); } // Pack a premultiplied 32-bit ABGR integer. static quint32 packColor(quint32 a, quint32 b, quint32 g, quint32 r) { const quint32 pb = ((b * a) + 0xff) >> 8; const quint32 pg = ((g * a) + 0xff) >> 8; const quint32 pr = ((r * a) + 0xff) >> 8; return (a << 24) | ((pb & 0xff) << 16) | ((pg & 0xff) << 8) | (pr & 0xff); } // Average c1 and c2. Return value is a premultiplied 32-bit ABGR integer. static quint32 averageColor(QRgb c1, QRgb c2) { return packColor( (qAlpha(c1) + qAlpha(c2)) >> 1, (qBlue(c1) + qBlue(c2)) >> 1, (qGreen(c1) + qGreen(c2)) >> 1, (qRed(c1) + qRed(c2)) >> 1); } QSGNode* UCUbuntuShape::updatePaintNode(QSGNode* oldNode, UpdatePaintNodeData* data) { Q_UNUSED(data); const QSizeF itemSize(width(), height()); if (itemSize.isEmpty()) { delete oldNode; return NULL; } QSGNode* node = oldNode ? oldNode : createSceneGraphNode(); Q_ASSERT(node); // Get or create the shape texture that's stored per context and shared by all the shape items. Q_ASSERT(window()); QOpenGLContext* openglContext = window()->openglContext(); Q_ASSERT(openglContext); int index = getShapeTexturesIndex(openglContext); if (index < 0) { index = getEmptyShapeTexturesIndex(); shapeTextures[index].openglContext = openglContext; createShapeTextures(openglContext, index); connect(openglContext, &QOpenGLContext::aboutToBeDestroyed, [index] { shapeTextures[index].openglContext = NULL; glDeleteTextures(shapeTextureCount, shapeTextures[index].textureId); } ); } const quint32 shapeTextureId = shapeTextures[index].textureId[m_aspect != DropShadow ? 0 : 1]; // Get the source texture info and update the source transform if needed. QSGTextureProvider* provider = m_source ? m_source->textureProvider() : NULL; QSGTexture* sourceTexture = provider ? provider->texture() : NULL; QRectF sourceTextureRect(0.0f, 0.0f, 1.0f, 1.0f); if (sourceTexture) { if (m_sourceHorizontalWrapMode == Transparent && m_sourceVerticalWrapMode == Transparent) { sourceTextureRect = sourceTexture->normalizedTextureSubRect(); } if (m_flags & DirtySourceTransform) { const float dpr = qGuiApp->devicePixelRatio(); if (m_flags & SourceApiSet) { updateSourceTransform(itemSize.width() * dpr, itemSize.height() * dpr, m_sourceFillMode, m_sourceHorizontalAlignment, m_sourceVerticalAlignment, sourceTexture->textureSize()); } else { FillMode imageFillMode = (m_flags & Stretched) ? Stretch : PreserveAspectCrop; updateSourceTransform(itemSize.width() * dpr, itemSize.height() * dpr, imageFillMode, m_imageHorizontalAlignment, m_imageVerticalAlignment, sourceTexture->textureSize()); } m_flags &= ~DirtySourceTransform; } } // Ensure the shape item is updated whenever the source item's texture changes. if (provider != m_sourceTextureProvider) { if (m_sourceTextureProvider) { QObject::disconnect(m_sourceTextureProvider, SIGNAL(textureChanged()), this, SLOT(_q_textureChanged())); QObject::disconnect(m_sourceTextureProvider, SIGNAL(destroyed()), this, SLOT(_q_providerDestroyed())); } if (provider) { QObject::connect(provider, SIGNAL(textureChanged()), this, SLOT(_q_textureChanged())); QObject::connect(provider, SIGNAL(destroyed()), this, SLOT(_q_providerDestroyed())); } m_sourceTextureProvider = provider; } // Get the radius size. float radius; if (m_relativeRadius == 0) { // When the item width and/or height is less than 2 * radius, the size is scaled down // accordingly. The shape was using a fixed image for the corner before switching to a // distance field, since the corner wasn't taking the whole image (ending at ~80%) we need // to take that into account when the size is scaled down. radius = UCUnits::instance()->gridUnit() * radiusGuMap[m_radius] / qGuiApp->devicePixelRatio(); const float scaledDownRadius = qMin(itemSize.width(), itemSize.height()) * 0.5f * 0.8f; if (radius > scaledDownRadius) { radius = scaledDownRadius; } } else { radius = qMin(itemSize.width(), itemSize.height()) * 0.5f * (m_relativeRadius * 0.01f) / qGuiApp->devicePixelRatio(); } updateMaterial(node, radius, shapeTextureId, sourceTexture && m_sourceOpacity); // Get the affine transformation for the source texture coordinates. const QVector4D sourceCoordTransform( m_sourceTransform.x() * sourceTextureRect.width(), m_sourceTransform.y() * sourceTextureRect.height(), m_sourceTransform.z() * sourceTextureRect.width() + sourceTextureRect.x(), m_sourceTransform.w() * sourceTextureRect.height() + sourceTextureRect.y()); // Get the affine transformation for the source mask coordinates, pixels lying inside the mask // (values in the range [-1, 1]) will be textured in the fragment shader. In case of a repeat // wrap mode, the transformation is made so that the mask takes the whole area. const QVector4D sourceMaskTransform( m_sourceHorizontalWrapMode == Transparent ? m_sourceTransform.x() * 2.0f : 2.0f, m_sourceVerticalWrapMode == Transparent ? m_sourceTransform.y() * 2.0f : 2.0f, m_sourceHorizontalWrapMode == Transparent ? m_sourceTransform.z() * 2.0f - 1.0f : -1.0f, m_sourceVerticalWrapMode == Transparent ? m_sourceTransform.w() * 2.0f - 1.0f : -1.0f); // Select and pack the lerped and premultiplied background colors. QRgb color[2]; if (m_flags & BackgroundApiSet) { color[0] = m_backgroundColor; color[1] = (m_backgroundMode == SolidColor) ? m_backgroundColor : m_secondaryBackgroundColor; } else { if (!sourceTexture) { color[0] = m_backgroundColor; // For API compatibility reasons, m_secondaryBackgroundColor is set to m_backgroundColor // as long as setGradientColor() isn't called, so we can safely use it here. color[1] = m_secondaryBackgroundColor; } else { // The deprecated image API was created such that whenever an image is set, the // background color is transparent. color[0] = qRgba(0, 0, 0, 0); color[1] = qRgba(0, 0, 0, 0); } } const quint32 backgroundColor[3] = { packColor(qAlpha(color[0]), qBlue(color[0]), qGreen(color[0]), qRed(color[0])), averageColor(color[0], color[1]), packColor(qAlpha(color[1]), qBlue(color[1]), qGreen(color[1]), qRed(color[1])) }; updateGeometry( node, itemSize, radius, shapeTextureOffset, sourceCoordTransform, sourceMaskTransform, backgroundColor); return node; } QSGNode* UCUbuntuShape::createSceneGraphNode() const { return new ShapeNode; } void UCUbuntuShape::updateMaterial( QSGNode* node, float radius, quint32 shapeTextureId, bool textured) { ShapeMaterial::Data* materialData = static_cast(node)->material()->data(); quint8 flags = 0; materialData->shapeTextureId = shapeTextureId; if (textured) { materialData->sourceTextureProvider = m_sourceTextureProvider; materialData->sourceOpacity = m_sourceOpacity; if (m_sourceHorizontalWrapMode == Repeat) { flags |= ShapeMaterial::Data::HorizontallyRepeated; } if (m_sourceVerticalWrapMode == Repeat) { flags |= ShapeMaterial::Data::VerticallyRepeated; } flags |= ShapeMaterial::Data::Textured; } else { materialData->sourceTextureProvider = NULL; materialData->sourceOpacity = 0; } const float physicalRadius = radius * qGuiApp->devicePixelRatio(); // Mapping of radius size range from [0, 4] to [0, 1] with clamping, plus quantization. const float start = 0.0f + radiusSizeOffset; const float end = 4.0f + radiusSizeOffset; materialData->distanceAAFactor = qMin((physicalRadius / (end - start)) - (start / (end - start)), 1.0f) * 255.0f; // When the radius is equal to radiusSizeOffset (which means radius size is 0), no aspect is // flagged so that a dedicated (statically flow controlled) shaved off shader can be used for // optimal performance. if (physicalRadius > radiusSizeOffset) { const quint8 aspectFlags[] = { ShapeMaterial::Data::Flat, ShapeMaterial::Data::Inset, ShapeMaterial::Data::DropShadow, ShapeMaterial::Data::Inset | ShapeMaterial::Data::Pressed }; flags |= aspectFlags[m_aspect]; } else { const quint8 aspectFlags[] = { 0, 0, 0, ShapeMaterial::Data::Pressed }; flags |= aspectFlags[m_aspect]; } materialData->flags = flags; } void UCUbuntuShape::updateGeometry( QSGNode* node, const QSizeF& itemSize, float radius, float shapeOffset, const QVector4D& sourceCoordTransform, const QVector4D& sourceMaskTransform, const quint32 backgroundColor[3]) { // Used by subclasses, using the shapeTextureInfo.offset constant directly allows slightly // better optimization here. Q_UNUSED(shapeOffset); ShapeNode::Vertex* v = reinterpret_cast( static_cast(node)->geometry()->vertexData()); // Set top row of 3 vertices. v[0].position[0] = 0.0f; v[0].position[1] = 0.0f; v[0].shapeCoordinate[0] = shapeTextureOffset; v[0].shapeCoordinate[1] = shapeTextureOffset; v[0].sourceCoordinate[0] = sourceCoordTransform.z(); v[0].sourceCoordinate[1] = sourceCoordTransform.w(); v[0].sourceCoordinate[2] = sourceMaskTransform.z(); v[0].sourceCoordinate[3] = sourceMaskTransform.w(); v[0].yCoordinate = -1.0f; v[0].backgroundColor = backgroundColor[0]; v[1].position[0] = 0.5f * itemSize.width(); v[1].position[1] = 0.0f; v[1].shapeCoordinate[0] = (0.5f * itemSize.width()) / radius - shapeTextureOffset; v[1].shapeCoordinate[1] = shapeTextureOffset; v[1].sourceCoordinate[0] = 0.5f * sourceCoordTransform.x() + sourceCoordTransform.z(); v[1].sourceCoordinate[1] = sourceCoordTransform.w(); v[1].sourceCoordinate[2] = 0.5f * sourceMaskTransform.x() + sourceMaskTransform.z(); v[1].sourceCoordinate[3] = sourceMaskTransform.w(); v[1].yCoordinate = -1.0f; v[1].backgroundColor = backgroundColor[0]; v[2].position[0] = itemSize.width(); v[2].position[1] = 0.0f; v[2].shapeCoordinate[0] = shapeTextureOffset; v[2].shapeCoordinate[1] = shapeTextureOffset; v[2].sourceCoordinate[0] = sourceCoordTransform.x() + sourceCoordTransform.z(); v[2].sourceCoordinate[1] = sourceCoordTransform.w(); v[2].sourceCoordinate[2] = sourceMaskTransform.x() + sourceMaskTransform.z(); v[2].sourceCoordinate[3] = sourceMaskTransform.w(); v[2].yCoordinate = -1.0f; v[2].backgroundColor = backgroundColor[0]; // Set middle row of 3 vertices. v[3].position[0] = 0.0f; v[3].position[1] = 0.5f * itemSize.height(); v[3].shapeCoordinate[0] = shapeTextureOffset; v[3].shapeCoordinate[1] = (0.5f * itemSize.height()) / radius - shapeTextureOffset; v[3].sourceCoordinate[0] = sourceCoordTransform.z(); v[3].sourceCoordinate[1] = 0.5f * sourceCoordTransform.y() + sourceCoordTransform.w(); v[3].sourceCoordinate[2] = sourceMaskTransform.z(); v[3].sourceCoordinate[3] = 0.5f * sourceMaskTransform.y() + sourceMaskTransform.w(); v[3].yCoordinate = 0.0f; v[3].backgroundColor = backgroundColor[1]; v[4].position[0] = 0.5f * itemSize.width(); v[4].position[1] = 0.5f * itemSize.height(); v[4].shapeCoordinate[0] = (0.5f * itemSize.width()) / radius - shapeTextureOffset; v[4].shapeCoordinate[1] = (0.5f * itemSize.height()) / radius - shapeTextureOffset; v[4].sourceCoordinate[0] = 0.5f * sourceCoordTransform.x() + sourceCoordTransform.z(); v[4].sourceCoordinate[1] = 0.5f * sourceCoordTransform.y() + sourceCoordTransform.w(); v[4].sourceCoordinate[2] = 0.5f * sourceMaskTransform.x() + sourceMaskTransform.z(); v[4].sourceCoordinate[3] = 0.5f * sourceMaskTransform.y() + sourceMaskTransform.w(); v[4].yCoordinate = 0.0f; v[4].backgroundColor = backgroundColor[1]; v[5].position[0] = itemSize.width(); v[5].position[1] = 0.5f * itemSize.height(); v[5].shapeCoordinate[0] = shapeTextureOffset; v[5].shapeCoordinate[1] = (0.5f * itemSize.height()) / radius - shapeTextureOffset; v[5].sourceCoordinate[0] = sourceCoordTransform.x() + sourceCoordTransform.z(); v[5].sourceCoordinate[1] = 0.5f * sourceCoordTransform.y() + sourceCoordTransform.w(); v[5].sourceCoordinate[2] = sourceMaskTransform.x() + sourceMaskTransform.z(); v[5].sourceCoordinate[3] = 0.5f * sourceMaskTransform.y() + sourceMaskTransform.w(); v[5].yCoordinate = 0.0f; v[5].backgroundColor = backgroundColor[1]; // Set bottom row of 3 vertices. v[6].position[0] = 0.0f; v[6].position[1] = itemSize.height(); v[6].shapeCoordinate[0] = shapeTextureOffset; v[6].shapeCoordinate[1] = shapeTextureOffset; v[6].sourceCoordinate[0] = sourceCoordTransform.z(); v[6].sourceCoordinate[1] = sourceCoordTransform.y() + sourceCoordTransform.w(); v[6].sourceCoordinate[2] = sourceMaskTransform.z(); v[6].sourceCoordinate[3] = sourceMaskTransform.y() + sourceMaskTransform.w(); v[6].yCoordinate = 1.0f; v[6].backgroundColor = backgroundColor[2]; v[7].position[0] = 0.5f * itemSize.width(); v[7].position[1] = itemSize.height(); v[7].shapeCoordinate[0] = (0.5f * itemSize.width()) / radius - shapeTextureOffset; v[7].shapeCoordinate[1] = shapeTextureOffset; v[7].sourceCoordinate[0] = 0.5f * sourceCoordTransform.x() + sourceCoordTransform.z(); v[7].sourceCoordinate[1] = sourceCoordTransform.y() + sourceCoordTransform.w(); v[7].sourceCoordinate[2] = 0.5f * sourceMaskTransform.x() + sourceMaskTransform.z(); v[7].sourceCoordinate[3] = sourceMaskTransform.y() + sourceMaskTransform.w(); v[7].yCoordinate = 1.0f; v[7].backgroundColor = backgroundColor[2]; v[8].position[0] = itemSize.width(); v[8].position[1] = itemSize.height(); v[8].shapeCoordinate[0] = shapeTextureOffset; v[8].shapeCoordinate[1] = shapeTextureOffset; v[8].sourceCoordinate[0] = sourceCoordTransform.x() + sourceCoordTransform.z(); v[8].sourceCoordinate[1] = sourceCoordTransform.y() + sourceCoordTransform.w(); v[8].sourceCoordinate[2] = sourceMaskTransform.x() + sourceMaskTransform.z(); v[8].sourceCoordinate[3] = sourceMaskTransform.y() + sourceMaskTransform.w(); v[8].yCoordinate = 1.0f; v[8].backgroundColor = backgroundColor[2]; node->markDirty(QSGNode::DirtyGeometry); } ./src/Ubuntu/Components/plugin/uclistitemstyle.cpp0000644000015600001650000001636412700370714022553 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "uclistitemstyle.h" #include "i18n.h" #include "uclistitem_p.h" #include #include #include #include #include /*! * \qmltype ListItemStyle * \instantiates UCListItemStyle * \inqmlmodule Ubuntu.Components.Styles 1.2 * \ingroup style-api * \since Ubuntu.Components.Styles 1.2 * \brief Style API for ListItem component. * * Style API for the ListItem component which provides actions, select and * drag handler delegates, and snap animation via its properties. * ListItem treats the style differently compared to the other components, * as it loads the style only when needed and not upon component creation. */ UCListItemStyle::UCListItemStyle(QQuickItem *parent) : QQuickItem(parent) , m_listItem(0) , m_snapAnimation(0) , m_dropAnimation(0) , m_dragPanel(0) , m_flickable(Q_NULLPTR) , m_animatePanels(true) { } void UCListItemStyle::classBegin() { // grab the animated context property and transfer it to the property QQuickItem::classBegin(); QQmlContext *context = qmlContext(this); if (context && context->contextProperty("animated").isValid()) { setAnimatePanels(context->contextProperty("animated").toBool()); } m_listItem = qmlContext(this)->contextProperty("styledItem").value(); // get the flickable value if (m_listItem) { m_flickable = UCListItemPrivate::get(m_listItem)->flickable.data(); } } void UCListItemStyle::componentComplete() { QQuickItem::componentComplete(); // look for overridden slots, indexOfMethod returns th elast index of the overridden method m_rebound = metaObject()->method(metaObject()->indexOfMethod("rebound()")); m_swipeEvent = metaObject()->method(metaObject()->indexOfMethod("swipeEvent(QVariant)")); // qDebug() << m_rebound.isValid() << m_swipeEvent.isValid(); // for (int i = metaObject()->methodOffset(); i < metaObject()->methodCount(); i++) { // const QMetaMethod method = metaObject()->method(i); // if (method.name() == QByteArrayLiteral("swipeEvent")) { // qDebug() << method.methodSignature(); // m_swipeEvent = method; // } else if (method.name() == QByteArrayLiteral("rebound")) { // m_rebound = method; // } // } // connect snapAnimation's stopped() and the owning ListItem's contentMovementeEnded() signals if (m_listItem && m_snapAnimation) { connect(m_snapAnimation, SIGNAL(runningChanged(bool)), m_listItem, SLOT(_q_contentMoving())); } } /*! * \qmlproperty in ListItemStyle::listItemIndex * \readonly * \since Ubuntu.Components.Styles 1.3 * The property proxies the ListItem's index context property to the style, which * is either the index of the list item in a ListView or the child index. Use this * property rather than the \c index context property as that may not be defined * in situations where the ListItem is not a delegate of a ListView or Repeater. */ int UCListItemStyle::index() { return UCListItemPrivate::get(m_listItem)->index(); } /*! * \qmlproperty Flickable ListItemStyle::flickable * \readonly * \since Ubuntu.Components.Styles 1.3 * The property holds the Flickable (or ListView) holding the ListItem styled. */ QQuickFlickable *UCListItemStyle::flickable() { return m_flickable; } void UCListItemStyle::updateFlickable(QQuickFlickable *flickable) { if (m_flickable == flickable) { return; } m_flickable = flickable; Q_EMIT flickableChanged(); } /*! * \qmlmethod ListItemStyle::swipeEvent(SwipeEvent event) * The function is called by the ListItem when a swipe action is performed, i.e. * when the swipe is started, the position is updated or the swipe ends. The * \b event object provides information about the swipe status, positions and * the updated \l {ListItem::contentItem}{ListItem.contentItem} position. The * style implementation can override the contentItem position by setting the * \c event.content.x or \c event.content.y properties to the desired value. * * The \c event object properties are: * \list * \li \c status - enumeration of \c {Started, Updated, Finished} values representing * the swipe event status * \li \c to - (x, y) coordinates of the current mouse/touch point - read-only * \li \c from - (x, y) coordinates of the previous mouse/touch point - read-only * \li \c content - (x, y) updated coordinates of the \l {ListItem::contentItem} * {ListItem.contentItem}, read-write * \endlist */ void UCListItemStyle::swipeEvent(UCSwipeEvent *event) { Q_UNUSED(event); qmlInfo(this) << QStringLiteral("consider overriding swipeEvent() slot!"); } void UCListItemStyle::invokeSwipeEvent(UCSwipeEvent *event) { if (m_swipeEvent.isValid()) { m_swipeEvent.invoke(this, Q_ARG(QVariant, QVariant::fromValue(event))); } else { swipeEvent(event); } } /*! * \qmlmethod ListItemStyle::rebound() * Function called by the ListItem when a rebounding action is requested from the * style. This usually happens when the list item's content is swiped and there is * a press event happening outside of the ListItem's boundary or when the view * embedding the ListItem starts scrolling. */ void UCListItemStyle::rebound() { qmlInfo(this) << QStringLiteral("consider overriding rebound() slot!"); } void UCListItemStyle::invokeRebound() { if (m_rebound.isValid()) { m_rebound.invoke(this); } else { rebound(); } } /*! * \qmlproperty Animation ListItemStyle::snapAnimation * Holds the behavior used in animating when snapped in or out. */ /*! * \qmlproperty bool ListItemStyle::animatePanels * The property drives the different panel animations in the style. Panels should * not be animated when created upon scrolling a view. */ bool UCListItemStyle::animatePanels() const { return m_animatePanels; } // the setter is used by the ListItem to drive animation state void UCListItemStyle::setAnimatePanels(bool animate) { if (m_animatePanels == animate) { return; } m_animatePanels = animate; Q_EMIT animatePanelsChanged(); } /*! * \qmlproperty PropertyAnimation ListItemStyle::dropAnimation * The property holds the animation executed on ListItem dropping. */ /*! * \qmlproperty Item ListItemStyle::dragPanel * The property holds the item visualizing the drag handler. ListItem's dragging * mechanism uses this property to detect the area the dragging can be initiated * from. If not set, the ListItem will assume the dragging can be initiated from * the entire area of the ListItem. */ ./src/Ubuntu/Components/plugin/ucalarm.h0000644000015600001650000001003312700370701020360 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCALARM_H #define UCALARM_H #include #include #include class UCAlarmPrivate; class UCAlarm : public QObject { Q_OBJECT Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged) Q_PROPERTY(QString message READ message WRITE setMessage NOTIFY messageChanged) Q_PROPERTY(QDateTime date READ date WRITE setDate NOTIFY dateChanged) Q_PROPERTY(AlarmType type READ type WRITE setType NOTIFY typeChanged) Q_PROPERTY(DaysOfWeek daysOfWeek READ daysOfWeek WRITE setDaysOfWeek NOTIFY daysOfWeekChanged) Q_PROPERTY(QUrl sound READ sound WRITE setSound NOTIFY soundChanged) Q_PROPERTY(int error READ error NOTIFY errorChanged) Q_PROPERTY(Status status READ status NOTIFY statusChanged) Q_ENUMS(Status Operation Error AlarmType DayOfWeek) Q_FLAGS(DaysOfWeek) public: // enums enum Status { // keep values in sync with AlarmRequest::Status Ready = 1, InProgress, Fail }; enum Operation { // keep values in sync with AlarmRequest::Operation NoOperation, Saving, Canceling, Reseting }; enum Error { NoError = 0, InvalidDate = 1, EarlyDate = 2, NoDaysOfWeek = 3, OneTimeOnMoreDays = 4, InvalidEvent = 5, OperationPending = 6, AdaptationError = 100 }; enum AlarmType { OneTime, Repeating // more to be added }; enum DayOfWeek { Monday = 0x01, Tuesday = 0x02, Wednesday = 0x04, Thursday = 0x08, Friday = 0x10, Saturday = 0x20, Sunday = 0x40, Daily = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday, AutoDetect = 0x80 }; Q_DECLARE_FLAGS(DaysOfWeek, DayOfWeek) public: explicit UCAlarm(QObject *parent = 0); UCAlarm(const QDateTime &dt, const QString &message = QString(), QObject *parent = 0); UCAlarm(const QDateTime &dt, DaysOfWeek days = AutoDetect, const QString &message = QString(), QObject *parent = 0); ~UCAlarm(); bool operator==(const UCAlarm &that) const; public: // getter/setter bool enabled() const; void setEnabled(bool enabled); QDateTime date() const; void setDate(const QDateTime &date); QString message() const; void setMessage(const QString &message); AlarmType type() const; void setType(AlarmType type); DaysOfWeek daysOfWeek() const; void setDaysOfWeek(DaysOfWeek days); QUrl sound() const; void setSound(const QUrl &sound); int error() const; Status status() const; QVariant cookie() const; void wait(int msec = 0); Q_SIGNALS: void enabledChanged(); void messageChanged(); void dateChanged(); void typeChanged(); void daysOfWeekChanged(); void soundChanged(); void errorChanged(); void statusChanged(Operation operation); public Q_SLOTS: void save(); void cancel(); void reset(); private: Q_DISABLE_COPY(UCAlarm) friend class UCAlarmPrivate; QScopedPointer d_ptr; Q_PRIVATE_SLOT(d_ptr, void _q_syncStatus(int operation, int status, int error)) Q_PRIVATE_SLOT(d_ptr, void completeSave()) Q_PRIVATE_SLOT(d_ptr, void completeCancel()) }; Q_DECLARE_OPERATORS_FOR_FLAGS(UCAlarm::DaysOfWeek) #endif // UUALARM_H ./src/Ubuntu/Components/plugin/ucapplication.h0000644000015600001650000000372712700370701021603 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #ifndef UBUNTU_COMPONENTS_APPLICATION_H #define UBUNTU_COMPONENTS_APPLICATION_H #include class QQmlContext; class QQmlEngine; class UCApplication : public QObject { Q_OBJECT Q_PROPERTY(QString applicationName READ applicationName WRITE setApplicationName NOTIFY applicationNameChanged) Q_PROPERTY(QObject* inputMethod READ inputMethod WRITE setInputMethod NOTIFY inputMethodChanged) private: Q_DISABLE_COPY(UCApplication) explicit UCApplication(QObject* parent = 0); ~UCApplication(); public: static UCApplication *instance(QObject *parent = Q_NULLPTR) { if (!m_app) { if (!parent) { qFatal("Creating UbuntuApplication singleton requires a parent object!"); } m_app = new UCApplication(parent); } return m_app; } // getter QString applicationName(); QObject* inputMethod(); // setter void setContext(QQmlContext* context); void setApplicationName(const QString& applicationName); void setInputMethod(QObject* inputMethod); private: QQmlContext* m_context; QObject* m_inputMethod; static UCApplication *m_app; Q_SIGNALS: void applicationNameChanged(); void inputMethodChanged(); }; #endif // UBUNTU_COMPONENTS_I18N_H ./src/Ubuntu/Components/plugin/ucmathutils.cpp0000644000015600001650000000400412700370701021632 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "ucmathutils.h" #include /*! \qmltype mathUtils \inqmlmodule Ubuntu.Components \ingroup ubuntu \brief Various mathematical utility functions. */ UCMathUtils::UCMathUtils(QObject *parent) : QObject(parent) { } /*! \qmlmethod mathUtils::clamp(x, min, max) Ensure the value x is between min and max */ double UCMathUtils::clamp(double x, double min, double max) { if (!(min > max)) { return qBound(min, x, max); } else { // swap min/max if min > max return qBound(max, x, min); } } /*! \qmlmethod mathUtils::lerp(delta, from, to) Get the linear interpolation */ double UCMathUtils::lerp(double delta, double from, double to) { return ((1.0 - delta) * from) + (delta * to); } /*! \qmlmethod mathUtils::projectValue(x, xmin, xmax, ymin, ymax) Linearly project a value x from [xmin, xmax] into [ymin, ymax] */ double UCMathUtils::projectValue(double x, double xmin, double xmax, double ymin, double ymax) { return ((x - xmin) * ymax - (x - xmax) * ymin) / (xmax - xmin); } /*! \qmlmethod mathUtils::clampAndProject(x, xmin, xmax, ymin, ymax) Linearly project a value x, but in addition to projectValue it's clamped to xmin/xmax first */ double UCMathUtils::clampAndProject(double x, double xmin, double xmax, double ymin, double ymax) { return projectValue(clamp(x, xmin, xmax), xmin, xmax, ymin, ymax); } ./src/Ubuntu/Components/plugin/inversemouseareatype.h0000644000015600001650000000420212700370701023214 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef INVERSEMOUSEAREATYPE_H #define INVERSEMOUSEAREATYPE_H #include #include class QQuickItem; class InverseMouseAreaType : public QQuickMouseArea { Q_OBJECT Q_PROPERTY(QQuickItem *sensingArea READ sensingArea WRITE setSensingArea NOTIFY sensingAreaChanged) Q_PROPERTY(bool topmostItem READ topmostItem WRITE setTopmostItem NOTIFY topmostItemChanged) public: explicit InverseMouseAreaType(QQuickItem *parent = 0); ~InverseMouseAreaType(); Q_INVOKABLE virtual bool contains(const QPointF &point) const; protected: void itemChange(ItemChange, const ItemChangeData &); void componentComplete(); bool eventFilter(QObject *, QEvent *); // override mouse events void mousePressEvent(QMouseEvent *event); void mouseDoubleClickEvent(QMouseEvent *event); private: // getter/setter QQuickItem *sensingArea() const; void setSensingArea(QQuickItem *sensing); bool topmostItem() const; void setTopmostItem(bool value); QEvent * mapEventToArea(QObject *target, QEvent *event, QPoint &point); Q_SIGNALS: void sensingAreaChanged(); void topmostItemChanged(); private Q_SLOTS: void update(); void resetFilterOnWindowUpdate(QQuickWindow *win); private: bool m_ready:1; bool m_topmostItem:1; bool m_filteredEvent:1; QPointer m_filterHost; QPointer m_sensingArea; int m_touchId; void updateEventFilter(bool enable); }; #endif // INVERSEMOUSEAREATYPE_H ./src/Ubuntu/Components/plugin/qquickclipboard.cpp0000644000015600001650000001266712700370701022463 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include #include #include "qquickclipboard.h" #include "qquickclipboard_p.h" #include "qquickmimedata.h" /*! * \qmltype Clipboard * \instantiates QQuickClipboard * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu * \brief This is a singleton type providing access to the system clipboard. * * Clipboard data can be retrieved through data property, which returns an object * of MimeData type. The actual content of the clipboard can be accessed through * this object. Data can be pushed to the clipboard using push() function. * * The clipboard data cannot be modified through the type returned by the data * property, for this a new instance of MimeData type must be used. This instance * can be either a standalone MimeDala component or an object created using newData() * function. Remember that standalone MimeData types duplicate the clipboard data * which may cause extensive memory use. * * Examples of use: * * 1. Using standard MimeType component - the following example copies the selected * text from the text area into the clipboard pushing also a color * \qml * Item { * TextArea { * id: editor * } * * MimeData { * id: mimeData * color: "green" * text: editor.text * } * * Button { * text: "Copy" * onClicked: Clipboard.push(mimeData) * } * } * \endqml * * 2. Pushing data straight to clipboard * \qml * Item { * TextArea { * id: editor * } * * Button { * text: "Copy" * onClicked: { * Clipboard.push(editor.text); * Clipboard.push(["application/x-color", "green"]); * } * } * } * \endqml * * 3. Pushing data using MimeData object * \qml * Item { * TextArea { * id: editor * } * * Button { * text: "Copy" * onClicked: { * var mimeData = Clipboard.newData(); * mimeData.text = editor.text; * mimeData.color = "green"; * Clipboard.push(mimeData); * } * } * } * \endqml * */ /*! * \qmlsignal Clipboard::dataChanged() * The signal is triggered when clipboard content gets changed. */ QQuickClipboardPrivate::QQuickClipboardPrivate(QQuickClipboard *qq) : q_ptr(qq), clipboard(QGuiApplication::clipboard()), mode(QClipboard::Clipboard), mimeData(0) { // connect to the system clipboard's dataChanged signal so we get update QObject::connect(clipboard, SIGNAL(dataChanged()), q_ptr, SIGNAL(dataChanged())); } void QQuickClipboardPrivate::updateMimeData() { const QMimeData *data = clipboard->mimeData(mode); if (!mimeData) mimeData = new QQuickMimeData(clipboard->mimeData(mode), true, q_ptr); else mimeData->fromMimeData(data); } QQuickClipboard::QQuickClipboard(QObject *parent) : QObject(parent), d_ptr(new QQuickClipboardPrivate(this)) { } /*! * \qmlproperty MimeData Clipboard::data * Provides access to the Clipboard's current data. */ QQuickMimeData *QQuickClipboard::data() { Q_D(QQuickClipboard); d->updateMimeData(); return d->mimeData; } /*! * \qmlmethod MimeData Clipboard::newData() * The function returns a new MimeData object that can be used in Java script code * to push pultiple MIME types at the same time. */ QQuickMimeData *QQuickClipboard::newData() { // create it so that we give a QMimeData instance so it won't create a new // instance of that when data is pushed to clipboard return new QQuickMimeData(new QMimeData, false, this); } /*! * \qmlmethod Clipboard::push(var data) * The function copies data provided as parameter to the clipboard. The parameter * can be a MimeData instance or object created using newData() beside * the ones listed at MimeData::data. * * When MimeData instance or object is given, the entire object content will be * pushed to the clipboard. * */ void QQuickClipboard::push(const QVariant& data) { if (!data.isValid()) return; Q_D(QQuickClipboard); // check whether we have a MimeData to push QQuickMimeData *mimeData = qvariant_cast(data); if (mimeData) d->clipboard->setMimeData(mimeData->toMimeData(), d->mode); else { QQuickMimeData newData(new QMimeData, false); if (data.userType() == qMetaTypeId()) { newData.setMimeData(data.value().toVariant()); } else { newData.setMimeData(data); } d->clipboard->setMimeData(newData.m_mimeData, d->mode); } } /*! * \qmlmethod Clipboard::clear() * The function clears the clipboard content. */ void QQuickClipboard::clear() { Q_D(QQuickClipboard); d->clipboard->clear(d->mode); } #include "moc_qquickclipboard.cpp" ./src/Ubuntu/Components/plugin/qquickmimedata.cpp0000644000015600001650000002011312700370701022266 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include #include #include #include #include #include "qquickmimedata.h" #include /*! * \qmltype MimeData * \instantiates QQuickMimeData * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu * \brief MimeData type provides interface to access and store data to the * Clipboard. * */ QQuickMimeData::QQuickMimeData(QObject *parent) : QObject(parent), m_refData(false), m_mimeData(new QMimeData) { } QQuickMimeData::QQuickMimeData(const QMimeData *mimeData, bool refData, QObject *parent) : QObject(parent), m_refData(refData), m_mimeData(const_cast(mimeData)) { } QQuickMimeData::~QQuickMimeData() { // if the clipboard doesn't own the MimeData yet, delete it if (QGuiApplication::clipboard()->mimeData(QClipboard::Clipboard) != m_mimeData) delete m_mimeData; m_mimeData = 0; } /*! * \internal * Updates the internal MIME data from the clipboard. */ void QQuickMimeData::fromMimeData(const QMimeData *data) { // copy if (!data || (m_mimeData == data)) return; if (!m_refData) delete m_mimeData; m_mimeData = const_cast(data); } /* * This function is called when a standalone MimeData instance is passed as parameter to push() */ QMimeData *QQuickMimeData::toMimeData() { QMimeData *ret = m_mimeData; if (!m_refData) { m_mimeData = new QMimeData; // copy data so we keep the properties as they were Q_FOREACH(const QString &format, ret->formats()) { m_mimeData->setData(format, ret->data(format)); } // set teh color separately m_mimeData->setColorData(ret->colorData()); } return ret; } /*! * \qmlproperty list MimeData::format * Returns a list of formats supported by the object. This is a list of MIME * types for which the object can return suitable data. The formats in the list * are in a priority order. * * \sa data */ QStringList QQuickMimeData::formats() const { return (m_mimeData) ? m_mimeData->formats() : QStringList(); } /*! * \qmlproperty string MimeData::text * Contains a plain text (MIME type text/plain) representation of the data. */ QString QQuickMimeData::text() const { return m_mimeData ? m_mimeData->text() : QString(); } void QQuickMimeData::setText(const QString &text) { if (!m_refData) { m_mimeData->setText(text); Q_EMIT textChanged(); } } /*! * \qmlproperty string MimeData::html * Contains a string if the data stored in the object is HTML (MIME type text/html); * otherwise contains an empty string. */ QString QQuickMimeData::html() const { return m_mimeData ? m_mimeData->html() : QString(); } void QQuickMimeData::setHtml(const QString &html) { if (!m_refData) { m_mimeData->setHtml(html); Q_EMIT htmlChanged(); } } /*! * \qmlproperty list MimeData::urls * Contains a list of URLs contained within the MIME data object. URLs correspond * to the MIME type text/uri-list. */ QList QQuickMimeData::urls() const { return m_mimeData ? m_mimeData->urls() : QList(); } void QQuickMimeData::setUrls(const QList &urls) { if (!m_refData) { m_mimeData->setUrls(urls); Q_EMIT urlsChanged(); } } /*! * \qmlproperty color MimeData::color */ QColor QQuickMimeData::color() const { return (m_mimeData) ? qvariant_cast(m_mimeData->colorData()) : QColor(); } void QQuickMimeData::setColor(const QColor &color) { if (!m_refData) { m_mimeData->setColorData(color); Q_EMIT colorChanged(); } } /*! * \qmlproperty var MimeData::data * Reading the property returns a list of MIME type and data pairs representing * the data stored in the object. Users can set custom MIME types which are not * covered by the other properties. * * When setting the property value can take one of the following types: * \list * \li - string - the data will be set as \c{text/plain} MIME type, or * as \c{text/html} in case HTML tags are detected * \li - color - the data will be set as \c{application/x-color} MIME type * \li - list - the data will be set as \c{text/uri-list} * \li - list - the data will be set as \c{text/uri-list} in case the * first element of the list is a valid URL with scheme; otherwise if the list * size is even, the list will be set as pairs of (MIME type,data) * \li - list - same as list or list * \endlist */ QVariant QQuickMimeData::mimeData() const { if (!m_mimeData) return QVariant(); QVariantList ret; Q_FOREACH(const QString &format, formats()) { ret << format; ret << QVariant(m_mimeData->data(format)); } return QVariant::fromValue(ret); } static bool setMimeType(QMimeData *mimeData, QVariantList &mlist) { bool ret = false; QMimeDatabase db; for (int i = 0; i < mlist.length() / 2; i++) { QString type = mlist[2 * i].toString(); if (db.mimeTypeForName(type).isValid() || type == "application/x-color") { QByteArray data = mlist[2 * i + 1].toByteArray(); mimeData->setData(type, data); ret = true; } else if (type == "application/x-color") { // for some reason colors are not taken in other way... mimeData->setColorData(mlist[2 * i + 1]); ret = true; } } return ret; } void QQuickMimeData::setMimeData(const QVariant &mimeData) { if (m_refData) return; QMimeDatabase db; bool emitSignal = false; if (mimeData.type() == QVariant::List) { // the list can be a list of URLs or a list of (type, data) pairs or a // plain list formatted so that every 2k element describes a type and // every 2k+1 defines the data QVariantList mlist= mimeData.toList(); if (mlist[0].type() == QVariant::List) { Q_FOREACH(const QVariant &item, mlist) { // should not have more than two elements QVariantList block = item.toList(); if (setMimeType(m_mimeData, block)) emitSignal = true; } } else { QUrl url(mlist[0].toUrl()); if (!url.scheme().isEmpty()) { // we have a list or URLs, push them QList ulist; Q_FOREACH(const QVariant &v, mlist) { ulist << v.toUrl(); } setUrls(ulist); emitSignal = true; } else if (!(mlist.length() % 2)) { // the count of the list is a pair number, so we might have the // mime (type,data) pairs emitSignal = setMimeType(m_mimeData, mlist); } } } else if (mimeData.type() == QVariant::Color){ // color must e handled separately m_mimeData->setColorData(mimeData); emitSignal = true; } else { // try to detect the mime data within the variant // text/plain, text/html and application/x-color types QByteArray data = mimeData.toByteArray(); QMimeType type = db.mimeTypeForData(mimeData.toByteArray()); if (type.isValid()) { m_mimeData->setData(type.name(), data); emitSignal = true; } else { qWarning() << "UNHANDLED" << mimeData; } } if (emitSignal) Q_EMIT dataChanged(); } ./src/Ubuntu/Components/plugin/ucabstractbutton_p.h0000644000015600001650000000266512700370701022656 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCABSTRACTBUTTON_P #define UCABSTRACTBUTTON_P #include "ucabstractbutton.h" #include "ucactionitem_p.h" class UCAbstractButtonPrivate : public UCActionItemPrivate { Q_DECLARE_PUBLIC(UCAbstractButton) public: static UCAbstractButtonPrivate *get(UCAbstractButton *item) { return item->d_func(); } UCAbstractButtonPrivate(); void init(); void completeComponentInitialization() override; bool isPressAndHoldConnected(); void onClicked(); // private slots void _q_mouseAreaPressed(); void _q_mouseAreaClicked(); void _q_mouseAreaPressAndHold(); void _q_adjustSensingArea(); QQuickMouseArea *mouseArea; UCMargins *sensingMargins = nullptr; bool acceptEvents:1; bool pressAndHoldConnected:1; }; #endif // UCABSTRACTBUTTON_P ./src/Ubuntu/Components/plugin/uclistitemstyle.h0000644000015600001650000000664112700370701022211 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCLISTITEMSTYLE_H #define UCLISTITEMSTYLE_H #include class UCSwipeEvent : public QObject { Q_OBJECT Q_PROPERTY(QPointF to READ to) Q_PROPERTY(QPointF from READ from) Q_PROPERTY(QPointF content MEMBER m_contentPos) Q_PROPERTY(Status status READ status) Q_ENUMS(Status) public: enum Status { Started, Updated, Finished }; UCSwipeEvent(const QPointF &mousePos, const QPointF &lastPos, const QPointF &contentPos, Status status) : QObject(), m_mousePos(mousePos), m_lastPos(lastPos), m_contentPos(contentPos), m_status(status) { } QPointF to() const { return m_mousePos; } QPointF from() const { return m_lastPos; } Status status() const { return m_status; } QPointF m_mousePos; QPointF m_lastPos; QPointF m_contentPos; Status m_status; }; class QQmlComponent; class QQuickAbstractAnimation; class QQuickPropertyAnimation; class QQuickBehavior; class UCListItem; class QQuickFlickable; class UCListItemStyle : public QQuickItem { Q_OBJECT Q_PROPERTY(QQuickAbstractAnimation *snapAnimation MEMBER m_snapAnimation NOTIFY snapAnimationChanged) Q_PROPERTY(QQuickPropertyAnimation *dropAnimation MEMBER m_dropAnimation NOTIFY dropAnimationChanged) Q_PROPERTY(bool animatePanels READ animatePanels NOTIFY animatePanelsChanged) Q_PROPERTY(QQuickItem *dragPanel MEMBER m_dragPanel NOTIFY dragPanelChanged) Q_PROPERTY(int listItemIndex READ index NOTIFY listItemIndexChanged FINAL REVISION 1) Q_PROPERTY(QQuickFlickable *flickable READ flickable NOTIFY flickableChanged REVISION 1) public: explicit UCListItemStyle(QQuickItem *parent = 0); void invokeSwipeEvent(UCSwipeEvent *event); void invokeRebound(); bool animatePanels() const; void setAnimatePanels(bool animate); int index(); QQuickFlickable *flickable(); void updateFlickable(QQuickFlickable *flickable); Q_SIGNALS: void snapAnimationChanged(); void dropAnimationChanged(); void animatePanelsChanged(); void dragPanelChanged(); Q_REVISION(1) void listItemIndexChanged(); Q_REVISION(1) void flickableChanged(); public Q_SLOTS: void swipeEvent(UCSwipeEvent *event); void rebound(); protected: void classBegin(); void componentComplete(); private: QMetaMethod m_swipeEvent; QMetaMethod m_rebound; UCListItem *m_listItem; QQuickAbstractAnimation *m_snapAnimation; QQuickPropertyAnimation *m_dropAnimation; QQuickItem *m_dragPanel; QQuickFlickable *m_flickable; bool m_animatePanels:1; friend class UCListItemPrivate; friend class ListItemDragArea; friend class ListItemDragHandler; friend class UCViewItemsAttachedPrivate; }; #endif // UCLISTITEMSTYLE_H ./src/Ubuntu/Components/plugin/alarmmanager_p.cpp0000644000015600001650000000420112700370701022235 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "alarmmanager_p.h" #include "alarmmanager_p_p.h" #include "ucalarm.h" #include "ucalarm_p.h" AlarmManagerPrivate::AlarmManagerPrivate(AlarmManager *qq) : q_ptr(qq) , completed(false) { } AlarmManagerPrivate::~AlarmManagerPrivate() { } /*----------------------------------------------------------------------------- * Alarm Manager public interface */ AlarmManager::AlarmManager(QObject *parent) : QObject(parent) , d_ptr(createAlarmsAdapter(this)) { } AlarmManager::~AlarmManager() { } AlarmManager &AlarmManager::instance() { static AlarmManager instance; if (!instance.d_ptr->completed) { instance.d_ptr->init(); } return instance; } bool AlarmManager::fetchAlarms() { return d_ptr->fetchAlarms(); } int AlarmManager::alarmCount() { return d_ptr->alarmCount(); } UCAlarm *AlarmManager::alarmAt(int index) { return d_ptr->getAlarmAt(index); } // the function returns an un-cached alarm for testing purposes UCAlarm *AlarmManager::findAlarm(const QVariant &cookie) const { static UCAlarm alarm; if (!d_ptr->findAlarm(alarm, cookie)) { return 0; } return &alarm; } bool AlarmManager::verifyChange(UCAlarm *alarm, Change change, const QVariant &newData) { return d_ptr->verifyChange(alarm, change, newData); } UCAlarmPrivate *AlarmManager::createAlarmData(UCAlarm *alarm) { return AlarmManagerPrivate::get()->createAlarmData(alarm); } #include "moc_alarmmanager_p.cpp" ./src/Ubuntu/Components/plugin/ucbottomedgeregion.h0000644000015600001650000000511112700370714022626 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCBOTTOMEDGEREGION_H #define UCBOTTOMEDGEREGION_H #include #include #include #include #include #include class UCBottomEdge; class QQmlComponent; class PropertyChange; class UCBottomEdgeRegionPrivate; class UCBottomEdgeRegion : public QObject { Q_OBJECT Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged FINAL) Q_PROPERTY(qreal from READ from WRITE setFrom NOTIFY fromChanged FINAL) Q_PROPERTY(qreal to READ to WRITE setTo NOTIFY toChanged FINAL) Q_PROPERTY(QUrl contentUrl READ url WRITE setUrl NOTIFY contentChanged FINAL) Q_PROPERTY(QQmlComponent* contentComponent READ component WRITE setComponent NOTIFY contentComponentChanged FINAL) public: explicit UCBottomEdgeRegion(QObject *parent = 0); // used internally QUrl url() const; void setUrl(const QUrl &url); QQmlComponent *component() const; void setComponent(QQmlComponent *component); qreal from() const; void setFrom(qreal from); qreal to() const; void setTo(qreal to); bool enabled() const; void setEnabled(bool enabled); // support API bool contains(qreal dragRatio); virtual bool canCommit(qreal dragRatio); void enter(); void exit(); const QRectF rect(const QRectF &bottomEdgeRect); // not exposed to QML Q_SIGNALS: void enabledChanged(); void fromChanged(); void toChanged(); void contentChanged(const QUrl &url); void contentComponentChanged(QQmlComponent *component); void entered(); void exited(); void dragEnded(); protected: UCBottomEdgeRegion(UCBottomEdgeRegionPrivate &dd, QObject *parent); private: Q_DECLARE_PRIVATE(UCBottomEdgeRegion) Q_PRIVATE_SLOT(d_func(), void onLoaderStatusChanged(AsyncLoader::LoadingStatus,QObject*)) }; #endif // UCBOTTOMEDGEREGION_H ./src/Ubuntu/Components/plugin/ucbottomedgeregion.cpp0000644000015600001650000003327312700370714023173 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "ucbottomedge.h" #include "ucbottomedge_p.h" #include "ucbottomedgeregion.h" #include "ucbottomedgeregion_p.h" #include "propertychange_p.h" #include UCBottomEdgeRegionPrivate::UCBottomEdgeRegionPrivate() : QObjectPrivate() , bottomEdge(Q_NULLPTR) , component(Q_NULLPTR) , contentItem(Q_NULLPTR) , from(0.0) , to(-1.0) , enabled(true) , active(false) { } void UCBottomEdgeRegionPrivate::init() { Q_Q(UCBottomEdgeRegion); bottomEdge = qobject_cast(parent); QObject::connect(&loader, SIGNAL(loadingStatus(AsyncLoader::LoadingStatus,QObject*)), q, SLOT(onLoaderStatusChanged(AsyncLoader::LoadingStatus,QObject*))); } /*! * \qmltype BottomEdgeRegion * \instantiates UCBottomEdgeRegion * \inherits QtObject * \inmodule Ubuntu.Components 1.3 * \since Ubuntu.Components 1.3 * \ingroup ubuntu * \brief Defines an active region within the BottomEdge component. * * Bottom edge regions are portions within the bottom edge area which can define * different content or action whenever the drag enters in the area. The area is * defined by \l from and \l to properties vertically, whereas horizontally is * stretched across bottom edge width. Custom content can be defined through * \l contentUrl or \l contentComponent properties, which will override the * \l BottomEdge::contentUrl and \l BottomEdge::contentComponent properties for the * time the gesture is in the section area. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * * MainView { * width: units.gu(40) * height: units.gu(70) * * Page { * header: PageHeader { * title: "BottomEdge regions" * } * * BottomEdge { * id: bottomEdge * height: parent.height - units.gu(20) * hint: BottomEdgeHint { * text: "My bottom edge" * } * // a fake content till we reach the committable area * contentComponent: Rectangle { * width: bottomEdge.width * height: bottomEdge.height * color: UbuntuColors.green * } * // override bottom edge sections to switch to real content * BottomEdgeRegion { * from: 0.33 * contentComponent: Page { * width: bottomEdge.width * height: bottomEdge.height * header: PageHeader { * title: "BottomEdge Content" * } * } * } * } * } * } * \endqml * * Entering into the section area is signalled by the \l entered signal and when * drag leaves the area the \l exited signal is emitted. If the drag ends within * the section area, the \l dragEnded signal is emitted. In case the section's * \l to property is less than 1.0, the bottom edge content will only be exposed * to that value, and the \l BottomEdge::status will get the \e Committed value. * No further drag is possible after reaching \e Commited state. * * \note Whereas there is no restriction on making overlapping sections, beware that * overlapping sections changing the content through the \l contentUrl or \l contentComponent * properties will cause unpredictable results. */ UCBottomEdgeRegion::UCBottomEdgeRegion(QObject *parent) : QObject(*(new UCBottomEdgeRegionPrivate), parent) { d_func()->init(); } UCBottomEdgeRegion::UCBottomEdgeRegion(UCBottomEdgeRegionPrivate &dd, QObject *parent) : QObject(dd, parent) { d_func()->init(); } void UCBottomEdgeRegionPrivate::attachToBottomEdge(UCBottomEdge *bottomEdge) { Q_Q(UCBottomEdgeRegion); QQml_setParent_noEvent(q, bottomEdge); this->bottomEdge = bottomEdge; // adjust to property value if not set yet if (to <= 0.0) { to = 1.0; Q_EMIT q->toChanged(); } // if preload is set, load content if (bottomEdge->preloadContent()) { loadRegionContent(); } } bool UCBottomEdgeRegion::contains(qreal dragRatio) { Q_D(UCBottomEdgeRegion); return (d->enabled && (d->from < d->to) && dragRatio >= d->from && dragRatio <= d->to); } // Called when drag ends to check whether content can be committed. The default // implementation returns true. bool UCBottomEdgeRegion::canCommit(qreal dragRatio) { Q_UNUSED(dragRatio); return true; } void UCBottomEdgeRegion::enter() { Q_D(UCBottomEdgeRegion); d->active = true; Q_EMIT entered(); LOG << "ENTER REGION" << objectName(); // if preloaded, or default(?), set the content if (d->bottomEdge->preloadContent()) { if (d->loader.status() == UbuntuToolkit::AsyncLoader::Ready) { LOG << "SET REGION CONTENT" << objectName(); UCBottomEdgePrivate::get(d->bottomEdge)->setCurrentContent(); } } else { // initiate loading, component has priority d->loadRegionContent(); } } void UCBottomEdgeRegion::exit() { Q_D(UCBottomEdgeRegion); d->active = false; Q_EMIT exited(); // detach content from BottomEdge LOG << "EXIT REGION" << objectName(); UCBottomEdgePrivate::get(d->bottomEdge)->resetCurrentContent(nullptr); // then cleanup if (!d->contentItem) { return; } LOG << "RESET REGION CONTENT" << objectName(); if (!d->bottomEdge->preloadContent()) { LOG << "DISCARD REGION CONTENT" << objectName(); d->discardRegionContent(); } } const QRectF UCBottomEdgeRegion::rect(const QRectF &bottomEdgeRect) { Q_D(UCBottomEdgeRegion); QRectF regionRect( bottomEdgeRect.topLeft() + QPointF(0, bottomEdgeRect.height() * (1.0 - d->to)), QSizeF(bottomEdgeRect.width(), bottomEdgeRect.height() * (d->to - d->from))); return regionRect; } void UCBottomEdgeRegionPrivate::loadRegionContent() { if (!enabled) { return; } LOG << "LOAD REGION CONTENT" << q_func()->objectName() << contentItem; if (component) { loadContent(LoadingComponent); } else if (url.isValid()) { loadContent(LoadingUrl); } } void UCBottomEdgeRegionPrivate::loadContent(LoadingType type) { // we must delete the previous content before we (re)initiate loading if (contentItem) { contentItem->deleteLater();; contentItem = nullptr; } // no need to create new context as we do not set any context properties // for which we would need one switch (type) { case LoadingUrl: loader.load(url, qmlContext(bottomEdge)); return; case LoadingComponent: loader.load(component, qmlContext(bottomEdge)); return; } } void UCBottomEdgeRegionPrivate::discardRegionContent() { loader.reset(); if (contentItem) { LOG << "DISCARD CONTENT" << q_func()->objectName(); contentItem->deleteLater(); } contentItem = nullptr; } void UCBottomEdgeRegionPrivate::onLoaderStatusChanged(AsyncLoader::LoadingStatus status, QObject *object) { bool emitChange = false; LOG << "STATUS" << status << object; if (status == UbuntuToolkit::AsyncLoader::Ready) { // if we are no longer active, no need to continue, and discard content // this may occur when the component was still in Compiling state while // the region was exited, therefore reset() could not cancel the operation. if (!active && !bottomEdge->preloadContent()) { LOG << "DELETE REGION CONTENT" << q_func()->objectName(); object->deleteLater(); return; } contentItem = qobject_cast(object); emitChange = active; } if (status == UbuntuToolkit::AsyncLoader::Reset) { // de-parent first if (contentItem) { contentItem->setParentItem(nullptr); LOG << "RESET CONTENT" << q_func()->objectName(); contentItem->deleteLater(); } contentItem = nullptr; emitChange = true; } if (emitChange && bottomEdge && active) { UCBottomEdgePrivate::get(bottomEdge)->setCurrentContent(); } } /*! * \qmlproperty bool BottomEdgeRegion::enabled * Enables the section. Disabled sections do not trigger nor change the BottomEdge * content. Defaults to false. */ bool UCBottomEdgeRegion::enabled() const { Q_D(const UCBottomEdgeRegion); return d->enabled; } void UCBottomEdgeRegion::setEnabled(bool enabled) { Q_D(UCBottomEdgeRegion); if (enabled == d->enabled) { return; } d->enabled = enabled; if (d->bottomEdge) { UCBottomEdgePrivate::get(d->bottomEdge)->validateRegion(this); // load content if preload is set if (d->bottomEdge->preloadContent()) { if (!d->enabled) { d->discardRegionContent(); } else { d->loadRegionContent(); } } } Q_EMIT enabledChanged(); } /*! * \qmlproperty real BottomEdgeRegion::from * Specifies the starting ratio of the bottom erge area. The value must be bigger * or equal to 0 but strictly smaller than \l to. Defaults to 0.0. */ qreal UCBottomEdgeRegion::from() const { Q_D(const UCBottomEdgeRegion); return d->from; } void UCBottomEdgeRegion::setFrom(qreal from) { Q_D(UCBottomEdgeRegion); if (from == d->from) { return; } d->from = from; if (d->bottomEdge) { UCBottomEdgePrivate::get(d->bottomEdge)->validateRegion(this); } Q_EMIT fromChanged(); } /*! * \qmlproperty real BottomEdgeRegion::to * Specifies the ending ratio of the bottom edge area. The value must be bigger * than \l from and smaller or equal to 1.0. * \note If the end point is less than 1.0, ending the drag within the section * will result in exposing the bottom edge content only till the ration specified * by this property. */ qreal UCBottomEdgeRegion::to() const { Q_D(const UCBottomEdgeRegion); return d->to; } void UCBottomEdgeRegion::setTo(qreal to) { Q_D(UCBottomEdgeRegion); if (to == d->to) { return; } d->to = to; if (d->bottomEdge) { UCBottomEdgePrivate::get(d->bottomEdge)->validateRegion(this); } Q_EMIT toChanged(); } /*! * \qmlproperty url BottomEdgeRegion::contentUrl * Specifies the url to the document defining the section specific content. This * propery will temporarily override the \l BottomEdge::contentUrl property value * when the drag gesture enters the section area. The orginal value will be restored * once the gesture leaves the section area. */ QUrl UCBottomEdgeRegion::url() const { Q_D(const UCBottomEdgeRegion); return d->url; } void UCBottomEdgeRegion::setUrl(const QUrl &url) { Q_D(UCBottomEdgeRegion); if (d->url == url) { return; } d->url = url; Q_EMIT contentChanged(d->url); // invoke loader if the preload is set if (d->bottomEdge && (d->bottomEdge->preloadContent()) && !d->url.isValid()) { d->loadContent(UCBottomEdgeRegionPrivate::LoadingUrl); } } /*! * \qmlproperty Component BottomEdgeRegion::contentComponent * Specifies the component defining the section specific content. This propery * will temporarily override the \l BottomEdge::contentComponent property value * when the drag gesture enters the section area. The orginal value will be restored * once the gesture leaves the section area. */ QQmlComponent *UCBottomEdgeRegion::component() const { Q_D(const UCBottomEdgeRegion); return d->component; } void UCBottomEdgeRegion::setComponent(QQmlComponent *component) { Q_D(UCBottomEdgeRegion); if (d->component == component) { return; } d->component = component; Q_EMIT contentComponentChanged(d->component); // invoke loader if the preload is set if (d->bottomEdge && d->bottomEdge->preloadContent() && d->component) { d->loadContent(UCBottomEdgeRegionPrivate::LoadingComponent); } } /*! * \qmlsignal void BottomEdgeRegion::entered() * Signal triggered when the drag enters into the area defined by the bottom edge * section. */ /*! * \qmlsignal void BottomEdgeRegion::exited() * Signal triggered when the drag leaves the area defined by the bottom edge section. */ /*! * \qmlsignal void BottomEdgeRegion::dragEnded() * Signal triggered when the drag ends within the active bottom edge section area. */ // default region DefaultRegionPrivate::DefaultRegionPrivate() { } void DefaultRegionPrivate::loadRegionContent() { if (contentItem) { LOG << "region content loaded, return"; return; } UCBottomEdgeRegionPrivate::loadRegionContent(); } void DefaultRegionPrivate::discardRegionContent() { // do nothing, do not cleanup the content! LOG << "suppress region discarding!"; } DefaultRegion::DefaultRegion(UCBottomEdge *parent) : UCBottomEdgeRegion(*(new DefaultRegionPrivate), parent) { UCBottomEdgeRegionPrivate *d = UCBottomEdgeRegionPrivate::get(this); d->from = 0.0; d->to = 1.0; setObjectName("default_BottomEdgeRegion"); } bool DefaultRegion::canCommit(qreal dragRatio) { return (dragRatio >= 0.33); } #include "moc_ucbottomedgeregion.cpp" ./src/Ubuntu/Components/plugin/ucproportionalshape.h0000644000015600001650000000217112700370701023041 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Loïc Molinari */ #ifndef UCPROPORTIONALSHAPE_H #define UCPROPORTIONALSHAPE_H #include "ucubuntushape.h" class UCProportionalShape : public UCUbuntuShape { Q_OBJECT public: UCProportionalShape(QQuickItem* parent=0); private Q_SLOTS: void _q_updateWidth(); void _q_updateHeight(); private: void componentComplete(); Q_DISABLE_COPY(UCProportionalShape) }; QML_DECLARE_TYPE(UCProportionalShape) #endif // UCPROPORTIONALSHAPE_H ./src/Ubuntu/Components/plugin/ucimportversionchecker_p.cpp0000644000015600001650000000413412700370701024410 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "ucimportversionchecker_p.h" #include "ucnamespace.h" #include #include #include #include #include /*! * \internal * * The function returns the version the module is imported with based on a QML * component instance. It only checks till reaches 1.2 version. Implementations * must implement the propertyForVersion method and must probvide a property for * each version requested. */ quint16 UCImportVersionChecker::importVersion(QObject *object) { QQmlData *data = QQmlData::get(object); Q_ASSERT(data); QQmlContextData *cdata = QQmlContextData::get(qmlContext(object)); Q_ASSERT(cdata); QQmlEngine *engine = qmlEngine(object); Q_ASSERT(engine); // start from the highest available version till we reach 1.2 for (quint16 minor = MINOR_VERSION(LATEST_UITK_VERSION); minor > 2; minor--) { quint16 version = BUILD_VERSION(1, minor); const QString property(propertyForVersion(version)); Q_ASSERT(!property.isEmpty()); QQmlPropertyData l; QQmlPropertyData *p = QQmlPropertyCache::property(engine, object, property, cdata, l); if (data->propertyCache->isAllowedInRevision(p)) { return version; } } // if none found, simply fall back to 1.2 return BUILD_VERSION(1, 2); } ./src/Ubuntu/Components/plugin/listener.h0000644000015600001650000000206512700370701020567 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UBUNTU_COMPONENTS_LISTENER_H #define UBUNTU_COMPONENTS_LISTENER_H #include class QQmlContext; class ContextPropertyChangeListener : public QObject { Q_OBJECT public: explicit ContextPropertyChangeListener(QQmlContext* context, const QString& contextProperty); Q_SLOT void updateContextProperty(); QQmlContext* m_context; QString m_contextProperty; }; #endif // UBUNTU_COMPONENTS_PLUGIN_H ./src/Ubuntu/Components/plugin/sortbehavior.h0000644000015600001650000000255212700370701021452 0ustar jenkinsjenkins/* * Copyright (C) 2014 Canonical, Ltd. * * Authors: * Christian Dywan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef SORTBEHAVIOR_H #define SORTBEHAVIOR_H #include class SortBehavior : public QObject { Q_OBJECT Q_PROPERTY(QString property READ property WRITE setProperty NOTIFY propertyChanged) Q_PROPERTY(Qt::SortOrder order READ order WRITE setOrder NOTIFY orderChanged) public: explicit SortBehavior(QObject *parent = 0); QString property() const; void setProperty(const QString& property); Qt::SortOrder order() const; void setOrder(Qt::SortOrder order); Q_SIGNALS: void propertyChanged(); void orderChanged(); private: QString m_property; Qt::SortOrder m_order; }; #endif // SORTBEHAVIOR_H ./src/Ubuntu/Components/plugin/livetimer_p.cpp0000644000015600001650000001300312700370701021606 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "livetimer_p.h" #include "timeutils_p.h" #include SharedLiveTimer::SharedLiveTimer(QObject* parent) : QObject(parent) , m_frequency(LiveTimer::Disabled) { m_timer.setSingleShot(true); connect(&m_timer, &QTimer::timeout, this, &SharedLiveTimer::timeout); QDBusConnection::systemBus().connect("org.freedesktop.timedate1", "/org/freedesktop/timedate1", "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(timedate1PropertiesChanged(QString, QVariantMap, QStringList))); } void SharedLiveTimer::registerTimer(LiveTimer *timer) { if (m_liveTimers.contains(timer)) { unregisterTimer(timer); } m_liveTimers.append(timer); updateFrequency(); } void SharedLiveTimer::unregisterTimer(LiveTimer *timer) { if (!m_liveTimers.contains(timer)) return; m_liveTimers.removeAll(timer); updateFrequency(); } void SharedLiveTimer::updateFrequency() { LiveTimer::Frequency newFreq = LiveTimer::Disabled; if (m_liveTimers.count() == 0) { newFreq = LiveTimer::Disabled; } else { Q_FOREACH(LiveTimer* timer, m_liveTimers) { LiveTimer::Frequency freq = timer->frequency(); if (freq == LiveTimer::Relative) { date_proximity_t proximity = getDateProximity(QDateTime::currentDateTime(), timer->relativeTime()); freq = frequencyForProximity(proximity); } timer->setEffectiveFrequency(freq); if (freq != LiveTimer::Disabled && (newFreq == LiveTimer::Disabled || freq < newFreq)) { newFreq = freq; } } } if (newFreq != m_frequency) { m_frequency = newFreq; reInitTimer(); } } void SharedLiveTimer::reInitTimer() { QDateTime now(QDateTime::currentDateTime()); m_nextUpdate = now; switch(m_frequency) { case LiveTimer::Second: m_nextUpdate.setTime(QTime(now.time().hour(), now.time().minute(), now.time().second(), 0)); m_nextUpdate = m_nextUpdate.addSecs(1); break; case LiveTimer::Minute: m_nextUpdate.setTime(QTime(now.time().hour(), now.time().minute(), 0, 0)); m_nextUpdate = m_nextUpdate.addSecs(60); break; case LiveTimer::Hour: m_nextUpdate.setTime(QTime(now.time().hour(), 0, 0, 0)); m_nextUpdate = m_nextUpdate.addSecs(60*60); break; default: m_timer.stop(); return; } qint64 diff = m_nextUpdate.toMSecsSinceEpoch() - now.toMSecsSinceEpoch(); m_timer.start(diff); } void SharedLiveTimer::timeout() { QDateTime now(QDateTime::currentDateTime()); qint64 currentMSecsSinceEpoch = now.currentMSecsSinceEpoch(); qint64 earlyMs = m_nextUpdate.toMSecsSinceEpoch() - currentMSecsSinceEpoch; if (earlyMs > 0) { // timer shouldn't have happened yet. reInitTimer(); return; } bool isHourUpdate = m_lastUpdate.date() != now.date() || m_lastUpdate.time().hour() != now.time().hour(); bool isMinuteUpdate = isHourUpdate || m_lastUpdate.time().minute() != now.time().minute(); bool isSecondUpdate = isMinuteUpdate || m_lastUpdate.time().second() != now.time().second(); bool needsFrequencyUpdate = false; QList tmpTimers(m_liveTimers); Q_FOREACH(LiveTimer* timer, tmpTimers) { LiveTimer::Frequency effectiveFrequency = timer->effectiveFrequency(); if (effectiveFrequency == LiveTimer::Disabled) continue; if (isHourUpdate) { Q_EMIT timer->trigger(); } else if (isMinuteUpdate) { if (effectiveFrequency >= LiveTimer::Second && effectiveFrequency <= LiveTimer::Minute) { Q_EMIT timer->trigger(); } } else if (isSecondUpdate) { if (effectiveFrequency == LiveTimer::Second) { Q_EMIT timer->trigger(); } } // re-evaluate relative timer frequency if (timer->frequency() == LiveTimer::Relative) { date_proximity_t newProximity = getDateProximity(now, timer->relativeTime()); needsFrequencyUpdate |= effectiveFrequency != frequencyForProximity(newProximity); } } if (needsFrequencyUpdate) { updateFrequency(); } reInitTimer(); m_lastUpdate = now; } void SharedLiveTimer::timedate1PropertiesChanged(const QString &interface, const QVariantMap &changed, const QStringList &) { if (interface != "org.freedesktop.timedate1") return; if (!changed.contains("Timezone")) return; QList tmpTimers(m_liveTimers); Q_FOREACH(LiveTimer* timer, tmpTimers) { Q_EMIT timer->trigger(); } reInitTimer(); } ./src/Ubuntu/Components/plugin/ucargument.h0000644000015600001650000000416612700370701021120 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #ifndef UCARGUMENT_H #define UCARGUMENT_H #include #include #include class UCArgument : public QObject { Q_OBJECT Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) Q_PROPERTY(QString help READ help WRITE setHelp NOTIFY helpChanged) Q_PROPERTY(bool required READ required WRITE setRequired NOTIFY requiredChanged) Q_PROPERTY(QStringList valueNames READ valueNames WRITE setValueNames NOTIFY valueNamesChanged) public: explicit UCArgument(QObject *parent = 0); QString name() const; void setName(const QString &name); QString help() const; void setHelp(const QString &help); bool required() const; void setRequired(bool required); QStringList valueNames() const; void setValueNames(const QStringList &valueNames); // FIXME: maybe define UCArgument as a QQmlListProperty instead so that // operator[] is available from QML Q_INVOKABLE QVariant at(int i) const; protected: QString syntax() const; QString usage() const; QStringList values() const; void setValues(const QStringList &values); Q_SIGNALS: void nameChanged(); void helpChanged(); void requiredChanged(); void valueNamesChanged(); private: QString m_name; QString m_help; bool m_required; QStringList m_valueNames; QStringList m_values; friend class UCArguments; }; #endif // UCARGUMENT_H ./src/Ubuntu/Components/plugin/ucbottomedgeregion_p.h0000644000015600001650000000424512700370714023154 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCBOTTOMEDGEREGION_P #define UCBOTTOMEDGEREGION_P #include "ucbottomedgeregion.h" #include #include using namespace UbuntuToolkit; class UCBottomEdgeRegionPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(UCBottomEdgeRegion) public: enum LoadingType { LoadingUrl, LoadingComponent }; UCBottomEdgeRegionPrivate(); void init(); static UCBottomEdgeRegionPrivate *get(UCBottomEdgeRegion *that) { return that->d_func(); } void attachToBottomEdge(UCBottomEdge *bottomEdge); virtual void loadRegionContent(); virtual void discardRegionContent(); void loadContent(LoadingType type); void onLoaderStatusChanged(AsyncLoader::LoadingStatus,QObject*); UbuntuToolkit::AsyncLoader loader; QUrl url; QPointer bottomEdge; QQmlComponent *component; QQuickItem *contentItem; qreal from; qreal to; bool enabled:1; bool active:1; }; class DefaultRegionPrivate; class DefaultRegion : public UCBottomEdgeRegion { Q_OBJECT public: DefaultRegion(UCBottomEdge *parent); bool canCommit(qreal dragRatio) Q_DECL_OVERRIDE; private: Q_DECLARE_PRIVATE(DefaultRegion) }; class DefaultRegionPrivate : public UCBottomEdgeRegionPrivate { Q_DECLARE_PUBLIC(DefaultRegion) public: DefaultRegionPrivate(); void loadRegionContent() Q_DECL_OVERRIDE; void discardRegionContent() Q_DECL_OVERRIDE; }; #endif // UCBOTTOMEDGEREGION_P ./src/Ubuntu/Components/plugin/ucheader.cpp0000644000015600001650000002704612700370701021063 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "ucheader.h" #include #include #include #include #include "ucubuntuanimation.h" #include "ucunits.h" #include "propertychange_p.h" /*! \qmltype Header \instantiates UCHeader \inherits StyledItem \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu \since Ubuntu.Components 1.3 \brief Header bar that can contain the title and controls for the current view. The Header can be exposed and hidden by setting the \l exposed property, and when a \l flickable is set, the header will scroll together with the flickable and expose or hide when the Flickable movement ends. \qml import QtQuick 2.4 import Ubuntu.Components 1.3 Item { width: units.gu(50) height: units.gu(70) header: Header { width: parent.width height: units.gu(6) flickable: scrollableContent Rectangle { // to visualize the header anchors.fill: parent color: UbuntuColors.blue } } Flickable { id: scrollableContent anchors.fill: parent contentHeight: height * 2 Label { text: "Flick me" } } } \endqml The initial y-value is 0, but scrolling the flickable or setting \l exposed to false will change the y-value in the range from -height to 0. */ UCUbuntuAnimation *UCHeader::s_ubuntuAnimation = new UCUbuntuAnimation(); UCHeader::UCHeader(QQuickItem *parent) : UCStyledItemBase(parent) , m_flickable(Q_NULLPTR) , m_showHideAnimation(new QQuickNumberAnimation) , m_flickableTopMarginBackup(Q_NULLPTR) , m_previous_contentY(0) , m_exposed(true) , m_moving(false) { m_showHideAnimation->setParent(this); m_showHideAnimation->setTargetObject(this); m_showHideAnimation->setProperty("y"); m_showHideAnimation->setEasing(s_ubuntuAnimation->StandardEasing()); m_showHideAnimation->setDuration(s_ubuntuAnimation->BriskDuration()); connect(m_showHideAnimation, SIGNAL(runningChanged(bool)), this, SLOT(_q_showHideAnimationRunningChanged())); connect(this, SIGNAL(heightChanged()), this, SLOT(_q_heightChanged())); } UCHeader::~UCHeader() { if (m_flickable != Q_NULLPTR) { Q_ASSERT(m_flickableTopMarginBackup != Q_NULLPTR); delete m_flickableTopMarginBackup; } } void UCHeader::_q_heightChanged() { updateFlickableMargins(); if (m_exposed || (!m_flickable.isNull() && m_flickable->contentY() <= 0.0)) { // Header was exposed before, or the flickable is scrolled up close to // the top so that the header should be visible. // After Header completed, the theming engine updates its implicitHeight // to that of the style and we do not want to animate then. Other height // changes also do not need animations. show(false); } else { hide(false); } } /*! * \qmlproperty Flickable Header::flickable * * When flickable is set, scrolling vertically in the flickable, or setting the * Flickable's y-value will move the header y-position by the same amount as the * flickable content movement. When scrolling the flickable, upon release, the header * will animate to fully exposed or fully hidden state, depending on whether it was * more or less than half exposed when the user stopped moving the flickable. * * When flickable is null, the header can be exposed or * hidden by setting the \l exposed property. * * The topMargin of the flickable will automatically be updated to always match * the height of the header. When changing the flickable, the topMargin of the previous * flickable is set to 0. * * It is permitted to use a ListView as the value of flickable, but this works * well only if the ListView.header property is not set. Alternatively, * a Header component may be used for ListView.header, but in that case the flickable * of the Header must be null. */ QQuickFlickable* UCHeader::flickable() { return m_flickable.data(); } void UCHeader::setFlickable(QQuickFlickable *flickable) { if (m_flickable == flickable) { return; } if (!m_flickable.isNull()) { Q_ASSERT(m_flickableTopMarginBackup != Q_NULLPTR); // Finish the current header movement in case the current // flickable is disconnected while scrolling. if (m_exposed) { show(false); } else { hide(false); } m_flickable->disconnect(this); qreal oldMargin = m_flickable->topMargin(); // store contentY to compensate for Flickable updating the position due to margin change. qreal oldContentY = m_flickable->contentY(); delete m_flickableTopMarginBackup; // Restores previous value/binding for topMargin. m_flickableTopMarginBackup = Q_NULLPTR; qreal delta = m_flickable->topMargin() - oldMargin + m_flickable->contentY() - oldContentY; // revert the flickable content Y. m_flickable->setContentY(m_flickable->contentY() - delta); } m_flickable = flickable; Q_EMIT flickableChanged(); Q_ASSERT(m_flickableTopMarginBackup == Q_NULLPTR); if (!m_flickable.isNull()) { m_flickableTopMarginBackup = new PropertyChange(m_flickable, "topMargin"); updateFlickableMargins(); connect(m_flickable, SIGNAL(contentYChanged()), this, SLOT(_q_scrolledContents())); connect(m_flickable, SIGNAL(movementEnded()), this, SLOT(_q_flickableMovementEnded())); connect(m_flickable, SIGNAL(contentHeightChanged()), this, SLOT(_q_contentHeightChanged())); connect(m_flickable, SIGNAL(interactiveChanged()), this, SLOT(_q_flickableInteractiveChanged())); m_previous_contentY = m_flickable->contentY(); _q_flickableMovementEnded(); // show or hide depending on y } } void UCHeader::updateFlickableMargins() { if (m_flickable.isNull()) { return; } qreal headerHeight = height(); qreal previousHeaderHeight = m_flickable->topMargin(); if (headerHeight != previousHeaderHeight) { qreal previousContentY = m_flickable->contentY(); PropertyChange::setValue(m_flickableTopMarginBackup, headerHeight); // Push down contents when header grows, // pull up contents when header shrinks. m_flickable->setContentY(previousContentY - headerHeight + previousHeaderHeight); } } void UCHeader::show(bool animate) { if (m_exposed && !m_moving && y() == 0.0) return; if (!m_exposed) { m_exposed = true; Q_EMIT exposedChanged(); if (m_showHideAnimation->isRunning()) { // The header was in the process of hiding. m_showHideAnimation->stop(); } } if (animate && isComponentComplete()) { m_showHideAnimation->setFrom(y()); m_showHideAnimation->setTo(0.0); m_showHideAnimation->start(); } else { // If a previous animation was showing the header, stop it. m_showHideAnimation->stop(); this->setY(0.0); if (m_moving) { m_moving = false; Q_EMIT movingChanged(); } } } void UCHeader::hide(bool animate) { if (!m_exposed && !m_moving && y() == -1.0*height()) return; if (m_exposed) { m_exposed = false; Q_EMIT exposedChanged(); if (m_showHideAnimation->isRunning()) { // The header was in the process of showing. m_showHideAnimation->stop(); } } if (animate && isComponentComplete()) { m_showHideAnimation->setFrom(y()); m_showHideAnimation->setTo(-1.0*height()); m_showHideAnimation->start(); } else { // If a previous animation was hiding the header, stop it. m_showHideAnimation->stop(); this->setY(-1.0*height()); if (m_moving) { m_moving = false; Q_EMIT movingChanged(); } } } void UCHeader::_q_showHideAnimationRunningChanged() { if (!m_showHideAnimation->isRunning()) { // Animation finished. Q_ASSERT(m_moving); m_moving = false; Q_EMIT movingChanged(); } else if (!m_moving) { // Animation started. m_moving = true; Q_EMIT movingChanged(); } // else: Transition from flickable movement to showHideAnimation running. } /*! * \qmlproperty bool Header::exposed * Exposes and hides the header by animating its y-value between -height and 0 * to move it in or out of its parent Item. The value of exposed can be set directly, * or it will be automatically updated when the user exposes or hides the Header * by scrolling the Header's \l flickable. */ void UCHeader::setExposed(bool exposed) { if (exposed) { show(true); } else { hide(true); } } /*! * \qmlproperty bool Header::moving * \readonly * Indicates whether the header is currently moving, either because contentY of * the \l flickable changes (due to user interaction or by setting it directly), * or because the header is animating in or out because the value of \l exposed * was updated. */ bool UCHeader::moving() { return m_moving; } // Called when moving due to user interaction with the flickable, or by // setting m_flickable.contentY programatically. void UCHeader::_q_scrolledContents() { Q_ASSERT(!m_flickable.isNull()); // Avoid moving the header when rebounding or being dragged over the bounds. if (!m_flickable->isAtYBeginning() && !m_flickable->isAtYEnd()) { qreal dy = m_flickable->contentY() - m_previous_contentY; // Restrict the header y between -height and 0. qreal clampedY = qMin(qMax(-height(), y() - dy), 0.0); setY(clampedY); } m_previous_contentY = m_flickable->contentY(); if (!m_moving) { bool move = m_exposed ? y() != 0.0 : y() != -height(); if (move) { m_moving = true; Q_EMIT movingChanged(); } } if (!m_flickable->isMoving()) { // m_flickable.contentY was set directly, so no user flicking. _q_flickableMovementEnded(); } } void UCHeader::_q_flickableMovementEnded() { Q_ASSERT(!m_flickable.isNull()); if ((m_flickable->contentY() < 0) || (y() > -height()/2.0)) { show(true); } else { hide(true); } } void UCHeader::_q_contentHeightChanged() { Q_ASSERT(!m_flickable.isNull()); if (m_flickable->height() >= m_flickable->contentHeight()) { // The user cannot scroll down to expose the header, so ensure // that it is visible. show(true); } } void UCHeader::_q_flickableInteractiveChanged() { Q_ASSERT(!m_flickable.isNull()); if (!m_flickable->isInteractive()) { // The user cannot scroll down to expose the header, so ensure // that it is visible. show(true); } } ./src/Ubuntu/Components/plugin/ucmargins.h0000644000015600001650000000372012700370701020731 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCMARGINS_H #define UCMARGINS_H #include #include class UCMargins : public QObject { Q_OBJECT Q_PROPERTY(qreal left MEMBER m_left NOTIFY leftChanged FINAL) Q_PROPERTY(qreal top MEMBER m_top NOTIFY topChanged FINAL) Q_PROPERTY(qreal right MEMBER m_right NOTIFY rightChanged FINAL) Q_PROPERTY(qreal bottom MEMBER m_bottom NOTIFY bottomChanged FINAL) Q_PROPERTY(qreal all MEMBER m_all NOTIFY allChanged FINAL) public: UCMargins(QObject *parent = 0); qreal left() const; qreal top() const; qreal right() const; qreal bottom() const; Q_SIGNALS: void leftChanged(); void topChanged(); void rightChanged(); void bottomChanged(); void allChanged(); private: qreal m_left = 0.0; qreal m_top = 0.0; qreal m_right = 0.0; qreal m_bottom = 0.0; qreal m_all = 0.0; }; inline UCMargins::UCMargins(QObject *parent) : QObject(parent) {} inline qreal UCMargins::left() const { return qFuzzyIsNull(m_left) ? m_all : m_left; } inline qreal UCMargins::top() const { return qFuzzyIsNull(m_top) ? m_all : m_top; } inline qreal UCMargins::right() const { return qFuzzyIsNull(m_right) ? m_all : m_right; } inline qreal UCMargins::bottom() const { return qFuzzyIsNull(m_bottom) ? m_all : m_bottom; } #endif // UCMARGINS_H ./src/Ubuntu/Components/plugin/ucbottomedgehint.h0000644000015600001650000000545312700370701022312 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: Zsombor Egri */ #ifndef UCBOTTOMEDGEHINT_H #define UCBOTTOMEDGEHINT_H #include "ucactionitem.h" class QQuickFlickable; class UCSwipeArea; class PropertyChange; class UCBottomEdgeHintPrivate; class UCBottomEdgeHint : public UCActionItem { Q_OBJECT Q_ENUMS(Status) Q_PROPERTY(QQuickFlickable *flickable READ flickable WRITE setFlickable NOTIFY flickableChanged FINAL) Q_PROPERTY(Status status READ status WRITE setStatus NOTIFY statusChanged FINAL) Q_PROPERTY(int deactivateTimeout READ deactivateTimeout WRITE setDeactivateTimeout NOTIFY deactivateTimeoutChanged FINAL) Q_PROPERTY(UCSwipeArea* swipeArea READ swipeArea CONSTANT FINAL) // deprecated Q_PROPERTY(QString state READ state WRITE setState NOTIFY stateChanged) public: enum Status { Hidden, Inactive, Active, Locked }; explicit UCBottomEdgeHint(QQuickItem *parent = 0); QQuickFlickable *flickable() const; void setFlickable(QQuickFlickable *flickable); Status status(); void setStatus(Status status); int deactivateTimeout() const; void setDeactivateTimeout(int timeout); UCSwipeArea *swipeArea() const; // deprecated QString state() const; void setState(const QString &state); Q_SIGNALS: void textChanged(); void iconSourceChanged(); void iconNameChanged(); void flickableChanged(); void statusChanged(); void deactivateTimeoutChanged(); void clicked(); // deprecated void stateChanged(); protected: UCBottomEdgeHint(UCBottomEdgeHintPrivate &&, QQuickItem *parent); void classBegin(); void itemChange(ItemChange change, const ItemChangeData &data); void timerEvent(QTimerEvent *event); void keyPressEvent(QKeyEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void handleFlickableActivation(); void onDraggingChanged(bool dragging); void init(); void onMouseAttached(); void onGridUnitChanged(); private: Q_DECLARE_PRIVATE(UCBottomEdgeHint) friend class UCBottomEdge; void adjustFlickableBottomMargin(); }; #endif // UCBOTTOMEDGEHINT_H ./src/Ubuntu/Components/plugin/ucfontutils.h0000644000015600001650000000411212700370701021314 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #ifndef UCFONTUTILS_H #define UCFONTUTILS_H #include class UCUnits; class UCFontUtils : public QObject { Q_OBJECT public: static constexpr float fontUnits = 14.0f; static constexpr float xxSmallScale = 0.606f; static constexpr float xSmallScale = 0.707f; static constexpr float smallScale = 0.857f; static constexpr float mediumScale = 1.0f; static constexpr float largeScale = 1.414f; static constexpr float xLargeScale = 1.905f; static UCFontUtils *instance(QObject *parent = Q_NULLPTR) { if (!m_instance) { if (!parent) { qFatal("Creating FontUtils singleton requires a parent object!"); } m_instance = new UCFontUtils(parent); } return m_instance; } explicit UCFontUtils(QObject *parent = 0) : QObject(parent) {} ~UCFontUtils() { m_instance = Q_NULLPTR; } Q_INVOKABLE qreal sizeToPixels(const QString &size); Q_INVOKABLE qreal modularScale(const QString &size); private: static UCFontUtils *m_instance; }; #define SCALE_CODE(size) reinterpret_cast(size.toLatin1().data())[0] #define SCALE_MEDIUM 0x6964656d // "medi" #define SCALE_LARGE 0x6772616c // "larg" #define SCALE_SMALL 0x6c616d73 // "smal" #define SCALE_XLARGE 0x616c2d78 // "x-la" #define SCALE_XSMALL 0x6d732d78 // "x-sm" #define SCALE_XXSMALL 0x732d7878 // "xx-s" #endif // UCFONTUTILS_H ./src/Ubuntu/Components/plugin/ucheader.h0000644000015600001650000000423212700370701020520 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCHEADER_H #define UCHEADER_H #include "ucstyleditembase.h" #include class QQuickFlickable; class QQuickNumberAnimation; class UCUbuntuAnimation; class PropertyChange; class UCHeader : public UCStyledItemBase { Q_OBJECT Q_PROPERTY(QQuickFlickable* flickable READ flickable WRITE setFlickable NOTIFY flickableChanged FINAL) Q_PROPERTY(bool exposed MEMBER m_exposed WRITE setExposed NOTIFY exposedChanged FINAL) Q_PROPERTY(bool moving READ moving NOTIFY movingChanged FINAL) public: explicit UCHeader(QQuickItem *parent = 0); ~UCHeader(); QQuickFlickable* flickable(); void setFlickable(QQuickFlickable* flickable); void setExposed(bool exposed); bool moving(); Q_SIGNALS: void flickableChanged(); void exposedChanged(); void movingChanged(); protected: virtual void show(bool animate); virtual void hide(bool animate); private Q_SLOTS: void _q_scrolledContents(); void _q_showHideAnimationRunningChanged(); void _q_flickableMovementEnded(); void _q_contentHeightChanged(); void _q_flickableInteractiveChanged(); void _q_heightChanged(); private: QPointer m_flickable; QQuickNumberAnimation* m_showHideAnimation; PropertyChange* m_flickableTopMarginBackup; qreal m_previous_contentY; bool m_exposed:1; bool m_moving:1; // used to set the easing and duration of m_showHideAnimation static UCUbuntuAnimation *s_ubuntuAnimation; void updateFlickableMargins(); }; #endif // UCHEADER_H ./src/Ubuntu/Components/plugin/ucproportionalshape.cpp0000644000015600001650000000423712700370701023401 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Loïc Molinari */ #include "ucproportionalshape.h" const qreal aspectRatio = 16.0 / 15.0; const qreal invAspectRatio = 1.0 / aspectRatio; /*! \qmltype ProportionalShape \instantiates UCProportionalShape \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu \brief Extended UbuntuShape mostly used for icons and vignettes. The ProportionalShape is an extended \l UbuntuShape with a fixed aspect ratio (16:15), a relative radius and a PreserveAspectCrop source fill mode. Changing the width implies an update of height and radius, and changing the height implies an update of width and radius. The goal being to keep the same proportion between width, height and radius whatever the size. */ UCProportionalShape::UCProportionalShape(QQuickItem* parent) : UCUbuntuShape(parent) { setRelativeRadius(0.67); setSourceFillMode(UCUbuntuShape::PreserveAspectCrop); connect(this, SIGNAL(widthChanged()), this, SLOT(_q_updateHeight())); connect(this, SIGNAL(heightChanged()), this, SLOT(_q_updateWidth())); } void UCProportionalShape::_q_updateWidth() { const qreal newWidth = height() * aspectRatio; if (qAbs(newWidth - width()) > 0.5) { setWidth(newWidth); } } void UCProportionalShape::_q_updateHeight() { const qreal newHeight = width() * invAspectRatio; if (qAbs(newHeight - height()) > 0.5) { setHeight(newHeight); } } void UCProportionalShape::componentComplete() { QQuickItem::componentComplete(); _q_updateHeight(); } ./src/Ubuntu/Components/plugin/ucmathutils.h0000644000015600001650000000234712700370701021307 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #ifndef UCMATHUTILS_H #define UCMATHUTILS_H #include QT_FORWARD_DECLARE_CLASS(QQmlEngine) QT_FORWARD_DECLARE_CLASS(QJSEngine) class UCMathUtils : public QObject { Q_OBJECT public: explicit UCMathUtils(QObject *parent = 0); Q_INVOKABLE double clamp(double x, double min, double max); Q_INVOKABLE double lerp(double delta, double from, double to); Q_INVOKABLE double projectValue(double x, double xmin, double xmax, double ymin, double ymax); Q_INVOKABLE double clampAndProject(double x, double xmin, double xmax, double ymin, double ymax); }; #endif // UCMATHUTILS_H ./src/Ubuntu/Components/plugin/plugin.cpp0000644000015600001650000003314112700370701020572 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include #include #include #include "plugin.h" #include "uctheme.h" #include "ucdeprecatedtheme.h" #include "ucthemingextension.h" #include #include "i18n.h" #include "listener.h" #include "livetimer.h" #include "ucunits.h" #include "ucscalingimageprovider.h" #include "ucqquickimageextension.h" #include "quickutils.h" #include "ucubuntushape.h" #include "ucubuntushapeoverlay.h" #include "ucproportionalshape.h" #include "inversemouseareatype.h" #include "qquickclipboard.h" #include "qquickmimedata.h" #include "ucubuntuanimation.h" #include "ucfontutils.h" #include "ucarguments.h" #include "ucargument.h" #include "ucapplication.h" #include "ucalarm.h" #include "ucalarmmodel.h" #include "unitythemeiconprovider.h" #include "ucstatesaver.h" #include "ucurihandler.h" #include "ucmouse.h" #include "ucinversemouse.h" #include "sortfiltermodel.h" #include "ucstyleditembase.h" #include "ucstylehints.h" #include "ucaction.h" #include "ucactioncontext.h" #include "ucactionmanager.h" #include "uclistitem.h" #include "uclistitem_p.h" #include "uclistitemactions.h" #include "uclistitemstyle.h" #include "ucserviceproperties.h" #include "ucnamespace.h" #include "ucslotslayout.h" #include "ucactionitem.h" #include "uchaptics.h" #include "ucabstractbutton.h" #include "ucheader.h" #include "uclabel.h" #include "uclistitemlayout.h" #include "ucbottomedgehint.h" #include "ucmathutils.h" #include "ucbottomedge.h" #include "ucbottomedgeregion.h" #include "ucbottomedgestyle.h" #include "ucpagetreenode.h" #include "ucmainviewbase.h" #include "ucperformancemonitor.h" #include "privates/frame.h" #include "privates/ucpagewrapper.h" #include "privates/appheaderbase.h" // From UbuntuGestures #include "private/ucswipearea_p.h" //From UbuntuToolkit #include #include #include #include #include QUrl UbuntuComponentsPlugin::m_baseUrl = QUrl(); /* * Type registration functions. */ template static QObject *qmlRegisterSimpleSingletonTypeCallback(QQmlEngine *, QJSEngine *) { return (new T); } template static int qmlRegisterSimpleSingletonType(const char *uri, int major, int minor, const char *typeName) { return qmlRegisterSingletonType(uri, major, minor, typeName, qmlRegisterSimpleSingletonTypeCallback); } void UbuntuComponentsPlugin::initializeBaseUrl() { if (!m_baseUrl.isValid()) { m_baseUrl = QUrl(baseUrl().toString() + '/'); } } void UbuntuComponentsPlugin::registerWindowContextProperty() { setWindowContextProperty(QGuiApplication::focusWindow()); // listen to QGuiApplication::focusWindowChanged /* Ensure that setWindowContextProperty is called in the same thread (the main thread) otherwise it segfaults. Reference: https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1205556 */ QGuiApplication* application = static_cast(QCoreApplication::instance()); QObject::connect(application, SIGNAL(focusWindowChanged(QWindow*)), this, SLOT(setWindowContextProperty(QWindow*)), Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection)); } void UbuntuComponentsPlugin::setWindowContextProperty(QWindow* focusWindow) { QQuickView* view = qobject_cast(focusWindow); if (view != NULL) { view->rootContext()->setContextProperty("window", view); } } void UbuntuComponentsPlugin::registerTypesToVersion(const char *uri, int major, int minor) { qmlRegisterType(uri, major, minor, "Action"); qmlRegisterType(uri, major, minor, "ActionContext"); qmlRegisterUncreatableType(uri, major, minor, "UCApplication", "Not instantiable"); qmlRegisterType(uri, major, minor, "ActionManager"); qmlRegisterUncreatableType(uri, major, minor, "UCFontUtils", "Not instantiable"); qmlRegisterType(uri, major, minor, "StyledItem"); qmlRegisterUncreatableType(uri, major, minor, "i18n", "Singleton object"); qmlRegisterExtendedType(uri, major, minor, "QQuickImageBase"); qmlRegisterUncreatableType(uri, major, minor, "UCUnits", "Not instantiable"); qmlRegisterType(uri, major, minor, "UbuntuShape"); // FIXME/DEPRECATED: Shape is exported for backwards compatibility only qmlRegisterType(uri, major, minor, "Shape"); qmlRegisterType(uri, major, minor, "InverseMouseArea"); qmlRegisterType(uri, major, minor, "MimeData"); qmlRegisterSimpleSingletonType(uri, major, minor, "Clipboard"); qmlRegisterSimpleSingletonType(uri, major, minor, "UbuntuAnimation"); qmlRegisterType(uri, major, minor, "Arguments"); qmlRegisterType(uri, major, minor, "Argument"); qmlRegisterType(); qmlRegisterType(uri, major, minor, "Alarm"); qmlRegisterType(uri, major, minor, "AlarmModel"); qmlRegisterType(uri, major, minor, "StateSaver"); qmlRegisterType(); qmlRegisterSimpleSingletonType(uri, major, minor, "UriHandler"); qmlRegisterType(uri, major, minor, "Mouse"); qmlRegisterType(uri, major, minor, "InverseMouse"); qmlRegisterType(uri, major, minor, "ActionItem"); qmlRegisterSimpleSingletonType(uri, major, minor, "Haptics"); qmlRegisterSimpleSingletonType(uri, major, minor, "MathUtils"); qmlRegisterSimpleSingletonType(uri, major, minor, "ColorUtils"); } void UbuntuComponentsPlugin::registerTypes(const char *uri) { Q_ASSERT(uri == QLatin1String("Ubuntu.Components")); initializeBaseUrl(); // register 0.1 for backward compatibility registerTypesToVersion(uri, 0, 1); registerTypesToVersion(uri, 1, 0); // register custom event ForwardedEvent::registerForwardedEvent(); // register parent type so that properties can get/ set it qmlRegisterUncreatableType(uri, 1, 1, "QAbstractItemModel", "Not instantiable"); // register 1.1 only API qmlRegisterType(uri, 1, 1, "StyledItem"); qmlRegisterType(uri, 1, 1, "SortFilterModel"); qmlRegisterUncreatableType(uri, 1, 1, "FilterBehavior", "Not instantiable"); qmlRegisterUncreatableType(uri, 1, 1, "SortBehavior", "Not instantiable"); qmlRegisterType(uri, 1, 1, "ServiceProperties"); // register 1.2 only API qmlRegisterType(uri, 1, 2, "ListItem"); qmlRegisterType(); qmlRegisterUncreatableType(uri, 1, 2, "SwipeEvent", "This is an event object."); qmlRegisterUncreatableType(uri, 1, 2, "ListItemDrag", "This is an event object"); qmlRegisterType(uri, 1, 2, "ListItemActions"); qmlRegisterUncreatableType(uri, 1, 2, "ViewItems", "Not instantiable"); qmlRegisterSimpleSingletonType(uri, 1, 2, "Ubuntu"); qmlRegisterType(uri, 1, 2, "UbuntuShape"); qmlRegisterType(uri, 1, 2, "UbuntuShapeOverlay"); // register 1.3 API qmlRegisterType(uri, 1, 3, "ListItem"); qmlRegisterType(); qmlRegisterType(uri, 1, 3, "ThemeSettings"); qmlRegisterType(uri, 1, 3, "StyledItem"); qmlRegisterSimpleSingletonType(uri, 1, 3, "Ubuntu"); qmlRegisterType(uri, 1, 3, "StyledItem"); qmlRegisterCustomType(uri, 1, 3, "StyleHints", new UCStyleHintsParser); qmlRegisterType(uri, 1, 3, "Action"); qmlRegisterType(uri, 1, 3, "SlotsLayout"); qmlRegisterType(uri, 1, 3, "UbuntuShape"); qmlRegisterType(uri, 1, 3, "ProportionalShape"); qmlRegisterType(uri, 1, 3, "LiveTimer"); qmlRegisterType(uri, 1, 3, "AbstractButton"); qmlRegisterType(); qmlRegisterUncreatableType(uri, 1, 3, "SlotsAttached", "Not instantiable"); qmlRegisterUncreatableType(uri, 1, 3, "SlotsLayoutPadding", "Not instantiable"); qmlRegisterType(uri, 1, 3, "ListItemLayout"); qmlRegisterType(uri, 1, 3, "Header"); qmlRegisterType(uri, 1, 3, "Label"); qmlRegisterType(uri, 1, 3, "BottomEdgeHint"); qmlRegisterType(uri, 1, 3, "SwipeArea"); qmlRegisterType(uri, 1, 3, "BottomEdge"); qmlRegisterType(uri, 1, 3, "BottomEdgeRegion"); qmlRegisterType(uri, 1, 3, "PageTreeNode"); qmlRegisterType(uri, 1, 3, "PopupContext"); qmlRegisterType(uri, 1, 3, "MainViewBase"); } void UbuntuComponentsPlugin::initializeContextProperties(QQmlEngine *engine) { UCUnits::instance(engine); QuickUtils::instance(engine); UbuntuI18n::instance(engine); UCApplication::instance(engine); UCFontUtils::instance(engine); UCTheme::defaultTheme(engine); QQmlContext* context = engine->rootContext(); // register root object watcher that sets a global property with the root object // that can be accessed from any object context->setContextProperty("QuickUtils", QuickUtils::instance()); UCDeprecatedTheme::registerToContext(context); context->setContextProperty("i18n", UbuntuI18n::instance()); ContextPropertyChangeListener *i18nChangeListener = new ContextPropertyChangeListener(context, "i18n"); QObject::connect(UbuntuI18n::instance(), SIGNAL(domainChanged()), i18nChangeListener, SLOT(updateContextProperty())); QObject::connect(UbuntuI18n::instance(), SIGNAL(languageChanged()), i18nChangeListener, SLOT(updateContextProperty())); // We can't use 'Application' because it exists (undocumented) context->setContextProperty("UbuntuApplication", UCApplication::instance()); ContextPropertyChangeListener *applicationChangeListener = new ContextPropertyChangeListener(context, "UbuntuApplication"); QObject::connect(UCApplication::instance(), SIGNAL(applicationNameChanged()), applicationChangeListener, SLOT(updateContextProperty())); // Give the application object access to the engine UCApplication::instance()->setContext(context); context->setContextProperty("units", UCUnits::instance()); ContextPropertyChangeListener *unitsChangeListener = new ContextPropertyChangeListener(context, "units"); QObject::connect(UCUnits::instance(), SIGNAL(gridUnitChanged()), unitsChangeListener, SLOT(updateContextProperty())); // register FontUtils context->setContextProperty("FontUtils", UCFontUtils::instance()); ContextPropertyChangeListener *fontUtilsListener = new ContextPropertyChangeListener(context, "FontUtils"); QObject::connect(UCUnits::instance(), SIGNAL(gridUnitChanged()), fontUtilsListener, SLOT(updateContextProperty())); } void UbuntuComponentsPlugin::initializeEngine(QQmlEngine *engine, const char *uri) { // initialize baseURL initializeBaseUrl(); // register internal styles const char *styleUri = "Ubuntu.Components.Styles"; qmlRegisterType(styleUri, 1, 2, "ListItemStyle"); qmlRegisterType(styleUri, 1, 3, "ListItemStyle"); qmlRegisterType(styleUri, 1, 3, "BottomEdgeStyle"); // Register private types. const char *privateUri = "Ubuntu.Components.Private"; qmlRegisterType(privateUri, 1, 3, "Frame"); qmlRegisterType(privateUri, 1, 3, "PageWrapper"); qmlRegisterType(privateUri, 1, 3, "AppHeaderBase"); qmlRegisterType(privateUri, 1, 3, "Tree"); QQmlExtensionPlugin::initializeEngine(engine, uri); // allocate all context property objects prior we register them initializeContextProperties(engine); HapticsProxy::instance(engine); engine->addImageProvider(QLatin1String("scaling"), new UCScalingImageProvider); // register icon provider engine->addImageProvider(QLatin1String("theme"), new UnityThemeIconProvider); // Necessary for Screen.orientation (from import QtQuick.Window 2.0) to work QGuiApplication::primaryScreen()->setOrientationUpdateMask( Qt::PortraitOrientation | Qt::LandscapeOrientation | Qt::InvertedPortraitOrientation | Qt::InvertedLandscapeOrientation); registerWindowContextProperty(); // register performance monitor engine->rootContext()->setContextProperty("performanceMonitor", new UCPerformanceMonitor(engine)); } ./src/Ubuntu/Components/plugin/ucactioncontext.h0000644000015600001650000000554512700370701022162 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCACTIONCONTEXT_H #define UCACTIONCONTEXT_H #include #include #include #include #include class UCAction; class UCActionContextAttached; class UCActionContext : public QObject, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(QQmlListProperty actions READ actions) Q_PROPERTY(bool active READ active WRITE setActive NOTIFY activeChanged) Q_CLASSINFO("DefaultProperty", "actions") public: explicit UCActionContext(QObject *parent = 0); ~UCActionContext(); static UCActionContextAttached *qmlAttachedProperties(QObject *owner); void classBegin(); void componentComplete(); void markActionsPublished(bool mark); bool isPopup() const { return m_popup; } QQmlListProperty actions(); bool active(); void setActive(bool active); void setEffectiveActive(bool active); Q_SIGNALS: void activeChanged(); public Q_SLOTS: void addAction(UCAction *action); void removeAction(UCAction *action); protected: QSet m_actions; bool m_active:1; bool m_effectiveActive:1; // declare popup flag within ActionContext to avoid unnecessary object-casting // to detect whether a context is a popup or normal context. bool m_popup:1; friend class UCActionManager; static void append(QQmlListProperty *list, UCAction *action); static void clear(QQmlListProperty *list); static int count(QQmlListProperty *list); }; class UCPopupContext : public UCActionContext { Q_OBJECT public: explicit UCPopupContext(QObject *parent = 0); }; class QQuickItem; class UCActionContextAttached : public QObject { Q_OBJECT public: explicit UCActionContextAttached(QObject *owner); inline QQuickItem *owner() const { return m_owner; } inline UCActionContext *context() const { return m_context; } private: QQuickItem *m_owner; UCActionContext *m_context; friend class UCActionContext; }; QML_DECLARE_TYPE(UCActionContext) QML_DECLARE_TYPEINFO(UCActionContext, QML_HAS_ATTACHED_PROPERTIES) #endif // UCACTIONCONTEXT_H ./src/Ubuntu/Components/plugin/ucdefaulttheme.h0000644000015600001650000000264412700370701021744 0ustar jenkinsjenkins/* * Copyright 2013-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: Zsombor Egri * Florian Boucault */ #ifndef UCDEFAULTTHEME_H #define UCDEFAULTTHEME_H #include #include #include class UCDefaultTheme : public QObject { Q_OBJECT Q_PROPERTY(QString themeName READ themeName WRITE setThemeName NOTIFY themeNameChanged) public: explicit UCDefaultTheme(QObject *parent = 0); // getter/setters QString themeName() const; void setThemeName(const QString &themeName); Q_SIGNALS: void themeNameChanged(); private Q_SLOTS: void reloadSettings(); private: QFileSystemWatcher m_settingsFileWatcher; QSettings m_settings; QString m_themeName; }; #endif // UCDEFAULTTHEME_H ./src/Ubuntu/Components/plugin/uclistitemlayout.cpp0000644000015600001650000003035012700370701022713 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Andrea Bernabei */ #include "private/qqmldata_p.h" #include #include "privates/threelabelsslot_p.h" #include "uclistitemlayout.h" #include "uclabel.h" /*! \qmltype ListItemLayout \instantiates UCListItemLayout \inqmlmodule Ubuntu.Components 1.3 \since Ubuntu.Components 1.3 \inherits SlotsLayout \ingroup ubuntu \brief ListItemLayout provides an easy way to create list items which follow Ubuntu design standards, thus making them visually appealing and consistent with the rest of the platform without effort. ListItemLayout is essentially a \l {SlotsLayout} with a predefined \l {SlotsLayout::mainSlot} that provides (up to) 3 Labels automatically laid out according to our UI guidelines. This main slot has been optimized to cover most of the usecases without compromising performance (read more in \l {Optimizing memory consumption}). We're aware there could be usecases which the \l SlotsLayout::mainSlot provided by ListItemLayout doesn't cover. If that is the case, please use \l SlotsLayout instead of \l ListItemLayout and provide your own \l SlotsLayout::mainSlot. ListItemLayout works similarly to QtQuick's Row, but while Row just positions its children in a horizontal formation, ListItemLayout also tweaks their vertical position to ensure a clean layout. We will call ListItemLayout's visual children "slots". ListItemLayout positions its slots automatically, following the visual rules specified by the Ubuntu Design team. Because we think flexibility is an important value of our UI components, we made it possible to tweak the position of each slot by modifying its attached properties (see \l {Advanced layout tweaks}). If you need a progression symbol in your list item, just add \l ProgressionSlot as a child of your ListItemLayout. No manual positioning is needed, the layout will handle it for you. To read more about advanced slots positioning or how to handle input (mouse or touch) in ListItemLayout, see \l SlotsLayout documentation. If you don't need the features provided by \l {ListItem} (such as the swiping actions), you can also use \l ListItemLayout directly as root of your list view delegate or inside a MouseArea, as explained in \l {Input handling}. The following code example shows how easy it is to create even non trivial list items using \l ListItem and ListItemLayout: \qml ListItem { height: layout.height + (divider.visible ? divider.height : 0) ListItemLayout { id: layout title.text: "Hello developers!" subtitle.text: "I'm a subtitle, I'm tiny!" summary.text: "Ubuntu!" CheckBox { SlotsLayout.position: SlotsLayout.Leading } Icon { name: "message" SlotsLayout.position: SlotsLayout.Trailing; width: units.gu(2) } } } \endqml Although ListItemLayout covers most of the usecases, there might be times where you might want to tweak the position of one or more slots. The following example shows one way to implement a list item with a trailing slot holding two labels. What is special about this example is that we want the baseline of one label inside the trailing slot to align to \l {title}'s baseline and the baseline of the other label to align to \l {subtitle}'s baseline. \qml ListItem { id: listItem height: layout.height + (divider.visible ? divider.height : 0) ListItemLayout { id: layout title.text: "Hello..." title.color: UbuntuColors.Orange subtitle.text: "...world!" Rectangle { SlotsLayout.position: SlotsLayout.Leading color: "pink" height: units.gu(6) width: height } Item { id: slot width: secondLabel.width height: parent.height //as we want to position labels to align with title and subtitle SlotsLayout.overrideVerticalPositioning: true Label { id: firstLabel anchors.right: secondLabel.right text: "19:17" fontSize: "small" y: layout.mainSlot.y + layout.title.y + layout.title.baselineOffset - baselineOffset } Label { id: secondLabel text: "Outgoing" fontSize: "small" y: layout.mainSlot.y + layout.subtitle.y + layout.subtitle.baselineOffset - baselineOffset } } } } \endqml \sa SlotsLayout \sa ProgressionSlot \section1 Labels layout The labels in ListItemLayout's default \l SlotsLayout::mainSlot are laid out in a column. The \l title is positioned at the top, followed by \l subtitle and \l summary, respectively. The \l subtitle has its top anchored to \l {title}'s bottom, with a margin of 2 DPs. The \l summary has its top tightly anchored to \l {subtitle}'s bottom. The height of the default \l SlotsLayout::mainSlot provided with ListItemLayout is the minimum height required to accomodate the \b visible and \b {non-empty} labels it holds. If only \l {title} is visible and has a non-empty text set, for instance, the height of the main slot will be \c {title.height}. If you wish to have the layout process accomodate a label which doesn't have a defined text yet, you should set its text property to " ", as shown in the following example: \qml ListItemLayout { title.text: "Hello developers!" //NOTE: the whitespace subtitle.text: " " } \endqml That will make sure \l SlotsLayout::mainSlot is resized to accomodate the (currently empty) subtitle. This is useful, for instance, if you want all list items in a list view to have the same height even without having to fill \l subtitle's (or summary's) text with dummy content. \section1 Optimizing memory consumption In order to minimize memory consumption, the Labels in the \l SlotsLayout::mainSlot are only allocated in memory on demand, i.e. the first time one of their properties is queried. \qml ListItemLayout { //NOTE: querying subtitle.text triggers allocation of subtitle Label Component.onCompleted: console.log(subtitle.text) title.text: "Hello developers!" } \endqml In the example above, querying subtitle.text will trigger the allocation in memory of the subtitle Label, which we don't actually use. We \b recommend avoiding querying properties of labels that we don't plan to use in the layout, in order to minimize memory consumption and maximize the scrolling performance of our list views. \qml ListItemLayout { //no extra labels created title.text: "Hello developers!" } \endqml \section1 About aliasing labels properties Due to the way ListItemsLayout's labels are created (see \l {Optimizing memory consumption}) it is not possible to directly alias their properties. It is still possible, however, to expose an API that gives indirect read-write access to those properties. The following code: \qml ListItem { property alias titleText: layout.title.text ListItemLayout { id: layout } } \endqml will return the error "Invalid alias location", because the title object does not yet exist at time when the alias is created. If you need to expose an API for your component that allows changing the properties of the labels, we recommend aliasing the labels themselves. Let's assume you want to create a QML component to use as a delegate of many list views inside your application: you will probably have a qml file holding the definition of the that delegate, and the content of that file will be similar to: \qml //Content of CustomListItem.qml import QtQuick 2.4 import Ubuntu.Components 1.3 ListItem { id: listitem property alias title: layout.title property alias iconName: icon.name height: layout.height + (divider.visible ? divider.height : 0) ListItemLayout { id: layout Icon { id: icon width: units.gu(2) } } } \endqml As you can see, we alias the label item itself instead of its properties. This also has the advantage of only exposing one alias instead of one for each property, thus making your QML app a bit more performant. Once your delegate is defined, you can use it in your ListViews like usual. \qml //other UI code... ListView { anchors.fill: parent model: ListModel { id: listViewModel ListElement { titleText: "Hello1"; icon: "message" } ListElement { titleText: "Hello2"; icon: "email" } ListElement { titleText: "Hello3"; icon: "email" } ListElement { titleText: "Hello4"; icon: "message" } } delegate: CustomListItem { title.text: model.titleText iconName: model.icon } } \endqml Note how title's properties are all accessible via the "title" identifier. */ UCListItemLayout::UCListItemLayout(QQuickItem *parent) : UCSlotsLayout(parent) { } /*! \qmlproperty Label ListItemLayout::title This property defines the title label and its properties. Styling and font properties can be set just like on any other Text component, as shown in the following example: \qml Item { ListItemLayout { title.text: "Hello" title.color: "yellow" } } \endqml */ UCLabel *UCListItemLayout::title() { return qobject_cast(mainSlot())->title(); } /*! \qmlproperty Label ListItemLayout::subtitle This property defines the subtitle label and its properties. Styling and font properties can be set by using the prefix \c {subtitle.} in a similar way as shown in \l title. */ UCLabel *UCListItemLayout::subtitle() { return qobject_cast(mainSlot())->subtitle(); } /*! \qmlproperty Label ListItemLayout::summary This property defines the subtitle label and its properties. Styling and font properties can be set by using the prefix \c {summary.} in a similar way as shown in \l title. */ UCLabel *UCListItemLayout::summary() { return qobject_cast(mainSlot())->summary(); } QQuickItem *UCListItemLayout::mainSlot() { if (UCSlotsLayout::mainSlot() == Q_NULLPTR) { //don't set the parent, we have to create qqmldata first UCThreeLabelsSlot *main = new UCThreeLabelsSlot(); //create QML data for mainSlot otherwise qmlAttachedProperties //calls in SlotsLayout will fail (setContextForObject will create the QQmlData) QQmlEngine::setContextForObject(main, qmlContext(this)); main->setParent(this); //this will also set the parentItem UCSlotsLayout::setMainSlot(main, false); } return UCSlotsLayout::mainSlot(); } void UCListItemLayout::setMainSlot(QQuickItem *slot, bool fireSignal) { Q_UNUSED(slot); Q_UNUSED(fireSignal); qmlInfo(this) << "Setting a different mainSlot on ListItemLayout is not supported. Please use SlotsLayout instead."; } ./src/Ubuntu/Components/plugin/ucurihandler.cpp0000644000015600001650000000555112700370701021765 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Loïc Molinari */ #include "ucurihandler.h" #include #include #include #include "statesaverbackend_p.h" UriHandlerObject::UriHandlerObject(UCUriHandler* uriHandler) : m_uriHandler(uriHandler) { } void UriHandlerObject::Open(const QStringList& uris, const QHash& platformData) { Q_UNUSED(platformData); Q_EMIT m_uriHandler->opened(uris); } /*! * \qmltype UriHandler * \instantiates UCUriHandler * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu * \brief Singleton signalling for opened URIs. * * UriHandler is a singleton handling opened URIs. The application can be signalled of opened URIs * through the opened signal. The content of the "APP_ID" environment variable is used to determine * the object path. If the D-Bus session bus is not connected or the "APP_ID" variable is not set or * empty, the handler stays uninitialized. * * Example of use: * * \qml * Connections { * target: UriHandler * onOpened: print(uris) * } * \endqml */ UCUriHandler::UCUriHandler() : m_uriHandlerObject(this) { QString objectPath; if (!QDBusConnection::sessionBus().isConnected()) { qWarning() << "UCUriHandler: D-Bus session bus is not connected, ignoring."; return; } // Get the object path based on the "APP_ID" environment variable. QByteArray applicationId = qgetenv("APP_ID"); if (applicationId.isEmpty()) { qWarning() << "UCUriHandler: Empty \"APP_ID\" environment variable, ignoring."; return; } char* path = nih_dbus_path(NULL, "", applicationId.constData(), NULL); objectPath = QString(path); nih_free(path); // Ensure handler is running on the main thread. QCoreApplication* instance = QCoreApplication::instance(); if (instance) { moveToThread(instance->thread()); } else { qWarning() << "UCUriHandler: Created before QCoreApplication, application may misbehave."; } QDBusConnection::sessionBus().registerObject( objectPath, &m_uriHandlerObject, QDBusConnection::ExportAllSlots); } /*! * \qmlsignal UriHandler::onOpened(list uris) * * The signal is triggered when URIs are opened. */ ./src/Ubuntu/Components/plugin/uclistitemactions.cpp0000644000015600001650000002310112700370701023032 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "uclistitemactions.h" #include "uclistitemactions_p.h" #include "uclistitem_p.h" #include "quickutils.h" #include "i18n.h" #include "plugin.h" #include #include "ucaction.h" #include "ucunits.h" #include "uclistitemstyle.h" UCListItemActionsPrivate::UCListItemActionsPrivate() : QObjectPrivate() , delegate(0) { } UCListItemActionsPrivate::~UCListItemActionsPrivate() { } /*! * \qmltype ListItemActions * \instantiates UCListItemActions * \inherits QtQObject * \inqmlmodule Ubuntu.Components 1.2 * \since Ubuntu.Components 1.2 * \ingroup ubuntu-listitem * \brief Provides configuration for actions to be added to a ListItem. * * ListItem accepts actions that can be configured to appear when swiped to left * or right. The API does not limit the number of actions to be assigned for leading * or trailing actions, however the design constraints are allowing a maximum of * 1 action on leading- and a maximum of 3 actions on trailing side of the ListItem. * * The \l actions are Action instances or elements derived from Action. The default * visualization of the actions can be overridden using the \l delegate property, * and the default implementation uses the \c name property of the Action. * * \section3 Using with ListViews * ListItemActions instances can be shared between ListItem instances within the * same view. When shared, the memory footprint of the view will be lot smaller, * as there will be no individual action container created for each list's actions. * Having individual ListItemActions instances increases the memory footprint, * and also has performance impact on kinetic scrolling. * * The examples below illustrate the worst and best practice when used in a ListView. * The worst case: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * MainView { * width: units.gu(40) * height: units.gu(71) * * UbuntuListView { * anchors.fill: parent * model: 10000 * delegate: ListItem { * leadingActions: ListItemActions { * actions: [ * Action { * iconName: "delete" * } * ] * } * trailingActions: ListItemActions { * actions: [ * Action { * iconName: "search" * }, * Action { * iconName: "edit" * }, * Action { * iconName: "copy" * } * ] * } * } * } * } * \endqml * * This example can be optimized by sharing the action arrays between the items: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * MainView { * width: units.gu(40) * height: units.gu(71) * * ListItemActions { * id: leading * actions: Action { * iconName: "delete" * } * } * ListItemActions { * id: trailing * actions: [ * Action { * iconName: "search" * }, * Action { * iconName: "edit" * }, * Action { * iconName: "copy" * } * ] * } * * UbuntuListView { * anchors.fill: parent * model: 10000 * delegate: ListItem { * leadingActions: leading * trailingActions: trailing * } * } * } * \endqml * * \section3 Action parameter types * Actions handled by the ListItem are all triggered with the ListItem's index * as parameter. This index can either be the model index when used with ListView, * or the child index from the parentItem's childItems list. Actions can use this * parameter to identify the instance of the ListItem on which it was executed, * in which case ListItem will change the type from \c Actions.None to \c Actions.Integer * when it is triggered. */ UCListItemActions::UCListItemActions(QObject *parent) : QObject(*(new UCListItemActionsPrivate), parent) { } UCListItemActions::~UCListItemActions() { } /*! * \qmlproperty Component ListItemActions::delegate * The property holds the custom delegate to visualize the actions listed in the * ListItemActions. When set to null, the default delegate specified by the \l * ListItemStyle will be used. * * ListItemActions provides the \c action context property which contains the * Action instance currently visualized. Using this property delegates can access * the information to be visualized. The action is triggered by the panel item * holding the visualized action, therefore only visualization is needed by the * custom delegate. The other context property exposed to delegates is the \c * index, which specifies the index of the action visualized. * * Specifying a custom delegate will not override the triggering logic of the * action, that will be still handled by the panel itself. However custom delegates * may still need to distinguish the pressed/released state visually. This can * be achieved using the \c pressed context property, which informs the delegate * about the pressed state of the action. * * The delegate height is set automatically by the panel item, only the width must * be specified which will be clamped between height and the maximum width of the * list item divided by the number of actions in the list. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * * MainView { * width: units.gu(40) * height: units.gu(71) * * UbuntuListView { * anchors.fill: parent * model: 50 * delegate: ListItem { * trailingActions: actionsList * } * ListItemActions { * id: actionsList * delegate: Column { * width: height + units.gu(2) * Icon { * name: action.iconName * width: units.gu(3) * height: width * color: pressed ? "blue" : "lightblue" * anchors.horizontalCenter: parent.horizontalCenter * } * Label { * text: action.text + "#" + index * width: parent.width * horizontalAlignment: Text.AlignHCenter * } * } * actions: Action { * iconName: "starred" * text: "Star" * } * } * } * } * \endqml * \note Putting a Rectangle in the delegate can be used to override the color * of the panel. Also all ListItem attached properties can be used in the delegates. * * Defaults to null. */ QQmlComponent *UCListItemActions::delegate() const { Q_D(const UCListItemActions); return d->delegate; } void UCListItemActions::setDelegate(QQmlComponent *delegate) { Q_D(UCListItemActions); if (d->delegate == delegate) { return; } d->delegate = delegate; Q_EMIT delegateChanged(); } /*! * \qmlproperty list ListItemActions::actions * The property holds the actions to be displayed. It can hold instances cached or * declared in place. An example of cached actions: * \qml * ListItemActions { * id: cachedActions * actions: [ * copyAction, searchAction, cutAction * ] * } * \endqml */ int UCListItemActionsPrivate::actions_count(QQmlListProperty *p) { return reinterpret_cast *>(p->data)->count(); } void UCListItemActionsPrivate::actions_append(QQmlListProperty *p, UCAction *v) { // check action type before adding it if (v->m_parameterType == UCAction::None) { v->setProperty("parameterType", UCAction::Integer); } reinterpret_cast *>(p->data)->append(v); } UCAction *UCListItemActionsPrivate::actions_at(QQmlListProperty *p, int i) { return reinterpret_cast *>(p->data)->at(i); } void UCListItemActionsPrivate::actions_clear(QQmlListProperty *p) { reinterpret_cast *>(p->data)->clear(); } QQmlListProperty UCListItemActions::actions() { Q_D(UCListItemActions); return QQmlListProperty(this, &d->actions, UCListItemActionsPrivate::actions_append, UCListItemActionsPrivate::actions_count, UCListItemActionsPrivate::actions_at, UCListItemActionsPrivate::actions_clear ); } /*! * \internal * \qmlproperty list ListItemActions::data * \default * The property holds any additional content added to the ListItemActions. */ QQmlListProperty UCListItemActions::data() { Q_D(UCListItemActions); return QQmlListProperty(this, d->data); } #include "moc_uclistitemactions.cpp" ./src/Ubuntu/Components/plugin/ucstatesaver.cpp0000644000015600001650000002461012700370701022006 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "ucstatesaver.h" #include "ucstatesaver_p.h" #include "statesaverbackend_p.h" #include "i18n.h" #include "quickutils.h" #include #include #include #include #include #include "private/qqmldata_p.h" #include "private/qqmlcontext_p.h" #include UCStateSaverAttachedPrivate::UCStateSaverAttachedPrivate(UCStateSaverAttached *qq, QObject *attachee) : q_ptr(qq) , m_attachee(attachee) , m_enabled(false) { } /* * Initializer slot. */ void UCStateSaverAttachedPrivate::_q_init() { m_id = qmlContext(m_attachee)->nameForObject(m_attachee); if (m_id.isEmpty()) { qmlInfo(m_attachee) << QStringLiteral("Warning: attachee must have an ID. State will not be saved."); q_func()->setEnabled(false); return; } m_absoluteId = absoluteId(m_id); if (m_absoluteId.isEmpty()) { q_func()->setEnabled(false); return; } if (!StateSaverBackend::instance()->registerId(m_absoluteId)) { qmlInfo(m_attachee) << QStringLiteral("Warning: attachee's UUID is already registered, state won't be saved: %1").arg(m_absoluteId); m_absoluteId.clear(); q_func()->setEnabled(false); return; } restore(); } /* * Force state saver slot. */ void UCStateSaverAttachedPrivate::_q_save() { if (m_enabled && StateSaverBackend::instance()->enabled() && !m_properties.isEmpty() && !m_absoluteId.isEmpty()) { StateSaverBackend::instance()->save(m_absoluteId, m_attachee, m_properties); } } void UCStateSaverAttachedPrivate::_q_globalEnableChanged(bool enabled) { // sync component watchers signals watchComponent(enabled); } QString UCStateSaverAttachedPrivate::absoluteId(const QString &id) { QQmlContext *attacheeContext = qmlContext(m_attachee); QQmlContextData *cdata = QQmlContextData::get(attacheeContext); #if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) QUrl url(cdata->url()); #else QUrl url(cdata->url); #endif QQmlData *ddata = QQmlData::get(m_attachee); QString path = url.path().replace('/', '_') + ':' + QString::number(ddata->lineNumber) + ':' + QString::number(ddata->columnNumber) + ':' + id; QObject *parent = m_attachee->parent(); // check whether we have an "index" context property defined QVariant indexValue = attacheeContext->contextProperty("index"); if (indexValue.isValid() && (indexValue.type() == QVariant::Int)) { path += indexValue.toString(); } while (parent) { QString parentId = qmlContext(parent)->nameForObject(parent); QString className = QuickUtils::instance()->className(parent); if (!parentId.isEmpty()) { path.prepend(className + '-' + parentId + ":"); } else { qmlInfo(parent) << QStringLiteral("All the parents must have an id.\nState saving disabled for %1, class %2"). arg(path).arg(className); return QString(); } parent = parent->parent(); } return path; } void UCStateSaverAttachedPrivate::restore() { if (m_enabled && !m_absoluteId.isEmpty() && !m_properties.isEmpty()) { // load group StateSaverBackend::instance()->load(m_absoluteId, m_attachee, m_properties); } } /* * */ void UCStateSaverAttachedPrivate::watchComponent(bool watch) { Q_Q(UCStateSaverAttached); if (!watch) { // disconnect to save processing time if no state save is needed QQmlComponentAttached *componentAttached = QQmlComponent::qmlAttachedProperties(m_attachee); QObject::disconnect(componentAttached, SIGNAL(completed()), q, SLOT(_q_init())); QObject::disconnect(StateSaverBackend::instance(), SIGNAL(initiateStateSaving()), q, SLOT(_q_save())); } else { // re-connect to proceed with saving QQmlComponentAttached *componentAttached = QQmlComponent::qmlAttachedProperties(m_attachee); QObject::connect(componentAttached, SIGNAL(completed()), q, SLOT(_q_init())); QObject::connect(StateSaverBackend::instance(), SIGNAL(initiateStateSaving()), q, SLOT(_q_save())); } } /*! * \qmltype StateSaver * \instantiates UCStateSaverAttached * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu-services * \brief Attached properties to save component property states. * * StateSaver attached object provides the ability to save component property values * that can be restored after an inproper application close. The properties subject * of serialization must be given in the \l properties as a string, separated with * commas. The serialization will happen automatically on component's completion * time, as well as when the application is deactivated. Automatic serialization * of a component can be turned off by simply setting false to \l enabled property. * * \note The application name must be set correctly to the package name so that * state saving can work (e.g. com.ubuntu.calendar) through \l MainView::applicationName. * * States saved are discarded when the application is closed properly. The state * loading is ignored (but not discarded) when the application is launched through * UriHandler. * * Example: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * * TextField { * id: input * StateSaver.properties: "text" * StateSaver.enabled: input.enabled * } * \endqml * * In this example the state saver is synchronized with the attachee's one. * * Group properties can also be serialized by specifying the path to their individual * properties. * \qml * Rectangle { * id: rect * color: "gray" * border { * color: "blue" * width: units.gu(1) * } * StateSaver.properties: "color, border.color, border.width" * } * \endqml * * StateSaver computes a unique identifier for the attachee using the component's * and all its parents' \a{id}. Therefore attachee component as well as all its * parents must have a valid ID set. * * The following example will give error for the \a input, as the root component * has no id specified: * \qml * Item { * //[...] * Item { * id: parent * //[...] * TextField { * id: input * StateSaver.properties: "text" * } * } * } * \endqml * but the following example will successfully save the text field content * \qml * Item { * id: root * //[...] * Item { * id: parent * //[...] * TextField { * id: input * StateSaver.properties: "text" * } * } * } * \endqml * * When used with Repeater, each created item from the Repeater's delegate will * be saved separately. Note that due to the way Repeater works, Repeaters do not * need to have id specified. * * \qml * Item { * id: root * // [...] * Repeater { * model: 10 * Rectangle { * id: rect * width: 50; height: 50 * StateSaver.properties: "width, height" * } * } * // [...] * } * \endqml * * It can be used in the same way in ListView or GridView, except that both ListView * and GridView must have an id set. * * The StateSaver can save all \l{http://qt-project.org/doc/qt-5.0/qtqml/qtqml-typesystem-basictypes.html}{QML base types}, * Objects, list of objects or variants containing any of these cannot be saved. */ UCStateSaverAttached::UCStateSaverAttached(QObject *attachee) : QObject(attachee) , d_ptr(new UCStateSaverAttachedPrivate(this, attachee)) { // make sure we have the backend linked to the engine Q_ASSERT(qmlEngine(attachee)); StateSaverBackend::instance(qmlEngine(attachee)); setEnabled(true); // connect to StateSaverBackend's enabledChanged signal to sync when the state saver is globally disabled/enabled connect(StateSaverBackend::instance(), SIGNAL(enabledChanged(bool)), this, SLOT(_q_globalEnableChanged(bool))); } UCStateSaverAttached::~UCStateSaverAttached() { StateSaverBackend::instance()->removeId(d_func()->m_absoluteId); } // getter/setter /*! * \qmlproperty bool StateSaver::enabled * The property drives the automatic state saving. When disabled, state saving * will not happen on properties. * * The default value is true. */ bool UCStateSaverAttached::enabled() const { return d_func()->m_enabled; } void UCStateSaverAttached::setEnabled(bool v) { Q_D(UCStateSaverAttached); if (d->m_enabled != v) { d->m_enabled = v; // make sure next time we sync properties if (StateSaverBackend::instance()->enabled()) { d->watchComponent(d->m_enabled); } Q_EMIT enabledChanged(); } } /*! * \qmlproperty string StateSaver::properties * List of properties to be serialized, separated with commas. Properties must be * writable and can only be \l{http://qt-project.org/doc/qt-5.0/qtqml/qtqml-typesystem-basictypes.html}{QML base types}. * * A custom single line input which saves the text, placeholderText, font and color would look as follows: * \qml * TextField { * id: input * StateSaver.properties: "text, placeholderText, font, color" * } * \endqml */ QString UCStateSaverAttached::properties() const { return d_func()->m_properties.join(','); } void UCStateSaverAttached::setProperties(const QString &list) { QStringList propertyList = list.split(',', QString::SkipEmptyParts); for (int i = 0; i < propertyList.count(); i++) { propertyList[i] = propertyList.at(i).trimmed(); } Q_D(UCStateSaverAttached); if (d->m_properties != propertyList) { d->m_properties = propertyList; Q_EMIT propertiesChanged(); d->restore(); } } #include "moc_ucstatesaver.cpp" ./src/Ubuntu/Components/plugin/ucstatesaver.h0000644000015600001650000000361612700370701021456 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCSTATESAVER_H #define UCSTATESAVER_H #include #include class UCStateSaverAttachedPrivate; class UCStateSaverAttached : public QObject { Q_OBJECT Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged) Q_PROPERTY(QString properties READ properties WRITE setProperties NOTIFY propertiesChanged) public: UCStateSaverAttached(QObject *attachee); ~UCStateSaverAttached(); // getter/setter bool enabled() const; void setEnabled(bool v); QString properties() const; void setProperties(const QString &list); Q_SIGNALS: void enabledChanged(); void propertiesChanged(); private: Q_DECLARE_PRIVATE(UCStateSaverAttached) QScopedPointer d_ptr; Q_PRIVATE_SLOT(d_func(), void _q_init()) Q_PRIVATE_SLOT(d_func(), void _q_save()) Q_PRIVATE_SLOT(d_func(), void _q_globalEnableChanged(bool)) }; class UCStateSaver : public QObject { Q_OBJECT public: static UCStateSaverAttached *qmlAttachedProperties(QObject *attachee) { return new UCStateSaverAttached(attachee); } }; QML_DECLARE_TYPEINFO(UCStateSaver, QML_HAS_ATTACHED_PROPERTIES) #endif // UCSTATESAVER_H ./src/Ubuntu/Components/plugin/livetimer_p.h0000644000015600001650000000265112700370701021262 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef LIVETIMER_P_H #define LIVETIMER_P_H #include "livetimer.h" #include class SharedLiveTimer : public QObject { Q_OBJECT public: SharedLiveTimer(QObject* parent = NULL); static SharedLiveTimer& instance() { static SharedLiveTimer instance; return instance; } void registerTimer(LiveTimer* timer); void unregisterTimer(LiveTimer* timer); private Q_SLOTS: void timeout(); void timedate1PropertiesChanged(const QString &interface, const QVariantMap &changed, const QStringList&); Q_SIGNALS: void trigger(); private: void updateFrequency(); void reInitTimer(); QList m_liveTimers; QTimer m_timer; LiveTimer::Frequency m_frequency; QDateTime m_nextUpdate; QDateTime m_lastUpdate; }; #endif // LIVETIMER_P_H ./src/Ubuntu/Components/plugin/propertychange_p.h0000644000015600001650000000314212700370714022314 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef PROPERTYCHANGE_P_H #define PROPERTYCHANGE_P_H #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) #include #endif class QQmlAbstractBinding; class PropertyChange { public: PropertyChange(QObject *item, const char *property, bool autoBackup = false); ~PropertyChange(); static void setValue(PropertyChange* change, const QVariant &value); static void setBinding(PropertyChange *change, QQmlAbstractBinding *binding); static void restore(PropertyChange* change); const QQmlProperty &property() { return qmlProperty; } private: bool backedUp; QQmlProperty qmlProperty; QVariant backupValue; #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) QExplicitlySharedDataPointer backupBinding; #else QQmlAbstractBinding *backupBinding; #endif void backup(); }; #endif // PROPERTYCHANGE_P_H ./src/Ubuntu/Components/plugin/uctheme.h0000644000015600001650000001215012700370701020370 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: Zsombor Egri * Florian Boucault */ #ifndef UCTHEME_H #define UCTHEME_H #include #include #include #include #include #include #include #include #include "ucdefaulttheme.h" class UCStyledItemBase; class QQmlAbstractBinding; class QQuickItem; class UCTheme : public QObject, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(UCTheme *parentTheme READ parentTheme NOTIFY parentThemeChanged FINAL) Q_PROPERTY(QString name READ name WRITE setName RESET resetName NOTIFY nameChanged FINAL) Q_PROPERTY(QObject* palette READ palette WRITE setPalette RESET resetPalette NOTIFY paletteChanged FINAL) public: static quint16 previousVersion; struct ThemeRecord { ThemeRecord() : shared(false), deprecated(false) {} ThemeRecord(const QString &name, const QUrl &path, bool shared, bool deprecated) : name(name), path(path), shared(shared), deprecated(deprecated) {} bool isValid() const { return path.isValid(); } QString name; QUrl path; bool shared:1; bool deprecated:1; }; explicit UCTheme(QObject *parent = 0); static UCTheme *defaultTheme(QQmlEngine *engine); // getter/setters UCTheme *parentTheme(); void setParentTheme(UCTheme *parentTheme); // not used as setter QString name() const; void setName(const QString& name); void resetName(); QObject* palette(quint16 version = 0); void setPalette(QObject *config); static void checkMixedVersionImports(QQuickItem *item, quint16 version); // internal, used by the deprecated Theme.createStyledComponent() QQmlComponent* createStyleComponent(const QString& styleName, QObject* parent, quint16 version = 0); void attachItem(QQuickItem *item, bool attach); // helper functions QColor getPaletteColor(const char *profile, const char *color); Q_SIGNALS: void parentThemeChanged(); void nameChanged(); void paletteChanged(); void versionChanged(); protected: void classBegin(); void componentComplete() { m_completed = true; } private Q_SLOTS: void resetPalette(); void _q_defaultThemeChanged(); private: static void createDefaultTheme(QQmlEngine* engine); void setupDefault(); void init(); void updateEnginePaths(QQmlEngine *engine); void updateThemePaths(); QUrl styleUrl(const QString& styleName, quint16 version, bool *isFallback = NULL); void loadPalette(QQmlEngine *engine, bool notify = true); void updateThemedItems(); class PaletteConfig { public: PaletteConfig() : palette(0), configured(false) {} ~PaletteConfig() { restorePalette(); } void configurePalette(QObject *themePalette); void restorePalette(); void reset() { configList.clear(); } QObject *palette; private: void buildConfig(); void apply(QObject *palette); struct Data { Data(const QString &name, const QQmlProperty &prop) : propertyName(name), configProperty(prop), configBinding(0), paletteBinding(0) {} Data(const QString &name, const QQmlProperty &prop, QQmlAbstractBinding *binding) : propertyName(name), configProperty(prop), configBinding(binding), paletteBinding(0) {} QString propertyName; QQmlProperty configProperty; QQmlProperty paletteProperty; QVariant paletteValue; QQmlAbstractBinding *configBinding; QQmlAbstractBinding *paletteBinding; }; // configuration palette, not the original theme one bool configured:1; QList configList; }; PaletteConfig m_config; QString m_name; QPointer m_parentTheme; QPointer m_palette; // the palette might be from the default style if the theme doesn't define palette QList m_themePaths; UCDefaultTheme m_defaultTheme; QPODVector m_attachedItems; bool m_completed:1; friend class UCDeprecatedTheme; }; UCTheme::ThemeRecord pathFromThemeName(QString themeName); #endif // UCTHEME_H ./src/Ubuntu/Components/plugin/ucpagetreenode_p.h0000644000015600001650000000373012700370701022253 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCPAGETREENODE_P_H #define UCPAGETREENODE_P_H #include "ucstyleditembase_p.h" class UCPageTreeNode; class UCPageTreeNodePrivate : public UCStyledItemBasePrivate { Q_DECLARE_PUBLIC(UCPageTreeNode) public: UCPageTreeNodePrivate (); void init (); void updatePageTree (); UCPageTreeNode *getParentPageTreeNode (); enum PropertyFlags { FirstFlag = 0x01, CustomPropagated = FirstFlag, CustomActive = FirstFlag << 1, CustomPageStack = FirstFlag << 2, LastPageTreeNodeFlag = FirstFlag << 8 }; struct Node { UCPageTreeNode *m_node = 0; QList m_children; }; void _q_activeBinding (bool active); void _q_pageStackBinding (QQuickItem *pageStack); void _q_propagatedBinding (QObject *propagated); void updateParentLeafNode (); void dumpNodeTree (); void initActive(); void initPageStack(); void initPropagated(); private: void dumpNode(const Node &n, const QString &oldDepth = QString(), const QString &depth = QString(), bool isRoot = true); public: UCPageTreeNode *m_parentNode; QQuickItem* m_activeLeafNode; QQuickItem* m_pageStack; QObject* m_propagated; QQuickItem* m_toolbar; qint8 m_flags; bool m_isLeaf:1; bool m_active:1; }; #endif // UCPAGETREENODE_P_H ./src/Ubuntu/Components/plugin/ucinversemouse.h0000644000015600001650000000323312700370701022014 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #ifndef UCINVERSEMOUSE_H #define UCINVERSEMOUSE_H #include "ucmouse.h" #include class UCInverseMouse : public UCMouse { Q_OBJECT public: explicit UCInverseMouse(QObject *parent = 0); static UCInverseMouse *qmlAttachedProperties(QObject *owner); virtual void setEnabled(bool enabled); virtual void setPriority(Priority priority); bool excludeInputArea() const; void setExcludeInputArea(bool value); protected: QMouseEvent mapMouseToOwner(QObject *target, QMouseEvent* event); QHoverEvent mapHoverToOwner(QObject *target, QHoverEvent *event); virtual bool eventFilter(QObject *, QEvent *); virtual bool mouseEvents(QObject *target, QMouseEvent *event); virtual bool hoverEvents(QObject *target, QHoverEvent *event); virtual bool hasAttachedFilter(QQuickItem *item); bool pointInOSK(const QPointF &point); bool contains(QMouseEvent *mouse); }; QML_DECLARE_TYPE(UCInverseMouse) QML_DECLARE_TYPEINFO(UCInverseMouse, QML_HAS_ATTACHED_PROPERTIES) #endif // UCINVERSEMOUSE_H ./src/Ubuntu/Components/plugin/ucapplication.cpp0000644000015600001650000000613512700370701022132 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #include "ucapplication.h" #include #include #include #include #include #include /*! * \qmltype UbuntuApplication * \instantiates UCApplication * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu * \brief UbuntuApplication is a QML binding for a subset of QCoreApplication. * * UbuntuApplication is a context property in QML. */ UCApplication *UCApplication::m_app = nullptr; UCApplication::UCApplication(QObject* parent) : QObject(parent), m_context(0) , m_inputMethod(QGuiApplication::inputMethod()) { // Make sure we receive application name changes from C++ modules connect(QCoreApplication::instance(), &QCoreApplication::applicationNameChanged, this, &UCApplication::applicationNameChanged); } UCApplication::~UCApplication() { m_app = nullptr; } void UCApplication::setContext(QQmlContext* context) { m_context = context; } /*! * \internal * The name of the application, see QCoreApplication::applicationName */ QString UCApplication::applicationName() { return QCoreApplication::applicationName(); } void UCApplication::setApplicationName(const QString& applicationName) { /* QStandardPaths uses the name to build folder names. This works across platforms. For confinement we rely on the fact that the folders are whitelisted based on the app name. Similar to how Unity uses it to distinguish running applications. */ QCoreApplication::setApplicationName(applicationName); // Unset organization to skip an extra folder component QCoreApplication::setOrganizationName(QString()); /* Ensure that LocalStorage and WebKit use the same location Docs are ambiguous: in practise applicationName is ignored by default */ QQmlEngine* engine(m_context->engine()); QString dataFolder(QStandardPaths::writableLocation(QStandardPaths::DataLocation)); engine->setOfflineStoragePath(dataFolder); // Get Qtlabs.settings to use a sane path QCoreApplication::setOrganizationDomain(applicationName); } /*! * \internal * The global input method. Can be overridden for testing. */ QObject* UCApplication::inputMethod() { return m_inputMethod; } void UCApplication::setInputMethod(QObject* inputMethod) { m_inputMethod = inputMethod; } ./src/Ubuntu/Components/plugin/ucalarmmodel.cpp0000644000015600001650000002255212700370701021745 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "ucalarmmodel.h" #include "ucalarm.h" #include "ucalarm_p.h" #include "alarmmanager_p.h" #include #include #include /*! * \qmltype AlarmModel * \instantiates UCAlarmModel * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu-services * \brief AlarmModel holds the list of alarms defined. * * The AlarmModel is a simple container of \l Alarm definitions stored in the alarm * collection. The data provided by the model are read only, adding, modifying or * removing data is only possible through \l Alarm functions. Any modification on * the alarms or any new alarm added to the collection will refresh all the model * instances. This also means that the delegates visualizing the model elements will * also be re-created. * * Example usage: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * import Ubuntu.Components.ListItems 1.0 * ListView { * model: AlarmModel {} * width: units.gu(80) * height: units.gu(100) * delegate: Subtitled { * text: message * subText: Qt.formatDateTime(date) * } * } * \endqml * * The model defines the same roles as the \l Alarm properties. Note that the use * of \a enabled role in delegates may be ambiguous. Therefore the model defines * the additional role called \a model, which represents the \l Alarm object from * the index the delegate is showing the data, so the \a enabled role can then be * accessed by simply dereferencing the model i.e. model.enabled. * * Example: * \qml * ListView { * model: AlarmModel{} * delegate: Standard { * text: message * control: Switch { * checked: model.enabled * } * } * } * \endqml * * The number of alarm events can be obtained from the \l count property. To get * a specific alarm event data from the model, use the \l get() function. * * As the \l get() function returns the alarm object from the given index. Combined * with the alarm functions the alarms can be updated in place. * * Example: * \qml * ListView { * model: AlarmModel{ * id: alarmModel * } * delegate: Standard { * text: message * control: Switch { * checked: model.enabled * onCheckedChanged: { * if (checked != model.enabled) { * var data = alarmModel.get(index); * data.enabled = checked; * data.save(); * } * } * } * } * } * \endqml * * In this kind of "in place" updates using the \a model role would give the same result: * \qml * ListView { * model: AlarmModel{ * id: alarmModel * } * delegate: Standard { * text: message * control: Switch { * checked: model.enabled * onCheckedChanged: { * if (checked != model.enabled) { * model.enabled = checked; * model.save(); * } * } * } * } * } * \endqml */ UCAlarmModel::UCAlarmModel(QObject *parent) : QAbstractListModel(parent) , m_moved(false) { // keep in sync with alarms collection changes // some of the connections can be asynchronous, others synchronous connect(&AlarmManager::instance(), SIGNAL(alarmsRefreshStarted()), this, SLOT(refreshStart()), Qt::DirectConnection); connect(&AlarmManager::instance(), SIGNAL(alarmsRefreshed()), this, SLOT(refreshEnd()), Qt::DirectConnection); // get individual alarm data updates connect(&AlarmManager::instance(), SIGNAL(alarmUpdated(int)), this, SLOT(update(int)), Qt::DirectConnection); // get individual alarm insertion connect(&AlarmManager::instance(), SIGNAL(alarmInsertStarted(int)), this, SLOT(insertStarted(int)), Qt::DirectConnection); connect(&AlarmManager::instance(), SIGNAL(alarmInsertFinished()), this, SLOT(insertFinished()), Qt::DirectConnection); // get individual alarm removal, must be direct connect(&AlarmManager::instance(), SIGNAL(alarmRemoveStarted(int)), this, SLOT(removeStarted(int)), Qt::DirectConnection); connect(&AlarmManager::instance(), SIGNAL(alarmRemoveFinished()), this, SLOT(removeFinished()), Qt::DirectConnection); // get individual alamr move, must be direct connect(&AlarmManager::instance(), SIGNAL(alarmMoveStarted(int,int)), this, SLOT(moveStarted(int,int)), Qt::DirectConnection); connect(&AlarmManager::instance(), SIGNAL(alarmMoveFinished()), this, SLOT(moveFinished()), Qt::DirectConnection); } UCAlarmModel::~UCAlarmModel() { } void UCAlarmModel::classBegin() { } void UCAlarmModel::componentComplete() { // fetch alarms refresh(); } int UCAlarmModel::rowCount(const QModelIndex &parent) const { Q_UNUSED(parent); return count(); } QVariant UCAlarmModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) { return QVariant(); } int idx = index.row(); if ((idx >= AlarmManager::instance().alarmCount()) || (idx < 0)) { return QVariant(); } UCAlarm *alarm = AlarmManager::instance().alarmAt(idx); return AlarmUtils::roleData(role, alarm); } QHash UCAlarmModel::roleNames() const { return AlarmUtils::roles(); } /*! * \qmlmethod Alarm AlarmModel::get(int index) * Returns the reference of the alarm event at \a index in the model. This allows the * alarm data to be modified and updated either through normal component binding * or in Javascript functions. * * \code * Component.onCompleted: { * var alarm = alarmModel.get(0); * alarm.message += " updated"; * alarm.save(); * } * \endcode * * This Javascript code returns the alarm properties from the first index of the * model, updates its message and updates the alarm. Note that the alarm must be * saved in order to have the changes visible. The follwoing code will not update * the alarm in the model/collection: * * \code * Component.onCompleted: { * alarmModel.get(0).message += " updated"; * alarm.message += " updated"; * } * \endcode * * \note The returned object is not guarantied to remain valid, it should not be * used in property bindings. Also, \l {Alarm::reset}{reset()} should not be called * either as the call will clear the alarm data from the cache. * * \sa Alarm */ UCAlarm* UCAlarmModel::get(int index) { UCAlarm *alarm = AlarmManager::instance().alarmAt(index); if (alarm) { UCAlarm *tempAlarm = new UCAlarm(this); UCAlarmPrivate::get(tempAlarm)->copyAlarmData(*alarm); alarm = tempAlarm; QQmlEngine::setObjectOwnership(tempAlarm, QQmlEngine::JavaScriptOwnership); } return alarm; } /*! * \qmlproperty int AlarmModel::count * The number of data entries in the model. */ int UCAlarmModel::count() const { return AlarmManager::instance().alarmCount(); } /*! * \qmlmethod AlarmModel::refresh() * The function refreshes the model by invalidating the alarm cache. Use this * function only if the refresh is absolutely required, otherwise it will cause * performance problems. */ void UCAlarmModel::refresh() { AlarmManager::instance().fetchAlarms(); } /*! * \internal * The slot prepares the model reset. */ void UCAlarmModel::refreshStart() { beginResetModel(); } /*! * \internal * The slot finalizes the model reset. */ void UCAlarmModel::refreshEnd() { endResetModel(); Q_EMIT countChanged(); } /*! * \internal * Slot updating individual alarm's data. */ void UCAlarmModel::update(int index) { // create index and emit dataUpdate() QModelIndex modelIndex = createIndex(index, 0); Q_EMIT dataChanged(modelIndex, modelIndex); } /*! * \internal * Slot starting removing individual alarm. */ void UCAlarmModel::removeStarted(int index) { beginRemoveRows(QModelIndex(), index, index); } /*! * \internal * Slot finalizing removing individual alarm. */ void UCAlarmModel::removeFinished() { endRemoveRows(); Q_EMIT countChanged(); } /*! * \internal * Slot starting inserting an individual alarm. */ void UCAlarmModel::insertStarted(int index) { beginInsertRows(QModelIndex(), index, index); } /*! * \internal * Slot finalizing inserting an individual alarm. */ void UCAlarmModel::insertFinished() { endInsertRows(); Q_EMIT countChanged(); } /*! * \internal * Slot starting moving an individual alarm. */ void UCAlarmModel::moveStarted(int from, int to) { if (m_moved) { return; } m_moved = beginMoveRows(QModelIndex(), from, from, QModelIndex(), to); } /*! * \internal * Slot finalizing moving an individual alarm. */ void UCAlarmModel::moveFinished() { if (m_moved) { endMoveRows(); } m_moved = false; } ./src/Ubuntu/Components/plugin/ucubuntuanimation.h0000644000015600001650000000353712700370701022521 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #ifndef UCUBUNTUANIMATION_H #define UCUBUNTUANIMATION_H #include #include class UCUbuntuAnimation : public QObject { Q_OBJECT Q_PROPERTY(int SnapDuration READ SnapDuration CONSTANT) Q_PROPERTY(int FastDuration READ FastDuration CONSTANT) Q_PROPERTY(int BriskDuration READ BriskDuration CONSTANT) Q_PROPERTY(int SlowDuration READ SlowDuration CONSTANT) Q_PROPERTY(int SleepyDuration READ SleepyDuration CONSTANT) Q_PROPERTY(QEasingCurve StandardEasing READ StandardEasing CONSTANT) Q_PROPERTY(QEasingCurve StandardEasingReverse READ StandardEasingReverse CONSTANT) public: explicit UCUbuntuAnimation(QObject *parent = 0); int SnapDuration() const { return 100; } int FastDuration() const { return 165; } int BriskDuration() const { return 333; } int SlowDuration() const { return 500; } int SleepyDuration() const { return 1000; } const QEasingCurve& StandardEasing() const { return m_standardEasing; } const QEasingCurve& StandardEasingReverse() const { return m_StandardEasingReverse; } private: QEasingCurve m_standardEasing; QEasingCurve m_StandardEasingReverse; }; #endif // UCUBUNTUANIMATION_H ./src/Ubuntu/Components/plugin/ucstyleditembase_p.h0000644000015600001650000000442012700370714022630 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCSTYLEDITEMBASE_P_H #define UCSTYLEDITEMBASE_P_H #include #include "ucstyleditembase.h" #include "ucthemingextension.h" #include "ucimportversionchecker_p.h" class QQuickMouseArea; class UCStyledItemBase; class UCStyledItemBasePrivate : public QQuickItemPrivate, public UCImportVersionChecker { Q_INTERFACES(UCThemingExtension) Q_DECLARE_PUBLIC(UCStyledItemBase) public: static UCStyledItemBasePrivate *get(UCStyledItemBase *item) { return item->d_func(); } void _q_styleResized(); UCStyledItemBasePrivate(); virtual ~UCStyledItemBasePrivate(); void init(); virtual void setFocusable(bool focus); bool isParentFocusable(); QQmlComponent *style() const; void setStyle(QQmlComponent *style); void resetStyle(); QQuickItem *styleInstance(); QString styleName() const; void setStyleName(const QString &name); virtual void preStyleChanged(); virtual void postStyleChanged() {} virtual bool loadStyleItem(bool animated = true); virtual void completeComponentInitialization(); // from UCImportVersionChecker virtual QString propertyForVersion(quint16 version) const; public: QPointer styleItemContext; QString styleDocument; QQuickItem *oldParentItem; QQmlComponent *styleComponent; QQuickItem *styleItem; quint16 styleVersion; bool keyNavigationFocus:1; bool activeFocusOnPress:1; bool wasStyleLoaded:1; bool isFocusScope:1; protected: void connectStyleSizeChanges(bool attach); }; #endif // UCSTYLEDITEMBASE_P_H ./src/Ubuntu/Components/plugin/ucmainviewbase_p.h0000644000015600001650000000304712700370701022264 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCMAINVIEWBASE_P_H #define UCMAINVIEWBASE_P_H #include "ucpagetreenode_p.h" #include class UCMainViewBase; class UCActionManager; class UCPopupContext; class UCMainViewBasePrivate : public UCPageTreeNodePrivate { Q_DECLARE_PUBLIC(UCMainViewBase) public: UCMainViewBasePrivate(); void init(); enum PropertyFlags { CustomHeaderColor = 0x01, CustomBackgroundColor = 0x02, CustomFooterColor = 0x04 }; void _q_headerColorBinding (const QColor &col); void _q_footerColorBinding (const QColor &col); void doAutoTheme(); void _q_updateWindow(); QString m_applicationName; QColor m_headerColor; QColor m_backgroundColor; QColor m_footerColor; UCActionManager *m_actionManager = nullptr; UCPopupContext* m_actionContext = nullptr; qint8 m_flags; bool m_anchorToKeyboard:1; }; #endif // UCMAINVIEWBASE_P_H ./src/Ubuntu/Components/plugin/ucmouse.h0000644000015600001650000001306112700370701020420 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #ifndef UCMOUSE_H #define UCMOUSE_H #include #include #include #include #include class ForwardedEvent : public QEvent { public: enum EventType { MousePress, MouseRelease, MouseMove, MouseDblClick, HoverEnter, HoverExit, MouseClick, MouseLongPress, }; ForwardedEvent(EventType type, QQuickItem *sender, QEvent *originalEvent, QQuickMouseEvent *quickEvent) : QEvent((QEvent::Type)m_eventBase) , m_subType(type) , m_sender(sender) , m_originalEvent(originalEvent) , m_quickEvent(quickEvent) { setAccepted(false); } static void registerForwardedEvent(); EventType subType() const { return m_subType; } QQuickItem *sender() const { return m_sender; } QQuickMouseEvent *quickEvent() const { return m_quickEvent; } QEvent *originalEvent() const { return m_originalEvent; } static QEvent::Type baseType() { return m_eventBase; } private: EventType m_subType; QPointer m_sender; QEvent *m_originalEvent; QPointer m_quickEvent; static QEvent::Type m_eventBase; }; class UCMouse : public QObject { Q_OBJECT Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged) Q_PROPERTY(Qt::MouseButtons acceptedButtons READ acceptedButtons NOTIFY acceptedButtonsChanged) Q_PROPERTY(bool hoverEnabled READ hoverEnabled NOTIFY hoverEnabledChanged) Q_PROPERTY(int clickAndHoldThreshold READ clickAndHoldThreshold WRITE setClickAndHoldThreshold NOTIFY clickAndHoldThresholdChanged) Q_PROPERTY(QQmlListProperty forwardTo READ forwardTo) Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged) //Added in 1.3, but we can't use REVISION because of QTBUG-40043 Q_PROPERTY(bool ignoreSynthesizedEvents MEMBER m_ignoreSynthesizedEvents NOTIFY ignoreSynthesizedEventsChanged) Q_ENUMS(Priority) public: enum Priority { BeforeItem, AfterItem }; explicit UCMouse(QObject *parent = 0); static UCMouse *qmlAttachedProperties(QObject *owner); bool isEnabled() const; virtual void setEnabled(bool enabled); Qt::MouseButtons acceptedButtons() const; bool hoverEnabled() const; int clickAndHoldThreshold() const; void setClickAndHoldThreshold(int threshold); QQmlListProperty forwardTo(); Priority priority() const; virtual void setPriority(Priority priority); Q_SIGNALS: void enabledChanged(); void acceptedButtonsChanged(); void hoverEnabledChanged(); void clickAndHoldThresholdChanged(); void priorityChanged(); void ignoreSynthesizedEventsChanged(); void pressed(QQuickMouseEvent *mouse, QQuickItem *host); void released(QQuickMouseEvent *mouse, QQuickItem *host); void clicked(QQuickMouseEvent *mouse, QQuickItem *host); void pressAndHold(QQuickMouseEvent *mouse, QQuickItem *host); void doubleClicked(QQuickMouseEvent *mouse, QQuickItem *host); void positionChanged(QQuickMouseEvent *mouse, QQuickItem *host); void entered(QQuickMouseEvent *event, QQuickItem *host); void exited(QQuickMouseEvent *event, QQuickItem *host); protected: virtual bool eventFilter(QObject *, QEvent *); virtual void timerEvent(QTimerEvent *event); virtual bool mouseEvents(QObject *target, QMouseEvent *event); virtual bool hoverEvents(QObject *target, QHoverEvent *event); virtual bool forwardedEvents(ForwardedEvent *event); virtual bool hasAttachedFilter(QQuickItem *item); void setHovered(bool hovered, QEvent *hoverEvent); bool mousePressed(QMouseEvent *event); bool mouseReleased(QMouseEvent *event); bool mouseDblClick(QMouseEvent *event); bool mouseMoved(QMouseEvent *event); bool hoverEntered(QHoverEvent *event); bool hoverMoved(QHoverEvent *event); bool hoverExited(QHoverEvent *event); virtual void saveEvent(QMouseEvent *event); bool isDoubleClickConnected(); bool isMouseEvent(QEvent::Type type); bool isHoverEvent(QEvent::Type type); bool forwardEvent(ForwardedEvent::EventType type, QEvent *event, QQuickMouseEvent *quickEvent); protected: QQuickItem *m_owner; QList m_forwardList; QBasicTimer m_pressAndHoldTimer; QRectF m_toleranceArea; QPointF m_lastPos; QPointF m_lastScenePos; Qt::MouseButton m_lastButton; Qt::MouseButtons m_lastButtons; Qt::KeyboardModifiers m_lastModifiers; Qt::MouseButtons m_pressedButtons; Priority m_priority; int m_moveThreshold; bool m_signalWhenContains:1; bool m_enabled: 1; bool m_moved:1; bool m_longPress:1; bool m_hovered:1; bool m_doubleClicked:1; bool m_ignoreSynthesizedEvents:1; }; QML_DECLARE_TYPEINFO(UCMouse, QML_HAS_ATTACHED_PROPERTIES) extern const int DefaultPressAndHoldDelay; #endif // UCMOUSE_H ./src/Ubuntu/Components/plugin/ucslotslayout.cpp0000644000015600001650000013336412700370714022242 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Andrea Bernabei */ #include #include #include "ucunits.h" #include "ucslotslayout.h" #include "ucslotslayout_p.h" /****************************************************************************** * UCSlotsLayoutPrivate */ UCSlotsLayoutPrivate::UCSlotsLayoutPrivate() : QQuickItemPrivate() , mainSlot(Q_NULLPTR) , m_parentItem(Q_NULLPTR) , maxSlotsHeight(0) , _q_cachedHeight(-1) , maxNumberOfLeadingSlots(1) , maxNumberOfTrailingSlots(2) { } UCSlotsLayoutPrivate::~UCSlotsLayoutPrivate() { } void UCSlotsLayoutPrivate::init() { Q_Q(UCSlotsLayout); _q_updateGuValues(); QObject::connect(&padding, SIGNAL(leadingChanged()), q, SLOT(_q_relayout())); QObject::connect(&padding, SIGNAL(trailingChanged()), q, SLOT(_q_relayout())); QObject::connect(&padding, SIGNAL(topChanged()), q, SLOT(_q_relayout())); QObject::connect(&padding, SIGNAL(bottomChanged()), q, SLOT(_q_relayout())); QObject::connect(UCUnits::instance(), SIGNAL(gridUnitChanged()), q, SLOT(_q_onGuValueChanged())); //FIXME (if possible): this will cause relayout to be called 4-5 times when the layout has "anchors.fill: parent" //defined on QML side QObject::connect(q, SIGNAL(widthChanged()), q, SLOT(_q_relayout())); //we connect height changes to a different function, because height changes only cause a relayout //in some cases (for instance when height goes from 0 to non 0) QObject::connect(q, SIGNAL(heightChanged()), q, SLOT(_q_updateCachedHeight())); QObject::connect(q, SIGNAL(visibleChanged()), q, SLOT(_q_relayout())); } UCSlotsLayoutPrivate::UCSlotPositioningMode UCSlotsLayoutPrivate::getVerticalPositioningMode() const { return (mainSlotHeight > maxSlotsHeight) ? UCSlotPositioningMode::AlignToTop : UCSlotPositioningMode::CenterVertically; } void UCSlotsLayoutPrivate::updateTopBottomPaddingIfNeeded() { if (!padding.topWasSetFromQml) { padding.setTop((getVerticalPositioningMode() == UCSlotPositioningMode::CenterVertically && maxSlotsHeight > UCUnits::instance()->gu(SLOTSLAYOUT_TOPBOTTOMMARGIN_SIZETHRESHOLD_GU)) ? UCUnits::instance()->gu(SLOTSLAYOUT_TOPMARGIN1_GU) : UCUnits::instance()->gu(SLOTSLAYOUT_TOPMARGIN2_GU)); } if (!padding.bottomWasSetFromQml) { padding.setBottom((getVerticalPositioningMode() == UCSlotPositioningMode::CenterVertically && maxSlotsHeight > UCUnits::instance()->gu(SLOTSLAYOUT_TOPBOTTOMMARGIN_SIZETHRESHOLD_GU)) ? UCUnits::instance()->gu(SLOTSLAYOUT_BOTTOMMARGIN1_GU) : UCUnits::instance()->gu(SLOTSLAYOUT_BOTTOMMARGIN2_GU)); } return; } bool UCSlotsLayoutPrivate::skipSlot(QQuickItem *slot) { if (slot == Q_NULLPTR) { qFatal("skipSlot: NULL POINTER!"); } //these are the same conditions Row uses, we don't want //to check opacity because that may be used for animations, //We don't want to relayout if the opacity reaches 0 during an //animation, for instance. return slot->height() <= 0 || slot->width() <= 0 || !slot->isVisible(); } void UCSlotsLayoutPrivate::insertSlotIntoSortedList(QQuickItem *slot, UCSlotsLayout::UCSlotPosition desiredSlotPosition, QList &slotsList) { if (slot == Q_NULLPTR) { qFatal("insertSlotIntoSortedList: INVALID POINTER!"); } //linear search, as these lists will be very short int i = 0; const int size = slotsList.length(); for (i = 0; i < size; ++i) { UCSlotsAttached *attachedProperty = qobject_cast(qmlAttachedPropertiesObject(slotsList.at(i))); if (!attachedProperty) { Q_Q(UCSlotsLayout); qmlInfo(q) << "Invalid attached property!"; return; } if (attachedProperty->position() > desiredSlotPosition) { break; } } slotsList.insert(i, slot); } void UCSlotsLayoutPrivate::addSlot(QQuickItem *slot) { if (slot == Q_NULLPTR) { qFatal("addSlot: INVALID POINTER!"); } Q_Q(UCSlotsLayout); UCSlotsAttached *attachedProperty = qobject_cast(qmlAttachedPropertiesObject(slot)); if (!attachedProperty) { qmlInfo(q) << "Invalid attached property!"; return; } if (attachedProperty->position() <= 0) { insertSlotIntoSortedList(slot, attachedProperty->position(), leadingSlots); } else { insertSlotIntoSortedList(slot, attachedProperty->position(), trailingSlots); } } void UCSlotsLayoutPrivate::removeSlot(QQuickItem *slot) { if (slot == Q_NULLPTR) { qFatal("addSlot: INVALID POINTER!"); } Q_Q(UCSlotsLayout); UCSlotsAttached *attachedProperty = qobject_cast(qmlAttachedPropertiesObject(slot)); if (!attachedProperty) { qmlInfo(q) << "Invalid attached property!"; return; } if (attachedProperty->position() <= 0) { leadingSlots.removeAll(slot); } else { trailingSlots.removeAll(slot); } } void UCSlotsLayoutPrivate::_q_onGuValueChanged() { _q_updateCachedMainSlotHeight(); _q_updateSlotsBBoxHeight(); _q_updateGuValues(); } void UCSlotsLayoutPrivate::_q_updateCachedHeight() { Q_Q(UCSlotsLayout); if (_q_cachedHeight != q->height()) { if (qIsNull(_q_cachedHeight)) { _q_relayout(); } _q_cachedHeight = q->height(); } } void UCSlotsLayoutPrivate::_q_updateGuValues() { if (!padding.leadingWasSetFromQml) { padding.setLeading(UCUnits::instance()->gu(SLOTSLAYOUT_LEFTMARGIN_GU)); } if (!padding.trailingWasSetFromQml) { padding.setTrailing(UCUnits::instance()->gu(SLOTSLAYOUT_RIGHTMARGIN_GU)); } updateTopBottomPaddingIfNeeded(); _q_updateSize(); } void UCSlotsLayoutPrivate::_q_updateCachedMainSlotHeight() { //if the component is not ready the QML properties may not have been evaluated yet, //it's not worth doing anything if that's the case if (!componentComplete) return; Q_Q(UCSlotsLayout); if (mainSlot) { UCSlotsAttached *attachedProperty = qobject_cast(qmlAttachedPropertiesObject(mainSlot)); if (!attachedProperty) { qmlInfo(q) << "Invalid attached property!"; mainSlotHeight = 0; return; } mainSlotHeight = mainSlot->height() + attachedProperty->padding()->top() + attachedProperty->padding()->bottom(); } else { mainSlotHeight = 0; } updateTopBottomPaddingIfNeeded(); _q_updateSize(); } void UCSlotsLayoutPrivate::_q_updateSlotsBBoxHeight() { if (!componentComplete) return; Q_Q(UCSlotsLayout); qreal maxSlotsHeightTmp = 0; const int numOfLeading = leadingSlots.count(); const int numOfTrailing = trailingSlots.count(); int numOfLeadingToLayout = 0; int numOfTrailingToLayout = 0; //instead of having 2 cycles we only make one which iterates over both lists for (int i = 0; i < numOfLeading + numOfTrailing; i++) { QQuickItem *child = i < numOfLeading ? leadingSlots.at(i) : trailingSlots.at(i - numOfLeading); bool skipSlotFlag = skipSlot(child); if (i < numOfLeading) { if (numOfLeadingToLayout >= maxNumberOfLeadingSlots) { skipSlotFlag = true; } else { if (!skipSlotFlag) numOfLeadingToLayout++; } } else { if (numOfTrailingToLayout >= maxNumberOfTrailingSlots) { skipSlotFlag = true; } else { if (!skipSlotFlag) numOfTrailingToLayout++; } } if (!skipSlotFlag) { UCSlotsAttached *attachedProperty = qobject_cast(qmlAttachedPropertiesObject(child)); if (!attachedProperty) { qmlInfo(q) << "Invalid attached property!"; continue; } //ignore children which have custom vertical positioning if (!attachedProperty->overrideVerticalPositioning()) maxSlotsHeightTmp = qMax(maxSlotsHeightTmp, child->height() + attachedProperty->padding()->top() + attachedProperty->padding()->bottom()); } } maxSlotsHeight = maxSlotsHeightTmp; updateTopBottomPaddingIfNeeded(); _q_updateSize(); } void UCSlotsLayoutPrivate::_q_updateSize() { if (!componentComplete) return; Q_Q(UCSlotsLayout); q->setImplicitWidth(parentItem ? parentItem->width() : UCUnits::instance()->gu(IMPLICIT_SLOTSLAYOUT_WIDTH_GU)); q->setImplicitHeight(qMax(maxSlotsHeight, mainSlotHeight) + padding.top() + padding.bottom()); _q_relayout(); } void UCSlotsLayoutPrivate::_q_onSlotWidthChanged() { Q_Q(UCSlotsLayout); QQuickItem *slot = qobject_cast(q->sender()); if (slot == Q_NULLPTR) { qFatal("onSlotWidthChanged: NULL SLOT"); } //if the width is 0, we should also update the max slots height //as this item is now considered as if it were !visible if (!slot->width()) { _q_updateSlotsBBoxHeight(); } else { _q_relayout(); } } void UCSlotsLayoutPrivate::_q_onSlotOverrideVerticalPositioningChanged() { Q_Q(UCSlotsLayout); UCSlotsAttached *sender = qobject_cast(q->sender()); if (sender == Q_NULLPTR) { qFatal("onSlotOverrideVerticalPositioningChanged: NULL SENDER"); } QQuickItem *slot = qobject_cast(sender->parent()); if (slot == Q_NULLPTR) { qFatal("onSlotOverrideVerticalPositioningChanged: NULL SLOT"); } QQuickAnchors *slotAnchors = QQuickItemPrivate::get(slot)->anchors(); slotAnchors->resetTop(); slotAnchors->resetTopMargin(); slotAnchors->resetBottom(); slotAnchors->resetBottomMargin(); slotAnchors->resetVerticalCenter(); slotAnchors->setVerticalCenterOffset(0); slotAnchors->resetFill(); slotAnchors->resetCenterIn(); //resetting anchors doesn't also reset the position slot->setY(0); _q_updateSlotsBBoxHeight(); } void UCSlotsLayoutPrivate::_q_onSlotPositionChanged() { Q_Q(UCSlotsLayout); UCSlotsAttached *sender = qobject_cast(q->sender()); if (sender == Q_NULLPTR) { qDebug() << "onSlotPositionChanged: NULL SENDER"; return; } QQuickItem *slot = qobject_cast(sender->parent()); if (slot == Q_NULLPTR) { qDebug() << "onSlotPositionChanged: NULL SLOT"; return; } //The slot may have changed position within the same group of slots //(i.e. it is still a leading or still a trailing slot) or it may //have switched from one group to the other. In any case, //remove the slot and add it back in the correct place. //We remove it from both the arrays as we don't know what its old //position was leadingSlots.removeAll(slot); trailingSlots.removeAll(slot); addSlot(slot); _q_relayout(); } void UCSlotsLayoutPrivate::setupSlotsVerticalPositioning(QQuickItem *slot, UCSlotsAttached* attached) { if (slot == Q_NULLPTR) return; UCSlotsAttached* attachedProps = attached; if (attached == Q_NULLPTR) { attachedProps = qobject_cast(qmlAttachedPropertiesObject(slot)); if (attachedProps == Q_NULLPTR) { Q_Q(UCSlotsLayout); qmlInfo(q) << "Invalid attached property!"; return; } } QQuickAnchors *slotAnchors = QQuickItemPrivate::get(slot)->anchors(); if (getVerticalPositioningMode() == UCSlotPositioningMode::AlignToTop) { //reset the vertical anchor as we might be transitioning from the configuration //where all items are vertically centered to the one where they're anchored to top slotAnchors->resetVerticalCenter(); slotAnchors->setVerticalCenterOffset(0); slotAnchors->setTop(top()); slotAnchors->setTopMargin(padding.top() + attachedProps->padding()->top()); } else { slotAnchors->resetTop(); slotAnchors->setVerticalCenter(verticalCenter()); //bottom and top offsets could have different values qreal offset = (padding.top() - padding.bottom() + attachedProps->padding()->top() - attachedProps->padding()->bottom()) / 2.0; slotAnchors->setVerticalCenterOffset(offset); } } void UCSlotsLayoutPrivate::layoutInRow(qreal siblingAnchorMargin, QQuickAnchorLine siblingAnchor, QList &items) { Q_Q(UCSlotsLayout); const int size = items.length(); for (int i = 0; i < size; i++) { QQuickItem *item = items.at(i); QQuickAnchors *itemAnchors = QQuickItemPrivate::get(item)->anchors(); UCSlotsAttached *attached = qobject_cast(qmlAttachedPropertiesObject(item)); if (!attached) { qmlInfo(q) << "Invalid attached property!"; continue; } if (!attached->overrideVerticalPositioning()) { setupSlotsVerticalPositioning(item, attached); } if (i == 0) { //skip anchoring if the anchor given as input is invalid if (siblingAnchor.item == Q_NULLPTR) continue; itemAnchors->setLeft(siblingAnchor); itemAnchors->setLeftMargin(attached->padding()->leading() + siblingAnchorMargin); } else { UCSlotsAttached *attachedPreviousItem = qobject_cast(qmlAttachedPropertiesObject(items.at(i - 1))); if (!attachedPreviousItem) { qmlInfo(q) << "Invalid attached property!"; } else { itemAnchors->setLeft(QQuickItemPrivate::get(items.at(i - 1))->right()); itemAnchors->setLeftMargin(attachedPreviousItem->padding()->trailing() + attached->padding()->leading()); } } } } void UCSlotsLayoutPrivate::_q_relayout() { Q_Q(UCSlotsLayout); //only relayout after the component has been initialized if (!componentComplete) return; if (q->width() <= 0 || q->height() <= 0 || !q->isVisible() || !q->opacity()) { return; } //total width of the slots that we're going to do the layout of. //this excludes mainSlot and the slots which have been skipped because //they're !visible or similar conditions qreal totalSlotsWidth = 0; //let's check the current visibility of our children and skip the //invisible slots QList itemsToLayout; const int numOfLeading = leadingSlots.count(); const int numOfTrailing = trailingSlots.count(); int numOfLeadingToLayout = 0; int numOfTrailingToLayout = 0; //instead of having 2 cycles we only make one which iterates over both lists for (int i = 0; i < numOfLeading + numOfTrailing; i++) { QQuickItem *child = i < numOfLeading ? leadingSlots.at(i) : trailingSlots.at(i - numOfLeading); bool skipSlotFlag = skipSlot(child); if (i < numOfLeading) { if (numOfLeadingToLayout >= maxNumberOfLeadingSlots) { skipSlotFlag = true; qmlInfo(q) << "This layout only allows up to " << maxNumberOfLeadingSlots << " leading slots. Please remove any additional leading slot."; } else { if (!skipSlotFlag) numOfLeadingToLayout++; } } else { if (numOfTrailingToLayout >= maxNumberOfTrailingSlots) { skipSlotFlag = true; qmlInfo(q) << "This layout only allows up to " << maxNumberOfTrailingSlots << " trailing slots. Please remove any additional trailing slot."; } else { if (!skipSlotFlag) numOfTrailingToLayout++; } } if (!skipSlotFlag) { itemsToLayout.append(child); UCSlotsAttached *attached = qobject_cast(qmlAttachedPropertiesObject(child)); if (!attached) { qmlInfo(q) << "Invalid attached property!"; continue; } totalSlotsWidth += child->width() + attached->padding()->leading() + attached->padding()->trailing(); } } if (mainSlot) { //insert between leading and trailing itemsToLayout.insert(numOfLeadingToLayout, mainSlot); UCSlotsAttached *attachedProps = qobject_cast(qmlAttachedPropertiesObject(mainSlot)); if (!attachedProps) { qmlInfo(q) << "Invalid attached property!"; return; } mainSlot->setImplicitWidth(q->width() - totalSlotsWidth - attachedProps->padding()->leading() - attachedProps->padding()->trailing() - padding.leading() - padding.trailing()); } layoutInRow(padding.leading(), left(), itemsToLayout); } void UCSlotsLayoutPrivate::handleAttachedPropertySignals(QQuickItem *item, bool connect) { if (item == Q_NULLPTR) { qDebug() << "handleAttachedPropertySignals: INVALID POINTER!"; return; } Q_Q(UCSlotsLayout); UCSlotsAttached *attachedSlot = qobject_cast(qmlAttachedPropertiesObject(item)); if (!attachedSlot) { qmlInfo(q) << "Invalid attached property!"; return; } if (connect) { QObject::connect(attachedSlot->padding(), SIGNAL(leadingChanged()), q, SLOT(_q_relayout())); QObject::connect(attachedSlot->padding(), SIGNAL(trailingChanged()), q, SLOT(_q_relayout())); if (item != mainSlot) { QObject::connect(attachedSlot, SIGNAL(positionChanged()), q, SLOT(_q_onSlotPositionChanged())); QObject::connect(attachedSlot->padding(), SIGNAL(topChanged()), q, SLOT(_q_updateSlotsBBoxHeight())); QObject::connect(attachedSlot->padding(), SIGNAL(bottomChanged()), q, SLOT(_q_updateSlotsBBoxHeight())); QObject::connect(attachedSlot, SIGNAL(overrideVerticalPositioningChanged()), q, SLOT(_q_onSlotOverrideVerticalPositioningChanged())); } else { QObject::connect(attachedSlot->padding(), SIGNAL(topChanged()), q, SLOT(_q_updateCachedMainSlotHeight())); QObject::connect(attachedSlot->padding(), SIGNAL(bottomChanged()), q, SLOT(_q_updateCachedMainSlotHeight())); //we ignore changes in overrideVerticalPositioning and position for the main slot //QObject::connect(attachedSlot, SIGNAL(overrideVerticalPositioningChanged()), q, SLOT(_q_updateCachedMainSlotHeight())); //QObject::disconnect(attachedSlot, SIGNAL(positionChanged()), q, SLOT(_q_onSlotPositionChanged())); } } else { QObject::disconnect(attachedSlot->padding(), SIGNAL(leadingChanged()), q, SLOT(_q_relayout())); QObject::disconnect(attachedSlot->padding(), SIGNAL(trailingChanged()), q, SLOT(_q_relayout())); if (item != mainSlot) { QObject::disconnect(attachedSlot, SIGNAL(positionChanged()), q, SLOT(_q_onSlotPositionChanged())); QObject::disconnect(attachedSlot->padding(), SIGNAL(topChanged()), q, SLOT(_q_updateSlotsBBoxHeight())); QObject::disconnect(attachedSlot->padding(), SIGNAL(bottomChanged()), q, SLOT(_q_updateSlotsBBoxHeight())); QObject::disconnect(attachedSlot, SIGNAL(overrideVerticalPositioningChanged()), q, SLOT(_q_updateSlotsBBoxHeight())); } else { QObject::disconnect(attachedSlot->padding(), SIGNAL(topChanged()), q, SLOT(_q_updateCachedMainSlotHeight())); QObject::disconnect(attachedSlot->padding(), SIGNAL(bottomChanged()), q, SLOT(_q_updateCachedMainSlotHeight())); //we ignore changes in overrideVerticalPositioning and positiong for the main slot //QObject::disconnect(attachedSlot, SIGNAL(overrideVerticalPositioningChanged()), q, SLOT(_q_updateCachedMainSlotHeight())); //QObject::disconnect(attachedSlot, SIGNAL(positionChanged()), q, SLOT(_q_onSlotPositionChanged())); } } } /*! \qmltype SlotsLayout \instantiates UCSlotsLayout \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu-slotslayout \inherits Item \since Ubuntu.Components 1.3 \brief The SlotsLayout component provides an easy way to layout a list of user-interface elements horizontally following Ubuntu design standards. We call the elements which we want to layout "slots". \b {Slots} is just another name for SlotsLayout's \b {visual children}. SlotsLayout will layout its children according to Ubuntu's visual design rules, providing automatic spacing and positioning (both horizontal and vertical, unless \l overrideVerticalPositioning is set) for each of them. \b {If you're building list items,} we recommend to use \l {ListItemLayout}, as it is designed to accomodate up to 3 labels that follow our UI standards. \sa ListItemLayout There are three conceptual types of slots: \list \li The \b {leading slots}, which are the ones positioned at the beginning of the layout (i.e. they are the leftmost elements in left-to-right locales). \li The \b {trailing slots}, which are positioned after \l mainSlot, if any, or after the leading slots otherwise. \li The \b {main slot}, which drives the positioning of the vertical dimension of each slot as described in section \l {Automatic vertical positioning of slots}. This slot sits between leading and trailing slots, and can be set using the property \l mainSlot. \endlist In order to comply with Ubuntu design standards, this component hosts a maximum of 1 leading and 2 trailing slots. The layout algorithm will ignore any additional item. SlotsLayout also provides a series of properties which are attached to each slot. However not all properties are valid in all the circumstances. These properties allow an easy tweaking of slot's positioning within the layout. \l {SlotsLayout::position} can be used to set whether a slot should be a leading or trailing one. \l {SlotsLayout::padding} can be used to tweak the padding around a slot. \l {SlotsLayout::overrideVerticalPositioning} allows to disable the automatic positioning of the vertical coordinate of a slot as described in \l {Automatic vertical positioning of slots}, in case a custom behaviour is needed. The following example shows a very simple SlotsLayout with an \l Icon as leading slot, and a \l CheckBox as trailing slot. There is no need to specify any size or margin, everything is handled automatically by the layout component. \qml SlotsLayout { mainSlot: Label { text: "Hello developers!" } CheckBox { SlotsLayout.position: SlotsLayout.Trailing } Icon { name: "message" SlotsLayout.position: SlotsLayout.Leading; width: units.gu(2) } } \endqml The positioning of each slot should only be tweaked using its attached properties. Just like when using QtQuick's Row, a child item within the layout should not set its \b x or \b anchors affecting the horizontal positioning (left, right, horizontalCenter, centerIn, fill). If you need to perform these actions, consider positioning the items without the use of a SlotsLayout. The vertical \b anchors of a slot can be modified, \b {provided that} \l {SlotsLayout::overrideVerticalPositioning} for that slot is set. More about this in the \l {Advanced layout tweaks} section. \section1 Resizing the layout SlotsLayout's \b {implicit width} is by default set to the width of the parent (usually a \l ListItem). Changing the width of the layout is possible but should not be needed in most of the usecases: keeping the width in sync with the width of its parent allows the user interface to be scalable across devices with varying resolution and form factors. The \b {implicit height} is not fixed either. In order not to clip any of the slots, the SlotsLayout adapts to accomodate its highest slot with padding and the padding around the layout. Because of the above, it is recommended to have items wrapping the layout bind to SlotsLayout's \b {height} (adding ListItem \b divider's height if needed), not the opposite. It is not recommended, for instance, to use anchors.fill to force SlotsLayout to fill another Item, because that item might not have enough space to accomdate all the slots, and therefore the slots will be clipped. \qml ListItem { //CORRECT height: layout.height + divider.height SlotsLayout { id: layout //WRONG //anchors.fill: parent mainSlot: Label { text: "Hello developers!" } CheckBox { SlotsLayout.position: SlotsLayout.Trailing } } } \endqml Manually resizing SlotsLayout (or \l ListItemLayout) is usually not needed and we recommend to avoid it, as the component will already take care of doing the job for you. The following example shows what a standard SlotsLayout should look like: \qml SlotsLayout { mainSlot: Label { text: "Hello developers!" } //just an example of something inside SlotsLayout CheckBox { SlotsLayout.position: SlotsLayout.Trailing } } \endqml \section1 Automatic vertical positioning of slots In order to provide a visually pleasing and consistent layout across the whole platform, SlotsLayout automatically handles the vertical positioning of its slots so that they comply with the following rules: \list \li if there's any slot which is taller or as tall as \l {mainSlot} or if no \l {mainSlot} is defined, all slots will be \b {vertically centered} within the layout (still taking \l {SlotsLayout::padding.top} and \l {SlotsLayout::padding.bottom} into account). \image SlotsLayout_centerVertically.png \li \b{Otherwise}, all the slots (including \l {mainSlot}) will be \b {aligned to the top} of the layout with a padding of \l {SlotsLayout::padding.top} plus the top padding of the slot, defined in its attached properties. \image SlotsLayout_alignToTop.png \endlist Even though it is \b {not recommended}, it is still possible to override this behaviour on a slot-by-slot basis by setting \l {SlotsLayout::overrideVerticalPositioning} to true. This is described in \l {Advanced layout tweaks}. \section1 Input handling The purpose of SlotsLayout is to position its slots following the rules defined in \l {Automatic vertical positioning of slots}. There are two recommended ways to implement input handling: the first one, in case the target is to create a list item, is to put the \l SlotsLayout (or any derived component, like \l {ListItemLayout}) inside a \l {ListItem}, and use ListItem's onClicked handler to handle clicks and taps. \qml ListItem { height: layout.height + divider.height onClicked: console.log("clicked!") SlotsLayout { id: layout mainSlot: Label { text: "Hello developers!" } //just an example of something inside SlotsLayout CheckBox { SlotsLayout.position: SlotsLayout.Trailing } } } \endqml The second option is to use a MouseArea as a wrapper around SlotsLayout, as the following code demonstrates: \qml MouseArea { anchors.left: parent.left anchors.right: parent.right height: layout.height onClicked: console.log("clicked!") SlotsLayout { id: layout mainSlot: Label { text: "Hello developers!" } //just an example of something inside SlotsLayout CheckBox { SlotsLayout.position: SlotsLayout.Trailing } } } \endqml \b {Note}: as recommended in \l {Resizing the layout}, since SlotsLayout has a dynamic height, it is important to have the parent item's height (in this case MouseArea) follow SlotsLayout's \b {height}, and not the opposite, to avoid getting the slots clipped out of the layout. \section1 Advanced layout tweaks The automatic layout provided by SlotsLayout is designed to cover most of the usecases. There could be times, however, where you might want to tweak the positioning of one particular slot. A slot can set its attached properties \l SlotsLayout::padding and \l {SlotsLayout::overrideVerticalPositioning} to reach the desired position. When a slot enables \l {SlotsLayout::overrideVerticalPositioning}, it gains control over its vertical anchors (top, bottom, verticalCenter). Moreover, SlotsLayout will ignore the height of that slot in the following computations of its implicitHeight (see \l {Resizing the layout}). When manually positioning a slot, care must be taken to avoid pushing the slot outside of the layout perimeter, to avoid getting it clipped. The following example shows a SlotsLayout which has both custom padding and a slot which uses custom vertical positioning: \qml SlotsLayout { id: layout mainSlot: Label { id: label; text: "Hello developers!" } padding { top: units.gu(3) bottom: units.gu(3) } CheckBox { anchors.top: label.top SlotsLayout.position: SlotsLayout.Trailing SlotsLayout.overrideVerticalPositioning: true } } \endqml It is also possible to sort the slots in a relative fashion, by using positions such as SlotsLayout.Leading+1, for instance, if we want that slot to always be positioned after items with position SlotsLayout.Leading. This is particularly useful, for example, when subclassing SlotsLayout-based components which already have predefined slots inside them. If, for instance, the component we're subclassing has a slot with position SlotsLayout.Trailing, we can add a slot to our subclass with position SlotsLayout.Trailing-1 if we want to make sure our slot is always positioned before the one in the component we are deriving from. This scenario is shown in the following example code: \qml //ExampleLayout.qml SlotsLayout { id: layout mainSlot: Label { id: label; text: "Hello developers!" } CheckBox { SlotsLayout.position: SlotsLayout.Trailing } } \endqml \qml //DerivedLayout.qml ExampleLayout { id: derivedLayout Icon { id: newSlot width: units.gu(2) name: "message" SlotsLayout.position: SlotsLayout.Trailing - 1 } } \endqml */ UCSlotsLayout::UCSlotsLayout(QQuickItem *parent) : QQuickItem(*(new UCSlotsLayoutPrivate), parent) { setFlag(ItemHasContents); setFlag(ItemIsFocusScope); Q_D(UCSlotsLayout); d->init(); } void UCSlotsLayout::componentComplete() { Q_D(UCSlotsLayout); QQuickItem::componentComplete(); d->_q_updateCachedMainSlotHeight(); d->_q_updateSlotsBBoxHeight(); } void UCSlotsLayout::itemChange(ItemChange change, const ItemChangeData &data) { Q_D(UCSlotsLayout); //declare vars outside switch to prevent "crosses initialization of" compile error QQuickItem *newParent = Q_NULLPTR; switch (change) { case ItemChildAddedChange: if (data.item) { d->handleAttachedPropertySignals(data.item, true); //An item disappearing/reappearing could change the maximum height of the slots //_q_updateSlotsBBoxHeight will trigger relayout QObject::connect(data.item, SIGNAL(visibleChanged()), this, SLOT(_q_updateSlotsBBoxHeight())); if (data.item != d->mainSlot) { d->addSlot(data.item); //we relayout because we have to update the width of the main slot //FIXME: do this in a separate function? do were really have to do the whole relayout? QObject::connect(data.item, SIGNAL(widthChanged()), this, SLOT(_q_onSlotWidthChanged())); QObject::connect(data.item, SIGNAL(heightChanged()), this, SLOT(_q_updateSlotsBBoxHeight())); d->_q_updateSlotsBBoxHeight(); } else { QObject::connect(data.item, SIGNAL(heightChanged()), this, SLOT(_q_updateCachedMainSlotHeight())); d->_q_updateCachedMainSlotHeight(); } } break; case ItemChildRemovedChange: if (data.item) { d->handleAttachedPropertySignals(data.item, false); //This wouldn't be needed if the child is destroyed, but we can't know what, we just know //that it's changing parent, so we still disconnect from all the signals manually QObject::disconnect(data.item, SIGNAL(visibleChanged()), this, SLOT(_q_relayout())); if (data.item != d->mainSlot) { d->removeSlot(data.item); QObject::disconnect(data.item, SIGNAL(widthChanged()), this, SLOT(_q_onSlotWidthChanged())); QObject::disconnect(data.item, SIGNAL(heightChanged()), this, SLOT(_q_updateSlotsBBoxHeight())); d->_q_updateSlotsBBoxHeight(); } else { QObject::disconnect(data.item, SIGNAL(heightChanged()), this, SLOT(_q_updateCachedMainSlotHeight())); d->_q_updateCachedMainSlotHeight(); } } break; case ItemParentHasChanged: newParent = data.item; if (newParent) { if (d->m_parentItem) { QObject::disconnect(d->m_parentItem, SIGNAL(widthChanged()), this, SLOT(_q_updateSize())); } d->m_parentItem = newParent; QObject::connect(newParent, SIGNAL(widthChanged()), this, SLOT(_q_updateSize()), Qt::DirectConnection); d->_q_updateSize(); } break; default: break; } QQuickItem::itemChange(change, data); } /*! \qmlproperty Item SlotsLayout::mainSlot This property represents the main slot of the layout. By default, SlotsLayout has no mainSlot set. The main slot is the one that defines the vertical positioning of the other slots. Because of this, changing its position and overrideVerticalPositioning attached properties has no effect. More details can be found in the section \l {Automatic vertical positioning of slots}. \b {Note}: because of limitations in QtQuick/QML, it is not possible to initialize \l mainSlot's attached properties. Setting \l mainSlot's attached properties has to be done via JS, for example inside Component.onCompleted, as shown in the following example: \qml SlotsLayout { id: layout Component.onCompleted: { mainSlot.SlotsLayout.padding.leading = Qt.binding(function() { return units.gu(5) }) } mainSlot: Label { id: label; text: "Hello developers!" } CheckBox { anchors.top: label.top SlotsLayout.position: SlotsLayout.Trailing SlotsLayout.overrideVerticalPositioning: true } } \endqml */ QQuickItem *UCSlotsLayout::mainSlot() { Q_D(const UCSlotsLayout); return d->mainSlot; } QQuickItem *UCSlotsLayout::mainSlot() const { Q_D(const UCSlotsLayout); return d->mainSlot; } void UCSlotsLayout::setMainSlot(QQuickItem *item, bool fireSignal) { Q_D(UCSlotsLayout); if (d->mainSlot != item && item != Q_NULLPTR) { //if it is not handled by GC, delete the old main slot if (d->mainSlot != Q_NULLPTR && QQmlEngine::objectOwnership(d->mainSlot) == QQmlEngine::CppOwnership) { delete d->mainSlot; d->mainSlot = Q_NULLPTR; } d->mainSlot = item; d->mainSlot->setParentItem(this); if (fireSignal) { Q_EMIT mainSlotChanged(); } } } /*! \qmlpropertygroup ::SlotsLayout::padding \qmlproperty real SlotsLayout::padding.top \qmlproperty real SlotsLayout::padding.bottom \qmlproperty real SlotsLayout::padding.leading \qmlproperty real SlotsLayout::padding.trailing This property defines the padding around the bounding box which holds all the slots. The default value for padding.leading is 1 Grid Unit. The default value for padding.trailing is 1 Grid Unit. The value of padding.top and padding.bottom depends on the size of the slots which are in the layout: \list \li if, according to the rules defined in \l {Automatic vertical positioning of slots}, the slots are supposed to align to the top of the layout, padding.top and padding.bottom will have a value of \b{2} Grid Units. \li otherwise, if according to the rules defined in \l {Automatic vertical positioning of slots} the slots are supposed to be vertically centered in the layout, \b {and} the tallest slot (\l {mainSlot} excluded) has a height of at least 4 Grid Units, padding.top and padding.bottom will be set to \b{1} Grid Unit. \endlist \b {Note}: the automatic handling of padding.top and padding.bottom is disabled once either padding.top or padding.bottom is set to a custom value. */ UCSlotsLayoutPadding* UCSlotsLayout::padding() { Q_D(UCSlotsLayout); return &(d->padding); } /****************************************************************************** * UCSlotsAttachedPrivate */ UCSlotsAttachedPrivate::UCSlotsAttachedPrivate() : QObjectPrivate() , position(UCSlotsLayout::Trailing) , overrideVerticalPositioning(false) { } void UCSlotsAttachedPrivate::_q_onGuValueChanged() { if (!padding.leadingWasSetFromQml) padding.setLeading(UCUnits::instance()->gu(SLOTSLAYOUT_SLOTS_SIDEMARGINS_GU)); if (!padding.trailingWasSetFromQml) padding.setTrailing(UCUnits::instance()->gu(SLOTSLAYOUT_SLOTS_SIDEMARGINS_GU)); if (!padding.topWasSetFromQml) padding.setTop(UCUnits::instance()->gu(SLOTSLAYOUT_SLOTS_TOPBOTTOMMARGINS_GU)); if (!padding.bottomWasSetFromQml) padding.setBottom(UCUnits::instance()->gu(SLOTSLAYOUT_SLOTS_TOPBOTTOMMARGINS_GU)); } /****************************************************************************** * UCSlotsAttached */ UCSlotsAttached::UCSlotsAttached(QObject *object) : QObject(*(new UCSlotsAttachedPrivate), object) { Q_D(UCSlotsAttached); d->_q_onGuValueChanged(); QObject::connect(UCUnits::instance(), SIGNAL(gridUnitChanged()), this, SLOT(_q_onGuValueChanged())); } /*! \qmlattachedproperty enumeration SlotsLayout::position This attached property defines the relative position of the slot inside the layout. It is attached to each slot. The default value is SlotsLayout.Trailing. Valid values for \l position are: \list \li SlotsLayout.First: the slot will be positioned at the beginning of the layout \li SlotsLayout.Leading: the slot will be positioned in the leading slots \li SlotsLayout.Trailing: the slot will be positioned in the trailing slots, i.e. the one towards the end of the layout. \li SlotsLayout.Last: the slot will be positioned at the end of the layout. \endlist \l {ProgressionSlot}, for instance, has its position set to SlotsLayout.Last, in order to make sure the chevron is always displayed as the last trailing slot. Whenever there are more slots with the same \l {SlotsLayout::position}, they will be positioned following the order in which they were added to the layout. It is also possible to define relative positioning between the slots, by using values such as SlotsLayout.Leading+1, or SlotsLayout.Trailing-3. More about this in \l {Advanced layout tweaks}. \b Note: you can only change the position of standard slots. Changing the position of \l mainSlot has no effect. */ UCSlotsLayout::UCSlotPosition UCSlotsAttached::position() const { Q_D(const UCSlotsAttached); return d->position; } void UCSlotsAttached::setPosition(UCSlotsLayout::UCSlotPosition pos) { Q_D(UCSlotsAttached); if (d->position != pos) { d->position = pos; Q_EMIT positionChanged(); } } /*! \qmlattachedproperty QtObject ::SlotsLayout::padding While SlotsLayout's padding property defines the padding around the whole layout, this attached property defines the padding around the slot it is attached to. It is a grouped property that exposes the properties padding.top, padding.bottom, padding.leading, padding.trailing. The default value for SlotsLayout.padding.top is 0. The default value for SlotsLayout.padding.bottom is 0. The default value for SlotsLayout.padding.leading is 1 Grid Unit. The default value for SlotsLayout.padding.trailing is 1 Grid Unit. Please note that \b top and \b bottom paddings are only used when \l {SlotsLayout::overrideVerticalPositioning} is set to false. More about this in \l {Automatic vertical positioning of slots}. */ UCSlotsLayoutPadding *UCSlotsAttached::padding() { Q_D(UCSlotsAttached); return &d->padding; } /*! \qmlattachedproperty bool SlotsLayout::overrideVerticalPositioning This attached property holds whether the layout should automatically handle the vertical positioning of a slot. It is attached to every slot. The default value is \b {false}. If this property is set to true, the layout will ignore the corresponding slot during the computation of the \b implicitHeight of the whole layout (see \l {Resizing the layout}) and will not modify its vertical position during the layout process. As a consequence, it is possible, in that case, to manually set the vertical anchors of that slot (verticalCenter, top, bottom) or even its \b y property. Care must be taken to avoid getting the slot clipped by positioning it partly or completely outside of the SlotsLayout that holds it. \b {Note}: changing the value of overrideVerticalPositioning of one slot after the layout has already been initialized will reset its top, bottom, verticalCenter, fill, centerIn anchors for that slot, and the corresponding margins. Care must be taken to set the anchors to the desired values only after setting overrideVerticalPositioning. \b {Note}: this property is only valid for standard slots. Changing the value of \l mainSlot's overrideVerticalPositioning has no effect. */ bool UCSlotsAttached::overrideVerticalPositioning() const { Q_D(const UCSlotsAttached); return d->overrideVerticalPositioning; } void UCSlotsAttached::setOverrideVerticalPositioning(bool val) { Q_D(UCSlotsAttached); if (d->overrideVerticalPositioning != val) { d->overrideVerticalPositioning = val; Q_EMIT overrideVerticalPositioningChanged(); } } UCSlotsAttached *UCSlotsLayout::qmlAttachedProperties(QObject *object) { return new UCSlotsAttached(object); } UCSlotsLayoutPadding::UCSlotsLayoutPadding(QObject *parent) : QObject(parent) , leadingWasSetFromQml(false) , trailingWasSetFromQml(false) , topWasSetFromQml(false) , bottomWasSetFromQml(false) , m_leading(0) , m_trailing(0) , m_top(0) , m_bottom(0) { } qreal UCSlotsLayoutPadding::leading() const { return m_leading; } void UCSlotsLayoutPadding::setLeading(qreal val) { if (m_leading != val) { m_leading = val; Q_EMIT leadingChanged(); } } void UCSlotsLayoutPadding::setLeadingQml(qreal val) { leadingWasSetFromQml = true; setLeading(val); } qreal UCSlotsLayoutPadding::trailing() const { return m_trailing; } void UCSlotsLayoutPadding::setTrailing(qreal val) { if (m_trailing != val) { m_trailing = val; Q_EMIT trailingChanged(); } } void UCSlotsLayoutPadding::setTrailingQml(qreal val) { trailingWasSetFromQml = true; setTrailing(val); } qreal UCSlotsLayoutPadding::top() const { return m_top; } void UCSlotsLayoutPadding::setTop(qreal val) { if (m_top != val) { m_top = val; Q_EMIT topChanged(); } } void UCSlotsLayoutPadding::setTopQml(qreal val) { topWasSetFromQml = true; setTop(val); } qreal UCSlotsLayoutPadding::bottom() const { return m_bottom; } void UCSlotsLayoutPadding::setBottom(qreal val) { if (m_bottom != val) { m_bottom = val; Q_EMIT bottomChanged(); } } void UCSlotsLayoutPadding::setBottomQml(qreal val) { bottomWasSetFromQml = true; setBottom(val); } #include "moc_ucslotslayout.cpp" ./src/Ubuntu/Components/plugin/alarmmanager_p.h0000644000015600001650000000666312700370701021720 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef ALARMMANAGER_H #define ALARMMANAGER_H #include #include #include #include "ucalarm.h" class AlarmUtils { public: static QHash roles() { return instance().m_roles; } static QVariant roleData(int role, UCAlarm *alarm) { switch (role) { case 0: return alarm->message(); case 1: return alarm->date(); case 2: return alarm->type(); case 3: return static_cast(alarm->daysOfWeek()); case 4: return alarm->sound(); case 5: return alarm->enabled(); default: return QVariant::fromValue(alarm); } } static QDateTime normalizeDate(const QDateTime &dt) { QTime time = dt.time(); time.setHMS(time.hour(), time.minute(), time.second()); return QDateTime(dt.date(), time, dt.timeSpec()); } private: QHash m_roles; AlarmUtils() { int i = 0; m_roles.insert(i++, QByteArray("message")); m_roles.insert(i++, QByteArray("date")); m_roles.insert(i++, QByteArray("type")); m_roles.insert(i++, QByteArray("daysOfWeek")); m_roles.insert(i++, QByteArray("sound")); m_roles.insert(i++, QByteArray("enabled")); m_roles.insert(i++, QByteArray("model")); } static AlarmUtils &instance() { static AlarmUtils instance; return instance; } }; class AlarmRequest; class AlarmManagerPrivate; class AlarmRequestPrivate; class AlarmList; class AlarmManager : public QObject { Q_OBJECT public: enum Status { Ready = 1, Progress, Error }; enum Change { NoChange = 0, Enabled = 0x0001, Date = 0x0002, Message = 0x0004, Sound = 0x0008, Type = 0x0010, Days = 0x0020, AllFields = 0x00FF }; ~AlarmManager(); static AlarmManager &instance(); bool fetchAlarms(); int alarmCount(); UCAlarm *alarmAt(int index); UCAlarm *findAlarm(const QVariant &cookie) const; bool verifyChange(UCAlarm *alarm, Change change, const QVariant &newData); static UCAlarmPrivate *createAlarmData(UCAlarm *alarm); Q_SIGNALS: void alarmsRefreshStarted(); void alarmsRefreshed(); void alarmUpdated(int index); void alarmRemoveStarted(int index); void alarmRemoveFinished(); void alarmInsertStarted(int index); void alarmInsertFinished(); void alarmMoveStarted(int from, int to); void alarmMoveFinished(); private: explicit AlarmManager(QObject *parent = 0); Q_DISABLE_COPY(AlarmManager) friend class AlarmManagerPrivate; QScopedPointer d_ptr; }; #endif // ALARMMANAGER_H ./src/Ubuntu/Components/plugin/ucserviceproperties_p.h0000644000015600001650000000332712700370701023370 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCSERVICEPROPERTIES_P_H #define UCSERVICEPROPERTIES_P_H #include "ucserviceproperties.h" #include class UCServicePropertiesPrivate { public: UCServicePropertiesPrivate(UCServiceProperties *qq); virtual ~UCServicePropertiesPrivate(); static UCServicePropertiesPrivate *get(UCServiceProperties *service); void warning(const QString &message); void setError(const QString &msg); void setStatus(UCServiceProperties::Status status); virtual bool init() = 0; virtual bool fetchPropertyValues() = 0; virtual bool readProperty(const QString &property) = 0; virtual bool testProperty(const QString &property, const QVariant &value) = 0; // data UCServiceProperties *q_ptr; bool ready:1; UCServiceProperties::Status status; UCServiceProperties::ServiceType type; QString service; QString path; QString interface; QString adaptor; QString error; QStringList properties; }; UCServicePropertiesPrivate *createServicePropertiesAdapter(UCServiceProperties *owner); #endif // UCSERVICEPROPERTIES_P_H ./src/Ubuntu/Components/plugin/ucstyleditembase.cpp0000644000015600001650000004362312700370714022654 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "ucstyleditembase.h" #include "ucstyleditembase_p.h" #include "uctheme.h" #include "ucstylehints.h" #include "ucthemingextension.h" #include "ucnamespace.h" #include #include UCStyledItemBasePrivate::UCStyledItemBasePrivate() : oldParentItem(Q_NULLPTR) , styleComponent(Q_NULLPTR) , styleItem(Q_NULLPTR) , styleVersion(0) , keyNavigationFocus(false) , activeFocusOnPress(false) , wasStyleLoaded(false) , isFocusScope(true) { } bool UCStyledItemBase::keyNavigationFocus() const { Q_D(const UCStyledItemBase); return d->keyNavigationFocus; } bool UCStyledItemBase::activeFocusOnTab2() const { return activeFocusOnTab(); } void UCStyledItemBase::setActiveFocusOnTab2(bool v) { setActiveFocusOnTab(v); } UCStyledItemBasePrivate::~UCStyledItemBasePrivate() { } void UCStyledItemBasePrivate::init() { Q_Q(UCStyledItemBase); QObject::connect(q, &QQuickItem::activeFocusOnTabChanged, q, &UCStyledItemBase::activeFocusOnTabChanged2); } void UCStyledItemBasePrivate::setFocusable(bool focus) { Q_Q(UCStyledItemBase); q->setAcceptedMouseButtons(focus ? (Qt::LeftButton | Qt::RightButton | Qt::MiddleButton) : Qt::NoButton); q->setFiltersChildMouseEvents(focus); } bool UCStyledItemBasePrivate::isParentFocusable() { if (!activeFocusOnPress) { return false; } QQuickItem *pl = parentItem; while (pl) { UCStyledItemBase *scope = qobject_cast(pl); if (scope) { UCStyledItemBasePrivate *pscope = UCStyledItemBasePrivate::get(scope); return pscope->isParentFocusable(); } pl = pl->parentItem(); } return true; } /*! * \qmltype StyledItem * \instantiates UCStyledItemBase * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu * \since Ubuntu.Components 1.1 * \brief The StyledItem class allows items to be styled by the theme. * * StyledItem provides facilities for making an Item stylable by the theme. * * In order to make an Item stylable by the theme, it is enough to make the Item * inherit from StyledItem and set its \l style property to be the result of the * appropriate call to theme.createStyleComponent(). * * Example definition of a custom Item MyItem.qml: * \qml * StyledItem { * id: myItem * styleName: "MyItemStyle" * } * \endqml * * The style set on \l styleName is instantiated and placed below everything else * that the Item contains. When the style is defined in this way, the style is taken * from the current theme the StyledItem is themed with. Another way tpo set the * style of a component is to set the \l style property. This property expects a * component and it has precedence over the \l styleName, meaning that when both * \l styleName and \l style are set, the style will be created from the \l style * componment. * * A reference to the Item being styled is accessible from the style and named * 'styledItem'. * * \sa {Theme} */ UCStyledItemBase::UCStyledItemBase(QQuickItem *parent) : QQuickItem(*(new UCStyledItemBasePrivate), parent) , UCThemingExtension(this) { Q_D(UCStyledItemBase); d->init(); } UCStyledItemBase::UCStyledItemBase(UCStyledItemBasePrivate &dd, QQuickItem *parent) : QQuickItem(dd, parent) , UCThemingExtension(this) { Q_D(UCStyledItemBase); d->init(); } /*! * \qmlmethod void StyledItemBase::requestFocus(Qt::FocusReason reason) * \since Ubuntu.Components 1.1 * The function is similar to \c forceActiveFocus except that it sets focus only * if all the ancestors have activeFocusOnPressed set. Returns true if the request * succeeded. */ bool UCStyledItemBase::requestFocus(Qt::FocusReason reason) { Q_D(UCStyledItemBase); bool focusable = d->isParentFocusable(); if (focusable && isEnabled()) { QQuickItem::forceActiveFocus(reason); } return focusable; } /*! * \qmlproperty bool StyledItemBase::activeFocusOnPress * \since Ubuntu.Components 1.1 * * The property specifies whether the StyledItem can gain focus on a mouse * press/touch or not. When the value is true, the focus will be set on the component * when the mouse is pressed over it or touched. However if one of the component's * ancestor StyledItem or derived is having the property value false, the focus * will not be gained automatically. * * In the following example the TextField will stay focused when clicked on the * red rectangle. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * * Column { * width: units.gu(50) * height: units.gu(100) * * StyledItem { * objectName: "passiveScope" * width: parent.width * height: units.gu(30) * Rectangle { * anchors.fill: parent * color: "red" * StyledItem { * objectName: "activeScope" * activeFocusOnPress: true * anchors.fill: parent * } * } * } * * TextField { * id: input * text: "The input stays focus even if red box is clicked" * } * * Component.onCompleted: input.forceActiveFocus() * * Connections { * target: window * onActiveFocusItemChanged: console.debug("focus on", window.activeFocusItem) * } * } * \endqml * * The default value is \c false. */ bool UCStyledItemBase::activefocusOnPress() const { Q_D(const UCStyledItemBase); return d->activeFocusOnPress; } void UCStyledItemBase::setActiveFocusOnPress(bool value) { Q_D(UCStyledItemBase); if (d->activeFocusOnPress == value) { return; } d->activeFocusOnPress = value; d->setFocusable(d->activeFocusOnPress); Q_EMIT activeFocusOnPressChanged(); } /*! * \qmlproperty Component StyledItem::style * Style component instantiated immediately and placed below everything else. * Has precedence over the \l styleName. When both set, the style will be * created from the component given as property value, and can be reset to the * theme style when set to null or reset (set to undefined). * \qml * Button { * text: "Press to reset" * style: Rectangle { * color: "tan" * Label { * anchors { * fill: parent * margins: units.gu(1) * } * text: styledItem.text * } * } * onClicked: style = undefined * } * \endqml */ QQmlComponent *UCStyledItemBasePrivate::style() const { return styleComponent; } void UCStyledItemBasePrivate::setStyle(QQmlComponent *style) { if (styleComponent == style) { return; } preStyleChanged(); styleComponent = style; Q_EMIT q_func()->styleChanged(); postStyleChanged(); loadStyleItem(); } void UCStyledItemBasePrivate::resetStyle() { setStyle(Q_NULLPTR); } /*! * \qmlproperty string StyledItem::styleName * The property specifies the component style name. The style name is a document * in the current theme, and should not contain the qml file extension. If specified * an error will be shown. * \qml * StyledItem { * id: myItem * styleName: "MyItemStyle" * } * \endqml * \note \l style property has precedence over styleName. */ QString UCStyledItemBasePrivate::styleName() const { return styleDocument; } void UCStyledItemBasePrivate::setStyleName(const QString &name) { if (name == styleDocument) { return; } QString prevName = styleDocument; styleDocument = name; if (prevName != styleDocument && !styleComponent) { preStyleChanged(); postStyleChanged(); } Q_EMIT q_func()->styleNameChanged(); loadStyleItem(); } // performs pre-style change actions, removes style item size change // connections and destroys the style component void UCStyledItemBasePrivate::preStyleChanged() { if (styleItem) { // make sure the context holder is reset too styleItemContext.clear(); // disconnect the size changes if they were still connected connectStyleSizeChanges(false); // remove parentalship to avoid eventual binding loops styleItem->setParentItem(NULL); // delay deletion to avoid property cache messing styleItem->deleteLater(); styleItem = 0; } } // loads the style animated or not, depending on the loading time // returns true on successful style loading bool UCStyledItemBasePrivate::loadStyleItem(bool animated) { if (styleItem || (!styleComponent && styleDocument.isEmpty()) || !componentComplete) { // the style loading is delayed return false; } Q_Q(UCStyledItemBase); // either styleComponent or styleName is valid QQmlComponent *component = styleComponent; UCTheme *theme = q->getTheme(); if (!component && theme) { component = theme->createStyleComponent(styleDocument + ".qml", q, styleVersion); } if (!component) { return false; } // create context // use creation context as parent to create the context we load the style item with QQmlContext *creationContext = component->creationContext(); if (!creationContext) { creationContext = qmlContext(q); } if (creationContext && !creationContext->isValid()) { // we are having the changes in the component being under deletion return false; } styleItemContext = new QQmlContext(creationContext); styleItemContext->setContextObject(q); styleItemContext->setContextProperty("styledItem", q); styleItemContext->setContextProperty("animated", animated); QObject *object = component->beginCreate(styleItemContext); if (!object) { delete styleItemContext; return false; } // link context to the style item to delete them together QQml_setParent_noEvent(styleItemContext, object); styleItem = qobject_cast(object); if (styleItem) { QQml_setParent_noEvent(styleItem, q); styleItem->setParentItem(q); // put the style behind evenrything styleItem->setZ(-1); // anchor fill to the styled component QQuickAnchors *styleAnchors = QQuickItemPrivate::get(styleItem)->anchors(); styleAnchors->setFill(q); } else { delete object; } component->completeCreate(); // delete temporary component if (!styleComponent) { delete component; } // make sure we reset the animated property to true if (!animated) { styleItemContext->setContextProperty("animated", true); } // set implicit size _q_styleResized(); connectStyleSizeChanges(true); Q_EMIT q->styleInstanceChanged(); return true; } /*! * \internal * Instance of the \l style. */ QQuickItem *UCStyledItemBasePrivate::styleInstance() { return styleItem; } // connect style item implicit size changes void UCStyledItemBasePrivate::connectStyleSizeChanges(bool attach) { if (!styleItem) { return; } Q_Q(UCStyledItemBase); if (attach) { QQuickImplicitSizeItem *sitem = qobject_cast(styleItem); if (sitem) { QObject::connect(styleItem, SIGNAL(implicitWidthChanged2()), q, SLOT(_q_styleResized()), Qt::DirectConnection); QObject::connect(styleItem, SIGNAL(implicitHeightChanged2()), q, SLOT(_q_styleResized()), Qt::DirectConnection); } else { QObject::connect(styleItem, SIGNAL(implicitWidthChanged()), q, SLOT(_q_styleResized()), Qt::DirectConnection); QObject::connect(styleItem, SIGNAL(implicitHeightChanged()), q, SLOT(_q_styleResized()), Qt::DirectConnection); } } else { QQuickImplicitSizeItem *sitem = qobject_cast(styleItem); if (sitem) { QObject::disconnect(styleItem, SIGNAL(implicitWidthChanged2()), q, SLOT(_q_styleResized())); QObject::disconnect(styleItem, SIGNAL(implicitHeightChanged2()), q, SLOT(_q_styleResized())); } else { QObject::disconnect(styleItem, SIGNAL(implicitWidthChanged()), q, SLOT(_q_styleResized())); QObject::disconnect(styleItem, SIGNAL(implicitHeightChanged()), q, SLOT(_q_styleResized())); } } } // handle implicit size changes implied by the style components void UCStyledItemBasePrivate::_q_styleResized() { Q_Q(UCStyledItemBase); QObject *sender = q->sender(); if (sender && sender != styleItem && styleItem) { // the implicitSize has been changed by other than the styleItem, detach connectStyleSizeChanges(false); return; } qreal w = styleItem ? styleItem->implicitWidth() : 0; qreal h = styleItem ? styleItem->implicitHeight() : 0; // leave if the new width/height is 0 and the current width/height is not 0 // and the call was an initial call (sender is not a valid object) if ((!w || !h) && !sender && (q->implicitWidth() || q->implicitHeight())) { return; } if (w != implicitWidth) { q->setImplicitWidth(w); } if (h != implicitHeight) { q->setImplicitHeight(h); } } /*! * \qmlproperty ThemeSettings StyledItem::theme * \since Ubuntu.Components 1.3 * The property configures the theme the component and all its sub-components * will use. By default it is set to the closest ancestor StyledItem's theme * if any, or to the system default theme. */ void UCStyledItemBase::preThemeChanged() { Q_D(UCStyledItemBase); d->wasStyleLoaded = (d->styleItem != Q_NULLPTR); d->preStyleChanged(); } void UCStyledItemBase::postThemeChanged() { Q_EMIT themeChanged(); Q_D(UCStyledItemBase); if (!d->wasStyleLoaded) { return; } d->postStyleChanged(); d->loadStyleItem(); } QString UCStyledItemBasePrivate::propertyForVersion(quint16 version) const { switch (MINOR_VERSION(version)) { case 3: return QStringLiteral("theme"); default: return QString(); } } /* * The method is called on component completion, separated for the cases when * the component is embedded in another CPP component and functionality depends * on this initialization. */ void UCStyledItemBasePrivate::completeComponentInitialization() { // no animation at this time // prepare style context if not been done yet postStyleChanged(); loadStyleItem(false); } void UCStyledItemBase::classBegin() { /* Some items require not to be focus scopes (like ListItem), however for * backwards compatibility we must keep setting the generic styled items * as focus scopes. The flag once set cannot be cleared, therefore we must * use an additional boolean member isFocusScope to drive this request. * The member defaults to true. Additionally, the focus scope flag must * be set before the parentItem is set and child items are added. */ if (d_func()->isFocusScope) { setFlag(QQuickItem::ItemIsFocusScope); } QQuickItem::classBegin(); } void UCStyledItemBase::componentComplete() { QQuickItem::componentComplete(); Q_D(UCStyledItemBase); // make sure the theme version is up to date d->styleVersion = d->importVersion(this); UCTheme::checkMixedVersionImports(this, d->styleVersion); d->completeComponentInitialization(); } void UCStyledItemBase::itemChange(ItemChange change, const ItemChangeData &data) { QQuickItem::itemChange(change, data); if (change == ItemParentHasChanged) { // update parentItem d_func()->oldParentItem = data.item; } } void UCStyledItemBase::focusInEvent(QFocusEvent *event) { QQuickItem::focusInEvent(event); Q_D(UCStyledItemBase); if (d->keyNavigationFocus) return; switch (event->reason()) { case Qt::TabFocusReason: case Qt::BacktabFocusReason: d->keyNavigationFocus = true; Q_EMIT keyNavigationFocusChanged(); break; default: // Mouse or window focus don't affect keyNavigationFocus status break; } } void UCStyledItemBase::focusOutEvent(QFocusEvent *event) { QQuickItem::focusOutEvent(event); Q_D(UCStyledItemBase); if (!d->keyNavigationFocus) return; d->keyNavigationFocus = false; Q_EMIT keyNavigationFocusChanged(); } // grab pressed state and focus if it can be void UCStyledItemBase::mousePressEvent(QMouseEvent *event) { QQuickItem::mousePressEvent(event); requestFocus(Qt::MouseFocusReason); } // filter children events as well, so we can catch mouse presses done over child // MouseAreas or other mouse grabbers bool UCStyledItemBase::childMouseEventFilter(QQuickItem *child, QEvent *event) { // only filter pressed events if (event->type() == QEvent::MouseButtonPress) { // send mouse event QMouseEvent *mouse = static_cast(event); // the event may occur outside of the parent's boundaries if not clipped // therefore must check containment QPointF point = mapFromItem(child, mouse->localPos()); if (contains(point)) { requestFocus(Qt::MouseFocusReason); } } // let the event be passed to children return QQuickItem::childMouseEventFilter(child, event); } #include "moc_ucstyleditembase.cpp" ./src/Ubuntu/Components/plugin/propertychange_p.cpp0000644000015600001650000000723112700370714022652 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "propertychange_p.h" #include #define foreach Q_FOREACH //workaround to fix private includes #include // for QmlBinding #undef foreach /* * The class is used to save properties and their bindings while the property is * altered temporarily. */ PropertyChange::PropertyChange(QObject *item, const char *property, bool autoBackup) : backedUp(false) , qmlProperty(item, property, qmlContext(item)) , backupBinding(Q_NULLPTR) { if (autoBackup) { backup(); } } PropertyChange::~PropertyChange() { restore(this); } void PropertyChange::backup() { if (!backedUp) { #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) backupBinding = QQmlPropertyPrivate::binding(qmlProperty); QQmlPropertyPrivate::setBinding(qmlProperty, Q_NULLPTR); #else backupBinding = QQmlPropertyPrivate::setBinding(qmlProperty, Q_NULLPTR); #endif backupValue = qmlProperty.read(); backedUp = true; } } /* * Sets a value to the property. Will back up the original values if it wasn't yet. * This function can be called many times, it will not destroy the backed up value/binding. */ void PropertyChange::setValue(PropertyChange *change, const QVariant &value) { if (!change) { return; } change->backup(); change->qmlProperty.write(value); } /* * Same as setValue() but setting a binding. */ void PropertyChange::setBinding(PropertyChange *change, QQmlAbstractBinding *binding) { if (!change) { return; } change->backup(); #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) QQmlAbstractBinding::Ptr prev(QQmlPropertyPrivate::binding(change->qmlProperty)); QQmlPropertyPrivate::setBinding(change->qmlProperty, binding); #else QQmlAbstractBinding *prev = QQmlPropertyPrivate::setBinding(change->qmlProperty, binding); #endif if (prev && prev != binding && prev != change->backupBinding) { #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) prev->removeFromObject(); #else prev->destroy(); #endif } } /* * Restore backed up value or binding. */ void PropertyChange::restore(PropertyChange *change) { if (!change) { return; } if (change->backedUp) { if (change->qmlProperty.isValid()) { if (change->backupBinding) { #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) QQmlAbstractBinding::Ptr prev(QQmlPropertyPrivate::binding(change->qmlProperty)); QQmlPropertyPrivate::setBinding(change->qmlProperty, change->backupBinding.data()); #else QQmlAbstractBinding *prev = QQmlPropertyPrivate::setBinding(change->qmlProperty, change->backupBinding); #endif if (prev != change->backupBinding && prev) { #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) prev->removeFromObject(); #else prev->destroy(); #endif } } else { change->qmlProperty.write(change->backupValue); } } change->backedUp = false; } } ./src/Ubuntu/Components/plugin/ucbottomedgestyle.cpp0000644000015600001650000000357712700370701023050 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "ucbottomedgestyle.h" #include "ucbottomedge_p.h" /*! * \qmltype BottomEdgeStyle * \instantiates UCBottomEdgeStyle * \inqmlmodule Ubuntu.Components.Styles 1.3 * \since Ubuntu.Components.Styles 1.3 * \ingroup style-api * \brief Style API for BottomEdge content holder panel. */ void UCBottomEdgeStyle::setConsumeMouse(bool consume) { if (consume) { setAcceptedMouseButtons(Qt::AllButtons); } else { setAcceptedMouseButtons(Qt::NoButton); } } void UCBottomEdgeStyle::mousePressEvent(QMouseEvent *event) { event->accept(); } /*! * \qmlproperty Item BottomEdgeStyle::panel * Represents the item holding the bottom edge content. */ /*! * \qmlproperty Item BottomEdgeStyle::contentItem * Holds the current content item created from \l BottomEdge::contentUrl or \l BottomEdge::contentComponent. */ /*! * \qmlproperty Animation BottomEdgeStyle::panelAnimation * Holds the animation of the panel. BottomEdge requires this property to know * when the bottom edge is fully committed or collapsed. */ /*! * \qmlproperty real BottomEdgeStyle::revealThreshold * Holds the style configured value which drives when the bottom edge content * should be exposed. */ ./src/Ubuntu/Components/plugin/unixsignalhandler_p.h0000644000015600001650000000305312700370701022776 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #ifndef UNIXSIGNALHANDLER_P_H #define UNIXSIGNALHANDLER_P_H #include #include #include class QSocketNotifier; class UnixSignalHandler : public QObject { Q_OBJECT public: enum SignalType { Invalid = 0, Interrupt = SIGINT, Terminate = SIGTERM }; typedef QPair, QSocketNotifier*> HandlerType; static UnixSignalHandler &instance() { static UnixSignalHandler instance; return instance; } void connectSignal(SignalType type); Q_SIGNALS: void signalTriggered(int type); private Q_SLOTS: void notifierActivated(int socket); private: explicit UnixSignalHandler(QObject *parent = 0); static void signalHook(int); HandlerType createHandler(int signal); QHash notifiers; QHash socketRegister; }; #endif // UNIXSIGNALHANDLER_P_H ./src/Ubuntu/Components/plugin/ucbottomedgehint.cpp0000644000015600001650000003516612700370714022655 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: Zsombor Egri */ #include "ucbottomedgehint.h" #include "ucbottomedgehint_p.h" #include "ucstyleditembase_p.h" #include "quickutils.h" #include "ucnamespace.h" #include "ucunits.h" #include "ucaction.h" #include "private/ucswipearea_p.h" #include "propertychange_p.h" #include #include #define SWIPE_AREA_HEIGHT_GU 3 UCBottomEdgeHintPrivate::UCBottomEdgeHintPrivate() : UCActionItemPrivate() , swipeArea(new UCSwipeArea) , flickable(Q_NULLPTR) , flickableBottomMargin(Q_NULLPTR) , deactivateTimeout(800) // FIXME: we need QInputDeviceInfo to be complete with the locked!! // https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1276808 , status(QuickUtils::instance()->mouseAttached() ? UCBottomEdgeHint::Locked : UCBottomEdgeHint::Inactive) , pressed(false) { } void UCBottomEdgeHintPrivate::init() { Q_Q(UCBottomEdgeHint); QObject::connect(q, &UCBottomEdgeHint::clicked, [=]() { // make sure the overloaded trigger is called! invokeTrigger(q, QVariant()); }); /* * we cannot use setStyleName as that will trigger style loading * and the qmlEngine is not known at this phase of the of the initialization * Therefore we simply set the style name default. Style loading will * happen during component completion. */ styleDocument = "BottomEdgeHintStyle"; // connect old stateChanged QObject::connect(q, &QQuickItem::stateChanged, q, &UCBottomEdgeHint::stateChanged); // FIXME: use QInputDeviceInfo once available // https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1276808 QObject::connect(QuickUtils::instance(), &QuickUtils::mouseAttachedChanged, q, &UCBottomEdgeHint::onMouseAttached); // accept mouse events q->setAcceptedMouseButtons(Qt::LeftButton); } /*! \qmltype BottomEdgeHint \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu \inherits ActionItem \brief The BottomEdgeHint shows the availability of extra features available from the bottom edge of the application. It displays a label and/or an icon at the bottom of the component it is attached to. When used with a mouse it acts like a button. The typical action associated with clicking on it should be revealing the extra features provided by the bottom edge. Example: \qml BottomEdgeHint { id: bottomEdgeHint text: i18n.tr("Favorites") onClicked: revealBottomEdge() } \endqml The component is styled through \b BottomEdgeHintStyle. */ UCBottomEdgeHint::UCBottomEdgeHint(QQuickItem *parent) : UCActionItem(*(new UCBottomEdgeHintPrivate), parent) { d_func()->init(); } UCBottomEdgeHint::UCBottomEdgeHint(UCBottomEdgeHintPrivate &&dd, QQuickItem *parent) : UCActionItem(dd, parent) { d_func()->init(); } void UCBottomEdgeHint::classBegin() { UCActionItem::classBegin(); init(); } void UCBottomEdgeHint::init() { Q_D(UCBottomEdgeHint); QQml_setParent_noEvent(d->swipeArea, this); d->swipeArea->setParentItem(this); // set context QQmlEngine::setContextForObject(d->swipeArea, qmlContext(this)); // initialize swipe area size QQuickAnchors *anchors = QQuickItemPrivate::get(d->swipeArea)->anchors(); QQuickItemPrivate *thisPrivate = QQuickItemPrivate::get(this); anchors->setLeft(thisPrivate->left()); anchors->setBottom(thisPrivate->bottom()); anchors->setRight(thisPrivate->right()); d->swipeArea->setImplicitHeight(UCUnits::instance()->gu(SWIPE_AREA_HEIGHT_GU)); // direction d->swipeArea->setDirection(UCSwipeArea::Upwards); // grid unit sync connect(UCUnits::instance(), &UCUnits::gridUnitChanged, this, &UCBottomEdgeHint::onGridUnitChanged); // connect to gesture detection connect(d->swipeArea, &UCSwipeArea::draggingChanged, this, &UCBottomEdgeHint::onDraggingChanged, Qt::DirectConnection); } void UCBottomEdgeHint::onMouseAttached() { Q_D(UCBottomEdgeHint); setStatus(QuickUtils::instance()->mouseAttached() ? Locked : Active); if (d->status == Active) { d->deactivationTimer.start(d->deactivateTimeout, this); if (d->flickableBottomMargin) { delete d->flickableBottomMargin; d->flickableBottomMargin = Q_NULLPTR; } } else if (d->flickable) { adjustFlickableBottomMargin(); } } void UCBottomEdgeHint::adjustFlickableBottomMargin() { Q_D(UCBottomEdgeHint); if (!d->flickableBottomMargin) { d->flickableBottomMargin = new PropertyChange(d->flickable, "bottomMargin"); } PropertyChange::setValue(d->flickableBottomMargin, height()); d->flickable->setContentY(d->flickable->contentY() + height()); } void UCBottomEdgeHint::onGridUnitChanged() { Q_D(UCBottomEdgeHint); d->swipeArea->setImplicitHeight(UCUnits::instance()->gu(SWIPE_AREA_HEIGHT_GU)); } void UCBottomEdgeHint::itemChange(ItemChange change, const ItemChangeData &data) { UCActionItem::itemChange(change, data); if (change == ItemParentHasChanged) { QQmlProperty bottomAnchors(this, "anchors.bottom", qmlContext(this)); if (data.item && !QQmlPropertyPrivate::binding(bottomAnchors)) { QQuickAnchors *anchors = QQuickItemPrivate::get(this)->anchors(); anchors->setBottom(QQuickItemPrivate::get(data.item)->bottom()); } } } void UCBottomEdgeHint::timerEvent(QTimerEvent *event) { Q_D(UCBottomEdgeHint); UCActionItem::timerEvent(event); if (event->timerId() == d->deactivationTimer.timerId()) { setStatus(Inactive); d->deactivationTimer.stop(); } } // handle clicked event when locked and enter or return is pressed void UCBottomEdgeHint::keyPressEvent(QKeyEvent *event) { UCActionItem::keyPressEvent(event); if (status() == Hidden) return; switch (event->key()) { case Qt::Key_Enter: case Qt::Key_Return: case Qt::Key_Space: Q_EMIT clicked(); break; default: break; } } // handle click event void UCBottomEdgeHint::mousePressEvent(QMouseEvent *event) { Q_D(UCBottomEdgeHint); if (contains(event->localPos()) && (d->status >= Active)) { d->pressed = true; event->accept(); // also call requestFocus requestFocus(Qt::MouseFocusReason); } else { UCActionItem::mousePressEvent(event); } } void UCBottomEdgeHint::mouseReleaseEvent(QMouseEvent *event) { Q_D(UCBottomEdgeHint); if (d->pressed && (d->status >= Active) && contains(event->localPos())) { Q_EMIT clicked(); event->accept(); } else { UCActionItem::mouseReleaseEvent(event); } } // watch gesture detection status changes void UCBottomEdgeHint::onDraggingChanged(bool dragging) { Q_D(UCBottomEdgeHint); if (dragging) { d->deactivationTimer.stop(); setStatus(Active); } else if (d->status == Active) { d->deactivationTimer.start(d->deactivateTimeout, this); } } /*! \qmlsignal void BottomEdgeHint::clicked() This handler is called when there is a mouse click on the BottomEdgeHint and the BottomEdgeHint is not disabled. */ /*! \qmlproperty string BottomEdgeHint::text The label displayed by the BottomEdgeHint. */ /*! \qmlproperty url BottomEdgeHint::iconSource The icon displayed by the BottomEdgeHint. This is the URL of any image file. If both iconSource and \l iconName are defined, \l iconName will be ignored. */ /*! \qmlproperty string BottomEdgeHint::iconName The icon associated with the BottomEdgeHint in the icon theme. If both \l iconSource and iconName are defined, iconName will be ignored. */ /*! \qmlproperty Flickable BottomEdgeHint::flickable The property holds the flickable, which when flicked hides the hint. \e Hidden state is reached when this property is set to a Flickable which is flicking or moving. It is recommended to set the property when the hint is placed above a flickable content. Defaults to null. */ QQuickFlickable *UCBottomEdgeHint::flickable() const { Q_D(const UCBottomEdgeHint); return d->flickable; } void UCBottomEdgeHint::setFlickable(QQuickFlickable *flickable) { Q_D(UCBottomEdgeHint); if (flickable == d->flickable) { return; } if (d->flickable) { disconnect(d->flickable, &QQuickFlickable::flickingChanged, this, &UCBottomEdgeHint::handleFlickableActivation); disconnect(d->flickable, &QQuickFlickable::movingChanged, this, &UCBottomEdgeHint::handleFlickableActivation); } d->flickable = flickable; if (d->flickable) { connect(d->flickable, &QQuickFlickable::flickingChanged, this, &UCBottomEdgeHint::handleFlickableActivation, Qt::DirectConnection); connect(d->flickable, &QQuickFlickable::movingChanged, this, &UCBottomEdgeHint::handleFlickableActivation, Qt::DirectConnection); } Q_EMIT flickableChanged(); } // flickable moves hide the hint only if the current status is not Locked void UCBottomEdgeHint::handleFlickableActivation() { Q_D(UCBottomEdgeHint); if (d->status < Locked && !d->swipeArea->dragging() && !d->deactivationTimer.isActive()) { bool moving = d->flickable->isFlicking() || d->flickable->isMoving(); if (moving) { setStatus(Hidden); } else if (d->status == Hidden) { setStatus(Inactive); } } } /*! \qmlproperty string BottomEdgeHint::state \deprecated BottomEdgeHint can take 2 states of visibility: \e Hidden, \e Visible. \table \header \li State \li Description \row \li Hidden \li The hint is not shown at all and cannot be activated. \row \li Visible \li The hint is in a state where it is visible but not active. \l clicked signal is not emitted. \endtable Defaults to \e Visible. */ QString UCBottomEdgeHint::state() const { return QQuickItem::state(); } void UCBottomEdgeHint::setState(const QString &state) { QQuickItem::setState(state); UC_QML_DEPRECATION_WARNING("Overloaded 'state' property deprecated, will be removed from 1.3 release. Use 'status' instead."); Q_D(UCBottomEdgeHint); QQuickItem *style = d->styleItem; if (!style) { return; } if (state == "Hidden") { setStatus(Hidden); } if (state == "Visible") { setStatus(Inactive); } } /*! \qmlproperty Status BottomEdgeHint::status The property represents the status of the hint. The property is writable so it can be set to any of the following values programatically: \table \header \li Status \li Description \row \li Hidden \li The hint is not shown. Equivalent with setting \e visible to \c false, however visuals may do animations when altering this property. It can only be set if the current status is not \e Locked. \row \li Inactive \li The hint is shown and inactive. Styles can represent this state with different visuals. When inactive, \l clicked signal cannot be emitted. \row \li Active \li The hint is shown and active, meaning \l clicked signal is emitted when clicked with mouse. \row \li Locked \li Similar to \e Active the hint is shown and active, but no automatic transition to any other state is allowed. This is relevant for style implementations. \endtable \note \e Locked status value is set automatically when the system detects a mouse attached. In this case any change into other state value than \e Locked is rejected. Defaults to \list \li Inactive if no mouse is attached or \li Locked if there is a mouse detected. \endlist */ UCBottomEdgeHint::Status UCBottomEdgeHint::status() { // FIXME: we won't need this once we get the QInputDeviceInfo reporting mouse attach/detach // https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1276808 Q_D(UCBottomEdgeHint); if (QuickUtils::instance()->mouseAttached()) { d->status = Locked; } return d->status; } void UCBottomEdgeHint::setStatus(Status status) { // FIXME: we need QInputDeviceInfo to complete this! // https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1276808 // cannot unlock if mouse is attached or we don't have touch screen available Q_D(UCBottomEdgeHint); if (status == d->status || (status != Locked && QuickUtils::instance()->mouseAttached())) { return; } // if the previous state was Locked and the new one is Active, start deactivation timer if (d->status == Locked && status == Active && !d->deactivationTimer.isActive()) { d->deactivationTimer.start(d->deactivateTimeout, this); } else if (status != Active && d->deactivationTimer.isActive()) { // make sure we stop the deactivation timer if Inactive or Locked d->deactivationTimer.stop(); } d->status = status; Q_EMIT statusChanged(); } /*! * \qmlproperty int BottomEdgeHint::deactivateTimeout * The property specifies the timeout interval in milliseconds the \l status * is set to \e Inactive after a gesture based activation. Gesture based activation * is only possible when mouse is not attached to the device. Defaults to 800 * milliseconds. */ int UCBottomEdgeHint::deactivateTimeout() const { Q_D(const UCBottomEdgeHint); return d->deactivateTimeout; } void UCBottomEdgeHint::setDeactivateTimeout(int timeout) { Q_D(UCBottomEdgeHint); if (timeout == d->deactivateTimeout || timeout < 0) { return; } d->deactivateTimeout = timeout; if (d->deactivationTimer.isActive()) { d->deactivationTimer.stop(); d->deactivationTimer.start(d->deactivateTimeout, this); } Q_EMIT deactivateTimeoutChanged(); } /*! * \qmlproperty SwipeArea BottomEdgeHint::swipeArea * \readonly * The property specifies the SwipeArea attached to the component driving its * behavior. */ UCSwipeArea *UCBottomEdgeHint::swipeArea() const { return d_func()->swipeArea; } #include "moc_ucbottomedgehint.cpp" ./src/Ubuntu/Components/plugin/ucunits.cpp0000644000015600001650000001752012700370714020775 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include "ucunits.h" #include #include #include #include #include #include #include #include #define ENV_GRID_UNIT_PX "GRID_UNIT_PX" #define DEFAULT_GRID_UNIT_PX 8 static float getenvFloat(const char* name, float defaultValue) { QByteArray stringValue = qgetenv(name); bool ok; float value = stringValue.toFloat(&ok); return ok ? value : defaultValue; } /*! \qmltype Units \instantiates UCUnits \inqmlmodule Ubuntu.Components 1.1 \ingroup resolution-independence \brief Units of measurement for sizes, spacing, margin, etc. Units provides facilities for measuring UI elements in a variety of units other than just pixels. A global instance of Units is exposed as the \b{units} context property. Example usage: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 Item { width: units.gu(2) height: units.gu(5) } \endqml \sa {Resolution Independence} */ /* * Note on the interaction between GRID_UNIT_PX and QT_DEVICE_PIXEL_RATIO * * In Qt5.4 there is a single means to scale the UI: the QT_DEVICE_PIXEL_RATIO environment * variable. This accepts only integer values, thus allowing a x2 or x3 scaling of any * Qt-based UI, that includes QWidget as well as any QML UI. * * Setting QT_DEVICE_PIXEL_RATIO=2 implies one density-independent pixel corresponds to 2 * physical pixels. Developers describe their UI in terms of density-independent pixels. * Qt scales accordingly. * * The Ubuntu UI Toolkit has solved the scaling problem with the GRID_UNIT_PX variable. * It offers more flexibility, but only scales QML applications written to use the UITK * (since it uses this Units class) as it is built on top of QML. * * There are additional areas in Qt where QT_DEVICE_PIXEL_RATIO causes correct scaling which * GRID_UNIT_PX cannot, for example: * 1. cacheBuffer for ListView/GridViews - specified in density-independent pixels * 2. gesture recognition matches what is on screen better, as it is density-independent * pixel aware * * In order to get the best of both worlds, Ubuntu will set both GRID_UNIT_PX and * QT_DEVICE_PIXEL_RATIO. Thus all Qt apps will scale reasonably well, with UITK-based apps * scaling perfectly for any desired scale (i.e. non-integer scales). * * However UITK developers can just use this Units class as usual, and will be almost totally * isolated from Qt's own scaling concept. */ UCUnits *UCUnits::m_units = nullptr; UCUnits::UCUnits(QObject *parent) : QObject(parent), m_devicePixelRatio(qGuiApp->devicePixelRatio()) { // If GRID_UNIT_PX set, always use it. If not, 1GU := DEFAULT_GRID_UNIT_PX * m_devicePixelRatio if (qEnvironmentVariableIsSet(ENV_GRID_UNIT_PX)) { m_gridUnit = getenvFloat(ENV_GRID_UNIT_PX, DEFAULT_GRID_UNIT_PX); } else { m_gridUnit = DEFAULT_GRID_UNIT_PX * m_devicePixelRatio; } } UCUnits::~UCUnits() { m_units = nullptr; } /*! \qmlproperty real Units::gridUnit The number of pixels 1 grid unit corresponds to. */ float UCUnits::gridUnit() { return m_gridUnit; } void UCUnits::setGridUnit(float gridUnit) { m_gridUnit = gridUnit; Q_EMIT gridUnitChanged(); } /*! \qmlmethod real Units::dp(real value) Returns the number of pixels \a value density independent pixels correspond to. */ // Density-independent pixels (and not physical pixels) because Qt sizes in terms of density-independent pixels. float UCUnits::dp(float value) { const float ratio = m_gridUnit / DEFAULT_GRID_UNIT_PX; if (value <= 2.0) { // for values under 2dp, return only multiples of the value return qRound(value * qFloor(ratio)) / m_devicePixelRatio; } else { return qRound(value * ratio) / m_devicePixelRatio; } } /*! \qmlmethod real Units::gu(real value) Returns the number of pixels \a value grid units correspond to. */ // Density-independent pixels (and not physical pixels) because Qt sizes in terms of density-independent pixels. float UCUnits::gu(float value) { return qRound(value * m_gridUnit) / m_devicePixelRatio; } QString UCUnits::resolveResource(const QUrl& url) { if (url.isEmpty()) { return QString(); } QString path = QQmlFile::urlToLocalFileOrQrc(url); if (path.isEmpty()) { return QString(); } QFileInfo fileInfo(path); if (fileInfo.exists() && !fileInfo.isFile()) { return QString(); } QString prefix = fileInfo.dir().absolutePath() + "/" + fileInfo.baseName(); QString suffix = "." + fileInfo.completeSuffix(); /* Use file with expected grid unit suffix if it exists. For example, if m_gridUnit = 10, look for resource@10.png. */ path = prefix + suffixForGridUnit(m_gridUnit) + suffix; if (QFile::exists(path)) { return QString("1") + "/" + path; } /* No file with expected grid unit suffix exists. List all the files of the form fileBaseName@[0-9]*.fileSuffix and select the most appropriate one privileging downscaling high resolution assets over upscaling low resolution assets. The most appropriate file has a grid unit suffix greater than the target grid unit (m_gridUnit) yet as small as possible. If no file with a grid unit suffix greater than the target grid unit exists, then select one with a grid unit suffix as close as possible to the target grid unit. For example, if m_gridUnit = 10 and the available files are resource@9.png, resource@14.png and resource@18.png, the most appropriate file would be resource@14.png since it is above 10 and smaller than resource@18.png. */ QStringList nameFilters; nameFilters << fileInfo.baseName() + "@[0-9]*" + suffix; QStringList files = fileInfo.dir().entryList(nameFilters, QDir::Files); if (!files.empty()) { float selectedGridUnitSuffix = gridUnitSuffixFromFileName(files.first()); Q_FOREACH (const QString& fileName, files) { float gridUnitSuffix = gridUnitSuffixFromFileName(fileName); if ((selectedGridUnitSuffix >= m_gridUnit && gridUnitSuffix >= m_gridUnit && gridUnitSuffix < selectedGridUnitSuffix) || (selectedGridUnitSuffix < m_gridUnit && gridUnitSuffix > selectedGridUnitSuffix)) { selectedGridUnitSuffix = gridUnitSuffix; } } path = prefix + suffixForGridUnit(selectedGridUnitSuffix) + suffix; float scaleFactor = m_gridUnit / selectedGridUnitSuffix; return QString::number(scaleFactor) + "/" + path; } path = prefix + suffix; if (QFile::exists(path)) { return QString("1") + "/" + path; } return QString(); } QString UCUnits::suffixForGridUnit(float gridUnit) { return "@" + QString::number(gridUnit); } float UCUnits::gridUnitSuffixFromFileName(const QString& fileName) { QRegularExpression re("^.*@([0-9]*).*$"); QRegularExpressionMatch match = re.match(fileName); if (match.hasMatch()) { return match.captured(1).toFloat(); } else { return 0; } } ./src/Ubuntu/Components/plugin/filterbehavior.h0000644000015600001650000000255612700370701021754 0ustar jenkinsjenkins/* * Copyright (C) 2014 Canonical, Ltd. * * Authors: * Christian Dywan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef FILTERBEHAVIOR_H #define FILTERBEHAVIOR_H #include class FilterBehavior : public QObject { Q_OBJECT Q_PROPERTY(QString property READ property WRITE setProperty NOTIFY propertyChanged) Q_PROPERTY(QRegExp pattern READ pattern WRITE setPattern NOTIFY patternChanged) public: explicit FilterBehavior(QObject *parent = 0); QString property() const; void setProperty(const QString& property); QRegExp pattern() const; void setPattern(QRegExp pattern); Q_SIGNALS: void propertyChanged(); void patternChanged(); private: QString m_property; QRegExp m_pattern; }; #endif // FILTERBEHAVIOR_H ./src/Ubuntu/Components/plugin/ucubuntushapetexture.h0000644000015600001650001376360612700370701023301 0ustar jenkinsjenkins// Copyright 2015 Canonical Ltd. // Automatically generated by the createshapetextures tool. const int shapeTextureCount = 2; const int shapeTextureWidth = 32; const int shapeTextureHeight = 32; const float shapeTextureOffset = 0.0625; const int shapeTextureDistanceAA = 4; static const unsigned char shapeTextureData[2][4097] = { "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x06\x00" "\x5e\x5e\x11\x00\x5e\x5e\x19\x00\x5e\x5e\x20\x00\x5e\x5e\x26\x00" "\x5e\x5e\x30\x00\x5e\x5e\x33\x00\x5e\x5e\x37\x01\x5e\x5e\x3c\x05" "\x5e\x5e\x40\x08\x5e\x5e\x43\x0b\x5e\x5e\x45\x0e\x5e\x5e\x48\x10" "\x5e\x5e\x49\x12\x5e\x5e\x4a\x12\x5e\x5e\x4b\x13\x5e\x5e\x4c\x14" "\x5e\x5e\x4c\x15\x5e\x5e\x4d\x15\x5e\x5e\x4e\x16\x5e\x5e\x4f\x17" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x0b\x00\x5e\x5e\x19\x00\x5e\x5e\x24\x00" "\x5e\x5e\x2f\x00\x5e\x5e\x37\x02\x5e\x5e\x3e\x09\x5e\x5e\x46\x11" "\x5e\x5e\x50\x16\x5e\x5e\x53\x1b\x5e\x5e\x57\x20\x5e\x5e\x5c\x24" "\x5e\x5e\x60\x28\x5e\x5e\x63\x2b\x5e\x5e\x65\x2d\x5e\x5e\x68\x30" "\x5e\x5e\x69\x31\x5e\x5e\x6a\x32\x5e\x5e\x6b\x33\x5e\x5e\x6c\x34" "\x5e\x5e\x6c\x34\x5e\x5e\x6d\x35\x5e\x5e\x6e\x36\x5e\x5e\x6f\x37" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x08\x00" "\x5e\x5e\x19\x00\x5e\x5e\x28\x00\x5e\x5e\x36\x02\x5e\x5e\x41\x0d" "\x5e\x5e\x4a\x19\x5e\x5e\x55\x21\x5e\x5e\x5e\x26\x5e\x5e\x66\x30" "\x5e\x5e\x6d\x35\x5e\x5e\x73\x3b\x5e\x5e\x78\x3f\x5e\x5b\x7c\x44" "\x5e\x57\x80\x48\x5e\x54\x82\x4b\x5e\x50\x85\x4d\x5e\x4d\x88\x50" "\x5e\x4c\x89\x51\x5e\x4b\x8a\x52\x5e\x4a\x8b\x53\x5e\x49\x8b\x54" "\x5e\x48\x8c\x54\x5e\x47\x8d\x55\x5e\x47\x8e\x56\x5e\x46\x8f\x57" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x11\x00\x5e\x5e\x25\x00" "\x5e\x5e\x31\x05\x5e\x5e\x44\x11\x5e\x5e\x51\x20\x5e\x5e\x5d\x2b" "\x5e\x5e\x6a\x36\x5e\x5e\x76\x3e\x5e\x58\x7e\x46\x5e\x4e\x85\x50" "\x5e\x45\x8d\x55\x5e\x3f\x92\x5b\x5e\x3a\x97\x5f\x5e\x35\x9c\x64" "\x5d\x32\xa0\x68\x59\x2f\xa2\x6b\x56\x2d\xa5\x6d\x52\x2a\xa8\x70" "\x51\x29\xa9\x71\x50\x29\xaa\x72\x4f\x28\xab\x73\x4e\x27\xab\x73" "\x4d\x27\xac\x74\x4c\x26\xad\x75\x4b\x25\xae\x76\x4a\x25\xae\x77" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x15\x00\x5e\x5e\x29\x00\x5e\x5e\x3e\x10" "\x5e\x5e\x50\x21\x5e\x5e\x5e\x2d\x5e\x5e\x6f\x3d\x5e\x57\x7e\x46" "\x5e\x47\x88\x52\x5e\x3a\x95\x5d\x5d\x32\x9e\x66\x53\x2b\xa5\x6e" "\x49\x24\xad\x76\x44\x20\xb2\x7b\x3e\x1c\xb7\x7f\x39\x19\xbc\x84" "\x36\x17\xc0\x88\x33\x15\xc2\x8a\x31\x13\xc5\x8d\x2e\x12\xc7\x90" "\x2d\x11\xc9\x91\x2d\x11\xca\x92\x2c\x10\xca\x93\x2b\x10\xcb\x93" "\x2a\x10\xcc\x94\x2a\x0f\xcd\x95\x29\x0f\xcd\x96\x28\x0e\xce\x96" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x15\x00\x5e\x5e\x2d\x02\x5e\x5e\x42\x17\x5e\x5e\x56\x2a" "\x5e\x5e\x6b\x3c\x5e\x57\x7c\x4c\x5e\x42\x8b\x57\x5c\x31\x9c\x65" "\x4c\x28\xa9\x72\x3e\x1d\xb5\x7e\x36\x17\xbd\x85\x2e\x12\xc5\x8e" "\x28\x0e\xcc\x95\x24\x0c\xd2\x9a\x20\x09\xd7\x9f\x1c\x07\xdc\xa4" "\x1a\x06\xdf\xa8\x18\x05\xe2\xaa\x16\x05\xe5\xad\x14\x04\xe7\xb0" "\x14\x04\xe9\xb1\x13\x03\xea\xb2\x13\x03\xea\xb2\x12\x03\xeb\xb3" "\x12\x03\xec\xb4\x11\x03\xed\xb5\x11\x02\xed\xb5\x11\x02\xee\xb6" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x11\x00" "\x5e\x5e\x29\x06\x5e\x5e\x42\x1b\x5e\x5e\x5a\x2f\x5e\x5e\x6f\x44" "\x5e\x4b\x83\x55\x5c\x35\x98\x67\x47\x26\xa9\x77\x35\x18\xb7\x84" "\x2a\x12\xc9\x91\x20\x0b\xd0\x9d\x1a\x07\xdb\xa6\x15\x05\xe5\xad" "\x11\x02\xea\xb5\x0e\x01\xf2\xba\x0b\x01\xf6\xbf\x09\x00\xfb\xc4" "\x08\x00\xff\xc8\x07\x00\xff\xca\x06\x00\xff\xcd\x05\x00\xff\xd0" "\x05\x00\xff\xd1\x04\x00\xff\xd2\x04\x00\xff\xd2\x04\x00\xff\xd3" "\x04\x00\xff\xd4\x04\x00\xff\xd5\x03\x00\xff\xd5\x03\x00\xff\xd6" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x08\x00\x5e\x5e\x25\x01" "\x5e\x5e\x3e\x1a\x5e\x5e\x56\x33\x5e\x5e\x6f\x48\x5e\x45\x87\x5c" "\x4f\x30\x9c\x71\x38\x1e\xb0\x82\x29\x10\xc3\x94\x1b\x0a\xd5\xa4" "\x14\x04\xe2\xaf\x0d\x02\xee\xbd\x09\x00\xf9\xc5\x06\x00\xff\xcd" "\x03\x00\xff\xd5\x02\x00\xff\xda\x01\x00\xff\xdf\x01\x00\xff\xe4" "\x00\x00\xff\xe7\x00\x00\xff\xea\x00\x00\xff\xed\x00\x00\xff\xef" "\x00\x00\xff\xf1\x00\x00\xff\xf1\x00\x00\xff\xf2\x00\x00\xff\xf3" "\x00\x00\xff\xf4\x00\x00\xff\xf4\x00\x00\xff\xf5\x00\x00\xff\xf6" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x19\x00\x5e\x5e\x32\x16" "\x5e\x5e\x50\x2e\x5e\x5e\x6b\x47\x5e\x4a\x83\x60\x49\x2f\x9c\x75" "\x33\x1a\xb4\x8a\x20\x0e\xc9\x9e\x14\x05\xdd\xaf\x0b\x01\xef\xbe" "\x06\x00\xfe\xcf\x02\x00\xff\xd9\x01\x00\xff\xe2\x00\x00\xff\xeb" "\x00\x00\xff\xf5\x00\x00\xff\xf9\x00\x00\xff\xfe\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x0b\x00\x5e\x5e\x28\x0d\x5e\x5e\x45\x29" "\x5e\x5e\x5f\x43\x5e\x52\x7d\x5b\x4d\x33\x98\x74\x31\x1d\xb0\x8d" "\x1c\x0d\xc9\xa2\x0f\x04\xe1\xb7\x06\x00\xf6\xcb\x02\x00\xff\xda" "\x00\x00\xff\xe9\x00\x00\xff\xf5\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x19\x01\x5e\x5e\x36\x1d\x5e\x5e\x51\x39" "\x5e\x5e\x6f\x53\x55\x3e\x8c\x70\x35\x23\xaa\x89\x1f\x0f\xc3\xa1" "\x0e\x05\xdd\xba\x05\x00\xf7\xcf\x00\x00\xff\xe4\x00\x00\xff\xf7" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x06\x00\x5e\x5e\x24\x0f\x5e\x5e\x41\x2c\x5e\x5e\x5e\x48" "\x5e\x50\x7e\x63\x3f\x2d\x9c\x80\x24\x18\xb7\x9d\x11\x08\xd5\xb6" "\x05\x01\xef\xce\x00\x00\xff\xe7\x00\x00\xff\xfc\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x11\x00\x5e\x5e\x2f\x1c\x5e\x5e\x4a\x39\x5e\x5e\x6a\x53" "\x53\x41\x88\x74\x2f\x21\xa9\x90\x19\x0c\xc9\xad\x09\x03\xe2\xc7" "\x01\x00\xfe\xe3\x00\x00\xff\xfb\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x19\x09\x5e\x5e\x37\x26\x5e\x5e\x55\x41\x5e\x5b\x76\x61" "\x42\x34\x95\x80\x22\x1b\xb5\xa0\x0d\x0a\xd0\xbd\x04\x01\xee\xd7" "\x00\x00\xff\xf3\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x21\x14\x5e\x5e\x3e\x31\x5e\x5e\x5e\x50\x5c\x50\x7e\x6d" "\x35\x2c\x9e\x8c\x1c\x14\xbe\xac\x0a\x05\xdb\xc8\x01\x00\xf9\xe5" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x28\x1b\x5e\x5e\x46\x39\x5e\x5e\x66\x58\x51\x46\x85\x79" "\x2d\x25\xa6\x98\x14\x0f\xc5\xb8\x06\x03\xe5\xd3\x00\x00\xff\xf1" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x2d\x20\x5e\x5e\x4d\x40\x5e\x5e\x6d\x60\x47\x3d\x8d\x80" "\x26\x1f\xad\xa0\x0f\x0c\xcc\xc0\x03\x01\xea\xdd\x00\x00\xff\xfc" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x33\x2a\x5e\x5e\x53\x48\x5e\x5e\x73\x68\x3e\x38\x92\x86" "\x20\x1b\xb2\xa7\x0c\x08\xd2\xc7\x02\x00\xf2\xe5\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x38\x2f\x5e\x5e\x57\x4f\x5e\x59\x79\x6e\x38\x33\x97\x90" "\x1b\x17\xb7\xb0\x09\x07\xd7\xce\x00\x00\xf6\xec\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x3c\x34\x5e\x5e\x5c\x54\x5a\x54\x7d\x74\x33\x2e\x9c\x94" "\x18\x14\xbc\xb3\x07\x05\xdc\xd3\x00\x00\xfb\xf2\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x40\x39\x5e\x5e\x60\x59\x54\x4e\x80\x7a\x2f\x2b\xa0\x98" "\x15\x12\xc0\xb8\x05\x04\xe0\xd8\x00\x00\xff\xf8\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x43\x3e\x5e\x5e\x63\x5d\x4e\x49\x82\x7e\x2b\x28\xa2\x9d" "\x12\x10\xc2\xbd\x04\x03\xe2\xdd\x00\x00\xff\xfc\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x45\x41\x5e\x5e\x65\x61\x49\x47\x84\x80\x28\x26\xa5\xa0" "\x10\x0f\xc5\xc0\x03\x03\xe5\xe0\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x48\x43\x5e\x5e\x68\x63\x48\x44\x87\x83\x26\x24\xa8\xa3" "\x0f\x0e\xc7\xc3\x03\x02\xe7\xe3\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x49\x46\x5e\x5e\x69\x66\x45\x43\x88\x85\x24\x23\xa9\xa6" "\x0e\x0d\xc9\xc6\x02\x02\xe9\xe5\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x4a\x49\x5e\x5e\x6a\x68\x43\x42\x89\x87\x23\x22\xaa\xa8" "\x0d\x0d\xca\xc8\x02\x02\xea\xe8\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x4b\x4a\x5e\x5e\x6b\x69\x42\x41\x8a\x88\x22\x21\xab\xa9" "\x0d\x0c\xca\xc9\x02\x02\xea\xe9\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x4c\x4a\x5e\x5e\x6c\x6a\x41\x40\x8b\x89\x22\x21\xab\xaa" "\x0c\x0c\xcb\xca\x02\x01\xeb\xea\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x4c\x4b\x5e\x5e\x6c\x6b\x40\x3f\x8c\x8a\x21\x20\xac\xab" "\x0c\x0c\xcc\xcb\x01\x01\xec\xea\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x4d\x4c\x5e\x5e\x6d\x6c\x3f\x3e\x8d\x8b\x20\x20\xad\xac" "\x0c\x0b\xcd\xcb\x01\x01\xed\xeb\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x4e\x4d\x5e\x5e\x6e\x6d\x3e\x3e\x8f\x8c\x20\x1f\xae\xac" "\x0b\x0b\xce\xcc\x01\x01\xed\xec\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x4f\x4d\x5e\x5e\x6f\x6d\x3e\x3d\x8f\x8d\x1f\x1e\xae\xad" "\x0b\x0a\xce\xcd\x01\x01\xee\xed\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x08\x00\x00\x00\x12\x00\x00\x00\x1a\x00\x00\x00\x1f\x00\x00\x00" "\x29\x00\x00\x00\x2e\x00\x00\x00\x33\x00\x00\x00\x38\x01\x00\x00" "\x3d\x05\x00\x00\x40\x09\x00\x00\x43\x0b\x00\x00\x46\x0e\x00\x00" "\x48\x10\x00\x00\x49\x12\x00\x00\x4a\x12\x00\x00\x4b\x13\x00\x00" "\x4c\x14\x00\x00\x4d\x15\x00\x00\x4d\x15\x00\x00\x4e\x16\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x1a\x00\x00\x00" "\x25\x00\x00\x00\x30\x00\x00\x00\x38\x03\x00\x00\x3f\x0a\x00\x00" "\x47\x12\x00\x00\x4e\x16\x00\x00\x53\x1b\x00\x00\x58\x20\x00\x00" "\x5d\x25\x00\x00\x60\x29\x00\x00\x63\x2b\x00\x00\x66\x2e\x00\x00" "\x68\x30\x00\x00\x69\x31\x00\x00\x6a\x32\x00\x00\x6b\x33\x00\x00" "\x6c\x34\x00\x00\x6c\x35\x00\x00\x6d\x35\x00\x00\x6e\x36\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x0b\x00\x00\x00\x1b\x00\x00\x00\x28\x00\x00\x00\x38\x03\x00\x00" "\x3f\x0f\x00\x00\x50\x1a\x00\x00\x57\x22\x00\x00\x5f\x27\x00\x00" "\x67\x30\x00\x00\x6e\x36\x00\x00\x73\x3b\x00\x00\x78\x40\x00\x00" "\x7d\x45\x01\x00\x80\x48\x05\x00\x83\x4b\x0a\x00\x85\x4e\x0e\x00" "\x88\x50\x11\x00\x89\x51\x12\x00\x8a\x52\x14\x00\x8b\x53\x15\x00" "\x8c\x54\x16\x00\x8c\x54\x17\x00\x8d\x55\x19\x00\x8e\x56\x1a\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00" "\x26\x00\x00\x00\x36\x06\x00\x00\x46\x13\x00\x00\x52\x22\x00\x00" "\x5f\x2c\x00\x00\x6c\x37\x00\x00\x78\x3f\x00\x00\x7f\x47\x0a\x00" "\x86\x50\x17\x00\x8e\x56\x20\x00\x93\x5b\x28\x00\x98\x60\x30\x00" "\x9c\x65\x36\x00\xa0\x68\x3a\x00\xa3\x6b\x3e\x00\xa5\x6e\x42\x00" "\xa8\x70\x44\x00\xa9\x71\x45\x00\xaa\x72\x46\x00\xab\x73\x47\x00" "\xab\x74\x48\x00\xac\x74\x49\x00\xad\x75\x4a\x00\xae\x76\x4c\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x03\x00\x00\x00\x18\x00\x00\x00\x2c\x00\x00\x00" "\x40\x12\x00\x00\x51\x23\x00\x00\x61\x2f\x00\x00\x71\x3f\x00\x00" "\x7f\x47\x10\x00\x8a\x53\x25\x00\x96\x5f\x33\x00\x9f\x67\x3f\x00" "\xa6\x6e\x49\x00\xae\x76\x51\x00\xb3\x7b\x58\x00\xb8\x80\x5e\x00" "\xbc\x84\x63\x00\xc0\x88\x66\x00\xc3\x8b\x6a\x00\xc5\x8d\x6d\x00" "\xc8\x90\x6f\x00\xc9\x91\x70\x00\xca\x92\x71\x00\xcb\x93\x71\x00" "\xcb\x93\x72\x00\xcc\x94\x73\x00\xcd\x95\x74\x00\xce\x96\x75\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x18\x00\x00\x00\x30\x05\x00\x00\x45\x19\x00\x00" "\x59\x2c\x00\x00\x6d\x3e\x00\x00\x7e\x4e\x15\x00\x8e\x59\x31\x00" "\x9e\x67\x44\x00\xab\x74\x55\x00\xb6\x7f\x60\x00\xbf\x86\x6a\x00" "\xc6\x8f\x73\x00\xcd\x96\x7a\x00\xd3\x9b\x7f\x00\xd7\xa0\x84\x00" "\xdc\xa4\x88\x00\xe0\xa8\x8b\x00\xe2\xab\x8d\x00\xe5\xad\x90\x00" "\xe8\xb0\x92\x00\xe9\xb1\x92\x00\xea\xb2\x93\x00\xea\xb3\x94\x00" "\xeb\xb3\x94\x00\xec\xb4\x95\x00\xed\xb5\x96\x00\xed\xb6\x97\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x14\x00\x00\x00\x2c\x09\x00\x00\x45\x1e\x00\x00\x5d\x32\x00\x00" "\x72\x46\x07\x00\x86\x57\x2a\x00\x9a\x69\x44\x00\xab\x79\x58\x00" "\xb9\x86\x6f\x00\xcb\x93\x77\x00\xd1\x9e\x83\x00\xdc\xa7\x8e\x00" "\xe4\xae\x93\x00\xeb\xb6\x9a\x00\xf3\xbb\x9e\x00\xf7\xc0\xa2\x00" "\xfb\xc4\xa5\x00\xff\xc8\xa7\x00\xff\xcb\xa9\x00\xff\xcd\xab\x00" "\xff\xd0\xac\x00\xff\xd1\xad\x00\xff\xd2\xad\x00\xff\xd2\xae\x00" "\xff\xd3\xae\x00\xff\xd4\xaf\x00\xff\xd5\xaf\x00\xff\xd5\xb0\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x00\x00" "\x27\x04\x00\x00\x41\x1d\x00\x00\x59\x36\x00\x00\x72\x4b\x0d\x00" "\x8a\x5f\x31\x00\x9f\x73\x4e\x00\xb3\x84\x67\x00\xc5\x96\x7d\x00" "\xd7\xa6\x8b\x00\xe4\xaf\x96\x00\xef\xbe\xa0\x00\xfa\xc6\xa9\x00" "\xff\xcd\xac\x00\xff\xd5\xb2\x00\xff\xdb\xb4\x00\xff\xdf\xb7\x00" "\xff\xe4\xba\x00\xff\xe8\xbc\x00\xff\xea\xbd\x00\xff\xed\xbe\x00" "\xff\xf0\xbf\x00\xff\xf1\xbf\x00\xff\xf1\xc0\x00\xff\xf2\xc0\x00" "\xff\xf3\xc0\x00\xff\xf4\xc0\x00\xff\xf5\xc1\x00\xff\xf5\xc1\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x1d\x00\x00\x00" "\x38\x19\x00\x00\x52\x32\x00\x00\x6e\x4a\x07\x00\x86\x63\x31\x00" "\x9f\x78\x54\x00\xb7\x8c\x6f\x00\xcc\xa0\x86\x00\xe0\xb1\x97\x00" "\xf1\xbf\xa4\x00\xff\xcf\xaf\x00\xff\xda\xb6\x00\xff\xe3\xbb\x00" "\xff\xeb\xbf\x00\xff\xf5\xc2\x00\xff\xfa\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x2a\x10\x00\x00" "\x48\x2c\x00\x00\x63\x46\x00\x00\x80\x5f\x2a\x00\x9b\x77\x4f\x00" "\xb4\x90\x6f\x00\xcc\xa5\x8a\x00\xe4\xb9\x9e\x00\xf9\xcc\xad\x00" "\xff\xdd\xb8\x00\xff\xeb\xbf\x00\xff\xf7\xc4\x00\xff\xff\xc7\x00" "\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x06\x00\x00\x3a\x23\x00\x00" "\x54\x3c\x00\x00\x73\x56\x16\x00\x90\x73\x45\x00\xad\x8c\x68\x00" "\xc7\xa4\x86\x00\xe1\xbd\x9e\x00\xf9\xd2\xb0\x00\xff\xe6\xbc\x00" "\xff\xf7\xc4\x00\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x0a\x00\x00\x00\x27\x11\x00\x00\x42\x2f\x00\x00" "\x62\x4e\x00\x00\x81\x69\x31\x00\xa0\x83\x58\x00\xba\xa0\x7d\x00" "\xd8\xb9\x97\x00\xf2\xd2\xae\x00\xff\xea\xbc\x00\xff\xff\xc6\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x15\x01\x00\x00\x33\x20\x00\x00\x50\x3d\x00\x00" "\x6e\x56\x10\x00\x8d\x77\x45\x00\xad\x96\x6f\x00\xcd\xb0\x8b\x00" "\xe6\xcb\xa4\x00\xff\xe6\xb8\x00\xff\xff\xc4\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x1d\x0d\x00\x00\x3b\x2a\x00\x00\x59\x45\x00\x00" "\x7b\x65\x25\x00\x99\x83\x55\x00\xb9\xa4\x77\x00\xd4\xbe\x96\x00" "\xf2\xdb\xaf\x00\xff\xf6\xbf\x00\xff\xff\xc9\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x06\x00\x00\x00\x24\x17\x00\x00\x42\x35\x00\x00\x62\x52\x00\x00" "\x82\x71\x33\x00\xa2\x91\x60\x00\xc1\xae\x83\x00\xde\xce\xa0\x00" "\xfd\xea\xb6\x00\xff\xff\xc4\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x0d\x01\x00\x00\x2a\x1f\x00\x00\x4a\x3c\x00\x00\x6a\x5c\x09\x00" "\x89\x7d\x3f\x00\xaa\x9c\x6a\x00\xc9\xbc\x8e\x00\xe7\xd7\xa9\x00" "\xff\xf4\xbb\x00\xff\xff\xc7\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x12\x08\x00\x00\x32\x26\x00\x00\x52\x44\x00\x00\x71\x64\x18\x00" "\x91\x83\x4a\x00\xb1\xa4\x73\x00\xd0\xc4\x93\x00\xee\xe1\xac\x00" "\xff\xff\xbf\x00\xff\xff\xc9\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x17\x0e\x00\x00\x37\x2c\x00\x00\x57\x4c\x00\x00\x78\x6c\x21\x00" "\x96\x8b\x51\x00\xb6\xab\x7a\x00\xd6\xcb\x9a\x00\xf5\xe9\xb2\x00" "\xff\xff\xc2\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x1c\x13\x00\x00\x3c\x33\x00\x00\x5b\x53\x00\x00\x7c\x73\x28\x00" "\x9b\x93\x58\x00\xbb\xb2\x7f\x00\xdb\xd2\x9e\x00\xfb\xf0\xb5\x00" "\xff\xff\xc4\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x20\x18\x00\x00\x40\x38\x00\x00\x60\x58\x00\x00\x80\x79\x30\x00" "\xa0\x98\x5e\x00\xc0\xb7\x84\x00\xe0\xd7\xa2\x00\xff\xf7\xb7\x00" "\xff\xff\xc5\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x24\x1d\x00\x00\x44\x3d\x00\x00\x64\x5d\x01\x00\x83\x7d\x36\x00" "\xa4\x9c\x63\x00\xc4\xbc\x88\x00\xe4\xdc\xa5\x00\xff\xfb\xba\x00" "\xff\xff\xc7\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x27\x22\x00\x00\x47\x42\x00\x00\x67\x61\x05\x00\x85\x81\x3a\x00" "\xa6\xa1\x67\x00\xc6\xc1\x8b\x00\xe6\xe1\xa7\x00\xff\xff\xbc\x00" "\xff\xff\xc8\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x2a\x25\x00\x00\x49\x45\x00\x00\x69\x65\x08\x00\x88\x84\x3e\x00" "\xa9\xa4\x6a\x00\xc9\xc4\x8e\x00\xe9\xe4\xa9\x00\xff\xff\xbd\x00" "\xff\xff\xc8\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x2c\x28\x00\x00\x4c\x47\x00\x00\x6c\x67\x0c\x00\x8b\x86\x42\x00" "\xac\xa7\x6d\x00\xcb\xc7\x90\x00\xeb\xe7\xab\x00\xff\xff\xbe\x00" "\xff\xff\xc9\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x2e\x2a\x00\x00\x4d\x4a\x00\x00\x6d\x6a\x0f\x00\x8d\x89\x44\x00" "\xad\xaa\x6f\x00\xcd\xca\x92\x00\xed\xe9\xac\x00\xff\xff\xbf\x00" "\xff\xff\xc9\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x2e\x2d\x00\x00\x4e\x4d\x00\x00\x6e\x6c\x11\x00\x8f\x8c\x45\x00" "\xae\xac\x70\x00\xce\xcc\x92\x00\xee\xec\xad\x00\xff\xff\xbf\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x2f\x2e\x00\x00\x4f\x4e\x00\x00\x6f\x6d\x12\x00\x8f\x8e\x46\x00" "\xaf\xad\x71\x00\xcf\xcd\x93\x00\xef\xed\xad\x00\xff\xff\xc0\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x30\x2e\x00\x00\x50\x4e\x00\x00\x70\x6e\x14\x00\x90\x8f\x47\x00" "\xaf\xae\x71\x00\xcf\xce\x94\x00\xef\xee\xae\x00\xff\xff\xc0\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x30\x2f\x00\x00\x50\x4f\x00\x00\x70\x6f\x16\x00\x90\x8f\x48\x00" "\xb0\xaf\x72\x00\xd0\xcf\x94\x00\xf0\xef\xae\x00\xff\xff\xc0\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x31\x30\x00\x00\x51\x50\x00\x00\x70\x70\x18\x00\x91\x90\x49\x00" "\xb1\xb0\x73\x00\xd1\xcf\x95\x00\xf0\xef\xaf\x00\xff\xff\xc0\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x32\x30\x00\x00\x52\x50\x00\x00\x72\x70\x1a\x00\x92\x90\x4b\x00" "\xb2\xb0\x74\x00\xd1\xd0\x96\x00\xf1\xf0\xaf\x00\xff\xff\xc1\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x33\x31\x00\x00\x53\x51\x00\x00\x73\x71\x1a\x00\x92\x91\x4c\x00" "\xb2\xb1\x75\x00\xd2\xd1\x97\x00\xf2\xf1\xb0\x00\xff\xff\xc1\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" }; const int shapeTextureMipmapWidth = 256; const int shapeTextureMipmapHeight = 256; const int shapeTextureMipmapCount = 9; static const int shapeTextureMipmapOffset[9] = { 0, 262144, 327680, 344064, 348160, 349184, 349440, 349504, 349520 }; static const unsigned char shapeTextureMipmapData[2][349525] = { // Mipmap level 0. "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x5d\x00\x00" "\x5e\x5d\x00\x00\x5e\x5d\x00\x00\x5e\x5d\x00\x00\x5e\x5d\x00\x00" "\x5e\x5d\x00\x00\x5e\x5d\x00\x00\x5e\x5d\x00\x00\x5e\x5d\x00\x00" "\x5e\x5d\x00\x00\x5e\x5c\x00\x00\x5e\x5c\x00\x00\x5e\x5c\x00\x00" "\x5e\x5c\x00\x00\x5e\x5c\x00\x00\x5e\x5c\x00\x00\x5e\x5c\x00\x00" "\x5e\x5c\x00\x00\x5e\x5c\x00\x00\x5e\x5c\x00\x00\x5e\x5c\x00\x00" "\x5e\x5c\x00\x00\x5e\x5c\x00\x00\x5e\x5c\x00\x00\x5e\x5c\x00\x00" "\x5e\x5c\x00\x00\x5e\x5c\x00\x00\x5e\x5c\x00\x00\x5e\x5c\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5d\x00\x00\x5e\x5d\x00\x00\x5e\x5d\x00\x00\x5e\x5d\x00\x00" "\x5e\x5c\x00\x00\x5e\x5c\x00\x00\x5e\x5c\x00\x00\x5e\x5c\x00\x00" "\x5e\x5b\x00\x00\x5e\x5b\x00\x00\x5e\x5b\x04\x00\x5e\x5b\x0f\x00" "\x5e\x5b\x18\x00\x5e\x5a\x1f\x00\x5e\x5a\x27\x00\x5e\x5a\x2f\x00" "\x5e\x5a\x36\x00\x5e\x5a\x3e\x00\x5e\x5a\x46\x00\x5e\x59\x4e\x00" "\x5e\x59\x55\x00\x5e\x59\x5d\x00\x5e\x59\x65\x00\x5e\x59\x6c\x00" "\x5e\x59\x74\x00\x5e\x58\x7c\x00\x5e\x58\x83\x00\x5e\x58\x8b\x00" "\x5e\x58\x93\x00\x5e\x58\x9a\x00\x5e\x58\x9e\x00\x5e\x58\xa2\x00" "\x5e\x58\xa6\x00\x5e\x58\xab\x00\x5e\x58\xaf\x00\x5e\x58\xb3\x00" "\x5e\x57\xb8\x00\x5e\x57\xbc\x00\x5e\x57\xc0\x00\x5e\x57\xc4\x00" "\x5e\x57\xc9\x00\x5e\x57\xcd\x00\x5e\x57\xd1\x00\x5e\x57\xd5\x00" "\x5e\x57\xda\x00\x5e\x57\xde\x00\x5e\x57\xe2\x00\x5e\x57\xe6\x00" "\x5e\x57\xe9\x00\x5e\x57\xeb\x00\x5e\x57\xec\x00\x5e\x57\xed\x00" "\x5e\x57\xee\x00\x5e\x56\xf0\x00\x5e\x56\xf1\x00\x5e\x56\xf2\x00" "\x5e\x56\xf3\x00\x5e\x56\xf4\x00\x5e\x56\xf6\x00\x5e\x56\xf7\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00" "\x5e\x5d\x00\x00\x5e\x5d\x00\x00\x5e\x5c\x00\x00\x5e\x5c\x00\x00" "\x5e\x5c\x00\x00\x5e\x5b\x00\x00\x5e\x5b\x00\x00\x5e\x5a\x04\x00" "\x5e\x5a\x15\x00\x5e\x5a\x27\x00\x5e\x5a\x39\x00\x5e\x59\x48\x00" "\x5e\x59\x55\x00\x5e\x59\x61\x00\x5e\x58\x6e\x00\x5e\x58\x7a\x00" "\x5e\x58\x87\x00\x5e\x58\x93\x00\x5e\x57\xa0\x00\x5e\x57\xac\x00" "\x5e\x57\xb9\x00\x5e\x57\xc5\x00\x5e\x56\xd1\x00\x5e\x56\xde\x00" "\x5e\x56\xea\x00\x5e\x56\xf7\x00\x5e\x56\xff\x00\x5e\x55\xff\x00" "\x5e\x55\xff\x00\x5e\x55\xff\x00\x5e\x55\xff\x00\x5e\x55\xff\x00" "\x5e\x55\xff\x00\x5e\x54\xff\x00\x5e\x54\xff\x00\x5e\x54\xff\x00" "\x5e\x54\xff\x00\x5e\x54\xff\x00\x5e\x54\xff\x00\x5e\x54\xff\x00" "\x5e\x53\xff\x00\x5e\x53\xff\x00\x5e\x53\xff\x00\x5e\x53\xff\x00" "\x5e\x53\xff\x00\x5e\x53\xff\x00\x5e\x53\xff\x00\x5e\x53\xff\x00" "\x5e\x53\xff\x00\x5e\x52\xff\x00\x5e\x52\xff\x00\x5e\x52\xff\x00" "\x5e\x52\xff\x00\x5e\x52\xff\x00\x5e\x52\xff\x00\x5e\x52\xff\x00" "\x5e\x52\xff\x00\x5e\x52\xff\x00\x5e\x52\xff\x00\x5e\x52\xff\x00" "\x5e\x52\xff\x00\x5e\x51\xff\x00\x5e\x51\xff\x00\x5e\x51\xff\x00" "\x5e\x51\xff\x00\x5e\x51\xff\x00\x5e\x51\xff\x00\x5e\x51\xff\x00" "\x5e\x51\xff\x00\x5e\x51\xff\x00\x5e\x51\xff\x00\x5e\x51\xff\x00" "\x5e\x51\xff\x00\x5e\x51\xff\x00\x5e\x51\xff\x00\x5e\x51\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00" "\x5e\x5d\x00\x00\x5e\x5c\x00\x00\x5e\x5c\x00\x00\x5e\x5b\x00\x00" "\x5e\x5b\x00\x00\x5e\x5a\x02\x00\x5e\x5a\x14\x00\x5e\x5a\x2a\x00" "\x5e\x59\x3d\x00\x5e\x59\x4f\x00\x5e\x58\x61\x00\x5e\x58\x73\x00" "\x5e\x58\x85\x00\x5e\x57\x97\x00\x5e\x57\xa9\x00\x5e\x57\xbb\x00" "\x5e\x56\xcd\x00\x5e\x56\xdf\x00\x5e\x55\xf1\x00\x5e\x55\xff\x00" "\x5e\x55\xff\x00\x5e\x54\xff\x00\x5e\x54\xff\x00\x5e\x54\xff\x00" "\x5e\x54\xff\x00\x5e\x53\xff\x00\x5e\x53\xff\x00\x5e\x53\xff\x00" "\x5e\x53\xff\x00\x5e\x52\xff\x00\x5e\x52\xff\x00\x5e\x52\xff\x00" "\x5e\x52\xff\x00\x5e\x51\xff\x00\x5e\x51\xff\x00\x5e\x51\xff\x00" "\x5e\x51\xff\x00\x5e\x51\xff\x00\x5e\x50\xff\x00\x5e\x50\xff\x00" "\x5e\x50\xff\x00\x5e\x50\xff\x00\x5e\x50\xff\x00\x5e\x50\xff\x00" "\x5e\x4f\xff\x00\x5e\x4f\xff\x00\x5e\x4f\xff\x00\x5e\x4f\xff\x00" "\x5e\x4f\xff\x00\x5e\x4f\xff\x00\x5e\x4f\xff\x00\x5e\x4e\xff\x00" "\x5e\x4e\xff\x00\x5e\x4e\xff\x00\x5e\x4e\xff\x00\x5e\x4e\xff\x00" "\x5e\x4e\xff\x00\x5e\x4e\xff\x00\x5e\x4e\xff\x00\x5e\x4e\xff\x00" "\x5e\x4d\xff\x00\x5e\x4d\xff\x00\x5e\x4d\xff\x00\x5e\x4d\xff\x00" "\x5e\x4d\xff\x00\x5e\x4d\xff\x00\x5e\x4d\xff\x00\x5e\x4d\xff\x00" "\x5e\x4d\xff\x00\x5e\x4d\xff\x00\x5e\x4d\xff\x00\x5e\x4d\xff\x00" "\x5e\x4c\xff\x00\x5e\x4c\xff\x00\x5e\x4c\xff\x00\x5e\x4c\xff\x00" "\x5e\x4c\xff\x00\x5e\x4c\xff\x00\x5e\x4c\xff\x00\x5e\x4c\xff\x00" "\x5e\x4c\xff\x00\x5e\x4c\xff\x00\x5e\x4c\xff\x00\x5e\x4c\xff\x00" "\x5e\x4c\xff\x00\x5e\x4c\xff\x00\x5e\x4c\xff\x00\x5e\x4c\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x5d\x00\x00\x5e\x5c\x00\x00" "\x5e\x5b\x00\x00\x5e\x5b\x00\x00\x5e\x5a\x00\x00\x5e\x5a\x06\x00" "\x5e\x59\x1e\x00\x5e\x59\x36\x00\x5e\x58\x4f\x00\x5e\x58\x68\x00" "\x5e\x57\x80\x00\x5e\x57\x99\x00\x5e\x56\xb2\x00\x5e\x56\xca\x00" "\x5e\x55\xe3\x00\x5e\x55\xfa\x00\x5e\x55\xff\x00\x5e\x54\xff\x00" "\x5e\x54\xff\x00\x5e\x54\xff\x00\x5e\x53\xff\x00\x5e\x53\xff\x00" "\x5e\x52\xff\x00\x5e\x52\xff\x00\x5e\x52\xff\x00\x5e\x51\xff\x00" "\x5e\x51\xff\x00\x5e\x51\xff\x00\x5e\x50\xff\x00\x5e\x50\xff\x00" "\x5e\x50\xff\x00\x5e\x4f\xff\x00\x5e\x4f\xff\x00\x5e\x4f\xff\x00" "\x5e\x4f\xff\x00\x5e\x4e\xff\x00\x5e\x4e\xff\x00\x5e\x4e\xff\x00" "\x5e\x4e\xff\x00\x5e\x4d\xff\x00\x5e\x4d\xff\x00\x5e\x4d\xff\x00" "\x5e\x4d\xff\x00\x5e\x4c\xff\x00\x5e\x4c\xff\x00\x5e\x4c\xff\x00" "\x5e\x4c\xff\x00\x5e\x4c\xff\x00\x5e\x4b\xff\x00\x5e\x4b\xff\x00" "\x5e\x4b\xff\x00\x5e\x4b\xff\x00\x5e\x4b\xff\x00\x5e\x4b\xff\x00" "\x5e\x4a\xff\x00\x5e\x4a\xff\x00\x5e\x4a\xff\x00\x5e\x4a\xff\x00" "\x5e\x4a\xff\x00\x5e\x4a\xff\x00\x5e\x4a\xff\x00\x5e\x49\xff\x00" "\x5e\x49\xff\x00\x5e\x49\xff\x00\x5e\x49\xff\x00\x5e\x49\xff\x00" "\x5e\x49\xff\x00\x5e\x49\xff\x00\x5e\x49\xff\x00\x5e\x49\xff\x00" "\x5e\x49\xff\x00\x5e\x48\xff\x00\x5e\x48\xff\x00\x5e\x48\xff\x00" "\x5e\x48\xff\x00\x5e\x48\xff\x00\x5e\x48\xff\x00\x5e\x48\xff\x00" "\x5e\x48\xff\x00\x5e\x48\xff\x00\x5e\x48\xff\x00\x5e\x48\xff\x00" "\x5e\x48\xff\x00\x5e\x48\xff\x00\x5e\x47\xff\x00\x5e\x47\xff\x00" "\x5e\x47\xff\x00\x5e\x47\xff\x00\x5e\x47\xff\x00\x5e\x47\xff\x00" "\x5e\x47\xff\x00\x5e\x47\xff\x00\x5e\x47\xff\x00\x5e\x47\xff\x00" "\x5e\x47\xff\x00\x5e\x47\xff\x00\x5e\x47\xff\x00\x5e\x47\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x5d\x00\x00\x5e\x5c\x00\x00" "\x5e\x5b\x00\x00\x5e\x5a\x00\x00\x5e\x5a\x01\x00\x5e\x59\x17\x00" "\x5e\x58\x38\x00\x5e\x58\x59\x00\x5e\x57\x7a\x00\x5e\x57\x9b\x00" "\x5e\x56\xba\x00\x5e\x56\xd4\x00\x5e\x55\xec\x00\x5e\x55\xff\x00" "\x5e\x54\xff\x00\x5e\x54\xff\x00\x5e\x53\xff\x00\x5e\x53\xff\x00" "\x5e\x52\xff\x00\x5e\x52\xff\x00\x5e\x51\xff\x00\x5e\x51\xff\x00" "\x5e\x50\xff\x00\x5e\x50\xff\x00\x5e\x4f\xff\x00\x5e\x4f\xff\x00" "\x5e\x4f\xff\x00\x5e\x4e\xff\x00\x5e\x4e\xff\x00\x5e\x4e\xff\x00" "\x5e\x4d\xff\x00\x5e\x4d\xff\x00\x5e\x4d\xff\x00\x5e\x4c\xff\x00" "\x5e\x4c\xff\x00\x5e\x4c\xff\x00\x5e\x4b\xff\x00\x5e\x4b\xff\x00" "\x5e\x4b\xff\x00\x5e\x4a\xff\x00\x5e\x4a\xff\x00\x5e\x4a\xff\x00" "\x5e\x4a\xff\x00\x5e\x49\xff\x00\x5e\x49\xff\x00\x5e\x49\xff\x00" "\x5e\x49\xff\x00\x5e\x48\xff\x00\x5e\x48\xff\x00\x5e\x48\xff\x00" "\x5e\x48\xff\x00\x5e\x48\xff\x00\x5e\x47\xff\x00\x5e\x47\xff\x00" "\x5e\x47\xff\x00\x5e\x47\xff\x00\x5e\x47\xff\x00\x5e\x46\xff\x00" "\x5e\x46\xff\x00\x5e\x46\xff\x00\x5e\x46\xff\x00\x5e\x46\xff\x00" "\x5e\x46\xff\x00\x5e\x46\xff\x00\x5e\x45\xff\x00\x5e\x45\xff\x00" "\x5e\x45\xff\x00\x5e\x45\xff\x00\x5e\x45\xff\x00\x5e\x45\xff\x00" "\x5e\x45\xff\x00\x5e\x44\xff\x00\x5e\x44\xff\x00\x5e\x44\xff\x00" "\x5e\x44\xff\x00\x5e\x44\xff\x00\x5e\x44\xff\x00\x5e\x44\xff\x00" "\x5e\x44\xff\x00\x5e\x44\xff\x00\x5e\x44\xff\x00\x5e\x44\xff\x00" "\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00" "\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00" "\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00" "\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00" "\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00" "\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x42\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x5c\x00\x00" "\x5e\x5b\x00\x00\x5e\x5b\x00\x00\x5e\x5a\x00\x00\x5e\x59\x10\x00" "\x5e\x58\x31\x00\x5e\x58\x52\x00\x5e\x57\x73\x00\x5e\x56\x94\x00" "\x5e\x56\xb5\x00\x5e\x55\xd6\x00\x5e\x54\xf6\x00\x5e\x54\xff\x00" "\x5e\x53\xff\x00\x5e\x52\xff\x00\x5e\x52\xff\x00\x5e\x51\xff\x00" "\x5e\x51\xff\x00\x5e\x50\xff\x00\x5e\x50\xff\x00\x5e\x4f\xff\x00" "\x5e\x4f\xff\x00\x5e\x4e\xff\x00\x5e\x4e\xff\x00\x5e\x4d\xff\x00" "\x5e\x4d\xff\x00\x5e\x4d\xff\x00\x5e\x4c\xff\x00\x5e\x4c\xff\x00" "\x5e\x4b\xff\x00\x5e\x4b\xff\x00\x5e\x4a\xff\x00\x5e\x4a\xff\x00" "\x5e\x4a\xff\x00\x5e\x49\xff\x00\x5e\x49\xff\x00\x5e\x49\xff\x00" "\x5e\x48\xff\x00\x5e\x48\xff\x00\x5e\x48\xff\x00\x5e\x47\xff\x00" "\x5e\x47\xff\x00\x5e\x47\xff\x00\x5e\x46\xff\x00\x5e\x46\xff\x00" "\x5e\x46\xff\x00\x5e\x46\xff\x00\x5e\x45\xff\x00\x5e\x45\xff\x00" "\x5e\x45\xff\x00\x5e\x45\xff\x00\x5e\x44\xff\x00\x5e\x44\xff\x00" "\x5e\x44\xff\x00\x5e\x44\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00" "\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x42\xff\x00" "\x5e\x42\xff\x00\x5e\x42\xff\x00\x5e\x42\xff\x00\x5e\x42\xff\x00" "\x5e\x42\xff\x00\x5e\x41\xff\x00\x5e\x41\xff\x00\x5e\x41\xff\x00" "\x5e\x41\xff\x00\x5e\x41\xff\x00\x5e\x41\xff\x00\x5e\x41\xff\x00" "\x5e\x40\xff\x00\x5e\x40\xff\x00\x5e\x40\xff\x00\x5e\x40\xff\x00" "\x5e\x40\xff\x00\x5e\x40\xff\x00\x5e\x40\xff\x00\x5e\x40\xff\x00" "\x5e\x3f\xff\x00\x5e\x3f\xff\x00\x5e\x3f\xff\x00\x5e\x3f\xff\x00" "\x5e\x3f\xff\x00\x5e\x3f\xff\x00\x5e\x3f\xff\x00\x5e\x3f\xff\x00" "\x5e\x3f\xff\x00\x5e\x3f\xff\x00\x5e\x3f\xff\x00\x5e\x3f\xff\x00" "\x5e\x3f\xff\x00\x5e\x3e\xff\x00\x5e\x3e\xff\x00\x5e\x3e\xff\x00" "\x5e\x3e\xff\x00\x5e\x3e\xff\x00\x5e\x3e\xff\x00\x5e\x3e\xff\x00" "\x5e\x3e\xff\x00\x5e\x3e\xff\x00\x5e\x3e\xff\x00\x5e\x3e\xff\x00" "\x5e\x3e\xff\x00\x5e\x3e\xff\x00\x5e\x3e\xff\x00\x5e\x3e\xff\x00" "\x5e\x3e\xff\x00\x5e\x3e\xff\x00\x5e\x3e\xff\x00\x5e\x3e\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5d\x00\x00\x5e\x5c\x00\x00\x5e\x5b\x00\x00\x5e\x5a\x00\x00" "\x5e\x59\x01\x00\x5e\x58\x19\x00\x5e\x57\x44\x00\x5e\x57\x6e\x00" "\x5e\x56\x99\x00\x5e\x55\xc4\x00\x5e\x55\xed\x00\x5e\x54\xff\x00" "\x5e\x53\xff\x00\x5e\x53\xff\x00\x5e\x52\xff\x00\x5e\x51\xff\x00" "\x5e\x51\xff\x00\x5e\x50\xff\x00\x5e\x4f\xff\x00\x5e\x4f\xff\x00" "\x5e\x4e\xff\x00\x5e\x4d\xff\x00\x5e\x4d\xff\x00\x5e\x4c\xff\x00" "\x5e\x4c\xff\x00\x5e\x4b\xff\x00\x5e\x4b\xff\x00\x5e\x4a\xff\x00" "\x5e\x4a\xff\x00\x5e\x4a\xff\x00\x5e\x49\xff\x00\x5e\x49\xff\x00" "\x5e\x48\xff\x00\x5e\x48\xff\x00\x5e\x47\xff\x00\x5e\x47\xff\x00" "\x5e\x46\xff\x00\x5e\x46\xff\x00\x5e\x46\xff\x00\x5e\x45\xff\x00" "\x5e\x45\xff\x00\x5e\x45\xff\x00\x5e\x44\xff\x00\x5e\x44\xff\x00" "\x5e\x44\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00" "\x5e\x42\xff\x00\x5e\x42\xff\x00\x5e\x42\xff\x00\x5e\x41\xff\x00" "\x5e\x41\xff\x00\x5e\x41\xff\x00\x5e\x41\xff\x00\x5e\x40\xff\x00" "\x5e\x40\xff\x00\x5e\x40\xff\x00\x5e\x40\xff\x00\x5e\x40\xff\x00" "\x5e\x3f\xff\x00\x5e\x3f\xff\x00\x5e\x3f\xff\x00\x5e\x3f\xff\x00" "\x5e\x3e\xff\x00\x5e\x3e\xff\x00\x5e\x3e\xff\x00\x5e\x3e\xff\x00" "\x5e\x3e\xff\x00\x5e\x3d\xff\x00\x5e\x3d\xff\x00\x5e\x3d\xff\x00" "\x5e\x3d\xff\x00\x5e\x3d\xff\x00\x5e\x3d\xff\x00\x5e\x3d\xff\x00" "\x5e\x3c\xff\x00\x5e\x3c\xff\x00\x5e\x3c\xff\x00\x5e\x3c\xff\x00" "\x5e\x3c\xff\x00\x5e\x3c\xff\x00\x5e\x3c\xff\x00\x5e\x3c\xff\x00" "\x5e\x3b\xff\x00\x5e\x3b\xff\x00\x5e\x3b\xff\x00\x5e\x3b\xff\x00" "\x5e\x3b\xff\x00\x5e\x3b\xff\x00\x5e\x3b\xff\x00\x5e\x3b\xff\x00" "\x5e\x3b\xff\x00\x5e\x3b\xff\x00\x5e\x3b\xff\x00\x5e\x3b\xff\x00" "\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00" "\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00" "\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00" "\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00" "\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00" "\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x5c\x00\x00" "\x5e\x5b\x00\x00\x5e\x5a\x00\x00\x5e\x59\x01\x00\x5e\x58\x1a\x00" "\x5e\x57\x45\x00\x5e\x57\x6f\x00\x5e\x56\x9a\x00\x5e\x55\xc4\x00" "\x5e\x54\xef\x00\x5e\x53\xff\x00\x5e\x52\xff\x00\x5e\x51\xff\x00" "\x5e\x51\xff\x00\x5e\x50\xff\x00\x5e\x4f\xff\x00\x5e\x4f\xff\x00" "\x5e\x4e\xff\x00\x5e\x4d\xff\x00\x5e\x4d\xff\x00\x5e\x4c\xff\x00" "\x5e\x4c\xff\x00\x5e\x4b\xff\x00\x5e\x4a\xff\x00\x5e\x4a\xff\x00" "\x5e\x49\xff\x00\x5e\x48\xff\x00\x5e\x48\xff\x00\x5e\x47\xff\x00" "\x5e\x47\xff\x00\x5e\x47\xff\x00\x5e\x46\xff\x00\x5e\x46\xff\x00" "\x5e\x45\xff\x00\x5e\x45\xff\x00\x5e\x44\xff\x00\x5e\x44\xff\x00" "\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x42\xff\x00\x5e\x42\xff\x00" "\x5e\x42\xff\x00\x5e\x41\xff\x00\x5e\x41\xff\x00\x5e\x41\xff\x00" "\x5e\x40\xff\x00\x5e\x40\xff\x00\x5e\x40\xff\x00\x5e\x3f\xff\x00" "\x5e\x3f\xff\x00\x5e\x3f\xff\x00\x5e\x3e\xff\x00\x5e\x3e\xff\x00" "\x5e\x3e\xff\x00\x5e\x3e\xff\x00\x5e\x3d\xff\x00\x5e\x3d\xff\x00" "\x5e\x3d\xff\x00\x5e\x3c\xff\x00\x5e\x3c\xff\x00\x5e\x3c\xff\x00" "\x5e\x3c\xff\x00\x5e\x3b\xff\x00\x5e\x3b\xff\x00\x5e\x3b\xff\x00" "\x5e\x3b\xff\x00\x5e\x3b\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00" "\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x39\xff\x00" "\x5e\x39\xff\x00\x5e\x39\xff\x00\x5e\x39\xff\x00\x5e\x39\xff\x00" "\x5e\x39\xff\x00\x5e\x39\xff\x00\x5e\x38\xff\x00\x5e\x38\xff\x00" "\x5e\x38\xff\x00\x5e\x38\xff\x00\x5e\x38\xff\x00\x5e\x38\xff\x00" "\x5e\x38\xff\x00\x5e\x37\xff\x00\x5e\x37\xff\x00\x5e\x37\xff\x00" "\x5e\x37\xff\x00\x5e\x37\xff\x00\x5e\x37\xff\x00\x5e\x37\xff\x00" "\x5e\x37\xff\x00\x5e\x37\xff\x00\x5e\x37\xff\x00\x5e\x37\xff\x00" "\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00" "\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00" "\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00" "\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00" "\x5e\x36\xff\x00\x5e\x35\xff\x00\x5e\x35\xff\x00\x5e\x35\xff\x00" "\x5e\x35\xff\x00\x5e\x35\xff\x00\x5e\x35\xff\x00\x5e\x35\xff\x00" "\x5e\x35\xff\x00\x5e\x35\xff\x00\x5e\x35\xff\x00\x5e\x35\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x5c\x00\x00\x5e\x5b\x00\x00" "\x5e\x5a\x00\x00\x5e\x59\x01\x00\x5e\x57\x21\x00\x5e\x57\x57\x00" "\x5e\x56\x8d\x00\x5e\x55\xc3\x00\x5e\x54\xef\x00\x5e\x53\xff\x00" "\x5e\x52\xff\x00\x5e\x51\xff\x00\x5e\x51\xff\x00\x5e\x50\xff\x00" "\x5e\x4f\xff\x00\x5e\x4e\xff\x00\x5e\x4d\xff\x00\x5e\x4c\xff\x00" "\x5e\x4c\xff\x00\x5e\x4b\xff\x00\x5e\x4a\xff\x00\x5e\x4a\xff\x00" "\x5e\x49\xff\x00\x5e\x49\xff\x00\x5e\x48\xff\x00\x5e\x47\xff\x00" "\x5e\x47\xff\x00\x5e\x46\xff\x00\x5e\x46\xff\x00\x5e\x45\xff\x00" "\x5e\x44\xff\x00\x5e\x44\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00" "\x5e\x42\xff\x00\x5e\x42\xff\x00\x5e\x41\xff\x00\x5e\x41\xff\x00" "\x5e\x41\xff\x00\x5e\x40\xff\x00\x5e\x40\xff\x00\x5e\x3f\xff\x00" "\x5e\x3f\xff\x00\x5e\x3e\xff\x00\x5e\x3e\xff\x00\x5e\x3d\xff\x00" "\x5e\x3d\xff\x00\x5e\x3d\xff\x00\x5e\x3c\xff\x00\x5e\x3c\xff\x00" "\x5e\x3c\xff\x00\x5e\x3c\xff\x00\x5e\x3b\xff\x00\x5e\x3b\xff\x00" "\x5e\x3b\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00" "\x5e\x39\xff\x00\x5e\x39\xff\x00\x5e\x39\xff\x00\x5e\x39\xff\x00" "\x5e\x38\xff\x00\x5e\x38\xff\x00\x5e\x38\xff\x00\x5e\x38\xff\x00" "\x5e\x37\xff\x00\x5e\x37\xff\x00\x5e\x37\xff\x00\x5e\x37\xff\x00" "\x5e\x37\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00" "\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x35\xff\x00\x5e\x35\xff\x00" "\x5e\x35\xff\x00\x5e\x35\xff\x00\x5e\x35\xff\x00\x5e\x35\xff\x00" "\x5e\x34\xff\x00\x5e\x34\xff\x00\x5e\x34\xff\x00\x5e\x34\xff\x00" "\x5e\x34\xff\x00\x5e\x34\xff\x00\x5e\x34\xff\x00\x5e\x34\xff\x00" "\x5e\x33\xff\x00\x5e\x33\xff\x00\x5e\x33\xff\x00\x5e\x33\xff\x00" "\x5e\x33\xff\x00\x5e\x33\xff\x00\x5e\x33\xff\x00\x5e\x33\xff\x00" "\x5e\x33\xff\x00\x5e\x33\xff\x00\x5d\x32\xff\x00\x5d\x32\xff\x00" "\x5d\x32\xff\x00\x5d\x32\xff\x00\x5d\x32\xff\x00\x5d\x32\xff\x00" "\x5d\x32\xff\x00\x5d\x32\xff\x00\x5d\x32\xff\x00\x5d\x32\xff\x00" "\x5d\x32\xff\x00\x5c\x32\xff\x00\x5c\x32\xff\x00\x5c\x32\xff\x00" "\x5c\x32\xff\x00\x5c\x31\xff\x00\x5c\x31\xff\x00\x5c\x31\xff\x00" "\x5c\x31\xff\x00\x5c\x31\xff\x00\x5c\x31\xff\x00\x5c\x31\xff\x00" "\x5c\x31\xff\x00\x5c\x31\xff\x00\x5c\x31\xff\x00\x5c\x31\xff\x00" "\x5c\x31\xff\x00\x5c\x31\xff\x00\x5c\x31\xff\x00\x5c\x31\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x5b\x00\x00\x5e\x5a\x00\x00" "\x5e\x59\x00\x00\x5e\x58\x13\x00\x5e\x57\x48\x00\x5e\x56\x7e\x00" "\x5e\x54\xb4\x00\x5e\x53\xea\x00\x5e\x52\xff\x00\x5e\x51\xff\x00" "\x5e\x51\xff\x00\x5e\x50\xff\x00\x5e\x4f\xff\x00\x5e\x4e\xff\x00" "\x5e\x4d\xff\x00\x5e\x4c\xff\x00\x5e\x4c\xff\x00\x5e\x4b\xff\x00" "\x5e\x4a\xff\x00\x5e\x49\xff\x00\x5e\x48\xff\x00\x5e\x48\xff\x00" "\x5e\x47\xff\x00\x5e\x46\xff\x00\x5e\x46\xff\x00\x5e\x45\xff\x00" "\x5e\x44\xff\x00\x5e\x44\xff\x00\x5e\x43\xff\x00\x5e\x43\xff\x00" "\x5e\x42\xff\x00\x5e\x42\xff\x00\x5e\x41\xff\x00\x5e\x40\xff\x00" "\x5e\x40\xff\x00\x5e\x3f\xff\x00\x5e\x3f\xff\x00\x5e\x3e\xff\x00" "\x5e\x3e\xff\x00\x5e\x3d\xff\x00\x5e\x3d\xff\x00\x5e\x3d\xff\x00" "\x5e\x3c\xff\x00\x5e\x3c\xff\x00\x5e\x3b\xff\x00\x5e\x3b\xff\x00" "\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x39\xff\x00" "\x5e\x39\xff\x00\x5e\x38\xff\x00\x5e\x38\xff\x00\x5e\x38\xff\x00" "\x5e\x38\xff\x00\x5e\x37\xff\x00\x5e\x37\xff\x00\x5e\x37\xff\x00" "\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x35\xff\x00" "\x5e\x35\xff\x00\x5e\x35\xff\x00\x5e\x35\xff\x00\x5e\x34\xff\x00" "\x5e\x34\xff\x00\x5e\x34\xff\x00\x5e\x34\xff\x00\x5e\x33\xff\x00" "\x5e\x33\xff\x00\x5e\x33\xff\x00\x5e\x33\xff\x00\x5e\x33\xff\x00" "\x5d\x32\xff\x00\x5d\x32\xff\x00\x5d\x32\xff\x00\x5d\x32\xff\x00" "\x5c\x32\xff\x00\x5c\x31\xff\x00\x5c\x31\xff\x00\x5c\x31\xff\x00" "\x5b\x31\xff\x00\x5b\x31\xff\x00\x5b\x31\xff\x00\x5b\x31\xff\x00" "\x5b\x30\xff\x00\x5a\x30\xff\x00\x5a\x30\xff\x00\x5a\x30\xff\x00" "\x5a\x30\xff\x00\x5a\x30\xff\x00\x5a\x30\xff\x00\x59\x30\xff\x00" "\x59\x2f\xff\x00\x59\x2f\xff\x00\x59\x2f\xff\x00\x59\x2f\xff\x00" "\x59\x2f\xff\x00\x58\x2f\xff\x00\x58\x2f\xff\x00\x58\x2f\xff\x00" "\x58\x2f\xff\x00\x58\x2f\xff\x00\x58\x2f\xff\x00\x58\x2e\xff\x00" "\x58\x2e\xff\x00\x58\x2e\xff\x00\x58\x2e\xff\x00\x58\x2e\xff\x00" "\x57\x2e\xff\x00\x57\x2e\xff\x00\x57\x2e\xff\x00\x57\x2e\xff\x00" "\x57\x2e\xff\x00\x57\x2e\xff\x00\x57\x2e\xff\x00\x57\x2e\xff\x00" "\x57\x2e\xff\x00\x57\x2e\xff\x00\x57\x2e\xff\x00\x57\x2e\xff\x00" "\x57\x2e\xff\x00\x57\x2d\xff\x00\x57\x2d\xff\x00\x57\x2d\xff\x00" "\x57\x2d\xff\x00\x56\x2d\xff\x00\x56\x2d\xff\x00\x56\x2d\xff\x00" "\x56\x2d\xff\x00\x56\x2d\xff\x00\x56\x2d\xff\x00\x56\x2d\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5d\x00\x00\x5e\x5c\x00\x00\x5e\x5a\x00\x00\x5e\x59\x00\x00" "\x5e\x58\x04\x00\x5e\x57\x37\x00\x5e\x56\x6f\x00\x5e\x55\xa5\x00" "\x5e\x54\xdc\x00\x5e\x53\xff\x00\x5e\x51\xff\x00\x5e\x50\xff\x00" "\x5e\x4f\xff\x00\x5e\x4e\xff\x00\x5e\x4d\xff\x00\x5e\x4c\xff\x00" "\x5e\x4b\xff\x00\x5e\x4b\xff\x00\x5e\x4a\xff\x00\x5e\x49\xff\x00" "\x5e\x48\xff\x00\x5e\x48\xff\x00\x5e\x47\xff\x00\x5e\x46\xff\x00" "\x5e\x45\xff\x00\x5e\x45\xff\x00\x5e\x44\xff\x00\x5e\x43\xff\x00" "\x5e\x42\xff\x00\x5e\x42\xff\x00\x5e\x41\xff\x00\x5e\x41\xff\x00" "\x5e\x40\xff\x00\x5e\x3f\xff\x00\x5e\x3f\xff\x00\x5e\x3e\xff\x00" "\x5e\x3d\xff\x00\x5e\x3d\xff\x00\x5e\x3d\xff\x00\x5e\x3c\xff\x00" "\x5e\x3b\xff\x00\x5e\x3b\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00" "\x5e\x39\xff\x00\x5e\x39\xff\x00\x5e\x39\xff\x00\x5e\x38\xff\x00" "\x5e\x38\xff\x00\x5e\x37\xff\x00\x5e\x37\xff\x00\x5e\x37\xff\x00" "\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x35\xff\x00\x5e\x35\xff\x00" "\x5e\x35\xff\x00\x5e\x34\xff\x00\x5e\x34\xff\x00\x5e\x34\xff\x00" "\x5e\x33\xff\x00\x5e\x33\xff\x00\x5e\x33\xff\x00\x5d\x33\xff\x00" "\x5d\x32\xff\x00\x5d\x32\xff\x00\x5c\x32\xff\x00\x5c\x31\xff\x00" "\x5c\x31\xff\x00\x5b\x31\xff\x00\x5b\x31\xff\x00\x5a\x30\xff\x00" "\x5a\x30\xff\x00\x5a\x30\xff\x00\x5a\x30\xff\x00\x59\x2f\xff\x00" "\x59\x2f\xff\x00\x59\x2f\xff\x00\x58\x2f\xff\x00\x58\x2f\xff\x00" "\x58\x2e\xff\x00\x58\x2e\xff\x00\x57\x2e\xff\x00\x57\x2e\xff\x00" "\x57\x2e\xff\x00\x57\x2e\xff\x00\x56\x2d\xff\x00\x56\x2d\xff\x00" "\x56\x2d\xff\x00\x56\x2d\xff\x00\x56\x2d\xff\x00\x55\x2d\xff\x00" "\x55\x2d\xff\x00\x55\x2c\xff\x00\x55\x2c\xff\x00\x55\x2c\xff\x00" "\x55\x2c\xff\x00\x54\x2c\xff\x00\x54\x2c\xff\x00\x54\x2c\xff\x00" "\x54\x2c\xff\x00\x54\x2c\xff\x00\x54\x2b\xff\x00\x54\x2b\xff\x00" "\x53\x2b\xff\x00\x53\x2b\xff\x00\x53\x2b\xff\x00\x53\x2b\xff\x00" "\x53\x2b\xff\x00\x53\x2b\xff\x00\x53\x2b\xff\x00\x53\x2b\xff\x00" "\x53\x2b\xff\x00\x52\x2b\xff\x00\x52\x2a\xff\x00\x52\x2a\xff\x00" "\x52\x2a\xff\x00\x52\x2a\xff\x00\x52\x2a\xff\x00\x52\x2a\xff\x00" "\x52\x2a\xff\x00\x52\x2a\xff\x00\x52\x2a\xff\x00\x52\x2a\xff\x00" "\x52\x2a\xff\x00\x51\x2a\xff\x00\x51\x2a\xff\x00\x51\x2a\xff\x00" "\x51\x2a\xff\x00\x51\x2a\xff\x00\x51\x2a\xff\x00\x51\x2a\xff\x00" "\x51\x2a\xff\x00\x51\x2a\xff\x00\x51\x2a\xff\x00\x51\x2a\xff\x00" "\x51\x2a\xff\x00\x51\x2a\xff\x00\x51\x2a\xff\x00\x51\x2a\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x5b\x00\x00\x5e\x59\x00\x00" "\x5e\x58\x01\x00\x5e\x57\x28\x00\x5e\x55\x6c\x00\x5e\x54\xb0\x00" "\x5e\x53\xf1\x00\x5e\x52\xff\x00\x5e\x51\xff\x00\x5e\x50\xff\x00" "\x5e\x4f\xff\x00\x5e\x4e\xff\x00\x5e\x4d\xff\x00\x5e\x4c\xff\x00" "\x5e\x4b\xff\x00\x5e\x4a\xff\x00\x5e\x49\xff\x00\x5e\x48\xff\x00" "\x5e\x47\xff\x00\x5e\x46\xff\x00\x5e\x45\xff\x00\x5e\x45\xff\x00" "\x5e\x44\xff\x00\x5e\x43\xff\x00\x5e\x42\xff\x00\x5e\x42\xff\x00" "\x5e\x41\xff\x00\x5e\x40\xff\x00\x5e\x3f\xff\x00\x5e\x3f\xff\x00" "\x5e\x3e\xff\x00\x5e\x3d\xff\x00\x5e\x3c\xff\x00\x5e\x3c\xff\x00" "\x5e\x3c\xff\x00\x5e\x3b\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00" "\x5e\x39\xff\x00\x5e\x39\xff\x00\x5e\x38\xff\x00\x5e\x38\xff\x00" "\x5e\x37\xff\x00\x5e\x37\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00" "\x5e\x35\xff\x00\x5e\x35\xff\x00\x5e\x34\xff\x00\x5e\x34\xff\x00" "\x5e\x34\xff\x00\x5e\x33\xff\x00\x5e\x33\xff\x00\x5d\x33\xff\x00" "\x5d\x32\xff\x00\x5c\x32\xff\x00\x5c\x31\xff\x00\x5b\x31\xff\x00" "\x5b\x31\xff\x00\x5a\x30\xff\x00\x5a\x30\xff\x00\x5a\x30\xff\x00" "\x59\x2f\xff\x00\x59\x2f\xff\x00\x58\x2f\xff\x00\x58\x2f\xff\x00" "\x58\x2e\xff\x00\x57\x2e\xff\x00\x57\x2e\xff\x00\x57\x2e\xff\x00" "\x56\x2d\xff\x00\x56\x2d\xff\x00\x55\x2d\xff\x00\x55\x2c\xff\x00" "\x55\x2c\xff\x00\x54\x2c\xff\x00\x54\x2c\xff\x00\x54\x2c\xff\x00" "\x54\x2b\xff\x00\x53\x2b\xff\x00\x53\x2b\xff\x00\x53\x2b\xff\x00" "\x53\x2b\xff\x00\x52\x2b\xff\x00\x52\x2a\xff\x00\x52\x2a\xff\x00" "\x52\x2a\xff\x00\x51\x2a\xff\x00\x51\x2a\xff\x00\x51\x29\xff\x00" "\x51\x29\xff\x00\x51\x29\xff\x00\x50\x29\xff\x00\x50\x29\xff\x00" "\x50\x29\xff\x00\x50\x29\xff\x00\x50\x29\xff\x00\x50\x28\xff\x00" "\x4f\x28\xff\x00\x4f\x28\xff\x00\x4f\x28\xff\x00\x4f\x28\xff\x00" "\x4f\x28\xff\x00\x4f\x28\xff\x00\x4f\x28\xff\x00\x4e\x28\xff\x00" "\x4e\x28\xff\x00\x4e\x27\xff\x00\x4e\x27\xff\x00\x4e\x27\xff\x00" "\x4e\x27\xff\x00\x4e\x27\xff\x00\x4e\x27\xff\x00\x4e\x27\xff\x00" "\x4d\x27\xff\x00\x4d\x27\xff\x00\x4d\x27\xff\x00\x4d\x27\xff\x00" "\x4d\x27\xff\x00\x4d\x27\xff\x00\x4d\x27\xff\x00\x4d\x27\xff\x00" "\x4d\x26\xff\x00\x4d\x26\xff\x00\x4d\x26\xff\x00\x4d\x26\xff\x00" "\x4c\x26\xff\x00\x4c\x26\xff\x00\x4c\x26\xff\x00\x4c\x26\xff\x00" "\x4c\x26\xff\x00\x4c\x26\xff\x00\x4c\x26\xff\x00\x4c\x26\xff\x00" "\x4c\x26\xff\x00\x4c\x26\xff\x00\x4c\x26\xff\x00\x4c\x26\xff\x00" "\x4c\x26\xff\x00\x4c\x26\xff\x00\x4c\x26\xff\x00\x4c\x26\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x5b\x00\x00\x5e\x5a\x00\x00" "\x5e\x58\x00\x00\x5e\x57\x17\x00\x5e\x55\x5b\x00\x5e\x54\x9f\x00" "\x5e\x53\xe3\x00\x5e\x52\xff\x00\x5e\x50\xff\x00\x5e\x4f\xff\x00" "\x5e\x4e\xff\x00\x5e\x4d\xff\x00\x5e\x4c\xff\x00\x5e\x4b\xff\x00" "\x5e\x4a\xff\x00\x5e\x49\xff\x00\x5e\x48\xff\x00\x5e\x47\xff\x00" "\x5e\x46\xff\x00\x5e\x45\xff\x00\x5e\x44\xff\x00\x5e\x43\xff\x00" "\x5e\x42\xff\x00\x5e\x42\xff\x00\x5e\x41\xff\x00\x5e\x40\xff\x00" "\x5e\x3f\xff\x00\x5e\x3f\xff\x00\x5e\x3d\xff\x00\x5e\x3d\xff\x00" "\x5e\x3c\xff\x00\x5e\x3c\xff\x00\x5e\x3b\xff\x00\x5e\x3a\xff\x00" "\x5e\x39\xff\x00\x5e\x39\xff\x00\x5e\x38\xff\x00\x5e\x38\xff\x00" "\x5e\x37\xff\x00\x5e\x37\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00" "\x5e\x35\xff\x00\x5e\x35\xff\x00\x5e\x34\xff\x00\x5e\x34\xff\x00" "\x5e\x33\xff\x00\x5d\x32\xff\x00\x5d\x32\xff\x00\x5c\x32\xff\x00" "\x5b\x31\xff\x00\x5b\x31\xff\x00\x5a\x30\xff\x00\x5a\x30\xff\x00" "\x59\x30\xff\x00\x59\x2f\xff\x00\x58\x2f\xff\x00\x58\x2f\xff\x00" "\x57\x2e\xff\x00\x57\x2e\xff\x00\x56\x2d\xff\x00\x56\x2d\xff\x00" "\x55\x2d\xff\x00\x55\x2c\xff\x00\x55\x2c\xff\x00\x54\x2c\xff\x00" "\x54\x2c\xff\x00\x54\x2b\xff\x00\x53\x2b\xff\x00\x53\x2b\xff\x00" "\x52\x2b\xff\x00\x52\x2a\xff\x00\x52\x2a\xff\x00\x51\x2a\xff\x00" "\x51\x2a\xff\x00\x51\x29\xff\x00\x50\x29\xff\x00\x50\x29\xff\x00" "\x50\x28\xff\x00\x4f\x28\xff\x00\x4f\x28\xff\x00\x4f\x28\xff\x00" "\x4f\x28\xff\x00\x4e\x28\xff\x00\x4e\x27\xff\x00\x4e\x27\xff\x00" "\x4e\x27\xff\x00\x4d\x27\xff\x00\x4d\x27\xff\x00\x4d\x27\xff\x00" "\x4d\x26\xff\x00\x4c\x26\xff\x00\x4c\x26\xff\x00\x4c\x26\xff\x00" "\x4c\x26\xff\x00\x4c\x26\xff\x00\x4b\x25\xff\x00\x4b\x25\xff\x00" "\x4b\x25\xff\x00\x4b\x25\xff\x00\x4b\x25\xff\x00\x4b\x25\xff\x00" "\x4a\x25\xff\x00\x4a\x25\xff\x00\x4a\x25\xff\x00\x4a\x25\xff\x00" "\x4a\x24\xff\x00\x4a\x24\xff\x00\x4a\x24\xff\x00\x49\x24\xff\x00" "\x49\x24\xff\x00\x49\x24\xff\x00\x49\x24\xff\x00\x49\x24\xff\x00" "\x49\x24\xff\x00\x49\x24\xff\x00\x49\x24\xff\x00\x49\x24\xff\x00" "\x49\x23\xff\x00\x48\x23\xff\x00\x48\x23\xff\x00\x48\x23\xff\x00" "\x48\x23\xff\x00\x48\x23\xff\x00\x48\x23\xff\x00\x48\x23\xff\x00" "\x48\x23\xff\x00\x48\x23\xff\x00\x48\x23\xff\x00\x48\x23\xff\x00" "\x48\x23\xff\x00\x48\x23\xff\x00\x47\x23\xff\x00\x47\x23\xff\x00" "\x47\x23\xff\x00\x47\x23\xff\x00\x47\x23\xff\x00\x47\x23\xff\x00" "\x47\x23\xff\x00\x47\x23\xff\x00\x47\x23\xff\x00\x47\x23\xff\x00" "\x47\x23\xff\x00\x47\x23\xff\x00\x47\x23\xff\x00\x47\x23\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x5a\x00\x00" "\x5e\x59\x00\x00\x5e\x57\x08\x00\x5e\x56\x49\x00\x5e\x54\x8e\x00" "\x5e\x53\xd2\x00\x5e\x52\xff\x00\x5e\x50\xff\x00\x5e\x4f\xff\x00" "\x5e\x4e\xff\x00\x5e\x4d\xff\x00\x5e\x4b\xff\x00\x5e\x4a\xff\x00" "\x5e\x49\xff\x00\x5e\x48\xff\x00\x5e\x47\xff\x00\x5e\x46\xff\x00" "\x5e\x45\xff\x00\x5e\x44\xff\x00\x5e\x43\xff\x00\x5e\x42\xff\x00" "\x5e\x41\xff\x00\x5e\x40\xff\x00\x5e\x3f\xff\x00\x5e\x3f\xff\x00" "\x5e\x3e\xff\x00\x5e\x3d\xff\x00\x5e\x3c\xff\x00\x5e\x3c\xff\x00" "\x5e\x3b\xff\x00\x5e\x3a\xff\x00\x5e\x39\xff\x00\x5e\x39\xff\x00" "\x5e\x38\xff\x00\x5e\x37\xff\x00\x5e\x37\xff\x00\x5e\x36\xff\x00" "\x5e\x35\xff\x00\x5e\x35\xff\x00\x5e\x34\xff\x00\x5e\x34\xff\x00" "\x5e\x33\xff\x00\x5d\x33\xff\x00\x5d\x32\xff\x00\x5c\x32\xff\x00" "\x5b\x31\xff\x00\x5a\x31\xff\x00\x5a\x30\xff\x00\x59\x30\xff\x00" "\x58\x2f\xff\x00\x58\x2f\xff\x00\x57\x2e\xff\x00\x57\x2e\xff\x00" "\x56\x2d\xff\x00\x56\x2d\xff\x00\x55\x2d\xff\x00\x55\x2c\xff\x00" "\x54\x2c\xff\x00\x54\x2c\xff\x00\x53\x2b\xff\x00\x53\x2b\xff\x00" "\x52\x2a\xff\x00\x52\x2a\xff\x00\x51\x2a\xff\x00\x51\x29\xff\x00" "\x50\x29\xff\x00\x50\x29\xff\x00\x4f\x28\xff\x00\x4f\x28\xff\x00" "\x4f\x28\xff\x00\x4e\x28\xff\x00\x4e\x27\xff\x00\x4e\x27\xff\x00" "\x4d\x27\xff\x00\x4d\x27\xff\x00\x4d\x26\xff\x00\x4c\x26\xff\x00" "\x4c\x26\xff\x00\x4c\x26\xff\x00\x4b\x25\xff\x00\x4b\x25\xff\x00" "\x4b\x25\xff\x00\x4a\x25\xff\x00\x4a\x25\xff\x00\x4a\x24\xff\x00" "\x4a\x24\xff\x00\x49\x24\xff\x00\x49\x24\xff\x00\x49\x24\xff\x00" "\x49\x24\xff\x00\x48\x23\xff\x00\x48\x23\xff\x00\x48\x23\xff\x00" "\x48\x23\xff\x00\x48\x23\xff\x00\x47\x23\xff\x00\x47\x22\xff\x00" "\x47\x22\xff\x00\x47\x22\xff\x00\x47\x22\xff\x00\x46\x22\xff\x00" "\x46\x22\xff\x00\x46\x22\xff\x00\x46\x22\xff\x00\x46\x22\xff\x00" "\x46\x21\xff\x00\x46\x21\xff\x00\x45\x21\xff\x00\x45\x21\xff\x00" "\x45\x21\xff\x00\x45\x21\xff\x00\x45\x21\xff\x00\x45\x21\xff\x00" "\x45\x21\xff\x00\x44\x21\xff\x00\x44\x20\xff\x00\x44\x20\xff\x00" "\x44\x20\xff\x00\x44\x20\xff\x00\x44\x20\xff\x00\x44\x20\xff\x00" "\x44\x20\xff\x00\x44\x20\xff\x00\x44\x20\xff\x00\x44\x20\xff\x00" "\x43\x20\xff\x00\x43\x20\xff\x00\x43\x20\xff\x00\x43\x20\xff\x00" "\x43\x20\xff\x00\x43\x20\xff\x00\x43\x20\xff\x00\x43\x20\xff\x00" "\x43\x20\xff\x00\x43\x1f\xff\x00\x43\x1f\xff\x00\x43\x1f\xff\x00" "\x43\x1f\xff\x00\x43\x1f\xff\x00\x43\x1f\xff\x00\x43\x1f\xff\x00" "\x43\x1f\xff\x00\x43\x1f\xff\x00\x43\x1f\xff\x00\x43\x1f\xff\x00" "\x43\x1f\xff\x00\x43\x1f\xff\x00\x43\x1f\xff\x00\x42\x1f\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x5e\x5a\x00\x00\x5e\x58\x00\x00\x5e\x57\x08\x00\x5e\x55\x50\x00" "\x5e\x53\xa5\x00\x5e\x52\xf2\x00\x5e\x51\xff\x00\x5e\x50\xff\x00" "\x5e\x4e\xff\x00\x5e\x4d\xff\x00\x5e\x4c\xff\x00\x5e\x4b\xff\x00" "\x5e\x49\xff\x00\x5e\x48\xff\x00\x5e\x47\xff\x00\x5e\x46\xff\x00" "\x5e\x45\xff\x00\x5e\x44\xff\x00\x5e\x43\xff\x00\x5e\x42\xff\x00" "\x5e\x41\xff\x00\x5e\x40\xff\x00\x5e\x3f\xff\x00\x5e\x3e\xff\x00" "\x5e\x3d\xff\x00\x5e\x3c\xff\x00\x5e\x3b\xff\x00\x5e\x3a\xff\x00" "\x5e\x39\xff\x00\x5e\x39\xff\x00\x5e\x38\xff\x00\x5e\x37\xff\x00" "\x5e\x37\xff\x00\x5e\x36\xff\x00\x5e\x35\xff\x00\x5e\x35\xff\x00" "\x5e\x34\xff\x00\x5e\x33\xff\x00\x5d\x33\xff\x00\x5c\x32\xff\x00" "\x5b\x31\xff\x00\x5b\x31\xff\x00\x5a\x30\xff\x00\x59\x30\xff\x00" "\x58\x2f\xff\x00\x58\x2f\xff\x00\x57\x2e\xff\x00\x56\x2e\xff\x00" "\x56\x2d\xff\x00\x55\x2d\xff\x00\x54\x2c\xff\x00\x54\x2c\xff\x00" "\x53\x2b\xff\x00\x52\x2b\xff\x00\x52\x2a\xff\x00\x51\x2a\xff\x00" "\x51\x2a\xff\x00\x50\x29\xff\x00\x50\x29\xff\x00\x4f\x29\xff\x00" "\x4f\x28\xff\x00\x4e\x28\xff\x00\x4e\x28\xff\x00\x4d\x27\xff\x00" "\x4d\x27\xff\x00\x4d\x26\xff\x00\x4c\x26\xff\x00\x4c\x26\xff\x00" "\x4b\x25\xff\x00\x4b\x25\xff\x00\x4a\x25\xff\x00\x4a\x25\xff\x00" "\x4a\x24\xff\x00\x49\x24\xff\x00\x49\x24\xff\x00\x49\x24\xff\x00" "\x48\x23\xff\x00\x48\x23\xff\x00\x48\x23\xff\x00\x47\x23\xff\x00" "\x47\x23\xff\x00\x47\x22\xff\x00\x46\x22\xff\x00\x46\x22\xff\x00" "\x46\x22\xff\x00\x46\x21\xff\x00\x45\x21\xff\x00\x45\x21\xff\x00" "\x45\x21\xff\x00\x45\x21\xff\x00\x44\x21\xff\x00\x44\x20\xff\x00" "\x44\x20\xff\x00\x44\x20\xff\x00\x43\x20\xff\x00\x43\x20\xff\x00" "\x43\x20\xff\x00\x43\x20\xff\x00\x43\x1f\xff\x00\x42\x1f\xff\x00" "\x42\x1f\xff\x00\x42\x1f\xff\x00\x42\x1f\xff\x04\x42\x1f\xff\x0f" "\x42\x1f\xff\x18\x41\x1f\xff\x1f\x41\x1e\xff\x27\x41\x1e\xff\x2f" "\x41\x1e\xff\x36\x41\x1e\xff\x3e\x41\x1e\xff\x46\x41\x1e\xff\x4e" "\x40\x1e\xff\x55\x40\x1e\xff\x5d\x40\x1e\xff\x65\x40\x1e\xff\x6c" "\x40\x1e\xff\x74\x40\x1d\xff\x7c\x40\x1d\xff\x83\x40\x1d\xff\x8b" "\x3f\x1d\xff\x93\x3f\x1d\xff\x9a\x3f\x1d\xff\x9e\x3f\x1d\xff\xa2" "\x3f\x1d\xff\xa6\x3f\x1d\xff\xab\x3f\x1d\xff\xaf\x3f\x1d\xff\xb3" "\x3f\x1d\xff\xb8\x3f\x1d\xff\xbc\x3f\x1d\xff\xc0\x3f\x1d\xff\xc4" "\x3f\x1d\xff\xc9\x3e\x1d\xff\xcd\x3e\x1d\xff\xd1\x3e\x1c\xff\xd5" "\x3e\x1c\xff\xda\x3e\x1c\xff\xde\x3e\x1c\xff\xe2\x3e\x1c\xff\xe6" "\x3e\x1c\xff\xe9\x3e\x1c\xff\xeb\x3e\x1c\xff\xec\x3e\x1c\xff\xed" "\x3e\x1c\xff\xee\x3e\x1c\xff\xf0\x3e\x1c\xff\xf1\x3e\x1c\xff\xf2" "\x3e\x1c\xff\xf3\x3e\x1c\xff\xf4\x3e\x1c\xff\xf6\x3e\x1c\xff\xf7" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5c\x00\x00\x5e\x5a\x00\x00\x5e\x58\x00\x00\x5e\x56\x09\x00" "\x5e\x55\x51\x00\x5e\x53\xa6\x00\x5e\x52\xf3\x00\x5e\x50\xff\x00" "\x5e\x4f\xff\x00\x5e\x4d\xff\x00\x5e\x4c\xff\x00\x5e\x4b\xff\x00" "\x5e\x4a\xff\x00\x5e\x48\xff\x00\x5e\x47\xff\x00\x5e\x46\xff\x00" "\x5e\x45\xff\x00\x5e\x43\xff\x00\x5e\x42\xff\x00\x5e\x41\xff\x00" "\x5e\x40\xff\x00\x5e\x3f\xff\x00\x5e\x3e\xff\x00\x5e\x3d\xff\x00" "\x5e\x3c\xff\x00\x5e\x3b\xff\x00\x5e\x3a\xff\x00\x5e\x3a\xff\x00" "\x5e\x39\xff\x00\x5e\x38\xff\x00\x5e\x37\xff\x00\x5e\x36\xff\x00" "\x5e\x35\xff\x00\x5e\x35\xff\x00\x5e\x34\xff\x00\x5e\x33\xff\x00" "\x5d\x33\xff\x00\x5c\x32\xff\x00\x5b\x31\xff\x00\x5a\x31\xff\x00" "\x59\x30\xff\x00\x58\x2f\xff\x00\x57\x2f\xff\x00\x57\x2e\xff\x00" "\x56\x2d\xff\x00\x55\x2d\xff\x00\x55\x2c\xff\x00\x54\x2c\xff\x00" "\x53\x2b\xff\x00\x53\x2b\xff\x00\x52\x2a\xff\x00\x51\x2a\xff\x00" "\x51\x29\xff\x00\x50\x29\xff\x00\x4f\x29\xff\x00\x4f\x28\xff\x00" "\x4e\x28\xff\x00\x4d\x27\xff\x00\x4d\x27\xff\x00\x4c\x26\xff\x00" "\x4c\x26\xff\x00\x4b\x26\xff\x00\x4b\x25\xff\x00\x4a\x25\xff\x00" "\x4a\x25\xff\x00\x4a\x24\xff\x00\x49\x24\xff\x00\x49\x24\xff\x00" "\x48\x23\xff\x00\x48\x23\xff\x00\x47\x23\xff\x00\x47\x22\xff\x00" "\x46\x22\xff\x00\x46\x22\xff\x00\x46\x21\xff\x00\x45\x21\xff\x00" "\x45\x21\xff\x00\x45\x21\xff\x00\x44\x21\xff\x00\x44\x20\xff\x00" "\x44\x20\xff\x00\x43\x20\xff\x00\x43\x20\xff\x00\x43\x20\xff\x00" "\x42\x1f\xff\x00\x42\x1f\xff\x00\x42\x1f\xff\x00\x41\x1f\xff\x04" "\x41\x1e\xff\x15\x41\x1e\xff\x27\x41\x1e\xff\x39\x40\x1e\xff\x48" "\x40\x1e\xff\x55\x40\x1e\xff\x61\x40\x1d\xff\x6e\x40\x1d\xff\x7a" "\x3f\x1d\xff\x87\x3f\x1d\xff\x93\x3f\x1d\xff\xa0\x3f\x1d\xff\xac" "\x3e\x1d\xff\xb9\x3e\x1c\xff\xc5\x3e\x1c\xff\xd1\x3e\x1c\xff\xde" "\x3e\x1c\xff\xea\x3d\x1c\xff\xf7\x3d\x1c\xff\xff\x3d\x1c\xff\xff" "\x3d\x1c\xff\xff\x3d\x1b\xff\xff\x3d\x1b\xff\xff\x3d\x1b\xff\xff" "\x3c\x1b\xff\xff\x3c\x1b\xff\xff\x3c\x1b\xff\xff\x3c\x1b\xff\xff" "\x3c\x1b\xff\xff\x3c\x1b\xff\xff\x3c\x1b\xff\xff\x3c\x1b\xff\xff" "\x3b\x1a\xff\xff\x3b\x1a\xff\xff\x3b\x1a\xff\xff\x3b\x1a\xff\xff" "\x3b\x1a\xff\xff\x3b\x1a\xff\xff\x3b\x1a\xff\xff\x3b\x1a\xff\xff" "\x3b\x1a\xff\xff\x3b\x1a\xff\xff\x3b\x1a\xff\xff\x3b\x1a\xff\xff" "\x3a\x1a\xff\xff\x3a\x1a\xff\xff\x3a\x1a\xff\xff\x3a\x1a\xff\xff" "\x3a\x1a\xff\xff\x3a\x1a\xff\xff\x3a\x1a\xff\xff\x3a\x1a\xff\xff" "\x3a\x19\xff\xff\x3a\x19\xff\xff\x3a\x19\xff\xff\x3a\x19\xff\xff" "\x3a\x19\xff\xff\x3a\x19\xff\xff\x3a\x19\xff\xff\x3a\x19\xff\xff" "\x3a\x19\xff\xff\x3a\x19\xff\xff\x3a\x19\xff\xff\x3a\x19\xff\xff" "\x3a\x19\xff\xff\x3a\x19\xff\xff\x3a\x19\xff\xff\x3a\x19\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x5a\x00\x00\x5e\x58\x00\x00" "\x5e\x56\x0a\x00\x5e\x55\x53\x00\x5e\x53\xa8\x00\x5e\x52\xf4\x00" "\x5e\x50\xff\x00\x5e\x4f\xff\x00\x5e\x4d\xff\x00\x5e\x4b\xff\x00" "\x5e\x4a\xff\x00\x5e\x49\xff\x00\x5e\x47\xff\x00\x5e\x46\xff\x00" "\x5e\x45\xff\x00\x5e\x44\xff\x00\x5e\x42\xff\x00\x5e\x41\xff\x00" "\x5e\x40\xff\x00\x5e\x3f\xff\x00\x5e\x3e\xff\x00\x5e\x3d\xff\x00" "\x5e\x3c\xff\x00\x5e\x3b\xff\x00\x5e\x3a\xff\x00\x5e\x39\xff\x00" "\x5e\x38\xff\x00\x5e\x37\xff\x00\x5e\x36\xff\x00\x5e\x35\xff\x00" "\x5e\x35\xff\x00\x5e\x34\xff\x00\x5d\x33\xff\x00\x5c\x32\xff\x00" "\x5b\x31\xff\x00\x5a\x31\xff\x00\x59\x30\xff\x00\x58\x2f\xff\x00" "\x57\x2f\xff\x00\x57\x2e\xff\x00\x56\x2d\xff\x00\x55\x2d\xff\x00" "\x54\x2c\xff\x00\x53\x2c\xff\x00\x52\x2b\xff\x00\x51\x2a\xff\x00" "\x51\x2a\xff\x00\x50\x29\xff\x00\x4f\x29\xff\x00\x4f\x28\xff\x00" "\x4e\x28\xff\x00\x4d\x27\xff\x00\x4d\x27\xff\x00\x4c\x26\xff\x00" "\x4c\x26\xff\x00\x4b\x25\xff\x00\x4a\x25\xff\x00\x4a\x25\xff\x00" "\x49\x24\xff\x00\x48\x24\xff\x00\x48\x23\xff\x00\x47\x23\xff\x00" "\x47\x23\xff\x00\x47\x22\xff\x00\x46\x22\xff\x00\x46\x22\xff\x00" "\x45\x21\xff\x00\x45\x21\xff\x00\x44\x21\xff\x00\x44\x20\xff\x00" "\x43\x20\xff\x00\x43\x20\xff\x00\x42\x1f\xff\x00\x42\x1f\xff\x00" "\x42\x1f\xff\x00\x41\x1f\xff\x02\x41\x1e\xff\x14\x41\x1e\xff\x2a" "\x40\x1e\xff\x3d\x40\x1e\xff\x4f\x40\x1d\xff\x61\x3f\x1d\xff\x73" "\x3f\x1d\xff\x85\x3f\x1d\xff\x97\x3e\x1d\xff\xa9\x3e\x1c\xff\xbb" "\x3e\x1c\xff\xcd\x3e\x1c\xff\xdf\x3d\x1c\xff\xf1\x3d\x1c\xff\xff" "\x3d\x1b\xff\xff\x3c\x1b\xff\xff\x3c\x1b\xff\xff\x3c\x1b\xff\xff" "\x3c\x1b\xff\xff\x3b\x1b\xff\xff\x3b\x1a\xff\xff\x3b\x1a\xff\xff" "\x3b\x1a\xff\xff\x3b\x1a\xff\xff\x3a\x1a\xff\xff\x3a\x1a\xff\xff" "\x3a\x1a\xff\xff\x3a\x19\xff\xff\x3a\x19\xff\xff\x39\x19\xff\xff" "\x39\x19\xff\xff\x39\x19\xff\xff\x39\x19\xff\xff\x39\x19\xff\xff" "\x39\x19\xff\xff\x39\x19\xff\xff\x38\x18\xff\xff\x38\x18\xff\xff" "\x38\x18\xff\xff\x38\x18\xff\xff\x38\x18\xff\xff\x38\x18\xff\xff" "\x38\x18\xff\xff\x37\x18\xff\xff\x37\x18\xff\xff\x37\x18\xff\xff" "\x37\x18\xff\xff\x37\x18\xff\xff\x37\x17\xff\xff\x37\x17\xff\xff" "\x37\x17\xff\xff\x37\x17\xff\xff\x37\x17\xff\xff\x37\x17\xff\xff" "\x36\x17\xff\xff\x36\x17\xff\xff\x36\x17\xff\xff\x36\x17\xff\xff" "\x36\x17\xff\xff\x36\x17\xff\xff\x36\x17\xff\xff\x36\x17\xff\xff" "\x36\x17\xff\xff\x36\x17\xff\xff\x36\x17\xff\xff\x36\x17\xff\xff" "\x36\x17\xff\xff\x36\x17\xff\xff\x36\x17\xff\xff\x36\x17\xff\xff" "\x36\x17\xff\xff\x35\x17\xff\xff\x35\x17\xff\xff\x35\x17\xff\xff" "\x35\x17\xff\xff\x35\x17\xff\xff\x35\x17\xff\xff\x35\x17\xff\xff" "\x35\x16\xff\xff\x35\x16\xff\xff\x35\x16\xff\xff\x35\x16\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x5a\x00\x00" "\x5e\x58\x00\x00\x5e\x56\x01\x00\x5e\x55\x3a\x00\x5e\x53\xa3\x00" "\x5e\x52\xf4\x00\x5e\x50\xff\x00\x5e\x4f\xff\x00\x5e\x4d\xff\x00" "\x5e\x4b\xff\x00\x5e\x4a\xff\x00\x5e\x48\xff\x00\x5e\x47\xff\x00" "\x5e\x45\xff\x00\x5e\x44\xff\x00\x5e\x43\xff\x00\x5e\x42\xff\x00" "\x5e\x40\xff\x00\x5e\x3f\xff\x00\x5e\x3e\xff\x00\x5e\x3d\xff\x00" "\x5e\x3c\xff\x00\x5e\x3b\xff\x00\x5e\x3a\xff\x00\x5e\x38\xff\x00" "\x5e\x37\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x35\xff\x00" "\x5e\x34\xff\x00\x5d\x33\xff\x00\x5c\x32\xff\x00\x5b\x31\xff\x00" "\x5a\x31\xff\x00\x59\x30\xff\x00\x57\x2f\xff\x00\x57\x2e\xff\x00" "\x56\x2d\xff\x00\x55\x2d\xff\x00\x54\x2c\xff\x00\x53\x2c\xff\x00" "\x52\x2b\xff\x00\x51\x2a\xff\x00\x51\x2a\xff\x00\x50\x29\xff\x00" "\x4f\x29\xff\x00\x4e\x28\xff\x00\x4d\x27\xff\x00\x4c\x27\xff\x00" "\x4c\x26\xff\x00\x4b\x26\xff\x00\x4a\x25\xff\x00\x4a\x25\xff\x00" "\x49\x24\xff\x00\x49\x24\xff\x00\x48\x23\xff\x00\x47\x23\xff\x00" "\x47\x23\xff\x00\x46\x22\xff\x00\x46\x22\xff\x00\x45\x21\xff\x00" "\x44\x21\xff\x00\x44\x20\xff\x00\x43\x20\xff\x00\x43\x20\xff\x00" "\x42\x1f\xff\x00\x42\x1f\xff\x00\x41\x1f\xff\x00\x41\x1e\xff\x06" "\x41\x1e\xff\x1e\x40\x1e\xff\x36\x40\x1e\xff\x4f\x3f\x1d\xff\x68" "\x3f\x1d\xff\x80\x3e\x1d\xff\x99\x3e\x1c\xff\xb2\x3d\x1c\xff\xca" "\x3d\x1c\xff\xe3\x3d\x1c\xff\xfa\x3c\x1b\xff\xff\x3c\x1b\xff\xff" "\x3c\x1b\xff\xff\x3c\x1b\xff\xff\x3b\x1a\xff\xff\x3b\x1a\xff\xff" "\x3b\x1a\xff\xff\x3a\x1a\xff\xff\x3a\x1a\xff\xff\x3a\x19\xff\xff" "\x39\x19\xff\xff\x39\x19\xff\xff\x39\x19\xff\xff\x39\x19\xff\xff" "\x38\x18\xff\xff\x38\x18\xff\xff\x38\x18\xff\xff\x38\x18\xff\xff" "\x37\x18\xff\xff\x37\x18\xff\xff\x37\x18\xff\xff\x37\x17\xff\xff" "\x37\x17\xff\xff\x36\x17\xff\xff\x36\x17\xff\xff\x36\x17\xff\xff" "\x36\x17\xff\xff\x36\x17\xff\xff\x35\x17\xff\xff\x35\x16\xff\xff" "\x35\x16\xff\xff\x35\x16\xff\xff\x35\x16\xff\xff\x35\x16\xff\xff" "\x34\x16\xff\xff\x34\x16\xff\xff\x34\x16\xff\xff\x34\x16\xff\xff" "\x34\x16\xff\xff\x34\x16\xff\xff\x34\x15\xff\xff\x34\x15\xff\xff" "\x33\x15\xff\xff\x33\x15\xff\xff\x33\x15\xff\xff\x33\x15\xff\xff" "\x33\x15\xff\xff\x33\x15\xff\xff\x33\x15\xff\xff\x33\x15\xff\xff" "\x33\x15\xff\xff\x33\x15\xff\xff\x32\x15\xff\xff\x32\x15\xff\xff" "\x32\x15\xff\xff\x32\x15\xff\xff\x32\x14\xff\xff\x32\x14\xff\xff" "\x32\x14\xff\xff\x32\x14\xff\xff\x32\x14\xff\xff\x32\x14\xff\xff" "\x32\x14\xff\xff\x32\x14\xff\xff\x32\x14\xff\xff\x32\x14\xff\xff" "\x32\x14\xff\xff\x31\x14\xff\xff\x31\x14\xff\xff\x31\x14\xff\xff" "\x31\x14\xff\xff\x31\x14\xff\xff\x31\x14\xff\xff\x31\x14\xff\xff" "\x31\x14\xff\xff\x31\x14\xff\xff\x31\x14\xff\xff\x31\x14\xff\xff" "\x31\x14\xff\xff\x31\x14\xff\xff\x31\x14\xff\xff\x31\x14\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5c\x00\x00\x5e\x59\x00\x00\x5e\x57\x00\x00\x5e\x55\x0d\x00" "\x5e\x54\x68\x00\x5e\x52\xd1\x00\x5e\x50\xff\x00\x5e\x4f\xff\x00" "\x5e\x4d\xff\x00\x5e\x4b\xff\x00\x5e\x4a\xff\x00\x5e\x48\xff\x00" "\x5e\x47\xff\x00\x5e\x45\xff\x00\x5e\x44\xff\x00\x5e\x42\xff\x00" "\x5e\x41\xff\x00\x5e\x40\xff\x00\x5e\x3e\xff\x00\x5e\x3d\xff\x00" "\x5e\x3c\xff\x00\x5e\x3b\xff\x00\x5e\x3a\xff\x00\x5e\x39\xff\x00" "\x5e\x38\xff\x00\x5e\x37\xff\x00\x5e\x35\xff\x00\x5e\x34\xff\x00" "\x5e\x33\xff\x00\x5c\x32\xff\x00\x5b\x32\xff\x00\x5a\x31\xff\x00" "\x59\x30\xff\x00\x58\x2f\xff\x00\x57\x2e\xff\x00\x56\x2e\xff\x00" "\x54\x2d\xff\x00\x53\x2c\xff\x00\x52\x2b\xff\x00\x51\x2a\xff\x00" "\x51\x2a\xff\x00\x50\x29\xff\x00\x4f\x28\xff\x00\x4e\x28\xff\x00" "\x4d\x27\xff\x00\x4c\x27\xff\x00\x4c\x26\xff\x00\x4b\x25\xff\x00" "\x4a\x25\xff\x00\x49\x24\xff\x00\x48\x24\xff\x00\x48\x23\xff\x00" "\x47\x23\xff\x00\x46\x22\xff\x00\x46\x22\xff\x00\x45\x21\xff\x00" "\x44\x21\xff\x00\x44\x21\xff\x00\x43\x20\xff\x00\x43\x20\xff\x00" "\x42\x1f\xff\x00\x42\x1f\xff\x00\x41\x1e\xff\x01\x40\x1e\xff\x17" "\x40\x1e\xff\x38\x3f\x1d\xff\x59\x3f\x1d\xff\x7a\x3e\x1d\xff\x9b" "\x3e\x1c\xff\xba\x3d\x1c\xff\xd4\x3d\x1c\xff\xec\x3d\x1b\xff\xff" "\x3c\x1b\xff\xff\x3c\x1b\xff\xff\x3b\x1b\xff\xff\x3b\x1a\xff\xff" "\x3a\x1a\xff\xff\x3a\x1a\xff\xff\x3a\x19\xff\xff\x39\x19\xff\xff" "\x39\x19\xff\xff\x38\x19\xff\xff\x38\x18\xff\xff\x38\x18\xff\xff" "\x38\x18\xff\xff\x37\x18\xff\xff\x37\x18\xff\xff\x37\x17\xff\xff" "\x36\x17\xff\xff\x36\x17\xff\xff\x36\x17\xff\xff\x35\x17\xff\xff" "\x35\x16\xff\xff\x35\x16\xff\xff\x35\x16\xff\xff\x34\x16\xff\xff" "\x34\x16\xff\xff\x34\x16\xff\xff\x34\x15\xff\xff\x33\x15\xff\xff" "\x33\x15\xff\xff\x33\x15\xff\xff\x33\x15\xff\xff\x33\x15\xff\xff" "\x32\x15\xff\xff\x32\x15\xff\xff\x32\x14\xff\xff\x32\x14\xff\xff" "\x32\x14\xff\xff\x31\x14\xff\xff\x31\x14\xff\xff\x31\x14\xff\xff" "\x31\x14\xff\xff\x31\x14\xff\xff\x31\x13\xff\xff\x31\x13\xff\xff" "\x30\x13\xff\xff\x30\x13\xff\xff\x30\x13\xff\xff\x30\x13\xff\xff" "\x30\x13\xff\xff\x30\x13\xff\xff\x30\x13\xff\xff\x30\x13\xff\xff" "\x2f\x13\xff\xff\x2f\x13\xff\xff\x2f\x13\xff\xff\x2f\x13\xff\xff" "\x2f\x12\xff\xff\x2f\x12\xff\xff\x2f\x12\xff\xff\x2f\x12\xff\xff" "\x2f\x12\xff\xff\x2f\x12\xff\xff\x2f\x12\xff\xff\x2e\x12\xff\xff" "\x2e\x12\xff\xff\x2e\x12\xff\xff\x2e\x12\xff\xff\x2e\x12\xff\xff" "\x2e\x12\xff\xff\x2e\x12\xff\xff\x2e\x12\xff\xff\x2e\x12\xff\xff" "\x2e\x12\xff\xff\x2e\x12\xff\xff\x2e\x12\xff\xff\x2e\x12\xff\xff" "\x2e\x12\xff\xff\x2e\x12\xff\xff\x2e\x12\xff\xff\x2e\x12\xff\xff" "\x2e\x12\xff\xff\x2d\x11\xff\xff\x2d\x11\xff\xff\x2d\x11\xff\xff" "\x2d\x11\xff\xff\x2d\x11\xff\xff\x2d\x11\xff\xff\x2d\x11\xff\xff" "\x2d\x11\xff\xff\x2d\x11\xff\xff\x2d\x11\xff\xff\x2d\x11\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x5b\x00\x00\x5e\x58\x00\x00" "\x5e\x56\x00\x00\x5e\x54\x2d\x00\x5e\x53\x96\x00\x5e\x51\xf3\x00" "\x5e\x4f\xff\x00\x5e\x4d\xff\x00\x5e\x4b\xff\x00\x5e\x4a\xff\x00" "\x5e\x48\xff\x00\x5e\x47\xff\x00\x5e\x45\xff\x00\x5e\x44\xff\x00" "\x5e\x42\xff\x00\x5e\x41\xff\x00\x5e\x3f\xff\x00\x5e\x3e\xff\x00" "\x5e\x3d\xff\x00\x5e\x3b\xff\x00\x5e\x3a\xff\x00\x5e\x39\xff\x00" "\x5e\x38\xff\x00\x5e\x37\xff\x00\x5e\x36\xff\x00\x5e\x35\xff\x00" "\x5d\x34\xff\x00\x5c\x33\xff\x00\x5a\x32\xff\x00\x59\x30\xff\x00" "\x58\x2f\xff\x00\x57\x2f\xff\x00\x56\x2e\xff\x00\x55\x2d\xff\x00" "\x54\x2c\xff\x00\x53\x2b\xff\x00\x51\x2b\xff\x00\x50\x2a\xff\x00" "\x4f\x29\xff\x00\x4e\x28\xff\x00\x4d\x28\xff\x00\x4c\x27\xff\x00" "\x4b\x26\xff\x00\x4b\x26\xff\x00\x4a\x25\xff\x00\x49\x24\xff\x00" "\x48\x24\xff\x00\x48\x23\xff\x00\x47\x23\xff\x00\x46\x22\xff\x00" "\x45\x22\xff\x00\x45\x21\xff\x00\x44\x21\xff\x00\x43\x20\xff\x00" "\x42\x20\xff\x00\x42\x1f\xff\x00\x41\x1f\xff\x00\x41\x1e\xff\x10" "\x40\x1e\xff\x31\x3f\x1d\xff\x52\x3f\x1d\xff\x73\x3e\x1d\xff\x94" "\x3d\x1c\xff\xb5\x3d\x1c\xff\xd6\x3d\x1b\xff\xf6\x3c\x1b\xff\xff" "\x3b\x1b\xff\xff\x3b\x1a\xff\xff\x3a\x1a\xff\xff\x3a\x1a\xff\xff" "\x39\x19\xff\xff\x39\x19\xff\xff\x39\x19\xff\xff\x38\x18\xff\xff" "\x38\x18\xff\xff\x37\x18\xff\xff\x37\x18\xff\xff\x37\x17\xff\xff" "\x36\x17\xff\xff\x36\x17\xff\xff\x35\x17\xff\xff\x35\x16\xff\xff" "\x35\x16\xff\xff\x34\x16\xff\xff\x34\x16\xff\xff\x34\x16\xff\xff" "\x33\x15\xff\xff\x33\x15\xff\xff\x33\x15\xff\xff\x33\x15\xff\xff" "\x32\x15\xff\xff\x32\x14\xff\xff\x32\x14\xff\xff\x31\x14\xff\xff" "\x31\x14\xff\xff\x31\x14\xff\xff\x31\x14\xff\xff\x30\x13\xff\xff" "\x30\x13\xff\xff\x30\x13\xff\xff\x30\x13\xff\xff\x2f\x13\xff\xff" "\x2f\x13\xff\xff\x2f\x13\xff\xff\x2f\x12\xff\xff\x2f\x12\xff\xff" "\x2e\x12\xff\xff\x2e\x12\xff\xff\x2e\x12\xff\xff\x2e\x12\xff\xff" "\x2e\x12\xff\xff\x2e\x12\xff\xff\x2d\x11\xff\xff\x2d\x11\xff\xff" "\x2d\x11\xff\xff\x2d\x11\xff\xff\x2d\x11\xff\xff\x2d\x11\xff\xff" "\x2d\x11\xff\xff\x2c\x11\xff\xff\x2c\x11\xff\xff\x2c\x11\xff\xff" "\x2c\x11\xff\xff\x2c\x11\xff\xff\x2c\x11\xff\xff\x2c\x10\xff\xff" "\x2c\x10\xff\xff\x2c\x10\xff\xff\x2b\x10\xff\xff\x2b\x10\xff\xff" "\x2b\x10\xff\xff\x2b\x10\xff\xff\x2b\x10\xff\xff\x2b\x10\xff\xff" "\x2b\x10\xff\xff\x2b\x10\xff\xff\x2b\x10\xff\xff\x2b\x10\xff\xff" "\x2b\x10\xff\xff\x2b\x10\xff\xff\x2a\x10\xff\xff\x2a\x10\xff\xff" "\x2a\x10\xff\xff\x2a\x10\xff\xff\x2a\x0f\xff\xff\x2a\x0f\xff\xff" "\x2a\x0f\xff\xff\x2a\x0f\xff\xff\x2a\x0f\xff\xff\x2a\x0f\xff\xff" "\x2a\x0f\xff\xff\x2a\x0f\xff\xff\x2a\x0f\xff\xff\x2a\x0f\xff\xff" "\x2a\x0f\xff\xff\x2a\x0f\xff\xff\x2a\x0f\xff\xff\x2a\x0f\xff\xff" "\x2a\x0f\xff\xff\x2a\x0f\xff\xff\x2a\x0f\xff\xff\x2a\x0f\xff\xff" "\x2a\x0f\xff\xff\x2a\x0f\xff\xff\x2a\x0f\xff\xff\x2a\x0f\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x5e\x5a\x00\x00\x5e\x57\x00\x00\x5e\x55\x07\x00\x5e\x54\x5b\x00" "\x5e\x52\xc4\x00\x5e\x50\xff\x00\x5e\x4e\xff\x00\x5e\x4c\xff\x00" "\x5e\x4a\xff\x00\x5e\x48\xff\x00\x5e\x47\xff\x00\x5e\x45\xff\x00" "\x5e\x44\xff\x00\x5e\x42\xff\x00\x5e\x41\xff\x00\x5e\x3f\xff\x00" "\x5e\x3e\xff\x00\x5e\x3d\xff\x00\x5e\x3b\xff\x00\x5e\x3a\xff\x00" "\x5e\x38\xff\x00\x5e\x37\xff\x00\x5e\x36\xff\x00\x5e\x35\xff\x00" "\x5e\x34\xff\x00\x5c\x33\xff\x00\x5b\x32\xff\x00\x59\x31\xff\x00" "\x58\x30\xff\x00\x57\x2f\xff\x00\x55\x2e\xff\x00\x54\x2d\xff\x00" "\x53\x2c\xff\x00\x52\x2b\xff\x00\x51\x2a\xff\x00\x50\x29\xff\x00" "\x4f\x29\xff\x00\x4e\x28\xff\x00\x4d\x27\xff\x00\x4c\x26\xff\x00" "\x4b\x26\xff\x00\x4a\x25\xff\x00\x49\x24\xff\x00\x48\x24\xff\x00" "\x47\x23\xff\x00\x46\x22\xff\x00\x45\x22\xff\x00\x45\x21\xff\x00" "\x44\x21\xff\x00\x43\x20\xff\x00\x42\x20\xff\x00\x42\x1f\xff\x00" "\x41\x1e\xff\x01\x40\x1e\xff\x19\x3f\x1d\xff\x44\x3f\x1d\xff\x6e" "\x3e\x1c\xff\x99\x3d\x1c\xff\xc4\x3c\x1c\xff\xed\x3c\x1b\xff\xff" "\x3c\x1b\xff\xff\x3b\x1a\xff\xff\x3a\x1a\xff\xff\x3a\x1a\xff\xff" "\x39\x19\xff\xff\x39\x19\xff\xff\x38\x19\xff\xff\x38\x18\xff\xff" "\x37\x18\xff\xff\x37\x18\xff\xff\x36\x17\xff\xff\x36\x17\xff\xff" "\x35\x17\xff\xff\x35\x16\xff\xff\x34\x16\xff\xff\x34\x16\xff\xff" "\x34\x16\xff\xff\x33\x15\xff\xff\x33\x15\xff\xff\x33\x15\xff\xff" "\x32\x15\xff\xff\x32\x14\xff\xff\x31\x14\xff\xff\x31\x14\xff\xff" "\x31\x14\xff\xff\x30\x13\xff\xff\x30\x13\xff\xff\x30\x13\xff\xff" "\x2f\x13\xff\xff\x2f\x13\xff\xff\x2f\x12\xff\xff\x2f\x12\xff\xff" "\x2e\x12\xff\xff\x2e\x12\xff\xff\x2e\x12\xff\xff\x2e\x12\xff\xff" "\x2d\x11\xff\xff\x2d\x11\xff\xff\x2d\x11\xff\xff\x2c\x11\xff\xff" "\x2c\x11\xff\xff\x2c\x11\xff\xff\x2c\x10\xff\xff\x2c\x10\xff\xff" "\x2b\x10\xff\xff\x2b\x10\xff\xff\x2b\x10\xff\xff\x2b\x10\xff\xff" "\x2b\x10\xff\xff\x2b\x10\xff\xff\x2a\x10\xff\xff\x2a\x10\xff\xff" "\x2a\x0f\xff\xff\x2a\x0f\xff\xff\x2a\x0f\xff\xff\x29\x0f\xff\xff" "\x29\x0f\xff\xff\x29\x0f\xff\xff\x29\x0f\xff\xff\x29\x0f\xff\xff" "\x29\x0f\xff\xff\x29\x0f\xff\xff\x29\x0f\xff\xff\x28\x0e\xff\xff" "\x28\x0e\xff\xff\x28\x0e\xff\xff\x28\x0e\xff\xff\x28\x0e\xff\xff" "\x28\x0e\xff\xff\x28\x0e\xff\xff\x28\x0e\xff\xff\x28\x0e\xff\xff" "\x28\x0e\xff\xff\x27\x0e\xff\xff\x27\x0e\xff\xff\x27\x0e\xff\xff" "\x27\x0e\xff\xff\x27\x0e\xff\xff\x27\x0e\xff\xff\x27\x0e\xff\xff" "\x27\x0e\xff\xff\x27\x0e\xff\xff\x27\x0d\xff\xff\x27\x0d\xff\xff" "\x27\x0d\xff\xff\x27\x0d\xff\xff\x27\x0d\xff\xff\x27\x0d\xff\xff" "\x26\x0d\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff" "\x26\x0d\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff" "\x26\x0d\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff" "\x26\x0d\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff" "\x26\x0d\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x59\x00\x00\x5e\x57\x00\x00" "\x5e\x54\x0e\x00\x5e\x53\x7a\x00\x5e\x51\xeb\x00\x5e\x4f\xff\x00" "\x5e\x4d\xff\x00\x5e\x4b\xff\x00\x5e\x49\xff\x00\x5e\x48\xff\x00" "\x5e\x46\xff\x00\x5e\x44\xff\x00\x5e\x42\xff\x00\x5e\x41\xff\x00" "\x5e\x3f\xff\x00\x5e\x3e\xff\x00\x5e\x3d\xff\x00\x5e\x3b\xff\x00" "\x5e\x3a\xff\x00\x5e\x38\xff\x00\x5e\x37\xff\x00\x5e\x36\xff\x00" "\x5e\x34\xff\x00\x5d\x33\xff\x00\x5b\x32\xff\x00\x5a\x31\xff\x00" "\x58\x30\xff\x00\x57\x2f\xff\x00\x55\x2e\xff\x00\x54\x2d\xff\x00" "\x53\x2c\xff\x00\x52\x2b\xff\x00\x50\x2a\xff\x00\x4f\x29\xff\x00" "\x4e\x28\xff\x00\x4d\x27\xff\x00\x4c\x27\xff\x00\x4b\x26\xff\x00" "\x4a\x25\xff\x00\x49\x24\xff\x00\x48\x24\xff\x00\x47\x23\xff\x00" "\x46\x22\xff\x00\x45\x22\xff\x00\x44\x21\xff\x00\x43\x20\xff\x00" "\x42\x20\xff\x00\x42\x1f\xff\x00\x41\x1e\xff\x01\x40\x1e\xff\x1a" "\x3f\x1d\xff\x45\x3f\x1d\xff\x6f\x3d\x1c\xff\x9a\x3d\x1c\xff\xc4" "\x3c\x1b\xff\xef\x3c\x1b\xff\xff\x3b\x1a\xff\xff\x3a\x1a\xff\xff" "\x39\x1a\xff\xff\x39\x19\xff\xff\x38\x19\xff\xff\x38\x18\xff\xff" "\x37\x18\xff\xff\x37\x18\xff\xff\x36\x17\xff\xff\x36\x17\xff\xff" "\x35\x17\xff\xff\x35\x16\xff\xff\x34\x16\xff\xff\x34\x16\xff\xff" "\x33\x15\xff\xff\x32\x15\xff\xff\x32\x15\xff\xff\x32\x14\xff\xff" "\x31\x14\xff\xff\x31\x14\xff\xff\x30\x13\xff\xff\x30\x13\xff\xff" "\x30\x13\xff\xff\x2f\x13\xff\xff\x2f\x13\xff\xff\x2f\x12\xff\xff" "\x2e\x12\xff\xff\x2e\x12\xff\xff\x2d\x12\xff\xff\x2d\x11\xff\xff" "\x2d\x11\xff\xff\x2c\x11\xff\xff\x2c\x11\xff\xff\x2c\x11\xff\xff" "\x2c\x10\xff\xff\x2b\x10\xff\xff\x2b\x10\xff\xff\x2b\x10\xff\xff" "\x2b\x10\xff\xff\x2a\x10\xff\xff\x2a\x0f\xff\xff\x2a\x0f\xff\xff" "\x2a\x0f\xff\xff\x29\x0f\xff\xff\x29\x0f\xff\xff\x29\x0f\xff\xff" "\x28\x0f\xff\xff\x28\x0e\xff\xff\x28\x0e\xff\xff\x28\x0e\xff\xff" "\x28\x0e\xff\xff\x28\x0e\xff\xff\x27\x0e\xff\xff\x27\x0e\xff\xff" "\x27\x0e\xff\xff\x27\x0e\xff\xff\x27\x0d\xff\xff\x27\x0d\xff\xff" "\x26\x0d\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff" "\x26\x0d\xff\xff\x26\x0d\xff\xff\x25\x0d\xff\xff\x25\x0d\xff\xff" "\x25\x0d\xff\xff\x25\x0c\xff\xff\x25\x0c\xff\xff\x25\x0c\xff\xff" "\x25\x0c\xff\xff\x25\x0c\xff\xff\x25\x0c\xff\xff\x25\x0c\xff\xff" "\x24\x0c\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff" "\x24\x0c\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff" "\x24\x0c\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff" "\x23\x0c\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff" "\x23\x0b\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff" "\x23\x0b\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff" "\x23\x0b\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff" "\x23\x0b\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff" "\x23\x0b\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff" "\x23\x0b\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x5e\x59\x00\x00\x5e\x57\x00\x00\x5e\x55\x0e\x00\x5e\x52\x7a\x00" "\x5e\x50\xed\x00\x5e\x4e\xff\x00\x5e\x4c\xff\x00\x5e\x4a\xff\x00" "\x5e\x49\xff\x00\x5e\x47\xff\x00\x5e\x45\xff\x00\x5e\x43\xff\x00" "\x5e\x42\xff\x00\x5e\x40\xff\x00\x5e\x3e\xff\x00\x5e\x3d\xff\x00" "\x5e\x3b\xff\x00\x5e\x3a\xff\x00\x5e\x38\xff\x00\x5e\x37\xff\x00" "\x5e\x36\xff\x00\x5e\x34\xff\x00\x5c\x33\xff\x00\x5a\x32\xff\x00" "\x59\x31\xff\x00\x57\x2f\xff\x00\x56\x2e\xff\x00\x54\x2d\xff\x00" "\x53\x2c\xff\x00\x52\x2b\xff\x00\x50\x2a\xff\x00\x4f\x29\xff\x00" "\x4e\x28\xff\x00\x4d\x28\xff\x00\x4b\x27\xff\x00\x4a\x26\xff\x00" "\x49\x25\xff\x00\x48\x24\xff\x00\x47\x23\xff\x00\x46\x23\xff\x00" "\x45\x22\xff\x00\x44\x21\xff\x00\x43\x20\xff\x00\x42\x20\xff\x00" "\x41\x1f\xff\x00\x40\x1e\xff\x01\x3f\x1e\xff\x21\x3f\x1d\xff\x57" "\x3e\x1d\xff\x8d\x3d\x1c\xff\xc3\x3c\x1b\xff\xef\x3c\x1b\xff\xff" "\x3b\x1a\xff\xff\x3a\x1a\xff\xff\x39\x1a\xff\xff\x39\x19\xff\xff" "\x38\x19\xff\xff\x37\x18\xff\xff\x37\x18\xff\xff\x36\x17\xff\xff" "\x35\x17\xff\xff\x35\x16\xff\xff\x34\x16\xff\xff\x34\x16\xff\xff" "\x33\x15\xff\xff\x33\x15\xff\xff\x32\x15\xff\xff\x32\x14\xff\xff" "\x31\x14\xff\xff\x31\x14\xff\xff\x30\x13\xff\xff\x30\x13\xff\xff" "\x2f\x13\xff\xff\x2f\x12\xff\xff\x2e\x12\xff\xff\x2e\x12\xff\xff" "\x2d\x11\xff\xff\x2d\x11\xff\xff\x2d\x11\xff\xff\x2c\x11\xff\xff" "\x2c\x11\xff\xff\x2c\x10\xff\xff\x2b\x10\xff\xff\x2b\x10\xff\xff" "\x2a\x10\xff\xff\x2a\x0f\xff\xff\x2a\x0f\xff\xff\x29\x0f\xff\xff" "\x29\x0f\xff\xff\x29\x0f\xff\xff\x28\x0e\xff\xff\x28\x0e\xff\xff" "\x28\x0e\xff\xff\x28\x0e\xff\xff\x27\x0e\xff\xff\x27\x0e\xff\xff" "\x27\x0e\xff\xff\x27\x0d\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff" "\x26\x0d\xff\xff\x26\x0d\xff\xff\x25\x0d\xff\xff\x25\x0d\xff\xff" "\x25\x0c\xff\xff\x25\x0c\xff\xff\x25\x0c\xff\xff\x24\x0c\xff\xff" "\x24\x0c\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff" "\x24\x0c\xff\xff\x23\x0c\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff" "\x23\x0b\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff\x22\x0b\xff\xff" "\x22\x0b\xff\xff\x22\x0b\xff\xff\x22\x0b\xff\xff\x22\x0b\xff\xff" "\x22\x0b\xff\xff\x22\x0b\xff\xff\x22\x0b\xff\xff\x22\x0a\xff\xff" "\x21\x0a\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff" "\x21\x0a\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff" "\x21\x0a\xff\xff\x21\x0a\xff\xff\x20\x0a\xff\xff\x20\x0a\xff\xff" "\x20\x0a\xff\xff\x20\x0a\xff\xff\x20\x0a\xff\xff\x20\x0a\xff\xff" "\x20\x0a\xff\xff\x20\x0a\xff\xff\x20\x0a\xff\xff\x20\x0a\xff\xff" "\x20\x0a\xff\xff\x20\x0a\xff\xff\x20\x09\xff\xff\x20\x09\xff\xff" "\x20\x09\xff\xff\x20\x09\xff\xff\x20\x09\xff\xff\x20\x09\xff\xff" "\x20\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff" "\x1f\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff" "\x1f\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff" "\x1f\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x59\x00\x00\x5e\x57\x00\x00" "\x5e\x55\x0e\x00\x5e\x52\x7a\x00\x5e\x50\xed\x00\x5e\x4e\xff\x00" "\x5e\x4c\xff\x00\x5e\x4a\xff\x00\x5e\x48\xff\x00\x5e\x46\xff\x00" "\x5e\x44\xff\x00\x5e\x43\xff\x00\x5e\x41\xff\x00\x5e\x3f\xff\x00" "\x5e\x3d\xff\x00\x5e\x3c\xff\x00\x5e\x3a\xff\x00\x5e\x38\xff\x00" "\x5e\x37\xff\x00\x5e\x36\xff\x00\x5e\x34\xff\x00\x5c\x33\xff\x00" "\x5a\x32\xff\x00\x58\x31\xff\x00\x57\x2f\xff\x00\x55\x2e\xff\x00" "\x53\x2d\xff\x00\x52\x2c\xff\x00\x51\x2a\xff\x00\x50\x2a\xff\x00" "\x4e\x29\xff\x00\x4d\x28\xff\x00\x4c\x27\xff\x00\x4b\x26\xff\x00" "\x49\x25\xff\x00\x48\x24\xff\x00\x47\x23\xff\x00\x46\x22\xff\x00" "\x45\x22\xff\x00\x44\x21\xff\x00\x43\x20\xff\x00\x42\x1f\xff\x00" "\x41\x1f\xff\x00\x40\x1e\xff\x13\x3f\x1d\xff\x48\x3e\x1d\xff\x7e" "\x3d\x1c\xff\xb4\x3c\x1b\xff\xea\x3b\x1b\xff\xff\x3a\x1a\xff\xff" "\x39\x1a\xff\xff\x39\x19\xff\xff\x38\x19\xff\xff\x37\x18\xff\xff" "\x37\x18\xff\xff\x36\x17\xff\xff\x35\x17\xff\xff\x35\x16\xff\xff" "\x34\x16\xff\xff\x33\x15\xff\xff\x33\x15\xff\xff\x32\x15\xff\xff" "\x31\x14\xff\xff\x31\x14\xff\xff\x30\x13\xff\xff\x30\x13\xff\xff" "\x2f\x13\xff\xff\x2f\x12\xff\xff\x2e\x12\xff\xff\x2e\x12\xff\xff" "\x2d\x11\xff\xff\x2d\x11\xff\xff\x2c\x11\xff\xff\x2c\x11\xff\xff" "\x2b\x10\xff\xff\x2b\x10\xff\xff\x2a\x10\xff\xff\x2a\x0f\xff\xff" "\x2a\x0f\xff\xff\x29\x0f\xff\xff\x29\x0f\xff\xff\x29\x0f\xff\xff" "\x28\x0e\xff\xff\x28\x0e\xff\xff\x28\x0e\xff\xff\x27\x0e\xff\xff" "\x27\x0e\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff" "\x25\x0d\xff\xff\x25\x0d\xff\xff\x25\x0c\xff\xff\x25\x0c\xff\xff" "\x24\x0c\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff" "\x23\x0c\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff" "\x23\x0b\xff\xff\x22\x0b\xff\xff\x22\x0b\xff\xff\x22\x0b\xff\xff" "\x22\x0b\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff" "\x21\x0a\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff\x20\x0a\xff\xff" "\x20\x0a\xff\xff\x20\x0a\xff\xff\x20\x0a\xff\xff\x20\x0a\xff\xff" "\x20\x09\xff\xff\x20\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff" "\x1f\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff" "\x1f\x09\xff\xff\x1f\x09\xff\xff\x1e\x09\xff\xff\x1e\x09\xff\xff" "\x1e\x09\xff\xff\x1e\x09\xff\xff\x1e\x09\xff\xff\x1e\x09\xff\xff" "\x1e\x08\xff\xff\x1e\x08\xff\xff\x1e\x08\xff\xff\x1e\x08\xff\xff" "\x1e\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff" "\x1d\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff" "\x1d\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff" "\x1d\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff" "\x1d\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff\x1c\x08\xff\xff" "\x1c\x08\xff\xff\x1c\x08\xff\xff\x1c\x08\xff\xff\x1c\x08\xff\xff" "\x1c\x08\xff\xff\x1c\x08\xff\xff\x1c\x08\xff\xff\x1c\x08\xff\xff" "\x1c\x08\xff\xff\x1c\x08\xff\xff\x1c\x08\xff\xff\x1c\x08\xff\xff" "\x1c\x08\xff\xff\x1c\x08\xff\xff\x1c\x08\xff\xff\x1c\x08\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x5e\x59\x00\x00\x5e\x57\x00\x00\x5e\x55\x0e\x00\x5e\x52\x7a\x00" "\x5e\x50\xed\x00\x5e\x4e\xff\x00\x5e\x4c\xff\x00\x5e\x49\xff\x00" "\x5e\x47\xff\x00\x5e\x45\xff\x00\x5e\x44\xff\x00\x5e\x42\xff\x00" "\x5e\x40\xff\x00\x5e\x3e\xff\x00\x5e\x3d\xff\x00\x5e\x3b\xff\x00" "\x5e\x39\xff\x00\x5e\x38\xff\x00\x5e\x36\xff\x00\x5e\x34\xff\x00" "\x5c\x33\xff\x00\x5a\x32\xff\x00\x58\x31\xff\x00\x56\x2f\xff\x00" "\x55\x2e\xff\x00\x53\x2d\xff\x00\x52\x2c\xff\x00\x50\x2b\xff\x00" "\x4f\x29\xff\x00\x4d\x28\xff\x00\x4c\x27\xff\x00\x4b\x26\xff\x00" "\x4a\x25\xff\x00\x48\x24\xff\x00\x47\x23\xff\x00\x46\x23\xff\x00" "\x45\x22\xff\x00\x43\x21\xff\x00\x42\x20\xff\x00\x41\x1f\xff\x00" "\x40\x1e\xff\x04\x3f\x1e\xff\x37\x3e\x1d\xff\x6f\x3d\x1c\xff\xa5" "\x3c\x1c\xff\xdc\x3b\x1b\xff\xff\x3a\x1a\xff\xff\x3a\x1a\xff\xff" "\x39\x19\xff\xff\x38\x19\xff\xff\x37\x18\xff\xff\x36\x17\xff\xff" "\x35\x17\xff\xff\x35\x16\xff\xff\x34\x16\xff\xff\x33\x15\xff\xff" "\x33\x15\xff\xff\x32\x15\xff\xff\x31\x14\xff\xff\x31\x14\xff\xff" "\x30\x13\xff\xff\x2f\x13\xff\xff\x2f\x13\xff\xff\x2e\x12\xff\xff" "\x2d\x12\xff\xff\x2d\x11\xff\xff\x2c\x11\xff\xff\x2c\x11\xff\xff" "\x2b\x10\xff\xff\x2b\x10\xff\xff\x2a\x10\xff\xff\x2a\x0f\xff\xff" "\x29\x0f\xff\xff\x29\x0f\xff\xff\x29\x0f\xff\xff\x28\x0e\xff\xff" "\x28\x0e\xff\xff\x27\x0e\xff\xff\x27\x0e\xff\xff\x26\x0d\xff\xff" "\x26\x0d\xff\xff\x26\x0d\xff\xff\x25\x0d\xff\xff\x25\x0c\xff\xff" "\x25\x0c\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff" "\x23\x0c\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff\x22\x0b\xff\xff" "\x22\x0b\xff\xff\x22\x0b\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff" "\x21\x0a\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff\x20\x0a\xff\xff" "\x20\x0a\xff\xff\x20\x0a\xff\xff\x20\x09\xff\xff\x20\x09\xff\xff" "\x1f\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff" "\x1e\x09\xff\xff\x1e\x09\xff\xff\x1e\x09\xff\xff\x1e\x08\xff\xff" "\x1e\x08\xff\xff\x1e\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff" "\x1d\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff" "\x1d\x08\xff\xff\x1c\x08\xff\xff\x1c\x08\xff\xff\x1c\x08\xff\xff" "\x1c\x07\xff\xff\x1c\x07\xff\xff\x1c\x07\xff\xff\x1c\x07\xff\xff" "\x1c\x07\xff\xff\x1b\x07\xff\xff\x1b\x07\xff\xff\x1b\x07\xff\xff" "\x1b\x07\xff\xff\x1b\x07\xff\xff\x1b\x07\xff\xff\x1b\x07\xff\xff" "\x1b\x07\xff\xff\x1b\x07\xff\xff\x1b\x07\xff\xff\x1b\x07\xff\xff" "\x1a\x07\xff\xff\x1a\x07\xff\xff\x1a\x07\xff\xff\x1a\x07\xff\xff" "\x1a\x07\xff\xff\x1a\x07\xff\xff\x1a\x07\xff\xff\x1a\x06\xff\xff" "\x1a\x06\xff\xff\x1a\x06\xff\xff\x1a\x06\xff\xff\x1a\x06\xff\xff" "\x1a\x06\xff\xff\x1a\x06\xff\xff\x1a\x06\xff\xff\x1a\x06\xff\xff" "\x1a\x06\xff\xff\x1a\x06\xff\xff\x1a\x06\xff\xff\x1a\x06\xff\xff" "\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff" "\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff" "\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff" "\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x59\x00\x00\x5e\x57\x00\x00" "\x5e\x55\x0a\x00\x5e\x52\x7a\x00\x5e\x50\xed\x00\x5e\x4e\xff\x00" "\x5e\x4c\xff\x00\x5e\x49\xff\x00\x5e\x47\xff\x00\x5e\x45\xff\x00" "\x5e\x43\xff\x00\x5e\x41\xff\x00\x5e\x3f\xff\x00\x5e\x3d\xff\x00" "\x5e\x3c\xff\x00\x5e\x3a\xff\x00\x5e\x39\xff\x00\x5e\x37\xff\x00" "\x5e\x35\xff\x00\x5c\x34\xff\x00\x5a\x32\xff\x00\x58\x31\xff\x00" "\x56\x2f\xff\x00\x55\x2e\xff\x00\x53\x2d\xff\x00\x52\x2c\xff\x00" "\x50\x2a\xff\x00\x4f\x29\xff\x00\x4d\x28\xff\x00\x4b\x27\xff\x00" "\x4a\x26\xff\x00\x49\x25\xff\x00\x47\x24\xff\x00\x46\x23\xff\x00" "\x45\x22\xff\x00\x44\x21\xff\x00\x42\x20\xff\x00\x41\x1f\xff\x00" "\x40\x1f\xff\x01\x3f\x1e\xff\x28\x3e\x1d\xff\x6c\x3d\x1c\xff\xb0" "\x3c\x1b\xff\xf1\x3b\x1b\xff\xff\x3a\x1a\xff\xff\x39\x19\xff\xff" "\x38\x19\xff\xff\x37\x18\xff\xff\x36\x18\xff\xff\x35\x17\xff\xff" "\x35\x17\xff\xff\x34\x16\xff\xff\x33\x15\xff\xff\x32\x15\xff\xff" "\x31\x14\xff\xff\x31\x14\xff\xff\x30\x13\xff\xff\x2f\x13\xff\xff" "\x2f\x13\xff\xff\x2e\x12\xff\xff\x2d\x12\xff\xff\x2d\x11\xff\xff" "\x2c\x11\xff\xff\x2c\x11\xff\xff\x2b\x10\xff\xff\x2a\x10\xff\xff" "\x2a\x0f\xff\xff\x29\x0f\xff\xff\x29\x0f\xff\xff\x28\x0e\xff\xff" "\x28\x0e\xff\xff\x27\x0e\xff\xff\x27\x0e\xff\xff\x26\x0d\xff\xff" "\x26\x0d\xff\xff\x25\x0d\xff\xff\x25\x0d\xff\xff\x25\x0c\xff\xff" "\x24\x0c\xff\xff\x24\x0c\xff\xff\x23\x0c\xff\xff\x23\x0b\xff\xff" "\x23\x0b\xff\xff\x22\x0b\xff\xff\x22\x0b\xff\xff\x22\x0b\xff\xff" "\x21\x0a\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff\x20\x0a\xff\xff" "\x20\x0a\xff\xff\x20\x0a\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff" "\x1f\x09\xff\xff\x1f\x09\xff\xff\x1e\x09\xff\xff\x1e\x09\xff\xff" "\x1e\x08\xff\xff\x1e\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff" "\x1d\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff\x1c\x08\xff\xff" "\x1c\x08\xff\xff\x1c\x07\xff\xff\x1c\x07\xff\xff\x1c\x07\xff\xff" "\x1b\x07\xff\xff\x1b\x07\xff\xff\x1b\x07\xff\xff\x1b\x07\xff\xff" "\x1b\x07\xff\xff\x1b\x07\xff\xff\x1a\x07\xff\xff\x1a\x07\xff\xff" "\x1a\x07\xff\xff\x1a\x06\xff\xff\x1a\x06\xff\xff\x1a\x06\xff\xff" "\x1a\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff" "\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff" "\x19\x06\xff\xff\x19\x06\xff\xff\x18\x06\xff\xff\x18\x06\xff\xff" "\x18\x06\xff\xff\x18\x06\xff\xff\x18\x06\xff\xff\x18\x06\xff\xff" "\x18\x05\xff\xff\x18\x05\xff\xff\x18\x05\xff\xff\x18\x05\xff\xff" "\x18\x05\xff\xff\x18\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff" "\x16\x05\xff\xff\x16\x05\xff\xff\x16\x05\xff\xff\x16\x05\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5a\x00\x00\x5e\x58\x00\x00\x5e\x55\x00\x00\x5e\x52\x4b\x00" "\x5e\x50\xdf\x00\x5e\x4e\xff\x00\x5e\x4c\xff\x00\x5e\x49\xff\x00" "\x5e\x47\xff\x00\x5e\x45\xff\x00\x5e\x43\xff\x00\x5e\x41\xff\x00" "\x5e\x3f\xff\x00\x5e\x3d\xff\x00\x5e\x3b\xff\x00\x5e\x3a\xff\x00" "\x5e\x38\xff\x00\x5e\x36\xff\x00\x5d\x35\xff\x00\x5a\x33\xff\x00" "\x58\x32\xff\x00\x56\x30\xff\x00\x55\x2f\xff\x00\x53\x2d\xff\x00" "\x52\x2c\xff\x00\x50\x2a\xff\x00\x4f\x29\xff\x00\x4d\x28\xff\x00" "\x4b\x27\xff\x00\x4a\x26\xff\x00\x48\x25\xff\x00\x47\x24\xff\x00" "\x45\x23\xff\x00\x44\x22\xff\x00\x43\x21\xff\x00\x42\x20\xff\x00" "\x40\x1f\xff\x00\x3f\x1e\xff\x17\x3e\x1d\xff\x5b\x3d\x1c\xff\x9f" "\x3c\x1c\xff\xe3\x3b\x1b\xff\xff\x3a\x1a\xff\xff\x38\x19\xff\xff" "\x37\x19\xff\xff\x36\x18\xff\xff\x36\x17\xff\xff\x35\x17\xff\xff" "\x34\x16\xff\xff\x33\x16\xff\xff\x32\x15\xff\xff\x31\x14\xff\xff" "\x31\x14\xff\xff\x30\x13\xff\xff\x2f\x13\xff\xff\x2e\x12\xff\xff" "\x2d\x12\xff\xff\x2d\x11\xff\xff\x2c\x11\xff\xff\x2c\x11\xff\xff" "\x2b\x10\xff\xff\x2a\x10\xff\xff\x2a\x0f\xff\xff\x29\x0f\xff\xff" "\x29\x0f\xff\xff\x28\x0e\xff\xff\x27\x0e\xff\xff\x27\x0e\xff\xff" "\x26\x0d\xff\xff\x26\x0d\xff\xff\x25\x0d\xff\xff\x25\x0c\xff\xff" "\x24\x0c\xff\xff\x24\x0c\xff\xff\x23\x0c\xff\xff\x23\x0b\xff\xff" "\x23\x0b\xff\xff\x22\x0b\xff\xff\x22\x0b\xff\xff\x21\x0a\xff\xff" "\x21\x0a\xff\xff\x20\x0a\xff\xff\x20\x0a\xff\xff\x20\x0a\xff\xff" "\x1f\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff\x1e\x09\xff\xff" "\x1e\x09\xff\xff\x1e\x08\xff\xff\x1e\x08\xff\xff\x1d\x08\xff\xff" "\x1d\x08\xff\xff\x1d\x08\xff\xff\x1c\x08\xff\xff\x1c\x08\xff\xff" "\x1c\x07\xff\xff\x1c\x07\xff\xff\x1b\x07\xff\xff\x1b\x07\xff\xff" "\x1b\x07\xff\xff\x1b\x07\xff\xff\x1a\x07\xff\xff\x1a\x07\xff\xff" "\x1a\x07\xff\xff\x1a\x06\xff\xff\x1a\x06\xff\xff\x19\x06\xff\xff" "\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff" "\x18\x06\xff\xff\x18\x06\xff\xff\x18\x06\xff\xff\x18\x05\xff\xff" "\x18\x05\xff\xff\x18\x05\xff\xff\x18\x05\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff\x16\x05\xff\xff" "\x16\x05\xff\xff\x16\x05\xff\xff\x16\x05\xff\xff\x16\x05\xff\xff" "\x16\x05\xff\xff\x16\x04\xff\xff\x16\x04\xff\xff\x16\x04\xff\xff" "\x16\x04\xff\xff\x16\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff" "\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff" "\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff" "\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff" "\x15\x04\xff\xff\x15\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x59\x00\x00" "\x5e\x56\x00\x00\x5e\x53\x1d\x00\x5e\x50\xae\x00\x5e\x4e\xff\x00" "\x5e\x4c\xff\x00\x5e\x49\xff\x00\x5e\x47\xff\x00\x5e\x45\xff\x00" "\x5e\x43\xff\x00\x5e\x41\xff\x00\x5e\x3f\xff\x00\x5e\x3d\xff\x00" "\x5e\x3b\xff\x00\x5e\x39\xff\x00\x5e\x37\xff\x00\x5e\x36\xff\x00" "\x5c\x34\xff\x00\x59\x32\xff\x00\x57\x31\xff\x00\x55\x2f\xff\x00" "\x54\x2e\xff\x00\x52\x2d\xff\x00\x50\x2b\xff\x00\x4f\x2a\xff\x00" "\x4d\x28\xff\x00\x4b\x27\xff\x00\x4a\x26\xff\x00\x48\x25\xff\x00" "\x47\x24\xff\x00\x45\x23\xff\x00\x44\x22\xff\x00\x42\x21\xff\x00" "\x41\x20\xff\x00\x40\x1f\xff\x08\x3e\x1e\xff\x49\x3d\x1d\xff\x8e" "\x3c\x1c\xff\xd2\x3b\x1b\xff\xff\x3a\x1a\xff\xff\x39\x1a\xff\xff" "\x38\x19\xff\xff\x37\x18\xff\xff\x35\x17\xff\xff\x34\x17\xff\xff" "\x33\x16\xff\xff\x32\x15\xff\xff\x32\x15\xff\xff\x31\x14\xff\xff" "\x30\x14\xff\xff\x2f\x13\xff\xff\x2e\x13\xff\xff\x2e\x12\xff\xff" "\x2d\x12\xff\xff\x2c\x11\xff\xff\x2b\x11\xff\xff\x2a\x10\xff\xff" "\x2a\x10\xff\xff\x29\x0f\xff\xff\x28\x0f\xff\xff\x28\x0e\xff\xff" "\x27\x0e\xff\xff\x27\x0e\xff\xff\x26\x0d\xff\xff\x25\x0d\xff\xff" "\x25\x0d\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff\x23\x0c\xff\xff" "\x23\x0b\xff\xff\x22\x0b\xff\xff\x22\x0b\xff\xff\x21\x0a\xff\xff" "\x21\x0a\xff\xff\x21\x0a\xff\xff\x20\x0a\xff\xff\x20\x0a\xff\xff" "\x1f\x09\xff\xff\x1f\x09\xff\xff\x1e\x09\xff\xff\x1e\x09\xff\xff" "\x1e\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff" "\x1c\x08\xff\xff\x1c\x08\xff\xff\x1c\x07\xff\xff\x1b\x07\xff\xff" "\x1b\x07\xff\xff\x1b\x07\xff\xff\x1b\x07\xff\xff\x1a\x07\xff\xff" "\x1a\x06\xff\xff\x1a\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff" "\x19\x06\xff\xff\x19\x06\xff\xff\x18\x06\xff\xff\x18\x06\xff\xff" "\x18\x06\xff\xff\x18\x05\xff\xff\x18\x05\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff" "\x16\x05\xff\xff\x16\x05\xff\xff\x16\x05\xff\xff\x16\x05\xff\xff" "\x16\x04\xff\xff\x16\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff" "\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff" "\x15\x04\xff\xff\x15\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x14\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff" "\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff" "\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff" "\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff" "\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff" "\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff" "\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff" "\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff" "\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff" "\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff" "\x12\x03\xff\xff\x11\x03\xff\xff\x11\x03\xff\xff\x11\x03\xff\xff" "\x11\x03\xff\xff\x11\x03\xff\xff\x11\x03\xff\xff\x11\x03\xff\xff" "\x11\x03\xff\xff\x11\x03\xff\xff\x11\x03\xff\xff\x11\x03\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5d\x00\x00\x5e\x5a\x00\x00\x5e\x57\x00\x00\x5e\x54\x05\x00" "\x5e\x52\x74\x00\x5e\x4f\xf4\x00\x5e\x4c\xff\x00\x5e\x4a\xff\x00" "\x5e\x47\xff\x00\x5e\x45\xff\x00\x5e\x43\xff\x00\x5e\x41\xff\x00" "\x5e\x3f\xff\x00\x5e\x3d\xff\x00\x5e\x3b\xff\x00\x5e\x39\xff\x00" "\x5e\x37\xff\x00\x5d\x35\xff\x00\x5b\x33\xff\x00\x58\x32\xff\x00" "\x56\x30\xff\x00\x54\x2f\xff\x00\x53\x2d\xff\x00\x51\x2c\xff\x00" "\x4f\x2a\xff\x00\x4d\x29\xff\x00\x4b\x28\xff\x00\x4a\x26\xff\x00" "\x48\x25\xff\x00\x47\x24\xff\x00\x45\x23\xff\x00\x44\x22\xff\x00" "\x42\x21\xff\x00\x41\x20\xff\x00\x3f\x1f\xff\x08\x3e\x1e\xff\x50" "\x3d\x1d\xff\xa5\x3b\x1c\xff\xf2\x3a\x1b\xff\xff\x39\x1a\xff\xff" "\x38\x19\xff\xff\x37\x18\xff\xff\x36\x18\xff\xff\x35\x17\xff\xff" "\x34\x16\xff\xff\x33\x16\xff\xff\x32\x15\xff\xff\x30\x14\xff\xff" "\x2f\x14\xff\xff\x2f\x13\xff\xff\x2e\x12\xff\xff\x2d\x12\xff\xff" "\x2c\x11\xff\xff\x2b\x11\xff\xff\x2b\x10\xff\xff\x2a\x10\xff\xff" "\x29\x0f\xff\xff\x28\x0f\xff\xff\x28\x0e\xff\xff\x27\x0e\xff\xff" "\x26\x0e\xff\xff\x26\x0d\xff\xff\x25\x0d\xff\xff\x24\x0c\xff\xff" "\x24\x0c\xff\xff\x23\x0c\xff\xff\x23\x0b\xff\xff\x22\x0b\xff\xff" "\x22\x0b\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff\x20\x0a\xff\xff" "\x20\x0a\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff\x1e\x09\xff\xff" "\x1e\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff" "\x1c\x08\xff\xff\x1c\x07\xff\xff\x1b\x07\xff\xff\x1b\x07\xff\xff" "\x1b\x07\xff\xff\x1a\x07\xff\xff\x1a\x07\xff\xff\x1a\x06\xff\xff" "\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff\x18\x06\xff\xff" "\x18\x06\xff\xff\x18\x06\xff\xff\x18\x05\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff\x16\x05\xff\xff" "\x16\x05\xff\xff\x16\x05\xff\xff\x16\x04\xff\xff\x16\x04\xff\xff" "\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff" "\x15\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x14\x04\xff\xff\x14\x03\xff\xff\x13\x03\xff\xff" "\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff" "\x13\x03\xff\xff\x13\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff" "\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff" "\x12\x03\xff\xff\x12\x03\xff\xff\x11\x03\xff\xff\x11\x03\xff\xff" "\x11\x03\xff\xff\x11\x02\xff\xff\x11\x02\xff\xff\x11\x02\xff\xff" "\x11\x02\xff\xff\x11\x02\xff\xff\x11\x02\xff\xff\x11\x02\xff\xff" "\x11\x02\xff\xff\x11\x02\xff\xff\x11\x02\xff\xff\x10\x02\xff\xff" "\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff" "\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff" "\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff" "\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff" "\x10\x02\xff\xff\x10\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00" "\x5e\x58\x00\x00\x5e\x55\x00\x00\x5e\x53\x3b\x00\x5e\x50\xd2\x00" "\x5e\x4d\xff\x00\x5e\x4b\xff\x00\x5e\x48\xff\x00\x5e\x46\xff\x00" "\x5e\x43\xff\x00\x5e\x41\xff\x00\x5e\x3f\xff\x00\x5e\x3d\xff\x00" "\x5e\x3b\xff\x00\x5e\x39\xff\x00\x5e\x37\xff\x00\x5c\x35\xff\x00" "\x5a\x33\xff\x00\x57\x32\xff\x00\x55\x30\xff\x00\x54\x2e\xff\x00" "\x52\x2d\xff\x00\x50\x2b\xff\x00\x4e\x2a\xff\x00\x4c\x28\xff\x00" "\x4a\x27\xff\x00\x48\x26\xff\x00\x47\x24\xff\x00\x45\x23\xff\x00" "\x44\x22\xff\x00\x42\x21\xff\x00\x41\x20\xff\x00\x3f\x1f\xff\x09" "\x3e\x1e\xff\x51\x3d\x1d\xff\xa6\x3b\x1c\xff\xf3\x3a\x1b\xff\xff" "\x38\x1a\xff\xff\x37\x19\xff\xff\x36\x18\xff\xff\x35\x17\xff\xff" "\x34\x16\xff\xff\x33\x16\xff\xff\x32\x15\xff\xff\x31\x14\xff\xff" "\x30\x14\xff\xff\x2f\x13\xff\xff\x2e\x12\xff\xff\x2d\x12\xff\xff" "\x2c\x11\xff\xff\x2b\x11\xff\xff\x2a\x10\xff\xff\x29\x0f\xff\xff" "\x29\x0f\xff\xff\x28\x0e\xff\xff\x27\x0e\xff\xff\x26\x0e\xff\xff" "\x26\x0d\xff\xff\x25\x0d\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff" "\x23\x0c\xff\xff\x22\x0b\xff\xff\x22\x0b\xff\xff\x21\x0a\xff\xff" "\x21\x0a\xff\xff\x20\x0a\xff\xff\x20\x0a\xff\xff\x1f\x09\xff\xff" "\x1e\x09\xff\xff\x1e\x09\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff" "\x1c\x08\xff\xff\x1c\x08\xff\xff\x1c\x07\xff\xff\x1b\x07\xff\xff" "\x1b\x07\xff\xff\x1a\x07\xff\xff\x1a\x07\xff\xff\x1a\x06\xff\xff" "\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff\x18\x06\xff\xff" "\x18\x05\xff\xff\x18\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x16\x05\xff\xff\x16\x05\xff\xff\x16\x04\xff\xff" "\x16\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff" "\x15\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff" "\x13\x03\xff\xff\x13\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff" "\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff" "\x11\x03\xff\xff\x11\x03\xff\xff\x11\x02\xff\xff\x11\x02\xff\xff" "\x11\x02\xff\xff\x11\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff" "\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff" "\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff" "\x0e\x02\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff" "\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff" "\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff" "\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff" "\x0e\x01\xff\xff\x0e\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x59\x00\x00\x5e\x56\x00\x00" "\x5e\x54\x10\x00\x5e\x51\x9c\x00\x5e\x4e\xff\x00\x5e\x4c\xff\x00" "\x5e\x49\xff\x00\x5e\x46\xff\x00\x5e\x44\xff\x00\x5e\x42\xff\x00" "\x5e\x3f\xff\x00\x5e\x3d\xff\x00\x5e\x3b\xff\x00\x5e\x39\xff\x00" "\x5e\x37\xff\x00\x5c\x35\xff\x00\x59\x33\xff\x00\x57\x32\xff\x00" "\x54\x30\xff\x00\x53\x2e\xff\x00\x51\x2c\xff\x00\x4f\x2b\xff\x00" "\x4d\x29\xff\x00\x4b\x28\xff\x00\x49\x27\xff\x00\x48\x25\xff\x00" "\x46\x24\xff\x00\x44\x23\xff\x00\x42\x21\xff\x00\x41\x20\xff\x00" "\x3f\x1f\xff\x0a\x3e\x1e\xff\x53\x3d\x1d\xff\xa8\x3b\x1c\xff\xf4" "\x3a\x1b\xff\xff\x38\x1a\xff\xff\x37\x19\xff\xff\x36\x18\xff\xff" "\x34\x17\xff\xff\x33\x16\xff\xff\x32\x15\xff\xff\x31\x15\xff\xff" "\x30\x14\xff\xff\x2f\x13\xff\xff\x2e\x13\xff\xff\x2d\x12\xff\xff" "\x2c\x11\xff\xff\x2b\x11\xff\xff\x2a\x10\xff\xff\x29\x10\xff\xff" "\x28\x0f\xff\xff\x27\x0e\xff\xff\x27\x0e\xff\xff\x26\x0d\xff\xff" "\x25\x0d\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff\x23\x0c\xff\xff" "\x22\x0b\xff\xff\x22\x0b\xff\xff\x21\x0a\xff\xff\x20\x0a\xff\xff" "\x20\x0a\xff\xff\x1f\x09\xff\xff\x1e\x09\xff\xff\x1e\x09\xff\xff" "\x1d\x08\xff\xff\x1d\x08\xff\xff\x1c\x08\xff\xff\x1c\x08\xff\xff" "\x1b\x07\xff\xff\x1b\x07\xff\xff\x1a\x07\xff\xff\x1a\x07\xff\xff" "\x1a\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff\x18\x06\xff\xff" "\x18\x06\xff\xff\x18\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x16\x05\xff\xff\x16\x05\xff\xff\x16\x04\xff\xff" "\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x14\x04\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff" "\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff\x12\x03\xff\xff" "\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff\x11\x03\xff\xff" "\x11\x03\xff\xff\x11\x02\xff\xff\x11\x02\xff\xff\x11\x02\xff\xff" "\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff" "\x10\x02\xff\xff\x10\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0e\x02\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff" "\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff" "\x0e\x01\xff\xff\x0e\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5b\x00\x00\x5e\x58\x00\x00\x5e\x55\x00\x00\x5e\x52\x37\x00" "\x5e\x4f\xdf\x00\x5e\x4d\xff\x00\x5e\x4a\xff\x00\x5e\x47\xff\x00" "\x5e\x45\xff\x00\x5e\x43\xff\x00\x5e\x40\xff\x00\x5e\x3e\xff\x00" "\x5e\x3b\xff\x00\x5e\x39\xff\x00\x5e\x37\xff\x00\x5c\x35\xff\x00" "\x59\x33\xff\x00\x57\x32\xff\x00\x55\x30\xff\x00\x52\x2e\xff\x00" "\x50\x2c\xff\x00\x4e\x2b\xff\x00\x4c\x29\xff\x00\x4a\x27\xff\x00" "\x49\x26\xff\x00\x47\x25\xff\x00\x45\x23\xff\x00\x43\x22\xff\x00" "\x42\x21\xff\x00\x40\x20\xff\x01\x3e\x1e\xff\x3a\x3d\x1d\xff\xa3" "\x3b\x1c\xff\xf4\x3a\x1b\xff\xff\x38\x1a\xff\xff\x37\x19\xff\xff" "\x36\x18\xff\xff\x34\x17\xff\xff\x33\x16\xff\xff\x32\x15\xff\xff" "\x31\x15\xff\xff\x2f\x14\xff\xff\x2e\x13\xff\xff\x2d\x12\xff\xff" "\x2c\x12\xff\xff\x2b\x11\xff\xff\x2a\x10\xff\xff\x29\x10\xff\xff" "\x28\x0f\xff\xff\x28\x0f\xff\xff\x27\x0e\xff\xff\x26\x0d\xff\xff" "\x25\x0d\xff\xff\x24\x0c\xff\xff\x23\x0c\xff\xff\x23\x0b\xff\xff" "\x22\x0b\xff\xff\x21\x0b\xff\xff\x20\x0a\xff\xff\x20\x0a\xff\xff" "\x1f\x09\xff\xff\x1e\x09\xff\xff\x1e\x09\xff\xff\x1d\x08\xff\xff" "\x1d\x08\xff\xff\x1c\x08\xff\xff\x1b\x07\xff\xff\x1b\x07\xff\xff" "\x1a\x07\xff\xff\x1a\x07\xff\xff\x1a\x06\xff\xff\x19\x06\xff\xff" "\x19\x06\xff\xff\x18\x06\xff\xff\x18\x05\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x16\x05\xff\xff\x16\x05\xff\xff\x16\x04\xff\xff" "\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x14\x04\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff" "\x13\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff" "\x11\x03\xff\xff\x11\x03\xff\xff\x11\x02\xff\xff\x11\x02\xff\xff" "\x11\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff" "\x10\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff\x0e\x02\xff\xff" "\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff" "\x0e\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0c\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x00\xff\xff\x0b\x00\xff\xff\x0b\x00\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x5a\x00\x00" "\x5e\x57\x00\x00\x5e\x54\x01\x00\x5e\x51\x73\x00\x5e\x4e\xfb\x00" "\x5e\x4b\xff\x00\x5e\x48\xff\x00\x5e\x46\xff\x00\x5e\x43\xff\x00" "\x5e\x41\xff\x00\x5e\x3f\xff\x00\x5e\x3c\xff\x00\x5e\x3a\xff\x00" "\x5e\x38\xff\x00\x5c\x35\xff\x00\x59\x33\xff\x00\x57\x32\xff\x00" "\x55\x30\xff\x00\x52\x2e\xff\x00\x50\x2c\xff\x00\x4e\x2b\xff\x00" "\x4c\x29\xff\x00\x4a\x27\xff\x00\x48\x26\xff\x00\x46\x24\xff\x00" "\x44\x23\xff\x00\x43\x21\xff\x00\x41\x20\xff\x00\x3f\x1f\xff\x0d" "\x3d\x1e\xff\x68\x3c\x1d\xff\xd1\x3a\x1b\xff\xff\x38\x1a\xff\xff" "\x37\x19\xff\xff\x36\x18\xff\xff\x34\x17\xff\xff\x33\x16\xff\xff" "\x32\x15\xff\xff\x31\x15\xff\xff\x2f\x14\xff\xff\x2e\x13\xff\xff" "\x2d\x12\xff\xff\x2c\x11\xff\xff\x2a\x11\xff\xff\x2a\x10\xff\xff" "\x29\x0f\xff\xff\x28\x0f\xff\xff\x27\x0e\xff\xff\x26\x0e\xff\xff" "\x25\x0d\xff\xff\x24\x0d\xff\xff\x23\x0c\xff\xff\x22\x0b\xff\xff" "\x22\x0b\xff\xff\x21\x0b\xff\xff\x20\x0a\xff\xff\x1f\x0a\xff\xff" "\x1f\x09\xff\xff\x1e\x09\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff" "\x1c\x08\xff\xff\x1b\x08\xff\xff\x1b\x07\xff\xff\x1a\x07\xff\xff" "\x1a\x07\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff\x18\x06\xff\xff" "\x18\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff\x16\x05\xff\xff" "\x16\x05\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff" "\x14\x04\xff\xff\x14\x04\xff\xff\x13\x04\xff\xff\x13\x03\xff\xff" "\x13\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff" "\x11\x03\xff\xff\x11\x03\xff\xff\x11\x02\xff\xff\x11\x02\xff\xff" "\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0e\x02\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff" "\x0e\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x00\xff\xff" "\x0b\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x59\x00\x00\x5e\x56\x00\x00" "\x5e\x53\x13\x00\x5e\x50\xb3\x00\x5e\x4d\xff\x00\x5e\x4a\xff\x00" "\x5e\x47\xff\x00\x5e\x44\xff\x00\x5e\x42\xff\x00\x5e\x3f\xff\x00" "\x5e\x3d\xff\x00\x5e\x3b\xff\x00\x5e\x39\xff\x00\x5c\x36\xff\x00" "\x59\x34\xff\x00\x57\x32\xff\x00\x55\x30\xff\x00\x52\x2e\xff\x00" "\x50\x2c\xff\x00\x4e\x2b\xff\x00\x4c\x29\xff\x00\x49\x27\xff\x00" "\x47\x26\xff\x00\x45\x24\xff\x00\x44\x23\xff\x00\x42\x21\xff\x00" "\x40\x20\xff\x00\x3e\x1e\xff\x2d\x3d\x1d\xff\x96\x3b\x1c\xff\xf3" "\x39\x1b\xff\xff\x38\x1a\xff\xff\x36\x19\xff\xff\x34\x18\xff\xff" "\x33\x17\xff\xff\x32\x16\xff\xff\x31\x15\xff\xff\x2f\x14\xff\xff" "\x2e\x13\xff\xff\x2d\x12\xff\xff\x2c\x11\xff\xff\x2b\x11\xff\xff" "\x29\x10\xff\xff\x28\x0f\xff\xff\x27\x0f\xff\xff\x26\x0e\xff\xff" "\x25\x0d\xff\xff\x24\x0d\xff\xff\x23\x0c\xff\xff\x23\x0c\xff\xff" "\x22\x0b\xff\xff\x21\x0b\xff\xff\x20\x0a\xff\xff\x1f\x0a\xff\xff" "\x1e\x09\xff\xff\x1e\x09\xff\xff\x1d\x08\xff\xff\x1c\x08\xff\xff" "\x1c\x08\xff\xff\x1b\x07\xff\xff\x1a\x07\xff\xff\x1a\x07\xff\xff" "\x19\x06\xff\xff\x19\x06\xff\xff\x18\x06\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x16\x05\xff\xff\x16\x05\xff\xff\x15\x04\xff\xff" "\x15\x04\xff\xff\x15\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff" "\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff\x12\x03\xff\xff" "\x12\x03\xff\xff\x11\x03\xff\xff\x11\x03\xff\xff\x11\x02\xff\xff" "\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff" "\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5b\x00\x00\x5e\x58\x00\x00\x5e\x55\x00\x00\x5e\x52\x3b\x00" "\x5e\x4f\xe2\x00\x5e\x4c\xff\x00\x5e\x49\xff\x00\x5e\x46\xff\x00" "\x5e\x43\xff\x00\x5e\x40\xff\x00\x5e\x3e\xff\x00\x5e\x3c\xff\x00" "\x5e\x39\xff\x00\x5c\x37\xff\x00\x59\x35\xff\x00\x57\x33\xff\x00" "\x55\x31\xff\x00\x52\x2f\xff\x00\x50\x2d\xff\x00\x4e\x2b\xff\x00" "\x4c\x29\xff\x00\x49\x27\xff\x00\x47\x26\xff\x00\x45\x24\xff\x00" "\x43\x23\xff\x00\x41\x21\xff\x00\x3f\x20\xff\x07\x3d\x1e\xff\x5b" "\x3c\x1d\xff\xc4\x3a\x1c\xff\xff\x39\x1b\xff\xff\x37\x19\xff\xff" "\x35\x18\xff\xff\x34\x17\xff\xff\x32\x16\xff\xff\x31\x15\xff\xff" "\x2f\x14\xff\xff\x2e\x13\xff\xff\x2d\x12\xff\xff\x2c\x11\xff\xff" "\x2a\x11\xff\xff\x29\x10\xff\xff\x28\x0f\xff\xff\x27\x0f\xff\xff" "\x26\x0e\xff\xff\x25\x0d\xff\xff\x24\x0d\xff\xff\x23\x0c\xff\xff" "\x22\x0b\xff\xff\x21\x0b\xff\xff\x20\x0a\xff\xff\x1f\x0a\xff\xff" "\x1f\x09\xff\xff\x1e\x09\xff\xff\x1d\x08\xff\xff\x1c\x08\xff\xff" "\x1b\x08\xff\xff\x1b\x07\xff\xff\x1a\x07\xff\xff\x19\x06\xff\xff" "\x19\x06\xff\xff\x18\x06\xff\xff\x18\x06\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x16\x05\xff\xff\x15\x05\xff\xff\x15\x04\xff\xff" "\x14\x04\xff\xff\x14\x04\xff\xff\x13\x04\xff\xff\x13\x03\xff\xff" "\x13\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff\x11\x03\xff\xff" "\x11\x03\xff\xff\x11\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff" "\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x5a\x00\x00" "\x5e\x57\x00\x00\x5e\x54\x02\x00\x5e\x51\x78\x00\x5e\x4e\xfc\x00" "\x5e\x4a\xff\x00\x5e\x48\xff\x00\x5e\x45\xff\x00\x5e\x42\xff\x00" "\x5e\x3f\xff\x00\x5e\x3d\xff\x00\x5e\x3a\xff\x00\x5e\x38\xff\x00" "\x5a\x36\xff\x00\x58\x34\xff\x00\x55\x32\xff\x00\x52\x2f\xff\x00" "\x50\x2d\xff\x00\x4e\x2b\xff\x00\x4c\x2a\xff\x00\x49\x28\xff\x00" "\x47\x26\xff\x00\x45\x24\xff\x00\x43\x23\xff\x00\x41\x21\xff\x00" "\x3f\x20\xff\x0e\x3d\x1e\xff\x7a\x3b\x1d\xff\xeb\x3a\x1c\xff\xff" "\x38\x1a\xff\xff\x36\x19\xff\xff\x35\x18\xff\xff\x33\x17\xff\xff" "\x32\x16\xff\xff\x30\x15\xff\xff\x2f\x14\xff\xff\x2d\x13\xff\xff" "\x2c\x12\xff\xff\x2a\x11\xff\xff\x29\x10\xff\xff\x28\x0f\xff\xff" "\x27\x0f\xff\xff\x26\x0e\xff\xff\x25\x0d\xff\xff\x24\x0d\xff\xff" "\x23\x0c\xff\xff\x22\x0b\xff\xff\x21\x0b\xff\xff\x20\x0a\xff\xff" "\x1f\x0a\xff\xff\x1e\x09\xff\xff\x1d\x09\xff\xff\x1c\x08\xff\xff" "\x1c\x08\xff\xff\x1b\x07\xff\xff\x1a\x07\xff\xff\x19\x07\xff\xff" "\x19\x06\xff\xff\x18\x06\xff\xff\x17\x06\xff\xff\x17\x05\xff\xff" "\x16\x05\xff\xff\x16\x05\xff\xff\x15\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x13\x04\xff\xff\x13\x03\xff\xff\x12\x03\xff\xff" "\x12\x03\xff\xff\x11\x03\xff\xff\x11\x03\xff\xff\x11\x02\xff\xff" "\x10\x02\xff\xff\x10\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0e\x02\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x59\x00\x00\x5e\x56\x00\x00" "\x5e\x53\x0b\x00\x5e\x4f\xb3\x00\x5e\x4d\xff\x00\x5e\x49\xff\x00" "\x5e\x47\xff\x00\x5e\x44\xff\x00\x5e\x41\xff\x00\x5e\x3e\xff\x00" "\x5e\x3c\xff\x00\x5e\x39\xff\x00\x5c\x37\xff\x00\x59\x34\xff\x00" "\x56\x32\xff\x00\x53\x30\xff\x00\x50\x2e\xff\x00\x4e\x2c\xff\x00" "\x4c\x2a\xff\x00\x49\x28\xff\x00\x47\x26\xff\x00\x45\x25\xff\x00" "\x43\x23\xff\x00\x41\x21\xff\x00\x3f\x20\xff\x0e\x3d\x1e\xff\x7a" "\x3b\x1d\xff\xed\x39\x1c\xff\xff\x37\x1a\xff\xff\x36\x19\xff\xff" "\x34\x18\xff\xff\x32\x17\xff\xff\x31\x15\xff\xff\x2f\x14\xff\xff" "\x2e\x13\xff\xff\x2d\x13\xff\xff\x2b\x12\xff\xff\x2a\x11\xff\xff" "\x28\x10\xff\xff\x27\x0f\xff\xff\x26\x0e\xff\xff\x25\x0d\xff\xff" "\x24\x0d\xff\xff\x23\x0c\xff\xff\x22\x0b\xff\xff\x21\x0b\xff\xff" "\x20\x0a\xff\xff\x1f\x0a\xff\xff\x1e\x09\xff\xff\x1d\x09\xff\xff" "\x1c\x08\xff\xff\x1b\x08\xff\xff\x1a\x07\xff\xff\x1a\x07\xff\xff" "\x19\x06\xff\xff\x18\x06\xff\xff\x17\x06\xff\xff\x17\x05\xff\xff" "\x16\x05\xff\xff\x15\x05\xff\xff\x15\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff\x12\x03\xff\xff" "\x12\x03\xff\xff\x11\x03\xff\xff\x11\x02\xff\xff\x10\x02\xff\xff" "\x10\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff" "\x0e\x01\xff\xff\x0e\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5d\x00\x00\x5e\x59\x00\x00\x5e\x55\x00\x00\x5e\x52\x14\x00" "\x5e\x4f\xc9\x00\x5e\x4c\xff\x00\x5e\x48\xff\x00\x5e\x46\xff\x00" "\x5e\x43\xff\x00\x5e\x40\xff\x00\x5e\x3d\xff\x00\x5e\x3b\xff\x00" "\x5d\x38\xff\x00\x5a\x36\xff\x00\x57\x33\xff\x00\x54\x31\xff\x00" "\x52\x2f\xff\x00\x4f\x2d\xff\x00\x4c\x2b\xff\x00\x4a\x29\xff\x00" "\x47\x27\xff\x00\x45\x25\xff\x00\x43\x24\xff\x00\x41\x22\xff\x00" "\x3f\x20\xff\x0e\x3d\x1e\xff\x7a\x3b\x1d\xff\xed\x39\x1c\xff\xff" "\x37\x1a\xff\xff\x35\x19\xff\xff\x33\x18\xff\xff\x32\x17\xff\xff" "\x30\x15\xff\xff\x2f\x14\xff\xff\x2d\x13\xff\xff\x2c\x12\xff\xff" "\x2a\x11\xff\xff\x29\x10\xff\xff\x28\x0f\xff\xff\x26\x0f\xff\xff" "\x25\x0e\xff\xff\x24\x0d\xff\xff\x23\x0c\xff\xff\x22\x0b\xff\xff" "\x21\x0b\xff\xff\x20\x0a\xff\xff\x1f\x0a\xff\xff\x1e\x09\xff\xff" "\x1d\x09\xff\xff\x1c\x08\xff\xff\x1b\x08\xff\xff\x1a\x07\xff\xff" "\x19\x07\xff\xff\x18\x06\xff\xff\x18\x06\xff\xff\x17\x05\xff\xff" "\x16\x05\xff\xff\x16\x05\xff\xff\x15\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x13\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff" "\x11\x03\xff\xff\x11\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff\x0e\x02\xff\xff" "\x0e\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0c\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x5e\x59\x00\x00\x5e\x55\x00\x00\x5e\x52\x1e\x00\x5e\x4e\xd8\x00" "\x5e\x4b\xff\x00\x5e\x48\xff\x00\x5e\x45\xff\x00\x5e\x42\xff\x00" "\x5e\x3f\xff\x00\x5e\x3d\xff\x00\x5e\x3a\xff\x00\x5a\x37\xff\x00" "\x58\x35\xff\x00\x55\x32\xff\x00\x53\x30\xff\x00\x50\x2e\xff\x00" "\x4d\x2c\xff\x00\x4b\x2a\xff\x00\x48\x28\xff\x00\x46\x26\xff\x00" "\x43\x24\xff\x00\x41\x22\xff\x00\x3f\x21\xff\x0e\x3d\x1f\xff\x7a" "\x3b\x1d\xff\xed\x39\x1c\xff\xff\x37\x1a\xff\xff\x35\x19\xff\xff" "\x33\x18\xff\xff\x32\x17\xff\xff\x30\x15\xff\xff\x2e\x14\xff\xff" "\x2d\x13\xff\xff\x2b\x12\xff\xff\x2a\x11\xff\xff\x28\x10\xff\xff" "\x27\x0f\xff\xff\x26\x0e\xff\xff\x24\x0d\xff\xff\x23\x0d\xff\xff" "\x22\x0c\xff\xff\x21\x0b\xff\xff\x20\x0a\xff\xff\x1f\x0a\xff\xff" "\x1e\x09\xff\xff\x1d\x09\xff\xff\x1c\x08\xff\xff\x1b\x08\xff\xff" "\x1a\x07\xff\xff\x19\x07\xff\xff\x18\x06\xff\xff\x17\x06\xff\xff" "\x16\x05\xff\xff\x16\x05\xff\xff\x15\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x13\x04\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff" "\x11\x03\xff\xff\x11\x03\xff\xff\x10\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0e\x02\xff\xff\x0e\x02\xff\xff\x0e\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0a\x01\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x58\x00\x00" "\x5e\x55\x00\x00\x5e\x51\x2b\x00\x5e\x4e\xe4\x00\x5e\x4a\xff\x00" "\x5e\x47\xff\x00\x5e\x44\xff\x00\x5e\x41\xff\x00\x5e\x3e\xff\x00" "\x5e\x3c\xff\x00\x5c\x39\xff\x00\x59\x37\xff\x00\x56\x34\xff\x00" "\x54\x32\xff\x00\x51\x2f\xff\x00\x4e\x2d\xff\x00\x4c\x2b\xff\x00" "\x49\x29\xff\x00\x46\x27\xff\x00\x44\x25\xff\x00\x42\x23\xff\x00" "\x3f\x21\xff\x0a\x3d\x20\xff\x7a\x3b\x1e\xff\xed\x39\x1c\xff\xff" "\x37\x1b\xff\xff\x35\x19\xff\xff\x33\x18\xff\xff\x32\x17\xff\xff" "\x30\x15\xff\xff\x2e\x14\xff\xff\x2c\x13\xff\xff\x2b\x12\xff\xff" "\x29\x11\xff\xff\x28\x10\xff\xff\x27\x0f\xff\xff\x25\x0e\xff\xff" "\x24\x0d\xff\xff\x23\x0c\xff\xff\x21\x0c\xff\xff\x20\x0b\xff\xff" "\x1f\x0a\xff\xff\x1e\x09\xff\xff\x1d\x09\xff\xff\x1c\x08\xff\xff" "\x1b\x08\xff\xff\x1a\x07\xff\xff\x19\x07\xff\xff\x18\x06\xff\xff" "\x17\x06\xff\xff\x16\x05\xff\xff\x15\x05\xff\xff\x15\x04\xff\xff" "\x14\x04\xff\xff\x13\x04\xff\xff\x13\x03\xff\xff\x12\x03\xff\xff" "\x11\x03\xff\xff\x11\x03\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff" "\x0f\x02\xff\xff\x0e\x02\xff\xff\x0e\x02\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0a\x01\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x5e\x58\x00\x00\x5e\x54\x00\x00" "\x5e\x51\x3b\x00\x5e\x4d\xef\x00\x5e\x4a\xff\x00\x5e\x47\xff\x00" "\x5e\x44\xff\x00\x5e\x41\xff\x00\x5e\x3e\xff\x00\x5e\x3b\xff\x00" "\x5b\x38\xff\x00\x58\x36\xff\x00\x55\x33\xff\x00\x52\x31\xff\x00" "\x4f\x2e\xff\x00\x4d\x2c\xff\x00\x4a\x2a\xff\x00\x47\x28\xff\x00" "\x45\x26\xff\x00\x43\x24\xff\x00\x40\x22\xff\x00\x3e\x20\xff\x4b" "\x3b\x1f\xff\xdf\x39\x1d\xff\xff\x37\x1b\xff\xff\x35\x1a\xff\xff" "\x33\x18\xff\xff\x32\x17\xff\xff\x30\x15\xff\xff\x2e\x14\xff\xff" "\x2c\x13\xff\xff\x2b\x12\xff\xff\x29\x11\xff\xff\x27\x10\xff\xff" "\x26\x0f\xff\xff\x25\x0e\xff\xff\x23\x0d\xff\xff\x22\x0c\xff\xff" "\x21\x0b\xff\xff\x20\x0b\xff\xff\x1e\x0a\xff\xff\x1d\x09\xff\xff" "\x1c\x09\xff\xff\x1b\x08\xff\xff\x1a\x07\xff\xff\x19\x07\xff\xff" "\x18\x06\xff\xff\x17\x06\xff\xff\x16\x05\xff\xff\x15\x05\xff\xff" "\x15\x04\xff\xff\x14\x04\xff\xff\x13\x04\xff\xff\x12\x03\xff\xff" "\x12\x03\xff\xff\x11\x03\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5b\x00\x00\x5e\x58\x00\x00\x5e\x54\x00\x00\x5e\x51\x4c\x00" "\x5e\x4d\xf7\x00\x5e\x4a\xff\x00\x5e\x47\xff\x00\x5e\x43\xff\x00" "\x5e\x40\xff\x00\x5e\x3d\xff\x00\x5d\x3a\xff\x00\x5a\x37\xff\x00" "\x57\x35\xff\x00\x54\x32\xff\x00\x51\x30\xff\x00\x4e\x2e\xff\x00" "\x4b\x2b\xff\x00\x48\x29\xff\x00\x46\x27\xff\x00\x43\x25\xff\x00" "\x41\x23\xff\x00\x3f\x21\xff\x1d\x3c\x1f\xff\xae\x3a\x1e\xff\xff" "\x38\x1c\xff\xff\x35\x1a\xff\xff\x33\x19\xff\xff\x32\x17\xff\xff" "\x30\x16\xff\xff\x2e\x15\xff\xff\x2c\x13\xff\xff\x2b\x12\xff\xff" "\x29\x11\xff\xff\x27\x10\xff\xff\x26\x0f\xff\xff\x24\x0e\xff\xff" "\x23\x0d\xff\xff\x21\x0c\xff\xff\x20\x0b\xff\xff\x1f\x0a\xff\xff" "\x1e\x0a\xff\xff\x1d\x09\xff\xff\x1b\x08\xff\xff\x1a\x08\xff\xff" "\x19\x07\xff\xff\x18\x07\xff\xff\x17\x06\xff\xff\x16\x05\xff\xff" "\x15\x05\xff\xff\x15\x05\xff\xff\x14\x04\xff\xff\x13\x04\xff\xff" "\x12\x03\xff\xff\x11\x03\xff\xff\x11\x03\xff\xff\x10\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff\x0e\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0c\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00" "\x5e\x57\x00\x00\x5e\x54\x00\x00\x5e\x50\x5b\x00\x5e\x4d\xfc\x00" "\x5e\x49\xff\x00\x5e\x46\xff\x00\x5e\x43\xff\x00\x5e\x40\xff\x00" "\x5e\x3d\xff\x00\x5c\x3a\xff\x00\x59\x37\xff\x00\x56\x34\xff\x00" "\x53\x32\xff\x00\x50\x2f\xff\x00\x4d\x2d\xff\x00\x4a\x2b\xff\x00" "\x47\x28\xff\x00\x44\x26\xff\x00\x42\x24\xff\x00\x3f\x22\xff\x05" "\x3d\x20\xff\x74\x3b\x1e\xff\xf4\x39\x1d\xff\xff\x36\x1b\xff\xff" "\x34\x19\xff\xff\x32\x18\xff\xff\x30\x17\xff\xff\x2e\x15\xff\xff" "\x2c\x14\xff\xff\x2b\x12\xff\xff\x29\x11\xff\xff\x27\x10\xff\xff" "\x26\x0f\xff\xff\x24\x0e\xff\xff\x23\x0d\xff\xff\x21\x0c\xff\xff" "\x20\x0b\xff\xff\x1e\x0a\xff\xff\x1d\x0a\xff\xff\x1c\x09\xff\xff" "\x1b\x08\xff\xff\x1a\x07\xff\xff\x19\x07\xff\xff\x18\x06\xff\xff" "\x17\x06\xff\xff\x16\x05\xff\xff\x15\x05\xff\xff\x14\x04\xff\xff" "\x13\x04\xff\xff\x12\x03\xff\xff\x11\x03\xff\xff\x11\x03\xff\xff" "\x10\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0a\x01\xff\xff\x0a\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x58\x00\x00" "\x5e\x54\x00\x00\x5e\x50\x4c\x00\x5e\x4c\xfc\x00\x5e\x49\xff\x00" "\x5e\x46\xff\x00\x5e\x43\xff\x00\x5e\x40\xff\x00\x5e\x3d\xff\x00" "\x5b\x3a\xff\x00\x58\x37\xff\x00\x55\x34\xff\x00\x52\x31\xff\x00" "\x4f\x2f\xff\x00\x4c\x2c\xff\x00\x49\x2a\xff\x00\x46\x28\xff\x00" "\x43\x26\xff\x00\x40\x24\xff\x00\x3e\x22\xff\x3b\x3c\x20\xff\xd2" "\x39\x1e\xff\xff\x37\x1c\xff\xff\x35\x1a\xff\xff\x33\x18\xff\xff" "\x31\x17\xff\xff\x2f\x16\xff\xff\x2d\x14\xff\xff\x2b\x13\xff\xff" "\x29\x12\xff\xff\x27\x10\xff\xff\x26\x0f\xff\xff\x24\x0e\xff\xff" "\x23\x0d\xff\xff\x21\x0c\xff\xff\x20\x0b\xff\xff\x1e\x0a\xff\xff" "\x1d\x0a\xff\xff\x1c\x09\xff\xff\x1b\x08\xff\xff\x19\x07\xff\xff" "\x18\x07\xff\xff\x17\x06\xff\xff\x16\x06\xff\xff\x15\x05\xff\xff" "\x14\x05\xff\xff\x13\x04\xff\xff\x12\x04\xff\xff\x11\x03\xff\xff" "\x11\x03\xff\xff\x10\x03\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0e\x02\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0c\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0a\x01\xff\xff\x0a\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x58\x00\x00\x5e\x54\x00\x00" "\x5e\x50\x3a\x00\x5e\x4c\xf6\x00\x5e\x49\xff\x00\x5e\x46\xff\x00" "\x5e\x42\xff\x00\x5e\x3f\xff\x00\x5d\x3c\xff\x00\x5a\x39\xff\x00" "\x57\x37\xff\x00\x54\x34\xff\x00\x51\x31\xff\x00\x4e\x2e\xff\x00" "\x4a\x2c\xff\x00\x48\x29\xff\x00\x45\x27\xff\x00\x42\x25\xff\x00" "\x3f\x23\xff\x10\x3d\x21\xff\x9c\x3a\x1f\xff\xff\x38\x1d\xff\xff" "\x36\x1b\xff\xff\x34\x1a\xff\xff\x32\x18\xff\xff\x2f\x16\xff\xff" "\x2d\x15\xff\xff\x2b\x13\xff\xff\x2a\x12\xff\xff\x28\x11\xff\xff" "\x26\x10\xff\xff\x24\x0f\xff\xff\x23\x0d\xff\xff\x21\x0c\xff\xff" "\x20\x0b\xff\xff\x1e\x0a\xff\xff\x1d\x0a\xff\xff\x1c\x09\xff\xff" "\x1a\x08\xff\xff\x19\x07\xff\xff\x18\x07\xff\xff\x17\x06\xff\xff" "\x16\x05\xff\xff\x15\x05\xff\xff\x14\x04\xff\xff\x13\x04\xff\xff" "\x12\x04\xff\xff\x11\x03\xff\xff\x10\x03\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0e\x02\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0c\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0a\x01\xff\xff" "\x0a\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5c\x00\x00\x5e\x58\x00\x00\x5e\x54\x00\x00\x5e\x51\x2b\x00" "\x5e\x4d\xee\x00\x5e\x49\xff\x00\x5e\x46\xff\x00\x5e\x42\xff\x00" "\x5e\x3f\xff\x00\x5d\x3c\xff\x00\x59\x39\xff\x00\x56\x36\xff\x00" "\x53\x33\xff\x00\x4f\x31\xff\x00\x4d\x2e\xff\x00\x49\x2c\xff\x00" "\x47\x29\xff\x00\x44\x27\xff\x00\x41\x24\xff\x00\x3e\x22\xff\x37" "\x3c\x20\xff\xdf\x39\x1e\xff\xff\x37\x1c\xff\xff\x34\x1b\xff\xff" "\x32\x19\xff\xff\x30\x17\xff\xff\x2e\x16\xff\xff\x2c\x14\xff\xff" "\x2a\x13\xff\xff\x28\x11\xff\xff\x26\x10\xff\xff\x25\x0f\xff\xff" "\x23\x0e\xff\xff\x21\x0d\xff\xff\x20\x0c\xff\xff\x1e\x0b\xff\xff" "\x1d\x0a\xff\xff\x1c\x09\xff\xff\x1a\x08\xff\xff\x19\x07\xff\xff" "\x18\x07\xff\xff\x17\x06\xff\xff\x15\x05\xff\xff\x14\x05\xff\xff" "\x13\x04\xff\xff\x13\x04\xff\xff\x12\x03\xff\xff\x11\x03\xff\xff" "\x10\x03\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff\x0d\x02\xff\xff" "\x0d\x01\xff\xff\x0c\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0a\x01\xff\xff\x0a\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00" "\x5e\x59\x00\x00\x5e\x55\x00\x00\x5e\x51\x1d\x00\x5e\x4d\xe3\x00" "\x5e\x49\xff\x00\x5e\x46\xff\x00\x5e\x42\xff\x00\x5e\x3f\xff\x00" "\x5d\x3c\xff\x00\x59\x39\xff\x00\x55\x36\xff\x00\x52\x33\xff\x00" "\x4f\x30\xff\x00\x4c\x2e\xff\x00\x48\x2b\xff\x00\x46\x29\xff\x00" "\x43\x26\xff\x00\x40\x24\xff\x01\x3d\x22\xff\x73\x3b\x20\xff\xfb" "\x38\x1e\xff\xff\x36\x1c\xff\xff\x33\x1a\xff\xff\x31\x18\xff\xff" "\x2f\x17\xff\xff\x2d\x15\xff\xff\x2b\x14\xff\xff\x29\x12\xff\xff" "\x27\x11\xff\xff\x25\x0f\xff\xff\x24\x0e\xff\xff\x22\x0d\xff\xff" "\x20\x0c\xff\xff\x1e\x0b\xff\xff\x1d\x0a\xff\xff\x1c\x09\xff\xff" "\x1a\x08\xff\xff\x19\x07\xff\xff\x18\x07\xff\xff\x17\x06\xff\xff" "\x15\x05\xff\xff\x14\x05\xff\xff\x13\x04\xff\xff\x12\x04\xff\xff" "\x11\x03\xff\xff\x10\x03\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0e\x02\xff\xff\x0d\x02\xff\xff\x0c\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0a\x01\xff\xff\x0a\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x59\x00\x00" "\x5e\x55\x00\x00\x5e\x51\x13\x00\x5e\x4d\xd7\x00\x5e\x4a\xff\x00" "\x5e\x46\xff\x00\x5e\x43\xff\x00\x5e\x3f\xff\x00\x5c\x3c\xff\x00" "\x59\x39\xff\x00\x55\x36\xff\x00\x52\x33\xff\x00\x4e\x30\xff\x00" "\x4b\x2e\xff\x00\x48\x2b\xff\x00\x45\x29\xff\x00\x42\x26\xff\x00" "\x3f\x24\xff\x13\x3d\x22\xff\xb3\x3a\x1f\xff\xff\x37\x1d\xff\xff" "\x35\x1b\xff\xff\x32\x1a\xff\xff\x30\x18\xff\xff\x2e\x16\xff\xff" "\x2c\x15\xff\xff\x2a\x13\xff\xff\x28\x12\xff\xff\x26\x10\xff\xff" "\x24\x0f\xff\xff\x22\x0e\xff\xff\x21\x0c\xff\xff\x1f\x0b\xff\xff" "\x1d\x0a\xff\xff\x1c\x0a\xff\xff\x1a\x09\xff\xff\x19\x08\xff\xff" "\x18\x07\xff\xff\x17\x06\xff\xff\x15\x05\xff\xff\x14\x05\xff\xff" "\x13\x04\xff\xff\x12\x04\xff\xff\x11\x03\xff\xff\x10\x03\xff\xff" "\x0f\x02\xff\xff\x0e\x02\xff\xff\x0d\x02\xff\xff\x0d\x01\xff\xff" "\x0c\x01\xff\xff\x0b\x01\xff\xff\x0a\x01\xff\xff\x0a\x01\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x59\x00\x00\x5e\x55\x00\x00" "\x5e\x52\x0b\x00\x5e\x4e\xc8\x00\x5e\x4a\xff\x00\x5e\x47\xff\x00" "\x5e\x43\xff\x00\x5e\x40\xff\x00\x5c\x3c\xff\x00\x58\x39\xff\x00" "\x55\x36\xff\x00\x51\x33\xff\x00\x4e\x30\xff\x00\x4a\x2d\xff\x00" "\x47\x2b\xff\x00\x44\x28\xff\x00\x41\x26\xff\x00\x3e\x24\xff\x3b" "\x3c\x21\xff\xe2\x39\x1f\xff\xff\x37\x1d\xff\xff\x34\x1b\xff\xff" "\x32\x19\xff\xff\x2f\x17\xff\xff\x2d\x16\xff\xff\x2b\x14\xff\xff" "\x29\x13\xff\xff\x27\x11\xff\xff\x25\x10\xff\xff\x23\x0e\xff\xff" "\x21\x0d\xff\xff\x20\x0c\xff\xff\x1e\x0b\xff\xff\x1c\x0a\xff\xff" "\x1b\x09\xff\xff\x19\x08\xff\xff\x18\x07\xff\xff\x17\x06\xff\xff" "\x15\x06\xff\xff\x14\x05\xff\xff\x13\x04\xff\xff\x12\x04\xff\xff" "\x11\x03\xff\xff\x10\x03\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff" "\x0d\x02\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0b\x01\xff\xff" "\x0a\x01\xff\xff\x09\x01\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5a\x00\x00\x5e\x56\x00\x00\x5e\x52\x02\x00" "\x5e\x4e\xb1\x00\x5e\x4a\xff\x00\x5e\x47\xff\x00\x5e\x43\xff\x00" "\x5e\x40\xff\x00\x5b\x3d\xff\x00\x58\x39\xff\x00\x54\x36\xff\x00" "\x51\x33\xff\x00\x4d\x30\xff\x00\x4a\x2d\xff\x00\x47\x2b\xff\x00" "\x44\x28\xff\x00\x41\x26\xff\x02\x3e\x23\xff\x78\x3b\x21\xff\xfc" "\x38\x1f\xff\xff\x36\x1d\xff\xff\x33\x1b\xff\xff\x31\x19\xff\xff" "\x2e\x17\xff\xff\x2c\x15\xff\xff\x2a\x14\xff\xff\x28\x12\xff\xff" "\x26\x11\xff\xff\x24\x0f\xff\xff\x22\x0e\xff\xff\x20\x0d\xff\xff" "\x1f\x0c\xff\xff\x1d\x0a\xff\xff\x1b\x09\xff\xff\x1a\x08\xff\xff" "\x18\x08\xff\xff\x17\x07\xff\xff\x15\x06\xff\xff\x14\x05\xff\xff" "\x13\x05\xff\xff\x12\x04\xff\xff\x11\x03\xff\xff\x10\x03\xff\xff" "\x0f\x02\xff\xff\x0e\x02\xff\xff\x0d\x02\xff\xff\x0c\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0a\x01\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5b\x00\x00\x5e\x57\x00\x00\x5e\x53\x00\x00\x5e\x4f\x75\x00" "\x5e\x4b\xff\x00\x5e\x47\xff\x00\x5e\x44\xff\x00\x5e\x40\xff\x00" "\x5b\x3d\xff\x00\x58\x3a\xff\x00\x54\x37\xff\x00\x51\x33\xff\x00" "\x4d\x30\xff\x00\x4a\x2e\xff\x00\x47\x2b\xff\x00\x43\x28\xff\x00" "\x40\x25\xff\x0b\x3d\x23\xff\xb3\x3a\x21\xff\xff\x37\x1f\xff\xff" "\x35\x1d\xff\xff\x32\x1b\xff\xff\x30\x19\xff\xff\x2e\x17\xff\xff" "\x2b\x15\xff\xff\x29\x13\xff\xff\x27\x12\xff\xff\x25\x10\xff\xff" "\x23\x0f\xff\xff\x21\x0e\xff\xff\x1f\x0c\xff\xff\x1e\x0b\xff\xff" "\x1c\x0a\xff\xff\x1a\x09\xff\xff\x19\x08\xff\xff\x17\x07\xff\xff" "\x16\x06\xff\xff\x15\x06\xff\xff\x13\x05\xff\xff\x12\x04\xff\xff" "\x11\x04\xff\xff\x10\x03\xff\xff\x0f\x03\xff\xff\x0e\x02\xff\xff" "\x0d\x02\xff\xff\x0c\x01\xff\xff\x0b\x01\xff\xff\x0a\x01\xff\xff" "\x0a\x01\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x5e\x58\x00\x00\x5e\x54\x00\x00\x5e\x50\x3a\x00\x5e\x4c\xfc\x00" "\x5e\x48\xff\x00\x5e\x44\xff\x00\x5e\x41\xff\x00\x5b\x3d\xff\x00" "\x57\x3a\xff\x00\x54\x37\xff\x00\x50\x34\xff\x00\x4d\x31\xff\x00" "\x49\x2e\xff\x00\x46\x2b\xff\x00\x43\x28\xff\x00\x40\x26\xff\x14" "\x3d\x23\xff\xc9\x3a\x21\xff\xff\x37\x1f\xff\xff\x34\x1c\xff\xff" "\x32\x1a\xff\xff\x2f\x19\xff\xff\x2d\x17\xff\xff\x2b\x15\xff\xff" "\x28\x13\xff\xff\x26\x12\xff\xff\x24\x10\xff\xff\x22\x0e\xff\xff" "\x20\x0d\xff\xff\x1e\x0c\xff\xff\x1d\x0b\xff\xff\x1b\x0a\xff\xff" "\x19\x09\xff\xff\x18\x08\xff\xff\x17\x07\xff\xff\x15\x06\xff\xff" "\x14\x05\xff\xff\x12\x04\xff\xff\x11\x04\xff\xff\x10\x03\xff\xff" "\x0f\x03\xff\xff\x0e\x02\xff\xff\x0d\x02\xff\xff\x0c\x01\xff\xff" "\x0b\x01\xff\xff\x0a\x01\xff\xff\x0a\x01\xff\xff\x09\x00\xff\xff" "\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x59\x00\x00" "\x5e\x55\x00\x00\x5e\x51\x13\x00\x5e\x4d\xe2\x00\x5e\x48\xff\x00" "\x5e\x45\xff\x00\x5e\x41\xff\x00\x5c\x3e\xff\x00\x58\x3a\xff\x00" "\x54\x37\xff\x00\x50\x34\xff\x00\x4c\x31\xff\x00\x49\x2e\xff\x00" "\x46\x2b\xff\x00\x43\x29\xff\x00\x40\x26\xff\x1e\x3d\x23\xff\xd8" "\x3a\x21\xff\xff\x37\x1f\xff\xff\x34\x1c\xff\xff\x31\x1a\xff\xff" "\x2f\x18\xff\xff\x2c\x16\xff\xff\x2a\x15\xff\xff\x28\x13\xff\xff" "\x26\x11\xff\xff\x24\x10\xff\xff\x22\x0e\xff\xff\x20\x0d\xff\xff" "\x1e\x0c\xff\xff\x1c\x0a\xff\xff\x1a\x09\xff\xff\x18\x08\xff\xff" "\x17\x07\xff\xff\x16\x07\xff\xff\x14\x06\xff\xff\x13\x05\xff\xff" "\x12\x04\xff\xff\x10\x04\xff\xff\x0f\x03\xff\xff\x0e\x02\xff\xff" "\x0d\x02\xff\xff\x0c\x02\xff\xff\x0b\x01\xff\xff\x0a\x01\xff\xff" "\x0a\x01\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00\x5e\x56\x00\x00" "\x5e\x52\x02\x00\x5e\x4e\xb4\x00\x5e\x49\xff\x00\x5e\x46\xff\x00" "\x5e\x42\xff\x00\x5c\x3e\xff\x00\x58\x3b\xff\x00\x54\x37\xff\x00" "\x50\x34\xff\x00\x4c\x31\xff\x00\x49\x2e\xff\x00\x46\x2c\xff\x00" "\x42\x29\xff\x00\x3f\x26\xff\x2b\x3c\x24\xff\xe4\x39\x21\xff\xff" "\x37\x1f\xff\xff\x34\x1c\xff\xff\x31\x1a\xff\xff\x2e\x18\xff\xff" "\x2c\x16\xff\xff\x29\x15\xff\xff\x27\x13\xff\xff\x25\x11\xff\xff" "\x23\x10\xff\xff\x21\x0e\xff\xff\x1f\x0d\xff\xff\x1d\x0b\xff\xff" "\x1b\x0a\xff\xff\x1a\x09\xff\xff\x18\x08\xff\xff\x16\x07\xff\xff" "\x15\x06\xff\xff\x13\x05\xff\xff\x12\x05\xff\xff\x11\x04\xff\xff" "\x10\x03\xff\xff\x0f\x03\xff\xff\x0d\x02\xff\xff\x0c\x02\xff\xff" "\x0b\x01\xff\xff\x0a\x01\xff\xff\x0a\x01\xff\xff\x09\x01\xff\xff" "\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x5e\x57\x00\x00\x5e\x53\x00\x00" "\x5e\x4f\x74\x00\x5e\x4b\xff\x00\x5e\x47\xff\x00\x5e\x43\xff\x00" "\x5c\x3f\xff\x00\x58\x3c\xff\x00\x54\x38\xff\x00\x51\x35\xff\x00" "\x4d\x32\xff\x00\x49\x2f\xff\x00\x46\x2c\xff\x00\x42\x29\xff\x00" "\x3f\x26\xff\x3b\x3c\x24\xff\xef\x39\x21\xff\xff\x36\x1f\xff\xff" "\x33\x1d\xff\xff\x31\x1a\xff\xff\x2e\x18\xff\xff\x2c\x16\xff\xff" "\x29\x14\xff\xff\x27\x13\xff\xff\x24\x11\xff\xff\x22\x10\xff\xff" "\x20\x0e\xff\xff\x1e\x0d\xff\xff\x1c\x0b\xff\xff\x1b\x0a\xff\xff" "\x19\x09\xff\xff\x17\x08\xff\xff\x16\x07\xff\xff\x14\x06\xff\xff" "\x13\x05\xff\xff\x11\x04\xff\xff\x10\x04\xff\xff\x0f\x03\xff\xff" "\x0e\x03\xff\xff\x0d\x02\xff\xff\x0c\x02\xff\xff\x0b\x01\xff\xff" "\x0a\x01\xff\xff\x09\x01\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5c\x00\x00\x5e\x58\x00\x00\x5e\x54\x00\x00\x5e\x50\x39\x00" "\x5e\x4c\xfb\x00\x5e\x48\xff\x00\x5e\x44\xff\x00\x5d\x40\xff\x00" "\x59\x3d\xff\x00\x55\x39\xff\x00\x51\x36\xff\x00\x4d\x32\xff\x00" "\x49\x2f\xff\x00\x46\x2c\xff\x00\x42\x29\xff\x00\x3f\x27\xff\x4c" "\x3c\x24\xff\xf7\x39\x22\xff\xff\x36\x1f\xff\xff\x33\x1d\xff\xff" "\x30\x1b\xff\xff\x2e\x19\xff\xff\x2b\x17\xff\xff\x29\x15\xff\xff" "\x26\x13\xff\xff\x24\x11\xff\xff\x22\x0f\xff\xff\x20\x0e\xff\xff" "\x1e\x0d\xff\xff\x1c\x0b\xff\xff\x1a\x0a\xff\xff\x18\x09\xff\xff" "\x17\x08\xff\xff\x15\x07\xff\xff\x14\x06\xff\xff\x12\x05\xff\xff" "\x11\x04\xff\xff\x0f\x03\xff\xff\x0e\x03\xff\xff\x0d\x02\xff\xff" "\x0c\x02\xff\xff\x0b\x01\xff\xff\x0a\x01\xff\xff\x09\x01\xff\xff" "\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x59\x00\x00\x5e\x55\x00\x00\x5e\x51\x12\x00\x5e\x4d\xe1\x00" "\x5e\x49\xff\x00\x5e\x45\xff\x00\x5d\x41\xff\x00\x59\x3e\xff\x00" "\x55\x3a\xff\x00\x51\x37\xff\x00\x4d\x33\xff\x00\x4a\x30\xff\x00" "\x46\x2d\xff\x00\x43\x2a\xff\x00\x3f\x27\xff\x5b\x3c\x24\xff\xfc" "\x39\x22\xff\xff\x36\x1f\xff\xff\x33\x1d\xff\xff\x30\x1b\xff\xff" "\x2e\x19\xff\xff\x2b\x17\xff\xff\x29\x15\xff\xff\x26\x13\xff\xff" "\x24\x11\xff\xff\x22\x0f\xff\xff\x1f\x0e\xff\xff\x1d\x0c\xff\xff" "\x1b\x0b\xff\xff\x1a\x0a\xff\xff\x18\x09\xff\xff\x16\x08\xff\xff" "\x15\x07\xff\xff\x13\x06\xff\xff\x12\x05\xff\xff\x10\x04\xff\xff" "\x0f\x03\xff\xff\x0e\x03\xff\xff\x0c\x02\xff\xff\x0b\x02\xff\xff" "\x0a\x01\xff\xff\x0a\x01\xff\xff\x09\x01\xff\xff\x08\x00\xff\xff" "\x07\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00" "\x5e\x56\x00\x00\x5e\x52\x00\x00\x5e\x4e\x9e\x00\x5e\x4a\xff\x00" "\x5e\x46\xff\x00\x5e\x42\xff\x00\x59\x3e\xff\x00\x55\x3b\xff\x00" "\x52\x37\xff\x00\x4e\x34\xff\x00\x4a\x31\xff\x00\x47\x2e\xff\x00" "\x43\x2b\xff\x00\x40\x28\xff\x4c\x3c\x25\xff\xfc\x39\x22\xff\xff" "\x36\x20\xff\xff\x33\x1d\xff\xff\x30\x1b\xff\xff\x2d\x19\xff\xff" "\x2b\x17\xff\xff\x28\x15\xff\xff\x26\x13\xff\xff\x24\x11\xff\xff" "\x21\x10\xff\xff\x1f\x0e\xff\xff\x1d\x0c\xff\xff\x1b\x0b\xff\xff" "\x19\x0a\xff\xff\x17\x09\xff\xff\x16\x07\xff\xff\x14\x06\xff\xff" "\x13\x06\xff\xff\x11\x05\xff\xff\x10\x04\xff\xff\x0e\x03\xff\xff" "\x0d\x03\xff\xff\x0c\x02\xff\xff\x0b\x02\xff\xff\x0a\x01\xff\xff" "\x09\x01\xff\xff\x08\x01\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x58\x00\x00" "\x5e\x54\x00\x00\x5e\x4f\x3c\x00\x5e\x4b\xff\x00\x5e\x47\xff\x00" "\x5e\x43\xff\x00\x5a\x3f\xff\x00\x56\x3c\xff\x00\x52\x38\xff\x00" "\x4e\x35\xff\x00\x4a\x32\xff\x00\x47\x2f\xff\x00\x43\x2b\xff\x00" "\x40\x28\xff\x3a\x3d\x26\xff\xf6\x39\x23\xff\xff\x36\x20\xff\xff" "\x33\x1e\xff\xff\x30\x1b\xff\xff\x2d\x19\xff\xff\x2b\x17\xff\xff" "\x28\x15\xff\xff\x26\x13\xff\xff\x23\x11\xff\xff\x21\x10\xff\xff" "\x1f\x0e\xff\xff\x1d\x0d\xff\xff\x1b\x0b\xff\xff\x19\x0a\xff\xff" "\x17\x08\xff\xff\x15\x07\xff\xff\x14\x06\xff\xff\x12\x05\xff\xff" "\x11\x05\xff\xff\x0f\x04\xff\xff\x0e\x03\xff\xff\x0d\x02\xff\xff" "\x0c\x02\xff\xff\x0a\x01\xff\xff\x09\x01\xff\xff\x08\x01\xff\xff" "\x08\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00\x5e\x55\x00\x00" "\x5e\x50\x05\x00\x5e\x4d\xd3\x00\x5e\x48\xff\x00\x5e\x44\xff\x00" "\x5b\x40\xff\x00\x57\x3d\xff\x00\x53\x39\xff\x00\x4f\x36\xff\x00" "\x4b\x32\xff\x00\x47\x2f\xff\x00\x44\x2c\xff\x00\x40\x29\xff\x2b" "\x3d\x26\xff\xee\x3a\x24\xff\xff\x37\x21\xff\xff\x33\x1e\xff\xff" "\x30\x1c\xff\xff\x2e\x1a\xff\xff\x2b\x17\xff\xff\x28\x15\xff\xff" "\x25\x13\xff\xff\x23\x12\xff\xff\x21\x10\xff\xff\x1f\x0e\xff\xff" "\x1d\x0d\xff\xff\x1b\x0b\xff\xff\x19\x0a\xff\xff\x17\x09\xff\xff" "\x15\x07\xff\xff\x13\x06\xff\xff\x12\x05\xff\xff\x10\x04\xff\xff" "\x0f\x04\xff\xff\x0e\x03\xff\xff\x0c\x02\xff\xff\x0b\x02\xff\xff" "\x0a\x01\xff\xff\x09\x01\xff\xff\x08\x01\xff\xff\x07\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x57\x00\x00\x5e\x53\x00\x00" "\x5e\x4e\x75\x00\x5e\x4a\xff\x00\x5e\x46\xff\x00\x5c\x42\xff\x00" "\x58\x3e\xff\x00\x54\x3a\xff\x00\x50\x37\xff\x00\x4c\x33\xff\x00" "\x48\x30\xff\x00\x44\x2d\xff\x00\x41\x2a\xff\x1d\x3d\x27\xff\xe3" "\x3a\x24\xff\xff\x37\x22\xff\xff\x34\x1f\xff\xff\x31\x1c\xff\xff" "\x2e\x1a\xff\xff\x2b\x18\xff\xff\x28\x16\xff\xff\x26\x14\xff\xff" "\x23\x12\xff\xff\x21\x10\xff\xff\x1f\x0e\xff\xff\x1c\x0d\xff\xff" "\x1a\x0b\xff\xff\x19\x0a\xff\xff\x17\x09\xff\xff\x15\x07\xff\xff" "\x13\x06\xff\xff\x12\x05\xff\xff\x10\x04\xff\xff\x0e\x04\xff\xff" "\x0d\x03\xff\xff\x0c\x02\xff\xff\x0b\x02\xff\xff\x0a\x01\xff\xff" "\x09\x01\xff\xff\x08\x01\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff" "\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x59\x00\x00\x5e\x54\x00\x00\x5e\x50\x1e\x00" "\x5e\x4c\xf5\x00\x5e\x47\xff\x00\x5d\x43\xff\x00\x59\x3f\xff\x00" "\x55\x3c\xff\x00\x51\x38\xff\x00\x4d\x34\xff\x00\x48\x31\xff\x00" "\x45\x2e\xff\x00\x41\x2b\xff\x13\x3e\x28\xff\xd7\x3a\x25\xff\xff" "\x37\x22\xff\xff\x34\x20\xff\xff\x31\x1d\xff\xff\x2e\x1b\xff\xff" "\x2b\x18\xff\xff\x29\x16\xff\xff\x26\x14\xff\xff\x23\x12\xff\xff" "\x21\x10\xff\xff\x1f\x0e\xff\xff\x1c\x0d\xff\xff\x1a\x0b\xff\xff" "\x18\x0a\xff\xff\x16\x09\xff\xff\x15\x08\xff\xff\x13\x06\xff\xff" "\x11\x05\xff\xff\x10\x05\xff\xff\x0e\x04\xff\xff\x0d\x03\xff\xff" "\x0c\x02\xff\xff\x0a\x02\xff\xff\x09\x01\xff\xff\x08\x01\xff\xff" "\x07\x01\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5a\x00\x00\x5e\x56\x00\x00\x5e\x52\x00\x00\x5e\x4d\xaf\x00" "\x5e\x49\xff\x00\x5e\x45\xff\x00\x5a\x41\xff\x00\x56\x3d\xff\x00" "\x52\x39\xff\x00\x4e\x36\xff\x00\x49\x32\xff\x00\x46\x2f\xff\x00" "\x42\x2c\xff\x0b\x3e\x29\xff\xc8\x3b\x26\xff\xff\x37\x23\xff\xff" "\x34\x20\xff\xff\x31\x1e\xff\xff\x2e\x1b\xff\xff\x2c\x19\xff\xff" "\x29\x17\xff\xff\x26\x15\xff\xff\x24\x13\xff\xff\x21\x11\xff\xff" "\x1f\x0f\xff\xff\x1c\x0d\xff\xff\x1a\x0c\xff\xff\x18\x0a\xff\xff" "\x16\x09\xff\xff\x15\x08\xff\xff\x13\x07\xff\xff\x11\x06\xff\xff" "\x10\x05\xff\xff\x0e\x04\xff\xff\x0d\x03\xff\xff\x0b\x02\xff\xff" "\x0a\x02\xff\xff\x09\x01\xff\xff\x08\x01\xff\xff\x07\x01\xff\xff" "\x06\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x5e\x58\x00\x00\x5e\x53\x00\x00\x5e\x4f\x4c\x00\x5e\x4b\xff\x00" "\x5e\x46\xff\x00\x5b\x43\xff\x00\x57\x3f\xff\x00\x53\x3b\xff\x00" "\x4f\x37\xff\x00\x4b\x34\xff\x00\x47\x30\xff\x00\x43\x2d\xff\x02" "\x3f\x2a\xff\xb1\x3c\x27\xff\xff\x38\x24\xff\xff\x35\x21\xff\xff" "\x32\x1e\xff\xff\x2f\x1c\xff\xff\x2c\x1a\xff\xff\x29\x17\xff\xff" "\x26\x15\xff\xff\x24\x13\xff\xff\x21\x11\xff\xff\x1f\x0f\xff\xff" "\x1d\x0e\xff\xff\x1a\x0c\xff\xff\x18\x0a\xff\xff\x16\x09\xff\xff" "\x14\x08\xff\xff\x13\x07\xff\xff\x11\x06\xff\xff\x10\x05\xff\xff" "\x0e\x04\xff\xff\x0d\x03\xff\xff\x0b\x02\xff\xff\x0a\x02\xff\xff" "\x09\x01\xff\xff\x08\x01\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff" "\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x59\x00\x00" "\x5e\x55\x00\x00\x5e\x50\x0a\x00\x5e\x4c\xdf\x00\x5e\x48\xff\x00" "\x5c\x44\xff\x00\x58\x40\xff\x00\x54\x3c\xff\x00\x50\x39\xff\x00" "\x4c\x35\xff\x00\x48\x32\xff\x00\x44\x2e\xff\x00\x40\x2b\xff\x75" "\x3d\x28\xff\xff\x39\x25\xff\xff\x36\x22\xff\xff\x32\x1f\xff\xff" "\x2f\x1d\xff\xff\x2c\x1a\xff\xff\x29\x18\xff\xff\x27\x16\xff\xff" "\x24\x14\xff\xff\x22\x12\xff\xff\x1f\x10\xff\xff\x1d\x0e\xff\xff" "\x1b\x0c\xff\xff\x19\x0b\xff\xff\x17\x09\xff\xff\x15\x08\xff\xff" "\x13\x07\xff\xff\x11\x06\xff\xff\x0f\x05\xff\xff\x0e\x04\xff\xff" "\x0d\x03\xff\xff\x0b\x02\xff\xff\x0a\x02\xff\xff\x09\x01\xff\xff" "\x08\x01\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x57\x00\x00" "\x5e\x52\x00\x00\x5e\x4e\x7b\x00\x5e\x4a\xff\x00\x5e\x46\xff\x00" "\x59\x42\xff\x00\x55\x3e\xff\x00\x51\x3a\xff\x00\x4d\x36\xff\x00" "\x49\x33\xff\x00\x45\x2f\xff\x00\x41\x2c\xff\x3a\x3e\x29\xff\xfc" "\x3a\x26\xff\xff\x37\x23\xff\xff\x33\x20\xff\xff\x30\x1e\xff\xff" "\x2d\x1b\xff\xff\x2a\x18\xff\xff\x27\x16\xff\xff\x24\x14\xff\xff" "\x22\x12\xff\xff\x1f\x10\xff\xff\x1d\x0e\xff\xff\x1b\x0d\xff\xff" "\x19\x0b\xff\xff\x17\x0a\xff\xff\x15\x08\xff\xff\x13\x07\xff\xff" "\x11\x06\xff\xff\x0f\x05\xff\xff\x0e\x04\xff\xff\x0c\x03\xff\xff" "\x0b\x02\xff\xff\x0a\x02\xff\xff\x09\x01\xff\xff\x08\x01\xff\xff" "\x07\x01\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x59\x00\x00\x5e\x55\x00\x00" "\x5e\x50\x0f\x00\x5e\x4c\xee\x00\x5e\x47\xff\x00\x5a\x43\xff\x00" "\x56\x3f\xff\x00\x52\x3b\xff\x00\x4e\x38\xff\x00\x4a\x34\xff\x00" "\x46\x31\xff\x00\x42\x2d\xff\x13\x3e\x2a\xff\xe2\x3b\x27\xff\xff" "\x37\x24\xff\xff\x34\x21\xff\xff\x31\x1f\xff\xff\x2e\x1c\xff\xff" "\x2b\x19\xff\xff\x28\x17\xff\xff\x25\x15\xff\xff\x22\x13\xff\xff" "\x20\x11\xff\xff\x1d\x0f\xff\xff\x1b\x0d\xff\xff\x19\x0c\xff\xff" "\x17\x0a\xff\xff\x15\x09\xff\xff\x13\x07\xff\xff\x11\x06\xff\xff" "\x10\x05\xff\xff\x0e\x04\xff\xff\x0c\x03\xff\xff\x0b\x03\xff\xff" "\x0a\x02\xff\xff\x09\x01\xff\xff\x07\x01\xff\xff\x06\x01\xff\xff" "\x06\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x57\x00\x00\x5e\x52\x00\x00" "\x5e\x4e\x7c\x00\x5e\x49\xff\x00\x5d\x45\xff\x00\x58\x41\xff\x00" "\x54\x3d\xff\x00\x4f\x39\xff\x00\x4b\x35\xff\x00\x47\x32\xff\x00" "\x43\x2f\xff\x02\x3f\x2b\xff\xb4\x3c\x28\xff\xff\x38\x25\xff\xff" "\x35\x22\xff\xff\x32\x20\xff\xff\x2f\x1d\xff\xff\x2b\x1a\xff\xff" "\x28\x18\xff\xff\x26\x16\xff\xff\x23\x13\xff\xff\x20\x11\xff\xff" "\x1e\x0f\xff\xff\x1b\x0e\xff\xff\x19\x0c\xff\xff\x17\x0a\xff\xff" "\x15\x09\xff\xff\x13\x08\xff\xff\x11\x07\xff\xff\x10\x05\xff\xff" "\x0e\x04\xff\xff\x0d\x03\xff\xff\x0b\x03\xff\xff\x0a\x02\xff\xff" "\x08\x01\xff\xff\x07\x01\xff\xff\x06\x01\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x59\x00\x00\x5e\x55\x00\x00\x5e\x50\x0f\x00" "\x5e\x4c\xef\x00\x5e\x47\xff\x00\x5a\x43\xff\x00\x55\x3f\xff\x00" "\x50\x3b\xff\x00\x4d\x37\xff\x00\x48\x33\xff\x00\x44\x30\xff\x00" "\x40\x2d\xff\x74\x3d\x2a\xff\xff\x39\x26\xff\xff\x36\x24\xff\xff" "\x32\x21\xff\xff\x2f\x1e\xff\xff\x2c\x1b\xff\xff\x29\x19\xff\xff" "\x26\x17\xff\xff\x24\x14\xff\xff\x21\x12\xff\xff\x1e\x10\xff\xff" "\x1c\x0e\xff\xff\x1a\x0c\xff\xff\x17\x0b\xff\xff\x15\x09\xff\xff" "\x13\x08\xff\xff\x12\x07\xff\xff\x10\x06\xff\xff\x0e\x05\xff\xff" "\x0d\x04\xff\xff\x0b\x03\xff\xff\x0a\x02\xff\xff\x09\x02\xff\xff" "\x07\x01\xff\xff\x06\x01\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5c\x00\x00\x5e\x57\x00\x00\x5e\x52\x00\x00\x5e\x4e\x7e\x00" "\x5e\x49\xff\x00\x5c\x45\xff\x00\x57\x41\xff\x00\x53\x3d\xff\x00" "\x4e\x39\xff\x00\x4a\x35\xff\x00\x46\x32\xff\x00\x42\x2e\xff\x39" "\x3e\x2b\xff\xfb\x3a\x28\xff\xff\x37\x25\xff\xff\x33\x22\xff\xff" "\x30\x1f\xff\xff\x2d\x1c\xff\xff\x2a\x1a\xff\xff\x27\x17\xff\xff" "\x24\x15\xff\xff\x22\x13\xff\xff\x1f\x11\xff\xff\x1c\x0f\xff\xff" "\x1a\x0d\xff\xff\x18\x0b\xff\xff\x16\x0a\xff\xff\x14\x08\xff\xff" "\x12\x07\xff\xff\x10\x06\xff\xff\x0e\x05\xff\xff\x0d\x04\xff\xff" "\x0b\x03\xff\xff\x0a\x02\xff\xff\x09\x02\xff\xff\x07\x01\xff\xff" "\x06\x01\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x59\x00\x00\x5e\x55\x00\x00\x5e\x50\x10\x00\x5e\x4b\xef\x00" "\x5e\x47\xff\x00\x59\x43\xff\x00\x54\x3f\xff\x00\x50\x3b\xff\x00" "\x4c\x37\xff\x00\x47\x33\xff\x00\x43\x30\xff\x12\x3f\x2c\xff\xe1" "\x3c\x29\xff\xff\x38\x26\xff\xff\x34\x23\xff\xff\x31\x20\xff\xff" "\x2e\x1d\xff\xff\x2b\x1b\xff\xff\x28\x18\xff\xff\x25\x16\xff\xff" "\x22\x14\xff\xff\x20\x12\xff\xff\x1d\x10\xff\xff\x1b\x0e\xff\xff" "\x18\x0c\xff\xff\x16\x0a\xff\xff\x14\x09\xff\xff\x12\x08\xff\xff" "\x10\x06\xff\xff\x0e\x05\xff\xff\x0d\x04\xff\xff\x0b\x03\xff\xff" "\x0a\x03\xff\xff\x09\x02\xff\xff\x08\x01\xff\xff\x06\x01\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x5e\x57\x00\x00\x5e\x52\x00\x00\x5e\x4e\x7f\x00\x5e\x49\xff\x00" "\x5a\x45\xff\x00\x56\x41\xff\x00\x52\x3d\xff\x00\x4d\x39\xff\x00" "\x49\x35\xff\x00\x45\x32\xff\x00\x41\x2e\xff\x9e\x3d\x2b\xff\xff" "\x39\x27\xff\xff\x36\x24\xff\xff\x32\x21\xff\xff\x2f\x1e\xff\xff" "\x2c\x1c\xff\xff\x29\x19\xff\xff\x26\x17\xff\xff\x23\x15\xff\xff" "\x20\x12\xff\xff\x1e\x10\xff\xff\x1b\x0f\xff\xff\x19\x0d\xff\xff" "\x17\x0b\xff\xff\x15\x0a\xff\xff\x13\x08\xff\xff\x11\x07\xff\xff" "\x0f\x06\xff\xff\x0d\x04\xff\xff\x0c\x04\xff\xff\x0a\x03\xff\xff" "\x09\x02\xff\xff\x08\x01\xff\xff\x07\x01\xff\xff\x06\x01\xff\xff" "\x05\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x59\x00\x00" "\x5e\x55\x00\x00\x5e\x50\x10\x00\x5e\x4b\xf0\x00\x5c\x47\xff\x00" "\x58\x43\xff\x00\x53\x3f\xff\x00\x4f\x3b\xff\x00\x4b\x37\xff\x00" "\x46\x33\xff\x00\x43\x30\xff\x3c\x3f\x2c\xff\xff\x3b\x29\xff\xff" "\x37\x26\xff\xff\x34\x23\xff\xff\x30\x20\xff\xff\x2d\x1d\xff\xff" "\x2a\x1a\xff\xff\x27\x18\xff\xff\x24\x15\xff\xff\x21\x13\xff\xff" "\x1e\x11\xff\xff\x1c\x0f\xff\xff\x1a\x0d\xff\xff\x17\x0c\xff\xff" "\x15\x0a\xff\xff\x13\x09\xff\xff\x11\x07\xff\xff\x0f\x06\xff\xff" "\x0e\x05\xff\xff\x0c\x04\xff\xff\x0a\x03\xff\xff\x09\x02\xff\xff" "\x08\x02\xff\xff\x07\x01\xff\xff\x06\x01\xff\xff\x05\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x57\x00\x00" "\x5e\x52\x00\x00\x5e\x4e\x80\x00\x5e\x49\xff\x00\x59\x45\xff\x00" "\x55\x41\xff\x00\x50\x3d\xff\x00\x4c\x39\xff\x00\x48\x35\xff\x00" "\x44\x32\xff\x05\x40\x2e\xff\xd3\x3c\x2b\xff\xff\x39\x27\xff\xff" "\x35\x24\xff\xff\x32\x21\xff\xff\x2e\x1e\xff\xff\x2b\x1c\xff\xff" "\x28\x19\xff\xff\x25\x17\xff\xff\x22\x14\xff\xff\x1f\x12\xff\xff" "\x1d\x10\xff\xff\x1a\x0e\xff\xff\x18\x0c\xff\xff\x16\x0b\xff\xff" "\x14\x09\xff\xff\x12\x08\xff\xff\x10\x06\xff\xff\x0e\x05\xff\xff" "\x0c\x04\xff\xff\x0b\x03\xff\xff\x09\x02\xff\xff\x08\x02\xff\xff" "\x07\x01\xff\xff\x06\x01\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00\x5e\x54\x00\x00" "\x5e\x50\x09\x00\x5e\x4c\xee\x00\x5c\x47\xff\x00\x57\x43\xff\x00" "\x52\x3f\xff\x00\x4e\x3b\xff\x00\x4a\x37\xff\x00\x46\x33\xff\x00" "\x42\x30\xff\x75\x3e\x2c\xff\xff\x3a\x29\xff\xff\x36\x26\xff\xff" "\x33\x23\xff\xff\x2f\x20\xff\xff\x2c\x1d\xff\xff\x29\x1a\xff\xff" "\x26\x18\xff\xff\x23\x15\xff\xff\x20\x13\xff\xff\x1e\x11\xff\xff" "\x1b\x0f\xff\xff\x18\x0d\xff\xff\x16\x0b\xff\xff\x14\x0a\xff\xff" "\x12\x08\xff\xff\x10\x07\xff\xff\x0e\x06\xff\xff\x0d\x05\xff\xff" "\x0b\x04\xff\xff\x0a\x03\xff\xff\x08\x02\xff\xff\x07\x01\xff\xff" "\x06\x01\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x57\x00\x00\x5e\x53\x00\x00" "\x5e\x4e\x5f\x00\x5e\x4a\xff\x00\x59\x45\xff\x00\x55\x41\xff\x00" "\x50\x3d\xff\x00\x4c\x39\xff\x00\x47\x35\xff\x00\x43\x32\xff\x1e" "\x3f\x2e\xff\xf5\x3b\x2b\xff\xff\x38\x27\xff\xff\x34\x24\xff\xff" "\x31\x21\xff\xff\x2d\x1e\xff\xff\x2a\x1c\xff\xff\x27\x19\xff\xff" "\x24\x17\xff\xff\x21\x14\xff\xff\x1f\x12\xff\xff\x1c\x10\xff\xff" "\x19\x0e\xff\xff\x17\x0c\xff\xff\x15\x0a\xff\xff\x13\x09\xff\xff" "\x11\x07\xff\xff\x0f\x06\xff\xff\x0d\x05\xff\xff\x0c\x04\xff\xff" "\x0a\x03\xff\xff\x09\x02\xff\xff\x07\x02\xff\xff\x06\x01\xff\xff" "\x05\x01\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x5e\x55\x00\x00\x5e\x51\x00\x00" "\x5e\x4c\xc8\x00\x5c\x48\xff\x00\x57\x43\xff\x00\x52\x3f\xff\x00" "\x4e\x3b\xff\x00\x49\x37\xff\x00\x45\x33\xff\x00\x41\x30\xff\xaf" "\x3d\x2c\xff\xff\x39\x29\xff\xff\x35\x26\xff\xff\x32\x23\xff\xff" "\x2f\x20\xff\xff\x2b\x1d\xff\xff\x28\x1a\xff\xff\x25\x18\xff\xff" "\x22\x15\xff\xff\x20\x13\xff\xff\x1d\x11\xff\xff\x1a\x0f\xff\xff" "\x18\x0d\xff\xff\x16\x0b\xff\xff\x13\x0a\xff\xff\x11\x08\xff\xff" "\x0f\x07\xff\xff\x0e\x05\xff\xff\x0c\x04\xff\xff\x0a\x03\xff\xff" "\x09\x03\xff\xff\x08\x02\xff\xff\x07\x01\xff\xff\x05\x01\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x58\x00\x00\x5e\x54\x00\x00\x5e\x4f\x31\x00" "\x5e\x4a\xff\x00\x59\x46\xff\x00\x55\x42\xff\x00\x50\x3d\xff\x00" "\x4c\x39\xff\x00\x47\x36\xff\x00\x43\x32\xff\x4c\x3f\x2e\xff\xff" "\x3b\x2b\xff\xff\x37\x27\xff\xff\x33\x24\xff\xff\x30\x21\xff\xff" "\x2d\x1e\xff\xff\x2a\x1c\xff\xff\x26\x19\xff\xff\x24\x17\xff\xff" "\x21\x14\xff\xff\x1e\x12\xff\xff\x1b\x10\xff\xff\x19\x0e\xff\xff" "\x17\x0c\xff\xff\x14\x0a\xff\xff\x12\x09\xff\xff\x10\x07\xff\xff" "\x0e\x06\xff\xff\x0c\x05\xff\xff\x0b\x04\xff\xff\x09\x03\xff\xff" "\x08\x02\xff\xff\x07\x01\xff\xff\x06\x01\xff\xff\x05\x01\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5c\x00\x00\x5e\x56\x00\x00\x5e\x52\x00\x00\x5e\x4d\x9a\x00" "\x5c\x49\xff\x00\x57\x44\xff\x00\x52\x40\xff\x00\x4e\x3c\xff\x00" "\x49\x38\xff\x00\x45\x34\xff\x0a\x41\x30\xff\xdf\x3d\x2d\xff\xff" "\x39\x29\xff\xff\x35\x26\xff\xff\x32\x23\xff\xff\x2e\x20\xff\xff" "\x2b\x1d\xff\xff\x28\x1a\xff\xff\x25\x18\xff\xff\x22\x15\xff\xff" "\x1f\x13\xff\xff\x1c\x11\xff\xff\x1a\x0f\xff\xff\x17\x0d\xff\xff" "\x15\x0b\xff\xff\x13\x0a\xff\xff\x11\x08\xff\xff\x0f\x07\xff\xff" "\x0d\x05\xff\xff\x0b\x04\xff\xff\x0a\x03\xff\xff\x08\x02\xff\xff" "\x07\x02\xff\xff\x06\x01\xff\xff\x05\x01\xff\xff\x04\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x59\x00\x00\x5e\x54\x00\x00\x5e\x50\x0f\x00\x5e\x4b\xf5\x00" "\x59\x47\xff\x00\x55\x42\xff\x00\x50\x3e\xff\x00\x4b\x3a\xff\x00" "\x47\x36\xff\x00\x43\x32\xff\x7b\x3f\x2f\xff\xff\x3b\x2b\xff\xff" "\x37\x28\xff\xff\x33\x25\xff\xff\x30\x21\xff\xff\x2c\x1e\xff\xff" "\x29\x1c\xff\xff\x26\x19\xff\xff\x23\x17\xff\xff\x20\x14\xff\xff" "\x1d\x12\xff\xff\x1b\x10\xff\xff\x18\x0e\xff\xff\x16\x0c\xff\xff" "\x14\x0a\xff\xff\x12\x09\xff\xff\x10\x07\xff\xff\x0e\x06\xff\xff" "\x0c\x05\xff\xff\x0a\x04\xff\xff\x09\x03\xff\xff\x08\x02\xff\xff" "\x06\x01\xff\xff\x05\x01\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00" "\x5e\x57\x00\x00\x5e\x53\x00\x00\x5e\x4e\x6c\x00\x5c\x49\xff\x00" "\x57\x45\xff\x00\x52\x41\xff\x00\x4e\x3c\xff\x00\x49\x39\xff\x00" "\x45\x35\xff\x0f\x41\x31\xff\xee\x3d\x2d\xff\xff\x39\x2a\xff\xff" "\x35\x26\xff\xff\x32\x23\xff\xff\x2e\x20\xff\xff\x2b\x1d\xff\xff" "\x27\x1b\xff\xff\x24\x18\xff\xff\x21\x15\xff\xff\x1e\x13\xff\xff" "\x1c\x11\xff\xff\x19\x0f\xff\xff\x17\x0d\xff\xff\x15\x0b\xff\xff" "\x12\x0a\xff\xff\x10\x08\xff\xff\x0f\x07\xff\xff\x0d\x05\xff\xff" "\x0b\x04\xff\xff\x0a\x03\xff\xff\x08\x02\xff\xff\x07\x02\xff\xff" "\x06\x01\xff\xff\x04\x01\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00" "\x5e\x55\x00\x00\x5e\x51\x01\x00\x5e\x4c\xd6\x00\x59\x48\xff\x00" "\x55\x43\xff\x00\x50\x3f\xff\x00\x4b\x3b\xff\x00\x47\x37\xff\x00" "\x43\x33\xff\x7c\x3f\x2f\xff\xff\x3b\x2c\xff\xff\x37\x28\xff\xff" "\x33\x25\xff\xff\x30\x22\xff\xff\x2c\x1f\xff\xff\x29\x1c\xff\xff" "\x26\x19\xff\xff\x23\x17\xff\xff\x20\x14\xff\xff\x1d\x12\xff\xff" "\x1a\x10\xff\xff\x18\x0e\xff\xff\x15\x0c\xff\xff\x13\x0a\xff\xff" "\x11\x09\xff\xff\x0f\x07\xff\xff\x0d\x06\xff\xff\x0c\x05\xff\xff" "\x0a\x04\xff\xff\x09\x03\xff\xff\x07\x02\xff\xff\x06\x01\xff\xff" "\x05\x01\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x58\x00\x00" "\x5e\x54\x00\x00\x5e\x4f\x3f\x00\x5c\x4a\xff\x00\x57\x46\xff\x00" "\x52\x41\xff\x00\x4e\x3d\xff\x00\x49\x39\xff\x00\x45\x35\xff\x0f" "\x41\x31\xff\xef\x3d\x2e\xff\xff\x39\x2a\xff\xff\x35\x27\xff\xff" "\x32\x24\xff\xff\x2e\x21\xff\xff\x2b\x1e\xff\xff\x27\x1b\xff\xff" "\x24\x18\xff\xff\x21\x16\xff\xff\x1e\x13\xff\xff\x1c\x11\xff\xff" "\x19\x0f\xff\xff\x17\x0d\xff\xff\x14\x0b\xff\xff\x12\x0a\xff\xff" "\x10\x08\xff\xff\x0e\x07\xff\xff\x0c\x05\xff\xff\x0b\x04\xff\xff" "\x09\x03\xff\xff\x08\x02\xff\xff\x06\x02\xff\xff\x05\x01\xff\xff" "\x04\x01\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x56\x00\x00" "\x5e\x52\x00\x00\x5e\x4d\xa7\x00\x5a\x48\xff\x00\x54\x44\xff\x00" "\x50\x40\xff\x00\x4c\x3c\xff\x00\x47\x38\xff\x00\x43\x34\xff\x7e" "\x3f\x30\xff\xff\x3b\x2c\xff\xff\x37\x29\xff\xff\x33\x26\xff\xff" "\x30\x23\xff\xff\x2c\x1f\xff\xff\x29\x1d\xff\xff\x26\x1a\xff\xff" "\x23\x17\xff\xff\x20\x15\xff\xff\x1d\x12\xff\xff\x1a\x10\xff\xff" "\x18\x0e\xff\xff\x15\x0c\xff\xff\x13\x0b\xff\xff\x11\x09\xff\xff" "\x0f\x07\xff\xff\x0d\x06\xff\xff\x0b\x05\xff\xff\x0a\x04\xff\xff" "\x08\x03\xff\xff\x07\x02\xff\xff\x06\x01\xff\xff\x05\x01\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00\x5e\x54\x00\x00" "\x5e\x50\x0b\x00\x5d\x4b\xf6\x00\x57\x47\xff\x00\x53\x42\xff\x00" "\x4e\x3e\xff\x00\x4a\x3a\xff\x00\x45\x36\xff\x10\x41\x32\xff\xef" "\x3d\x2f\xff\xff\x39\x2b\xff\xff\x35\x28\xff\xff\x32\x24\xff\xff" "\x2e\x21\xff\xff\x2b\x1e\xff\xff\x27\x1b\xff\xff\x24\x19\xff\xff" "\x21\x16\xff\xff\x1e\x14\xff\xff\x1c\x12\xff\xff\x19\x0f\xff\xff" "\x17\x0d\xff\xff\x14\x0c\xff\xff\x12\x0a\xff\xff\x10\x08\xff\xff" "\x0e\x07\xff\xff\x0c\x06\xff\xff\x0a\x04\xff\xff\x09\x03\xff\xff" "\x07\x02\xff\xff\x06\x02\xff\xff\x05\x01\xff\xff\x04\x01\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x58\x00\x00\x5e\x53\x00\x00" "\x5e\x4e\x56\x00\x5b\x4a\xff\x00\x55\x45\xff\x00\x51\x41\xff\x00" "\x4c\x3c\xff\x00\x48\x38\xff\x00\x43\x34\xff\x7f\x3f\x31\xff\xff" "\x3b\x2d\xff\xff\x37\x2a\xff\xff\x33\x26\xff\xff\x30\x23\xff\xff" "\x2c\x20\xff\xff\x29\x1d\xff\xff\x26\x1a\xff\xff\x23\x18\xff\xff" "\x20\x15\xff\xff\x1d\x13\xff\xff\x1a\x11\xff\xff\x18\x0f\xff\xff" "\x15\x0d\xff\xff\x13\x0b\xff\xff\x11\x09\xff\xff\x0f\x08\xff\xff" "\x0d\x06\xff\xff\x0b\x05\xff\xff\x0a\x04\xff\xff\x08\x03\xff\xff" "\x07\x02\xff\xff\x05\x01\xff\xff\x04\x01\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x56\x00\x00\x5e\x52\x00\x00" "\x5e\x4d\xab\x00\x58\x48\xff\x00\x54\x44\xff\x00\x4f\x3f\xff\x00" "\x4a\x3b\xff\x00\x46\x37\xff\x10\x42\x33\xff\xf0\x3d\x2f\xff\xff" "\x39\x2c\xff\xff\x36\x28\xff\xff\x32\x25\xff\xff\x2e\x22\xff\xff" "\x2b\x1f\xff\xff\x27\x1c\xff\xff\x24\x19\xff\xff\x21\x17\xff\xff" "\x1e\x14\xff\xff\x1c\x12\xff\xff\x19\x10\xff\xff\x17\x0e\xff\xff" "\x14\x0c\xff\xff\x12\x0a\xff\xff\x10\x09\xff\xff\x0e\x07\xff\xff" "\x0c\x06\xff\xff\x0a\x05\xff\xff\x09\x03\xff\xff\x07\x03\xff\xff" "\x06\x02\xff\xff\x05\x01\xff\xff\x04\x01\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5a\x00\x00\x5e\x54\x00\x00\x5e\x50\x0b\x00" "\x5c\x4b\xf6\x00\x56\x47\xff\x00\x52\x42\xff\x00\x4d\x3e\xff\x00" "\x49\x3a\xff\x00\x44\x36\xff\x80\x40\x32\xff\xff\x3c\x2e\xff\xff" "\x38\x2a\xff\xff\x34\x27\xff\xff\x30\x24\xff\xff\x2d\x21\xff\xff" "\x29\x1e\xff\xff\x26\x1b\xff\xff\x23\x18\xff\xff\x20\x16\xff\xff" "\x1d\x13\xff\xff\x1a\x11\xff\xff\x18\x0f\xff\xff\x15\x0d\xff\xff" "\x13\x0b\xff\xff\x11\x09\xff\xff\x0f\x08\xff\xff\x0d\x06\xff\xff" "\x0b\x05\xff\xff\x0a\x04\xff\xff\x08\x03\xff\xff\x07\x02\xff\xff" "\x05\x02\xff\xff\x04\x01\xff\xff\x03\x01\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x58\x00\x00\x5e\x53\x00\x00\x5e\x4e\x55\x00" "\x59\x4a\xff\x00\x54\x45\xff\x00\x50\x41\xff\x00\x4b\x3c\xff\x00" "\x47\x38\xff\x09\x42\x34\xff\xee\x3e\x31\xff\xff\x3a\x2d\xff\xff" "\x36\x29\xff\xff\x32\x26\xff\xff\x2f\x23\xff\xff\x2b\x20\xff\xff" "\x28\x1d\xff\xff\x25\x1a\xff\xff\x21\x17\xff\xff\x1e\x15\xff\xff" "\x1c\x12\xff\xff\x19\x10\xff\xff\x17\x0e\xff\xff\x14\x0c\xff\xff" "\x12\x0a\xff\xff\x10\x09\xff\xff\x0e\x07\xff\xff\x0c\x06\xff\xff" "\x0a\x05\xff\xff\x09\x04\xff\xff\x07\x03\xff\xff\x06\x02\xff\xff" "\x05\x01\xff\xff\x04\x01\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5c\x00\x00\x5e\x56\x00\x00\x5e\x52\x00\x00\x5d\x4d\xaa\x00" "\x57\x48\xff\x00\x53\x44\xff\x00\x4e\x3f\xff\x00\x49\x3b\xff\x00" "\x45\x37\xff\x5f\x41\x33\xff\xff\x3c\x2f\xff\xff\x39\x2c\xff\xff" "\x35\x28\xff\xff\x31\x25\xff\xff\x2d\x22\xff\xff\x2a\x1f\xff\xff" "\x26\x1c\xff\xff\x23\x19\xff\xff\x20\x16\xff\xff\x1d\x14\xff\xff" "\x1b\x11\xff\xff\x18\x0f\xff\xff\x15\x0d\xff\xff\x13\x0b\xff\xff" "\x11\x0a\xff\xff\x0f\x08\xff\xff\x0d\x07\xff\xff\x0b\x05\xff\xff" "\x0a\x04\xff\xff\x08\x03\xff\xff\x07\x02\xff\xff\x05\x02\xff\xff" "\x04\x01\xff\xff\x03\x01\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5a\x00\x00\x5e\x55\x00\x00\x5e\x50\x0a\x00\x5a\x4b\xf5\x00" "\x55\x47\xff\x00\x51\x42\xff\x00\x4c\x3e\xff\x00\x48\x3a\xff\x00" "\x43\x36\xff\xc8\x3f\x32\xff\xff\x3b\x2e\xff\xff\x37\x2a\xff\xff" "\x33\x27\xff\xff\x2f\x24\xff\xff\x2c\x21\xff\xff\x28\x1e\xff\xff" "\x25\x1b\xff\xff\x22\x18\xff\xff\x1f\x15\xff\xff\x1c\x13\xff\xff" "\x19\x11\xff\xff\x17\x0f\xff\xff\x14\x0d\xff\xff\x12\x0b\xff\xff" "\x10\x09\xff\xff\x0e\x08\xff\xff\x0c\x06\xff\xff\x0a\x05\xff\xff" "\x09\x04\xff\xff\x07\x03\xff\xff\x06\x02\xff\xff\x05\x01\xff\xff" "\x04\x01\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x58\x00\x00\x5e\x53\x00\x00\x5e\x4e\x54\x00\x58\x4a\xff\x00" "\x54\x45\xff\x00\x4f\x41\xff\x00\x4a\x3c\xff\x00\x46\x38\xff\x31" "\x41\x34\xff\xff\x3d\x31\xff\xff\x39\x2d\xff\xff\x35\x29\xff\xff" "\x31\x26\xff\xff\x2e\x23\xff\xff\x2a\x20\xff\xff\x27\x1d\xff\xff" "\x24\x1a\xff\xff\x21\x17\xff\xff\x1e\x15\xff\xff\x1b\x12\xff\xff" "\x18\x10\xff\xff\x16\x0e\xff\xff\x13\x0c\xff\xff\x11\x0a\xff\xff" "\x0f\x09\xff\xff\x0d\x07\xff\xff\x0b\x06\xff\xff\x0a\x04\xff\xff" "\x08\x03\xff\xff\x07\x03\xff\xff\x05\x02\xff\xff\x04\x01\xff\xff" "\x03\x01\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x5e\x56\x00\x00\x5e\x52\x00\x00\x5c\x4d\xa9\x00\x56\x48\xff\x00" "\x52\x44\xff\x00\x4d\x3f\xff\x00\x48\x3b\xff\x00\x44\x37\xff\x9a" "\x40\x33\xff\xff\x3c\x2f\xff\xff\x38\x2c\xff\xff\x34\x28\xff\xff" "\x30\x25\xff\xff\x2c\x22\xff\xff\x29\x1f\xff\xff\x26\x1c\xff\xff" "\x23\x19\xff\xff\x1f\x16\xff\xff\x1d\x14\xff\xff\x1a\x11\xff\xff" "\x17\x0f\xff\xff\x15\x0d\xff\xff\x12\x0b\xff\xff\x10\x0a\xff\xff" "\x0e\x08\xff\xff\x0c\x07\xff\xff\x0b\x05\xff\xff\x09\x04\xff\xff" "\x07\x03\xff\xff\x06\x02\xff\xff\x05\x01\xff\xff\x04\x01\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00" "\x5e\x55\x00\x00\x5e\x50\x0a\x00\x5a\x4b\xf5\x00\x54\x47\xff\x00" "\x50\x42\xff\x00\x4b\x3e\xff\x00\x47\x3a\xff\x0f\x42\x36\xff\xf5" "\x3e\x32\xff\xff\x3a\x2e\xff\xff\x36\x2a\xff\xff\x32\x27\xff\xff" "\x2f\x24\xff\xff\x2b\x21\xff\xff\x28\x1e\xff\xff\x24\x1b\xff\xff" "\x21\x18\xff\xff\x1e\x15\xff\xff\x1b\x13\xff\xff\x19\x11\xff\xff" "\x16\x0f\xff\xff\x14\x0d\xff\xff\x12\x0b\xff\xff\x0f\x09\xff\xff" "\x0d\x07\xff\xff\x0c\x06\xff\xff\x0a\x05\xff\xff\x08\x04\xff\xff" "\x07\x03\xff\xff\x06\x02\xff\xff\x04\x01\xff\xff\x03\x01\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x59\x00\x00" "\x5e\x53\x00\x00\x5e\x4f\x4d\x00\x58\x4a\xff\x00\x53\x45\xff\x00" "\x4e\x41\xff\x00\x4a\x3c\xff\x00\x45\x38\xff\x6c\x41\x34\xff\xff" "\x3c\x31\xff\xff\x38\x2d\xff\xff\x34\x29\xff\xff\x31\x26\xff\xff" "\x2d\x23\xff\xff\x2a\x20\xff\xff\x26\x1d\xff\xff\x23\x1a\xff\xff" "\x20\x17\xff\xff\x1d\x15\xff\xff\x1a\x12\xff\xff\x18\x10\xff\xff" "\x15\x0e\xff\xff\x13\x0c\xff\xff\x11\x0a\xff\xff\x0f\x09\xff\xff" "\x0d\x07\xff\xff\x0b\x06\xff\xff\x09\x04\xff\xff\x08\x03\xff\xff" "\x06\x02\xff\xff\x05\x02\xff\xff\x04\x01\xff\xff\x03\x01\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x57\x00\x00" "\x5e\x52\x00\x00\x5c\x4d\x91\x00\x56\x49\xff\x00\x52\x44\xff\x00" "\x4d\x3f\xff\x00\x48\x3b\xff\x01\x44\x37\xff\xd6\x3f\x33\xff\xff" "\x3b\x2f\xff\xff\x37\x2c\xff\xff\x33\x28\xff\xff\x2f\x25\xff\xff" "\x2c\x22\xff\xff\x28\x1f\xff\xff\x25\x1c\xff\xff\x22\x19\xff\xff" "\x1f\x16\xff\xff\x1c\x14\xff\xff\x19\x11\xff\xff\x17\x0f\xff\xff" "\x14\x0d\xff\xff\x12\x0b\xff\xff\x10\x0a\xff\xff\x0e\x08\xff\xff" "\x0c\x07\xff\xff\x0a\x05\xff\xff\x09\x04\xff\xff\x07\x03\xff\xff" "\x06\x02\xff\xff\x05\x01\xff\xff\x03\x01\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x5e\x56\x00\x00" "\x5e\x51\x00\x00\x5a\x4c\xd6\x00\x54\x47\xff\x00\x50\x43\xff\x00" "\x4b\x3e\xff\x00\x47\x3a\xff\x3f\x42\x36\xff\xff\x3e\x32\xff\xff" "\x3a\x2e\xff\xff\x36\x2b\xff\xff\x32\x27\xff\xff\x2e\x24\xff\xff" "\x2a\x21\xff\xff\x27\x1e\xff\xff\x24\x1b\xff\xff\x21\x18\xff\xff" "\x1e\x15\xff\xff\x1b\x13\xff\xff\x18\x11\xff\xff\x16\x0f\xff\xff" "\x13\x0d\xff\xff\x11\x0b\xff\xff\x0f\x09\xff\xff\x0d\x08\xff\xff" "\x0b\x06\xff\xff\x09\x05\xff\xff\x08\x04\xff\xff\x06\x03\xff\xff" "\x05\x02\xff\xff\x04\x01\xff\xff\x03\x01\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00\x5e\x54\x00\x00" "\x5e\x50\x1b\x00\x58\x4b\xff\x00\x53\x46\xff\x00\x4e\x41\xff\x00" "\x4a\x3d\xff\x00\x45\x39\xff\xa7\x41\x35\xff\xff\x3c\x31\xff\xff" "\x38\x2d\xff\xff\x34\x2a\xff\xff\x31\x26\xff\xff\x2d\x23\xff\xff" "\x29\x20\xff\xff\x26\x1d\xff\xff\x23\x1a\xff\xff\x20\x17\xff\xff" "\x1d\x15\xff\xff\x1a\x12\xff\xff\x17\x10\xff\xff\x15\x0e\xff\xff" "\x12\x0c\xff\xff\x10\x0a\xff\xff\x0e\x09\xff\xff\x0c\x07\xff\xff" "\x0a\x06\xff\xff\x09\x04\xff\xff\x07\x03\xff\xff\x06\x02\xff\xff" "\x05\x02\xff\xff\x04\x01\xff\xff\x03\x01\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x58\x00\x00\x5e\x53\x00\x00" "\x5c\x4e\x5e\x00\x56\x4a\xff\x00\x52\x45\xff\x00\x4d\x40\xff\x00" "\x48\x3c\xff\x0b\x44\x38\xff\xf6\x3f\x34\xff\xff\x3b\x30\xff\xff" "\x37\x2c\xff\xff\x33\x29\xff\xff\x2f\x25\xff\xff\x2c\x22\xff\xff" "\x28\x1f\xff\xff\x25\x1c\xff\xff\x22\x19\xff\xff\x1f\x16\xff\xff" "\x1c\x14\xff\xff\x19\x11\xff\xff\x16\x0f\xff\xff\x14\x0d\xff\xff" "\x11\x0b\xff\xff\x0f\x0a\xff\xff\x0d\x08\xff\xff\x0b\x07\xff\xff" "\x0a\x05\xff\xff\x08\x04\xff\xff\x07\x03\xff\xff\x05\x02\xff\xff" "\x04\x01\xff\xff\x03\x01\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x57\x00\x00\x5e\x52\x00\x00" "\x5a\x4d\xa2\x00\x55\x48\xff\x00\x50\x44\xff\x00\x4b\x3f\xff\x00" "\x47\x3b\xff\x56\x42\x37\xff\xff\x3e\x33\xff\xff\x3a\x2f\xff\xff" "\x36\x2b\xff\xff\x32\x28\xff\xff\x2e\x24\xff\xff\x2a\x21\xff\xff" "\x27\x1e\xff\xff\x24\x1b\xff\xff\x21\x18\xff\xff\x1e\x16\xff\xff" "\x1b\x13\xff\xff\x18\x11\xff\xff\x15\x0f\xff\xff\x13\x0d\xff\xff" "\x11\x0b\xff\xff\x0f\x09\xff\xff\x0d\x08\xff\xff\x0b\x06\xff\xff" "\x09\x05\xff\xff\x08\x04\xff\xff\x06\x03\xff\xff\x05\x02\xff\xff" "\x04\x01\xff\xff\x03\x01\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x5e\x55\x00\x00\x5e\x50\x01\x00" "\x58\x4c\xe6\x00\x53\x47\xff\x00\x4e\x42\xff\x00\x4a\x3e\xff\x00" "\x45\x3a\xff\xab\x41\x36\xff\xff\x3c\x32\xff\xff\x38\x2e\xff\xff" "\x34\x2a\xff\xff\x31\x27\xff\xff\x2d\x23\xff\xff\x29\x20\xff\xff" "\x26\x1d\xff\xff\x23\x1a\xff\xff\x20\x18\xff\xff\x1d\x15\xff\xff" "\x1a\x13\xff\xff\x17\x10\xff\xff\x15\x0e\xff\xff\x12\x0c\xff\xff" "\x10\x0a\xff\xff\x0e\x09\xff\xff\x0c\x07\xff\xff\x0a\x06\xff\xff" "\x09\x04\xff\xff\x07\x03\xff\xff\x06\x02\xff\xff\x04\x02\xff\xff" "\x03\x01\xff\xff\x03\x01\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x59\x00\x00\x5e\x54\x00\x00\x5c\x4f\x2b\x00" "\x56\x4b\xff\x00\x52\x46\xff\x00\x4d\x41\xff\x00\x48\x3d\xff\x0b" "\x44\x39\xff\xf6\x3f\x35\xff\xff\x3b\x31\xff\xff\x37\x2d\xff\xff" "\x33\x29\xff\xff\x2f\x26\xff\xff\x2c\x23\xff\xff\x28\x1f\xff\xff" "\x25\x1c\xff\xff\x22\x1a\xff\xff\x1f\x17\xff\xff\x1c\x14\xff\xff" "\x19\x12\xff\xff\x16\x10\xff\xff\x14\x0e\xff\xff\x11\x0c\xff\xff" "\x0f\x0a\xff\xff\x0d\x08\xff\xff\x0b\x07\xff\xff\x0a\x05\xff\xff" "\x08\x04\xff\xff\x07\x03\xff\xff\x05\x02\xff\xff\x04\x01\xff\xff" "\x03\x01\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5d\x00\x00\x5e\x58\x00\x00\x5e\x53\x00\x00\x5a\x4e\x6f\x00" "\x55\x49\xff\x00\x50\x45\xff\x00\x4b\x40\xff\x00\x47\x3c\xff\x55" "\x42\x38\xff\xff\x3e\x34\xff\xff\x3a\x30\xff\xff\x36\x2c\xff\xff" "\x32\x28\xff\xff\x2e\x25\xff\xff\x2a\x22\xff\xff\x27\x1f\xff\xff" "\x24\x1c\xff\xff\x21\x19\xff\xff\x1e\x16\xff\xff\x1b\x14\xff\xff" "\x18\x11\xff\xff\x15\x0f\xff\xff\x13\x0d\xff\xff\x11\x0b\xff\xff" "\x0f\x09\xff\xff\x0d\x08\xff\xff\x0b\x06\xff\xff\x09\x05\xff\xff" "\x07\x04\xff\xff\x06\x03\xff\xff\x05\x02\xff\xff\x04\x01\xff\xff" "\x03\x01\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5c\x00\x00\x5e\x56\x00\x00\x5e\x51\x00\x00\x59\x4d\xb4\x00" "\x53\x48\xff\x00\x4f\x43\xff\x00\x4a\x3f\xff\x00\x45\x3b\xff\xaa" "\x41\x37\xff\xff\x3c\x33\xff\xff\x38\x2f\xff\xff\x34\x2b\xff\xff" "\x31\x28\xff\xff\x2d\x24\xff\xff\x29\x21\xff\xff\x26\x1e\xff\xff" "\x23\x1b\xff\xff\x20\x18\xff\xff\x1d\x15\xff\xff\x1a\x13\xff\xff" "\x17\x11\xff\xff\x15\x0f\xff\xff\x12\x0c\xff\xff\x10\x0b\xff\xff" "\x0e\x09\xff\xff\x0c\x07\xff\xff\x0a\x06\xff\xff\x09\x05\xff\xff" "\x07\x04\xff\xff\x06\x03\xff\xff\x04\x02\xff\xff\x03\x01\xff\xff" "\x02\x01\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5a\x00\x00\x5e\x55\x00\x00\x5d\x50\x05\x00\x57\x4b\xf4\x00" "\x52\x47\xff\x00\x4d\x42\xff\x00\x49\x3e\xff\x0a\x44\x3a\xff\xf5" "\x3f\x35\xff\xff\x3b\x31\xff\xff\x37\x2e\xff\xff\x33\x2a\xff\xff" "\x2f\x27\xff\xff\x2c\x23\xff\xff\x28\x20\xff\xff\x25\x1d\xff\xff" "\x22\x1a\xff\xff\x1f\x17\xff\xff\x1c\x15\xff\xff\x19\x12\xff\xff" "\x16\x10\xff\xff\x14\x0e\xff\xff\x11\x0c\xff\xff\x0f\x0a\xff\xff" "\x0d\x08\xff\xff\x0b\x07\xff\xff\x0a\x06\xff\xff\x08\x04\xff\xff" "\x07\x03\xff\xff\x05\x02\xff\xff\x04\x02\xff\xff\x03\x01\xff\xff" "\x02\x01\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x59\x00\x00\x5e\x54\x00\x00\x5b\x4f\x3a\x00\x56\x4a\xff\x00" "\x51\x46\xff\x00\x4c\x41\xff\x00\x47\x3d\xff\x54\x43\x38\xff\xff" "\x3e\x34\xff\xff\x3a\x30\xff\xff\x36\x2d\xff\xff\x32\x29\xff\xff" "\x2e\x26\xff\xff\x2b\x22\xff\xff\x27\x1f\xff\xff\x24\x1c\xff\xff" "\x21\x19\xff\xff\x1e\x17\xff\xff\x1b\x14\xff\xff\x18\x12\xff\xff" "\x15\x10\xff\xff\x13\x0d\xff\xff\x11\x0b\xff\xff\x0f\x0a\xff\xff" "\x0d\x08\xff\xff\x0b\x07\xff\xff\x09\x05\xff\xff\x08\x04\xff\xff" "\x06\x03\xff\xff\x05\x02\xff\xff\x04\x01\xff\xff\x03\x01\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x58\x00\x00\x5e\x53\x00\x00\x5a\x4e\x71\x00\x54\x49\xff\x00" "\x50\x45\xff\x00\x4b\x40\xff\x00\x46\x3c\xff\xa9\x41\x37\xff\xff" "\x3d\x33\xff\xff\x39\x2f\xff\xff\x35\x2c\xff\xff\x31\x28\xff\xff" "\x2d\x25\xff\xff\x2a\x21\xff\xff\x26\x1e\xff\xff\x23\x1b\xff\xff" "\x20\x19\xff\xff\x1d\x16\xff\xff\x1a\x13\xff\xff\x17\x11\xff\xff" "\x15\x0f\xff\xff\x12\x0d\xff\xff\x10\x0b\xff\xff\x0e\x09\xff\xff" "\x0c\x08\xff\xff\x0a\x06\xff\xff\x09\x05\xff\xff\x07\x04\xff\xff" "\x06\x03\xff\xff\x04\x02\xff\xff\x03\x01\xff\xff\x02\x01\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x5e\x57\x00\x00\x5e\x52\x00\x00\x58\x4d\xa7\x00\x53\x48\xff\x00" "\x4e\x44\xff\x00\x4a\x3f\xff\x0a\x45\x3b\xff\xf5\x40\x37\xff\xff" "\x3c\x32\xff\xff\x38\x2f\xff\xff\x34\x2b\xff\xff\x30\x27\xff\xff" "\x2c\x24\xff\xff\x29\x21\xff\xff\x25\x1e\xff\xff\x22\x1b\xff\xff" "\x1f\x18\xff\xff\x1c\x15\xff\xff\x19\x13\xff\xff\x16\x11\xff\xff" "\x14\x0e\xff\xff\x11\x0c\xff\xff\x0f\x0b\xff\xff\x0d\x09\xff\xff" "\x0b\x07\xff\xff\x0a\x06\xff\xff\x08\x05\xff\xff\x07\x03\xff\xff" "\x05\x03\xff\xff\x04\x02\xff\xff\x03\x01\xff\xff\x02\x01\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00" "\x5e\x56\x00\x00\x5c\x51\x00\x00\x57\x4c\xdd\x00\x52\x47\xff\x00" "\x4d\x43\xff\x00\x48\x3e\xff\x4d\x44\x3a\xff\xff\x3f\x36\xff\xff" "\x3b\x32\xff\xff\x37\x2e\xff\xff\x33\x2a\xff\xff\x2f\x27\xff\xff" "\x2b\x23\xff\xff\x28\x20\xff\xff\x24\x1d\xff\xff\x21\x1a\xff\xff" "\x1e\x17\xff\xff\x1b\x15\xff\xff\x18\x12\xff\xff\x16\x10\xff\xff" "\x13\x0e\xff\xff\x11\x0c\xff\xff\x0f\x0a\xff\xff\x0d\x08\xff\xff" "\x0b\x07\xff\xff\x09\x05\xff\xff\x08\x04\xff\xff\x06\x03\xff\xff" "\x05\x02\xff\xff\x04\x02\xff\xff\x03\x01\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00" "\x5e\x55\x00\x00\x5b\x50\x15\x00\x55\x4b\xff\x00\x50\x46\xff\x00" "\x4c\x42\xff\x00\x47\x3d\xff\x91\x42\x39\xff\xff\x3e\x35\xff\xff" "\x3a\x31\xff\xff\x36\x2d\xff\xff\x32\x29\xff\xff\x2e\x26\xff\xff" "\x2a\x23\xff\xff\x27\x1f\xff\xff\x23\x1c\xff\xff\x20\x19\xff\xff" "\x1d\x17\xff\xff\x1a\x14\xff\xff\x18\x12\xff\xff\x15\x0f\xff\xff" "\x13\x0d\xff\xff\x10\x0b\xff\xff\x0e\x0a\xff\xff\x0c\x08\xff\xff" "\x0a\x06\xff\xff\x09\x05\xff\xff\x07\x04\xff\xff\x06\x03\xff\xff" "\x04\x02\xff\xff\x03\x01\xff\xff\x02\x01\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x59\x00\x00" "\x5e\x54\x00\x00\x59\x4f\x4a\x00\x54\x4a\xff\x00\x4f\x45\xff\x00" "\x4b\x41\xff\x00\x46\x3c\xff\xd6\x41\x38\xff\xff\x3d\x34\xff\xff" "\x39\x30\xff\xff\x35\x2c\xff\xff\x31\x29\xff\xff\x2d\x25\xff\xff" "\x29\x22\xff\xff\x26\x1f\xff\xff\x23\x1c\xff\xff\x1f\x19\xff\xff" "\x1c\x16\xff\xff\x1a\x14\xff\xff\x17\x11\xff\xff\x14\x0f\xff\xff" "\x12\x0d\xff\xff\x10\x0b\xff\xff\x0e\x09\xff\xff\x0c\x08\xff\xff" "\x0a\x06\xff\xff\x08\x05\xff\xff\x07\x04\xff\xff\x05\x03\xff\xff" "\x04\x02\xff\xff\x03\x01\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x58\x00\x00" "\x5d\x53\x00\x00\x58\x4e\x80\x00\x53\x49\xff\x00\x4e\x44\xff\x00" "\x49\x40\xff\x1b\x45\x3b\xff\xff\x40\x37\xff\xff\x3c\x33\xff\xff" "\x38\x2f\xff\xff\x34\x2b\xff\xff\x30\x28\xff\xff\x2c\x24\xff\xff" "\x28\x21\xff\xff\x25\x1e\xff\xff\x22\x1b\xff\xff\x1f\x18\xff\xff" "\x1c\x16\xff\xff\x19\x13\xff\xff\x16\x11\xff\xff\x14\x0e\xff\xff" "\x11\x0c\xff\xff\x0f\x0b\xff\xff\x0d\x09\xff\xff\x0b\x07\xff\xff" "\x09\x06\xff\xff\x08\x05\xff\xff\x06\x03\xff\xff\x05\x02\xff\xff" "\x04\x02\xff\xff\x03\x01\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x57\x00\x00" "\x5c\x51\x00\x00\x56\x4d\xb6\x00\x51\x48\xff\x00\x4d\x43\xff\x00" "\x48\x3f\xff\x5e\x43\x3a\xff\xff\x3f\x36\xff\xff\x3b\x32\xff\xff" "\x37\x2e\xff\xff\x33\x2b\xff\xff\x2f\x27\xff\xff\x2b\x24\xff\xff" "\x28\x20\xff\xff\x24\x1d\xff\xff\x21\x1a\xff\xff\x1e\x18\xff\xff" "\x1b\x15\xff\xff\x18\x13\xff\xff\x15\x10\xff\xff\x13\x0e\xff\xff" "\x11\x0c\xff\xff\x0f\x0a\xff\xff\x0c\x08\xff\xff\x0b\x07\xff\xff" "\x09\x06\xff\xff\x07\x04\xff\xff\x06\x03\xff\xff\x05\x02\xff\xff" "\x04\x02\xff\xff\x03\x01\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x5e\x56\x00\x00" "\x5a\x50\x01\x00\x55\x4c\xec\x00\x50\x47\xff\x00\x4b\x42\xff\x00" "\x47\x3e\xff\xa2\x42\x3a\xff\xff\x3e\x35\xff\xff\x3a\x31\xff\xff" "\x35\x2e\xff\xff\x31\x2a\xff\xff\x2e\x26\xff\xff\x2a\x23\xff\xff" "\x27\x20\xff\xff\x23\x1d\xff\xff\x20\x1a\xff\xff\x1d\x17\xff\xff" "\x1a\x14\xff\xff\x17\x12\xff\xff\x15\x10\xff\xff\x12\x0e\xff\xff" "\x10\x0c\xff\xff\x0e\x0a\xff\xff\x0c\x08\xff\xff\x0a\x07\xff\xff" "\x08\x05\xff\xff\x07\x04\xff\xff\x06\x03\xff\xff\x04\x02\xff\xff" "\x03\x01\xff\xff\x02\x01\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00\x5e\x54\x00\x00" "\x59\x4f\x23\x00\x54\x4b\xff\x00\x4f\x46\xff\x00\x4a\x41\xff\x01" "\x46\x3d\xff\xe6\x41\x39\xff\xff\x3d\x35\xff\xff\x38\x31\xff\xff" "\x34\x2d\xff\xff\x30\x29\xff\xff\x2d\x26\xff\xff\x29\x22\xff\xff" "\x26\x1f\xff\xff\x22\x1c\xff\xff\x1f\x19\xff\xff\x1c\x16\xff\xff" "\x19\x14\xff\xff\x17\x12\xff\xff\x14\x0f\xff\xff\x12\x0d\xff\xff" "\x10\x0b\xff\xff\x0d\x09\xff\xff\x0b\x08\xff\xff\x0a\x06\xff\xff" "\x08\x05\xff\xff\x07\x04\xff\xff\x05\x03\xff\xff\x04\x02\xff\xff" "\x03\x01\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x59\x00\x00\x5e\x53\x00\x00" "\x58\x4e\x59\x00\x53\x4a\xff\x00\x4e\x45\xff\x00\x49\x40\xff\x2b" "\x45\x3c\xff\xff\x40\x38\xff\xff\x3c\x34\xff\xff\x37\x30\xff\xff" "\x33\x2c\xff\xff\x2f\x28\xff\xff\x2c\x25\xff\xff\x28\x22\xff\xff" "\x25\x1e\xff\xff\x21\x1b\xff\xff\x1e\x19\xff\xff\x1b\x16\xff\xff" "\x19\x13\xff\xff\x16\x11\xff\xff\x13\x0f\xff\xff\x11\x0d\xff\xff" "\x0f\x0b\xff\xff\x0d\x09\xff\xff\x0b\x07\xff\xff\x09\x06\xff\xff" "\x08\x05\xff\xff\x06\x04\xff\xff\x05\x03\xff\xff\x04\x02\xff\xff" "\x03\x01\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x57\x00\x00\x5c\x52\x00\x00" "\x57\x4d\x8f\x00\x52\x49\xff\x00\x4d\x44\xff\x00\x48\x3f\xff\x6f" "\x44\x3b\xff\xff\x3f\x37\xff\xff\x3b\x33\xff\xff\x37\x2f\xff\xff" "\x32\x2b\xff\xff\x2f\x28\xff\xff\x2b\x24\xff\xff\x27\x21\xff\xff" "\x24\x1e\xff\xff\x21\x1b\xff\xff\x1e\x18\xff\xff\x1b\x15\xff\xff" "\x18\x13\xff\xff\x15\x11\xff\xff\x13\x0e\xff\xff\x11\x0c\xff\xff" "\x0e\x0a\xff\xff\x0c\x09\xff\xff\x0b\x07\xff\xff\x09\x06\xff\xff" "\x07\x04\xff\xff\x06\x03\xff\xff\x05\x02\xff\xff\x03\x02\xff\xff" "\x03\x01\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x57\x00\x00\x5b\x51\x00\x00" "\x56\x4c\xc4\x00\x51\x48\xff\x00\x4c\x43\xff\x00\x47\x3f\xff\xb4" "\x43\x3a\xff\xff\x3e\x36\xff\xff\x3a\x32\xff\xff\x36\x2e\xff\xff" "\x32\x2a\xff\xff\x2e\x27\xff\xff\x2a\x24\xff\xff\x27\x20\xff\xff" "\x23\x1d\xff\xff\x20\x1a\xff\xff\x1d\x17\xff\xff\x1a\x15\xff\xff" "\x17\x12\xff\xff\x15\x10\xff\xff\x12\x0e\xff\xff\x10\x0c\xff\xff" "\x0e\x0a\xff\xff\x0c\x08\xff\xff\x0a\x07\xff\xff\x08\x05\xff\xff" "\x07\x04\xff\xff\x05\x03\xff\xff\x04\x02\xff\xff\x03\x02\xff\xff" "\x02\x01\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x5e\x56\x00\x00\x5a\x50\x01\x00" "\x55\x4b\xf1\x00\x50\x47\xff\x00\x4b\x42\xff\x05\x46\x3d\xff\xf4" "\x42\x39\xff\xff\x3d\x35\xff\xff\x39\x31\xff\xff\x35\x2d\xff\xff" "\x31\x2a\xff\xff\x2d\x26\xff\xff\x29\x23\xff\xff\x26\x20\xff\xff" "\x23\x1d\xff\xff\x1f\x1a\xff\xff\x1c\x17\xff\xff\x19\x14\xff\xff" "\x17\x12\xff\xff\x14\x10\xff\xff\x12\x0d\xff\xff\x0f\x0c\xff\xff" "\x0d\x0a\xff\xff\x0b\x08\xff\xff\x0a\x07\xff\xff\x08\x05\xff\xff" "\x06\x04\xff\xff\x05\x03\xff\xff\x04\x02\xff\xff\x03\x01\xff\xff" "\x02\x01\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5a\x00\x00\x5e\x55\x00\x00\x59\x50\x1c\x00" "\x54\x4b\xff\x00\x4f\x46\xff\x00\x4a\x41\xff\x3a\x45\x3d\xff\xff" "\x41\x39\xff\xff\x3c\x35\xff\xff\x38\x30\xff\xff\x34\x2d\xff\xff" "\x30\x29\xff\xff\x2c\x25\xff\xff\x29\x22\xff\xff\x25\x1f\xff\xff" "\x22\x1c\xff\xff\x1f\x19\xff\xff\x1c\x16\xff\xff\x19\x14\xff\xff" "\x16\x11\xff\xff\x14\x0f\xff\xff\x11\x0d\xff\xff\x0f\x0b\xff\xff" "\x0d\x09\xff\xff\x0b\x08\xff\xff\x09\x06\xff\xff\x08\x05\xff\xff" "\x06\x04\xff\xff\x05\x03\xff\xff\x04\x02\xff\xff\x03\x01\xff\xff" "\x02\x01\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x59\x00\x00\x5d\x54\x00\x00\x58\x4f\x47\x00" "\x53\x4a\xff\x00\x4e\x45\xff\x00\x49\x41\xff\x71\x44\x3c\xff\xff" "\x40\x38\xff\xff\x3b\x34\xff\xff\x37\x30\xff\xff\x33\x2c\xff\xff" "\x2f\x28\xff\xff\x2b\x25\xff\xff\x28\x22\xff\xff\x24\x1e\xff\xff" "\x21\x1b\xff\xff\x1e\x19\xff\xff\x1b\x16\xff\xff\x18\x13\xff\xff" "\x16\x11\xff\xff\x13\x0f\xff\xff\x11\x0d\xff\xff\x0e\x0b\xff\xff" "\x0c\x09\xff\xff\x0b\x07\xff\xff\x09\x06\xff\xff\x07\x05\xff\xff" "\x06\x04\xff\xff\x05\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff" "\x02\x01\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x58\x00\x00\x5c\x53\x00\x00\x57\x4e\x72\x00" "\x51\x49\xff\x00\x4d\x45\xff\x00\x48\x40\xff\xa7\x43\x3c\xff\xff" "\x3f\x37\xff\xff\x3a\x33\xff\xff\x36\x2f\xff\xff\x32\x2b\xff\xff" "\x2e\x28\xff\xff\x2b\x24\xff\xff\x27\x21\xff\xff\x24\x1e\xff\xff" "\x20\x1b\xff\xff\x1d\x18\xff\xff\x1a\x15\xff\xff\x18\x13\xff\xff" "\x15\x11\xff\xff\x13\x0e\xff\xff\x10\x0c\xff\xff\x0e\x0a\xff\xff" "\x0c\x09\xff\xff\x0a\x07\xff\xff\x08\x06\xff\xff\x07\x04\xff\xff" "\x06\x03\xff\xff\x04\x02\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff" "\x02\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5d\x00\x00\x5e\x57\x00\x00\x5b\x52\x00\x00\x56\x4d\x9d\x00" "\x50\x48\xff\x00\x4c\x44\xff\x00\x47\x3f\xff\xdd\x42\x3b\xff\xff" "\x3e\x37\xff\xff\x3a\x32\xff\xff\x35\x2f\xff\xff\x31\x2b\xff\xff" "\x2e\x27\xff\xff\x2a\x24\xff\xff\x26\x21\xff\xff\x23\x1d\xff\xff" "\x20\x1a\xff\xff\x1d\x18\xff\xff\x1a\x15\xff\xff\x17\x13\xff\xff" "\x14\x10\xff\xff\x12\x0e\xff\xff\x10\x0c\xff\xff\x0e\x0a\xff\xff" "\x0c\x08\xff\xff\x0a\x07\xff\xff\x08\x05\xff\xff\x07\x04\xff\xff" "\x05\x03\xff\xff\x04\x02\xff\xff\x03\x01\xff\xff\x02\x01\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5c\x00\x00\x5e\x57\x00\x00\x5a\x51\x00\x00\x54\x4c\xc8\x00" "\x4f\x48\xff\x00\x4b\x43\xff\x15\x46\x3e\xff\xff\x41\x3a\xff\xff" "\x3d\x36\xff\xff\x39\x32\xff\xff\x35\x2e\xff\xff\x31\x2a\xff\xff" "\x2d\x27\xff\xff\x29\x23\xff\xff\x26\x20\xff\xff\x22\x1d\xff\xff" "\x1f\x1a\xff\xff\x1c\x17\xff\xff\x19\x15\xff\xff\x16\x12\xff\xff" "\x14\x10\xff\xff\x12\x0e\xff\xff\x0f\x0c\xff\xff\x0d\x0a\xff\xff" "\x0b\x08\xff\xff\x09\x07\xff\xff\x08\x05\xff\xff\x06\x04\xff\xff" "\x05\x03\xff\xff\x04\x02\xff\xff\x03\x01\xff\xff\x02\x01\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5b\x00\x00\x5e\x56\x00\x00\x59\x50\x01\x00\x53\x4b\xf2\x00" "\x4e\x47\xff\x00\x4a\x42\xff\x4a\x45\x3d\xff\xff\x40\x39\xff\xff" "\x3c\x35\xff\xff\x38\x31\xff\xff\x34\x2d\xff\xff\x30\x2a\xff\xff" "\x2c\x26\xff\xff\x28\x23\xff\xff\x25\x1f\xff\xff\x22\x1c\xff\xff" "\x1e\x19\xff\xff\x1b\x17\xff\xff\x19\x14\xff\xff\x16\x12\xff\xff" "\x13\x0f\xff\xff\x11\x0d\xff\xff\x0f\x0b\xff\xff\x0d\x0a\xff\xff" "\x0b\x08\xff\xff\x09\x06\xff\xff\x07\x05\xff\xff\x06\x04\xff\xff" "\x05\x03\xff\xff\x04\x02\xff\xff\x03\x01\xff\xff\x02\x01\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5a\x00\x00\x5d\x55\x00\x00\x57\x50\x1d\x00\x52\x4b\xff\x00" "\x4d\x46\xff\x00\x49\x41\xff\x80\x44\x3d\xff\xff\x3f\x39\xff\xff" "\x3b\x35\xff\xff\x37\x30\xff\xff\x33\x2d\xff\xff\x2f\x29\xff\xff" "\x2b\x25\xff\xff\x28\x22\xff\xff\x24\x1f\xff\xff\x21\x1c\xff\xff" "\x1e\x19\xff\xff\x1b\x16\xff\xff\x18\x14\xff\xff\x15\x11\xff\xff" "\x13\x0f\xff\xff\x11\x0d\xff\xff\x0e\x0b\xff\xff\x0c\x09\xff\xff" "\x0a\x08\xff\xff\x09\x06\xff\xff\x07\x05\xff\xff\x06\x04\xff\xff" "\x04\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff\x02\x01\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x59\x00\x00\x5c\x54\x00\x00\x57\x4f\x48\x00\x51\x4a\xff\x00" "\x4c\x45\xff\x00\x48\x41\xff\xb6\x43\x3c\xff\xff\x3f\x38\xff\xff" "\x3a\x34\xff\xff\x36\x30\xff\xff\x32\x2c\xff\xff\x2e\x28\xff\xff" "\x2a\x25\xff\xff\x27\x22\xff\xff\x24\x1e\xff\xff\x20\x1b\xff\xff" "\x1d\x19\xff\xff\x1a\x16\xff\xff\x17\x13\xff\xff\x15\x11\xff\xff" "\x12\x0f\xff\xff\x10\x0d\xff\xff\x0e\x0b\xff\xff\x0c\x09\xff\xff" "\x0a\x07\xff\xff\x08\x06\xff\xff\x07\x05\xff\xff\x05\x03\xff\xff" "\x04\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff\x02\x01\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x58\x00\x00\x5b\x53\x00\x00\x56\x4e\x73\x00\x50\x49\xff\x00" "\x4b\x44\xff\x01\x47\x40\xff\xec\x42\x3c\xff\xff\x3d\x37\xff\xff" "\x39\x33\xff\xff\x35\x2f\xff\xff\x31\x2b\xff\xff\x2d\x28\xff\xff" "\x2a\x24\xff\xff\x26\x21\xff\xff\x23\x1e\xff\xff\x20\x1b\xff\xff" "\x1d\x18\xff\xff\x1a\x15\xff\xff\x17\x13\xff\xff\x14\x11\xff\xff" "\x12\x0e\xff\xff\x10\x0c\xff\xff\x0d\x0a\xff\xff\x0c\x09\xff\xff" "\x0a\x07\xff\xff\x08\x06\xff\xff\x07\x04\xff\xff\x05\x03\xff\xff" "\x04\x02\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00" "\x5e\x57\x00\x00\x5a\x52\x00\x00\x55\x4d\x9e\x00\x50\x48\xff\x00" "\x4b\x44\xff\x23\x46\x3f\xff\xff\x41\x3b\xff\xff\x3d\x37\xff\xff" "\x39\x32\xff\xff\x35\x2f\xff\xff\x30\x2b\xff\xff\x2d\x27\xff\xff" "\x29\x24\xff\xff\x25\x21\xff\xff\x22\x1d\xff\xff\x1f\x1a\xff\xff" "\x1c\x18\xff\xff\x19\x15\xff\xff\x16\x12\xff\xff\x14\x10\xff\xff" "\x11\x0e\xff\xff\x0f\x0c\xff\xff\x0d\x0a\xff\xff\x0b\x08\xff\xff" "\x09\x07\xff\xff\x08\x05\xff\xff\x06\x04\xff\xff\x05\x03\xff\xff" "\x04\x02\xff\xff\x03\x01\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x5e\x57\x00\x00\x59\x51\x00\x00\x54\x4c\xc9\x00\x4f\x48\xff\x00" "\x4a\x43\xff\x59\x45\x3e\xff\xff\x41\x3a\xff\xff\x3c\x36\xff\xff" "\x38\x32\xff\xff\x34\x2e\xff\xff\x30\x2a\xff\xff\x2c\x27\xff\xff" "\x28\x23\xff\xff\x25\x20\xff\xff\x22\x1d\xff\xff\x1e\x1a\xff\xff" "\x1b\x17\xff\xff\x19\x15\xff\xff\x16\x12\xff\xff\x13\x10\xff\xff" "\x11\x0e\xff\xff\x0f\x0c\xff\xff\x0d\x0a\xff\xff\x0b\x08\xff\xff" "\x09\x07\xff\xff\x07\x05\xff\xff\x06\x04\xff\xff\x05\x03\xff\xff" "\x04\x02\xff\xff\x03\x01\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00" "\x5e\x56\x00\x00\x58\x51\x01\x00\x53\x4c\xf2\x00\x4e\x47\xff\x00" "\x49\x42\xff\x8f\x45\x3d\xff\xff\x40\x39\xff\xff\x3c\x35\xff\xff" "\x37\x31\xff\xff\x33\x2d\xff\xff\x2f\x2a\xff\xff\x2b\x26\xff\xff" "\x28\x23\xff\xff\x24\x1f\xff\xff\x21\x1c\xff\xff\x1e\x19\xff\xff" "\x1b\x17\xff\xff\x18\x14\xff\xff\x15\x12\xff\xff\x13\x0f\xff\xff" "\x11\x0d\xff\xff\x0e\x0b\xff\xff\x0c\x0a\xff\xff\x0a\x08\xff\xff" "\x09\x06\xff\xff\x07\x05\xff\xff\x06\x04\xff\xff\x04\x03\xff\xff" "\x03\x02\xff\xff\x02\x01\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00" "\x5d\x55\x00\x00\x57\x50\x15\x00\x52\x4b\xff\x00\x4d\x46\xff\x00" "\x48\x42\xff\xc4\x44\x3d\xff\xff\x3f\x39\xff\xff\x3b\x35\xff\xff" "\x37\x31\xff\xff\x32\x2d\xff\xff\x2f\x29\xff\xff\x2b\x25\xff\xff" "\x27\x22\xff\xff\x24\x1f\xff\xff\x21\x1c\xff\xff\x1d\x19\xff\xff" "\x1a\x16\xff\xff\x18\x14\xff\xff\x15\x11\xff\xff\x13\x0f\xff\xff" "\x10\x0d\xff\xff\x0e\x0b\xff\xff\x0c\x09\xff\xff\x0a\x08\xff\xff" "\x08\x06\xff\xff\x07\x05\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff" "\x03\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00" "\x5c\x54\x00\x00\x57\x4f\x36\x00\x51\x4a\xff\x00\x4c\x46\xff\x01" "\x48\x41\xff\xf1\x43\x3d\xff\xff\x3e\x38\xff\xff\x3a\x34\xff\xff" "\x36\x30\xff\xff\x32\x2c\xff\xff\x2e\x29\xff\xff\x2a\x25\xff\xff" "\x27\x22\xff\xff\x23\x1f\xff\xff\x20\x1b\xff\xff\x1d\x19\xff\xff" "\x1a\x16\xff\xff\x17\x13\xff\xff\x15\x11\xff\xff\x12\x0f\xff\xff" "\x10\x0d\xff\xff\x0e\x0b\xff\xff\x0c\x09\xff\xff\x0a\x07\xff\xff" "\x08\x06\xff\xff\x07\x05\xff\xff\x05\x03\xff\xff\x04\x03\xff\xff" "\x03\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x59\x00\x00" "\x5b\x54\x00\x00\x56\x4f\x56\x00\x50\x4a\xff\x00\x4b\x45\xff\x1c" "\x47\x40\xff\xff\x42\x3c\xff\xff\x3d\x38\xff\xff\x39\x34\xff\xff" "\x35\x30\xff\xff\x31\x2c\xff\xff\x2d\x28\xff\xff\x2a\x25\xff\xff" "\x26\x21\xff\xff\x23\x1e\xff\xff\x1f\x1b\xff\xff\x1c\x18\xff\xff" "\x19\x16\xff\xff\x17\x13\xff\xff\x14\x11\xff\xff\x12\x0e\xff\xff" "\x0f\x0c\xff\xff\x0d\x0a\xff\xff\x0b\x09\xff\xff\x0a\x07\xff\xff" "\x08\x06\xff\xff\x06\x04\xff\xff\x05\x03\xff\xff\x04\x02\xff\xff" "\x03\x02\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x58\x00\x00" "\x5a\x53\x00\x00\x55\x4e\x77\x00\x50\x49\xff\x00\x4b\x44\xff\x47" "\x46\x40\xff\xff\x41\x3b\xff\xff\x3d\x37\xff\xff\x39\x33\xff\xff" "\x35\x2f\xff\xff\x30\x2b\xff\xff\x2d\x28\xff\xff\x29\x24\xff\xff" "\x25\x21\xff\xff\x22\x1e\xff\xff\x1f\x1b\xff\xff\x1c\x18\xff\xff" "\x19\x15\xff\xff\x16\x13\xff\xff\x14\x10\xff\xff\x11\x0e\xff\xff" "\x0f\x0c\xff\xff\x0d\x0a\xff\xff\x0b\x08\xff\xff\x09\x07\xff\xff" "\x08\x05\xff\xff\x06\x04\xff\xff\x05\x03\xff\xff\x04\x02\xff\xff" "\x03\x01\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x58\x00\x00" "\x59\x52\x00\x00\x54\x4d\x98\x00\x4f\x48\xff\x00\x4a\x44\xff\x72" "\x45\x3f\xff\xff\x41\x3b\xff\xff\x3c\x37\xff\xff\x38\x33\xff\xff" "\x34\x2f\xff\xff\x30\x2b\xff\xff\x2c\x27\xff\xff\x28\x24\xff\xff" "\x25\x20\xff\xff\x22\x1d\xff\xff\x1e\x1a\xff\xff\x1b\x18\xff\xff" "\x19\x15\xff\xff\x16\x12\xff\xff\x13\x10\xff\xff\x11\x0e\xff\xff" "\x0f\x0c\xff\xff\x0d\x0a\xff\xff\x0b\x08\xff\xff\x09\x07\xff\xff" "\x07\x05\xff\xff\x06\x04\xff\xff\x05\x03\xff\xff\x03\x02\xff\xff" "\x03\x01\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x57\x00\x00" "\x58\x52\x00\x00\x53\x4d\xb9\x00\x4e\x48\xff\x00\x49\x43\xff\x9d" "\x44\x3f\xff\xff\x40\x3a\xff\xff\x3c\x36\xff\xff\x37\x32\xff\xff" "\x33\x2e\xff\xff\x2f\x2a\xff\xff\x2b\x27\xff\xff\x28\x23\xff\xff" "\x24\x20\xff\xff\x21\x1d\xff\xff\x1e\x1a\xff\xff\x1b\x17\xff\xff" "\x18\x15\xff\xff\x15\x12\xff\xff\x13\x10\xff\xff\x11\x0e\xff\xff" "\x0e\x0c\xff\xff\x0c\x0a\xff\xff\x0a\x08\xff\xff\x09\x07\xff\xff" "\x07\x05\xff\xff\x06\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff" "\x02\x01\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5d\x56\x00\x00" "\x57\x51\x00\x00\x52\x4c\xda\x00\x4d\x47\xff\x00\x48\x43\xff\xc8" "\x44\x3e\xff\xff\x3f\x3a\xff\xff\x3b\x36\xff\xff\x37\x32\xff\xff" "\x32\x2e\xff\xff\x2f\x2a\xff\xff\x2b\x26\xff\xff\x27\x23\xff\xff" "\x24\x20\xff\xff\x21\x1d\xff\xff\x1d\x1a\xff\xff\x1a\x17\xff\xff" "\x18\x14\xff\xff\x15\x12\xff\xff\x12\x0f\xff\xff\x10\x0d\xff\xff" "\x0e\x0b\xff\xff\x0c\x0a\xff\xff\x0a\x08\xff\xff\x08\x06\xff\xff" "\x07\x05\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff" "\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x5c\x56\x00\x00" "\x57\x51\x02\x00\x51\x4c\xf9\x00\x4c\x47\xff\x01\x48\x42\xff\xf2" "\x43\x3e\xff\xff\x3e\x39\xff\xff\x3a\x35\xff\xff\x36\x31\xff\xff" "\x32\x2d\xff\xff\x2e\x29\xff\xff\x2a\x26\xff\xff\x27\x22\xff\xff" "\x23\x1f\xff\xff\x20\x1c\xff\xff\x1d\x19\xff\xff\x1a\x16\xff\xff" "\x17\x14\xff\xff\x15\x11\xff\xff\x12\x0f\xff\xff\x10\x0d\xff\xff" "\x0e\x0b\xff\xff\x0c\x09\xff\xff\x0a\x08\xff\xff\x08\x06\xff\xff" "\x07\x05\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff" "\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00\x5b\x55\x00\x00" "\x56\x50\x1c\x00\x51\x4b\xff\x00\x4c\x46\xff\x1d\x47\x41\xff\xff" "\x42\x3d\xff\xff\x3d\x39\xff\xff\x39\x34\xff\xff\x35\x30\xff\xff" "\x31\x2d\xff\xff\x2d\x29\xff\xff\x2a\x25\xff\xff\x26\x22\xff\xff" "\x23\x1f\xff\xff\x1f\x1c\xff\xff\x1c\x19\xff\xff\x19\x16\xff\xff" "\x17\x14\xff\xff\x14\x11\xff\xff\x12\x0f\xff\xff\x0f\x0d\xff\xff" "\x0d\x0b\xff\xff\x0b\x09\xff\xff\x0a\x07\xff\xff\x08\x06\xff\xff" "\x06\x05\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff" "\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00\x5a\x54\x00\x00" "\x55\x4f\x3d\x00\x50\x4a\xff\x00\x4b\x45\xff\x48\x46\x41\xff\xff" "\x42\x3c\xff\xff\x3d\x38\xff\xff\x39\x34\xff\xff\x35\x30\xff\xff" "\x31\x2c\xff\xff\x2d\x28\xff\xff\x29\x25\xff\xff\x25\x22\xff\xff" "\x22\x1e\xff\xff\x1f\x1b\xff\xff\x1c\x19\xff\xff\x19\x16\xff\xff" "\x16\x13\xff\xff\x14\x11\xff\xff\x11\x0f\xff\xff\x0f\x0d\xff\xff" "\x0d\x0b\xff\xff\x0b\x09\xff\xff\x09\x07\xff\xff\x08\x06\xff\xff" "\x06\x05\xff\xff\x05\x03\xff\xff\x04\x02\xff\xff\x03\x02\xff\xff" "\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x59\x00\x00\x5a\x54\x00\x00" "\x54\x4f\x5e\x00\x4f\x4a\xff\x00\x4a\x45\xff\x73\x46\x40\xff\xff" "\x41\x3c\xff\xff\x3d\x38\xff\xff\x38\x33\xff\xff\x34\x2f\xff\xff" "\x30\x2c\xff\xff\x2c\x28\xff\xff\x29\x25\xff\xff\x25\x21\xff\xff" "\x22\x1e\xff\xff\x1f\x1b\xff\xff\x1b\x18\xff\xff\x19\x15\xff\xff" "\x16\x13\xff\xff\x13\x11\xff\xff\x11\x0e\xff\xff\x0f\x0c\xff\xff" "\x0d\x0a\xff\xff\x0b\x09\xff\xff\x09\x07\xff\xff\x07\x06\xff\xff" "\x06\x04\xff\xff\x05\x03\xff\xff\x03\x02\xff\xff\x03\x02\xff\xff" "\x02\x01\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x58\x00\x00\x59\x53\x00\x00" "\x54\x4e\x7f\x00\x4f\x49\xff\x00\x4a\x44\xff\x9e\x45\x40\xff\xff" "\x40\x3b\xff\xff\x3c\x37\xff\xff\x38\x33\xff\xff\x34\x2f\xff\xff" "\x30\x2b\xff\xff\x2c\x28\xff\xff\x28\x24\xff\xff\x25\x21\xff\xff" "\x21\x1e\xff\xff\x1e\x1b\xff\xff\x1b\x18\xff\xff\x18\x15\xff\xff" "\x16\x13\xff\xff\x13\x10\xff\xff\x11\x0e\xff\xff\x0e\x0c\xff\xff" "\x0c\x0a\xff\xff\x0a\x08\xff\xff\x09\x07\xff\xff\x07\x05\xff\xff" "\x06\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff" "\x02\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x58\x00\x00\x58\x52\x00\x00" "\x53\x4d\xa0\x00\x4e\x48\xff\x00\x49\x44\xff\xc9\x44\x3f\xff\xff" "\x40\x3b\xff\xff\x3b\x37\xff\xff\x37\x32\xff\xff\x33\x2e\xff\xff" "\x2f\x2b\xff\xff\x2b\x27\xff\xff\x28\x24\xff\xff\x24\x20\xff\xff" "\x21\x1d\xff\xff\x1e\x1a\xff\xff\x1b\x17\xff\xff\x18\x15\xff\xff" "\x15\x12\xff\xff\x13\x10\xff\xff\x10\x0e\xff\xff\x0e\x0c\xff\xff" "\x0c\x0a\xff\xff\x0a\x08\xff\xff\x08\x07\xff\xff\x07\x05\xff\xff" "\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff" "\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5d\x57\x00\x00\x58\x52\x00\x00" "\x52\x4d\xbf\x00\x4d\x48\xff\x01\x48\x43\xff\xf2\x44\x3f\xff\xff" "\x3f\x3a\xff\xff\x3b\x36\xff\xff\x37\x32\xff\xff\x33\x2e\xff\xff" "\x2f\x2a\xff\xff\x2b\x27\xff\xff\x27\x23\xff\xff\x24\x20\xff\xff" "\x20\x1d\xff\xff\x1d\x1a\xff\xff\x1a\x17\xff\xff\x18\x14\xff\xff" "\x15\x12\xff\xff\x12\x10\xff\xff\x10\x0e\xff\xff\x0e\x0c\xff\xff" "\x0c\x0a\xff\xff\x0a\x08\xff\xff\x08\x06\xff\xff\x07\x05\xff\xff" "\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff" "\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5d\x57\x00\x00\x57\x51\x00\x00" "\x52\x4c\xd8\x00\x4d\x47\xff\x15\x48\x43\xff\xff\x43\x3e\xff\xff" "\x3f\x3a\xff\xff\x3a\x36\xff\xff\x36\x32\xff\xff\x32\x2e\xff\xff" "\x2e\x2a\xff\xff\x2a\x26\xff\xff\x27\x23\xff\xff\x23\x20\xff\xff" "\x20\x1c\xff\xff\x1d\x1a\xff\xff\x1a\x17\xff\xff\x17\x14\xff\xff" "\x15\x12\xff\xff\x12\x0f\xff\xff\x10\x0d\xff\xff\x0e\x0b\xff\xff" "\x0c\x09\xff\xff\x0a\x08\xff\xff\x08\x06\xff\xff\x07\x05\xff\xff" "\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff" "\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x5c\x56\x00\x00\x56\x51\x00\x00" "\x51\x4c\xf0\x00\x4c\x47\xff\x36\x47\x42\xff\xff\x43\x3e\xff\xff" "\x3e\x39\xff\xff\x3a\x35\xff\xff\x36\x31\xff\xff\x32\x2d\xff\xff" "\x2e\x29\xff\xff\x2a\x26\xff\xff\x26\x22\xff\xff\x23\x1f\xff\xff" "\x20\x1c\xff\xff\x1d\x19\xff\xff\x1a\x17\xff\xff\x17\x14\xff\xff" "\x14\x11\xff\xff\x12\x0f\xff\xff\x0f\x0d\xff\xff\x0d\x0b\xff\xff" "\x0b\x09\xff\xff\x0a\x08\xff\xff\x08\x06\xff\xff\x06\x05\xff\xff" "\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff" "\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x5b\x56\x00\x00\x56\x50\x09\x00" "\x51\x4b\xff\x00\x4c\x47\xff\x56\x47\x42\xff\xff\x42\x3d\xff\xff" "\x3e\x39\xff\xff\x39\x35\xff\xff\x35\x31\xff\xff\x31\x2d\xff\xff" "\x2d\x29\xff\xff\x29\x26\xff\xff\x26\x22\xff\xff\x22\x1f\xff\xff" "\x1f\x1c\xff\xff\x1c\x19\xff\xff\x19\x16\xff\xff\x16\x14\xff\xff" "\x14\x11\xff\xff\x11\x0f\xff\xff\x0f\x0d\xff\xff\x0d\x0b\xff\xff" "\x0b\x09\xff\xff\x09\x07\xff\xff\x08\x06\xff\xff\x06\x05\xff\xff" "\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff" "\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5a\x00\x00\x5a\x55\x00\x00\x55\x50\x22\x00" "\x50\x4b\xff\x00\x4b\x46\xff\x77\x46\x41\xff\xff\x41\x3d\xff\xff" "\x3d\x38\xff\xff\x39\x34\xff\xff\x34\x30\xff\xff\x30\x2c\xff\xff" "\x2d\x29\xff\xff\x29\x25\xff\xff\x25\x22\xff\xff\x22\x1f\xff\xff" "\x1f\x1c\xff\xff\x1c\x19\xff\xff\x19\x16\xff\xff\x16\x13\xff\xff" "\x14\x11\xff\xff\x11\x0f\xff\xff\x0f\x0d\xff\xff\x0d\x0b\xff\xff" "\x0b\x09\xff\xff\x09\x07\xff\xff\x07\x06\xff\xff\x06\x05\xff\xff" "\x05\x03\xff\xff\x04\x02\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff" "\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5a\x00\x00\x5a\x55\x00\x00\x54\x4f\x3a\x00" "\x4f\x4a\xff\x00\x4a\x46\xff\x98\x45\x41\xff\xff\x41\x3c\xff\xff" "\x3c\x38\xff\xff\x38\x34\xff\xff\x34\x30\xff\xff\x30\x2c\xff\xff" "\x2c\x29\xff\xff\x28\x25\xff\xff\x25\x22\xff\xff\x22\x1e\xff\xff" "\x1e\x1b\xff\xff\x1b\x18\xff\xff\x19\x16\xff\xff\x16\x13\xff\xff" "\x13\x11\xff\xff\x11\x0f\xff\xff\x0f\x0c\xff\xff\x0d\x0b\xff\xff" "\x0b\x09\xff\xff\x09\x07\xff\xff\x07\x06\xff\xff\x06\x04\xff\xff" "\x05\x03\xff\xff\x03\x02\xff\xff\x02\x02\xff\xff\x02\x01\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x59\x00\x00\x59\x54\x00\x00\x54\x4f\x53\x00" "\x4f\x4a\xff\x00\x4a\x45\xff\xb9\x45\x41\xff\xff\x40\x3c\xff\xff" "\x3c\x38\xff\xff\x38\x34\xff\xff\x33\x30\xff\xff\x2f\x2c\xff\xff" "\x2c\x28\xff\xff\x28\x25\xff\xff\x25\x21\xff\xff\x21\x1e\xff\xff" "\x1e\x1b\xff\xff\x1b\x18\xff\xff\x18\x15\xff\xff\x15\x13\xff\xff" "\x13\x11\xff\xff\x11\x0e\xff\xff\x0e\x0c\xff\xff\x0c\x0a\xff\xff" "\x0a\x09\xff\xff\x09\x07\xff\xff\x07\x06\xff\xff\x06\x04\xff\xff" "\x04\x03\xff\xff\x03\x02\xff\xff\x02\x02\xff\xff\x02\x01\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x59\x00\x00\x58\x54\x00\x00\x53\x4e\x6c\x00" "\x4e\x49\xff\x00\x49\x45\xff\xda\x44\x40\xff\xff\x40\x3c\xff\xff" "\x3b\x37\xff\xff\x37\x33\xff\xff\x33\x2f\xff\xff\x2f\x2b\xff\xff" "\x2b\x28\xff\xff\x28\x24\xff\xff\x24\x21\xff\xff\x21\x1e\xff\xff" "\x1e\x1b\xff\xff\x1b\x18\xff\xff\x18\x15\xff\xff\x15\x13\xff\xff" "\x13\x10\xff\xff\x10\x0e\xff\xff\x0e\x0c\xff\xff\x0c\x0a\xff\xff" "\x0a\x08\xff\xff\x08\x07\xff\xff\x07\x05\xff\xff\x05\x04\xff\xff" "\x04\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5d\x58\x00\x00\x58\x53\x00\x00\x52\x4e\x84\x00" "\x4d\x49\xff\x02\x48\x44\xff\xf9\x44\x40\xff\xff\x3f\x3b\xff\xff" "\x3b\x37\xff\xff\x37\x33\xff\xff\x32\x2f\xff\xff\x2e\x2b\xff\xff" "\x2b\x27\xff\xff\x27\x24\xff\xff\x24\x21\xff\xff\x20\x1d\xff\xff" "\x1d\x1a\xff\xff\x1a\x18\xff\xff\x17\x15\xff\xff\x15\x12\xff\xff" "\x12\x10\xff\xff\x10\x0e\xff\xff\x0e\x0c\xff\xff\x0c\x0a\xff\xff" "\x0a\x08\xff\xff\x08\x07\xff\xff\x07\x05\xff\xff\x05\x04\xff\xff" "\x04\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5d\x00\x00\x5d\x58\x00\x00\x57\x53\x00\x00\x52\x4d\x9d\x00" "\x4d\x48\xff\x1c\x48\x44\xff\xff\x43\x3f\xff\xff\x3f\x3b\xff\xff" "\x3a\x37\xff\xff\x36\x32\xff\xff\x32\x2f\xff\xff\x2e\x2b\xff\xff" "\x2a\x27\xff\xff\x27\x24\xff\xff\x23\x20\xff\xff\x20\x1d\xff\xff" "\x1d\x1a\xff\xff\x1a\x17\xff\xff\x17\x15\xff\xff\x14\x12\xff\xff" "\x12\x10\xff\xff\x10\x0e\xff\xff\x0e\x0c\xff\xff\x0c\x0a\xff\xff" "\x0a\x08\xff\xff\x08\x07\xff\xff\x06\x05\xff\xff\x05\x04\xff\xff" "\x04\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5d\x00\x00\x5c\x57\x00\x00\x57\x52\x00\x00\x51\x4d\xb6\x00" "\x4c\x48\xff\x3d\x47\x43\xff\xff\x43\x3f\xff\xff\x3e\x3a\xff\xff" "\x3a\x36\xff\xff\x36\x32\xff\xff\x32\x2e\xff\xff\x2e\x2a\xff\xff" "\x2a\x27\xff\xff\x26\x23\xff\xff\x23\x20\xff\xff\x20\x1d\xff\xff" "\x1c\x1a\xff\xff\x1a\x17\xff\xff\x17\x14\xff\xff\x14\x12\xff\xff" "\x12\x10\xff\xff\x0f\x0e\xff\xff\x0d\x0c\xff\xff\x0b\x0a\xff\xff" "\x09\x08\xff\xff\x08\x06\xff\xff\x06\x05\xff\xff\x05\x04\xff\xff" "\x04\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5c\x00\x00\x5b\x57\x00\x00\x56\x52\x00\x00\x51\x4c\xce\x00" "\x4c\x48\xff\x5e\x47\x43\xff\xff\x42\x3e\xff\xff\x3e\x3a\xff\xff" "\x39\x36\xff\xff\x35\x32\xff\xff\x31\x2e\xff\xff\x2d\x2a\xff\xff" "\x29\x26\xff\xff\x26\x23\xff\xff\x22\x20\xff\xff\x1f\x1d\xff\xff" "\x1c\x1a\xff\xff\x19\x17\xff\xff\x17\x14\xff\xff\x14\x12\xff\xff" "\x11\x0f\xff\xff\x0f\x0d\xff\xff\x0d\x0b\xff\xff\x0b\x09\xff\xff" "\x09\x08\xff\xff\x08\x06\xff\xff\x06\x05\xff\xff\x05\x04\xff\xff" "\x04\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5c\x00\x00\x5b\x56\x00\x00\x56\x51\x00\x00\x50\x4c\xe7\x00" "\x4b\x47\xff\x7f\x47\x42\xff\xff\x42\x3e\xff\xff\x3d\x3a\xff\xff" "\x39\x35\xff\xff\x35\x31\xff\xff\x31\x2d\xff\xff\x2d\x2a\xff\xff" "\x29\x26\xff\xff\x26\x23\xff\xff\x22\x1f\xff\xff\x1f\x1c\xff\xff" "\x1c\x19\xff\xff\x19\x17\xff\xff\x16\x14\xff\xff\x14\x12\xff\xff" "\x11\x0f\xff\xff\x0f\x0d\xff\xff\x0d\x0b\xff\xff\x0b\x09\xff\xff" "\x09\x08\xff\xff\x07\x06\xff\xff\x06\x05\xff\xff\x05\x04\xff\xff" "\x04\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5b\x00\x00\x5a\x56\x00\x00\x55\x51\x03\x00\x50\x4c\xfd\x00" "\x4b\x47\xff\xa0\x46\x42\xff\xff\x41\x3e\xff\xff\x3d\x39\xff\xff" "\x38\x35\xff\xff\x34\x31\xff\xff\x30\x2d\xff\xff\x2c\x29\xff\xff" "\x29\x26\xff\xff\x25\x22\xff\xff\x22\x1f\xff\xff\x1f\x1c\xff\xff" "\x1c\x19\xff\xff\x19\x16\xff\xff\x16\x14\xff\xff\x13\x11\xff\xff" "\x11\x0f\xff\xff\x0f\x0d\xff\xff\x0d\x0b\xff\xff\x0b\x09\xff\xff" "\x09\x08\xff\xff\x07\x06\xff\xff\x06\x05\xff\xff\x05\x04\xff\xff" "\x03\x03\xff\xff\x02\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5b\x00\x00\x5a\x55\x00\x00\x55\x50\x18\x00\x4f\x4b\xff\x00" "\x4a\x46\xff\xbf\x46\x42\xff\xff\x41\x3d\xff\xff\x3c\x39\xff\xff" "\x38\x34\xff\xff\x34\x30\xff\xff\x30\x2d\xff\xff\x2c\x29\xff\xff" "\x29\x25\xff\xff\x25\x22\xff\xff\x22\x1f\xff\xff\x1e\x1c\xff\xff" "\x1b\x19\xff\xff\x18\x16\xff\xff\x16\x14\xff\xff\x13\x11\xff\xff" "\x11\x0f\xff\xff\x0f\x0d\xff\xff\x0c\x0b\xff\xff\x0b\x09\xff\xff" "\x09\x07\xff\xff\x07\x06\xff\xff\x06\x05\xff\xff\x04\x03\xff\xff" "\x03\x03\xff\xff\x02\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5a\x00\x00\x59\x55\x00\x00\x54\x50\x2e\x00\x4f\x4b\xff\x00" "\x4a\x46\xff\xd8\x45\x41\xff\xff\x41\x3d\xff\xff\x3c\x38\xff\xff" "\x38\x34\xff\xff\x34\x30\xff\xff\x30\x2c\xff\xff\x2c\x29\xff\xff" "\x28\x25\xff\xff\x25\x22\xff\xff\x21\x1f\xff\xff\x1e\x1b\xff\xff" "\x1b\x19\xff\xff\x18\x16\xff\xff\x15\x13\xff\xff\x13\x11\xff\xff" "\x11\x0f\xff\xff\x0e\x0d\xff\xff\x0c\x0b\xff\xff\x0a\x09\xff\xff" "\x09\x07\xff\xff\x07\x06\xff\xff\x06\x05\xff\xff\x04\x03\xff\xff" "\x03\x02\xff\xff\x02\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5a\x00\x00\x59\x55\x00\x00\x54\x4f\x40\x00\x4e\x4a\xff\x00" "\x49\x46\xff\xf0\x45\x41\xff\xff\x40\x3c\xff\xff\x3c\x38\xff\xff" "\x37\x34\xff\xff\x33\x30\xff\xff\x2f\x2c\xff\xff\x2b\x28\xff\xff" "\x28\x25\xff\xff\x24\x22\xff\xff\x21\x1e\xff\xff\x1e\x1b\xff\xff" "\x1b\x18\xff\xff\x18\x16\xff\xff\x15\x13\xff\xff\x13\x11\xff\xff" "\x10\x0e\xff\xff\x0e\x0c\xff\xff\x0c\x0a\xff\xff\x0a\x09\xff\xff" "\x08\x07\xff\xff\x07\x06\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff" "\x03\x02\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x59\x00\x00\x58\x54\x00\x00\x53\x4f\x52\x00\x4e\x4a\xff\x09" "\x49\x45\xff\xff\x44\x41\xff\xff\x40\x3c\xff\xff\x3b\x38\xff\xff" "\x37\x34\xff\xff\x33\x30\xff\xff\x2f\x2c\xff\xff\x2b\x28\xff\xff" "\x27\x25\xff\xff\x24\x21\xff\xff\x21\x1e\xff\xff\x1d\x1b\xff\xff" "\x1a\x18\xff\xff\x18\x15\xff\xff\x15\x13\xff\xff\x12\x11\xff\xff" "\x10\x0e\xff\xff\x0e\x0c\xff\xff\x0c\x0a\xff\xff\x0a\x09\xff\xff" "\x08\x07\xff\xff\x07\x06\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff" "\x03\x02\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5d\x59\x00\x00\x58\x54\x00\x00\x53\x4f\x64\x00\x4d\x4a\xff\x22" "\x48\x45\xff\xff\x44\x40\xff\xff\x3f\x3c\xff\xff\x3b\x37\xff\xff" "\x37\x33\xff\xff\x32\x2f\xff\xff\x2f\x2c\xff\xff\x2b\x28\xff\xff" "\x27\x24\xff\xff\x24\x21\xff\xff\x20\x1e\xff\xff\x1d\x1b\xff\xff" "\x1a\x18\xff\xff\x17\x15\xff\xff\x15\x13\xff\xff\x12\x10\xff\xff" "\x10\x0e\xff\xff\x0e\x0c\xff\xff\x0c\x0a\xff\xff\x0a\x08\xff\xff" "\x08\x07\xff\xff\x07\x05\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff" "\x03\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5d\x59\x00\x00\x57\x53\x00\x00\x52\x4e\x76\x00\x4d\x49\xff\x3a" "\x48\x45\xff\xff\x43\x40\xff\xff\x3f\x3b\xff\xff\x3a\x37\xff\xff" "\x36\x33\xff\xff\x32\x2f\xff\xff\x2e\x2b\xff\xff\x2a\x28\xff\xff" "\x27\x24\xff\xff\x23\x21\xff\xff\x20\x1e\xff\xff\x1d\x1b\xff\xff" "\x1a\x18\xff\xff\x17\x15\xff\xff\x14\x13\xff\xff\x12\x10\xff\xff" "\x10\x0e\xff\xff\x0e\x0c\xff\xff\x0c\x0a\xff\xff\x0a\x08\xff\xff" "\x08\x07\xff\xff\x06\x05\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff" "\x03\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5c\x58\x00\x00\x57\x53\x00\x00\x52\x4e\x88\x00\x4c\x49\xff\x53" "\x48\x44\xff\xff\x43\x40\xff\xff\x3e\x3b\xff\xff\x3a\x37\xff\xff" "\x36\x33\xff\xff\x32\x2f\xff\xff\x2e\x2b\xff\xff\x2a\x27\xff\xff" "\x26\x24\xff\xff\x23\x21\xff\xff\x20\x1d\xff\xff\x1d\x1a\xff\xff" "\x1a\x18\xff\xff\x17\x15\xff\xff\x14\x12\xff\xff\x12\x10\xff\xff" "\x0f\x0e\xff\xff\x0d\x0c\xff\xff\x0b\x0a\xff\xff\x09\x08\xff\xff" "\x08\x07\xff\xff\x06\x05\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff" "\x03\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5c\x58\x00\x00\x56\x53\x00\x00\x51\x4e\x9a\x00\x4c\x49\xff\x6c" "\x47\x44\xff\xff\x42\x3f\xff\xff\x3e\x3b\xff\xff\x3a\x37\xff\xff" "\x35\x33\xff\xff\x31\x2f\xff\xff\x2d\x2b\xff\xff\x2a\x27\xff\xff" "\x26\x24\xff\xff\x23\x20\xff\xff\x1f\x1d\xff\xff\x1c\x1a\xff\xff" "\x19\x17\xff\xff\x17\x15\xff\xff\x14\x12\xff\xff\x12\x10\xff\xff" "\x0f\x0e\xff\xff\x0d\x0c\xff\xff\x0b\x0a\xff\xff\x09\x08\xff\xff" "\x08\x07\xff\xff\x06\x05\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff" "\x03\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00" "\x5b\x58\x00\x00\x56\x52\x00\x00\x51\x4d\xac\x00\x4c\x48\xff\x84" "\x47\x44\xff\xff\x42\x3f\xff\xff\x3e\x3b\xff\xff\x39\x36\xff\xff" "\x35\x32\xff\xff\x31\x2e\xff\xff\x2d\x2b\xff\xff\x29\x27\xff\xff" "\x26\x23\xff\xff\x22\x20\xff\xff\x1f\x1d\xff\xff\x1c\x1a\xff\xff" "\x19\x17\xff\xff\x16\x15\xff\xff\x14\x12\xff\xff\x11\x10\xff\xff" "\x0f\x0e\xff\xff\x0d\x0c\xff\xff\x0b\x0a\xff\xff\x09\x08\xff\xff" "\x08\x06\xff\xff\x06\x05\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff" "\x03\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00" "\x5b\x57\x00\x00\x55\x52\x00\x00\x50\x4d\xbe\x00\x4b\x48\xff\x9d" "\x46\x43\xff\xff\x42\x3f\xff\xff\x3d\x3a\xff\xff\x39\x36\xff\xff" "\x34\x32\xff\xff\x30\x2e\xff\xff\x2d\x2a\xff\xff\x29\x27\xff\xff" "\x25\x23\xff\xff\x22\x20\xff\xff\x1f\x1d\xff\xff\x1c\x1a\xff\xff" "\x19\x17\xff\xff\x16\x14\xff\xff\x14\x12\xff\xff\x11\x10\xff\xff" "\x0f\x0d\xff\xff\x0d\x0b\xff\xff\x0b\x0a\xff\xff\x09\x08\xff\xff" "\x07\x06\xff\xff\x06\x05\xff\xff\x05\x04\xff\xff\x03\x03\xff\xff" "\x03\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x5a\x57\x00\x00\x55\x52\x00\x00\x50\x4d\xd0\x00\x4b\x48\xff\xb6" "\x46\x43\xff\xff\x41\x3e\xff\xff\x3d\x3a\xff\xff\x38\x36\xff\xff" "\x34\x32\xff\xff\x30\x2e\xff\xff\x2c\x2a\xff\xff\x29\x26\xff\xff" "\x25\x23\xff\xff\x22\x20\xff\xff\x1f\x1d\xff\xff\x1b\x1a\xff\xff" "\x19\x17\xff\xff\x16\x14\xff\xff\x13\x12\xff\xff\x11\x0f\xff\xff" "\x0f\x0d\xff\xff\x0d\x0b\xff\xff\x0b\x09\xff\xff\x09\x08\xff\xff" "\x07\x06\xff\xff\x06\x05\xff\xff\x05\x04\xff\xff\x03\x03\xff\xff" "\x02\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x5a\x56\x00\x00\x55\x51\x00\x00\x4f\x4c\xe2\x00\x4a\x47\xff\xce" "\x46\x42\xff\xff\x41\x3e\xff\xff\x3c\x3a\xff\xff\x38\x35\xff\xff" "\x34\x31\xff\xff\x30\x2d\xff\xff\x2c\x2a\xff\xff\x28\x26\xff\xff" "\x25\x23\xff\xff\x22\x1f\xff\xff\x1e\x1c\xff\xff\x1b\x19\xff\xff" "\x18\x17\xff\xff\x16\x14\xff\xff\x13\x12\xff\xff\x11\x0f\xff\xff" "\x0e\x0d\xff\xff\x0c\x0b\xff\xff\x0a\x09\xff\xff\x09\x08\xff\xff" "\x07\x06\xff\xff\x06\x05\xff\xff\x04\x04\xff\xff\x03\x03\xff\xff" "\x02\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00" "\x59\x56\x00\x00\x54\x51\x00\x00\x4f\x4c\xf5\x00\x4a\x47\xff\xe7" "\x45\x42\xff\xff\x41\x3e\xff\xff\x3c\x39\xff\xff\x38\x35\xff\xff" "\x34\x31\xff\xff\x30\x2d\xff\xff\x2c\x29\xff\xff\x28\x26\xff\xff" "\x25\x22\xff\xff\x21\x1f\xff\xff\x1e\x1c\xff\xff\x1b\x19\xff\xff" "\x18\x16\xff\xff\x15\x14\xff\xff\x13\x11\xff\xff\x11\x0f\xff\xff" "\x0e\x0d\xff\xff\x0c\x0b\xff\xff\x0a\x09\xff\xff\x09\x08\xff\xff" "\x07\x06\xff\xff\x06\x05\xff\xff\x04\x04\xff\xff\x03\x03\xff\xff" "\x02\x02\xff\xff\x02\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00" "\x59\x56\x00\x00\x54\x51\x08\x00\x4f\x4c\xff\x03\x4a\x47\xff\xfd" "\x45\x42\xff\xff\x40\x3d\xff\xff\x3c\x39\xff\xff\x37\x35\xff\xff" "\x33\x31\xff\xff\x2f\x2d\xff\xff\x2c\x29\xff\xff\x28\x26\xff\xff" "\x24\x22\xff\xff\x21\x1f\xff\xff\x1e\x1c\xff\xff\x1b\x19\xff\xff" "\x18\x16\xff\xff\x15\x14\xff\xff\x13\x11\xff\xff\x10\x0f\xff\xff" "\x0e\x0d\xff\xff\x0c\x0b\xff\xff\x0a\x09\xff\xff\x08\x07\xff\xff" "\x07\x06\xff\xff\x05\x05\xff\xff\x04\x04\xff\xff\x03\x03\xff\xff" "\x02\x02\xff\xff\x01\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00" "\x59\x55\x00\x00\x53\x50\x19\x00\x4e\x4b\xff\x18\x49\x46\xff\xff" "\x45\x42\xff\xff\x40\x3d\xff\xff\x3b\x39\xff\xff\x37\x35\xff\xff" "\x33\x31\xff\xff\x2f\x2d\xff\xff\x2b\x29\xff\xff\x28\x25\xff\xff" "\x24\x22\xff\xff\x21\x1f\xff\xff\x1e\x1c\xff\xff\x1b\x19\xff\xff" "\x18\x16\xff\xff\x15\x13\xff\xff\x13\x11\xff\xff\x10\x0f\xff\xff" "\x0e\x0d\xff\xff\x0c\x0b\xff\xff\x0a\x09\xff\xff\x08\x07\xff\xff" "\x07\x06\xff\xff\x05\x05\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff" "\x02\x02\xff\xff\x01\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00" "\x58\x55\x00\x00\x53\x50\x2b\x00\x4e\x4b\xff\x2e\x49\x46\xff\xff" "\x44\x41\xff\xff\x40\x3d\xff\xff\x3b\x38\xff\xff\x37\x34\xff\xff" "\x33\x30\xff\xff\x2f\x2c\xff\xff\x2b\x29\xff\xff\x27\x25\xff\xff" "\x24\x22\xff\xff\x21\x1f\xff\xff\x1d\x1c\xff\xff\x1a\x19\xff\xff" "\x18\x16\xff\xff\x15\x13\xff\xff\x12\x11\xff\xff\x10\x0f\xff\xff" "\x0e\x0d\xff\xff\x0c\x0b\xff\xff\x0a\x09\xff\xff\x08\x07\xff\xff" "\x07\x06\xff\xff\x05\x05\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff" "\x02\x02\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00" "\x58\x55\x00\x00\x53\x50\x3d\x00\x4e\x4b\xff\x40\x49\x46\xff\xff" "\x44\x41\xff\xff\x3f\x3d\xff\xff\x3b\x38\xff\xff\x37\x34\xff\xff" "\x33\x30\xff\xff\x2f\x2c\xff\xff\x2b\x28\xff\xff\x27\x25\xff\xff" "\x24\x22\xff\xff\x20\x1e\xff\xff\x1d\x1b\xff\xff\x1a\x18\xff\xff" "\x17\x16\xff\xff\x15\x13\xff\xff\x12\x11\xff\xff\x10\x0e\xff\xff" "\x0e\x0c\xff\xff\x0c\x0a\xff\xff\x0a\x09\xff\xff\x08\x07\xff\xff" "\x07\x06\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff" "\x02\x02\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5d\x5a\x00\x00" "\x58\x54\x00\x00\x52\x4f\x4b\x00\x4d\x4a\xff\x52\x48\x45\xff\xff" "\x44\x41\xff\xff\x3f\x3c\xff\xff\x3b\x38\xff\xff\x36\x34\xff\xff" "\x32\x30\xff\xff\x2e\x2c\xff\xff\x2b\x28\xff\xff\x27\x25\xff\xff" "\x23\x21\xff\xff\x20\x1e\xff\xff\x1d\x1b\xff\xff\x1a\x18\xff\xff" "\x17\x16\xff\xff\x15\x13\xff\xff\x12\x11\xff\xff\x10\x0e\xff\xff" "\x0e\x0c\xff\xff\x0c\x0a\xff\xff\x0a\x09\xff\xff\x08\x07\xff\xff" "\x06\x06\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff" "\x02\x02\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5d\x59\x00\x00" "\x57\x54\x00\x00\x52\x4f\x57\x00\x4d\x4a\xff\x64\x48\x45\xff\xff" "\x43\x41\xff\xff\x3f\x3c\xff\xff\x3a\x38\xff\xff\x36\x34\xff\xff" "\x32\x30\xff\xff\x2e\x2c\xff\xff\x2a\x28\xff\xff\x27\x25\xff\xff" "\x23\x21\xff\xff\x20\x1e\xff\xff\x1d\x1b\xff\xff\x1a\x18\xff\xff" "\x17\x15\xff\xff\x14\x13\xff\xff\x12\x10\xff\xff\x10\x0e\xff\xff" "\x0d\x0c\xff\xff\x0b\x0a\xff\xff\x0a\x09\xff\xff\x08\x07\xff\xff" "\x06\x06\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff" "\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5c\x59\x00\x00" "\x57\x54\x00\x00\x52\x4f\x64\x00\x4d\x4a\xff\x76\x48\x45\xff\xff" "\x43\x40\xff\xff\x3e\x3c\xff\xff\x3a\x38\xff\xff\x36\x33\xff\xff" "\x32\x2f\xff\xff\x2e\x2c\xff\xff\x2a\x28\xff\xff\x26\x24\xff\xff" "\x23\x21\xff\xff\x20\x1e\xff\xff\x1d\x1b\xff\xff\x1a\x18\xff\xff" "\x17\x15\xff\xff\x14\x13\xff\xff\x12\x10\xff\xff\x0f\x0e\xff\xff" "\x0d\x0c\xff\xff\x0b\x0a\xff\xff\x09\x08\xff\xff\x08\x07\xff\xff" "\x06\x05\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff" "\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5c\x59\x00\x00" "\x56\x54\x00\x00\x51\x4f\x70\x00\x4c\x4a\xff\x88\x47\x45\xff\xff" "\x42\x40\xff\xff\x3e\x3c\xff\xff\x3a\x37\xff\xff\x35\x33\xff\xff" "\x31\x2f\xff\xff\x2d\x2b\xff\xff\x2a\x28\xff\xff\x26\x24\xff\xff" "\x23\x21\xff\xff\x1f\x1e\xff\xff\x1c\x1b\xff\xff\x19\x18\xff\xff" "\x17\x15\xff\xff\x14\x13\xff\xff\x12\x10\xff\xff\x0f\x0e\xff\xff" "\x0d\x0c\xff\xff\x0b\x0a\xff\xff\x09\x08\xff\xff\x08\x07\xff\xff" "\x06\x05\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff" "\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x59\x00\x00" "\x56\x53\x00\x00\x51\x4e\x7d\x00\x4c\x49\xff\x9a\x47\x45\xff\xff" "\x42\x40\xff\xff\x3e\x3b\xff\xff\x39\x37\xff\xff\x35\x33\xff\xff" "\x31\x2f\xff\xff\x2d\x2b\xff\xff\x29\x28\xff\xff\x26\x24\xff\xff" "\x22\x21\xff\xff\x1f\x1e\xff\xff\x1c\x1b\xff\xff\x19\x18\xff\xff" "\x16\x15\xff\xff\x14\x13\xff\xff\x11\x10\xff\xff\x0f\x0e\xff\xff" "\x0d\x0c\xff\xff\x0b\x0a\xff\xff\x09\x08\xff\xff\x08\x07\xff\xff" "\x06\x05\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff" "\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x58\x00\x00" "\x56\x53\x00\x00\x51\x4e\x89\x00\x4c\x49\xff\xac\x47\x44\xff\xff" "\x42\x40\xff\xff\x3d\x3b\xff\xff\x39\x37\xff\xff\x35\x33\xff\xff" "\x31\x2f\xff\xff\x2d\x2b\xff\xff\x29\x27\xff\xff\x26\x24\xff\xff" "\x22\x21\xff\xff\x1f\x1d\xff\xff\x1c\x1a\xff\xff\x19\x18\xff\xff" "\x16\x15\xff\xff\x14\x12\xff\xff\x11\x10\xff\xff\x0f\x0e\xff\xff" "\x0d\x0c\xff\xff\x0b\x0a\xff\xff\x09\x08\xff\xff\x07\x07\xff\xff" "\x06\x05\xff\xff\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff" "\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x58\x00\x00" "\x55\x53\x00\x00\x50\x4e\x96\x00\x4b\x49\xff\xbe\x46\x44\xff\xff" "\x42\x3f\xff\xff\x3d\x3b\xff\xff\x39\x37\xff\xff\x35\x33\xff\xff" "\x31\x2f\xff\xff\x2d\x2b\xff\xff\x29\x27\xff\xff\x25\x24\xff\xff" "\x22\x20\xff\xff\x1f\x1d\xff\xff\x1c\x1a\xff\xff\x19\x17\xff\xff" "\x16\x15\xff\xff\x13\x12\xff\xff\x11\x10\xff\xff\x0f\x0e\xff\xff" "\x0d\x0c\xff\xff\x0b\x0a\xff\xff\x09\x08\xff\xff\x07\x07\xff\xff" "\x06\x05\xff\xff\x05\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff" "\x02\x01\xff\xff\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5a\x58\x00\x00" "\x55\x53\x00\x00\x50\x4e\xa2\x00\x4b\x49\xff\xd0\x46\x44\xff\xff" "\x41\x3f\xff\xff\x3d\x3b\xff\xff\x38\x37\xff\xff\x34\x32\xff\xff" "\x30\x2e\xff\xff\x2c\x2b\xff\xff\x29\x27\xff\xff\x25\x24\xff\xff" "\x22\x20\xff\xff\x1f\x1d\xff\xff\x1c\x1a\xff\xff\x19\x17\xff\xff" "\x16\x15\xff\xff\x13\x12\xff\xff\x11\x10\xff\xff\x0f\x0e\xff\xff" "\x0d\x0c\xff\xff\x0b\x0a\xff\xff\x09\x08\xff\xff\x07\x07\xff\xff" "\x06\x05\xff\xff\x05\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff" "\x02\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5a\x58\x00\x00" "\x55\x52\x00\x00\x50\x4d\xae\x00\x4b\x48\xff\xe2\x46\x44\xff\xff" "\x41\x3f\xff\xff\x3d\x3b\xff\xff\x38\x36\xff\xff\x34\x32\xff\xff" "\x30\x2e\xff\xff\x2c\x2a\xff\xff\x28\x27\xff\xff\x25\x23\xff\xff" "\x22\x20\xff\xff\x1e\x1d\xff\xff\x1b\x1a\xff\xff\x18\x17\xff\xff" "\x16\x15\xff\xff\x13\x12\xff\xff\x11\x10\xff\xff\x0e\x0e\xff\xff" "\x0c\x0c\xff\xff\x0a\x0a\xff\xff\x09\x08\xff\xff\x07\x06\xff\xff" "\x06\x05\xff\xff\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff" "\x02\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5a\x57\x00\x00" "\x54\x52\x00\x00\x4f\x4d\xbb\x00\x4a\x48\xff\xf5\x45\x43\xff\xff" "\x41\x3f\xff\xff\x3c\x3a\xff\xff\x38\x36\xff\xff\x34\x32\xff\xff" "\x30\x2e\xff\xff\x2c\x2a\xff\xff\x28\x27\xff\xff\x25\x23\xff\xff" "\x21\x20\xff\xff\x1e\x1d\xff\xff\x1b\x1a\xff\xff\x18\x17\xff\xff" "\x16\x14\xff\xff\x13\x12\xff\xff\x11\x10\xff\xff\x0e\x0d\xff\xff" "\x0c\x0b\xff\xff\x0a\x0a\xff\xff\x09\x08\xff\xff\x07\x06\xff\xff" "\x06\x05\xff\xff\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff" "\x02\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x59\x57\x00\x00" "\x54\x52\x00\x00\x4f\x4d\xc7\x08\x4a\x48\xff\xff\x45\x43\xff\xff" "\x41\x3f\xff\xff\x3c\x3a\xff\xff\x38\x36\xff\xff\x34\x32\xff\xff" "\x30\x2e\xff\xff\x2c\x2a\xff\xff\x28\x27\xff\xff\x25\x23\xff\xff" "\x21\x20\xff\xff\x1e\x1d\xff\xff\x1b\x1a\xff\xff\x18\x17\xff\xff" "\x15\x14\xff\xff\x13\x12\xff\xff\x10\x0f\xff\xff\x0e\x0d\xff\xff" "\x0c\x0b\xff\xff\x0a\x0a\xff\xff\x09\x08\xff\xff\x07\x06\xff\xff" "\x06\x05\xff\xff\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff" "\x01\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x59\x57\x00\x00" "\x54\x52\x00\x00\x4f\x4d\xd4\x19\x4a\x48\xff\xff\x45\x43\xff\xff" "\x40\x3e\xff\xff\x3c\x3a\xff\xff\x38\x36\xff\xff\x33\x32\xff\xff" "\x2f\x2e\xff\xff\x2c\x2a\xff\xff\x28\x26\xff\xff\x24\x23\xff\xff" "\x21\x20\xff\xff\x1e\x1c\xff\xff\x1b\x1a\xff\xff\x18\x17\xff\xff" "\x15\x14\xff\xff\x13\x12\xff\xff\x10\x0f\xff\xff\x0e\x0d\xff\xff" "\x0c\x0b\xff\xff\x0a\x09\xff\xff\x08\x08\xff\xff\x07\x06\xff\xff" "\x05\x05\xff\xff\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff" "\x01\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x59\x57\x00\x00" "\x54\x51\x00\x00\x4f\x4c\xe0\x2b\x4a\x47\xff\xff\x45\x43\xff\xff" "\x40\x3e\xff\xff\x3c\x3a\xff\xff\x37\x36\xff\xff\x33\x31\xff\xff" "\x2f\x2e\xff\xff\x2b\x2a\xff\xff\x28\x26\xff\xff\x24\x23\xff\xff" "\x21\x1f\xff\xff\x1e\x1c\xff\xff\x1b\x19\xff\xff\x18\x17\xff\xff" "\x15\x14\xff\xff\x13\x12\xff\xff\x10\x0f\xff\xff\x0e\x0d\xff\xff" "\x0c\x0b\xff\xff\x0a\x09\xff\xff\x08\x08\xff\xff\x07\x06\xff\xff" "\x05\x05\xff\xff\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff" "\x01\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x59\x56\x00\x00" "\x53\x51\x00\x00\x4e\x4c\xed\x3d\x49\x47\xff\xff\x45\x42\xff\xff" "\x40\x3e\xff\xff\x3b\x39\xff\xff\x37\x35\xff\xff\x33\x31\xff\xff" "\x2f\x2d\xff\xff\x2b\x2a\xff\xff\x28\x26\xff\xff\x24\x23\xff\xff" "\x21\x1f\xff\xff\x1e\x1c\xff\xff\x1b\x19\xff\xff\x18\x17\xff\xff" "\x15\x14\xff\xff\x13\x11\xff\xff\x10\x0f\xff\xff\x0e\x0d\xff\xff" "\x0c\x0b\xff\xff\x0a\x09\xff\xff\x08\x08\xff\xff\x07\x06\xff\xff" "\x05\x05\xff\xff\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff" "\x01\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x58\x56\x00\x00" "\x53\x51\x00\x00\x4e\x4c\xf9\x4b\x49\x47\xff\xff\x44\x42\xff\xff" "\x40\x3e\xff\xff\x3b\x39\xff\xff\x37\x35\xff\xff\x33\x31\xff\xff" "\x2f\x2d\xff\xff\x2b\x29\xff\xff\x27\x26\xff\xff\x24\x22\xff\xff" "\x21\x1f\xff\xff\x1d\x1c\xff\xff\x1a\x19\xff\xff\x18\x16\xff\xff" "\x15\x14\xff\xff\x12\x11\xff\xff\x10\x0f\xff\xff\x0e\x0d\xff\xff" "\x0c\x0b\xff\xff\x0a\x09\xff\xff\x08\x08\xff\xff\x07\x06\xff\xff" "\x05\x05\xff\xff\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff" "\x01\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x58\x56\x00\x00" "\x53\x51\x06\x00\x4e\x4c\xff\x57\x49\x47\xff\xff\x44\x42\xff\xff" "\x3f\x3e\xff\xff\x3b\x39\xff\xff\x37\x35\xff\xff\x33\x31\xff\xff" "\x2f\x2d\xff\xff\x2b\x29\xff\xff\x27\x26\xff\xff\x24\x22\xff\xff" "\x20\x1f\xff\xff\x1d\x1c\xff\xff\x1a\x19\xff\xff\x17\x16\xff\xff" "\x15\x14\xff\xff\x12\x11\xff\xff\x10\x0f\xff\xff\x0e\x0d\xff\xff" "\x0c\x0b\xff\xff\x0a\x09\xff\xff\x08\x07\xff\xff\x07\x06\xff\xff" "\x05\x05\xff\xff\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff" "\x01\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5d\x5b\x00\x00\x58\x56\x00\x00" "\x53\x51\x11\x00\x4e\x4c\xff\x64\x49\x47\xff\xff\x44\x42\xff\xff" "\x3f\x3d\xff\xff\x3b\x39\xff\xff\x37\x35\xff\xff\x32\x31\xff\xff" "\x2e\x2d\xff\xff\x2b\x29\xff\xff\x27\x26\xff\xff\x24\x22\xff\xff" "\x20\x1f\xff\xff\x1d\x1c\xff\xff\x1a\x19\xff\xff\x17\x16\xff\xff" "\x15\x14\xff\xff\x12\x11\xff\xff\x10\x0f\xff\xff\x0e\x0d\xff\xff" "\x0c\x0b\xff\xff\x0a\x09\xff\xff\x08\x07\xff\xff\x07\x06\xff\xff" "\x05\x05\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff\x02\x02\xff\xff" "\x01\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5d\x5b\x00\x00\x58\x56\x00\x00" "\x52\x50\x19\x00\x4d\x4b\xff\x70\x48\x46\xff\xff\x44\x42\xff\xff" "\x3f\x3d\xff\xff\x3b\x39\xff\xff\x36\x35\xff\xff\x32\x31\xff\xff" "\x2e\x2d\xff\xff\x2a\x29\xff\xff\x27\x25\xff\xff\x23\x22\xff\xff" "\x20\x1f\xff\xff\x1d\x1c\xff\xff\x1a\x19\xff\xff\x17\x16\xff\xff" "\x15\x13\xff\xff\x12\x11\xff\xff\x10\x0f\xff\xff\x0e\x0d\xff\xff" "\x0c\x0b\xff\xff\x0a\x09\xff\xff\x08\x07\xff\xff\x06\x06\xff\xff" "\x05\x05\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff\x02\x02\xff\xff" "\x01\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5d\x5b\x00\x00\x57\x55\x00\x00" "\x52\x50\x21\x00\x4d\x4b\xff\x7d\x48\x46\xff\xff\x43\x42\xff\xff" "\x3f\x3d\xff\xff\x3a\x39\xff\xff\x36\x35\xff\xff\x32\x31\xff\xff" "\x2e\x2d\xff\xff\x2a\x29\xff\xff\x27\x25\xff\xff\x23\x22\xff\xff" "\x20\x1f\xff\xff\x1d\x1c\xff\xff\x1a\x19\xff\xff\x17\x16\xff\xff" "\x14\x13\xff\xff\x12\x11\xff\xff\x10\x0f\xff\xff\x0d\x0d\xff\xff" "\x0b\x0b\xff\xff\x0a\x09\xff\xff\x08\x07\xff\xff\x06\x06\xff\xff" "\x05\x05\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff\x02\x02\xff\xff" "\x01\x01\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5d\x5b\x00\x00\x57\x55\x00\x00" "\x52\x50\x29\x00\x4d\x4b\xff\x89\x48\x46\xff\xff\x43\x42\xff\xff" "\x3f\x3d\xff\xff\x3a\x39\xff\xff\x36\x34\xff\xff\x32\x30\xff\xff" "\x2e\x2d\xff\xff\x2a\x29\xff\xff\x27\x25\xff\xff\x23\x22\xff\xff" "\x20\x1f\xff\xff\x1d\x1c\xff\xff\x1a\x19\xff\xff\x17\x16\xff\xff" "\x14\x13\xff\xff\x12\x11\xff\xff\x0f\x0f\xff\xff\x0d\x0d\xff\xff" "\x0b\x0b\xff\xff\x0a\x09\xff\xff\x08\x07\xff\xff\x06\x06\xff\xff" "\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff\x02\x02\xff\xff" "\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5c\x5a\x00\x00\x57\x55\x00\x00" "\x52\x50\x30\x00\x4d\x4b\xff\x96\x48\x46\xff\xff\x43\x41\xff\xff" "\x3e\x3d\xff\xff\x3a\x38\xff\xff\x36\x34\xff\xff\x32\x30\xff\xff" "\x2e\x2c\xff\xff\x2a\x29\xff\xff\x26\x25\xff\xff\x23\x22\xff\xff" "\x20\x1f\xff\xff\x1c\x1b\xff\xff\x1a\x19\xff\xff\x17\x16\xff\xff" "\x14\x13\xff\xff\x12\x11\xff\xff\x0f\x0f\xff\xff\x0d\x0c\xff\xff" "\x0b\x0b\xff\xff\x09\x09\xff\xff\x08\x07\xff\xff\x06\x06\xff\xff" "\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff\x02\x02\xff\xff" "\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5c\x5a\x00\x00\x57\x55\x00\x00" "\x51\x50\x38\x00\x4c\x4b\xff\xa2\x47\x46\xff\xff\x43\x41\xff\xff" "\x3e\x3d\xff\xff\x3a\x38\xff\xff\x36\x34\xff\xff\x31\x30\xff\xff" "\x2e\x2c\xff\xff\x2a\x29\xff\xff\x26\x25\xff\xff\x23\x22\xff\xff" "\x1f\x1e\xff\xff\x1c\x1b\xff\xff\x19\x18\xff\xff\x17\x16\xff\xff" "\x14\x13\xff\xff\x12\x11\xff\xff\x0f\x0f\xff\xff\x0d\x0c\xff\xff" "\x0b\x0b\xff\xff\x09\x09\xff\xff\x08\x07\xff\xff\x06\x06\xff\xff" "\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff\x02\x02\xff\xff" "\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5c\x5a\x00\x00\x56\x55\x00\x00" "\x51\x50\x40\x00\x4c\x4b\xff\xae\x47\x46\xff\xff\x42\x41\xff\xff" "\x3e\x3d\xff\xff\x39\x38\xff\xff\x35\x34\xff\xff\x31\x30\xff\xff" "\x2d\x2c\xff\xff\x2a\x28\xff\xff\x26\x25\xff\xff\x23\x22\xff\xff" "\x1f\x1e\xff\xff\x1c\x1b\xff\xff\x19\x18\xff\xff\x17\x16\xff\xff" "\x14\x13\xff\xff\x11\x11\xff\xff\x0f\x0e\xff\xff\x0d\x0c\xff\xff" "\x0b\x0a\xff\xff\x09\x09\xff\xff\x08\x07\xff\xff\x06\x06\xff\xff" "\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff\x02\x02\xff\xff" "\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x5a\x00\x00\x56\x55\x00\x00" "\x51\x4f\x47\x00\x4c\x4a\xff\xbb\x47\x46\xff\xff\x42\x41\xff\xff" "\x3e\x3c\xff\xff\x39\x38\xff\xff\x35\x34\xff\xff\x31\x30\xff\xff" "\x2d\x2c\xff\xff\x29\x28\xff\xff\x26\x25\xff\xff\x22\x21\xff\xff" "\x1f\x1e\xff\xff\x1c\x1b\xff\xff\x19\x18\xff\xff\x16\x16\xff\xff" "\x14\x13\xff\xff\x11\x11\xff\xff\x0f\x0e\xff\xff\x0d\x0c\xff\xff" "\x0b\x0a\xff\xff\x09\x09\xff\xff\x08\x07\xff\xff\x06\x06\xff\xff" "\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff\x02\x02\xff\xff" "\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x5a\x00\x00\x56\x54\x00\x00" "\x51\x4f\x4f\x00\x4c\x4a\xff\xc7\x47\x45\xff\xff\x42\x41\xff\xff" "\x3e\x3c\xff\xff\x39\x38\xff\xff\x35\x34\xff\xff\x31\x30\xff\xff" "\x2d\x2c\xff\xff\x29\x28\xff\xff\x26\x25\xff\xff\x22\x21\xff\xff" "\x1f\x1e\xff\xff\x1c\x1b\xff\xff\x19\x18\xff\xff\x16\x16\xff\xff" "\x14\x13\xff\xff\x11\x11\xff\xff\x0f\x0e\xff\xff\x0d\x0c\xff\xff" "\x0b\x0a\xff\xff\x09\x09\xff\xff\x07\x07\xff\xff\x06\x06\xff\xff" "\x05\x04\xff\xff\x04\x03\xff\xff\x03\x02\xff\xff\x02\x02\xff\xff" "\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x5a\x00\x00\x56\x54\x00\x00" "\x51\x4f\x57\x00\x4c\x4a\xff\xd4\x47\x45\xff\xff\x42\x41\xff\xff" "\x3d\x3c\xff\xff\x39\x38\xff\xff\x35\x34\xff\xff\x31\x30\xff\xff" "\x2d\x2c\xff\xff\x29\x28\xff\xff\x26\x25\xff\xff\x22\x21\xff\xff" "\x1f\x1e\xff\xff\x1c\x1b\xff\xff\x19\x18\xff\xff\x16\x15\xff\xff" "\x14\x13\xff\xff\x11\x10\xff\xff\x0f\x0e\xff\xff\x0d\x0c\xff\xff" "\x0b\x0a\xff\xff\x09\x09\xff\xff\x07\x07\xff\xff\x06\x06\xff\xff" "\x05\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x02\x01\xff\xff" "\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x59\x00\x00\x56\x54\x00\x00" "\x50\x4f\x5f\x00\x4b\x4a\xff\xe0\x46\x45\xff\xff\x42\x41\xff\xff" "\x3d\x3c\xff\xff\x39\x38\xff\xff\x35\x34\xff\xff\x31\x30\xff\xff" "\x2d\x2c\xff\xff\x29\x28\xff\xff\x25\x25\xff\xff\x22\x21\xff\xff" "\x1f\x1e\xff\xff\x1c\x1b\xff\xff\x19\x18\xff\xff\x16\x15\xff\xff" "\x13\x13\xff\xff\x11\x10\xff\xff\x0f\x0e\xff\xff\x0d\x0c\xff\xff" "\x0b\x0a\xff\xff\x09\x08\xff\xff\x07\x07\xff\xff\x06\x05\xff\xff" "\x05\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x02\x01\xff\xff" "\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x59\x00\x00\x55\x54\x00\x00" "\x50\x4f\x66\x00\x4b\x4a\xff\xed\x46\x45\xff\xff\x42\x40\xff\xff" "\x3d\x3c\xff\xff\x39\x38\xff\xff\x35\x33\xff\xff\x31\x2f\xff\xff" "\x2d\x2c\xff\xff\x29\x28\xff\xff\x25\x24\xff\xff\x22\x21\xff\xff" "\x1f\x1e\xff\xff\x1c\x1b\xff\xff\x19\x18\xff\xff\x16\x15\xff\xff" "\x13\x13\xff\xff\x11\x10\xff\xff\x0f\x0e\xff\xff\x0d\x0c\xff\xff" "\x0b\x0a\xff\xff\x09\x08\xff\xff\x07\x07\xff\xff\x06\x05\xff\xff" "\x05\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x02\x01\xff\xff" "\x01\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x59\x00\x00\x55\x54\x00\x00" "\x50\x4f\x6e\x00\x4b\x4a\xff\xf9\x46\x45\xff\xff\x42\x40\xff\xff" "\x3d\x3c\xff\xff\x39\x37\xff\xff\x34\x33\xff\xff\x30\x2f\xff\xff" "\x2d\x2b\xff\xff\x29\x28\xff\xff\x25\x24\xff\xff\x22\x21\xff\xff" "\x1f\x1e\xff\xff\x1c\x1b\xff\xff\x19\x18\xff\xff\x16\x15\xff\xff" "\x13\x13\xff\xff\x11\x10\xff\xff\x0f\x0e\xff\xff\x0d\x0c\xff\xff" "\x0b\x0a\xff\xff\x09\x08\xff\xff\x07\x07\xff\xff\x06\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x02\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5a\x59\x00\x00\x55\x54\x00\x00" "\x50\x4f\x76\x06\x4b\x4a\xff\xff\x46\x45\xff\xff\x41\x40\xff\xff" "\x3d\x3c\xff\xff\x38\x37\xff\xff\x34\x33\xff\xff\x30\x2f\xff\xff" "\x2c\x2b\xff\xff\x29\x28\xff\xff\x25\x24\xff\xff\x22\x21\xff\xff" "\x1f\x1e\xff\xff\x1b\x1b\xff\xff\x19\x18\xff\xff\x16\x15\xff\xff" "\x13\x13\xff\xff\x11\x10\xff\xff\x0f\x0e\xff\xff\x0c\x0c\xff\xff" "\x0b\x0a\xff\xff\x09\x08\xff\xff\x07\x07\xff\xff\x06\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x02\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5a\x59\x00\x00\x55\x54\x00\x00" "\x50\x4e\x7d\x11\x4b\x49\xff\xff\x46\x45\xff\xff\x41\x40\xff\xff" "\x3d\x3c\xff\xff\x38\x37\xff\xff\x34\x33\xff\xff\x30\x2f\xff\xff" "\x2c\x2b\xff\xff\x29\x28\xff\xff\x25\x24\xff\xff\x22\x21\xff\xff" "\x1e\x1e\xff\xff\x1b\x1b\xff\xff\x18\x18\xff\xff\x16\x15\xff\xff" "\x13\x13\xff\xff\x11\x10\xff\xff\x0f\x0e\xff\xff\x0c\x0c\xff\xff" "\x0b\x0a\xff\xff\x09\x08\xff\xff\x07\x07\xff\xff\x06\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x02\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5a\x59\x00\x00\x55\x53\x00\x00" "\x50\x4e\x85\x19\x4b\x49\xff\xff\x46\x44\xff\xff\x41\x40\xff\xff" "\x3d\x3b\xff\xff\x38\x37\xff\xff\x34\x33\xff\xff\x30\x2f\xff\xff" "\x2c\x2b\xff\xff\x28\x27\xff\xff\x25\x24\xff\xff\x22\x21\xff\xff" "\x1e\x1d\xff\xff\x1b\x1a\xff\xff\x18\x18\xff\xff\x16\x15\xff\xff" "\x13\x12\xff\xff\x11\x10\xff\xff\x0e\x0e\xff\xff\x0c\x0c\xff\xff" "\x0a\x0a\xff\xff\x09\x08\xff\xff\x07\x07\xff\xff\x06\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x02\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5a\x58\x00\x00\x55\x53\x00\x00" "\x4f\x4e\x8d\x21\x4a\x49\xff\xff\x46\x44\xff\xff\x41\x40\xff\xff" "\x3c\x3b\xff\xff\x38\x37\xff\xff\x34\x33\xff\xff\x30\x2f\xff\xff" "\x2c\x2b\xff\xff\x28\x27\xff\xff\x25\x24\xff\xff\x21\x21\xff\xff" "\x1e\x1d\xff\xff\x1b\x1a\xff\xff\x18\x18\xff\xff\x16\x15\xff\xff" "\x13\x12\xff\xff\x11\x10\xff\xff\x0e\x0e\xff\xff\x0c\x0c\xff\xff" "\x0a\x0a\xff\xff\x09\x08\xff\xff\x07\x07\xff\xff\x06\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x02\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5a\x58\x00\x00\x54\x53\x00\x00" "\x4f\x4e\x94\x29\x4a\x49\xff\xff\x45\x44\xff\xff\x41\x40\xff\xff" "\x3c\x3b\xff\xff\x38\x37\xff\xff\x34\x33\xff\xff\x30\x2f\xff\xff" "\x2c\x2b\xff\xff\x28\x27\xff\xff\x25\x24\xff\xff\x21\x20\xff\xff" "\x1e\x1d\xff\xff\x1b\x1a\xff\xff\x18\x17\xff\xff\x16\x15\xff\xff" "\x13\x12\xff\xff\x11\x10\xff\xff\x0e\x0e\xff\xff\x0c\x0c\xff\xff" "\x0a\x0a\xff\xff\x09\x08\xff\xff\x07\x07\xff\xff\x06\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x02\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5a\x58\x00\x00\x54\x53\x00\x00" "\x4f\x4e\x9b\x30\x4a\x49\xff\xff\x45\x44\xff\xff\x41\x40\xff\xff" "\x3c\x3b\xff\xff\x38\x37\xff\xff\x34\x33\xff\xff\x30\x2f\xff\xff" "\x2c\x2b\xff\xff\x28\x27\xff\xff\x25\x24\xff\xff\x21\x20\xff\xff" "\x1e\x1d\xff\xff\x1b\x1a\xff\xff\x18\x17\xff\xff\x15\x15\xff\xff" "\x13\x12\xff\xff\x10\x10\xff\xff\x0e\x0e\xff\xff\x0c\x0c\xff\xff" "\x0a\x0a\xff\xff\x09\x08\xff\xff\x07\x07\xff\xff\x06\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x59\x58\x00\x00\x54\x53\x00\x00" "\x4f\x4e\x9f\x38\x4a\x49\xff\xff\x45\x44\xff\xff\x41\x3f\xff\xff" "\x3c\x3b\xff\xff\x38\x37\xff\xff\x34\x33\xff\xff\x30\x2f\xff\xff" "\x2c\x2b\xff\xff\x28\x27\xff\xff\x25\x24\xff\xff\x21\x20\xff\xff" "\x1e\x1d\xff\xff\x1b\x1a\xff\xff\x18\x17\xff\xff\x15\x15\xff\xff" "\x13\x12\xff\xff\x10\x10\xff\xff\x0e\x0e\xff\xff\x0c\x0c\xff\xff" "\x0a\x0a\xff\xff\x08\x08\xff\xff\x07\x07\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x59\x58\x00\x00\x54\x53\x00\x00" "\x4f\x4e\xa3\x40\x4a\x49\xff\xff\x45\x44\xff\xff\x40\x3f\xff\xff" "\x3c\x3b\xff\xff\x38\x37\xff\xff\x33\x33\xff\xff\x2f\x2f\xff\xff" "\x2c\x2b\xff\xff\x28\x27\xff\xff\x24\x24\xff\xff\x21\x20\xff\xff" "\x1e\x1d\xff\xff\x1b\x1a\xff\xff\x18\x17\xff\xff\x15\x15\xff\xff" "\x13\x12\xff\xff\x10\x10\xff\xff\x0e\x0e\xff\xff\x0c\x0c\xff\xff" "\x0a\x0a\xff\xff\x08\x08\xff\xff\x07\x07\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x59\x58\x00\x00\x54\x53\x00\x00" "\x4f\x4e\xa7\x47\x4a\x49\xff\xff\x45\x44\xff\xff\x40\x3f\xff\xff" "\x3c\x3b\xff\xff\x37\x37\xff\xff\x33\x32\xff\xff\x2f\x2e\xff\xff" "\x2b\x2b\xff\xff\x28\x27\xff\xff\x24\x24\xff\xff\x21\x20\xff\xff" "\x1e\x1d\xff\xff\x1b\x1a\xff\xff\x18\x17\xff\xff\x15\x15\xff\xff" "\x13\x12\xff\xff\x10\x10\xff\xff\x0e\x0e\xff\xff\x0c\x0c\xff\xff" "\x0a\x0a\xff\xff\x08\x08\xff\xff\x07\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x59\x58\x00\x00\x54\x53\x00\x00" "\x4f\x4e\xac\x4f\x4a\x49\xff\xff\x45\x44\xff\xff\x40\x3f\xff\xff" "\x3c\x3b\xff\xff\x37\x37\xff\xff\x33\x32\xff\xff\x2f\x2e\xff\xff" "\x2b\x2b\xff\xff\x28\x27\xff\xff\x24\x24\xff\xff\x21\x20\xff\xff" "\x1e\x1d\xff\xff\x1b\x1a\xff\xff\x18\x17\xff\xff\x15\x15\xff\xff" "\x13\x12\xff\xff\x10\x10\xff\xff\x0e\x0e\xff\xff\x0c\x0c\xff\xff" "\x0a\x0a\xff\xff\x08\x08\xff\xff\x07\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x59\x58\x00\x00\x54\x53\x00\x00" "\x4e\x4d\xb0\x57\x49\x49\xff\xff\x45\x44\xff\xff\x40\x3f\xff\xff" "\x3c\x3b\xff\xff\x37\x36\xff\xff\x33\x32\xff\xff\x2f\x2e\xff\xff" "\x2b\x2b\xff\xff\x28\x27\xff\xff\x24\x23\xff\xff\x21\x20\xff\xff" "\x1e\x1d\xff\xff\x1b\x1a\xff\xff\x18\x17\xff\xff\x15\x15\xff\xff" "\x13\x12\xff\xff\x10\x10\xff\xff\x0e\x0e\xff\xff\x0c\x0c\xff\xff" "\x0a\x0a\xff\xff\x08\x08\xff\xff\x07\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x59\x58\x00\x00\x53\x52\x00\x00" "\x4e\x4d\xb4\x5f\x49\x48\xff\xff\x44\x44\xff\xff\x40\x3f\xff\xff" "\x3b\x3b\xff\xff\x37\x36\xff\xff\x33\x32\xff\xff\x2f\x2e\xff\xff" "\x2b\x2b\xff\xff\x27\x27\xff\xff\x24\x23\xff\xff\x21\x20\xff\xff" "\x1d\x1d\xff\xff\x1a\x1a\xff\xff\x18\x17\xff\xff\x15\x15\xff\xff" "\x12\x12\xff\xff\x10\x10\xff\xff\x0e\x0e\xff\xff\x0c\x0b\xff\xff" "\x0a\x0a\xff\xff\x08\x08\xff\xff\x07\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x58\x58\x00\x00\x53\x52\x00\x00" "\x4e\x4d\xb8\x66\x49\x48\xff\xff\x44\x44\xff\xff\x40\x3f\xff\xff" "\x3b\x3b\xff\xff\x37\x36\xff\xff\x33\x32\xff\xff\x2f\x2e\xff\xff" "\x2b\x2a\xff\xff\x27\x27\xff\xff\x24\x23\xff\xff\x21\x20\xff\xff" "\x1d\x1d\xff\xff\x1a\x1a\xff\xff\x18\x17\xff\xff\x15\x14\xff\xff" "\x12\x12\xff\xff\x10\x10\xff\xff\x0e\x0d\xff\xff\x0c\x0b\xff\xff" "\x0a\x0a\xff\xff\x08\x08\xff\xff\x07\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x58\x58\x00\x00\x53\x52\x00\x00" "\x4e\x4d\xbd\x6e\x49\x48\xff\xff\x44\x44\xff\xff\x40\x3f\xff\xff" "\x3b\x3a\xff\xff\x37\x36\xff\xff\x33\x32\xff\xff\x2f\x2e\xff\xff" "\x2b\x2a\xff\xff\x27\x27\xff\xff\x24\x23\xff\xff\x20\x20\xff\xff" "\x1d\x1d\xff\xff\x1a\x1a\xff\xff\x17\x17\xff\xff\x15\x14\xff\xff" "\x12\x12\xff\xff\x10\x10\xff\xff\x0e\x0d\xff\xff\x0c\x0b\xff\xff" "\x0a\x0a\xff\xff\x08\x08\xff\xff\x07\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x58\x57\x00\x00\x53\x52\x00\x00" "\x4e\x4d\xc1\x76\x49\x48\xff\xff\x44\x43\xff\xff\x40\x3f\xff\xff" "\x3b\x3a\xff\xff\x37\x36\xff\xff\x33\x32\xff\xff\x2f\x2e\xff\xff" "\x2b\x2a\xff\xff\x27\x27\xff\xff\x24\x23\xff\xff\x20\x20\xff\xff" "\x1d\x1d\xff\xff\x1a\x1a\xff\xff\x17\x17\xff\xff\x15\x14\xff\xff" "\x12\x12\xff\xff\x10\x10\xff\xff\x0e\x0d\xff\xff\x0c\x0b\xff\xff" "\x0a\x0a\xff\xff\x08\x08\xff\xff\x07\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x58\x57\x00\x00\x53\x52\x00\x00" "\x4e\x4d\xc5\x7d\x49\x48\xff\xff\x44\x43\xff\xff\x3f\x3f\xff\xff" "\x3b\x3a\xff\xff\x37\x36\xff\xff\x33\x32\xff\xff\x2f\x2e\xff\xff" "\x2b\x2a\xff\xff\x27\x27\xff\xff\x24\x23\xff\xff\x20\x20\xff\xff" "\x1d\x1d\xff\xff\x1a\x1a\xff\xff\x17\x17\xff\xff\x15\x14\xff\xff" "\x12\x12\xff\xff\x10\x10\xff\xff\x0e\x0d\xff\xff\x0c\x0b\xff\xff" "\x0a\x0a\xff\xff\x08\x08\xff\xff\x07\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x58\x57\x00\x00\x53\x52\x00\x00" "\x4e\x4d\xca\x85\x49\x48\xff\xff\x44\x43\xff\xff\x3f\x3f\xff\xff" "\x3b\x3a\xff\xff\x37\x36\xff\xff\x33\x32\xff\xff\x2f\x2e\xff\xff" "\x2b\x2a\xff\xff\x27\x27\xff\xff\x24\x23\xff\xff\x20\x20\xff\xff" "\x1d\x1d\xff\xff\x1a\x1a\xff\xff\x17\x17\xff\xff\x15\x14\xff\xff" "\x12\x12\xff\xff\x10\x0f\xff\xff\x0e\x0d\xff\xff\x0c\x0b\xff\xff" "\x0a\x09\xff\xff\x08\x08\xff\xff\x07\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x58\x57\x00\x00\x53\x52\x00\x00" "\x4e\x4d\xce\x8d\x49\x48\xff\xff\x44\x43\xff\xff\x3f\x3f\xff\xff" "\x3b\x3a\xff\xff\x37\x36\xff\xff\x32\x32\xff\xff\x2e\x2e\xff\xff" "\x2b\x2a\xff\xff\x27\x27\xff\xff\x24\x23\xff\xff\x20\x20\xff\xff" "\x1d\x1d\xff\xff\x1a\x1a\xff\xff\x17\x17\xff\xff\x15\x14\xff\xff" "\x12\x12\xff\xff\x10\x0f\xff\xff\x0e\x0d\xff\xff\x0c\x0b\xff\xff" "\x0a\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5d\x5d\x00\x00\x58\x57\x00\x00\x53\x52\x00\x00" "\x4e\x4d\xd2\x94\x49\x48\xff\xff\x44\x43\xff\xff\x3f\x3f\xff\xff" "\x3b\x3a\xff\xff\x37\x36\xff\xff\x32\x32\xff\xff\x2e\x2e\xff\xff" "\x2b\x2a\xff\xff\x27\x26\xff\xff\x24\x23\xff\xff\x20\x20\xff\xff" "\x1d\x1d\xff\xff\x1a\x1a\xff\xff\x17\x17\xff\xff\x15\x14\xff\xff" "\x12\x12\xff\xff\x10\x0f\xff\xff\x0e\x0d\xff\xff\x0c\x0b\xff\xff" "\x0a\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5d\x5d\x00\x00\x58\x57\x00\x00\x53\x52\x00\x00" "\x4d\x4d\xd6\x9b\x49\x48\xff\xff\x44\x43\xff\xff\x3f\x3e\xff\xff" "\x3b\x3a\xff\xff\x36\x36\xff\xff\x32\x32\xff\xff\x2e\x2e\xff\xff" "\x2b\x2a\xff\xff\x27\x26\xff\xff\x23\x23\xff\xff\x20\x20\xff\xff" "\x1d\x1d\xff\xff\x1a\x1a\xff\xff\x17\x17\xff\xff\x15\x14\xff\xff" "\x12\x12\xff\xff\x10\x0f\xff\xff\x0e\x0d\xff\xff\x0c\x0b\xff\xff" "\x0a\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5d\x5c\x00\x00\x58\x57\x00\x00\x52\x52\x00\x00" "\x4d\x4d\xdb\x9f\x48\x48\xff\xff\x44\x43\xff\xff\x3f\x3e\xff\xff" "\x3b\x3a\xff\xff\x36\x36\xff\xff\x32\x32\xff\xff\x2e\x2e\xff\xff" "\x2b\x2a\xff\xff\x27\x26\xff\xff\x23\x23\xff\xff\x20\x20\xff\xff" "\x1d\x1c\xff\xff\x1a\x1a\xff\xff\x17\x17\xff\xff\x15\x14\xff\xff" "\x12\x12\xff\xff\x10\x0f\xff\xff\x0e\x0d\xff\xff\x0b\x0b\xff\xff" "\x0a\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5d\x5c\x00\x00\x58\x57\x00\x00\x52\x52\x00\x00" "\x4d\x4d\xdf\xa3\x48\x48\xff\xff\x44\x43\xff\xff\x3f\x3e\xff\xff" "\x3b\x3a\xff\xff\x36\x36\xff\xff\x32\x32\xff\xff\x2e\x2e\xff\xff" "\x2a\x2a\xff\xff\x27\x26\xff\xff\x23\x23\xff\xff\x20\x20\xff\xff" "\x1d\x1c\xff\xff\x1a\x19\xff\xff\x17\x17\xff\xff\x14\x14\xff\xff" "\x12\x12\xff\xff\x10\x0f\xff\xff\x0d\x0d\xff\xff\x0b\x0b\xff\xff" "\x0a\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5d\x5c\x00\x00\x58\x57\x00\x00\x52\x52\x00\x00" "\x4d\x4c\xe3\xa7\x48\x48\xff\xff\x44\x43\xff\xff\x3f\x3e\xff\xff" "\x3a\x3a\xff\xff\x36\x36\xff\xff\x32\x32\xff\xff\x2e\x2e\xff\xff" "\x2a\x2a\xff\xff\x27\x26\xff\xff\x23\x23\xff\xff\x20\x20\xff\xff" "\x1d\x1c\xff\xff\x1a\x19\xff\xff\x17\x17\xff\xff\x14\x14\xff\xff" "\x12\x12\xff\xff\x10\x0f\xff\xff\x0d\x0d\xff\xff\x0b\x0b\xff\xff" "\x0a\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5d\x5c\x00\x00\x57\x57\x00\x00\x52\x51\x00\x00" "\x4d\x4c\xe7\xac\x48\x48\xff\xff\x43\x43\xff\xff\x3f\x3e\xff\xff" "\x3a\x3a\xff\xff\x36\x36\xff\xff\x32\x31\xff\xff\x2e\x2e\xff\xff" "\x2a\x2a\xff\xff\x27\x26\xff\xff\x23\x23\xff\xff\x20\x1f\xff\xff" "\x1d\x1c\xff\xff\x1a\x19\xff\xff\x17\x17\xff\xff\x14\x14\xff\xff" "\x12\x12\xff\xff\x10\x0f\xff\xff\x0d\x0d\xff\xff\x0b\x0b\xff\xff" "\x0a\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5d\x5c\x00\x00\x57\x57\x00\x00\x52\x51\x00\x00" "\x4d\x4c\xea\xb0\x48\x47\xff\xff\x43\x43\xff\xff\x3f\x3e\xff\xff" "\x3a\x3a\xff\xff\x36\x36\xff\xff\x32\x31\xff\xff\x2e\x2e\xff\xff" "\x2a\x2a\xff\xff\x27\x26\xff\xff\x23\x23\xff\xff\x20\x1f\xff\xff" "\x1d\x1c\xff\xff\x1a\x19\xff\xff\x17\x17\xff\xff\x14\x14\xff\xff" "\x12\x12\xff\xff\x10\x0f\xff\xff\x0d\x0d\xff\xff\x0b\x0b\xff\xff" "\x0a\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5d\x5c\x00\x00\x57\x57\x00\x00\x52\x51\x00\x00" "\x4d\x4c\xeb\xb4\x48\x47\xff\xff\x43\x43\xff\xff\x3f\x3e\xff\xff" "\x3a\x3a\xff\xff\x36\x36\xff\xff\x32\x31\xff\xff\x2e\x2e\xff\xff" "\x2a\x2a\xff\xff\x27\x26\xff\xff\x23\x23\xff\xff\x20\x1f\xff\xff" "\x1d\x1c\xff\xff\x1a\x19\xff\xff\x17\x17\xff\xff\x14\x14\xff\xff" "\x12\x12\xff\xff\x0f\x0f\xff\xff\x0d\x0d\xff\xff\x0b\x0b\xff\xff" "\x09\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5d\x5c\x00\x00\x57\x57\x00\x00\x52\x51\x00\x00" "\x4d\x4c\xec\xb8\x48\x47\xff\xff\x43\x43\xff\xff\x3f\x3e\xff\xff" "\x3a\x3a\xff\xff\x36\x36\xff\xff\x32\x31\xff\xff\x2e\x2e\xff\xff" "\x2a\x2a\xff\xff\x27\x26\xff\xff\x23\x23\xff\xff\x20\x1f\xff\xff" "\x1d\x1c\xff\xff\x1a\x19\xff\xff\x17\x17\xff\xff\x14\x14\xff\xff" "\x12\x12\xff\xff\x0f\x0f\xff\xff\x0d\x0d\xff\xff\x0b\x0b\xff\xff" "\x09\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5d\x5c\x00\x00\x57\x57\x00\x00\x52\x51\x00\x00" "\x4d\x4c\xed\xbd\x48\x47\xff\xff\x43\x43\xff\xff\x3f\x3e\xff\xff" "\x3a\x3a\xff\xff\x36\x35\xff\xff\x32\x31\xff\xff\x2e\x2d\xff\xff" "\x2a\x2a\xff\xff\x26\x26\xff\xff\x23\x23\xff\xff\x20\x1f\xff\xff" "\x1d\x1c\xff\xff\x1a\x19\xff\xff\x17\x17\xff\xff\x14\x14\xff\xff" "\x12\x11\xff\xff\x0f\x0f\xff\xff\x0d\x0d\xff\xff\x0b\x0b\xff\xff" "\x09\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5d\x5c\x00\x00\x57\x57\x00\x00\x52\x51\x00\x00" "\x4d\x4c\xef\xc1\x48\x47\xff\xff\x43\x43\xff\xff\x3e\x3e\xff\xff" "\x3a\x3a\xff\xff\x36\x35\xff\xff\x32\x31\xff\xff\x2e\x2d\xff\xff" "\x2a\x2a\xff\xff\x26\x26\xff\xff\x23\x23\xff\xff\x20\x1f\xff\xff" "\x1d\x1c\xff\xff\x1a\x19\xff\xff\x17\x17\xff\xff\x14\x14\xff\xff" "\x12\x11\xff\xff\x0f\x0f\xff\xff\x0d\x0d\xff\xff\x0b\x0b\xff\xff" "\x09\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5c\x5c\x00\x00\x57\x57\x00\x00\x52\x51\x00\x00" "\x4d\x4c\xf0\xc5\x48\x47\xff\xff\x43\x43\xff\xff\x3e\x3e\xff\xff" "\x3a\x3a\xff\xff\x36\x35\xff\xff\x32\x31\xff\xff\x2e\x2d\xff\xff" "\x2a\x2a\xff\xff\x26\x26\xff\xff\x23\x23\xff\xff\x20\x1f\xff\xff" "\x1c\x1c\xff\xff\x1a\x19\xff\xff\x17\x17\xff\xff\x14\x14\xff\xff" "\x12\x11\xff\xff\x0f\x0f\xff\xff\x0d\x0d\xff\xff\x0b\x0b\xff\xff" "\x09\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5c\x5c\x00\x00\x57\x57\x00\x00\x52\x51\x00\x00" "\x4d\x4c\xf1\xca\x48\x47\xff\xff\x43\x43\xff\xff\x3e\x3e\xff\xff" "\x3a\x3a\xff\xff\x36\x35\xff\xff\x32\x31\xff\xff\x2e\x2d\xff\xff" "\x2a\x2a\xff\xff\x26\x26\xff\xff\x23\x23\xff\xff\x20\x1f\xff\xff" "\x1c\x1c\xff\xff\x19\x19\xff\xff\x17\x17\xff\xff\x14\x14\xff\xff" "\x12\x11\xff\xff\x0f\x0f\xff\xff\x0d\x0d\xff\xff\x0b\x0b\xff\xff" "\x09\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5c\x5c\x00\x00\x57\x56\x00\x00\x52\x51\x00\x00" "\x4c\x4c\xf2\xce\x48\x47\xff\xff\x43\x43\xff\xff\x3e\x3e\xff\xff" "\x3a\x3a\xff\xff\x36\x35\xff\xff\x32\x31\xff\xff\x2e\x2d\xff\xff" "\x2a\x2a\xff\xff\x26\x26\xff\xff\x23\x23\xff\xff\x20\x1f\xff\xff" "\x1c\x1c\xff\xff\x19\x19\xff\xff\x17\x17\xff\xff\x14\x14\xff\xff" "\x12\x11\xff\xff\x0f\x0f\xff\xff\x0d\x0d\xff\xff\x0b\x0b\xff\xff" "\x09\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5c\x5c\x00\x00\x57\x56\x00\x00\x51\x51\x00\x00" "\x4c\x4c\xf3\xd2\x48\x47\xff\xff\x43\x43\xff\xff\x3e\x3e\xff\xff" "\x3a\x3a\xff\xff\x36\x35\xff\xff\x31\x31\xff\xff\x2e\x2d\xff\xff" "\x2a\x2a\xff\xff\x26\x26\xff\xff\x23\x23\xff\xff\x1f\x1f\xff\xff" "\x1c\x1c\xff\xff\x19\x19\xff\xff\x17\x17\xff\xff\x14\x14\xff\xff" "\x12\x11\xff\xff\x0f\x0f\xff\xff\x0d\x0d\xff\xff\x0b\x0b\xff\xff" "\x09\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5c\x5c\x00\x00\x57\x56\x00\x00\x51\x51\x00\x00" "\x4c\x4c\xf5\xd6\x47\x47\xff\xff\x43\x42\xff\xff\x3e\x3e\xff\xff" "\x3a\x39\xff\xff\x36\x35\xff\xff\x31\x31\xff\xff\x2e\x2d\xff\xff" "\x2a\x29\xff\xff\x26\x26\xff\xff\x23\x22\xff\xff\x1f\x1f\xff\xff" "\x1c\x1c\xff\xff\x19\x19\xff\xff\x17\x16\xff\xff\x14\x14\xff\xff" "\x12\x11\xff\xff\x0f\x0f\xff\xff\x0d\x0d\xff\xff\x0b\x0b\xff\xff" "\x09\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5c\x5c\x00\x00\x57\x56\x00\x00\x51\x51\x00\x00" "\x4c\x4c\xf6\xdb\x47\x47\xff\xff\x43\x42\xff\xff\x3e\x3e\xff\xff" "\x3a\x39\xff\xff\x36\x35\xff\xff\x31\x31\xff\xff\x2e\x2d\xff\xff" "\x2a\x29\xff\xff\x26\x26\xff\xff\x23\x22\xff\xff\x1f\x1f\xff\xff" "\x1c\x1c\xff\xff\x19\x19\xff\xff\x17\x16\xff\xff\x14\x14\xff\xff" "\x12\x11\xff\xff\x0f\x0f\xff\xff\x0d\x0d\xff\xff\x0b\x0b\xff\xff" "\x09\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5c\x5c\x00\x00\x57\x56\x00\x00\x51\x51\x00\x00" "\x4c\x4c\xf7\xdf\x47\x47\xff\xff\x43\x43\xff\xff\x3e\x3e\xff\xff" "\x3a\x3a\xff\xff\x36\x35\xff\xff\x31\x31\xff\xff\x2e\x2d\xff\xff" "\x2a\x2a\xff\xff\x26\x26\xff\xff\x23\x23\xff\xff\x1f\x1f\xff\xff" "\x1c\x1c\xff\xff\x19\x19\xff\xff\x17\x16\xff\xff\x14\x14\xff\xff" "\x12\x11\xff\xff\x0f\x0f\xff\xff\x0d\x0d\xff\xff\x0b\x0b\xff\xff" "\x09\x09\xff\xff\x08\x08\xff\xff\x06\x06\xff\xff\x05\x05\xff\xff" "\x04\x04\xff\xff\x03\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" // Mipmap level 1. "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x01\x00\x5e\x5d\x0d\x00\x5e\x5c\x20\x00" "\x5e\x5c\x2b\x00\x5e\x5b\x35\x00\x5e\x5b\x3f\x00\x5e\x5b\x49\x00" "\x5e\x5a\x53\x00\x5e\x5a\x5d\x00\x5e\x59\x67\x00\x5e\x59\x71\x00" "\x5e\x58\x7b\x00\x5e\x58\x85\x00\x5e\x58\x8f\x00\x5e\x57\x99\x00" "\x5e\x57\xa3\x00\x5e\x56\xad\x00\x5e\x56\xb7\x00\x5e\x56\xc1\x00" "\x5e\x56\xcb\x00\x5e\x55\xcf\x00\x5e\x55\xd2\x00\x5e\x55\xd5\x00" "\x5e\x55\xd7\x00\x5e\x55\xda\x00\x5e\x55\xdd\x00\x5e\x55\xdf\x00" "\x5e\x55\xe2\x00\x5e\x55\xe5\x00\x5e\x54\xe7\x00\x5e\x54\xea\x00" "\x5e\x54\xed\x00\x5e\x54\xf0\x00\x5e\x54\xf2\x00\x5e\x54\xf5\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x01\x00\x5e\x5c\x0e\x00\x5e\x5b\x23\x00" "\x5e\x5b\x38\x00\x5e\x5a\x4e\x00\x5e\x59\x63\x00\x5e\x58\x78\x00" "\x5e\x57\x8d\x00\x5e\x56\xa3\x00\x5e\x55\xb8\x00\x5e\x54\xcd\x00" "\x5e\x54\xe2\x00\x5e\x53\xf8\x00\x5e\x52\xff\x00\x5e\x52\xff\x00" "\x5e\x51\xff\x00\x5e\x51\xff\x00\x5e\x50\xff\x00\x5e\x50\xff\x00" "\x5e\x50\xff\x00\x5e\x4f\xff\x00\x5e\x4f\xff\x00\x5e\x4e\xff\x00" "\x5e\x4e\xff\x00\x5e\x4e\xff\x00\x5e\x4d\xff\x00\x5e\x4d\xff\x00" "\x5e\x4d\xff\x00\x5e\x4c\xff\x00\x5e\x4c\xff\x00\x5e\x4b\xff\x00" "\x5e\x4b\xff\x00\x5e\x4b\xff\x00\x5e\x4b\xff\x00\x5e\x4b\xff\x00" "\x5e\x4b\xff\x00\x5e\x4b\xff\x00\x5e\x4b\xff\x00\x5e\x4b\xff\x00" "\x5e\x4b\xff\x00\x5e\x4a\xff\x00\x5e\x4a\xff\x00\x5e\x4a\xff\x00" "\x5e\x4a\xff\x00\x5e\x4a\xff\x00\x5e\x4a\xff\x00\x5e\x4a\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x04\x00\x5e\x5b\x21\x00\x5e\x59\x42\x00" "\x5e\x58\x63\x00\x5e\x57\x84\x00\x5e\x55\xa5\x00\x5e\x54\xc6\x00" "\x5e\x53\xe3\x00\x5e\x53\xf8\x00\x5e\x52\xff\x00\x5e\x51\xff\x00" "\x5e\x50\xff\x00\x5e\x4f\xff\x00\x5e\x4e\xff\x00\x5e\x4e\xff\x00" "\x5e\x4d\xff\x00\x5e\x4c\xff\x00\x5e\x4b\xff\x00\x5e\x4a\xff\x00" "\x5e\x49\xff\x00\x5e\x49\xff\x00\x5e\x48\xff\x00\x5e\x48\xff\x00" "\x5e\x47\xff\x00\x5e\x47\xff\x00\x5e\x47\xff\x00\x5e\x46\xff\x00" "\x5e\x46\xff\x00\x5e\x45\xff\x00\x5e\x45\xff\x00\x5e\x45\xff\x00" "\x5e\x44\xff\x00\x5e\x44\xff\x00\x5e\x44\xff\x00\x5e\x43\xff\x00" "\x5e\x43\xff\x00\x5e\x43\xff\x00\x5e\x42\xff\x00\x5e\x42\xff\x00" "\x5e\x42\xff\x00\x5e\x42\xff\x00\x5e\x42\xff\x00\x5e\x41\xff\x00" "\x5e\x41\xff\x00\x5e\x41\xff\x00\x5e\x41\xff\x00\x5e\x41\xff\x00" "\x5e\x41\xff\x00\x5e\x41\xff\x00\x5e\x41\xff\x00\x5e\x41\xff\x00" "\x5e\x41\xff\x00\x5e\x41\xff\x00\x5e\x40\xff\x00\x5e\x40\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x5c\x07\x00" "\x5e\x5a\x2d\x00\x5e\x58\x58\x00\x5e\x56\x82\x00\x5e\x54\xad\x00" "\x5e\x53\xd8\x00\x5e\x52\xfc\x00\x5e\x50\xff\x00\x5e\x4f\xff\x00" "\x5e\x4e\xff\x00\x5e\x4c\xff\x00\x5e\x4b\xff\x00\x5e\x4a\xff\x00" "\x5e\x49\xff\x00\x5e\x49\xff\x00\x5e\x48\xff\x00\x5e\x47\xff\x00" "\x5e\x46\xff\x00\x5e\x45\xff\x00\x5e\x45\xff\x00\x5e\x44\xff\x00" "\x5e\x43\xff\x00\x5e\x42\xff\x00\x5e\x42\xff\x00\x5e\x41\xff\x00" "\x5e\x40\xff\x00\x5e\x3f\xff\x00\x5e\x3f\xff\x00\x5e\x3e\xff\x00" "\x5e\x3e\xff\x00\x5e\x3e\xff\x00\x5e\x3d\xff\x00\x5e\x3d\xff\x00" "\x5e\x3d\xff\x00\x5e\x3c\xff\x00\x5e\x3c\xff\x00\x5e\x3c\xff\x00" "\x5e\x3b\xff\x00\x5e\x3b\xff\x00\x5e\x3b\xff\x00\x5e\x3a\xff\x00" "\x5e\x3a\xff\x00\x5e\x3a\xff\x00\x5e\x39\xff\x00\x5e\x39\xff\x00" "\x5e\x39\xff\x00\x5e\x39\xff\x00\x5e\x39\xff\x00\x5e\x39\xff\x00" "\x5e\x39\xff\x00\x5e\x38\xff\x00\x5e\x38\xff\x00\x5e\x38\xff\x00" "\x5e\x38\xff\x00\x5e\x38\xff\x00\x5e\x38\xff\x00\x5e\x38\xff\x00" "\x5e\x38\xff\x00\x5e\x38\xff\x00\x5e\x38\xff\x00\x5e\x38\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x5b\x05\x00\x5e\x59\x32\x00" "\x5e\x57\x68\x00\x5e\x54\x9e\x00\x5e\x53\xd4\x00\x5e\x51\xfc\x00" "\x5e\x4f\xff\x00\x5e\x4e\xff\x00\x5e\x4c\xff\x00\x5e\x4a\xff\x00" "\x5e\x49\xff\x00\x5e\x48\xff\x00\x5e\x46\xff\x00\x5e\x45\xff\x00" "\x5e\x44\xff\x00\x5e\x43\xff\x00\x5e\x42\xff\x00\x5e\x41\xff\x00" "\x5e\x40\xff\x00\x5e\x3f\xff\x00\x5e\x3e\xff\x00\x5e\x3e\xff\x00" "\x5e\x3d\xff\x00\x5e\x3c\xff\x00\x5e\x3b\xff\x00\x5e\x3b\xff\x00" "\x5e\x3a\xff\x00\x5e\x39\xff\x00\x5e\x39\xff\x00\x5e\x38\xff\x00" "\x5e\x37\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00" "\x5e\x35\xff\x00\x5e\x35\xff\x00\x5e\x35\xff\x00\x5e\x34\xff\x00" "\x5e\x34\xff\x00\x5e\x34\xff\x00\x5e\x33\xff\x00\x5e\x33\xff\x00" "\x5e\x33\xff\x00\x5d\x33\xff\x00\x5d\x32\xff\x00\x5d\x32\xff\x00" "\x5c\x32\xff\x00\x5c\x31\xff\x00\x5b\x31\xff\x00\x5b\x31\xff\x00" "\x5b\x31\xff\x00\x5b\x31\xff\x00\x5b\x30\xff\x00\x5b\x30\xff\x00" "\x5a\x30\xff\x00\x5a\x30\xff\x00\x5a\x30\xff\x00\x5a\x30\xff\x00" "\x5a\x30\xff\x00\x5a\x30\xff\x00\x5a\x30\xff\x00\x5a\x30\xff\x00" "\x59\x30\xff\x00\x59\x30\xff\x00\x59\x2f\xff\x00\x59\x2f\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x5a\x0a\x00\x5e\x57\x47\x00" "\x5e\x55\x8b\x00\x5e\x53\xc5\x00\x5e\x50\xf7\x00\x5e\x4f\xff\x00" "\x5e\x4c\xff\x00\x5e\x4a\xff\x00\x5e\x49\xff\x00\x5e\x47\xff\x00" "\x5e\x45\xff\x00\x5e\x44\xff\x00\x5e\x42\xff\x00\x5e\x41\xff\x00" "\x5e\x3f\xff\x00\x5e\x3e\xff\x00\x5e\x3d\xff\x00\x5e\x3c\xff\x00" "\x5e\x3b\xff\x00\x5e\x3a\xff\x00\x5e\x39\xff\x00\x5e\x38\xff\x00" "\x5e\x37\xff\x00\x5e\x36\xff\x00\x5e\x36\xff\x00\x5e\x35\xff\x00" "\x5e\x34\xff\x00\x5e\x34\xff\x00\x5e\x33\xff\x00\x5d\x32\xff\x00" "\x5c\x32\xff\x00\x5b\x31\xff\x00\x5b\x30\xff\x00\x5a\x30\xff\x00" "\x59\x2f\xff\x00\x58\x2e\xff\x00\x57\x2e\xff\x00\x57\x2e\xff\x00" "\x56\x2d\xff\x00\x56\x2d\xff\x00\x56\x2d\xff\x00\x55\x2c\xff\x00" "\x55\x2c\xff\x00\x54\x2c\xff\x00\x54\x2c\xff\x00\x54\x2b\xff\x00" "\x53\x2b\xff\x00\x53\x2b\xff\x00\x52\x2a\xff\x00\x52\x2a\xff\x00" "\x52\x2a\xff\x00\x51\x2a\xff\x00\x51\x29\xff\x00\x50\x29\xff\x00" "\x50\x29\xff\x00\x50\x29\xff\x00\x50\x29\xff\x00\x50\x29\xff\x00" "\x50\x29\xff\x00\x50\x29\xff\x00\x50\x29\xff\x00\x50\x28\xff\x00" "\x4f\x28\xff\x00\x4f\x28\xff\x00\x4f\x28\xff\x00\x4f\x28\xff\x00" "\x4f\x28\xff\x00\x4f\x28\xff\x00\x4f\x28\xff\x00\x4f\x28\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x02\x00\x5e\x58\x36\x00" "\x5e\x55\x7a\x00\x5e\x52\xbf\x00\x5e\x4f\xf9\x00\x5e\x4d\xff\x00" "\x5e\x4b\xff\x00\x5e\x49\xff\x00\x5e\x47\xff\x00\x5e\x45\xff\x00" "\x5e\x43\xff\x00\x5e\x41\xff\x00\x5e\x3f\xff\x00\x5e\x3e\xff\x00" "\x5e\x3c\xff\x00\x5e\x3b\xff\x00\x5e\x3a\xff\x00\x5e\x38\xff\x00" "\x5e\x37\xff\x00\x5e\x36\xff\x00\x5e\x35\xff\x00\x5e\x34\xff\x00" "\x5d\x33\xff\x00\x5c\x32\xff\x00\x5b\x31\xff\x00\x5a\x30\xff\x00" "\x59\x2f\xff\x00\x58\x2e\xff\x00\x57\x2e\xff\x00\x56\x2d\xff\x00" "\x55\x2c\xff\x00\x54\x2c\xff\x00\x53\x2b\xff\x00\x53\x2b\xff\x00" "\x52\x2a\xff\x00\x51\x29\xff\x00\x50\x29\xff\x00\x4f\x28\xff\x00" "\x4e\x28\xff\x00\x4e\x27\xff\x00\x4d\x27\xff\x00\x4d\x26\xff\x00" "\x4c\x26\xff\x00\x4c\x26\xff\x00\x4b\x25\xff\x00\x4b\x25\xff\x00" "\x4b\x25\xff\x00\x4a\x25\xff\x00\x4a\x24\xff\x00\x4a\x24\xff\x00" "\x49\x24\xff\x00\x49\x24\xff\x00\x48\x23\xff\x00\x48\x23\xff\x00" "\x48\x23\xff\x00\x47\x23\xff\x00\x47\x22\xff\x00\x47\x22\xff\x00" "\x46\x22\xff\x00\x46\x22\xff\x00\x46\x22\xff\x00\x46\x22\xff\x00" "\x46\x22\xff\x00\x46\x22\xff\x00\x46\x22\xff\x00\x46\x22\xff\x00" "\x46\x21\xff\x00\x46\x21\xff\x00\x45\x21\xff\x00\x45\x21\xff\x00" "\x45\x21\xff\x00\x45\x21\xff\x00\x45\x21\xff\x00\x45\x21\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x03\x00" "\x5e\x56\x3e\x00\x5e\x53\x93\x00\x5e\x50\xe6\x00\x5e\x4d\xff\x00" "\x5e\x4b\xff\x00\x5e\x48\xff\x00\x5e\x46\xff\x00\x5e\x43\xff\x00" "\x5e\x42\xff\x00\x5e\x40\xff\x00\x5e\x3e\xff\x00\x5e\x3c\xff\x00" "\x5e\x3a\xff\x00\x5e\x39\xff\x00\x5e\x37\xff\x00\x5e\x35\xff\x00" "\x5e\x34\xff\x00\x5d\x33\xff\x00\x5c\x32\xff\x00\x5a\x30\xff\x00" "\x58\x2f\xff\x00\x57\x2e\xff\x00\x55\x2d\xff\x00\x54\x2c\xff\x00" "\x53\x2b\xff\x00\x51\x2a\xff\x00\x50\x29\xff\x00\x4f\x28\xff\x00" "\x4e\x28\xff\x00\x4e\x27\xff\x00\x4d\x26\xff\x00\x4c\x26\xff\x00" "\x4b\x25\xff\x00\x4a\x25\xff\x00\x49\x24\xff\x00\x49\x24\xff\x00" "\x48\x23\xff\x00\x47\x22\xff\x00\x46\x22\xff\x00\x45\x21\xff\x00" "\x45\x21\xff\x00\x44\x20\xff\x01\x43\x20\xff\x0d\x43\x20\xff\x20" "\x43\x1f\xff\x2b\x42\x1f\xff\x35\x42\x1f\xff\x3f\x42\x1f\xff\x49" "\x41\x1e\xff\x53\x41\x1e\xff\x5d\x40\x1e\xff\x67\x40\x1e\xff\x71" "\x40\x1d\xff\x7b\x3f\x1d\xff\x85\x3f\x1d\xff\x8f\x3f\x1d\xff\x99" "\x3e\x1c\xff\xa3\x3e\x1c\xff\xad\x3e\x1c\xff\xb7\x3d\x1c\xff\xc1" "\x3d\x1c\xff\xcb\x3d\x1c\xff\xcf\x3d\x1c\xff\xd2\x3d\x1c\xff\xd5" "\x3d\x1b\xff\xd7\x3d\x1b\xff\xda\x3d\x1b\xff\xdd\x3d\x1b\xff\xdf" "\x3c\x1b\xff\xe2\x3c\x1b\xff\xe5\x3c\x1b\xff\xe7\x3c\x1b\xff\xea" "\x3c\x1b\xff\xed\x3c\x1b\xff\xf0\x3c\x1b\xff\xf2\x3c\x1b\xff\xf5" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5a\x01\x00\x5e\x56\x38\x00\x5e\x53\x95\x00\x5e\x4f\xe7\x00" "\x5e\x4c\xff\x00\x5e\x49\xff\x00\x5e\x47\xff\x00\x5e\x44\xff\x00" "\x5e\x42\xff\x00\x5e\x40\xff\x00\x5e\x3d\xff\x00\x5e\x3b\xff\x00" "\x5e\x39\xff\x00\x5e\x37\xff\x00\x5e\x36\xff\x00\x5e\x34\xff\x00" "\x5c\x32\xff\x00\x5a\x31\xff\x00\x58\x2f\xff\x00\x56\x2e\xff\x00" "\x54\x2c\xff\x00\x53\x2b\xff\x00\x51\x2a\xff\x00\x4f\x29\xff\x00" "\x4e\x28\xff\x00\x4d\x27\xff\x00\x4b\x26\xff\x00\x4a\x25\xff\x00" "\x49\x24\xff\x00\x47\x23\xff\x00\x46\x22\xff\x00\x45\x21\xff\x00" "\x45\x21\xff\x00\x44\x20\xff\x01\x43\x20\xff\x0e\x42\x1f\xff\x23" "\x42\x1f\xff\x38\x41\x1e\xff\x4e\x40\x1e\xff\x63\x3f\x1d\xff\x78" "\x3e\x1d\xff\x8d\x3e\x1c\xff\xa3\x3d\x1c\xff\xb8\x3c\x1b\xff\xcd" "\x3b\x1b\xff\xe2\x3b\x1a\xff\xf8\x3a\x1a\xff\xff\x3a\x1a\xff\xff" "\x3a\x19\xff\xff\x39\x19\xff\xff\x39\x19\xff\xff\x39\x19\xff\xff" "\x38\x18\xff\xff\x38\x18\xff\xff\x38\x18\xff\xff\x37\x18\xff\xff" "\x37\x18\xff\xff\x37\x17\xff\xff\x36\x17\xff\xff\x36\x17\xff\xff" "\x36\x17\xff\xff\x35\x16\xff\xff\x35\x16\xff\xff\x35\x16\xff\xff" "\x35\x16\xff\xff\x35\x16\xff\xff\x34\x16\xff\xff\x34\x16\xff\xff" "\x34\x16\xff\xff\x34\x16\xff\xff\x34\x16\xff\xff\x34\x16\xff\xff" "\x34\x16\xff\xff\x34\x16\xff\xff\x34\x15\xff\xff\x34\x15\xff\xff" "\x34\x15\xff\xff\x34\x15\xff\xff\x33\x15\xff\xff\x33\x15\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x58\x0c\x00\x5e\x53\x67\x00" "\x5e\x4f\xcf\x00\x5e\x4c\xff\x00\x5e\x49\xff\x00\x5e\x47\xff\x00" "\x5e\x43\xff\x00\x5e\x41\xff\x00\x5e\x3e\xff\x00\x5e\x3c\xff\x00" "\x5e\x39\xff\x00\x5e\x37\xff\x00\x5e\x35\xff\x00\x5d\x33\xff\x00" "\x5a\x31\xff\x00\x58\x2f\xff\x00\x56\x2e\xff\x00\x53\x2c\xff\x00" "\x51\x2b\xff\x00\x4f\x29\xff\x00\x4e\x28\xff\x00\x4c\x26\xff\x00" "\x4a\x25\xff\x00\x49\x24\xff\x00\x47\x23\xff\x00\x45\x22\xff\x00" "\x44\x21\xff\x00\x43\x20\xff\x04\x42\x1f\xff\x21\x41\x1e\xff\x42" "\x3f\x1d\xff\x63\x3e\x1d\xff\x84\x3d\x1c\xff\xa5\x3c\x1b\xff\xc6" "\x3b\x1b\xff\xe3\x3b\x1a\xff\xf8\x3a\x1a\xff\xff\x39\x19\xff\xff" "\x39\x19\xff\xff\x38\x18\xff\xff\x37\x18\xff\xff\x36\x17\xff\xff" "\x36\x17\xff\xff\x35\x16\xff\xff\x34\x16\xff\xff\x34\x15\xff\xff" "\x33\x15\xff\xff\x32\x15\xff\xff\x32\x14\xff\xff\x32\x14\xff\xff" "\x31\x14\xff\xff\x31\x14\xff\xff\x31\x14\xff\xff\x30\x13\xff\xff" "\x30\x13\xff\xff\x30\x13\xff\xff\x2f\x13\xff\xff\x2f\x13\xff\xff" "\x2f\x12\xff\xff\x2f\x12\xff\xff\x2e\x12\xff\xff\x2e\x12\xff\xff" "\x2e\x12\xff\xff\x2d\x11\xff\xff\x2d\x11\xff\xff\x2d\x11\xff\xff" "\x2d\x11\xff\xff\x2d\x11\xff\xff\x2d\x11\xff\xff\x2c\x11\xff\xff" "\x2c\x11\xff\xff\x2c\x11\xff\xff\x2c\x11\xff\xff\x2c\x11\xff\xff" "\x2c\x11\xff\xff\x2c\x11\xff\xff\x2c\x11\xff\xff\x2c\x10\xff\xff" "\x2c\x10\xff\xff\x2c\x10\xff\xff\x2c\x10\xff\xff\x2c\x10\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00" "\x5e\x56\x23\x00\x5e\x52\x94\x00\x5e\x4f\xf2\x00\x5e\x49\xff\x00" "\x5e\x47\xff\x00\x5e\x44\xff\x00\x5e\x41\xff\x00\x5e\x3e\xff\x00" "\x5e\x3b\xff\x00\x5e\x38\xff\x00\x5e\x36\xff\x00\x5d\x33\xff\x00" "\x5a\x31\xff\x00\x57\x2f\xff\x00\x55\x2d\xff\x00\x52\x2b\xff\x00" "\x50\x29\xff\x00\x4e\x28\xff\x00\x4b\x26\xff\x00\x49\x25\xff\x00" "\x47\x24\xff\x00\x45\x22\xff\x00\x44\x21\xff\x00\x42\x20\xff\x07" "\x41\x1f\xff\x2d\x3f\x1e\xff\x58\x3e\x1d\xff\x82\x3c\x1c\xff\xad" "\x3b\x1b\xff\xd8\x3a\x1a\xff\xfc\x39\x19\xff\xff\x38\x18\xff\xff" "\x37\x17\xff\xff\x36\x17\xff\xff\x35\x16\xff\xff\x34\x15\xff\xff" "\x33\x15\xff\xff\x32\x15\xff\xff\x32\x14\xff\xff\x31\x14\xff\xff" "\x30\x13\xff\xff\x30\x13\xff\xff\x2f\x13\xff\xff\x2e\x12\xff\xff" "\x2e\x12\xff\xff\x2d\x11\xff\xff\x2c\x11\xff\xff\x2c\x11\xff\xff" "\x2b\x10\xff\xff\x2b\x10\xff\xff\x2a\x0f\xff\xff\x2a\x0f\xff\xff" "\x2a\x0f\xff\xff\x29\x0f\xff\xff\x29\x0f\xff\xff\x29\x0f\xff\xff" "\x29\x0e\xff\xff\x28\x0e\xff\xff\x28\x0e\xff\xff\x28\x0e\xff\xff" "\x27\x0e\xff\xff\x27\x0e\xff\xff\x27\x0d\xff\xff\x27\x0d\xff\xff" "\x26\x0d\xff\xff\x26\x0d\xff\xff\x26\x0d\xff\xff\x25\x0d\xff\xff" "\x25\x0d\xff\xff\x25\x0d\xff\xff\x25\x0d\xff\xff\x25\x0d\xff\xff" "\x25\x0c\xff\xff\x25\x0c\xff\xff\x25\x0c\xff\xff\x25\x0c\xff\xff" "\x25\x0c\xff\xff\x25\x0c\xff\xff\x25\x0c\xff\xff\x25\x0c\xff\xff" "\x25\x0c\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff\x24\x0c\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x5e\x55\x23\x00\x5e\x50\x9e\x00" "\x5e\x4c\xfc\x00\x5e\x49\xff\x00\x5e\x46\xff\x00\x5e\x42\xff\x00" "\x5e\x3e\xff\x00\x5e\x3b\xff\x00\x5e\x38\xff\x00\x5e\x36\xff\x00" "\x5c\x33\xff\x00\x58\x30\xff\x00\x55\x2e\xff\x00\x52\x2c\xff\x00" "\x50\x2a\xff\x00\x4d\x28\xff\x00\x4a\x26\xff\x00\x48\x24\xff\x00" "\x46\x23\xff\x00\x44\x21\xff\x00\x42\x20\xff\x05\x40\x1e\xff\x32" "\x3f\x1d\xff\x68\x3d\x1c\xff\x9e\x3b\x1b\xff\xd4\x3a\x1a\xff\xfc" "\x38\x19\xff\xff\x37\x18\xff\xff\x35\x17\xff\xff\x34\x16\xff\xff" "\x33\x15\xff\xff\x32\x14\xff\xff\x31\x14\xff\xff\x30\x13\xff\xff" "\x2f\x12\xff\xff\x2e\x12\xff\xff\x2d\x11\xff\xff\x2c\x11\xff\xff" "\x2b\x10\xff\xff\x2b\x10\xff\xff\x2a\x10\xff\xff\x29\x0f\xff\xff" "\x29\x0f\xff\xff\x28\x0e\xff\xff\x28\x0e\xff\xff\x27\x0e\xff\xff" "\x26\x0d\xff\xff\x26\x0d\xff\xff\x25\x0d\xff\xff\x25\x0c\xff\xff" "\x24\x0c\xff\xff\x24\x0c\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff" "\x23\x0b\xff\xff\x22\x0b\xff\xff\x22\x0b\xff\xff\x22\x0b\xff\xff" "\x22\x0a\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff" "\x21\x0a\xff\xff\x20\x0a\xff\xff\x20\x0a\xff\xff\x20\x09\xff\xff" "\x20\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff" "\x1f\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff" "\x1f\x09\xff\xff\x1e\x09\xff\xff\x1e\x09\xff\xff\x1e\x09\xff\xff" "\x1e\x09\xff\xff\x1e\x09\xff\xff\x1e\x09\xff\xff\x1e\x09\xff\xff" "\x1e\x09\xff\xff\x1e\x08\xff\xff\x1e\x08\xff\xff\x1e\x08\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00" "\x5e\x55\x21\x00\x5e\x50\x9d\x00\x5e\x4d\xfc\x00\x5e\x48\xff\x00" "\x5e\x44\xff\x00\x5e\x40\xff\x00\x5e\x3d\xff\x00\x5e\x3a\xff\x00" "\x5e\x36\xff\x00\x5c\x33\xff\x00\x58\x30\xff\x00\x55\x2e\xff\x00" "\x51\x2c\xff\x00\x4f\x29\xff\x00\x4b\x27\xff\x00\x49\x25\xff\x00" "\x46\x23\xff\x00\x44\x21\xff\x00\x42\x20\xff\x0a\x3f\x1e\xff\x47" "\x3d\x1d\xff\x8b\x3b\x1b\xff\xc5\x3a\x1a\xff\xf7\x38\x19\xff\xff" "\x36\x17\xff\xff\x34\x16\xff\xff\x33\x15\xff\xff\x32\x14\xff\xff" "\x30\x13\xff\xff\x2f\x13\xff\xff\x2e\x12\xff\xff\x2c\x11\xff\xff" "\x2b\x10\xff\xff\x2a\x10\xff\xff\x29\x0f\xff\xff\x28\x0f\xff\xff" "\x27\x0e\xff\xff\x27\x0d\xff\xff\x26\x0d\xff\xff\x25\x0c\xff\xff" "\x24\x0c\xff\xff\x24\x0c\xff\xff\x23\x0b\xff\xff\x22\x0b\xff\xff" "\x22\x0b\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff\x20\x0a\xff\xff" "\x20\x09\xff\xff\x1f\x09\xff\xff\x1f\x09\xff\xff\x1e\x09\xff\xff" "\x1e\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff\x1c\x08\xff\xff" "\x1c\x08\xff\xff\x1c\x07\xff\xff\x1c\x07\xff\xff\x1c\x07\xff\xff" "\x1b\x07\xff\xff\x1b\x07\xff\xff\x1b\x07\xff\xff\x1b\x07\xff\xff" "\x1a\x07\xff\xff\x1a\x07\xff\xff\x1a\x06\xff\xff\x1a\x06\xff\xff" "\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff" "\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff" "\x19\x06\xff\xff\x18\x06\xff\xff\x18\x06\xff\xff\x18\x06\xff\xff" "\x18\x06\xff\xff\x18\x06\xff\xff\x18\x06\xff\xff\x18\x06\xff\xff" "\x18\x06\xff\xff\x18\x05\xff\xff\x18\x05\xff\xff\x18\x05\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x57\x07\x00\x5e\x51\x7e\x00" "\x5e\x4d\xf8\x00\x5e\x48\xff\x00\x5e\x44\xff\x00\x5e\x40\xff\x00" "\x5e\x3c\xff\x00\x5e\x38\xff\x00\x5d\x35\xff\x00\x59\x32\xff\x00" "\x55\x2f\xff\x00\x51\x2c\xff\x00\x4f\x29\xff\x00\x4a\x27\xff\x00" "\x48\x25\xff\x00\x45\x23\xff\x00\x42\x21\xff\x02\x40\x1e\xff\x36" "\x3e\x1d\xff\x7a\x3b\x1b\xff\xbf\x39\x1a\xff\xf9\x37\x18\xff\xff" "\x34\x17\xff\xff\x33\x15\xff\xff\x32\x15\xff\xff\x30\x13\xff\xff" "\x2e\x12\xff\xff\x2d\x11\xff\xff\x2b\x11\xff\xff\x2a\x10\xff\xff" "\x29\x0f\xff\xff\x28\x0e\xff\xff\x26\x0d\xff\xff\x25\x0d\xff\xff" "\x24\x0c\xff\xff\x23\x0b\xff\xff\x22\x0b\xff\xff\x21\x0b\xff\xff" "\x21\x0a\xff\xff\x20\x0a\xff\xff\x1f\x09\xff\xff\x1e\x09\xff\xff" "\x1e\x08\xff\xff\x1d\x08\xff\xff\x1d\x08\xff\xff\x1c\x08\xff\xff" "\x1c\x07\xff\xff\x1b\x07\xff\xff\x1b\x07\xff\xff\x1a\x07\xff\xff" "\x1a\x06\xff\xff\x19\x06\xff\xff\x19\x06\xff\xff\x18\x06\xff\xff" "\x18\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff" "\x17\x05\xff\xff\x16\x05\xff\xff\x16\x05\xff\xff\x16\x04\xff\xff" "\x16\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff" "\x15\x04\xff\xff\x15\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff\x14\x03\xff\xff" "\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff" "\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff" "\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff" "\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x59\x00\x00\x5e\x53\x44\x00\x5e\x4e\xda\x00\x5e\x49\xff\x00" "\x5e\x44\xff\x00\x5e\x40\xff\x00\x5e\x3c\xff\x00\x5e\x38\xff\x00" "\x5c\x34\xff\x00\x57\x30\xff\x00\x52\x2e\xff\x00\x4f\x2b\xff\x00" "\x4a\x28\xff\x00\x48\x25\xff\x00\x45\x23\xff\x00\x42\x21\xff\x03" "\x3f\x1f\xff\x3e\x3d\x1d\xff\x93\x3a\x1b\xff\xe6\x38\x19\xff\xff" "\x35\x17\xff\xff\x33\x16\xff\xff\x31\x15\xff\xff\x2f\x13\xff\xff" "\x2d\x12\xff\xff\x2c\x11\xff\xff\x2a\x10\xff\xff\x28\x0f\xff\xff" "\x27\x0e\xff\xff\x26\x0d\xff\xff\x24\x0c\xff\xff\x23\x0b\xff\xff" "\x22\x0b\xff\xff\x21\x0a\xff\xff\x20\x0a\xff\xff\x1f\x09\xff\xff" "\x1d\x09\xff\xff\x1d\x08\xff\xff\x1c\x08\xff\xff\x1b\x07\xff\xff" "\x1b\x07\xff\xff\x1a\x06\xff\xff\x19\x06\xff\xff\x18\x06\xff\xff" "\x18\x05\xff\xff\x17\x05\xff\xff\x17\x05\xff\xff\x16\x05\xff\xff" "\x16\x05\xff\xff\x16\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff" "\x14\x04\xff\xff\x14\x04\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff" "\x13\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff" "\x11\x03\xff\xff\x11\x03\xff\xff\x11\x02\xff\xff\x11\x02\xff\xff" "\x11\x02\xff\xff\x11\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff" "\x10\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff\x0e\x02\xff\xff" "\x0e\x02\xff\xff\x0e\x02\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff" "\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x55\x0e\x00" "\x5e\x50\xa3\x00\x5e\x4b\xff\x00\x5e\x46\xff\x00\x5e\x40\xff\x00" "\x5e\x3c\xff\x00\x5e\x38\xff\x00\x5b\x34\xff\x00\x55\x30\xff\x00" "\x51\x2d\xff\x00\x4d\x2a\xff\x00\x4a\x27\xff\x00\x46\x24\xff\x00" "\x43\x22\xff\x01\x3f\x1f\xff\x38\x3d\x1d\xff\x95\x3a\x1b\xff\xe7" "\x37\x19\xff\xff\x34\x17\xff\xff\x32\x15\xff\xff\x30\x14\xff\xff" "\x2e\x12\xff\xff\x2c\x11\xff\xff\x2a\x10\xff\xff\x28\x0f\xff\xff" "\x26\x0e\xff\xff\x24\x0d\xff\xff\x23\x0c\xff\xff\x22\x0b\xff\xff" "\x20\x0a\xff\xff\x1f\x09\xff\xff\x1e\x09\xff\xff\x1d\x08\xff\xff" "\x1c\x07\xff\xff\x1b\x07\xff\xff\x1a\x06\xff\xff\x19\x06\xff\xff" "\x18\x06\xff\xff\x17\x05\xff\xff\x16\x05\xff\xff\x16\x04\xff\xff" "\x15\x04\xff\xff\x14\x04\xff\xff\x14\x04\xff\xff\x13\x03\xff\xff" "\x13\x03\xff\xff\x12\x03\xff\xff\x12\x03\xff\xff\x11\x03\xff\xff" "\x11\x02\xff\xff\x11\x02\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff" "\x10\x02\xff\xff\x0f\x02\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff" "\x0e\x01\xff\xff\x0e\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0c\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x00\xff\xff\x0b\x00\xff\xff\x0b\x00\xff\xff" "\x0b\x00\xff\xff\x0b\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5a\x00\x00\x5e\x53\x31\x00\x5e\x4d\xdb\x00" "\x5e\x48\xff\x00\x5e\x42\xff\x00\x5e\x3e\xff\x00\x5e\x39\xff\x00" "\x5b\x35\xff\x00\x55\x30\xff\x00\x50\x2d\xff\x00\x4d\x2a\xff\x00" "\x47\x27\xff\x00\x45\x24\xff\x00\x41\x20\xff\x0c\x3e\x1e\xff\x67" "\x3a\x1c\xff\xcf\x37\x19\xff\xff\x34\x17\xff\xff\x32\x15\xff\xff" "\x2f\x14\xff\xff\x2d\x12\xff\xff\x2a\x11\xff\xff\x28\x0f\xff\xff" "\x26\x0e\xff\xff\x25\x0d\xff\xff\x23\x0c\xff\xff\x21\x0b\xff\xff" "\x20\x0a\xff\xff\x1e\x09\xff\xff\x1d\x08\xff\xff\x1c\x08\xff\xff" "\x1a\x07\xff\xff\x19\x06\xff\xff\x18\x06\xff\xff\x17\x05\xff\xff" "\x16\x05\xff\xff\x15\x04\xff\xff\x14\x04\xff\xff\x13\x04\xff\xff" "\x13\x03\xff\xff\x12\x03\xff\xff\x11\x03\xff\xff\x11\x02\xff\xff" "\x10\x02\xff\xff\x10\x02\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff" "\x0e\x01\xff\xff\x0e\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0b\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x57\x01\x00\x5e\x51\x6b\x00\x5e\x4b\xf9\x00\x5e\x45\xff\x00" "\x5e\x40\xff\x00\x5e\x3b\xff\x00\x5c\x36\xff\x00\x56\x32\xff\x00" "\x50\x2e\xff\x00\x4d\x2a\xff\x00\x48\x27\xff\x00\x44\x24\xff\x00" "\x40\x20\xff\x23\x3c\x1e\xff\x94\x39\x1b\xff\xf2\x36\x19\xff\xff" "\x33\x17\xff\xff\x2f\x14\xff\xff\x2d\x13\xff\xff\x2a\x11\xff\xff" "\x28\x0f\xff\xff\x26\x0e\xff\xff\x24\x0d\xff\xff\x21\x0b\xff\xff" "\x20\x0a\xff\xff\x1e\x09\xff\xff\x1d\x08\xff\xff\x1b\x08\xff\xff" "\x1a\x07\xff\xff\x18\x06\xff\xff\x17\x05\xff\xff\x16\x05\xff\xff" "\x15\x04\xff\xff\x14\x04\xff\xff\x13\x03\xff\xff\x12\x03\xff\xff" "\x11\x03\xff\xff\x10\x02\xff\xff\x10\x02\xff\xff\x0f\x02\xff\xff" "\x0e\x02\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff\x0a\x00\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x56\x05\x00" "\x5e\x4f\xa1\x00\x5e\x49\xff\x00\x5e\x43\xff\x00\x5e\x3e\xff\x00" "\x5e\x39\xff\x00\x58\x34\xff\x00\x52\x2f\xff\x00\x4d\x2c\xff\x00" "\x48\x28\xff\x00\x44\x24\xff\x00\x40\x21\xff\x23\x3c\x1e\xff\x9e" "\x38\x1b\xff\xfc\x34\x18\xff\xff\x31\x16\xff\xff\x2e\x14\xff\xff" "\x2b\x12\xff\xff\x29\x10\xff\xff\x26\x0e\xff\xff\x24\x0d\xff\xff" "\x22\x0b\xff\xff\x20\x0a\xff\xff\x1e\x09\xff\xff\x1c\x08\xff\xff" "\x1a\x07\xff\xff\x19\x06\xff\xff\x17\x05\xff\xff\x16\x05\xff\xff" "\x14\x04\xff\xff\x13\x04\xff\xff\x12\x03\xff\xff\x11\x03\xff\xff" "\x10\x02\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0c\x01\xff\xff\x0b\x01\xff\xff\x0b\x01\xff\xff" "\x0a\x00\xff\xff\x0a\x00\xff\xff\x09\x00\xff\xff\x09\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x55\x0b\x00\x5e\x4e\xb6\x00" "\x5e\x47\xff\x00\x5e\x41\xff\x00\x5e\x3c\xff\x00\x5a\x37\xff\x00" "\x54\x32\xff\x00\x4f\x2d\xff\x00\x4a\x29\xff\x00\x44\x25\xff\x00" "\x40\x22\xff\x21\x3c\x1e\xff\x9d\x38\x1b\xff\xfc\x34\x18\xff\xff" "\x30\x16\xff\xff\x2d\x14\xff\xff\x2a\x11\xff\xff\x27\x0f\xff\xff" "\x25\x0e\xff\xff\x22\x0c\xff\xff\x20\x0b\xff\xff\x1e\x09\xff\xff" "\x1c\x08\xff\xff\x1a\x07\xff\xff\x18\x06\xff\xff\x16\x05\xff\xff" "\x15\x04\xff\xff\x13\x04\xff\xff\x12\x03\xff\xff\x11\x03\xff\xff" "\x10\x02\xff\xff\x0f\x02\xff\xff\x0e\x01\xff\xff\x0d\x01\xff\xff" "\x0c\x01\xff\xff\x0b\x01\xff\xff\x0a\x01\xff\xff\x0a\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5b\x00\x00\x5e\x54\x14\x00\x5e\x4d\xc9\x00\x5e\x47\xff\x00" "\x5e\x40\xff\x00\x5e\x3a\xff\x00\x57\x35\xff\x00\x51\x30\xff\x00" "\x4c\x2c\xff\x00\x47\x27\xff\x00\x41\x23\xff\x07\x3d\x20\xff\x7e" "\x38\x1c\xff\xf8\x34\x19\xff\xff\x30\x16\xff\xff\x2d\x14\xff\xff" "\x2a\x11\xff\xff\x27\x0f\xff\xff\x23\x0d\xff\xff\x21\x0c\xff\xff" "\x1f\x0a\xff\xff\x1c\x09\xff\xff\x1a\x07\xff\xff\x18\x06\xff\xff" "\x16\x05\xff\xff\x14\x04\xff\xff\x13\x04\xff\xff\x11\x03\xff\xff" "\x10\x02\xff\xff\x0f\x02\xff\xff\x0e\x02\xff\xff\x0d\x01\xff\xff" "\x0c\x01\xff\xff\x0b\x01\xff\xff\x0a\x00\xff\xff\x09\x00\xff\xff" "\x08\x00\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00" "\x5e\x53\x14\x00\x5e\x4d\xd6\x00\x5e\x46\xff\x00\x5e\x40\xff\x00" "\x5c\x3a\xff\x00\x55\x34\xff\x00\x4f\x2f\xff\x00\x49\x2a\xff\x00" "\x43\x26\xff\x00\x3f\x22\xff\x44\x3a\x1e\xff\xda\x36\x1a\xff\xff" "\x31\x17\xff\xff\x2d\x15\xff\xff\x2a\x12\xff\xff\x27\x10\xff\xff" "\x24\x0d\xff\xff\x20\x0c\xff\xff\x1e\x0a\xff\xff\x1b\x08\xff\xff" "\x19\x07\xff\xff\x17\x06\xff\xff\x15\x05\xff\xff\x13\x04\xff\xff" "\x11\x03\xff\xff\x10\x02\xff\xff\x0f\x02\xff\xff\x0d\x01\xff\xff" "\x0c\x01\xff\xff\x0b\x01\xff\xff\x0a\x00\xff\xff\x09\x00\xff\xff" "\x08\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x54\x0b\x00" "\x5e\x4d\xc9\x00\x5e\x45\xff\x00\x5e\x3f\xff\x00\x5a\x39\xff\x00" "\x53\x34\xff\x00\x4d\x2e\xff\x00\x47\x29\xff\x00\x41\x25\xff\x0e" "\x3c\x21\xff\xa3\x37\x1d\xff\xff\x33\x19\xff\xff\x2f\x16\xff\xff" "\x2b\x13\xff\xff\x27\x10\xff\xff\x24\x0e\xff\xff\x20\x0c\xff\xff" "\x1e\x0a\xff\xff\x1b\x08\xff\xff\x18\x07\xff\xff\x16\x06\xff\xff" "\x14\x05\xff\xff\x12\x04\xff\xff\x10\x03\xff\xff\x0f\x02\xff\xff" "\x0d\x02\xff\xff\x0c\x01\xff\xff\x0b\x01\xff\xff\x0a\x00\xff\xff" "\x09\x00\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5e\x55\x05\x00\x5e\x4d\xb6\x00" "\x5e\x46\xff\x00\x5e\x3f\xff\x00\x59\x39\xff\x00\x52\x33\xff\x00" "\x4b\x2e\xff\x00\x45\x29\xff\x00\x40\x24\xff\x31\x3a\x1f\xff\xdb" "\x35\x1c\xff\xff\x31\x18\xff\xff\x2c\x15\xff\xff\x28\x12\xff\xff" "\x25\x0f\xff\xff\x21\x0d\xff\xff\x1e\x0b\xff\xff\x1b\x09\xff\xff" "\x18\x07\xff\xff\x16\x06\xff\xff\x14\x05\xff\xff\x11\x04\xff\xff" "\x10\x03\xff\xff\x0e\x02\xff\xff\x0c\x01\xff\xff\x0b\x01\xff\xff" "\x0a\x00\xff\xff\x09\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x06\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x56\x01\x00\x5e\x4e\xa0\x00\x5e\x47\xff\x00" "\x5e\x40\xff\x00\x58\x39\xff\x00\x51\x33\xff\x00\x4a\x2d\xff\x00" "\x44\x28\xff\x01\x3e\x23\xff\x6b\x38\x1f\xff\xf9\x34\x1b\xff\xff" "\x2f\x17\xff\xff\x2a\x14\xff\xff\x26\x11\xff\xff\x22\x0e\xff\xff" "\x1f\x0c\xff\xff\x1c\x0a\xff\xff\x19\x08\xff\xff\x16\x06\xff\xff" "\x14\x05\xff\xff\x11\x04\xff\xff\x0f\x03\xff\xff\x0d\x02\xff\xff" "\x0c\x01\xff\xff\x0a\x01\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff" "\x07\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x57\x00\x00\x5e\x4f\x69\x00\x5e\x47\xff\x00\x5e\x40\xff\x00" "\x57\x3a\xff\x00\x50\x34\xff\x00\x49\x2e\xff\x00\x43\x28\xff\x05" "\x3d\x23\xff\xa1\x37\x1f\xff\xff\x32\x1b\xff\xff\x2d\x17\xff\xff" "\x29\x13\xff\xff\x25\x10\xff\xff\x21\x0d\xff\xff\x1d\x0b\xff\xff" "\x1a\x09\xff\xff\x17\x07\xff\xff\x14\x05\xff\xff\x11\x04\xff\xff" "\x0f\x03\xff\xff\x0d\x02\xff\xff\x0c\x01\xff\xff\x0a\x01\xff\xff" "\x08\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00" "\x5e\x51\x31\x00\x5e\x49\xf9\x00\x5e\x41\xff\x00\x57\x3a\xff\x00" "\x50\x34\xff\x00\x48\x2e\xff\x00\x43\x29\xff\x0b\x3c\x23\xff\xb6" "\x37\x1f\xff\xff\x31\x1a\xff\xff\x2c\x16\xff\xff\x27\x13\xff\xff" "\x23\x10\xff\xff\x1f\x0d\xff\xff\x1c\x0a\xff\xff\x18\x08\xff\xff" "\x15\x06\xff\xff\x13\x05\xff\xff\x10\x03\xff\xff\x0e\x02\xff\xff" "\x0c\x02\xff\xff\x0a\x01\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff" "\x06\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5e\x53\x0e\x00" "\x5e\x4b\xdc\x00\x5e\x43\xff\x00\x58\x3c\xff\x00\x51\x35\xff\x00" "\x49\x2f\xff\x00\x42\x29\xff\x14\x3c\x24\xff\xc9\x36\x1f\xff\xff" "\x30\x1b\xff\xff\x2b\x16\xff\xff\x26\x13\xff\xff\x22\x0f\xff\xff" "\x1e\x0d\xff\xff\x1a\x0a\xff\xff\x17\x08\xff\xff\x14\x06\xff\xff" "\x11\x04\xff\xff\x0f\x03\xff\xff\x0c\x02\xff\xff\x0a\x01\xff\xff" "\x09\x01\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x55\x00\x00\x5e\x4d\xa5\x00" "\x5e\x45\xff\x00\x59\x3e\xff\x00\x51\x37\xff\x00\x4a\x30\xff\x00" "\x43\x2a\xff\x14\x3c\x25\xff\xd6\x36\x1f\xff\xff\x30\x1b\xff\xff" "\x2b\x17\xff\xff\x26\x13\xff\xff\x21\x0f\xff\xff\x1d\x0c\xff\xff" "\x19\x0a\xff\xff\x16\x08\xff\xff\x13\x06\xff\xff\x10\x04\xff\xff" "\x0d\x03\xff\xff\x0b\x02\xff\xff\x09\x01\xff\xff\x07\x00\xff\xff" "\x06\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x59\x00\x00\x5e\x50\x46\x00\x5e\x48\xff\x00" "\x5b\x40\xff\x00\x52\x39\xff\x00\x4b\x32\xff\x00\x44\x2c\xff\x0b" "\x3d\x26\xff\xc9\x36\x21\xff\xff\x30\x1c\xff\xff\x2b\x17\xff\xff" "\x25\x13\xff\xff\x21\x10\xff\xff\x1d\x0d\xff\xff\x19\x0a\xff\xff" "\x15\x07\xff\xff\x12\x05\xff\xff\x0f\x04\xff\xff\x0d\x02\xff\xff" "\x0a\x01\xff\xff\x08\x01\xff\xff\x07\x00\xff\xff\x05\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5d\x00\x00\x5e\x53\x08\x00\x5e\x4b\xdb\x00\x5d\x42\xff\x00" "\x54\x3b\xff\x00\x4c\x34\xff\x00\x44\x2d\xff\x05\x3d\x27\xff\xb6" "\x37\x22\xff\xff\x31\x1d\xff\xff\x2b\x18\xff\xff\x26\x14\xff\xff" "\x21\x10\xff\xff\x1c\x0d\xff\xff\x18\x0a\xff\xff\x15\x08\xff\xff" "\x11\x05\xff\xff\x0e\x04\xff\xff\x0c\x02\xff\xff\x0a\x01\xff\xff" "\x08\x01\xff\xff\x06\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x57\x00\x00\x5e\x4e\x80\x00\x5e\x45\xff\x00\x56\x3e\xff\x00" "\x4e\x36\xff\x00\x46\x2f\xff\x01\x3f\x29\xff\xa0\x38\x23\xff\xff" "\x31\x1e\xff\xff\x2c\x19\xff\xff\x26\x15\xff\xff\x21\x11\xff\xff" "\x1d\x0d\xff\xff\x18\x0a\xff\xff\x14\x08\xff\xff\x11\x06\xff\xff" "\x0e\x04\xff\xff\x0b\x02\xff\xff\x09\x01\xff\xff\x07\x00\xff\xff" "\x05\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00" "\x5e\x51\x22\x00\x5e\x49\xf9\x00\x58\x41\xff\x00\x50\x39\xff\x00" "\x48\x32\xff\x00\x41\x2c\xff\x69\x3a\x25\xff\xff\x33\x20\xff\xff" "\x2c\x1a\xff\xff\x27\x16\xff\xff\x22\x12\xff\xff\x1d\x0e\xff\xff" "\x19\x0b\xff\xff\x15\x08\xff\xff\x11\x06\xff\xff\x0e\x04\xff\xff" "\x0b\x02\xff\xff\x09\x01\xff\xff\x07\x01\xff\xff\x05\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x55\x00\x00" "\x5e\x4d\xa0\x00\x5c\x44\xff\x00\x52\x3c\xff\x00\x4a\x35\xff\x00" "\x42\x2e\xff\x31\x3b\x27\xff\xf9\x34\x22\xff\xff\x2e\x1c\xff\xff" "\x28\x17\xff\xff\x23\x13\xff\xff\x1d\x0f\xff\xff\x19\x0c\xff\xff" "\x15\x09\xff\xff\x11\x06\xff\xff\x0e\x04\xff\xff\x0b\x03\xff\xff" "\x08\x01\xff\xff\x06\x01\xff\xff\x05\x00\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x5e\x50\x25\x00" "\x5e\x48\xfd\x00\x56\x40\xff\x00\x4d\x38\xff\x00\x44\x30\xff\x0e" "\x3d\x2a\xff\xdc\x36\x24\xff\xff\x30\x1e\xff\xff\x29\x19\xff\xff" "\x24\x15\xff\xff\x1f\x10\xff\xff\x1a\x0d\xff\xff\x15\x0a\xff\xff" "\x12\x07\xff\xff\x0e\x05\xff\xff\x0b\x03\xff\xff\x09\x02\xff\xff" "\x06\x01\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x55\x00\x00\x5e\x4d\xa2\x00" "\x5a\x43\xff\x00\x50\x3c\xff\x00\x48\x34\xff\x00\x40\x2d\xff\xa5" "\x38\x27\xff\xff\x31\x20\xff\xff\x2b\x1b\xff\xff\x25\x16\xff\xff" "\x20\x12\xff\xff\x1b\x0e\xff\xff\x16\x0b\xff\xff\x12\x08\xff\xff" "\x0f\x05\xff\xff\x0b\x03\xff\xff\x09\x02\xff\xff\x06\x01\xff\xff" "\x05\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x5e\x50\x26\x00\x5d\x48\xfd\x00" "\x54\x40\xff\x00\x4b\x38\xff\x00\x42\x30\xff\x46\x3c\x2a\xff\xff" "\x34\x24\xff\xff\x2d\x1e\xff\xff\x27\x18\xff\xff\x21\x14\xff\xff" "\x1c\x10\xff\xff\x18\x0c\xff\xff\x13\x09\xff\xff\x10\x06\xff\xff" "\x0c\x04\xff\xff\x09\x02\xff\xff\x07\x01\xff\xff\x05\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x56\x00\x00\x5e\x4c\x97\x00\x58\x44\xff\x00" "\x4f\x3c\xff\x00\x46\x34\xff\x08\x3e\x2d\xff\xdb\x37\x27\xff\xff" "\x30\x20\xff\xff\x2a\x1b\xff\xff\x23\x16\xff\xff\x1e\x11\xff\xff" "\x19\x0d\xff\xff\x14\x0a\xff\xff\x11\x07\xff\xff\x0d\x05\xff\xff" "\x0a\x03\xff\xff\x07\x02\xff\xff\x05\x01\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5d\x00\x00\x5e\x51\x0d\x00\x5d\x49\xf3\x00\x53\x40\xff\x00" "\x4a\x38\xff\x00\x42\x30\xff\x80\x3a\x2a\xff\xff\x33\x23\xff\xff" "\x2c\x1e\xff\xff\x26\x18\xff\xff\x20\x13\xff\xff\x1b\x0f\xff\xff" "\x16\x0c\xff\xff\x12\x08\xff\xff\x0e\x06\xff\xff\x0b\x04\xff\xff" "\x08\x02\xff\xff\x06\x01\xff\xff\x04\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x58\x00\x00\x5e\x4e\x68\x00\x58\x45\xff\x00\x4f\x3d\xff\x00" "\x45\x35\xff\x22\x3e\x2e\xff\xf9\x36\x27\xff\xff\x2f\x20\xff\xff" "\x28\x1b\xff\xff\x22\x16\xff\xff\x1d\x11\xff\xff\x18\x0d\xff\xff" "\x13\x0a\xff\xff\x0f\x07\xff\xff\x0c\x05\xff\xff\x09\x03\xff\xff" "\x06\x01\xff\xff\x04\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x53\x01\x00\x5d\x4b\xd0\x00\x53\x42\xff\x00\x4a\x39\xff\x00" "\x42\x32\xff\xa0\x3a\x2b\xff\xff\x32\x24\xff\xff\x2b\x1e\xff\xff" "\x25\x19\xff\xff\x1f\x14\xff\xff\x1a\x0f\xff\xff\x15\x0c\xff\xff" "\x11\x08\xff\xff\x0d\x06\xff\xff\x0a\x04\xff\xff\x07\x02\xff\xff" "\x05\x01\xff\xff\x03\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00" "\x5e\x4f\x38\x00\x58\x47\xff\x00\x4f\x3e\xff\x00\x45\x36\xff\x25" "\x3e\x2f\xff\xfd\x36\x28\xff\xff\x2f\x22\xff\xff\x28\x1c\xff\xff" "\x22\x16\xff\xff\x1c\x12\xff\xff\x17\x0e\xff\xff\x12\x0a\xff\xff" "\x0e\x07\xff\xff\x0b\x05\xff\xff\x08\x03\xff\xff\x06\x01\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x56\x00\x00" "\x5e\x4c\x95\x00\x54\x43\xff\x00\x4a\x3b\xff\x00\x42\x33\xff\xa2" "\x3a\x2c\xff\xff\x32\x25\xff\xff\x2b\x1f\xff\xff\x25\x1a\xff\xff" "\x1f\x14\xff\xff\x19\x10\xff\xff\x15\x0c\xff\xff\x10\x09\xff\xff" "\x0d\x06\xff\xff\x09\x04\xff\xff\x06\x02\xff\xff\x04\x01\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x53\x03\x00" "\x5a\x49\xe7\x00\x50\x41\xff\x00\x47\x38\xff\x26\x3f\x30\xff\xfd" "\x36\x29\xff\xff\x2f\x23\xff\xff\x28\x1d\xff\xff\x22\x17\xff\xff" "\x1c\x13\xff\xff\x17\x0e\xff\xff\x12\x0b\xff\xff\x0e\x07\xff\xff" "\x0b\x05\xff\xff\x08\x03\xff\xff\x05\x01\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5a\x00\x00\x5e\x4f\x3e\x00" "\x56\x47\xff\x00\x4b\x3e\xff\x00\x44\x36\xff\x97\x3b\x2e\xff\xff" "\x33\x27\xff\xff\x2c\x21\xff\xff\x25\x1b\xff\xff\x1f\x15\xff\xff" "\x1a\x11\xff\xff\x15\x0d\xff\xff\x10\x09\xff\xff\x0c\x06\xff\xff" "\x09\x04\xff\xff\x06\x02\xff\xff\x04\x01\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x56\x00\x00\x5c\x4c\x93\x00" "\x51\x43\xff\x00\x49\x3b\xff\x0d\x40\x33\xff\xf3\x38\x2c\xff\xff" "\x30\x25\xff\xff\x29\x1f\xff\xff\x23\x19\xff\xff\x1d\x14\xff\xff" "\x18\x0f\xff\xff\x13\x0b\xff\xff\x0e\x08\xff\xff\x0b\x05\xff\xff" "\x08\x03\xff\xff\x05\x02\xff\xff\x03\x01\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x53\x02\x00\x58\x4a\xe6\x00" "\x4e\x41\xff\x00\x45\x38\xff\x68\x3d\x30\xff\xff\x35\x29\xff\xff" "\x2e\x23\xff\xff\x27\x1d\xff\xff\x20\x17\xff\xff\x1b\x12\xff\xff" "\x15\x0e\xff\xff\x11\x0a\xff\xff\x0d\x07\xff\xff\x09\x04\xff\xff" "\x06\x02\xff\xff\x04\x01\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x5e\x50\x36\x00\x55\x47\xff\x00" "\x4b\x3e\xff\x01\x42\x36\xff\xd0\x3a\x2e\xff\xff\x32\x27\xff\xff" "\x2b\x21\xff\xff\x24\x1b\xff\xff\x1e\x15\xff\xff\x19\x11\xff\xff" "\x13\x0d\xff\xff\x0f\x09\xff\xff\x0b\x06\xff\xff\x08\x04\xff\xff" "\x05\x02\xff\xff\x03\x01\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x58\x00\x00\x5c\x4d\x7b\x00\x51\x44\xff\x00" "\x48\x3c\xff\x38\x3f\x33\xff\xff\x37\x2c\xff\xff\x2f\x25\xff\xff" "\x28\x1e\xff\xff\x22\x19\xff\xff\x1c\x14\xff\xff\x16\x0f\xff\xff" "\x12\x0b\xff\xff\x0e\x08\xff\xff\x0a\x05\xff\xff\x07\x03\xff\xff" "\x04\x01\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x55\x00\x00\x58\x4b\xc0\x00\x4e\x42\xff\x00" "\x45\x39\xff\x95\x3d\x31\xff\xff\x34\x2a\xff\xff\x2d\x23\xff\xff" "\x26\x1d\xff\xff\x20\x17\xff\xff\x1a\x12\xff\xff\x15\x0e\xff\xff" "\x10\x0a\xff\xff\x0c\x07\xff\xff\x09\x04\xff\xff\x06\x02\xff\xff" "\x04\x01\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5d\x00\x00\x5e\x52\x0c\x00\x55\x48\xfa\x00\x4b\x40\xff\x03" "\x42\x37\xff\xe7\x3a\x2f\xff\xff\x32\x28\xff\xff\x2a\x21\xff\xff" "\x24\x1b\xff\xff\x1e\x16\xff\xff\x18\x11\xff\xff\x13\x0d\xff\xff" "\x0f\x09\xff\xff\x0b\x06\xff\xff\x08\x04\xff\xff\x05\x02\xff\xff" "\x03\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5a\x00\x00\x5c\x4f\x4a\x00\x51\x46\xff\x00\x48\x3d\xff\x3e" "\x3f\x35\xff\xff\x37\x2d\xff\xff\x2f\x26\xff\xff\x28\x20\xff\xff" "\x22\x1a\xff\xff\x1c\x15\xff\xff\x16\x10\xff\xff\x11\x0c\xff\xff" "\x0d\x08\xff\xff\x0a\x05\xff\xff\x07\x03\xff\xff\x04\x02\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x57\x00\x00\x59\x4d\x8e\x00\x4f\x43\xff\x00\x45\x3b\xff\x93" "\x3d\x33\xff\xff\x35\x2b\xff\xff\x2d\x24\xff\xff\x26\x1e\xff\xff" "\x20\x18\xff\xff\x1a\x13\xff\xff\x15\x0f\xff\xff\x10\x0b\xff\xff" "\x0c\x07\xff\xff\x09\x05\xff\xff\x06\x03\xff\xff\x03\x01\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x55\x00\x00\x56\x4b\xc8\x00\x4c\x41\xff\x02\x43\x39\xff\xe6" "\x3a\x31\xff\xff\x32\x29\xff\xff\x2b\x23\xff\xff\x24\x1c\xff\xff" "\x1d\x17\xff\xff\x18\x12\xff\xff\x13\x0e\xff\xff\x0f\x0a\xff\xff" "\x0b\x07\xff\xff\x08\x04\xff\xff\x05\x02\xff\xff\x03\x01\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00" "\x5e\x53\x06\x00\x53\x49\xf9\x00\x49\x40\xff\x36\x41\x37\xff\xff" "\x38\x2f\xff\xff\x30\x28\xff\xff\x29\x21\xff\xff\x22\x1b\xff\xff" "\x1c\x15\xff\xff\x17\x11\xff\xff\x12\x0c\xff\xff\x0d\x09\xff\xff" "\x0a\x06\xff\xff\x07\x04\xff\xff\x04\x02\xff\xff\x02\x01\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x00\x00" "\x5c\x50\x35\x00\x51\x46\xff\x00\x47\x3e\xff\x7b\x3e\x35\xff\xff" "\x36\x2e\xff\xff\x2e\x26\xff\xff\x27\x20\xff\xff\x21\x1a\xff\xff" "\x1b\x15\xff\xff\x15\x10\xff\xff\x10\x0c\xff\xff\x0c\x08\xff\xff" "\x09\x05\xff\xff\x06\x03\xff\xff\x03\x01\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x58\x00\x00" "\x58\x4e\x6b\x00\x4e\x45\xff\x00\x45\x3c\xff\xc0\x3c\x34\xff\xff" "\x34\x2c\xff\xff\x2c\x25\xff\xff\x25\x1e\xff\xff\x1f\x19\xff\xff" "\x19\x13\xff\xff\x14\x0f\xff\xff\x0f\x0b\xff\xff\x0b\x07\xff\xff" "\x08\x05\xff\xff\x05\x03\xff\xff\x03\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x56\x00\x00" "\x56\x4c\xa2\x00\x4c\x43\xff\x0c\x43\x3a\xff\xfa\x3a\x32\xff\xff" "\x32\x2a\xff\xff\x2a\x23\xff\xff\x23\x1d\xff\xff\x1d\x17\xff\xff" "\x18\x12\xff\xff\x13\x0e\xff\xff\x0e\x0a\xff\xff\x0a\x07\xff\xff" "\x07\x04\xff\xff\x04\x02\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x54\x00\x00" "\x54\x4a\xd8\x00\x4a\x41\xff\x4a\x40\x38\xff\xff\x38\x30\xff\xff" "\x30\x29\xff\xff\x29\x22\xff\xff\x22\x1c\xff\xff\x1c\x16\xff\xff" "\x16\x11\xff\xff\x11\x0d\xff\xff\x0d\x09\xff\xff\x09\x06\xff\xff" "\x06\x04\xff\xff\x04\x02\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x5c\x52\x09\x00" "\x51\x48\xfd\x00\x47\x3f\xff\x8e\x3f\x37\xff\xff\x36\x2f\xff\xff" "\x2e\x28\xff\xff\x27\x21\xff\xff\x20\x1b\xff\xff\x1a\x15\xff\xff" "\x15\x10\xff\xff\x10\x0c\xff\xff\x0c\x09\xff\xff\x09\x06\xff\xff" "\x06\x03\xff\xff\x03\x02\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x5a\x51\x30\x00" "\x4f\x47\xff\x00\x45\x3e\xff\xc8\x3d\x35\xff\xff\x35\x2e\xff\xff" "\x2d\x26\xff\xff\x26\x20\xff\xff\x1f\x1a\xff\xff\x19\x14\xff\xff" "\x14\x0f\xff\xff\x0f\x0b\xff\xff\x0b\x08\xff\xff\x08\x05\xff\xff" "\x05\x03\xff\xff\x03\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x59\x00\x00\x57\x4f\x5b\x00" "\x4d\x45\xff\x06\x43\x3c\xff\xf9\x3b\x34\xff\xff\x33\x2c\xff\xff" "\x2b\x25\xff\xff\x24\x1f\xff\xff\x1e\x19\xff\xff\x18\x13\xff\xff" "\x13\x0f\xff\xff\x0e\x0b\xff\xff\x0a\x07\xff\xff\x07\x05\xff\xff" "\x05\x03\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x58\x00\x00\x55\x4d\x85\x00" "\x4b\x44\xff\x35\x42\x3b\xff\xff\x39\x32\xff\xff\x31\x2b\xff\xff" "\x2a\x24\xff\xff\x23\x1d\xff\xff\x1c\x18\xff\xff\x17\x13\xff\xff" "\x12\x0e\xff\xff\x0d\x0a\xff\xff\x0a\x07\xff\xff\x07\x04\xff\xff" "\x04\x02\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x56\x00\x00\x53\x4c\xb0\x00" "\x49\x42\xff\x6b\x40\x3a\xff\xff\x38\x31\xff\xff\x30\x2a\xff\xff" "\x28\x23\xff\xff\x21\x1d\xff\xff\x1b\x17\xff\xff\x16\x12\xff\xff" "\x11\x0d\xff\xff\x0d\x0a\xff\xff\x09\x06\xff\xff\x06\x04\xff\xff" "\x04\x02\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5d\x54\x00\x00\x52\x4a\xdb\x00" "\x48\x41\xff\xa2\x3e\x38\xff\xff\x36\x30\xff\xff\x2e\x29\xff\xff" "\x27\x22\xff\xff\x20\x1c\xff\xff\x1a\x16\xff\xff\x15\x11\xff\xff" "\x10\x0d\xff\xff\x0c\x09\xff\xff\x08\x06\xff\xff\x05\x04\xff\xff" "\x03\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x53\x06\x00\x50\x49\xfd\x00" "\x46\x3f\xff\xd8\x3d\x37\xff\xff\x35\x2f\xff\xff\x2d\x28\xff\xff" "\x26\x21\xff\xff\x1f\x1b\xff\xff\x19\x15\xff\xff\x14\x10\xff\xff" "\x0f\x0c\xff\xff\x0b\x09\xff\xff\x08\x06\xff\xff\x05\x03\xff\xff" "\x03\x02\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5c\x00\x00\x59\x51\x24\x00\x4e\x48\xff\x09" "\x44\x3e\xff\xfd\x3c\x36\xff\xff\x33\x2e\xff\xff\x2c\x27\xff\xff" "\x25\x20\xff\xff\x1e\x1a\xff\xff\x18\x14\xff\xff\x13\x10\xff\xff" "\x0e\x0b\xff\xff\x0b\x08\xff\xff\x07\x05\xff\xff\x04\x03\xff\xff" "\x02\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5b\x00\x00\x57\x50\x45\x00\x4d\x46\xff\x30" "\x43\x3d\xff\xff\x3a\x35\xff\xff\x32\x2d\xff\xff\x2a\x26\xff\xff" "\x23\x1f\xff\xff\x1d\x19\xff\xff\x17\x14\xff\xff\x12\x0f\xff\xff" "\x0e\x0b\xff\xff\x0a\x08\xff\xff\x07\x05\xff\xff\x04\x03\xff\xff" "\x02\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x59\x00\x00\x55\x4f\x66\x00\x4b\x45\xff\x5b" "\x41\x3c\xff\xff\x39\x34\xff\xff\x30\x2c\xff\xff\x29\x25\xff\xff" "\x22\x1e\xff\xff\x1c\x18\xff\xff\x16\x13\xff\xff\x11\x0e\xff\xff" "\x0d\x0a\xff\xff\x09\x07\xff\xff\x06\x04\xff\xff\x04\x02\xff\xff" "\x02\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x58\x00\x00\x54\x4e\x87\x00\x49\x44\xff\x85" "\x40\x3b\xff\xff\x37\x32\xff\xff\x2f\x2b\xff\xff\x28\x24\xff\xff" "\x21\x1d\xff\xff\x1b\x17\xff\xff\x16\x12\xff\xff\x11\x0e\xff\xff" "\x0c\x0a\xff\xff\x09\x07\xff\xff\x06\x04\xff\xff\x03\x02\xff\xff" "\x02\x01\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5d\x57\x00\x00\x52\x4c\xa7\x00\x48\x43\xff\xb0" "\x3f\x3a\xff\xff\x36\x32\xff\xff\x2e\x2a\xff\xff\x27\x23\xff\xff" "\x20\x1d\xff\xff\x1a\x17\xff\xff\x15\x12\xff\xff\x10\x0d\xff\xff" "\x0c\x0a\xff\xff\x08\x06\xff\xff\x05\x04\xff\xff\x03\x02\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5c\x55\x00\x00\x51\x4b\xc8\x00\x47\x42\xff\xdb" "\x3e\x39\xff\xff\x35\x31\xff\xff\x2d\x29\xff\xff\x26\x22\xff\xff" "\x1f\x1c\xff\xff\x19\x16\xff\xff\x14\x11\xff\xff\x0f\x0d\xff\xff" "\x0b\x09\xff\xff\x08\x06\xff\xff\x05\x04\xff\xff\x03\x02\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5a\x54\x00\x00\x4f\x4a\xe5\x06\x46\x41\xff\xfd" "\x3c\x38\xff\xff\x34\x30\xff\xff\x2c\x28\xff\xff\x25\x21\xff\xff" "\x1f\x1b\xff\xff\x19\x15\xff\xff\x13\x11\xff\xff\x0f\x0c\xff\xff" "\x0b\x09\xff\xff\x07\x06\xff\xff\x05\x03\xff\xff\x03\x02\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x59\x53\x01\x00\x4e\x49\xfa\x24\x44\x40\xff\xff" "\x3b\x37\xff\xff\x33\x2f\xff\xff\x2b\x28\xff\xff\x24\x21\xff\xff" "\x1e\x1b\xff\xff\x18\x15\xff\xff\x13\x10\xff\xff\x0e\x0c\xff\xff" "\x0a\x08\xff\xff\x07\x05\xff\xff\x04\x03\xff\xff\x02\x01\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5d\x00\x00\x57\x53\x0f\x00\x4d\x49\xff\x45\x43\x3f\xff\xff" "\x3a\x36\xff\xff\x32\x2e\xff\xff\x2a\x27\xff\xff\x23\x20\xff\xff" "\x1d\x1a\xff\xff\x17\x15\xff\xff\x12\x10\xff\xff\x0e\x0c\xff\xff" "\x0a\x08\xff\xff\x07\x05\xff\xff\x04\x03\xff\xff\x02\x01\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5d\x00\x00\x56\x52\x25\x00\x4c\x48\xff\x66\x42\x3e\xff\xff" "\x39\x36\xff\xff\x31\x2e\xff\xff\x29\x26\xff\xff\x22\x20\xff\xff" "\x1c\x1a\xff\xff\x16\x14\xff\xff\x11\x0f\xff\xff\x0d\x0b\xff\xff" "\x09\x08\xff\xff\x06\x05\xff\xff\x04\x03\xff\xff\x02\x01\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5c\x00\x00\x55\x51\x3a\x00\x4b\x47\xff\x87\x41\x3e\xff\xff" "\x38\x35\xff\xff\x30\x2d\xff\xff\x29\x26\xff\xff\x22\x1f\xff\xff" "\x1c\x19\xff\xff\x16\x14\xff\xff\x11\x0f\xff\xff\x0d\x0b\xff\xff" "\x09\x08\xff\xff\x06\x05\xff\xff\x03\x03\xff\xff\x02\x01\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5b\x00\x00\x54\x50\x4f\x00\x4a\x46\xff\xa7\x40\x3d\xff\xff" "\x37\x34\xff\xff\x2f\x2c\xff\xff\x28\x25\xff\xff\x21\x1f\xff\xff" "\x1b\x19\xff\xff\x15\x13\xff\xff\x10\x0f\xff\xff\x0c\x0b\xff\xff" "\x08\x07\xff\xff\x06\x05\xff\xff\x03\x02\xff\xff\x01\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x59\x00\x00\x53\x4f\x64\x00\x49\x45\xff\xc8\x40\x3c\xff\xff" "\x37\x34\xff\xff\x2f\x2c\xff\xff\x27\x25\xff\xff\x21\x1e\xff\xff" "\x1a\x18\xff\xff\x15\x13\xff\xff\x10\x0e\xff\xff\x0c\x0a\xff\xff" "\x08\x07\xff\xff\x05\x04\xff\xff\x03\x02\xff\xff\x01\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5d\x59\x00\x00\x52\x4e\x7a\x00\x48\x45\xff\xe5\x3f\x3b\xff\xff" "\x36\x33\xff\xff\x2e\x2b\xff\xff\x27\x24\xff\xff\x20\x1e\xff\xff" "\x1a\x18\xff\xff\x14\x13\xff\xff\x10\x0e\xff\xff\x0c\x0a\xff\xff" "\x08\x07\xff\xff\x05\x04\xff\xff\x03\x02\xff\xff\x01\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5c\x58\x00\x00\x51\x4d\x8f\x01\x47\x44\xff\xfa\x3e\x3b\xff\xff" "\x35\x32\xff\xff\x2d\x2b\xff\xff\x26\x24\xff\xff\x1f\x1d\xff\xff" "\x19\x17\xff\xff\x14\x12\xff\xff\x0f\x0e\xff\xff\x0b\x0a\xff\xff" "\x08\x07\xff\xff\x05\x04\xff\xff\x03\x02\xff\xff\x01\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5b\x57\x00\x00\x50\x4d\xa4\x0f\x47\x43\xff\xff\x3d\x3a\xff\xff" "\x35\x32\xff\xff\x2d\x2a\xff\xff\x25\x23\xff\xff\x1f\x1d\xff\xff" "\x19\x17\xff\xff\x14\x12\xff\xff\x0f\x0d\xff\xff\x0b\x09\xff\xff" "\x07\x06\xff\xff\x05\x04\xff\xff\x03\x02\xff\xff\x01\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5a\x56\x00\x00\x50\x4c\xba\x25\x46\x42\xff\xff\x3d\x39\xff\xff" "\x34\x31\xff\xff\x2c\x29\xff\xff\x25\x22\xff\xff\x1e\x1c\xff\xff" "\x18\x16\xff\xff\x13\x11\xff\xff\x0f\x0d\xff\xff\x0b\x09\xff\xff" "\x07\x06\xff\xff\x04\x04\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x59\x55\x00\x00\x4e\x4b\xcf\x3a\x45\x41\xff\xff\x3c\x39\xff\xff" "\x33\x30\xff\xff\x2b\x29\xff\xff\x24\x22\xff\xff\x1e\x1c\xff\xff" "\x18\x16\xff\xff\x13\x11\xff\xff\x0e\x0d\xff\xff\x0a\x09\xff\xff" "\x07\x06\xff\xff\x04\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x58\x54\x00\x00\x4e\x4a\xe4\x4f\x44\x41\xff\xff\x3b\x38\xff\xff" "\x33\x30\xff\xff\x2b\x28\xff\xff\x24\x21\xff\xff\x1d\x1b\xff\xff" "\x18\x16\xff\xff\x12\x11\xff\xff\x0e\x0c\xff\xff\x0a\x09\xff\xff" "\x07\x06\xff\xff\x04\x03\xff\xff\x02\x02\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x57\x53\x01\x00\x4d\x49\xf9\x64\x43\x40\xff\xff\x3a\x37\xff\xff" "\x32\x2f\xff\xff\x2a\x28\xff\xff\x23\x21\xff\xff\x1d\x1b\xff\xff" "\x17\x15\xff\xff\x12\x10\xff\xff\x0d\x0c\xff\xff\x0a\x08\xff\xff" "\x06\x05\xff\xff\x04\x03\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00" "\x56\x53\x0f\x00\x4c\x49\xff\x7a\x43\x3f\xff\xff\x3a\x36\xff\xff" "\x31\x2e\xff\xff\x2a\x27\xff\xff\x23\x20\xff\xff\x1c\x1a\xff\xff" "\x17\x15\xff\xff\x12\x10\xff\xff\x0d\x0c\xff\xff\x09\x08\xff\xff" "\x06\x05\xff\xff\x04\x03\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00" "\x56\x52\x21\x00\x4b\x48\xff\x8f\x42\x3f\xff\xff\x39\x36\xff\xff" "\x31\x2e\xff\xff\x29\x27\xff\xff\x22\x20\xff\xff\x1c\x1a\xff\xff" "\x16\x14\xff\xff\x11\x0f\xff\xff\x0d\x0b\xff\xff\x09\x08\xff\xff" "\x06\x05\xff\xff\x04\x03\xff\xff\x02\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00" "\x55\x52\x2c\x00\x4b\x48\xff\xa4\x41\x3e\xff\xff\x38\x36\xff\xff" "\x30\x2e\xff\xff\x28\x26\xff\xff\x22\x20\xff\xff\x1b\x1a\xff\xff" "\x16\x14\xff\xff\x11\x0f\xff\xff\x0c\x0b\xff\xff\x09\x08\xff\xff" "\x06\x05\xff\xff\x03\x03\xff\xff\x02\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x54\x51\x36\x00\x4a\x47\xff\xba\x40\x3e\xff\xff\x38\x35\xff\xff" "\x2f\x2d\xff\xff\x28\x26\xff\xff\x21\x1f\xff\xff\x1b\x19\xff\xff" "\x15\x14\xff\xff\x10\x0f\xff\xff\x0c\x0b\xff\xff\x09\x08\xff\xff" "\x06\x05\xff\xff\x03\x03\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x53\x51\x40\x00\x49\x47\xff\xcf\x40\x3e\xff\xff\x37\x35\xff\xff" "\x2f\x2d\xff\xff\x27\x26\xff\xff\x21\x1f\xff\xff\x1a\x19\xff\xff" "\x15\x14\xff\xff\x10\x0f\xff\xff\x0c\x0b\xff\xff\x08\x07\xff\xff" "\x05\x05\xff\xff\x03\x03\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5d\x5b\x00\x00" "\x52\x50\x4a\x00\x48\x47\xff\xe4\x3f\x3d\xff\xff\x36\x35\xff\xff" "\x2e\x2d\xff\xff\x27\x25\xff\xff\x20\x1f\xff\xff\x1a\x19\xff\xff" "\x14\x13\xff\xff\x10\x0f\xff\xff\x0b\x0b\xff\xff\x08\x07\xff\xff" "\x05\x05\xff\xff\x03\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5d\x5b\x00\x00" "\x52\x50\x54\x01\x48\x46\xff\xf9\x3f\x3d\xff\xff\x36\x34\xff\xff" "\x2e\x2c\xff\xff\x26\x25\xff\xff\x20\x1f\xff\xff\x1a\x19\xff\xff" "\x14\x13\xff\xff\x0f\x0f\xff\xff\x0b\x0b\xff\xff\x08\x07\xff\xff" "\x05\x04\xff\xff\x03\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5c\x5a\x00\x00" "\x51\x50\x5e\x0f\x47\x46\xff\xff\x3e\x3d\xff\xff\x36\x34\xff\xff" "\x2e\x2c\xff\xff\x26\x25\xff\xff\x1f\x1e\xff\xff\x19\x18\xff\xff" "\x14\x13\xff\xff\x0f\x0e\xff\xff\x0b\x0a\xff\xff\x08\x07\xff\xff" "\x05\x04\xff\xff\x03\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5c\x5a\x00\x00" "\x51\x4f\x68\x21\x47\x45\xff\xff\x3e\x3c\xff\xff\x35\x34\xff\xff" "\x2d\x2c\xff\xff\x26\x25\xff\xff\x1f\x1e\xff\xff\x19\x18\xff\xff" "\x14\x13\xff\xff\x0f\x0e\xff\xff\x0b\x0a\xff\xff\x08\x07\xff\xff" "\x05\x04\xff\xff\x03\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5c\x59\x00\x00" "\x51\x4e\x72\x2c\x47\x45\xff\xff\x3d\x3c\xff\xff\x35\x33\xff\xff" "\x2d\x2b\xff\xff\x26\x24\xff\xff\x1f\x1e\xff\xff\x19\x18\xff\xff" "\x14\x13\xff\xff\x0f\x0e\xff\xff\x0b\x0a\xff\xff\x07\x07\xff\xff" "\x05\x04\xff\xff\x03\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x59\x00\x00" "\x50\x4e\x7c\x36\x46\x45\xff\xff\x3d\x3c\xff\xff\x35\x33\xff\xff" "\x2d\x2b\xff\xff\x25\x24\xff\xff\x1f\x1e\xff\xff\x19\x18\xff\xff" "\x13\x13\xff\xff\x0f\x0e\xff\xff\x0b\x0a\xff\xff\x07\x07\xff\xff" "\x05\x04\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x58\x00\x00" "\x50\x4e\x86\x40\x46\x44\xff\xff\x3d\x3b\xff\xff\x34\x33\xff\xff" "\x2c\x2b\xff\xff\x25\x24\xff\xff\x1e\x1d\xff\xff\x18\x18\xff\xff" "\x13\x12\xff\xff\x0f\x0e\xff\xff\x0b\x0a\xff\xff\x07\x07\xff\xff" "\x04\x04\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5a\x58\x00\x00" "\x4f\x4e\x90\x4a\x46\x44\xff\xff\x3c\x3b\xff\xff\x34\x32\xff\xff" "\x2c\x2b\xff\xff\x25\x24\xff\xff\x1e\x1d\xff\xff\x18\x17\xff\xff" "\x13\x12\xff\xff\x0e\x0e\xff\xff\x0a\x0a\xff\xff\x07\x07\xff\xff" "\x04\x04\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x59\x58\x00\x00" "\x4f\x4d\x9a\x54\x45\x44\xff\xff\x3c\x3b\xff\xff\x34\x32\xff\xff" "\x2c\x2a\xff\xff\x25\x23\xff\xff\x1e\x1d\xff\xff\x18\x17\xff\xff" "\x13\x12\xff\xff\x0e\x0d\xff\xff\x0a\x0a\xff\xff\x07\x06\xff\xff" "\x04\x04\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x59\x57\x00\x00" "\x4e\x4d\xa4\x5e\x45\x43\xff\xff\x3c\x3a\xff\xff\x33\x32\xff\xff" "\x2b\x2a\xff\xff\x24\x23\xff\xff\x1e\x1d\xff\xff\x18\x17\xff\xff" "\x13\x12\xff\xff\x0e\x0d\xff\xff\x0a\x09\xff\xff\x07\x06\xff\xff" "\x04\x04\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x59\x57\x00\x00" "\x4e\x4c\xae\x68\x45\x43\xff\xff\x3b\x3a\xff\xff\x33\x32\xff\xff" "\x2b\x2a\xff\xff\x24\x23\xff\xff\x1e\x1c\xff\xff\x18\x17\xff\xff" "\x12\x12\xff\xff\x0e\x0d\xff\xff\x0a\x09\xff\xff\x07\x06\xff\xff" "\x04\x04\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x58\x56\x00\x00" "\x4e\x4c\xb8\x72\x44\x42\xff\xff\x3b\x3a\xff\xff\x33\x31\xff\xff" "\x2b\x2a\xff\xff\x24\x23\xff\xff\x1d\x1c\xff\xff\x17\x16\xff\xff" "\x12\x11\xff\xff\x0e\x0d\xff\xff\x0a\x09\xff\xff\x07\x06\xff\xff" "\x04\x04\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x58\x56\x00\x00" "\x4d\x4c\xc2\x7c\x44\x42\xff\xff\x3b\x39\xff\xff\x32\x31\xff\xff" "\x2b\x29\xff\xff\x23\x22\xff\xff\x1d\x1c\xff\xff\x17\x16\xff\xff" "\x12\x11\xff\xff\x0e\x0d\xff\xff\x0a\x09\xff\xff\x06\x06\xff\xff" "\x04\x04\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x57\x56\x00\x00" "\x4d\x4b\xcc\x86\x43\x42\xff\xff\x3a\x39\xff\xff\x32\x31\xff\xff" "\x2a\x29\xff\xff\x23\x22\xff\xff\x1d\x1c\xff\xff\x17\x16\xff\xff" "\x12\x11\xff\xff\x0d\x0d\xff\xff\x0a\x09\xff\xff\x06\x06\xff\xff" "\x04\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x57\x56\x00\x00" "\x4d\x4b\xcf\x90\x43\x42\xff\xff\x3a\x39\xff\xff\x32\x31\xff\xff" "\x2a\x29\xff\xff\x23\x22\xff\xff\x1d\x1c\xff\xff\x17\x16\xff\xff" "\x12\x11\xff\xff\x0d\x0d\xff\xff\x09\x09\xff\xff\x06\x06\xff\xff" "\x04\x03\xff\xff\x02\x02\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x57\x55\x00\x00" "\x4c\x4b\xd2\x9a\x43\x42\xff\xff\x3a\x39\xff\xff\x31\x31\xff\xff" "\x2a\x29\xff\xff\x23\x22\xff\xff\x1c\x1c\xff\xff\x17\x16\xff\xff" "\x11\x11\xff\xff\x0d\x0d\xff\xff\x09\x09\xff\xff\x06\x06\xff\xff" "\x04\x03\xff\xff\x02\x02\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x56\x55\x00\x00" "\x4c\x4b\xd5\xa4\x42\x42\xff\xff\x39\x39\xff\xff\x31\x30\xff\xff" "\x29\x29\xff\xff\x22\x22\xff\xff\x1c\x1c\xff\xff\x16\x16\xff\xff" "\x11\x11\xff\xff\x0d\x0d\xff\xff\x09\x09\xff\xff\x06\x06\xff\xff" "\x04\x03\xff\xff\x02\x02\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x56\x55\x00\x00" "\x4c\x4b\xd8\xae\x42\x41\xff\xff\x39\x39\xff\xff\x31\x30\xff\xff" "\x29\x29\xff\xff\x22\x22\xff\xff\x1c\x1c\xff\xff\x16\x16\xff\xff" "\x11\x11\xff\xff\x0d\x0d\xff\xff\x09\x09\xff\xff\x06\x06\xff\xff" "\x03\x03\xff\xff\x02\x02\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x56\x55\x00\x00" "\x4b\x4b\xda\xb8\x42\x41\xff\xff\x39\x38\xff\xff\x31\x30\xff\xff" "\x29\x29\xff\xff\x22\x22\xff\xff\x1c\x1b\xff\xff\x16\x16\xff\xff" "\x11\x11\xff\xff\x0d\x0c\xff\xff\x09\x09\xff\xff\x06\x06\xff\xff" "\x03\x03\xff\xff\x02\x02\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x55\x55\x00\x00" "\x4b\x4b\xdd\xc2\x42\x41\xff\xff\x39\x38\xff\xff\x31\x30\xff\xff" "\x29\x29\xff\xff\x22\x22\xff\xff\x1c\x1b\xff\xff\x16\x16\xff\xff" "\x11\x11\xff\xff\x0d\x0c\xff\xff\x09\x09\xff\xff\x06\x06\xff\xff" "\x03\x03\xff\xff\x02\x02\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x55\x55\x00\x00" "\x4b\x4b\xe0\xcc\x42\x41\xff\xff\x39\x38\xff\xff\x30\x30\xff\xff" "\x29\x29\xff\xff\x22\x22\xff\xff\x1c\x1b\xff\xff\x16\x16\xff\xff" "\x11\x11\xff\xff\x0d\x0c\xff\xff\x09\x09\xff\xff\x06\x06\xff\xff" "\x03\x03\xff\xff\x02\x02\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x55\x55\x00\x00" "\x4b\x4b\xe2\xcf\x42\x41\xff\xff\x39\x38\xff\xff\x30\x30\xff\xff" "\x29\x28\xff\xff\x22\x22\xff\xff\x1c\x1b\xff\xff\x16\x16\xff\xff" "\x11\x11\xff\xff\x0d\x0c\xff\xff\x09\x09\xff\xff\x06\x06\xff\xff" "\x03\x03\xff\xff\x02\x02\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x55\x55\x00\x00" "\x4b\x4b\xe5\xd2\x41\x41\xff\xff\x39\x38\xff\xff\x30\x30\xff\xff" "\x29\x28\xff\xff\x22\x21\xff\xff\x1b\x1b\xff\xff\x16\x16\xff\xff" "\x11\x11\xff\xff\x0d\x0c\xff\xff\x09\x09\xff\xff\x06\x06\xff\xff" "\x03\x03\xff\xff\x02\x02\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x55\x55\x00\x00" "\x4b\x4a\xe8\xd5\x41\x41\xff\xff\x38\x38\xff\xff\x30\x30\xff\xff" "\x29\x28\xff\xff\x22\x21\xff\xff\x1b\x1b\xff\xff\x16\x16\xff\xff" "\x11\x11\xff\xff\x0c\x0c\xff\xff\x09\x09\xff\xff\x06\x06\xff\xff" "\x03\x03\xff\xff\x02\x02\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x55\x54\x00\x00" "\x4b\x4a\xeb\xd8\x41\x41\xff\xff\x38\x38\xff\xff\x30\x30\xff\xff" "\x29\x28\xff\xff\x22\x21\xff\xff\x1b\x1b\xff\xff\x16\x15\xff\xff" "\x11\x11\xff\xff\x0c\x0c\xff\xff\x09\x09\xff\xff\x06\x06\xff\xff" "\x03\x03\xff\xff\x02\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x55\x54\x00\x00" "\x4b\x4a\xed\xda\x41\x41\xff\xff\x38\x38\xff\xff\x30\x30\xff\xff" "\x29\x28\xff\xff\x22\x21\xff\xff\x1b\x1b\xff\xff\x16\x15\xff\xff" "\x11\x10\xff\xff\x0c\x0c\xff\xff\x09\x09\xff\xff\x06\x06\xff\xff" "\x03\x03\xff\xff\x02\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x55\x54\x00\x00" "\x4b\x4a\xf0\xdd\x41\x41\xff\xff\x38\x38\xff\xff\x30\x30\xff\xff" "\x28\x28\xff\xff\x22\x21\xff\xff\x1b\x1b\xff\xff\x16\x15\xff\xff" "\x11\x10\xff\xff\x0c\x0c\xff\xff\x09\x09\xff\xff\x06\x06\xff\xff" "\x03\x03\xff\xff\x02\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x55\x54\x00\x00" "\x4a\x4a\xf3\xe0\x41\x41\xff\xff\x38\x38\xff\xff\x30\x30\xff\xff" "\x28\x28\xff\xff\x21\x21\xff\xff\x1b\x1b\xff\xff\x16\x15\xff\xff" "\x11\x10\xff\xff\x0c\x0c\xff\xff\x09\x08\xff\xff\x06\x05\xff\xff" "\x03\x03\xff\xff\x02\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x54\x54\x00\x00" "\x4a\x4a\xf5\xe2\x41\x40\xff\xff\x38\x38\xff\xff\x30\x2f\xff\xff" "\x28\x28\xff\xff\x21\x21\xff\xff\x1b\x1b\xff\xff\x16\x15\xff\xff" "\x11\x10\xff\xff\x0c\x0c\xff\xff\x09\x08\xff\xff\x06\x05\xff\xff" "\x03\x03\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" // Mipmap level 2. "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x0b\x00\x5e\x5e\x20\x00\x5e\x5e\x36\x00" "\x5e\x5c\x4b\x00\x5e\x5a\x61\x00\x5e\x58\x76\x00\x5e\x57\x8c\x00" "\x5e\x56\x99\x00\x5e\x55\xa3\x00\x5e\x54\xad\x00\x5e\x54\xb7\x00" "\x5e\x53\xc2\x00\x5e\x52\xcc\x00\x5e\x51\xd6\x00\x5e\x50\xe0\x00" "\x5e\x50\xe9\x00\x5e\x50\xec\x00\x5e\x50\xee\x00\x5e\x50\xf1\x00" "\x5e\x4f\xf3\x00\x5e\x4f\xf6\x00\x5e\x4f\xf8\x00\x5e\x4f\xfb\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x02\x00\x5e\x5e\x1d\x00\x5e\x5c\x42\x00" "\x5e\x59\x67\x00\x5e\x56\x8c\x00\x5e\x53\xb1\x00\x5e\x50\xd6\x00" "\x5e\x4e\xf5\x00\x5e\x4c\xff\x00\x5e\x4b\xff\x00\x5e\x49\xff\x00" "\x5e\x47\xff\x00\x5e\x46\xff\x00\x5e\x44\xff\x00\x5e\x43\xff\x00" "\x5e\x42\xff\x00\x5e\x42\xff\x00\x5e\x41\xff\x00\x5e\x40\xff\x00" "\x5e\x3f\xff\x00\x5e\x3f\xff\x00\x5e\x3e\xff\x00\x5e\x3d\xff\x00" "\x5e\x3d\xff\x00\x5e\x3d\xff\x00\x5e\x3d\xff\x00\x5e\x3d\xff\x00" "\x5e\x3c\xff\x00\x5e\x3c\xff\x00\x5e\x3c\xff\x00\x5e\x3c\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x0a\x00\x5e\x5b\x42\x00\x5e\x55\x7f\x00" "\x5e\x50\xbd\x00\x5e\x4d\xf5\x00\x5e\x4a\xff\x00\x5e\x47\xff\x00" "\x5e\x44\xff\x00\x5e\x42\xff\x00\x5e\x3f\xff\x00\x5e\x3d\xff\x00" "\x5e\x3b\xff\x00\x5e\x3a\xff\x00\x5e\x38\xff\x00\x5e\x37\xff\x00" "\x5e\x35\xff\x00\x5e\x34\xff\x00\x5e\x33\xff\x00\x5c\x32\xff\x00" "\x5c\x31\xff\x00\x5b\x30\xff\x00\x5a\x30\xff\x00\x59\x2f\xff\x00" "\x58\x2f\xff\x00\x57\x2e\xff\x00\x56\x2d\xff\x00\x56\x2d\xff\x00" "\x55\x2d\xff\x00\x55\x2c\xff\x00\x55\x2c\xff\x00\x55\x2c\xff\x00" "\x54\x2c\xff\x00\x54\x2c\xff\x00\x54\x2c\xff\x00\x54\x2b\xff\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x2a\x00\x5e\x54\x84\x00" "\x5e\x4f\xc6\x00\x5e\x4b\xfa\x00\x5e\x46\xff\x00\x5e\x41\xff\x00" "\x5e\x3d\xff\x00\x5e\x3a\xff\x00\x5e\x38\xff\x00\x5e\x35\xff\x00" "\x5e\x33\xff\x00\x5b\x31\xff\x00\x58\x2e\xff\x00\x55\x2c\xff\x00" "\x53\x2b\xff\x00\x51\x2a\xff\x00\x50\x29\xff\x00\x4e\x27\xff\x00" "\x4c\x26\xff\x00\x4b\x25\xff\x00\x49\x24\xff\x01\x48\x23\xff\x0c" "\x47\x22\xff\x19\x46\x22\xff\x23\x45\x21\xff\x2d\x45\x21\xff\x37" "\x44\x20\xff\x42\x43\x20\xff\x4c\x42\x1f\xff\x56\x42\x1f\xff\x60" "\x42\x1f\xff\x69\x41\x1f\xff\x6c\x41\x1e\xff\x6e\x41\x1e\xff\x71" "\x41\x1e\xff\x73\x41\x1e\xff\x76\x40\x1e\xff\x78\x40\x1e\xff\x7b" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x15\x00" "\x5e\x55\x6d\x00\x5e\x4d\xcb\x00\x5e\x46\xff\x00\x5e\x41\xff\x00" "\x5e\x3c\xff\x00\x5e\x38\xff\x00\x5e\x34\xff\x00\x5b\x31\xff\x00" "\x55\x2d\xff\x00\x52\x2a\xff\x00\x4f\x28\xff\x00\x4c\x26\xff\x00" "\x49\x24\xff\x00\x46\x22\xff\x0d\x44\x20\xff\x31\x41\x1f\xff\x56" "\x40\x1d\xff\x75\x3e\x1c\xff\x8b\x3d\x1b\xff\xa0\x3b\x1a\xff\xb6" "\x3a\x19\xff\xcb\x38\x18\xff\xe1\x37\x17\xff\xf7\x36\x17\xff\xff" "\x35\x16\xff\xff\x34\x16\xff\xff\x34\x15\xff\xff\x33\x15\xff\xff" "\x33\x15\xff\xff\x32\x14\xff\xff\x31\x14\xff\xff\x31\x13\xff\xff" "\x30\x13\xff\xff\x30\x13\xff\xff\x30\x13\xff\xff\x30\x13\xff\xff" "\x30\x13\xff\xff\x30\x13\xff\xff\x2f\x13\xff\xff\x2f\x13\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x59\x27\x00\x5e\x4f\xab\x00\x5e\x48\xfb\x00" "\x5e\x41\xff\x00\x5e\x3a\xff\x00\x5e\x36\xff\x00\x5a\x31\xff\x00" "\x54\x2c\xff\x00\x50\x29\xff\x00\x4b\x26\xff\x00\x46\x23\xff\x08" "\x42\x1f\xff\x3d\x3f\x1d\xff\x76\x3c\x1b\xff\x9d\x3a\x19\xff\xc3" "\x37\x18\xff\xe8\x35\x16\xff\xff\x32\x15\xff\xff\x30\x14\xff\xff" "\x2f\x12\xff\xff\x2e\x12\xff\xff\x2c\x11\xff\xff\x2b\x10\xff\xff" "\x2a\x0f\xff\xff\x28\x0e\xff\xff\x27\x0e\xff\xff\x26\x0d\xff\xff" "\x26\x0d\xff\xff\x25\x0d\xff\xff\x25\x0c\xff\xff\x24\x0c\xff\xff" "\x24\x0c\xff\xff\x23\x0b\xff\xff\x23\x0b\xff\xff\x22\x0b\xff\xff" "\x22\x0b\xff\xff\x22\x0b\xff\xff\x22\x0a\xff\xff\x21\x0a\xff\xff" "\x21\x0a\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff\x21\x0a\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x15\x00" "\x5e\x4f\x94\x00\x5e\x46\xfc\x00\x5e\x3d\xff\x00\x5e\x38\xff\x00" "\x5b\x32\xff\x00\x52\x2c\xff\x00\x4b\x28\xff\x00\x45\x23\xff\x0c" "\x41\x1e\xff\x46\x3d\x1d\xff\x84\x38\x1a\xff\xc2\x34\x17\xff\xf8" "\x31\x14\xff\xff\x2e\x12\xff\xff\x2c\x11\xff\xff\x2a\x10\xff\xff" "\x27\x0e\xff\xff\x25\x0d\xff\xff\x23\x0c\xff\xff\x22\x0b\xff\xff" "\x21\x0a\xff\xff\x1f\x09\xff\xff\x1e\x09\xff\xff\x1d\x08\xff\xff" "\x1c\x08\xff\xff\x1b\x07\xff\xff\x1a\x07\xff\xff\x1a\x06\xff\xff" "\x19\x06\xff\xff\x19\x06\xff\xff\x18\x06\xff\xff\x18\x05\xff\xff" "\x17\x05\xff\xff\x17\x05\xff\xff\x16\x05\xff\xff\x16\x05\xff\xff" "\x16\x05\xff\xff\x16\x04\xff\xff\x16\x04\xff\xff\x16\x04\xff\xff" "\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff\x15\x04\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x03\x00\x5e\x52\x75\x00\x5e\x48\xf1\x00" "\x5e\x3f\xff\x00\x5e\x37\xff\x00\x55\x2f\xff\x00\x4d\x29\xff\x00" "\x46\x24\xff\x05\x40\x20\xff\x4b\x38\x1b\xff\xa9\x34\x17\xff\xf8" "\x30\x14\xff\xff\x2c\x12\xff\xff\x29\x10\xff\xff\x26\x0e\xff\xff" "\x23\x0b\xff\xff\x20\x0a\xff\xff\x1e\x09\xff\xff\x1c\x08\xff\xff" "\x1b\x07\xff\xff\x19\x06\xff\xff\x17\x05\xff\xff\x16\x05\xff\xff" "\x15\x04\xff\xff\x14\x04\xff\xff\x13\x03\xff\xff\x12\x03\xff\xff" "\x11\x03\xff\xff\x11\x02\xff\xff\x10\x02\xff\xff\x0f\x02\xff\xff" "\x0f\x02\xff\xff\x0f\x02\xff\xff\x0e\x01\xff\xff\x0e\x01\xff\xff" "\x0e\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff\x0d\x01\xff\xff" "\x0d\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff\x0c\x01\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5a\x0e\x00\x5e\x4d\xb4\x00\x5e\x41\xff\x00\x5e\x39\xff\x00" "\x55\x31\xff\x00\x4a\x29\xff\x00\x41\x22\xff\x2d\x3a\x1c\xff\x90" "\x36\x18\xff\xe9\x30\x15\xff\xff\x2a\x11\xff\xff\x26\x0e\xff\xff" "\x23\x0b\xff\xff\x1e\x0a\xff\xff\x1d\x08\xff\xff\x1a\x07\xff\xff" "\x17\x05\xff\xff\x14\x04\xff\xff\x13\x03\xff\xff\x12\x03\xff\xff" "\x10\x02\xff\xff\x0f\x02\xff\xff\x0e\x01\xff\xff\x0d\x01\xff\xff" "\x0c\x01\xff\xff\x0b\x01\xff\xff\x0a\x00\xff\xff\x0a\x00\xff\xff" "\x09\x00\xff\xff\x09\x00\xff\xff\x08\x00\xff\xff\x08\x00\xff\xff" "\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff\x07\x00\xff\xff" "\x07\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff\x06\x00\xff\xff" "\x06\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x57\x24\x00" "\x5e\x4a\xd6\x00\x5e\x3e\xff\x00\x57\x33\xff\x00\x4c\x2a\xff\x00" "\x42\x24\xff\x1d\x3b\x1d\xff\xa2\x31\x18\xff\xff\x2c\x12\xff\xff" "\x28\x0f\xff\xff\x23\x0c\xff\xff\x1e\x0a\xff\xff\x1a\x07\xff\xff" "\x17\x05\xff\xff\x13\x04\xff\xff\x12\x03\xff\xff\x10\x02\xff\xff" "\x0e\x01\xff\xff\x0c\x01\xff\xff\x0b\x01\xff\xff\x0a\x00\xff\xff" "\x09\x00\xff\xff\x08\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff" "\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x54\x3d\x00\x5e\x47\xee\x00" "\x5e\x3c\xff\x00\x4f\x31\xff\x00\x45\x27\xff\x0e\x3c\x1f\xff\x85" "\x34\x19\xff\xf7\x2c\x14\xff\xff\x25\x0f\xff\xff\x1f\x0b\xff\xff" "\x1b\x08\xff\xff\x17\x06\xff\xff\x13\x04\xff\xff\x10\x03\xff\xff" "\x0d\x02\xff\xff\x0b\x01\xff\xff\x0a\x00\xff\xff\x08\x00\xff\xff" "\x07\x00\xff\xff\x05\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x03\x00\xff\xff\x03\x00\xff\xff\x02\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x55\x25\x00\x5e\x46\xee\x00\x5b\x39\xff\x00" "\x4e\x2f\xff\x00\x42\x25\xff\x3d\x36\x1d\xff\xe7\x2d\x16\xff\xff" "\x27\x10\xff\xff\x20\x0c\xff\xff\x1a\x08\xff\xff\x15\x05\xff\xff" "\x11\x03\xff\xff\x0e\x02\xff\xff\x0b\x01\xff\xff\x09\x00\xff\xff" "\x07\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff" "\x02\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x58\x0f\x00\x5e\x48\xd7\x00\x58\x3a\xff\x00\x4b\x2e\xff\x00" "\x3f\x23\xff\x64\x34\x1b\xff\xfa\x2a\x14\xff\xff\x22\x0e\xff\xff" "\x1b\x09\xff\xff\x16\x06\xff\xff\x11\x04\xff\xff\x0d\x02\xff\xff" "\x09\x01\xff\xff\x07\x00\xff\xff\x05\x00\xff\xff\x04\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x03\x00" "\x5e\x4b\xb7\x00\x59\x3d\xff\x00\x49\x30\xff\x04\x3c\x24\xff\x92" "\x32\x1a\xff\xff\x28\x13\xff\xff\x1f\x0d\xff\xff\x18\x09\xff\xff" "\x12\x05\xff\xff\x0e\x02\xff\xff\x0a\x01\xff\xff\x07\x00\xff\xff" "\x04\x00\xff\xff\x03\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x4e\x77\x00" "\x5c\x3f\xff\x00\x4c\x32\xff\x01\x3d\x26\xff\xa7\x30\x1c\xff\xff" "\x26\x14\xff\xff\x1e\x0d\xff\xff\x16\x08\xff\xff\x10\x04\xff\xff" "\x0b\x02\xff\xff\x07\x00\xff\xff\x05\x00\xff\xff\x02\x00\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x56\x15\x00\x5e\x44\xf2\x00" "\x4e\x35\xff\x00\x40\x28\xff\x7c\x32\x1e\xff\xff\x27\x15\xff\xff" "\x1c\x0e\xff\xff\x15\x08\xff\xff\x0f\x04\xff\xff\x0a\x01\xff\xff" "\x06\x00\xff\xff\x03\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x4c\x94\x00\x51\x3c\xff\x00" "\x42\x2c\xff\x51\x34\x21\xff\xff\x28\x17\xff\xff\x1e\x0f\xff\xff" "\x15\x09\xff\xff\x0e\x04\xff\xff\x09\x02\xff\xff\x05\x00\xff\xff" "\x02\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x54\x27\x00\x59\x42\xfc\x00\x46\x34\xff\x2c" "\x38\x26\xff\xf5\x2a\x1b\xff\xff\x20\x11\xff\xff\x17\x0a\xff\xff" "\x0f\x05\xff\xff\x09\x02\xff\xff\x04\x00\xff\xff\x02\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x4a\xab\x00\x4e\x3a\xff\x01\x3e\x2b\xff\xbf" "\x2e\x20\xff\xff\x23\x16\xff\xff\x18\x0d\xff\xff\x10\x07\xff\xff" "\x0a\x03\xff\xff\x05\x00\xff\xff\x02\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x56\x15\x00\x57\x42\xfb\x00\x44\x31\xff\x4d\x36\x25\xff\xff" "\x28\x1a\xff\xff\x1c\x10\xff\xff\x12\x0a\xff\xff\x0b\x04\xff\xff" "\x06\x01\xff\xff\x02\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x4e\x6e\x00\x4c\x3b\xff\x05\x3c\x2d\xff\xd8\x2d\x20\xff\xff" "\x21\x15\xff\xff\x17\x0d\xff\xff\x0e\x06\xff\xff\x08\x02\xff\xff" "\x03\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x58\x47\xcd\x00\x44\x37\xff\x69\x33\x28\xff\xff\x27\x1c\xff\xff" "\x1b\x12\xff\xff\x11\x0a\xff\xff\x0b\x04\xff\xff\x05\x01\xff\xff" "\x02\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x53\x2c\x00" "\x50\x41\xff\x02\x3d\x31\xff\xdf\x2f\x24\xff\xff\x21\x18\xff\xff" "\x16\x0f\xff\xff\x0e\x08\xff\xff\x07\x03\xff\xff\x03\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5d\x4d\x86\x00" "\x49\x3a\xff\x3f\x38\x2c\xff\xff\x2a\x1f\xff\xff\x1d\x14\xff\xff" "\x12\x0c\xff\xff\x0b\x06\xff\xff\x05\x02\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00\x56\x48\xc8\x00" "\x42\x36\xff\x9d\x33\x27\xff\xff\x25\x1b\xff\xff\x19\x11\xff\xff" "\x0f\x09\xff\xff\x08\x04\xff\xff\x03\x01\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x58\x0b\x00\x4e\x43\xfb\x0a" "\x3b\x32\xff\xf2\x2d\x24\xff\xff\x20\x18\xff\xff\x15\x0e\xff\xff" "\x0c\x07\xff\xff\x06\x02\xff\xff\x02\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x52\x42\x00\x49\x3f\xff\x5b" "\x37\x2f\xff\xff\x28\x21\xff\xff\x1c\x16\xff\xff\x11\x0d\xff\xff" "\x0a\x06\xff\xff\x04\x02\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x59\x4d\x7f\x00\x44\x3b\xff\xaa" "\x33\x2b\xff\xff\x25\x1e\xff\xff\x19\x13\xff\xff\x0f\x0b\xff\xff" "\x08\x05\xff\xff\x03\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x53\x49\xbc\x01\x3f\x37\xff\xe6" "\x2f\x28\xff\xff\x22\x1b\xff\xff\x16\x11\xff\xff\x0d\x09\xff\xff" "\x06\x04\xff\xff\x02\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5a\x01\x00\x4f\x45\xf3\x23\x3c\x33\xff\xff" "\x2c\x25\xff\xff\x1f\x19\xff\xff\x14\x0f\xff\xff\x0b\x08\xff\xff" "\x05\x03\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x56\x1b\x00\x4a\x42\xff\x60\x38\x31\xff\xff" "\x28\x22\xff\xff\x1b\x16\xff\xff\x11\x0d\xff\xff\x09\x06\xff\xff" "\x04\x02\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5b\x53\x41\x00\x46\x3f\xff\x9d\x34\x2e\xff\xff" "\x26\x20\xff\xff\x19\x15\xff\xff\x0f\x0c\xff\xff\x08\x06\xff\xff" "\x03\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x57\x50\x66\x00\x43\x3d\xff\xda\x31\x2c\xff\xff" "\x23\x1f\xff\xff\x17\x14\xff\xff\x0e\x0b\xff\xff\x07\x05\xff\xff" "\x02\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x53\x4d\x8c\x0a\x40\x3a\xff\xff\x2f\x2a\xff\xff" "\x21\x1d\xff\xff\x15\x12\xff\xff\x0c\x0a\xff\xff\x06\x04\xff\xff" "\x02\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x51\x4a\xb2\x2e\x3d\x38\xff\xff\x2d\x28\xff\xff" "\x1f\x1b\xff\xff\x14\x11\xff\xff\x0b\x09\xff\xff\x05\x03\xff\xff" "\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5c\x00\x00\x4e\x47\xd7\x54\x3b\x35\xff\xff\x2b\x26\xff\xff" "\x1d\x19\xff\xff\x12\x0f\xff\xff\x0a\x08\xff\xff\x04\x03\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5a\x01\x00\x4b\x45\xf6\x79\x38\x33\xff\xff\x28\x24\xff\xff" "\x1b\x18\xff\xff\x11\x0e\xff\xff\x09\x07\xff\xff\x04\x02\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5d\x58\x0c\x00\x48\x43\xff\x9f\x36\x32\xff\xff\x26\x23\xff\xff" "\x1a\x17\xff\xff\x10\x0d\xff\xff\x08\x06\xff\xff\x03\x02\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5a\x56\x21\x00\x45\x42\xff\xc5\x34\x31\xff\xff\x25\x22\xff\xff" "\x18\x16\xff\xff\x0e\x0d\xff\xff\x07\x06\xff\xff\x02\x02\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x59\x53\x37\x00\x44\x40\xff\xe9\x32\x2f\xff\xff\x23\x21\xff\xff" "\x17\x15\xff\xff\x0e\x0c\xff\xff\x06\x05\xff\xff\x02\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x56\x52\x4c\x03\x42\x3f\xff\xfe\x31\x2e\xff\xff\x22\x20\xff\xff" "\x16\x14\xff\xff\x0d\x0b\xff\xff\x06\x05\xff\xff\x02\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x54\x50\x62\x16\x40\x3d\xff\xff\x2f\x2d\xff\xff\x21\x1f\xff\xff" "\x15\x14\xff\xff\x0c\x0b\xff\xff\x06\x05\xff\xff\x02\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x53\x4f\x77\x2c\x3f\x3c\xff\xff\x2e\x2b\xff\xff\x20\x1e\xff\xff" "\x15\x13\xff\xff\x0c\x0a\xff\xff\x05\x04\xff\xff\x01\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x51\x4d\x8c\x42\x3e\x3b\xff\xff\x2d\x2a\xff\xff\x1f\x1d\xff\xff" "\x14\x12\xff\xff\x0b\x0a\xff\xff\x05\x04\xff\xff\x01\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x4f\x4c\x99\x57\x3c\x3a\xff\xff\x2c\x2a\xff\xff\x1e\x1c\xff\xff" "\x13\x11\xff\xff\x0a\x09\xff\xff\x04\x04\xff\xff\x01\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x4e\x4b\xa3\x6d\x3b\x39\xff\xff\x2b\x29\xff\xff\x1d\x1c\xff\xff" "\x12\x11\xff\xff\x0a\x09\xff\xff\x04\x03\xff\xff\x01\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x4d\x4b\xae\x82\x3a\x38\xff\xff\x2a\x29\xff\xff\x1c\x1b\xff\xff" "\x12\x11\xff\xff\x09\x09\xff\xff\x04\x03\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x4c\x4a\xb8\x94\x39\x38\xff\xff\x29\x28\xff\xff\x1c\x1b\xff\xff" "\x11\x10\xff\xff\x09\x08\xff\xff\x04\x03\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x4b\x49\xc2\x9e\x38\x37\xff\xff\x29\x27\xff\xff\x1b\x1a\xff\xff" "\x11\x10\xff\xff\x09\x08\xff\xff\x03\x03\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5d\x00\x00" "\x4a\x48\xcc\xa8\x38\x36\xff\xff\x28\x27\xff\xff\x1b\x1a\xff\xff" "\x10\x10\xff\xff\x09\x08\xff\xff\x03\x03\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5c\x00\x00" "\x49\x48\xd7\xb3\x37\x36\xff\xff\x28\x26\xff\xff\x1b\x19\xff\xff" "\x10\x0f\xff\xff\x08\x08\xff\xff\x03\x03\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5d\x5c\x00\x00" "\x49\x47\xe1\xbd\x36\x35\xff\xff\x27\x26\xff\xff\x1a\x19\xff\xff" "\x10\x0f\xff\xff\x08\x07\xff\xff\x03\x03\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5d\x5b\x00\x00" "\x48\x46\xe9\xc7\x36\x35\xff\xff\x26\x25\xff\xff\x1a\x19\xff\xff" "\x0f\x0f\xff\xff\x08\x07\xff\xff\x03\x02\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5c\x5b\x00\x00" "\x47\x46\xec\xd1\x35\x34\xff\xff\x26\x25\xff\xff\x19\x19\xff\xff" "\x0f\x0f\xff\xff\x07\x07\xff\xff\x03\x02\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x5b\x00\x00" "\x46\x46\xee\xdc\x35\x34\xff\xff\x25\x25\xff\xff\x19\x18\xff\xff" "\x0f\x0f\xff\xff\x07\x07\xff\xff\x02\x02\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x5b\x00\x00" "\x46\x46\xf1\xe6\x34\x34\xff\xff\x25\x25\xff\xff\x19\x18\xff\xff" "\x0f\x0e\xff\xff\x07\x07\xff\xff\x02\x02\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x5a\x00\x00" "\x46\x46\xf3\xeb\x34\x34\xff\xff\x25\x25\xff\xff\x19\x18\xff\xff" "\x0f\x0e\xff\xff\x07\x07\xff\xff\x02\x02\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x5a\x00\x00" "\x46\x45\xf6\xed\x34\x34\xff\xff\x25\x25\xff\xff\x18\x18\xff\xff" "\x0e\x0e\xff\xff\x07\x07\xff\xff\x02\x02\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5b\x5a\x00\x00" "\x46\x45\xf8\xf0\x34\x34\xff\xff\x25\x25\xff\xff\x18\x18\xff\xff" "\x0e\x0e\xff\xff\x07\x07\xff\xff\x02\x02\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5a\x59\x00\x00" "\x45\x45\xfb\xf2\x34\x33\xff\xff\x25\x24\xff\xff\x18\x18\xff\xff" "\x0e\x0e\xff\xff\x07\x07\xff\xff\x02\x02\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" // Mipmap level 3. "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x01\x00\x5e\x5e\x17\x00\x5e\x5e\x3d\x00\x5e\x5b\x64\x00" "\x5e\x57\x82\x00\x5e\x54\x97\x00\x5e\x50\xac\x00\x5e\x4d\xc1\x00" "\x5e\x4c\xcd\x00\x5e\x4b\xd3\x00\x5e\x4a\xd9\x00\x5e\x49\xdf\x00" "\x5e\x48\xe5\x00\x5e\x47\xeb\x00\x5e\x47\xf1\x00\x5e\x46\xf8\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x2d\x00\x5e\x58\x74\x00\x5e\x4e\xb0\x00" "\x5e\x45\xeb\x00\x5e\x3f\xff\x00\x5e\x3a\xff\x00\x5e\x35\xff\x00" "\x5d\x32\xff\x00\x59\x2f\xff\x00\x56\x2d\xff\x00\x52\x2a\xff\x03" "\x51\x29\xff\x0d\x50\x29\xff\x13\x4f\x28\xff\x19\x4e\x27\xff\x1f" "\x4d\x27\xff\x25\x4c\x26\xff\x2b\x4b\x25\xff\x31\x4a\x25\xff\x38" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x0a\x00\x5e\x57\x6e\x00" "\x5e\x47\xcf\x00\x5e\x3a\xff\x00\x5d\x32\xff\x00\x53\x2b\xff\x02" "\x49\x24\xff\x2c\x44\x20\xff\x57\x3e\x1c\xff\x7d\x39\x19\xff\xa4" "\x36\x17\xff\xc2\x33\x15\xff\xd8\x31\x13\xff\xec\x2e\x12\xff\xfe" "\x2d\x11\xff\xff\x2d\x11\xff\xff\x2c\x10\xff\xff\x2b\x10\xff\xff" "\x2a\x10\xff\xff\x2a\x0f\xff\xff\x29\x0f\xff\xff\x28\x0e\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x01\x00\x5e\x57\x5e\x00\x5e\x42\xe3\x00\x5c\x31\xff\x00" "\x4c\x28\xff\x14\x3e\x1d\xff\x6d\x36\x17\xff\xb4\x2e\x12\xff\xef" "\x28\x0e\xff\xff\x24\x0c\xff\xff\x20\x09\xff\xff\x1c\x07\xff\xff" "\x1a\x06\xff\xff\x18\x05\xff\xff\x16\x05\xff\xff\x14\x04\xff\xff" "\x14\x04\xff\xff\x13\x03\xff\xff\x13\x03\xff\xff\x12\x03\xff\xff" "\x12\x03\xff\xff\x11\x03\xff\xff\x11\x02\xff\xff\x11\x02\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x0a\x00" "\x5e\x4b\xa6\x00\x5c\x35\xff\x00\x47\x26\xff\x2f\x35\x18\xff\xae" "\x2a\x12\xff\xfb\x20\x0b\xff\xff\x1a\x07\xff\xff\x15\x05\xff\xff" "\x11\x02\xff\xff\x0e\x01\xff\xff\x0b\x01\xff\xff\x09\x00\xff\xff" "\x08\x00\xff\xff\x07\x00\xff\xff\x06\x00\xff\xff\x05\x00\xff\xff" "\x05\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff\x04\x00\xff\xff" "\x04\x00\xff\xff\x04\x00\xff\xff\x03\x00\xff\xff\x03\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x0a\x00\x5e\x45\xc7\x00" "\x4f\x30\xff\x0f\x38\x1e\xff\x9e\x29\x10\xff\xfe\x1b\x0a\xff\xff" "\x14\x04\xff\xff\x0d\x02\xff\xff\x09\x00\xff\xff\x06\x00\xff\xff" "\x03\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x01\x00\x5e\x4a\xa7\x00\x49\x2f\xff\x26" "\x33\x1a\xff\xd8\x20\x0e\xff\xff\x14\x05\xff\xff\x0b\x01\xff\xff" "\x06\x00\xff\xff\x02\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x52\x60\x00\x4d\x33\xff\x20\x31\x1d\xff\xea" "\x1c\x0d\xff\xff\x0f\x04\xff\xff\x06\x00\xff\xff\x02\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x0a\x00\x55\x3e\xe5\x0b\x35\x23\xff\xd1\x1f\x0f\xff\xff" "\x0e\x05\xff\xff\x05\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x50\x6f\x00\x3f\x2d\xff\x83\x24\x18\xff\xff\x11\x08\xff\xff" "\x05\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x53\x41\xd0\x1c\x2f\x21\xff\xf6\x19\x0c\xff\xff\x09\x03\xff\xff" "\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5b\x2e\x00" "\x42\x34\xff\x88\x22\x1b\xff\xff\x0d\x0a\xff\xff\x04\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5c\x50\x75\x03" "\x35\x2c\xff\xe5\x1c\x14\xff\xff\x0a\x05\xff\xff\x01\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x51\x46\xb1\x43" "\x2d\x25\xff\xff\x14\x0f\xff\xff\x06\x03\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x01\x00\x47\x3d\xec\x84" "\x26\x1f\xff\xff\x0f\x0c\xff\xff\x03\x01\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x18\x00\x3e\x38\xff\xc0" "\x20\x1b\xff\xff\x0c\x08\xff\xff\x02\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x59\x3e\x03\x38\x33\xff\xf6" "\x1b\x17\xff\xff\x09\x07\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5a\x54\x64\x21\x33\x2e\xff\xff" "\x18\x14\xff\xff\x07\x05\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x54\x4e\x83\x48\x2f\x2b\xff\xff" "\x15\x12\xff\xff\x05\x04\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x4e\x49\x98\x6e\x2b\x28\xff\xff" "\x12\x10\xff\xff\x04\x03\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x49\x47\xad\x88\x28\x26\xff\xff" "\x10\x0f\xff\xff\x03\x03\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x48\x44\xc1\x9d\x26\x24\xff\xff" "\x0f\x0e\xff\xff\x03\x02\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x45\x43\xcd\xb2\x24\x23\xff\xff" "\x0e\x0d\xff\xff\x02\x02\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x43\x42\xd3\xc6\x23\x22\xff\xff" "\x0d\x0d\xff\xff\x02\x02\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x42\x41\xd9\xce\x22\x21\xff\xff" "\x0d\x0c\xff\xff\x02\x02\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x41\x40\xdf\xd4\x22\x21\xff\xff" "\x0c\x0c\xff\xff\x02\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x40\x3f\xe5\xda\x21\x20\xff\xff" "\x0c\x0c\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x3f\x3e\xeb\xe1\x20\x20\xff\xff" "\x0c\x0b\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x3e\x3e\xf2\xe7\x20\x1f\xff\xff" "\x0b\x0b\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x3e\x3d\xf8\xed\x1f\x1e\xff\xff" "\x0b\x0a\xff\xff\x01\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" // Mipmap level 4. "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x04\x00\x5e\x5e\x3c\x00" "\x5e\x57\x7e\x00\x5e\x4d\x9e\x00\x5e\x45\xbb\x00\x5e\x3d\xd8\x01" "\x5e\x39\xe8\x08\x5e\x37\xee\x0e\x5e\x36\xf4\x14\x5e\x34\xfb\x1b" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00" "\x5e\x5e\x0d\x00\x5e\x4f\x90\x00\x5e\x33\xed\x13\x48\x22\xff\x5c" "\x35\x17\xff\x9f\x2e\x12\xff\xbe\x27\x0e\xff\xdb\x21\x0a\xff\xf7" "\x1f\x09\xff\xff\x1e\x08\xff\xff\x1c\x08\xff\xff\x1b\x07\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x33\x00" "\x5b\x36\xdf\x1c\x2f\x17\xff\xb0\x1b\x07\xff\xfd\x0f\x02\xff\xff" "\x08\x00\xff\xff\x05\x00\xff\xff\x03\x00\xff\xff\x01\x00\xff\xff" "\x01\x00\xff\xff\x01\x00\xff\xff\x01\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x0d\x00\x4d\x33\xdf\x47" "\x20\x0e\xff\xf0\x0a\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x4a\x90\x16\x25\x15\xff\xeb" "\x05\x01\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x04\x00\x39\x2e\xed\xa1\x0c\x05\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x5e\x5e\x3c\x07\x26\x1d\xff\xf3\x03\x01\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x59\x51\x7f\x46\x17\x12\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x4c\x47\x9f\x84\x10\x0e\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x42\x3c\xbc\xa2\x0c\x0a\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x37\x34\xd9\xbf\x08\x07\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x32\x31\xe8\xdc\x06\x06\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x30\x2f\xee\xe9\x06\x05\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x2f\x2e\xf4\xef\x05\x05\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x00\x00\x2d\x2c\xfb\xf5\x05\x04\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" // Mipmap level 5. "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x12\x00" "\x5e\x5e\x45\x00\x5e\x5e\x55\x00\x5e\x5e\x65\x00\x5e\x5e\x75\x06" "\x5e\x5e\x00\x00\x5e\x5e\x0d\x00\x5e\x42\xa1\x34\x30\x11\xfc\x9d" "\x18\x05\xff\xd5\x13\x03\xff\xe5\x0e\x01\xff\xf5\x0a\x00\xff\xff" "\x5e\x5e\x00\x00\x57\x3f\xa1\x53\x05\x00\xff\xfd\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x12\x03\x13\x0e\xfc\xe7\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x45\x34\x05\x03\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x56\x4f\x02\x02\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x5e\x5e\x65\x5e\x01\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x58\x55\x75\x6e\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" // Mipmap level 6. "\x5e\x5e\x03\x00\x5e\x5e\x5a\x25\x53\x2b\xa7\x6f\x3f\x1d\xb7\x7f" "\x5e\x5e\x5b\x3f\x00\x00\xff\xfe\x00\x00\xff\xff\x00\x00\xff\xff" "\x28\x24\xa7\x9f\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" "\x19\x18\xb7\xb3\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff" // Mipmap level 7. "\x5e\x5e\x70\x5a\x00\x00\xd8\xbc\x00\x00\xd8\xd5\x00\x00\xff\xff" // Mipmap level 8. "\x00\x00\xb7\xab" , // Mipmap level 0. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x04\x00\x00\x00\x0f\x00\x00\x00\x18\x00\x00\x00" "\x1f\x00\x00\x00\x27\x00\x00\x00\x2f\x00\x00\x00\x36\x00\x00\x00" "\x3e\x00\x00\x00\x46\x00\x00\x00\x4e\x00\x00\x00\x55\x00\x00\x00" "\x5d\x00\x01\x00\x65\x00\x01\x00\x6c\x00\x01\x00\x74\x00\x01\x00" "\x7c\x00\x01\x00\x83\x00\x01\x00\x8b\x00\x01\x00\x93\x00\x01\x00" "\x9a\x00\x02\x00\x9e\x00\x02\x00\xa2\x00\x02\x00\xa6\x00\x02\x00" "\xab\x00\x02\x00\xaf\x00\x02\x00\xb3\x00\x02\x00\xb8\x00\x02\x00" "\xbc\x00\x03\x00\xc0\x00\x03\x00\xc4\x00\x03\x00\xc9\x00\x03\x00" "\xcd\x00\x03\x00\xd1\x00\x03\x00\xd5\x00\x03\x00\xda\x00\x03\x00" "\xde\x00\x03\x00\xe2\x00\x03\x00\xe6\x00\x03\x00\xe9\x00\x03\x00" "\xeb\x00\x03\x00\xec\x00\x03\x00\xed\x00\x03\x00\xee\x00\x03\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x15\x00\x00\x00" "\x27\x00\x00\x00\x39\x00\x01\x00\x48\x00\x01\x00\x55\x00\x01\x00" "\x61\x00\x02\x00\x6e\x00\x02\x00\x7a\x00\x02\x00\x87\x00\x03\x00" "\x93\x00\x03\x00\xa0\x00\x03\x00\xac\x00\x04\x00\xb9\x00\x04\x00" "\xc5\x00\x04\x00\xd1\x00\x04\x00\xde\x00\x05\x00\xea\x00\x05\x00" "\xf7\x00\x05\x00\xff\x00\x05\x00\xff\x00\x06\x00\xff\x00\x06\x00" "\xff\x00\x06\x00\xff\x00\x06\x00\xff\x00\x06\x00\xff\x00\x07\x00" "\xff\x00\x07\x00\xff\x00\x07\x00\xff\x00\x07\x00\xff\x00\x07\x00" "\xff\x00\x08\x00\xff\x00\x08\x00\xff\x00\x08\x00\xff\x00\x08\x00" "\xff\x00\x08\x00\xff\x00\x08\x00\xff\x00\x08\x00\xff\x00\x09\x00" "\xff\x00\x09\x00\xff\x00\x09\x00\xff\x00\x09\x00\xff\x00\x09\x00" "\xff\x00\x09\x00\xff\x00\x09\x00\xff\x00\x09\x00\xff\x00\x09\x00" "\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00" "\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00" "\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00" "\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x02\x00\x00\x00\x14\x00\x01\x00\x2a\x00\x01\x00\x3d\x00\x02\x00" "\x4f\x00\x02\x00\x61\x00\x03\x00\x73\x00\x03\x00\x85\x00\x04\x00" "\x97\x00\x04\x00\xa9\x00\x05\x00\xbb\x00\x05\x00\xcd\x00\x06\x00" "\xdf\x00\x06\x00\xf1\x00\x06\x00\xff\x00\x07\x00\xff\x00\x07\x00" "\xff\x00\x07\x00\xff\x00\x08\x00\xff\x00\x08\x00\xff\x00\x08\x00" "\xff\x00\x09\x00\xff\x00\x09\x00\xff\x00\x09\x00\xff\x00\x0a\x00" "\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0b\x00\xff\x00\x0b\x00" "\xff\x00\x0b\x00\xff\x00\x0b\x00\xff\x00\x0c\x00\xff\x00\x0c\x00" "\xff\x00\x0c\x00\xff\x00\x0c\x00\xff\x00\x0d\x00\xff\x00\x0d\x00" "\xff\x00\x0d\x00\xff\x00\x0d\x00\xff\x00\x0d\x00\xff\x00\x0e\x00" "\xff\x00\x0e\x00\xff\x00\x0e\x00\xff\x00\x0e\x00\xff\x00\x0e\x00" "\xff\x00\x0f\x00\xff\x00\x0f\x00\xff\x00\x0f\x00\xff\x00\x0f\x00" "\xff\x00\x0f\x00\xff\x00\x0f\x00\xff\x00\x0f\x00\xff\x00\x0f\x00" "\xff\x00\x10\x00\xff\x00\x10\x00\xff\x00\x10\x00\xff\x00\x10\x00" "\xff\x00\x10\x00\xff\x00\x10\x00\xff\x00\x10\x00\xff\x00\x10\x00" "\xff\x00\x11\x00\xff\x00\x11\x00\xff\x00\x11\x00\xff\x00\x11\x00" "\xff\x00\x11\x00\xff\x00\x11\x00\xff\x00\x11\x00\xff\x00\x11\x00" "\xff\x00\x11\x00\xff\x00\x11\x00\xff\x00\x11\x00\xff\x00\x11\x00" "\xff\x00\x11\x00\xff\x00\x11\x00\xff\x00\x11\x00\xff\x00\x11\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x06\x00\x01\x00\x1e\x00\x02\x00" "\x36\x00\x03\x00\x4f\x00\x04\x00\x68\x00\x04\x00\x80\x00\x05\x00" "\x99\x00\x05\x00\xb2\x00\x06\x00\xca\x00\x06\x00\xe3\x00\x07\x00" "\xfa\x00\x07\x00\xff\x00\x08\x00\xff\x00\x08\x00\xff\x00\x09\x00" "\xff\x00\x09\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0b\x00" "\xff\x00\x0b\x00\xff\x00\x0c\x00\xff\x00\x0c\x00\xff\x00\x0d\x00" "\xff\x00\x0d\x00\xff\x00\x0d\x00\xff\x00\x0e\x00\xff\x00\x0e\x00" "\xff\x00\x0e\x00\xff\x00\x0f\x00\xff\x00\x0f\x00\xff\x00\x0f\x00" "\xff\x00\x10\x00\xff\x00\x10\x00\xff\x00\x10\x00\xff\x00\x11\x00" "\xff\x00\x11\x00\xff\x00\x11\x00\xff\x00\x12\x00\xff\x00\x12\x00" "\xff\x00\x12\x00\xff\x00\x12\x00\xff\x00\x13\x00\xff\x00\x13\x00" "\xff\x00\x13\x00\xff\x00\x13\x00\xff\x00\x13\x00\xff\x00\x14\x00" "\xff\x00\x14\x00\xff\x00\x14\x00\xff\x00\x14\x00\xff\x00\x14\x00" "\xff\x00\x15\x00\xff\x00\x15\x00\xff\x00\x15\x00\xff\x00\x15\x00" "\xff\x00\x15\x00\xff\x00\x16\x00\xff\x00\x16\x00\xff\x00\x16\x00" "\xff\x00\x16\x00\xff\x00\x16\x00\xff\x00\x16\x00\xff\x00\x16\x00" "\xff\x00\x16\x00\xff\x00\x17\x00\xff\x00\x17\x00\xff\x00\x17\x00" "\xff\x00\x17\x00\xff\x00\x17\x00\xff\x00\x17\x00\xff\x00\x17\x00" "\xff\x00\x17\x00\xff\x00\x17\x00\xff\x00\x18\x00\xff\x00\x18\x00" "\xff\x00\x18\x00\xff\x00\x18\x00\xff\x00\x18\x00\xff\x00\x18\x00" "\xff\x00\x18\x00\xff\x00\x18\x00\xff\x00\x18\x00\xff\x00\x18\x00" "\xff\x00\x18\x00\xff\x00\x18\x00\xff\x00\x18\x00\xff\x00\x18\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x02\x00\x01\x00\x02\x00\x17\x00\x03\x00\x38\x00\x04\x00" "\x59\x00\x04\x00\x7a\x00\x05\x00\x9b\x00\x06\x00\xba\x00\x06\x00" "\xd4\x00\x07\x00\xec\x00\x08\x00\xff\x00\x09\x00\xff\x00\x09\x00" "\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0b\x00\xff\x00\x0c\x00" "\xff\x00\x0c\x00\xff\x00\x0d\x00\xff\x00\x0d\x00\xff\x00\x0e\x00" "\xff\x00\x0e\x00\xff\x00\x0f\x00\xff\x00\x0f\x00\xff\x00\x10\x00" "\xff\x00\x10\x00\xff\x00\x11\x00\xff\x00\x11\x00\xff\x00\x12\x00" "\xff\x00\x12\x00\xff\x00\x13\x00\xff\x00\x13\x00\xff\x00\x13\x00" "\xff\x00\x14\x00\xff\x00\x14\x00\xff\x00\x14\x00\xff\x00\x15\x00" "\xff\x00\x15\x00\xff\x00\x15\x00\xff\x00\x16\x00\xff\x00\x16\x00" "\xff\x00\x16\x00\xff\x00\x17\x00\xff\x00\x17\x00\xff\x00\x17\x00" "\xff\x00\x18\x00\xff\x00\x18\x00\xff\x00\x18\x00\xff\x00\x19\x00" "\xff\x00\x19\x00\xff\x00\x19\x00\xff\x00\x19\x00\xff\x00\x1a\x00" "\xff\x00\x1a\x00\xff\x00\x1a\x00\xff\x00\x1a\x00\xff\x00\x1a\x00" "\xff\x00\x1b\x00\xff\x00\x1b\x00\xff\x00\x1b\x00\xff\x00\x1b\x00" "\xff\x00\x1b\x00\xff\x00\x1c\x00\xff\x00\x1c\x00\xff\x00\x1c\x00" "\xff\x00\x1c\x00\xff\x00\x1c\x00\xff\x00\x1c\x00\xff\x00\x1d\x00" "\xff\x00\x1d\x00\xff\x00\x1d\x00\xff\x00\x1d\x00\xff\x00\x1d\x00" "\xff\x00\x1d\x00\xff\x00\x1d\x00\xff\x00\x1d\x00\xff\x00\x1d\x00" "\xff\x00\x1e\x00\xff\x00\x1e\x00\xff\x00\x1e\x00\xff\x00\x1e\x00" "\xff\x00\x1e\x00\xff\x00\x1e\x00\xff\x00\x1e\x00\xff\x00\x1e\x00" "\xff\x00\x1e\x00\xff\x00\x1e\x00\xff\x00\x1f\x00\xff\x00\x1f\x00" "\xff\x00\x1f\x00\xff\x00\x1f\x00\xff\x00\x1f\x00\xff\x00\x1f\x00" "\xff\x00\x1f\x00\xff\x00\x1f\x00\xff\x00\x1f\x00\xff\x00\x1f\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x01\x00\x00\x00\x02\x00\x10\x00\x03\x00\x31\x00\x04\x00" "\x52\x00\x05\x00\x73\x00\x06\x00\x94\x00\x07\x00\xb5\x00\x08\x00" "\xd6\x00\x09\x00\xf6\x00\x09\x00\xff\x00\x0a\x00\xff\x00\x0b\x00" "\xff\x00\x0b\x00\xff\x00\x0c\x00\xff\x00\x0d\x00\xff\x00\x0d\x00" "\xff\x00\x0e\x00\xff\x00\x0f\x00\xff\x00\x0f\x00\xff\x00\x10\x00" "\xff\x00\x11\x00\xff\x00\x11\x00\xff\x00\x12\x00\xff\x00\x13\x00" "\xff\x00\x13\x00\xff\x00\x14\x00\xff\x00\x14\x00\xff\x00\x15\x00" "\xff\x00\x15\x00\xff\x00\x16\x00\xff\x00\x16\x00\xff\x00\x17\x00" "\xff\x00\x17\x00\xff\x00\x17\x00\xff\x00\x18\x00\xff\x00\x18\x00" "\xff\x00\x19\x00\xff\x00\x19\x00\xff\x00\x1a\x00\xff\x00\x1a\x00" "\xff\x00\x1b\x00\xff\x00\x1b\x00\xff\x00\x1b\x00\xff\x00\x1c\x00" "\xff\x00\x1c\x00\xff\x00\x1c\x00\xff\x00\x1d\x00\xff\x00\x1d\x00" "\xff\x00\x1d\x00\xff\x00\x1d\x00\xff\x00\x1e\x00\xff\x00\x1e\x00" "\xff\x00\x1e\x00\xff\x00\x1f\x00\xff\x00\x1f\x00\xff\x00\x1f\x00" "\xff\x00\x20\x00\xff\x00\x20\x00\xff\x00\x20\x00\xff\x00\x20\x00" "\xff\x00\x20\x00\xff\x00\x21\x00\xff\x00\x21\x00\xff\x00\x21\x00" "\xff\x00\x21\x00\xff\x00\x21\x00\xff\x00\x22\x00\xff\x00\x22\x00" "\xff\x00\x22\x00\xff\x00\x22\x00\xff\x00\x22\x00\xff\x00\x23\x00" "\xff\x00\x23\x00\xff\x00\x23\x00\xff\x00\x23\x00\xff\x00\x23\x00" "\xff\x00\x23\x00\xff\x00\x23\x00\xff\x00\x23\x00\xff\x00\x24\x00" "\xff\x00\x24\x00\xff\x00\x24\x00\xff\x00\x24\x00\xff\x00\x24\x00" "\xff\x00\x24\x00\xff\x00\x24\x00\xff\x00\x24\x00\xff\x00\x24\x00" "\xff\x00\x25\x00\xff\x00\x25\x00\xff\x00\x25\x00\xff\x00\x25\x00" "\xff\x00\x25\x00\xff\x00\x25\x00\xff\x00\x25\x00\xff\x00\x25\x00" "\xff\x00\x25\x00\xff\x00\x25\x00\xff\x00\x25\x00\xff\x00\x25\x00" "\xff\x00\x25\x00\xff\x00\x25\x00\xff\x00\x25\x00\xff\x00\x25\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x01\x00\x04\x00" "\x19\x00\x05\x00\x44\x00\x06\x00\x6e\x00\x07\x00\x99\x00\x08\x00" "\xc4\x00\x09\x00\xed\x00\x09\x00\xff\x00\x0a\x00\xff\x00\x0b\x00" "\xff\x00\x0c\x00\xff\x00\x0d\x00\xff\x00\x0e\x00\xff\x00\x0f\x00" "\xff\x00\x10\x00\xff\x00\x10\x00\xff\x00\x11\x00\xff\x00\x12\x00" "\xff\x00\x12\x00\xff\x00\x13\x00\xff\x00\x14\x00\xff\x00\x14\x00" "\xff\x00\x15\x00\xff\x00\x16\x00\xff\x00\x16\x00\xff\x00\x17\x00" "\xff\x00\x18\x00\xff\x00\x18\x00\xff\x00\x19\x00\xff\x00\x19\x00" "\xff\x00\x1a\x00\xff\x00\x1a\x00\xff\x00\x1b\x00\xff\x00\x1b\x00" "\xff\x00\x1c\x00\xff\x00\x1c\x00\xff\x00\x1d\x00\xff\x00\x1d\x00" "\xff\x00\x1e\x00\xff\x00\x1e\x00\xff\x00\x1f\x00\xff\x00\x1f\x00" "\xff\x00\x20\x00\xff\x00\x20\x00\xff\x00\x20\x00\xff\x00\x21\x00" "\xff\x00\x21\x00\xff\x00\x22\x00\xff\x00\x22\x00\xff\x00\x22\x00" "\xff\x00\x22\x00\xff\x00\x23\x00\xff\x00\x23\x00\xff\x00\x23\x00" "\xff\x00\x24\x00\xff\x00\x24\x00\xff\x00\x24\x00\xff\x00\x25\x00" "\xff\x00\x25\x00\xff\x00\x25\x00\xff\x00\x26\x00\xff\x00\x26\x00" "\xff\x00\x26\x00\xff\x00\x26\x00\xff\x00\x27\x00\xff\x00\x27\x00" "\xff\x00\x27\x00\xff\x00\x27\x00\xff\x00\x27\x00\xff\x00\x28\x00" "\xff\x00\x28\x00\xff\x00\x28\x00\xff\x00\x28\x00\xff\x00\x28\x00" "\xff\x00\x28\x00\xff\x00\x29\x00\xff\x00\x29\x00\xff\x00\x29\x00" "\xff\x00\x29\x00\xff\x00\x29\x00\xff\x00\x2a\x00\xff\x00\x2a\x00" "\xff\x00\x2a\x00\xff\x00\x2a\x00\xff\x00\x2a\x00\xff\x00\x2a\x00" "\xff\x00\x2a\x00\xff\x00\x2a\x00\xff\x00\x2a\x00\xff\x00\x2a\x00" "\xff\x00\x2b\x00\xff\x00\x2b\x00\xff\x00\x2b\x00\xff\x00\x2b\x00" "\xff\x00\x2b\x00\xff\x00\x2b\x00\xff\x00\x2b\x00\xff\x00\x2b\x00" "\xff\x00\x2b\x00\xff\x00\x2b\x00\xff\x00\x2b\x00\xff\x00\x2c\x00" "\xff\x00\x2c\x00\xff\x00\x2c\x00\xff\x00\x2c\x00\xff\x00\x2c\x00" "\xff\x00\x2c\x00\xff\x00\x2c\x00\xff\x00\x2c\x00\xff\x00\x2c\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00" "\x00\x00\x03\x00\x01\x00\x04\x00\x1a\x00\x05\x00\x45\x00\x07\x00" "\x6f\x00\x08\x00\x9a\x00\x09\x00\xc4\x00\x0a\x00\xef\x00\x0b\x00" "\xff\x00\x0c\x00\xff\x00\x0d\x00\xff\x00\x0e\x00\xff\x00\x0f\x00" "\xff\x00\x10\x00\xff\x00\x10\x00\xff\x00\x11\x00\xff\x00\x12\x00" "\xff\x00\x13\x00\xff\x00\x14\x00\xff\x00\x15\x00\xff\x00\x16\x00" "\xff\x00\x17\x00\xff\x00\x17\x00\xff\x00\x18\x00\xff\x00\x18\x00" "\xff\x00\x19\x00\xff\x00\x1a\x00\xff\x00\x1a\x00\xff\x00\x1b\x00" "\xff\x00\x1c\x00\xff\x00\x1c\x00\xff\x00\x1d\x00\xff\x00\x1e\x00" "\xff\x00\x1e\x00\xff\x00\x1f\x00\xff\x00\x20\x00\xff\x00\x20\x00" "\xff\x00\x21\x00\xff\x00\x21\x00\xff\x00\x22\x00\xff\x00\x22\x00" "\xff\x00\x22\x00\xff\x00\x23\x00\xff\x00\x23\x00\xff\x00\x24\x00" "\xff\x00\x24\x00\xff\x00\x25\x00\xff\x00\x25\x00\xff\x00\x26\x00" "\xff\x00\x26\x00\xff\x00\x27\x00\xff\x00\x27\x00\xff\x00\x27\x00" "\xff\x00\x28\x00\xff\x00\x28\x00\xff\x00\x28\x00\xff\x00\x29\x00" "\xff\x00\x29\x00\xff\x00\x29\x00\xff\x00\x2a\x00\xff\x00\x2a\x00" "\xff\x00\x2a\x00\xff\x00\x2b\x00\xff\x00\x2b\x00\xff\x00\x2b\x00" "\xff\x00\x2b\x00\xff\x00\x2c\x00\xff\x00\x2c\x00\xff\x00\x2c\x00" "\xff\x00\x2d\x00\xff\x00\x2d\x00\xff\x00\x2d\x00\xff\x00\x2d\x00" "\xff\x00\x2d\x00\xff\x00\x2d\x00\xff\x00\x2e\x00\xff\x00\x2e\x00" "\xff\x00\x2e\x00\xff\x00\x2e\x00\xff\x00\x2e\x00\xff\x00\x2f\x00" "\xff\x00\x2f\x00\xff\x00\x2f\x00\xff\x00\x2f\x00\xff\x00\x2f\x00" "\xff\x00\x30\x00\xff\x00\x30\x00\xff\x00\x30\x00\xff\x00\x30\x00" "\xff\x00\x30\x00\xff\x00\x30\x00\xff\x00\x30\x00\xff\x00\x30\x00" "\xff\x00\x31\x00\xff\x00\x31\x00\xff\x00\x31\x00\xff\x00\x31\x00" "\xff\x00\x31\x00\xff\x00\x31\x00\xff\x00\x31\x00\xff\x00\x31\x00" "\xff\x00\x31\x00\xff\x00\x31\x00\xff\x00\x32\x00\xff\x00\x32\x00" "\xff\x00\x32\x00\xff\x00\x32\x00\xff\x00\x32\x00\xff\x00\x32\x00" "\xff\x00\x32\x00\xff\x00\x32\x00\xff\x00\x32\x00\xff\x00\x32\x00" "\xff\x00\x32\x00\xff\x00\x32\x00\xff\x00\x32\x00\xff\x00\x32\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00" "\x01\x00\x05\x00\x21\x00\x07\x00\x57\x00\x08\x00\x8d\x00\x09\x00" "\xc3\x00\x0a\x00\xef\x00\x0b\x00\xff\x00\x0c\x00\xff\x00\x0e\x00" "\xff\x00\x0f\x00\xff\x00\x10\x00\xff\x00\x11\x00\xff\x00\x12\x00" "\xff\x00\x13\x00\xff\x00\x14\x00\xff\x00\x15\x00\xff\x00\x15\x00" "\xff\x00\x16\x00\xff\x00\x17\x00\xff\x00\x18\x00\xff\x00\x19\x00" "\xff\x00\x1a\x00\xff\x00\x1b\x00\xff\x00\x1c\x00\xff\x00\x1c\x00" "\xff\x00\x1d\x00\xff\x00\x1e\x00\xff\x00\x1f\x00\xff\x00\x1f\x00" "\xff\x00\x20\x00\xff\x00\x20\x00\xff\x00\x21\x00\xff\x00\x22\x00" "\xff\x00\x22\x00\xff\x00\x23\x00\xff\x00\x24\x00\xff\x00\x24\x00" "\xff\x00\x25\x00\xff\x00\x25\x00\xff\x00\x26\x00\xff\x00\x27\x00" "\xff\x00\x27\x00\xff\x00\x28\x00\xff\x00\x28\x00\xff\x00\x28\x00" "\xff\x00\x29\x00\xff\x00\x29\x00\xff\x00\x2a\x00\xff\x00\x2a\x00" "\xff\x00\x2b\x00\xff\x00\x2b\x00\xff\x00\x2c\x00\xff\x00\x2c\x00" "\xff\x00\x2c\x00\xff\x00\x2d\x00\xff\x00\x2d\x00\xff\x00\x2e\x00" "\xff\x00\x2e\x00\xff\x00\x2e\x00\xff\x00\x2f\x00\xff\x00\x2f\x00" "\xff\x00\x2f\x00\xff\x00\x30\x00\xff\x00\x30\x00\xff\x00\x30\x00" "\xff\x00\x31\x00\xff\x00\x31\x00\xff\x00\x31\x00\xff\x00\x31\x00" "\xff\x00\x32\x00\xff\x00\x32\x00\xff\x00\x32\x00\xff\x00\x33\x00" "\xff\x00\x33\x00\xff\x00\x33\x00\xff\x00\x33\x00\xff\x00\x33\x00" "\xff\x00\x34\x00\xff\x00\x34\x00\xff\x00\x34\x00\xff\x00\x34\x00" "\xff\x00\x34\x00\xff\x00\x35\x00\xff\x00\x35\x00\xff\x00\x35\x00" "\xff\x00\x35\x00\xff\x00\x35\x00\xff\x00\x35\x00\xff\x00\x36\x00" "\xff\x00\x36\x00\xff\x00\x36\x00\xff\x00\x36\x00\xff\x00\x36\x00" "\xff\x00\x36\x00\xff\x00\x36\x00\xff\x00\x36\x00\xff\x00\x37\x00" "\xff\x00\x37\x00\xff\x00\x37\x00\xff\x00\x37\x00\xff\x00\x37\x00" "\xff\x00\x37\x00\xff\x00\x37\x00\xff\x00\x37\x00\xff\x00\x37\x00" "\xff\x00\x38\x00\xff\x00\x38\x00\xff\x00\x38\x00\xff\x00\x38\x00" "\xff\x00\x38\x00\xff\x00\x38\x00\xff\x00\x38\x00\xff\x00\x38\x00" "\xff\x00\x38\x00\xff\x00\x38\x00\xff\x00\x38\x00\xff\x00\x38\x00" "\xff\x00\x38\x00\xff\x00\x38\x00\xff\x00\x38\x00\xff\x00\x38\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x06\x00" "\x13\x00\x07\x00\x48\x00\x09\x00\x7e\x00\x0a\x00\xb4\x00\x0b\x00" "\xea\x00\x0d\x00\xff\x00\x0e\x00\xff\x00\x0f\x00\xff\x00\x10\x00" "\xff\x00\x11\x00\xff\x00\x12\x00\xff\x00\x13\x00\xff\x00\x14\x00" "\xff\x00\x16\x00\xff\x00\x17\x00\xff\x00\x18\x00\xff\x00\x19\x00" "\xff\x00\x1a\x00\xff\x00\x1a\x00\xff\x00\x1b\x00\xff\x00\x1c\x00" "\xff\x00\x1d\x00\xff\x00\x1e\x00\xff\x00\x1f\x00\xff\x00\x20\x00" "\xff\x00\x20\x00\xff\x00\x21\x00\xff\x00\x22\x00\xff\x00\x23\x00" "\xff\x00\x24\x00\xff\x00\x24\x00\xff\x00\x25\x00\xff\x00\x26\x00" "\xff\x00\x26\x00\xff\x00\x27\x00\xff\x00\x27\x00\xff\x00\x28\x00" "\xff\x00\x29\x00\xff\x00\x29\x00\xff\x00\x2a\x00\xff\x00\x2b\x00" "\xff\x00\x2b\x00\xff\x00\x2c\x00\xff\x00\x2c\x00\xff\x00\x2d\x00" "\xff\x00\x2d\x00\xff\x00\x2e\x00\xff\x00\x2e\x00\xff\x00\x2f\x00" "\xff\x00\x2f\x00\xff\x00\x30\x00\xff\x00\x30\x00\xff\x00\x31\x00" "\xff\x00\x31\x00\xff\x00\x31\x00\xff\x00\x32\x00\xff\x00\x32\x00" "\xff\x00\x33\x00\xff\x00\x33\x00\xff\x00\x34\x00\xff\x00\x34\x00" "\xff\x00\x34\x00\xff\x00\x35\x00\xff\x00\x35\x00\xff\x00\x35\x00" "\xff\x00\x36\x00\xff\x00\x36\x00\xff\x00\x36\x00\xff\x00\x36\x00" "\xff\x00\x37\x00\xff\x00\x37\x00\xff\x00\x37\x00\xff\x00\x38\x00" "\xff\x00\x38\x00\xff\x00\x38\x00\xff\x00\x39\x00\xff\x00\x39\x00" "\xff\x00\x39\x00\xff\x00\x39\x00\xff\x00\x39\x00\xff\x00\x3a\x00" "\xff\x00\x3a\x00\xff\x00\x3a\x00\xff\x00\x3a\x00\xff\x00\x3a\x00" "\xff\x00\x3a\x00\xff\x00\x3b\x00\xff\x00\x3b\x00\xff\x00\x3b\x00" "\xff\x00\x3b\x00\xff\x00\x3b\x00\xff\x00\x3c\x00\xff\x00\x3c\x00" "\xff\x00\x3c\x00\xff\x00\x3c\x00\xff\x00\x3c\x00\xff\x00\x3c\x00" "\xff\x00\x3c\x00\xff\x00\x3c\x00\xff\x00\x3d\x00\xff\x00\x3d\x00" "\xff\x00\x3d\x00\xff\x00\x3d\x00\xff\x00\x3d\x00\xff\x00\x3d\x00" "\xff\x00\x3d\x00\xff\x00\x3d\x00\xff\x00\x3d\x00\xff\x00\x3d\x00" "\xff\x00\x3e\x00\xff\x00\x3e\x00\xff\x00\x3e\x00\xff\x00\x3e\x00" "\xff\x00\x3e\x00\xff\x00\x3e\x00\xff\x00\x3e\x00\xff\x00\x3e\x00" "\xff\x00\x3e\x00\xff\x00\x3e\x00\xff\x00\x3e\x00\xff\x00\x3e\x00" "\xff\x00\x3e\x00\xff\x00\x3e\x00\xff\x00\x3e\x00\xff\x00\x3e\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x06\x00\x04\x00\x07\x00" "\x37\x00\x09\x00\x6f\x00\x0a\x00\xa5\x00\x0c\x00\xdc\x00\x0d\x00" "\xff\x00\x0e\x00\xff\x00\x10\x00\xff\x00\x11\x00\xff\x00\x12\x00" "\xff\x00\x13\x00\xff\x00\x15\x00\xff\x00\x16\x00\xff\x00\x17\x00" "\xff\x00\x18\x00\xff\x00\x19\x00\xff\x00\x1a\x00\xff\x00\x1b\x00" "\xff\x00\x1c\x00\xff\x00\x1d\x00\xff\x00\x1e\x00\xff\x00\x1f\x00" "\xff\x00\x20\x00\xff\x00\x21\x00\xff\x00\x22\x00\xff\x00\x23\x00" "\xff\x00\x23\x00\xff\x00\x24\x00\xff\x00\x25\x00\xff\x00\x26\x00" "\xff\x00\x27\x00\xff\x00\x28\x00\xff\x00\x28\x00\xff\x00\x29\x00" "\xff\x00\x2a\x00\xff\x00\x2b\x00\xff\x00\x2b\x00\xff\x00\x2c\x00" "\xff\x00\x2d\x00\xff\x00\x2d\x00\xff\x00\x2e\x00\xff\x00\x2e\x00" "\xff\x00\x2f\x00\xff\x00\x30\x00\xff\x00\x30\x00\xff\x00\x31\x00" "\xff\x00\x31\x00\xff\x00\x32\x00\xff\x00\x33\x00\xff\x00\x33\x00" "\xff\x00\x34\x00\xff\x00\x34\x00\xff\x00\x35\x00\xff\x00\x35\x00" "\xff\x00\x35\x00\xff\x00\x36\x00\xff\x00\x36\x00\xff\x00\x37\x00" "\xff\x00\x37\x00\xff\x00\x38\x00\xff\x00\x38\x00\xff\x00\x38\x00" "\xff\x00\x39\x00\xff\x00\x39\x00\xff\x00\x3a\x00\xff\x00\x3a\x00" "\xff\x00\x3a\x00\xff\x00\x3b\x00\xff\x00\x3b\x00\xff\x00\x3b\x00" "\xff\x00\x3c\x00\xff\x00\x3c\x00\xff\x00\x3c\x00\xff\x00\x3c\x00" "\xff\x00\x3d\x00\xff\x00\x3d\x00\xff\x00\x3d\x00\xff\x00\x3e\x00" "\xff\x00\x3e\x00\xff\x00\x3e\x00\xff\x00\x3f\x00\xff\x00\x3f\x00" "\xff\x00\x3f\x00\xff\x00\x3f\x00\xff\x00\x3f\x00\xff\x00\x40\x00" "\xff\x00\x40\x00\xff\x00\x40\x00\xff\x00\x40\x00\xff\x00\x40\x00" "\xff\x00\x40\x00\xff\x00\x41\x00\xff\x00\x41\x00\xff\x00\x41\x00" "\xff\x00\x41\x00\xff\x00\x41\x00\xff\x00\x41\x00\xff\x00\x42\x00" "\xff\x00\x42\x00\xff\x00\x42\x00\xff\x00\x42\x00\xff\x00\x42\x00" "\xff\x00\x42\x00\xff\x00\x42\x00\xff\x00\x43\x00\xff\x00\x43\x00" "\xff\x00\x43\x00\xff\x00\x43\x00\xff\x00\x43\x00\xff\x00\x43\x00" "\xff\x00\x43\x00\xff\x00\x43\x00\xff\x00\x43\x00\xff\x00\x43\x00" "\xff\x00\x44\x00\xff\x00\x44\x00\xff\x00\x44\x00\xff\x00\x44\x00" "\xff\x00\x44\x00\xff\x00\x44\x00\xff\x00\x44\x00\xff\x00\x44\x00" "\xff\x00\x44\x00\xff\x00\x44\x00\xff\x00\x44\x00\xff\x00\x44\x00" "\xff\x00\x44\x00\xff\x00\x44\x00\xff\x00\x44\x00\xff\x00\x44\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x03\x00\x00\x00\x05\x00\x00\x00\x07\x00\x01\x00\x08\x00" "\x28\x00\x0a\x00\x6c\x00\x0b\x00\xb0\x00\x0d\x00\xf1\x00\x0e\x00" "\xff\x00\x10\x00\xff\x00\x11\x00\xff\x00\x12\x00\xff\x00\x14\x00" "\xff\x00\x15\x00\xff\x00\x16\x00\xff\x00\x18\x00\xff\x00\x19\x00" "\xff\x00\x1a\x00\xff\x00\x1b\x00\xff\x00\x1c\x00\xff\x00\x1d\x00" "\xff\x00\x1e\x00\xff\x00\x20\x00\xff\x00\x20\x00\xff\x00\x21\x00" "\xff\x00\x22\x00\xff\x00\x24\x00\xff\x00\x25\x00\xff\x00\x26\x00" "\xff\x00\x27\x00\xff\x00\x28\x00\xff\x00\x28\x00\xff\x00\x29\x00" "\xff\x00\x2a\x00\xff\x00\x2b\x00\xff\x00\x2b\x00\xff\x00\x2d\x00" "\xff\x00\x2d\x00\xff\x00\x2e\x00\xff\x00\x2f\x00\xff\x00\x2f\x00" "\xff\x00\x30\x00\xff\x00\x31\x00\xff\x00\x32\x00\xff\x00\x32\x00" "\xff\x00\x33\x00\xff\x00\x34\x00\xff\x00\x34\x00\xff\x00\x35\x00" "\xff\x00\x35\x00\xff\x00\x36\x00\xff\x00\x36\x00\xff\x00\x37\x00" "\xff\x00\x38\x00\xff\x00\x38\x00\xff\x00\x39\x00\xff\x00\x39\x00" "\xff\x00\x3a\x00\xff\x00\x3a\x00\xff\x00\x3b\x00\xff\x00\x3b\x00" "\xff\x00\x3b\x00\xff\x00\x3c\x00\xff\x00\x3c\x00\xff\x00\x3d\x00" "\xff\x00\x3d\x00\xff\x00\x3e\x00\xff\x00\x3e\x00\xff\x00\x3e\x00" "\xff\x00\x3f\x00\xff\x00\x3f\x00\xff\x00\x40\x00\xff\x00\x40\x00" "\xff\x00\x40\x00\xff\x00\x41\x00\xff\x00\x41\x00\xff\x00\x41\x00" "\xff\x00\x42\x00\xff\x00\x42\x00\xff\x00\x42\x00\xff\x00\x42\x00" "\xff\x00\x43\x00\xff\x00\x43\x00\xff\x00\x43\x00\xff\x00\x44\x00" "\xff\x00\x44\x00\xff\x00\x44\x00\xff\x00\x44\x00\xff\x00\x45\x00" "\xff\x00\x45\x00\xff\x00\x45\x00\xff\x00\x45\x00\xff\x00\x45\x00" "\xff\x00\x46\x00\xff\x00\x46\x00\xff\x00\x46\x00\xff\x00\x46\x00" "\xff\x00\x46\x00\xff\x00\x46\x00\xff\x00\x47\x00\xff\x00\x47\x00" "\xff\x00\x47\x00\xff\x00\x47\x00\xff\x00\x47\x00\xff\x00\x48\x00" "\xff\x00\x48\x00\xff\x00\x48\x00\xff\x00\x48\x00\xff\x00\x48\x00" "\xff\x00\x48\x00\xff\x00\x48\x00\xff\x00\x48\x00\xff\x00\x48\x00" "\xff\x00\x49\x00\xff\x00\x49\x00\xff\x00\x49\x00\xff\x00\x49\x00" "\xff\x00\x49\x00\xff\x00\x49\x00\xff\x00\x49\x00\xff\x00\x49\x00" "\xff\x00\x49\x00\xff\x00\x49\x00\xff\x00\x49\x00\xff\x00\x4a\x00" "\xff\x00\x4a\x00\xff\x00\x4a\x00\xff\x00\x4a\x00\xff\x00\x4a\x00" "\xff\x00\x4a\x00\xff\x00\x4a\x00\xff\x00\x4a\x00\xff\x00\x4a\x00" "\xff\x00\x4a\x00\xff\x00\x4a\x00\xff\x00\x4a\x00\xff\x00\x4a\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x03\x00\x00\x00\x05\x00\x00\x00\x07\x00\x00\x00\x08\x00" "\x17\x00\x0a\x00\x5b\x00\x0c\x00\x9f\x00\x0e\x00\xe3\x00\x0f\x00" "\xff\x00\x11\x00\xff\x00\x12\x00\xff\x00\x13\x00\xff\x00\x15\x00" "\xff\x00\x16\x00\xff\x00\x17\x00\xff\x00\x19\x00\xff\x00\x1a\x00" "\xff\x00\x1b\x00\xff\x00\x1d\x00\xff\x00\x1e\x00\xff\x00\x1f\x00" "\xff\x00\x20\x00\xff\x00\x21\x00\xff\x00\x23\x00\xff\x00\x24\x00" "\xff\x00\x25\x00\xff\x00\x26\x00\xff\x00\x27\x00\xff\x00\x28\x00" "\xff\x00\x29\x00\xff\x00\x2a\x00\xff\x00\x2b\x00\xff\x00\x2c\x00" "\xff\x00\x2d\x00\xff\x00\x2e\x00\xff\x00\x2e\x00\xff\x00\x2f\x00" "\xff\x00\x30\x00\xff\x00\x31\x00\xff\x00\x32\x00\xff\x00\x33\x00" "\xff\x00\x33\x00\xff\x00\x34\x00\xff\x00\x35\x00\xff\x00\x36\x00" "\xff\x00\x36\x00\xff\x00\x37\x00\xff\x00\x38\x00\xff\x00\x38\x00" "\xff\x00\x39\x00\xff\x00\x3a\x00\xff\x00\x3a\x00\xff\x00\x3b\x00" "\xff\x00\x3b\x00\xff\x00\x3c\x00\xff\x00\x3c\x00\xff\x00\x3d\x00" "\xff\x00\x3e\x00\xff\x00\x3e\x00\xff\x00\x3f\x00\xff\x00\x3f\x00" "\xff\x00\x40\x00\xff\x00\x40\x00\xff\x00\x41\x00\xff\x00\x41\x00" "\xff\x00\x41\x00\xff\x00\x42\x00\xff\x00\x42\x00\xff\x00\x43\x00" "\xff\x00\x43\x00\xff\x00\x43\x00\xff\x00\x44\x00\xff\x00\x44\x00" "\xff\x00\x45\x00\xff\x00\x45\x00\xff\x00\x46\x00\xff\x00\x46\x00" "\xff\x00\x46\x00\xff\x00\x47\x00\xff\x00\x47\x00\xff\x00\x47\x00" "\xff\x00\x47\x00\xff\x00\x48\x00\xff\x00\x48\x00\xff\x00\x48\x00" "\xff\x00\x49\x00\xff\x00\x49\x00\xff\x00\x49\x00\xff\x00\x49\x00" "\xff\x00\x4a\x00\xff\x00\x4a\x00\xff\x00\x4a\x00\xff\x00\x4a\x00" "\xff\x00\x4b\x00\xff\x00\x4b\x00\xff\x00\x4b\x00\xff\x00\x4b\x00" "\xff\x00\x4b\x00\xff\x00\x4c\x00\xff\x00\x4c\x00\xff\x00\x4c\x00" "\xff\x00\x4c\x00\xff\x00\x4c\x00\xff\x00\x4c\x00\xff\x00\x4d\x00" "\xff\x00\x4d\x00\xff\x00\x4d\x00\xff\x00\x4d\x00\xff\x00\x4d\x00" "\xff\x00\x4d\x00\xff\x00\x4e\x00\xff\x00\x4e\x00\xff\x00\x4e\x00" "\xff\x00\x4e\x00\xff\x00\x4e\x00\xff\x00\x4e\x00\xff\x00\x4e\x00" "\xff\x00\x4e\x00\xff\x00\x4e\x00\xff\x00\x4e\x00\xff\x00\x4f\x00" "\xff\x00\x4f\x00\xff\x00\x4f\x00\xff\x00\x4f\x00\xff\x00\x4f\x00" "\xff\x00\x4f\x00\xff\x00\x4f\x00\xff\x00\x4f\x00\xff\x00\x4f\x00" "\xff\x00\x4f\x00\xff\x00\x4f\x00\xff\x00\x4f\x00\xff\x00\x4f\x00" "\xff\x00\x4f\x00\xff\x00\x4f\x00\xff\x00\x4f\x00\xff\x00\x50\x00" "\xff\x00\x50\x00\xff\x00\x50\x00\xff\x00\x50\x00\xff\x00\x50\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x06\x00\x00\x00\x08\x00" "\x08\x00\x0a\x00\x49\x00\x0c\x00\x8e\x00\x0e\x00\xd2\x00\x0f\x00" "\xff\x00\x11\x00\xff\x00\x13\x00\xff\x00\x14\x00\xff\x00\x16\x00" "\xff\x00\x17\x00\xff\x00\x18\x00\xff\x00\x1a\x00\xff\x00\x1b\x00" "\xff\x00\x1c\x00\xff\x00\x1e\x00\xff\x00\x1f\x00\xff\x00\x21\x00" "\xff\x00\x22\x00\xff\x00\x23\x00\xff\x00\x25\x00\xff\x00\x26\x00" "\xff\x00\x27\x00\xff\x00\x28\x00\xff\x00\x29\x00\xff\x00\x2a\x00" "\xff\x00\x2b\x00\xff\x00\x2c\x00\xff\x00\x2d\x00\xff\x00\x2e\x00" "\xff\x00\x2f\x00\xff\x00\x30\x00\xff\x00\x31\x00\xff\x00\x32\x00" "\xff\x00\x33\x00\xff\x00\x34\x00\xff\x00\x35\x00\xff\x00\x35\x00" "\xff\x00\x36\x00\xff\x00\x37\x00\xff\x00\x38\x00\xff\x00\x39\x00" "\xff\x00\x39\x00\xff\x00\x3a\x00\xff\x00\x3b\x00\xff\x00\x3c\x00" "\xff\x00\x3c\x00\xff\x00\x3d\x00\xff\x00\x3e\x00\xff\x00\x3e\x00" "\xff\x00\x3f\x00\xff\x00\x40\x00\xff\x00\x40\x00\xff\x00\x41\x00" "\xff\x00\x41\x00\xff\x00\x42\x00\xff\x00\x42\x00\xff\x00\x43\x00" "\xff\x00\x43\x00\xff\x00\x44\x00\xff\x00\x45\x00\xff\x00\x45\x00" "\xff\x00\x46\x00\xff\x00\x46\x00\xff\x00\x46\x00\xff\x00\x47\x00" "\xff\x00\x47\x00\xff\x00\x48\x00\xff\x00\x48\x00\xff\x00\x48\x00" "\xff\x00\x49\x00\xff\x00\x49\x00\xff\x00\x4a\x00\xff\x00\x4a\x00" "\xff\x00\x4a\x00\xff\x00\x4b\x00\xff\x00\x4b\x00\xff\x00\x4c\x00" "\xff\x00\x4c\x00\xff\x00\x4c\x00\xff\x00\x4d\x00\xff\x00\x4d\x00" "\xff\x00\x4d\x00\xff\x00\x4d\x00\xff\x00\x4e\x00\xff\x00\x4e\x00" "\xff\x00\x4e\x00\xff\x00\x4f\x00\xff\x00\x4f\x00\xff\x00\x4f\x00" "\xff\x00\x4f\x00\xff\x00\x50\x00\xff\x00\x50\x00\xff\x00\x50\x00" "\xff\x00\x50\x00\xff\x00\x50\x00\xff\x00\x51\x00\xff\x00\x51\x00" "\xff\x00\x51\x00\xff\x00\x51\x00\xff\x00\x51\x00\xff\x00\x52\x00" "\xff\x00\x52\x00\xff\x00\x52\x00\xff\x00\x52\x00\xff\x00\x52\x00" "\xff\x00\x52\x00\xff\x00\x53\x00\xff\x00\x53\x00\xff\x00\x53\x00" "\xff\x00\x53\x00\xff\x00\x53\x00\xff\x00\x53\x00\xff\x00\x53\x00" "\xff\x00\x53\x00\xff\x00\x54\x00\xff\x00\x54\x00\xff\x00\x54\x00" "\xff\x00\x54\x00\xff\x00\x54\x00\xff\x00\x54\x00\xff\x00\x54\x00" "\xff\x00\x54\x00\xff\x00\x54\x00\xff\x00\x54\x00\xff\x00\x54\x00" "\xff\x00\x55\x00\xff\x00\x55\x00\xff\x00\x55\x00\xff\x00\x55\x00" "\xff\x00\x55\x00\xff\x00\x55\x00\xff\x00\x55\x00\xff\x00\x55\x00" "\xff\x00\x55\x00\xff\x00\x55\x00\xff\x00\x55\x00\xff\x00\x55\x00" "\xff\x00\x55\x00\xff\x00\x55\x00\xff\x00\x55\x00\xff\x00\x55\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\x08\x00" "\x00\x00\x09\x00\x08\x00\x0b\x00\x50\x00\x0d\x00\xa5\x00\x0f\x00" "\xf2\x00\x10\x00\xff\x00\x12\x00\xff\x00\x14\x00\xff\x00\x16\x00" "\xff\x00\x17\x00\xff\x00\x19\x00\xff\x00\x1b\x00\xff\x00\x1c\x00" "\xff\x00\x1d\x00\xff\x00\x1f\x00\xff\x00\x20\x00\xff\x00\x22\x00" "\xff\x00\x23\x00\xff\x00\x24\x00\xff\x00\x26\x00\xff\x00\x27\x00" "\xff\x00\x28\x00\xff\x00\x2a\x00\xff\x00\x2b\x00\xff\x00\x2c\x00" "\xff\x00\x2d\x00\xff\x00\x2e\x00\xff\x00\x2f\x00\xff\x00\x30\x00" "\xff\x00\x31\x00\xff\x00\x32\x00\xff\x00\x33\x00\xff\x00\x34\x00" "\xff\x00\x35\x00\xff\x00\x36\x00\xff\x00\x37\x00\xff\x00\x38\x00" "\xff\x00\x39\x00\xff\x00\x3a\x00\xff\x00\x3b\x00\xff\x00\x3b\x00" "\xff\x00\x3c\x00\xff\x00\x3d\x00\xff\x00\x3e\x00\xff\x00\x3f\x00" "\xff\x00\x3f\x00\xff\x00\x40\x00\xff\x00\x41\x00\xff\x00\x42\x00" "\xff\x00\x42\x00\xff\x00\x43\x00\xff\x00\x44\x00\xff\x00\x44\x00" "\xff\x00\x45\x00\xff\x00\x45\x00\xff\x00\x46\x00\xff\x00\x46\x00" "\xff\x00\x47\x00\xff\x00\x48\x00\xff\x00\x48\x00\xff\x00\x49\x00" "\xff\x00\x49\x00\xff\x00\x4a\x00\xff\x00\x4a\x00\xff\x00\x4b\x00" "\xff\x00\x4b\x00\xff\x00\x4c\x00\xff\x00\x4c\x00\xff\x00\x4d\x00" "\xff\x00\x4d\x00\xff\x00\x4d\x00\xff\x00\x4e\x00\xff\x00\x4e\x00" "\xff\x00\x4f\x00\xff\x00\x4f\x00\xff\x00\x4f\x00\xff\x00\x50\x00" "\xff\x00\x50\x00\xff\x00\x51\x00\xff\x00\x51\x00\xff\x00\x51\x00" "\xff\x00\x52\x00\xff\x00\x52\x00\xff\x00\x52\x00\xff\x00\x52\x00" "\xff\x00\x53\x00\xff\x00\x53\x00\xff\x00\x53\x00\xff\x00\x54\x00" "\xff\x00\x54\x00\xff\x00\x54\x00\xff\x00\x54\x00\xff\x00\x55\x00" "\xff\x00\x55\x00\xff\x00\x55\x00\xff\x00\x55\x00\xff\x00\x56\x00" "\xff\x00\x56\x00\xff\x00\x56\x00\xff\x00\x56\x00\xff\x00\x56\x00" "\xff\x00\x56\x00\xff\x04\x57\x00\xff\x0f\x57\x00\xff\x18\x57\x00" "\xff\x1f\x57\x00\xff\x27\x57\x00\xff\x2f\x57\x00\xff\x36\x58\x00" "\xff\x3e\x58\x00\xff\x46\x58\x00\xff\x4e\x58\x00\xff\x55\x58\x00" "\xff\x5d\x58\x00\xff\x65\x59\x00\xff\x6c\x59\x00\xff\x74\x59\x00" "\xff\x7c\x59\x00\xff\x83\x59\x00\xff\x8b\x59\x00\xff\x93\x59\x00" "\xff\x9a\x59\x00\xff\x9e\x59\x00\xff\xa2\x59\x00\xff\xa6\x59\x00" "\xff\xab\x5a\x00\xff\xaf\x5a\x00\xff\xb3\x5a\x00\xff\xb8\x5a\x00" "\xff\xbc\x5a\x00\xff\xc0\x5a\x00\xff\xc4\x5a\x00\xff\xc9\x5a\x00" "\xff\xcd\x5a\x00\xff\xd1\x5a\x00\xff\xd5\x5a\x00\xff\xda\x5a\x00" "\xff\xde\x5a\x00\xff\xe2\x5a\x00\xff\xe6\x5a\x00\xff\xe9\x5a\x00" "\xff\xeb\x5a\x00\xff\xec\x5b\x00\xff\xed\x5b\x00\xff\xee\x5b\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x06\x00" "\x00\x00\x08\x00\x00\x00\x0a\x00\x09\x00\x0d\x00\x51\x00\x0e\x00" "\xa6\x00\x10\x00\xf3\x00\x12\x00\xff\x00\x13\x00\xff\x00\x15\x00" "\xff\x00\x17\x00\xff\x00\x19\x00\xff\x00\x1a\x00\xff\x00\x1c\x00" "\xff\x00\x1e\x00\xff\x00\x1f\x00\xff\x00\x21\x00\xff\x00\x23\x00" "\xff\x00\x24\x00\xff\x00\x25\x00\xff\x00\x27\x00\xff\x00\x28\x00" "\xff\x00\x29\x00\xff\x00\x2b\x00\xff\x00\x2c\x00\xff\x00\x2d\x00" "\xff\x00\x2f\x00\xff\x00\x30\x00\xff\x00\x31\x00\xff\x00\x32\x00" "\xff\x00\x33\x00\xff\x00\x34\x00\xff\x00\x35\x00\xff\x00\x36\x00" "\xff\x00\x37\x00\xff\x00\x38\x00\xff\x00\x39\x00\xff\x00\x3a\x00" "\xff\x00\x3b\x00\xff\x00\x3c\x00\xff\x00\x3d\x00\xff\x00\x3e\x00" "\xff\x00\x3f\x00\xff\x00\x40\x00\xff\x00\x41\x00\xff\x00\x41\x00" "\xff\x00\x42\x00\xff\x00\x43\x00\xff\x00\x44\x00\xff\x00\x45\x00" "\xff\x00\x45\x00\xff\x00\x46\x00\xff\x00\x47\x00\xff\x00\x47\x00" "\xff\x00\x48\x00\xff\x00\x49\x00\xff\x00\x49\x00\xff\x00\x4a\x00" "\xff\x00\x4b\x00\xff\x00\x4b\x00\xff\x00\x4c\x00\xff\x00\x4c\x00" "\xff\x00\x4d\x00\xff\x00\x4d\x00\xff\x00\x4e\x00\xff\x00\x4e\x00" "\xff\x00\x4f\x00\xff\x00\x50\x00\xff\x00\x50\x00\xff\x00\x50\x00" "\xff\x00\x51\x00\xff\x00\x52\x00\xff\x00\x52\x00\xff\x00\x52\x00" "\xff\x00\x53\x00\xff\x00\x53\x00\xff\x00\x53\x00\xff\x00\x54\x00" "\xff\x00\x54\x00\xff\x00\x54\x00\xff\x00\x55\x00\xff\x00\x55\x00" "\xff\x00\x56\x00\xff\x00\x56\x00\xff\x00\x56\x00\xff\x00\x57\x00" "\xff\x00\x57\x00\xff\x00\x57\x00\xff\x04\x58\x00\xff\x15\x58\x00" "\xff\x27\x58\x00\xff\x39\x58\x00\xff\x48\x59\x00\xff\x55\x59\x00" "\xff\x61\x59\x00\xff\x6e\x5a\x00\xff\x7a\x5a\x00\xff\x87\x5a\x00" "\xff\x93\x5a\x00\xff\xa0\x5a\x00\xff\xac\x5b\x00\xff\xb9\x5b\x00" "\xff\xc5\x5b\x00\xff\xd1\x5b\x00\xff\xde\x5c\x00\xff\xea\x5c\x00" "\xff\xf7\x5c\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\x5c\x00" "\xff\xff\x5d\x00\xff\xff\x5d\x00\xff\xff\x5d\x00\xff\xff\x5d\x00" "\xff\xff\x5d\x00\xff\xff\x5d\x00\xff\xff\x5d\x00\xff\xff\x5e\x00" "\xff\xff\x5e\x00\xff\xff\x5e\x00\xff\xff\x5e\x00\xff\xff\x5e\x00" "\xff\xff\x5e\x00\xff\xff\x5e\x00\xff\xff\x5e\x00\xff\xff\x5e\x00" "\xff\xff\x5f\x00\xff\xff\x5f\x00\xff\xff\x5f\x00\xff\xff\x5f\x00" "\xff\xff\x5f\x00\xff\xff\x5f\x00\xff\xff\x5f\x00\xff\xff\x5f\x00" "\xff\xff\x5f\x00\xff\xff\x5f\x00\xff\xff\x5f\x00\xff\xff\x60\x00" "\xff\xff\x60\x00\xff\xff\x60\x00\xff\xff\x60\x00\xff\xff\x60\x00" "\xff\xff\x60\x00\xff\xff\x60\x00\xff\xff\x60\x00\xff\xff\x60\x00" "\xff\xff\x60\x00\xff\xff\x60\x00\xff\xff\x60\x00\xff\xff\x60\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x03\x00" "\x00\x00\x06\x00\x00\x00\x08\x00\x00\x00\x0a\x00\x0a\x00\x0d\x00" "\x53\x00\x0f\x00\xa8\x00\x11\x00\xf4\x00\x13\x00\xff\x00\x15\x00" "\xff\x00\x16\x00\xff\x00\x18\x00\xff\x00\x1a\x00\xff\x00\x1c\x00" "\xff\x00\x1d\x00\xff\x00\x1f\x00\xff\x00\x21\x00\xff\x00\x22\x00" "\xff\x00\x24\x00\xff\x00\x26\x00\xff\x00\x27\x00\xff\x00\x29\x00" "\xff\x00\x2a\x00\xff\x00\x2c\x00\xff\x00\x2d\x00\xff\x00\x2e\x00" "\xff\x00\x30\x00\xff\x00\x31\x00\xff\x00\x32\x00\xff\x00\x33\x00" "\xff\x00\x35\x00\xff\x00\x36\x00\xff\x00\x37\x00\xff\x00\x38\x00" "\xff\x00\x39\x00\xff\x00\x3a\x00\xff\x00\x3b\x00\xff\x00\x3c\x00" "\xff\x00\x3d\x00\xff\x00\x3e\x00\xff\x00\x3f\x00\xff\x00\x40\x00" "\xff\x00\x41\x00\xff\x00\x42\x00\xff\x00\x43\x00\xff\x00\x44\x00" "\xff\x00\x45\x00\xff\x00\x46\x00\xff\x00\x46\x00\xff\x00\x47\x00" "\xff\x00\x48\x00\xff\x00\x49\x00\xff\x00\x49\x00\xff\x00\x4a\x00" "\xff\x00\x4b\x00\xff\x00\x4c\x00\xff\x00\x4c\x00\xff\x00\x4d\x00" "\xff\x00\x4e\x00\xff\x00\x4f\x00\xff\x00\x4f\x00\xff\x00\x50\x00" "\xff\x00\x50\x00\xff\x00\x51\x00\xff\x00\x51\x00\xff\x00\x52\x00" "\xff\x00\x52\x00\xff\x00\x53\x00\xff\x00\x53\x00\xff\x00\x54\x00" "\xff\x00\x54\x00\xff\x00\x55\x00\xff\x00\x55\x00\xff\x00\x56\x00" "\xff\x00\x56\x00\xff\x00\x57\x00\xff\x00\x57\x00\xff\x00\x58\x00" "\xff\x02\x58\x00\xff\x14\x58\x00\xff\x2a\x59\x00\xff\x3d\x59\x00" "\xff\x4f\x59\x00\xff\x61\x5a\x00\xff\x73\x5a\x00\xff\x85\x5b\x00" "\xff\x97\x5b\x00\xff\xa9\x5b\x00\xff\xbb\x5c\x00\xff\xcd\x5c\x00" "\xff\xdf\x5c\x00\xff\xf1\x5d\x00\xff\xff\x5d\x00\xff\xff\x5d\x00" "\xff\xff\x5d\x00\xff\xff\x5e\x00\xff\xff\x5e\x00\xff\xff\x5e\x00" "\xff\xff\x5e\x00\xff\xff\x5f\x00\xff\xff\x5f\x00\xff\xff\x5f\x00" "\xff\xff\x60\x00\xff\xff\x60\x00\xff\xff\x60\x00\xff\xff\x60\x00" "\xff\xff\x61\x00\xff\xff\x61\x00\xff\xff\x61\x00\xff\xff\x61\x00" "\xff\xff\x61\x00\xff\xff\x61\x00\xff\xff\x61\x00\xff\xff\x62\x00" "\xff\xff\x62\x00\xff\xff\x62\x00\xff\xff\x62\x00\xff\xff\x62\x00" "\xff\xff\x62\x00\xff\xff\x63\x00\xff\xff\x63\x00\xff\xff\x63\x00" "\xff\xff\x63\x00\xff\xff\x63\x00\xff\xff\x63\x00\xff\xff\x63\x00" "\xff\xff\x63\x00\xff\xff\x63\x00\xff\xff\x64\x00\xff\xff\x64\x00" "\xff\xff\x64\x00\xff\xff\x64\x00\xff\xff\x64\x00\xff\xff\x64\x00" "\xff\xff\x64\x00\xff\xff\x64\x00\xff\xff\x64\x00\xff\xff\x64\x00" "\xff\xff\x64\x00\xff\xff\x65\x00\xff\xff\x65\x00\xff\xff\x65\x00" "\xff\xff\x65\x00\xff\xff\x65\x00\xff\xff\x65\x00\xff\xff\x65\x00" "\xff\xff\x65\x00\xff\xff\x65\x00\xff\xff\x65\x00\xff\xff\x65\x00" "\xff\xff\x65\x00\xff\xff\x65\x00\xff\xff\x65\x00\xff\xff\x65\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\x08\x00\x00\x00\x0a\x00" "\x01\x00\x0d\x00\x3a\x00\x0f\x00\xa3\x00\x11\x00\xf4\x00\x13\x00" "\xff\x00\x15\x00\xff\x00\x17\x00\xff\x00\x19\x00\xff\x00\x1b\x00" "\xff\x00\x1d\x00\xff\x00\x1f\x00\xff\x00\x20\x00\xff\x00\x22\x00" "\xff\x00\x24\x00\xff\x00\x25\x00\xff\x00\x27\x00\xff\x00\x29\x00" "\xff\x00\x2a\x00\xff\x00\x2c\x00\xff\x00\x2e\x00\xff\x00\x2f\x00" "\xff\x00\x30\x00\xff\x00\x32\x00\xff\x00\x33\x00\xff\x00\x34\x00" "\xff\x00\x36\x00\xff\x00\x37\x00\xff\x00\x38\x00\xff\x00\x39\x00" "\xff\x00\x3b\x00\xff\x00\x3c\x00\xff\x00\x3d\x00\xff\x00\x3e\x00" "\xff\x00\x3f\x00\xff\x00\x40\x00\xff\x00\x41\x00\xff\x00\x42\x00" "\xff\x00\x43\x00\xff\x00\x44\x00\xff\x00\x45\x00\xff\x00\x46\x00" "\xff\x00\x47\x00\xff\x00\x48\x00\xff\x00\x49\x00\xff\x00\x4a\x00" "\xff\x00\x4b\x00\xff\x00\x4b\x00\xff\x00\x4c\x00\xff\x00\x4d\x00" "\xff\x00\x4e\x00\xff\x00\x4e\x00\xff\x00\x4f\x00\xff\x00\x50\x00" "\xff\x00\x51\x00\xff\x00\x51\x00\xff\x00\x52\x00\xff\x00\x53\x00" "\xff\x00\x53\x00\xff\x00\x54\x00\xff\x00\x55\x00\xff\x00\x55\x00" "\xff\x00\x56\x00\xff\x00\x56\x00\xff\x00\x57\x00\xff\x00\x57\x00" "\xff\x00\x58\x00\xff\x00\x58\x00\xff\x06\x59\x00\xff\x1e\x59\x00" "\xff\x36\x5a\x00\xff\x4f\x5a\x00\xff\x68\x5b\x00\xff\x80\x5b\x00" "\xff\x99\x5c\x00\xff\xb2\x5c\x00\xff\xca\x5d\x00\xff\xe3\x5d\x00" "\xff\xfa\x5d\x00\xff\xff\x5e\x00\xff\xff\x5e\x00\xff\xff\x5e\x00" "\xff\xff\x5f\x00\xff\xff\x5f\x00\xff\xff\x60\x00\xff\xff\x60\x00" "\xff\xff\x60\x00\xff\xff\x61\x00\xff\xff\x61\x00\xff\xff\x61\x00" "\xff\xff\x62\x00\xff\xff\x62\x00\xff\xff\x62\x00\xff\xff\x63\x00" "\xff\xff\x63\x00\xff\xff\x63\x00\xff\xff\x63\x00\xff\xff\x64\x00" "\xff\xff\x64\x00\xff\xff\x64\x00\xff\xff\x64\x00\xff\xff\x64\x00" "\xff\xff\x65\x00\xff\xff\x65\x00\xff\xff\x65\x00\xff\xff\x65\x00" "\xff\xff\x66\x00\xff\xff\x66\x00\xff\xff\x66\x00\xff\xff\x66\x00" "\xff\xff\x66\x00\xff\xff\x66\x00\xff\xff\x67\x00\xff\xff\x67\x00" "\xff\xff\x67\x00\xff\xff\x67\x00\xff\xff\x67\x00\xff\xff\x67\x00" "\xff\xff\x67\x00\xff\xff\x68\x00\xff\xff\x68\x00\xff\xff\x68\x00" "\xff\xff\x68\x00\xff\xff\x68\x00\xff\xff\x68\x00\xff\xff\x68\x00" "\xff\xff\x68\x00\xff\xff\x69\x00\xff\xff\x69\x00\xff\xff\x69\x00" "\xff\xff\x69\x00\xff\xff\x69\x00\xff\xff\x69\x00\xff\xff\x69\x00" "\xff\xff\x69\x00\xff\xff\x69\x00\xff\xff\x69\x00\xff\xff\x69\x00" "\xff\xff\x69\x00\xff\xff\x6a\x00\xff\xff\x6a\x00\xff\xff\x6a\x00" "\xff\xff\x6a\x00\xff\xff\x6a\x00\xff\xff\x6a\x00\xff\xff\x6a\x00" "\xff\xff\x6a\x00\xff\xff\x6a\x00\xff\xff\x6a\x00\xff\xff\x6a\x00" "\xff\xff\x6a\x00\xff\xff\x6a\x00\xff\xff\x6a\x00\xff\xff\x6a\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x08\x00" "\x00\x00\x0a\x00\x00\x00\x0d\x00\x0d\x00\x0f\x00\x68\x00\x11\x00" "\xd1\x00\x13\x00\xff\x00\x15\x00\xff\x00\x17\x00\xff\x00\x19\x00" "\xff\x00\x1b\x00\xff\x00\x1d\x00\xff\x00\x1f\x00\xff\x00\x22\x00" "\xff\x00\x23\x00\xff\x00\x25\x00\xff\x00\x27\x00\xff\x00\x28\x00" "\xff\x00\x2a\x00\xff\x00\x2c\x00\xff\x00\x2d\x00\xff\x00\x2f\x00" "\xff\x00\x30\x00\xff\x00\x32\x00\xff\x00\x34\x00\xff\x00\x35\x00" "\xff\x00\x37\x00\xff\x00\x38\x00\xff\x00\x39\x00\xff\x00\x3a\x00" "\xff\x00\x3b\x00\xff\x00\x3d\x00\xff\x00\x3e\x00\xff\x00\x3f\x00" "\xff\x00\x40\x00\xff\x00\x42\x00\xff\x00\x43\x00\xff\x00\x44\x00" "\xff\x00\x45\x00\xff\x00\x46\x00\xff\x00\x47\x00\xff\x00\x48\x00" "\xff\x00\x49\x00\xff\x00\x4a\x00\xff\x00\x4b\x00\xff\x00\x4c\x00" "\xff\x00\x4d\x00\xff\x00\x4e\x00\xff\x00\x4e\x00\xff\x00\x4f\x00" "\xff\x00\x50\x00\xff\x00\x51\x00\xff\x00\x52\x00\xff\x00\x52\x00" "\xff\x00\x53\x00\xff\x00\x54\x00\xff\x00\x55\x00\xff\x00\x55\x00" "\xff\x00\x56\x00\xff\x00\x57\x00\xff\x00\x57\x00\xff\x00\x58\x00" "\xff\x00\x59\x00\xff\x01\x59\x00\xff\x17\x5a\x00\xff\x38\x5b\x00" "\xff\x59\x5b\x00\xff\x7a\x5c\x00\xff\x9b\x5c\x00\xff\xba\x5d\x00" "\xff\xd4\x5d\x00\xff\xec\x5e\x00\xff\xff\x5e\x00\xff\xff\x5f\x00" "\xff\xff\x5f\x00\xff\xff\x60\x00\xff\xff\x60\x00\xff\xff\x61\x00" "\xff\xff\x61\x00\xff\xff\x62\x00\xff\xff\x62\x00\xff\xff\x62\x00" "\xff\xff\x63\x00\xff\xff\x63\x00\xff\xff\x63\x00\xff\xff\x64\x00" "\xff\xff\x64\x00\xff\xff\x64\x00\xff\xff\x65\x00\xff\xff\x65\x00" "\xff\xff\x65\x00\xff\xff\x66\x00\xff\xff\x66\x00\xff\xff\x67\x00" "\xff\xff\x67\x00\xff\xff\x67\x00\xff\xff\x67\x00\xff\xff\x68\x00" "\xff\xff\x68\x00\xff\xff\x68\x00\xff\xff\x68\x00\xff\xff\x69\x00" "\xff\xff\x69\x00\xff\xff\x69\x00\xff\xff\x69\x00\xff\xff\x69\x00" "\xff\xff\x6a\x00\xff\xff\x6a\x00\xff\xff\x6a\x00\xff\xff\x6a\x00" "\xff\xff\x6b\x00\xff\xff\x6b\x00\xff\xff\x6b\x00\xff\xff\x6b\x00" "\xff\xff\x6b\x00\xff\xff\x6b\x00\xff\xff\x6c\x00\xff\xff\x6c\x00" "\xff\xff\x6c\x00\xff\xff\x6c\x00\xff\xff\x6c\x00\xff\xff\x6c\x00" "\xff\xff\x6c\x00\xff\xff\x6d\x00\xff\xff\x6d\x00\xff\xff\x6d\x00" "\xff\xff\x6d\x00\xff\xff\x6d\x00\xff\xff\x6d\x00\xff\xff\x6d\x00" "\xff\xff\x6d\x00\xff\xff\x6e\x00\xff\xff\x6e\x00\xff\xff\x6e\x00" "\xff\xff\x6e\x00\xff\xff\x6e\x00\xff\xff\x6e\x00\xff\xff\x6e\x00" "\xff\xff\x6e\x00\xff\xff\x6e\x00\xff\xff\x6e\x00\xff\xff\x6e\x00" "\xff\xff\x6e\x00\xff\xff\x6e\x00\xff\xff\x6f\x00\xff\xff\x6f\x00" "\xff\xff\x6f\x00\xff\xff\x6f\x00\xff\xff\x6f\x00\xff\xff\x6f\x00" "\xff\xff\x6f\x00\xff\xff\x6f\x00\xff\xff\x6f\x00\xff\xff\x6f\x00" "\xff\xff\x6f\x00\xff\xff\x6f\x00\xff\xff\x6f\x00\xff\xff\x6f\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00" "\x00\x00\x06\x00\x00\x00\x09\x00\x00\x00\x0c\x00\x00\x00\x0e\x00" "\x2d\x00\x11\x00\x96\x00\x13\x00\xf3\x00\x15\x00\xff\x00\x17\x00" "\xff\x00\x19\x00\xff\x00\x1b\x00\xff\x00\x1d\x00\xff\x00\x20\x00" "\xff\x00\x22\x00\xff\x00\x24\x00\xff\x00\x26\x00\xff\x00\x28\x00" "\xff\x00\x2a\x00\xff\x00\x2b\x00\xff\x00\x2d\x00\xff\x00\x2e\x00" "\xff\x00\x30\x00\xff\x00\x32\x00\xff\x00\x33\x00\xff\x00\x35\x00" "\xff\x00\x36\x00\xff\x00\x38\x00\xff\x00\x3a\x00\xff\x00\x3b\x00" "\xff\x00\x3d\x00\xff\x00\x3e\x00\xff\x00\x3f\x00\xff\x00\x40\x00" "\xff\x00\x41\x00\xff\x00\x43\x00\xff\x00\x44\x00\xff\x00\x45\x00" "\xff\x00\x46\x00\xff\x00\x47\x00\xff\x00\x49\x00\xff\x00\x4a\x00" "\xff\x00\x4b\x00\xff\x00\x4c\x00\xff\x00\x4d\x00\xff\x00\x4e\x00" "\xff\x00\x4e\x00\xff\x00\x4f\x00\xff\x00\x51\x00\xff\x00\x51\x00" "\xff\x00\x52\x00\xff\x00\x53\x00\xff\x00\x54\x00\xff\x00\x55\x00" "\xff\x00\x56\x00\xff\x00\x56\x00\xff\x00\x57\x00\xff\x00\x58\x00" "\xff\x00\x59\x00\xff\x00\x59\x00\xff\x10\x5a\x00\xff\x31\x5b\x00" "\xff\x52\x5b\x00\xff\x73\x5c\x00\xff\x94\x5d\x00\xff\xb5\x5d\x00" "\xff\xd6\x5e\x00\xff\xf6\x5f\x00\xff\xff\x5f\x00\xff\xff\x60\x00" "\xff\xff\x60\x00\xff\xff\x61\x00\xff\xff\x61\x00\xff\xff\x62\x00" "\xff\xff\x62\x00\xff\xff\x63\x00\xff\xff\x63\x00\xff\xff\x64\x00" "\xff\xff\x64\x00\xff\xff\x65\x00\xff\xff\x65\x00\xff\xff\x66\x00" "\xff\xff\x66\x00\xff\xff\x67\x00\xff\xff\x67\x00\xff\xff\x67\x00" "\xff\xff\x68\x00\xff\xff\x68\x00\xff\xff\x68\x00\xff\xff\x69\x00" "\xff\xff\x69\x00\xff\xff\x69\x00\xff\xff\x6a\x00\xff\xff\x6a\x00" "\xff\xff\x6a\x00\xff\xff\x6b\x00\xff\xff\x6b\x00\xff\xff\x6c\x00" "\xff\xff\x6c\x00\xff\xff\x6c\x00\xff\xff\x6c\x00\xff\xff\x6d\x00" "\xff\xff\x6d\x00\xff\xff\x6d\x00\xff\xff\x6d\x00\xff\xff\x6e\x00" "\xff\xff\x6e\x00\xff\xff\x6e\x00\xff\xff\x6e\x00\xff\xff\x6e\x00" "\xff\xff\x6f\x00\xff\xff\x6f\x00\xff\xff\x6f\x00\xff\xff\x6f\x00" "\xff\xff\x70\x00\xff\xff\x70\x00\xff\xff\x70\x00\xff\xff\x70\x00" "\xff\xff\x70\x00\xff\xff\x70\x00\xff\xff\x70\x00\xff\xff\x71\x00" "\xff\xff\x71\x00\xff\xff\x71\x00\xff\xff\x71\x00\xff\xff\x71\x00" "\xff\xff\x71\x00\xff\xff\x71\x00\xff\xff\x72\x00\xff\xff\x72\x00" "\xff\xff\x72\x00\xff\xff\x72\x00\xff\xff\x72\x00\xff\xff\x72\x00" "\xff\xff\x72\x00\xff\xff\x72\x00\xff\xff\x72\x00\xff\xff\x72\x00" "\xff\xff\x73\x00\xff\xff\x73\x00\xff\xff\x73\x00\xff\xff\x73\x00" "\xff\xff\x73\x00\xff\xff\x73\x00\xff\xff\x73\x00\xff\xff\x73\x00" "\xff\xff\x73\x00\xff\xff\x73\x00\xff\xff\x73\x00\xff\xff\x73\x00" "\xff\xff\x73\x00\xff\xff\x74\x00\xff\xff\x74\x00\xff\xff\x74\x00" "\xff\xff\x74\x00\xff\xff\x74\x00\xff\xff\x74\x00\xff\xff\x74\x00" "\xff\xff\x74\x00\xff\xff\x74\x00\xff\xff\x74\x00\xff\xff\x74\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x08\x00\x00\x00\x0a\x00" "\x00\x00\x0d\x00\x07\x00\x0f\x00\x5b\x00\x12\x00\xc4\x00\x14\x00" "\xff\x00\x17\x00\xff\x00\x19\x00\xff\x00\x1b\x00\xff\x00\x1e\x00" "\xff\x00\x20\x00\xff\x00\x22\x00\xff\x00\x24\x00\xff\x00\x26\x00" "\xff\x00\x28\x00\xff\x00\x2a\x00\xff\x00\x2c\x00\xff\x00\x2e\x00" "\xff\x00\x30\x00\xff\x00\x31\x00\xff\x00\x33\x00\xff\x00\x34\x00" "\xff\x00\x36\x00\xff\x00\x38\x00\xff\x00\x39\x00\xff\x00\x3b\x00" "\xff\x00\x3c\x00\xff\x00\x3e\x00\xff\x00\x3f\x00\xff\x00\x41\x00" "\xff\x00\x42\x00\xff\x00\x43\x00\xff\x00\x45\x00\xff\x00\x46\x00" "\xff\x00\x47\x00\xff\x00\x48\x00\xff\x00\x49\x00\xff\x00\x4b\x00" "\xff\x00\x4c\x00\xff\x00\x4d\x00\xff\x00\x4e\x00\xff\x00\x4f\x00" "\xff\x00\x50\x00\xff\x00\x51\x00\xff\x00\x52\x00\xff\x00\x53\x00" "\xff\x00\x54\x00\xff\x00\x55\x00\xff\x00\x56\x00\xff\x00\x57\x00" "\xff\x00\x58\x00\xff\x00\x58\x00\xff\x00\x59\x00\xff\x01\x5a\x00" "\xff\x19\x5b\x00\xff\x44\x5c\x00\xff\x6e\x5d\x00\xff\x99\x5d\x00" "\xff\xc4\x5e\x00\xff\xed\x5f\x00\xff\xff\x5f\x00\xff\xff\x60\x00" "\xff\xff\x61\x00\xff\xff\x61\x00\xff\xff\x62\x00\xff\xff\x62\x00" "\xff\xff\x63\x00\xff\xff\x64\x00\xff\xff\x64\x00\xff\xff\x65\x00" "\xff\xff\x65\x00\xff\xff\x66\x00\xff\xff\x66\x00\xff\xff\x67\x00" "\xff\xff\x67\x00\xff\xff\x68\x00\xff\xff\x68\x00\xff\xff\x69\x00" "\xff\xff\x69\x00\xff\xff\x6a\x00\xff\xff\x6a\x00\xff\xff\x6b\x00" "\xff\xff\x6b\x00\xff\xff\x6c\x00\xff\xff\x6c\x00\xff\xff\x6c\x00" "\xff\xff\x6d\x00\xff\xff\x6d\x00\xff\xff\x6d\x00\xff\xff\x6e\x00" "\xff\xff\x6e\x00\xff\xff\x6e\x00\xff\xff\x6f\x00\xff\xff\x6f\x00" "\xff\xff\x6f\x00\xff\xff\x70\x00\xff\xff\x70\x00\xff\xff\x70\x00" "\xff\xff\x71\x00\xff\xff\x71\x00\xff\xff\x71\x00\xff\xff\x71\x00" "\xff\xff\x72\x00\xff\xff\x72\x00\xff\xff\x72\x00\xff\xff\x72\x00" "\xff\xff\x72\x00\xff\xff\x73\x00\xff\xff\x73\x00\xff\xff\x73\x00" "\xff\xff\x73\x00\xff\xff\x74\x00\xff\xff\x74\x00\xff\xff\x74\x00" "\xff\xff\x74\x00\xff\xff\x74\x00\xff\xff\x75\x00\xff\xff\x75\x00" "\xff\xff\x75\x00\xff\xff\x75\x00\xff\xff\x75\x00\xff\xff\x75\x00" "\xff\xff\x75\x00\xff\xff\x76\x00\xff\xff\x76\x00\xff\xff\x76\x00" "\xff\xff\x76\x00\xff\xff\x76\x00\xff\xff\x76\x00\xff\xff\x76\x00" "\xff\xff\x77\x00\xff\xff\x77\x00\xff\xff\x77\x00\xff\xff\x77\x00" "\xff\xff\x77\x00\xff\xff\x77\x00\xff\xff\x77\x00\xff\xff\x77\x00" "\xff\xff\x77\x00\xff\xff\x77\x00\xff\xff\x77\x00\xff\xff\x77\x00" "\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x78\x00" "\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x78\x00" "\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x78\x00" "\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x78\x00" "\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x78\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x06\x00" "\x00\x00\x09\x00\x00\x00\x0c\x00\x00\x00\x0e\x00\x0e\x00\x10\x00" "\x7a\x00\x13\x00\xeb\x00\x15\x00\xff\x00\x18\x00\xff\x00\x1b\x00" "\xff\x00\x1d\x00\xff\x00\x20\x00\xff\x00\x22\x00\xff\x00\x24\x00" "\xff\x00\x26\x00\xff\x00\x28\x00\xff\x00\x2a\x00\xff\x00\x2c\x00" "\xff\x00\x2e\x00\xff\x00\x30\x00\xff\x00\x32\x00\xff\x00\x34\x00" "\xff\x00\x36\x00\xff\x00\x37\x00\xff\x00\x39\x00\xff\x00\x3a\x00" "\xff\x00\x3c\x00\xff\x00\x3d\x00\xff\x00\x3f\x00\xff\x00\x41\x00" "\xff\x00\x42\x00\xff\x00\x44\x00\xff\x00\x45\x00\xff\x00\x47\x00" "\xff\x00\x48\x00\xff\x00\x49\x00\xff\x00\x4a\x00\xff\x00\x4c\x00" "\xff\x00\x4d\x00\xff\x00\x4e\x00\xff\x00\x4f\x00\xff\x00\x50\x00" "\xff\x00\x51\x00\xff\x00\x52\x00\xff\x00\x54\x00\xff\x00\x55\x00" "\xff\x00\x56\x00\xff\x00\x57\x00\xff\x00\x58\x00\xff\x00\x58\x00" "\xff\x00\x59\x00\xff\x01\x5a\x00\xff\x1a\x5b\x00\xff\x45\x5c\x00" "\xff\x6f\x5d\x00\xff\x9a\x5e\x00\xff\xc4\x5f\x00\xff\xef\x5f\x00" "\xff\xff\x60\x00\xff\xff\x61\x00\xff\xff\x62\x00\xff\xff\x62\x00" "\xff\xff\x63\x00\xff\xff\x64\x00\xff\xff\x64\x00\xff\xff\x65\x00" "\xff\xff\x66\x00\xff\xff\x66\x00\xff\xff\x67\x00\xff\xff\x68\x00" "\xff\xff\x68\x00\xff\xff\x69\x00\xff\xff\x6a\x00\xff\xff\x6a\x00" "\xff\xff\x6a\x00\xff\xff\x6b\x00\xff\xff\x6b\x00\xff\xff\x6c\x00" "\xff\xff\x6c\x00\xff\xff\x6d\x00\xff\xff\x6d\x00\xff\xff\x6e\x00" "\xff\xff\x6e\x00\xff\xff\x6f\x00\xff\xff\x6f\x00\xff\xff\x70\x00" "\xff\xff\x70\x00\xff\xff\x70\x00\xff\xff\x71\x00\xff\xff\x71\x00" "\xff\xff\x71\x00\xff\xff\x72\x00\xff\xff\x72\x00\xff\xff\x72\x00" "\xff\xff\x73\x00\xff\xff\x73\x00\xff\xff\x73\x00\xff\xff\x74\x00" "\xff\xff\x74\x00\xff\xff\x74\x00\xff\xff\x75\x00\xff\xff\x75\x00" "\xff\xff\x75\x00\xff\xff\x76\x00\xff\xff\x76\x00\xff\xff\x76\x00" "\xff\xff\x76\x00\xff\xff\x77\x00\xff\xff\x77\x00\xff\xff\x77\x00" "\xff\xff\x77\x00\xff\xff\x77\x00\xff\xff\x78\x00\xff\xff\x78\x00" "\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x79\x00\xff\xff\x79\x00" "\xff\xff\x79\x00\xff\xff\x79\x00\xff\xff\x79\x00\xff\xff\x79\x00" "\xff\xff\x7a\x00\xff\xff\x7a\x00\xff\xff\x7a\x00\xff\xff\x7a\x00" "\xff\xff\x7a\x00\xff\xff\x7a\x00\xff\xff\x7a\x00\xff\xff\x7a\x00" "\xff\xff\x7b\x00\xff\xff\x7b\x00\xff\xff\x7b\x00\xff\xff\x7b\x00" "\xff\xff\x7b\x00\xff\xff\x7b\x00\xff\xff\x7b\x00\xff\xff\x7b\x00" "\xff\xff\x7b\x00\xff\xff\x7c\x00\xff\xff\x7c\x00\xff\xff\x7c\x00" "\xff\xff\x7c\x00\xff\xff\x7c\x00\xff\xff\x7c\x00\xff\xff\x7c\x00" "\xff\xff\x7c\x00\xff\xff\x7c\x00\xff\xff\x7c\x00\xff\xff\x7c\x00" "\xff\xff\x7c\x00\xff\xff\x7c\x00\xff\xff\x7d\x00\xff\xff\x7d\x00" "\xff\xff\x7d\x00\xff\xff\x7d\x00\xff\xff\x7d\x00\xff\xff\x7d\x00" "\xff\xff\x7d\x00\xff\xff\x7d\x00\xff\xff\x7d\x00\xff\xff\x7d\x00" "\xff\xff\x7d\x00\xff\xff\x7d\x00\xff\xff\x7d\x00\xff\xff\x7d\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x07\x00\x00\x00\x0a\x00\x00\x00\x0d\x00" "\x00\x00\x0f\x00\x0e\x00\x11\x00\x7a\x00\x14\x00\xed\x00\x17\x00" "\xff\x00\x19\x00\xff\x00\x1c\x00\xff\x00\x1e\x00\xff\x00\x21\x00" "\xff\x00\x23\x00\xff\x00\x26\x00\xff\x00\x28\x00\xff\x00\x2a\x00" "\xff\x00\x2c\x00\xff\x00\x2e\x00\xff\x00\x30\x00\xff\x00\x32\x00" "\xff\x00\x34\x00\xff\x00\x36\x00\xff\x00\x38\x00\xff\x00\x3a\x00" "\xff\x00\x3b\x00\xff\x00\x3d\x00\xff\x00\x3f\x00\xff\x00\x40\x00" "\xff\x00\x42\x00\xff\x00\x43\x00\xff\x00\x45\x00\xff\x00\x46\x00" "\xff\x00\x48\x00\xff\x00\x49\x00\xff\x00\x4b\x00\xff\x00\x4c\x00" "\xff\x00\x4e\x00\xff\x00\x4f\x00\xff\x00\x50\x00\xff\x00\x51\x00" "\xff\x00\x52\x00\xff\x00\x53\x00\xff\x00\x54\x00\xff\x00\x56\x00" "\xff\x00\x57\x00\xff\x00\x58\x00\xff\x00\x59\x00\xff\x00\x5a\x00" "\xff\x01\x5b\x00\xff\x21\x5c\x00\xff\x57\x5d\x00\xff\x8d\x5e\x00" "\xff\xc3\x5f\x00\xff\xef\x5f\x00\xff\xff\x60\x00\xff\xff\x61\x00" "\xff\xff\x62\x00\xff\xff\x63\x00\xff\xff\x64\x00\xff\xff\x65\x00" "\xff\xff\x65\x00\xff\xff\x66\x00\xff\xff\x67\x00\xff\xff\x67\x00" "\xff\xff\x68\x00\xff\xff\x69\x00\xff\xff\x69\x00\xff\xff\x6a\x00" "\xff\xff\x6b\x00\xff\xff\x6b\x00\xff\xff\x6c\x00\xff\xff\x6c\x00" "\xff\xff\x6d\x00\xff\xff\x6e\x00\xff\xff\x6e\x00\xff\xff\x6f\x00" "\xff\xff\x6f\x00\xff\xff\x70\x00\xff\xff\x70\x00\xff\xff\x71\x00" "\xff\xff\x71\x00\xff\xff\x72\x00\xff\xff\x72\x00\xff\xff\x72\x00" "\xff\xff\x73\x00\xff\xff\x73\x00\xff\xff\x74\x00\xff\xff\x74\x00" "\xff\xff\x75\x00\xff\xff\x75\x00\xff\xff\x75\x00\xff\xff\x76\x00" "\xff\xff\x76\x00\xff\xff\x76\x00\xff\xff\x77\x00\xff\xff\x77\x00" "\xff\xff\x77\x00\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x78\x00" "\xff\xff\x79\x00\xff\xff\x79\x00\xff\xff\x79\x00\xff\xff\x7a\x00" "\xff\xff\x7a\x00\xff\xff\x7a\x00\xff\xff\x7a\x00\xff\xff\x7b\x00" "\xff\xff\x7b\x00\xff\xff\x7b\x00\xff\xff\x7b\x00\xff\xff\x7c\x00" "\xff\xff\x7c\x00\xff\xff\x7c\x00\xff\xff\x7c\x00\xff\xff\x7c\x00" "\xff\xff\x7d\x00\xff\xff\x7d\x00\xff\xff\x7d\x00\xff\xff\x7d\x00" "\xff\xff\x7d\x00\xff\xff\x7e\x00\xff\xff\x7e\x00\xff\xff\x7e\x00" "\xff\xff\x7e\x00\xff\xff\x7e\x00\xff\xff\x7e\x00\xff\xff\x7e\x00" "\xff\xff\x7f\x00\xff\xff\x7f\x00\xff\xff\x7f\x00\xff\xff\x7f\x00" "\xff\xff\x7f\x00\xff\xff\x7f\x00\xff\xff\x7f\x00\xff\xff\x7f\x00" "\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00" "\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00" "\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00" "\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x81\x00" "\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x81\x00" "\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x81\x00" "\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x81\x00" "\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x81\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x07\x00" "\x00\x00\x0a\x00\x00\x00\x0d\x00\x00\x00\x10\x00\x0e\x00\x13\x00" "\x7a\x00\x15\x00\xed\x00\x18\x00\xff\x00\x1a\x00\xff\x00\x1d\x00" "\xff\x00\x1f\x00\xff\x00\x22\x00\xff\x00\x24\x00\xff\x00\x27\x00" "\xff\x00\x29\x00\xff\x00\x2c\x00\xff\x00\x2e\x00\xff\x00\x30\x00" "\xff\x00\x32\x00\xff\x00\x34\x00\xff\x00\x36\x00\xff\x00\x38\x00" "\xff\x00\x3a\x00\xff\x00\x3c\x00\xff\x00\x3d\x00\xff\x00\x3f\x00" "\xff\x00\x41\x00\xff\x00\x43\x00\xff\x00\x44\x00\xff\x00\x46\x00" "\xff\x00\x47\x00\xff\x00\x49\x00\xff\x00\x4a\x00\xff\x00\x4c\x00" "\xff\x00\x4d\x00\xff\x00\x4f\x00\xff\x00\x50\x00\xff\x00\x52\x00" "\xff\x00\x53\x00\xff\x00\x54\x00\xff\x00\x55\x00\xff\x00\x56\x00" "\xff\x00\x58\x00\xff\x00\x59\x00\xff\x00\x5a\x00\xff\x00\x5b\x00" "\xff\x13\x5c\x00\xff\x48\x5d\x00\xff\x7e\x5e\x00\xff\xb4\x5f\x00" "\xff\xea\x60\x00\xff\xff\x61\x00\xff\xff\x62\x00\xff\xff\x63\x00" "\xff\xff\x64\x00\xff\xff\x65\x00\xff\xff\x65\x00\xff\xff\x66\x00" "\xff\xff\x67\x00\xff\xff\x68\x00\xff\xff\x69\x00\xff\xff\x6a\x00" "\xff\xff\x6a\x00\xff\xff\x6b\x00\xff\xff\x6c\x00\xff\xff\x6c\x00" "\xff\xff\x6d\x00\xff\xff\x6e\x00\xff\xff\x6e\x00\xff\xff\x6f\x00" "\xff\xff\x70\x00\xff\xff\x70\x00\xff\xff\x71\x00\xff\xff\x71\x00" "\xff\xff\x72\x00\xff\xff\x73\x00\xff\xff\x73\x00\xff\xff\x74\x00" "\xff\xff\x74\x00\xff\xff\x74\x00\xff\xff\x75\x00\xff\xff\x75\x00" "\xff\xff\x76\x00\xff\xff\x76\x00\xff\xff\x77\x00\xff\xff\x77\x00" "\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x79\x00\xff\xff\x79\x00" "\xff\xff\x79\x00\xff\xff\x7a\x00\xff\xff\x7a\x00\xff\xff\x7a\x00" "\xff\xff\x7b\x00\xff\xff\x7b\x00\xff\xff\x7b\x00\xff\xff\x7c\x00" "\xff\xff\x7c\x00\xff\xff\x7c\x00\xff\xff\x7d\x00\xff\xff\x7d\x00" "\xff\xff\x7d\x00\xff\xff\x7e\x00\xff\xff\x7e\x00\xff\xff\x7e\x00" "\xff\xff\x7e\x00\xff\xff\x7f\x00\xff\xff\x7f\x00\xff\xff\x7f\x00" "\xff\xff\x7f\x00\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x80\x00" "\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x81\x00\xff\xff\x81\x00" "\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x82\x00" "\xff\xff\x82\x00\xff\xff\x82\x00\xff\xff\x82\x00\xff\xff\x82\x00" "\xff\xff\x82\x00\xff\xff\x82\x00\xff\xff\x83\x00\xff\xff\x83\x00" "\xff\xff\x83\x00\xff\xff\x83\x00\xff\xff\x83\x00\xff\xff\x83\x00" "\xff\xff\x83\x00\xff\xff\x84\x00\xff\xff\x84\x00\xff\xff\x84\x00" "\xff\xff\x84\x00\xff\xff\x84\x00\xff\xff\x84\x00\xff\xff\x84\x00" "\xff\xff\x84\x00\xff\xff\x84\x00\xff\xff\x84\x00\xff\xff\x84\x00" "\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x85\x00" "\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x85\x00" "\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x85\x00" "\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x85\x00" "\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x86\x00" "\xff\xff\x86\x00\xff\xff\x86\x00\xff\xff\x86\x00\xff\xff\x86\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x07\x00\x00\x00\x0a\x00\x00\x00\x0d\x00" "\x00\x00\x10\x00\x0e\x00\x13\x00\x7a\x00\x16\x00\xed\x00\x19\x00" "\xff\x00\x1c\x00\xff\x00\x1e\x00\xff\x00\x20\x00\xff\x00\x23\x00" "\xff\x00\x25\x00\xff\x00\x28\x00\xff\x00\x2a\x00\xff\x00\x2d\x00" "\xff\x00\x2f\x00\xff\x00\x31\x00\xff\x00\x34\x00\xff\x00\x36\x00" "\xff\x00\x38\x00\xff\x00\x3a\x00\xff\x00\x3c\x00\xff\x00\x3d\x00" "\xff\x00\x3f\x00\xff\x00\x41\x00\xff\x00\x43\x00\xff\x00\x45\x00" "\xff\x00\x47\x00\xff\x00\x49\x00\xff\x00\x4a\x00\xff\x00\x4b\x00" "\xff\x00\x4d\x00\xff\x00\x4e\x00\xff\x00\x50\x00\xff\x00\x51\x00" "\xff\x00\x53\x00\xff\x00\x54\x00\xff\x00\x55\x00\xff\x00\x57\x00" "\xff\x00\x58\x00\xff\x00\x5a\x00\xff\x00\x5b\x00\xff\x04\x5c\x00" "\xff\x37\x5d\x00\xff\x6f\x5e\x00\xff\xa5\x5f\x00\xff\xdc\x60\x00" "\xff\xff\x61\x00\xff\xff\x62\x00\xff\xff\x63\x00\xff\xff\x64\x00" "\xff\xff\x65\x00\xff\xff\x66\x00\xff\xff\x67\x00\xff\xff\x68\x00" "\xff\xff\x69\x00\xff\xff\x6a\x00\xff\xff\x6a\x00\xff\xff\x6b\x00" "\xff\xff\x6c\x00\xff\xff\x6d\x00\xff\xff\x6e\x00\xff\xff\x6e\x00" "\xff\xff\x6f\x00\xff\xff\x70\x00\xff\xff\x71\x00\xff\xff\x71\x00" "\xff\xff\x72\x00\xff\xff\x72\x00\xff\xff\x73\x00\xff\xff\x74\x00" "\xff\xff\x74\x00\xff\xff\x75\x00\xff\xff\x75\x00\xff\xff\x76\x00" "\xff\xff\x77\x00\xff\xff\x77\x00\xff\xff\x78\x00\xff\xff\x78\x00" "\xff\xff\x79\x00\xff\xff\x79\x00\xff\xff\x7a\x00\xff\xff\x7a\x00" "\xff\xff\x7a\x00\xff\xff\x7b\x00\xff\xff\x7b\x00\xff\xff\x7c\x00" "\xff\xff\x7c\x00\xff\xff\x7d\x00\xff\xff\x7d\x00\xff\xff\x7d\x00" "\xff\xff\x7e\x00\xff\xff\x7e\x00\xff\xff\x7f\x00\xff\xff\x7f\x00" "\xff\xff\x7f\x00\xff\xff\x7f\x00\xff\xff\x80\x00\xff\xff\x80\x00" "\xff\xff\x80\x00\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x81\x00" "\xff\xff\x82\x00\xff\xff\x82\x00\xff\xff\x82\x00\xff\xff\x82\x00" "\xff\xff\x83\x00\xff\xff\x83\x00\xff\xff\x83\x00\xff\xff\x83\x00" "\xff\xff\x84\x00\xff\xff\x84\x00\xff\xff\x84\x00\xff\xff\x84\x00" "\xff\xff\x84\x00\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x85\x00" "\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x86\x00\xff\xff\x86\x00" "\xff\xff\x86\x00\xff\xff\x86\x00\xff\xff\x86\x00\xff\xff\x86\x00" "\xff\xff\x87\x00\xff\xff\x87\x00\xff\xff\x87\x00\xff\xff\x87\x00" "\xff\xff\x87\x00\xff\xff\x87\x00\xff\xff\x87\x00\xff\xff\x87\x00" "\xff\xff\x88\x00\xff\xff\x88\x00\xff\xff\x88\x00\xff\xff\x88\x00" "\xff\xff\x88\x00\xff\xff\x88\x00\xff\xff\x88\x00\xff\xff\x88\x00" "\xff\xff\x88\x00\xff\xff\x89\x00\xff\xff\x89\x00\xff\xff\x89\x00" "\xff\xff\x89\x00\xff\xff\x89\x00\xff\xff\x89\x00\xff\xff\x89\x00" "\xff\xff\x89\x00\xff\xff\x89\x00\xff\xff\x89\x00\xff\xff\x89\x00" "\xff\xff\x89\x00\xff\xff\x89\x00\xff\xff\x89\x00\xff\xff\x89\x00" "\xff\xff\x8a\x00\xff\xff\x8a\x00\xff\xff\x8a\x00\xff\xff\x8a\x00" "\xff\xff\x8a\x00\xff\xff\x8a\x00\xff\xff\x8a\x00\xff\xff\x8a\x00" "\xff\xff\x8a\x00\xff\xff\x8a\x00\xff\xff\x8a\x00\xff\xff\x8a\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x07\x00" "\x00\x00\x0a\x00\x00\x00\x0d\x00\x00\x00\x10\x00\x0a\x00\x13\x00" "\x7a\x00\x16\x00\xed\x00\x19\x00\xff\x00\x1c\x00\xff\x00\x1f\x00" "\xff\x00\x22\x00\xff\x00\x24\x00\xff\x00\x26\x00\xff\x00\x29\x00" "\xff\x00\x2b\x00\xff\x00\x2e\x00\xff\x00\x30\x00\xff\x00\x32\x00" "\xff\x00\x35\x00\xff\x00\x37\x00\xff\x00\x3a\x00\xff\x00\x3c\x00" "\xff\x00\x3d\x00\xff\x00\x3f\x00\xff\x00\x41\x00\xff\x00\x43\x00" "\xff\x00\x45\x00\xff\x00\x47\x00\xff\x00\x49\x00\xff\x00\x4a\x00" "\xff\x00\x4c\x00\xff\x00\x4e\x00\xff\x00\x4f\x00\xff\x00\x51\x00" "\xff\x00\x52\x00\xff\x00\x54\x00\xff\x00\x55\x00\xff\x00\x57\x00" "\xff\x00\x58\x00\xff\x00\x59\x00\xff\x00\x5b\x00\xff\x01\x5c\x00" "\xff\x28\x5d\x00\xff\x6c\x5f\x00\xff\xb0\x60\x00\xff\xf1\x61\x00" "\xff\xff\x62\x00\xff\xff\x63\x00\xff\xff\x64\x00\xff\xff\x65\x00" "\xff\xff\x66\x00\xff\xff\x67\x00\xff\xff\x68\x00\xff\xff\x69\x00" "\xff\xff\x6a\x00\xff\xff\x6b\x00\xff\xff\x6c\x00\xff\xff\x6d\x00" "\xff\xff\x6e\x00\xff\xff\x6e\x00\xff\xff\x6f\x00\xff\xff\x70\x00" "\xff\xff\x71\x00\xff\xff\x72\x00\xff\xff\x72\x00\xff\xff\x73\x00" "\xff\xff\x74\x00\xff\xff\x75\x00\xff\xff\x75\x00\xff\xff\x76\x00" "\xff\xff\x76\x00\xff\xff\x77\x00\xff\xff\x78\x00\xff\xff\x78\x00" "\xff\xff\x79\x00\xff\xff\x79\x00\xff\xff\x7a\x00\xff\xff\x7b\x00" "\xff\xff\x7b\x00\xff\xff\x7c\x00\xff\xff\x7c\x00\xff\xff\x7d\x00" "\xff\xff\x7d\x00\xff\xff\x7e\x00\xff\xff\x7e\x00\xff\xff\x7e\x00" "\xff\xff\x7f\x00\xff\xff\x7f\x00\xff\xff\x80\x00\xff\xff\x80\x00" "\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x82\x00" "\xff\xff\x82\x00\xff\xff\x83\x00\xff\xff\x83\x00\xff\xff\x83\x00" "\xff\xff\x83\x00\xff\xff\x84\x00\xff\xff\x84\x00\xff\xff\x84\x00" "\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x86\x00" "\xff\xff\x86\x00\xff\xff\x86\x00\xff\xff\x86\x00\xff\xff\x87\x00" "\xff\xff\x87\x00\xff\xff\x87\x00\xff\xff\x87\x00\xff\xff\x88\x00" "\xff\xff\x88\x00\xff\xff\x88\x00\xff\xff\x88\x00\xff\xff\x88\x00" "\xff\xff\x89\x00\xff\xff\x89\x00\xff\xff\x89\x00\xff\xff\x89\x00" "\xff\xff\x89\x00\xff\xff\x8a\x00\xff\xff\x8a\x00\xff\xff\x8a\x00" "\xff\xff\x8a\x00\xff\xff\x8a\x00\xff\xff\x8a\x00\xff\xff\x8b\x00" "\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8b\x00" "\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8c\x00" "\xff\xff\x8c\x00\xff\xff\x8c\x00\xff\xff\x8c\x00\xff\xff\x8c\x00" "\xff\xff\x8c\x00\xff\xff\x8c\x00\xff\xff\x8c\x00\xff\xff\x8c\x00" "\xff\xff\x8d\x00\xff\xff\x8d\x00\xff\xff\x8d\x00\xff\xff\x8d\x00" "\xff\xff\x8d\x00\xff\xff\x8d\x00\xff\xff\x8d\x00\xff\xff\x8d\x00" "\xff\xff\x8d\x00\xff\xff\x8d\x00\xff\xff\x8d\x00\xff\xff\x8d\x00" "\xff\xff\x8d\x00\xff\xff\x8d\x00\xff\xff\x8d\x00\xff\xff\x8e\x00" "\xff\xff\x8e\x00\xff\xff\x8e\x00\xff\xff\x8e\x00\xff\xff\x8e\x00" "\xff\xff\x8e\x00\xff\xff\x8e\x00\xff\xff\x8e\x00\xff\xff\x8e\x00" "\xff\xff\x8e\x00\xff\xff\x8e\x00\xff\xff\x8e\x00\xff\xff\x8e\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\x0a\x00\x00\x00\x0d\x00" "\x00\x00\x10\x00\x00\x00\x13\x00\x4b\x00\x16\x00\xdf\x00\x19\x00" "\xff\x00\x1c\x00\xff\x00\x1f\x00\xff\x00\x22\x00\xff\x00\x25\x00" "\xff\x00\x27\x00\xff\x00\x2a\x00\xff\x00\x2c\x00\xff\x00\x2f\x00" "\xff\x00\x31\x00\xff\x00\x33\x00\xff\x00\x36\x00\xff\x00\x38\x00" "\xff\x00\x3a\x00\xff\x00\x3d\x00\xff\x00\x3f\x00\xff\x00\x41\x00" "\xff\x00\x43\x00\xff\x00\x45\x00\xff\x00\x47\x00\xff\x00\x49\x00" "\xff\x00\x4a\x00\xff\x00\x4c\x00\xff\x00\x4e\x00\xff\x00\x50\x00" "\xff\x00\x51\x00\xff\x00\x53\x00\xff\x00\x55\x00\xff\x00\x56\x00" "\xff\x00\x58\x00\xff\x00\x59\x00\xff\x00\x5a\x00\xff\x00\x5c\x00" "\xff\x17\x5d\x00\xff\x5b\x5e\x00\xff\x9f\x60\x00\xff\xe3\x61\x00" "\xff\xff\x63\x00\xff\xff\x64\x00\xff\xff\x65\x00\xff\xff\x66\x00" "\xff\xff\x67\x00\xff\xff\x68\x00\xff\xff\x69\x00\xff\xff\x6a\x00" "\xff\xff\x6b\x00\xff\xff\x6c\x00\xff\xff\x6d\x00\xff\xff\x6e\x00" "\xff\xff\x6f\x00\xff\xff\x70\x00\xff\xff\x71\x00\xff\xff\x72\x00" "\xff\xff\x72\x00\xff\xff\x73\x00\xff\xff\x74\x00\xff\xff\x75\x00" "\xff\xff\x75\x00\xff\xff\x76\x00\xff\xff\x77\x00\xff\xff\x78\x00" "\xff\xff\x78\x00\xff\xff\x79\x00\xff\xff\x7a\x00\xff\xff\x7a\x00" "\xff\xff\x7b\x00\xff\xff\x7c\x00\xff\xff\x7c\x00\xff\xff\x7d\x00" "\xff\xff\x7d\x00\xff\xff\x7e\x00\xff\xff\x7e\x00\xff\xff\x7f\x00" "\xff\xff\x80\x00\xff\xff\x80\x00\xff\xff\x81\x00\xff\xff\x81\x00" "\xff\xff\x82\x00\xff\xff\x82\x00\xff\xff\x82\x00\xff\xff\x83\x00" "\xff\xff\x83\x00\xff\xff\x84\x00\xff\xff\x84\x00\xff\xff\x84\x00" "\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x86\x00\xff\xff\x86\x00" "\xff\xff\x86\x00\xff\xff\x87\x00\xff\xff\x87\x00\xff\xff\x87\x00" "\xff\xff\x88\x00\xff\xff\x88\x00\xff\xff\x88\x00\xff\xff\x89\x00" "\xff\xff\x89\x00\xff\xff\x89\x00\xff\xff\x89\x00\xff\xff\x8a\x00" "\xff\xff\x8a\x00\xff\xff\x8a\x00\xff\xff\x8b\x00\xff\xff\x8b\x00" "\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8c\x00" "\xff\xff\x8c\x00\xff\xff\x8c\x00\xff\xff\x8c\x00\xff\xff\x8d\x00" "\xff\xff\x8d\x00\xff\xff\x8d\x00\xff\xff\x8d\x00\xff\xff\x8d\x00" "\xff\xff\x8d\x00\xff\xff\x8e\x00\xff\xff\x8e\x00\xff\xff\x8e\x00" "\xff\xff\x8e\x00\xff\xff\x8e\x00\xff\xff\x8e\x00\xff\xff\x8f\x00" "\xff\xff\x8f\x00\xff\xff\x8f\x00\xff\xff\x8f\x00\xff\xff\x8f\x00" "\xff\xff\x8f\x00\xff\xff\x8f\x00\xff\xff\x8f\x00\xff\xff\x90\x00" "\xff\xff\x90\x00\xff\xff\x90\x00\xff\xff\x90\x00\xff\xff\x90\x00" "\xff\xff\x90\x00\xff\xff\x90\x00\xff\xff\x90\x00\xff\xff\x90\x00" "\xff\xff\x90\x00\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x91\x00" "\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x91\x00" "\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x91\x00" "\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x91\x00" "\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x92\x00\xff\xff\x92\x00" "\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x92\x00" "\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x92\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x05\x00" "\x00\x00\x09\x00\x00\x00\x0c\x00\x00\x00\x10\x00\x00\x00\x13\x00" "\x1d\x00\x16\x00\xae\x00\x19\x00\xff\x00\x1c\x00\xff\x00\x1f\x00" "\xff\x00\x22\x00\xff\x00\x25\x00\xff\x00\x28\x00\xff\x00\x2a\x00" "\xff\x00\x2d\x00\xff\x00\x30\x00\xff\x00\x32\x00\xff\x00\x34\x00" "\xff\x00\x37\x00\xff\x00\x39\x00\xff\x00\x3c\x00\xff\x00\x3e\x00" "\xff\x00\x40\x00\xff\x00\x42\x00\xff\x00\x44\x00\xff\x00\x47\x00" "\xff\x00\x49\x00\xff\x00\x4a\x00\xff\x00\x4c\x00\xff\x00\x4e\x00" "\xff\x00\x50\x00\xff\x00\x51\x00\xff\x00\x53\x00\xff\x00\x55\x00" "\xff\x00\x57\x00\xff\x00\x58\x00\xff\x00\x5a\x00\xff\x00\x5b\x00" "\xff\x08\x5d\x00\xff\x49\x5e\x00\xff\x8e\x60\x00\xff\xd2\x61\x00" "\xff\xff\x62\x00\xff\xff\x63\x00\xff\xff\x65\x00\xff\xff\x66\x00" "\xff\xff\x67\x00\xff\xff\x69\x00\xff\xff\x6a\x00\xff\xff\x6b\x00" "\xff\xff\x6c\x00\xff\xff\x6d\x00\xff\xff\x6e\x00\xff\xff\x6f\x00" "\xff\xff\x70\x00\xff\xff\x71\x00\xff\xff\x72\x00\xff\xff\x73\x00" "\xff\xff\x74\x00\xff\xff\x75\x00\xff\xff\x75\x00\xff\xff\x76\x00" "\xff\xff\x77\x00\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x79\x00" "\xff\xff\x7a\x00\xff\xff\x7b\x00\xff\xff\x7b\x00\xff\xff\x7c\x00" "\xff\xff\x7d\x00\xff\xff\x7e\x00\xff\xff\x7e\x00\xff\xff\x7f\x00" "\xff\xff\x7f\x00\xff\xff\x80\x00\xff\xff\x81\x00\xff\xff\x81\x00" "\xff\xff\x82\x00\xff\xff\x82\x00\xff\xff\x83\x00\xff\xff\x83\x00" "\xff\xff\x84\x00\xff\xff\x84\x00\xff\xff\x85\x00\xff\xff\x85\x00" "\xff\xff\x86\x00\xff\xff\x86\x00\xff\xff\x87\x00\xff\xff\x87\x00" "\xff\xff\x87\x00\xff\xff\x88\x00\xff\xff\x88\x00\xff\xff\x89\x00" "\xff\xff\x89\x00\xff\xff\x89\x00\xff\xff\x8a\x00\xff\xff\x8a\x00" "\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8b\x00" "\xff\xff\x8c\x00\xff\xff\x8c\x00\xff\xff\x8c\x00\xff\xff\x8d\x00" "\xff\xff\x8d\x00\xff\xff\x8d\x00\xff\xff\x8d\x00\xff\xff\x8e\x00" "\xff\xff\x8e\x00\xff\xff\x8e\x00\xff\xff\x8f\x00\xff\xff\x8f\x00" "\xff\xff\x8f\x00\xff\xff\x8f\x00\xff\xff\x8f\x00\xff\xff\x90\x00" "\xff\xff\x90\x00\xff\xff\x90\x00\xff\xff\x90\x00\xff\xff\x90\x00" "\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x91\x00" "\xff\xff\x91\x00\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x92\x00" "\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x92\x00" "\xff\xff\x93\x00\xff\xff\x93\x00\xff\xff\x93\x00\xff\xff\x93\x00" "\xff\xff\x93\x00\xff\xff\x93\x00\xff\xff\x93\x00\xff\xff\x93\x00" "\xff\xff\x93\x00\xff\xff\x94\x00\xff\xff\x94\x00\xff\xff\x94\x00" "\xff\xff\x94\x00\xff\xff\x94\x00\xff\xff\x94\x00\xff\xff\x94\x00" "\xff\xff\x94\x00\xff\xff\x94\x00\xff\xff\x94\x00\xff\xff\x94\x00" "\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00" "\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00" "\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00" "\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00" "\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00" "\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x07\x00\x00\x00\x0b\x00" "\x00\x00\x0e\x00\x00\x00\x13\x00\x05\x00\x16\x00\x74\x00\x19\x00" "\xf4\x00\x1c\x00\xff\x00\x1f\x00\xff\x00\x22\x00\xff\x00\x25\x00" "\xff\x00\x28\x00\xff\x00\x2a\x00\xff\x00\x2d\x00\xff\x00\x30\x00" "\xff\x00\x33\x00\xff\x00\x36\x00\xff\x00\x38\x00\xff\x00\x3a\x00" "\xff\x00\x3d\x00\xff\x00\x3f\x00\xff\x00\x41\x00\xff\x00\x43\x00" "\xff\x00\x45\x00\xff\x00\x48\x00\xff\x00\x4a\x00\xff\x00\x4c\x00" "\xff\x00\x4e\x00\xff\x00\x50\x00\xff\x00\x51\x00\xff\x00\x53\x00" "\xff\x00\x55\x00\xff\x00\x57\x00\xff\x00\x58\x00\xff\x00\x5a\x00" "\xff\x00\x5c\x00\xff\x08\x5d\x00\xff\x50\x5f\x00\xff\xa5\x60\x00" "\xff\xf2\x62\x00\xff\xff\x63\x00\xff\xff\x64\x00\xff\xff\x66\x00" "\xff\xff\x67\x00\xff\xff\x68\x00\xff\xff\x6a\x00\xff\xff\x6b\x00" "\xff\xff\x6c\x00\xff\xff\x6d\x00\xff\xff\x6f\x00\xff\xff\x70\x00" "\xff\xff\x71\x00\xff\xff\x71\x00\xff\xff\x72\x00\xff\xff\x73\x00" "\xff\xff\x74\x00\xff\xff\x75\x00\xff\xff\x76\x00\xff\xff\x77\x00" "\xff\xff\x78\x00\xff\xff\x79\x00\xff\xff\x7a\x00\xff\xff\x7b\x00" "\xff\xff\x7b\x00\xff\xff\x7c\x00\xff\xff\x7d\x00\xff\xff\x7e\x00" "\xff\xff\x7e\x00\xff\xff\x7f\x00\xff\xff\x80\x00\xff\xff\x81\x00" "\xff\xff\x81\x00\xff\xff\x82\x00\xff\xff\x83\x00\xff\xff\x83\x00" "\xff\xff\x84\x00\xff\xff\x84\x00\xff\xff\x85\x00\xff\xff\x85\x00" "\xff\xff\x86\x00\xff\xff\x86\x00\xff\xff\x87\x00\xff\xff\x87\x00" "\xff\xff\x88\x00\xff\xff\x89\x00\xff\xff\x89\x00\xff\xff\x8a\x00" "\xff\xff\x8a\x00\xff\xff\x8a\x00\xff\xff\x8b\x00\xff\xff\x8b\x00" "\xff\xff\x8b\x00\xff\xff\x8c\x00\xff\xff\x8c\x00\xff\xff\x8d\x00" "\xff\xff\x8d\x00\xff\xff\x8d\x00\xff\xff\x8e\x00\xff\xff\x8e\x00" "\xff\xff\x8f\x00\xff\xff\x8f\x00\xff\xff\x8f\x00\xff\xff\x8f\x00" "\xff\xff\x90\x00\xff\xff\x90\x00\xff\xff\x90\x00\xff\xff\x91\x00" "\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x92\x00" "\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x93\x00" "\xff\xff\x93\x00\xff\xff\x93\x00\xff\xff\x93\x00\xff\xff\x94\x00" "\xff\xff\x94\x00\xff\xff\x94\x00\xff\xff\x94\x00\xff\xff\x94\x00" "\xff\xff\x94\x00\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00" "\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x96\x00\xff\xff\x96\x00" "\xff\xff\x96\x00\xff\xff\x96\x00\xff\xff\x96\x00\xff\xff\x96\x00" "\xff\xff\x96\x00\xff\xff\x96\x00\xff\xff\x97\x00\xff\xff\x97\x00" "\xff\xff\x97\x00\xff\xff\x97\x00\xff\xff\x97\x00\xff\xff\x97\x00" "\xff\xff\x97\x00\xff\xff\x97\x00\xff\xff\x97\x00\xff\xff\x98\x00" "\xff\xff\x98\x00\xff\xff\x98\x00\xff\xff\x98\x00\xff\xff\x98\x00" "\xff\xff\x98\x00\xff\xff\x98\x00\xff\xff\x98\x00\xff\xff\x98\x00" "\xff\xff\x98\x00\xff\xff\x98\x00\xff\xff\x98\x00\xff\xff\x98\x00" "\xff\xff\x98\x00\xff\xff\x98\x00\xff\xff\x99\x00\xff\xff\x99\x00" "\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x99\x00" "\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x99\x00" "\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x99\x00" "\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x99\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00" "\x00\x00\x06\x00\x00\x00\x0a\x00\x00\x00\x0d\x00\x00\x00\x11\x00" "\x00\x00\x15\x00\x3b\x00\x18\x00\xd2\x00\x1c\x00\xff\x00\x1f\x00" "\xff\x00\x22\x00\xff\x00\x25\x00\xff\x00\x28\x00\xff\x00\x2a\x00" "\xff\x00\x2d\x00\xff\x00\x30\x00\xff\x00\x33\x00\xff\x00\x36\x00" "\xff\x00\x38\x00\xff\x00\x3b\x00\xff\x00\x3e\x00\xff\x00\x40\x00" "\xff\x00\x42\x00\xff\x00\x44\x00\xff\x00\x46\x00\xff\x00\x49\x00" "\xff\x00\x4b\x00\xff\x00\x4d\x00\xff\x00\x4f\x00\xff\x00\x51\x00" "\xff\x00\x53\x00\xff\x00\x55\x00\xff\x00\x57\x00\xff\x00\x58\x00" "\xff\x00\x5a\x00\xff\x00\x5c\x00\xff\x09\x5d\x00\xff\x51\x5f\x00" "\xff\xa6\x61\x00\xff\xf3\x62\x00\xff\xff\x64\x00\xff\xff\x65\x00" "\xff\xff\x67\x00\xff\xff\x68\x00\xff\xff\x69\x00\xff\xff\x6b\x00" "\xff\xff\x6c\x00\xff\xff\x6d\x00\xff\xff\x6e\x00\xff\xff\x70\x00" "\xff\xff\x71\x00\xff\xff\x72\x00\xff\xff\x73\x00\xff\xff\x74\x00" "\xff\xff\x75\x00\xff\xff\x76\x00\xff\xff\x77\x00\xff\xff\x78\x00" "\xff\xff\x79\x00\xff\xff\x7a\x00\xff\xff\x7b\x00\xff\xff\x7c\x00" "\xff\xff\x7d\x00\xff\xff\x7e\x00\xff\xff\x7e\x00\xff\xff\x7f\x00" "\xff\xff\x80\x00\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x82\x00" "\xff\xff\x83\x00\xff\xff\x83\x00\xff\xff\x84\x00\xff\xff\x85\x00" "\xff\xff\x85\x00\xff\xff\x86\x00\xff\xff\x87\x00\xff\xff\x87\x00" "\xff\xff\x88\x00\xff\xff\x88\x00\xff\xff\x89\x00\xff\xff\x89\x00" "\xff\xff\x8a\x00\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8c\x00" "\xff\xff\x8c\x00\xff\xff\x8d\x00\xff\xff\x8d\x00\xff\xff\x8e\x00" "\xff\xff\x8e\x00\xff\xff\x8e\x00\xff\xff\x8f\x00\xff\xff\x8f\x00" "\xff\xff\x8f\x00\xff\xff\x90\x00\xff\xff\x90\x00\xff\xff\x91\x00" "\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x92\x00\xff\xff\x92\x00" "\xff\xff\x92\x00\xff\xff\x93\x00\xff\xff\x93\x00\xff\xff\x93\x00" "\xff\xff\x94\x00\xff\xff\x94\x00\xff\xff\x94\x00\xff\xff\x94\x00" "\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00" "\xff\xff\x96\x00\xff\xff\x96\x00\xff\xff\x96\x00\xff\xff\x96\x00" "\xff\xff\x97\x00\xff\xff\x97\x00\xff\xff\x97\x00\xff\xff\x97\x00" "\xff\xff\x97\x00\xff\xff\x98\x00\xff\xff\x98\x00\xff\xff\x98\x00" "\xff\xff\x98\x00\xff\xff\x98\x00\xff\xff\x98\x00\xff\xff\x99\x00" "\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x99\x00" "\xff\xff\x99\x00\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9a\x00" "\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9a\x00" "\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9b\x00\xff\xff\x9b\x00" "\xff\xff\x9b\x00\xff\xff\x9b\x00\xff\xff\x9b\x00\xff\xff\x9b\x00" "\xff\xff\x9b\x00\xff\xff\x9b\x00\xff\xff\x9b\x00\xff\xff\x9b\x00" "\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9c\x00" "\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9c\x00" "\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9c\x00" "\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9c\x00" "\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9c\x00" "\xff\xff\x9c\x00\xff\xff\x9d\x00\xff\xff\x9d\x00\xff\xff\x9d\x00" "\xff\xff\x9d\x00\xff\xff\x9d\x00\xff\xff\x9d\x00\xff\xff\x9d\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00\x08\x00" "\x00\x00\x0c\x00\x00\x00\x0f\x00\x00\x00\x14\x00\x10\x00\x17\x00" "\x9c\x00\x1a\x00\xff\x00\x1e\x00\xff\x00\x21\x00\xff\x00\x24\x00" "\xff\x00\x28\x00\xff\x00\x2a\x00\xff\x00\x2d\x00\xff\x00\x30\x00" "\xff\x00\x33\x00\xff\x00\x36\x00\xff\x00\x38\x00\xff\x00\x3b\x00" "\xff\x00\x3e\x00\xff\x00\x40\x00\xff\x00\x43\x00\xff\x00\x45\x00" "\xff\x00\x47\x00\xff\x00\x4a\x00\xff\x00\x4c\x00\xff\x00\x4e\x00" "\xff\x00\x50\x00\xff\x00\x52\x00\xff\x00\x54\x00\xff\x00\x56\x00" "\xff\x00\x58\x00\xff\x00\x5a\x00\xff\x00\x5c\x00\xff\x0a\x5d\x00" "\xff\x53\x5f\x00\xff\xa8\x61\x00\xff\xf4\x62\x00\xff\xff\x64\x00" "\xff\xff\x66\x00\xff\xff\x67\x00\xff\xff\x69\x00\xff\xff\x6a\x00" "\xff\xff\x6c\x00\xff\xff\x6d\x00\xff\xff\x6e\x00\xff\xff\x6f\x00" "\xff\xff\x71\x00\xff\xff\x72\x00\xff\xff\x73\x00\xff\xff\x74\x00" "\xff\xff\x75\x00\xff\xff\x77\x00\xff\xff\x78\x00\xff\xff\x79\x00" "\xff\xff\x7a\x00\xff\xff\x7b\x00\xff\xff\x7c\x00\xff\xff\x7c\x00" "\xff\xff\x7d\x00\xff\xff\x7e\x00\xff\xff\x7f\x00\xff\xff\x80\x00" "\xff\xff\x81\x00\xff\xff\x82\x00\xff\xff\x83\x00\xff\xff\x83\x00" "\xff\xff\x84\x00\xff\xff\x85\x00\xff\xff\x86\x00\xff\xff\x86\x00" "\xff\xff\x87\x00\xff\xff\x88\x00\xff\xff\x88\x00\xff\xff\x89\x00" "\xff\xff\x8a\x00\xff\xff\x8a\x00\xff\xff\x8b\x00\xff\xff\x8b\x00" "\xff\xff\x8c\x00\xff\xff\x8c\x00\xff\xff\x8d\x00\xff\xff\x8d\x00" "\xff\xff\x8e\x00\xff\xff\x8e\x00\xff\xff\x8f\x00\xff\xff\x8f\x00" "\xff\xff\x90\x00\xff\xff\x90\x00\xff\xff\x91\x00\xff\xff\x91\x00" "\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x93\x00" "\xff\xff\x93\x00\xff\xff\x94\x00\xff\xff\x94\x00\xff\xff\x94\x00" "\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x96\x00" "\xff\xff\x96\x00\xff\xff\x96\x00\xff\xff\x97\x00\xff\xff\x97\x00" "\xff\xff\x97\x00\xff\xff\x97\x00\xff\xff\x98\x00\xff\xff\x98\x00" "\xff\xff\x98\x00\xff\xff\x98\x00\xff\xff\x99\x00\xff\xff\x99\x00" "\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x9a\x00\xff\xff\x9a\x00" "\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9b\x00\xff\xff\x9b\x00" "\xff\xff\x9b\x00\xff\xff\x9b\x00\xff\xff\x9b\x00\xff\xff\x9b\x00" "\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9c\x00" "\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9d\x00\xff\xff\x9d\x00" "\xff\xff\x9d\x00\xff\xff\x9d\x00\xff\xff\x9d\x00\xff\xff\x9d\x00" "\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\x9e\x00\xff\xff\x9e\x00" "\xff\xff\x9e\x00\xff\xff\x9e\x00\xff\xff\x9e\x00\xff\xff\x9e\x00" "\xff\xff\x9e\x00\xff\xff\x9e\x00\xff\xff\x9e\x00\xff\xff\x9f\x00" "\xff\xff\x9f\x00\xff\xff\x9f\x00\xff\xff\x9f\x00\xff\xff\x9f\x00" "\xff\xff\x9f\x00\xff\xff\x9f\x00\xff\xff\x9f\x00\xff\xff\x9f\x00" "\xff\xff\x9f\x00\xff\xff\x9f\x00\xff\xff\x9f\x00\xff\xff\x9f\x00" "\xff\xff\x9f\x00\xff\xff\x9f\x00\xff\xff\xa0\x00\xff\xff\xa0\x00" "\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa0\x00" "\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa0\x00" "\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa0\x00" "\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa0\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x07\x00\x00\x00\x0b\x00\x00\x00\x0e\x00" "\x00\x00\x12\x00\x00\x00\x15\x00\x37\x00\x19\x00\xdf\x00\x1c\x00" "\xff\x00\x20\x00\xff\x00\x23\x00\xff\x00\x27\x00\xff\x00\x2a\x00" "\xff\x00\x2d\x00\xff\x00\x30\x00\xff\x00\x33\x00\xff\x00\x36\x00" "\xff\x00\x38\x00\xff\x00\x3b\x00\xff\x00\x3e\x00\xff\x00\x40\x00" "\xff\x00\x43\x00\xff\x00\x46\x00\xff\x00\x48\x00\xff\x00\x4b\x00" "\xff\x00\x4d\x00\xff\x00\x4f\x00\xff\x00\x51\x00\xff\x00\x53\x00" "\xff\x00\x55\x00\xff\x00\x57\x00\xff\x00\x59\x00\xff\x00\x5b\x00" "\xff\x01\x5d\x00\xff\x3a\x5f\x00\xff\xa3\x61\x00\xff\xf4\x62\x00" "\xff\xff\x64\x00\xff\xff\x66\x00\xff\xff\x67\x00\xff\xff\x69\x00" "\xff\xff\x6a\x00\xff\xff\x6c\x00\xff\xff\x6d\x00\xff\xff\x6f\x00" "\xff\xff\x70\x00\xff\xff\x71\x00\xff\xff\x73\x00\xff\xff\x74\x00" "\xff\xff\x75\x00\xff\xff\x76\x00\xff\xff\x78\x00\xff\xff\x79\x00" "\xff\xff\x7a\x00\xff\xff\x7b\x00\xff\xff\x7c\x00\xff\xff\x7d\x00" "\xff\xff\x7e\x00\xff\xff\x7f\x00\xff\xff\x80\x00\xff\xff\x81\x00" "\xff\xff\x82\x00\xff\xff\x83\x00\xff\xff\x83\x00\xff\xff\x84\x00" "\xff\xff\x85\x00\xff\xff\x86\x00\xff\xff\x87\x00\xff\xff\x88\x00" "\xff\xff\x88\x00\xff\xff\x89\x00\xff\xff\x8a\x00\xff\xff\x8a\x00" "\xff\xff\x8b\x00\xff\xff\x8c\x00\xff\xff\x8c\x00\xff\xff\x8d\x00" "\xff\xff\x8e\x00\xff\xff\x8e\x00\xff\xff\x8f\x00\xff\xff\x8f\x00" "\xff\xff\x90\x00\xff\xff\x90\x00\xff\xff\x91\x00\xff\xff\x91\x00" "\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x93\x00\xff\xff\x93\x00" "\xff\xff\x94\x00\xff\xff\x94\x00\xff\xff\x95\x00\xff\xff\x95\x00" "\xff\xff\x96\x00\xff\xff\x96\x00\xff\xff\x96\x00\xff\xff\x97\x00" "\xff\xff\x97\x00\xff\xff\x97\x00\xff\xff\x98\x00\xff\xff\x98\x00" "\xff\xff\x98\x00\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x99\x00" "\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9b\x00" "\xff\xff\x9b\x00\xff\xff\x9b\x00\xff\xff\x9b\x00\xff\xff\x9c\x00" "\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9d\x00" "\xff\xff\x9d\x00\xff\xff\x9d\x00\xff\xff\x9d\x00\xff\xff\x9d\x00" "\xff\xff\x9e\x00\xff\xff\x9e\x00\xff\xff\x9e\x00\xff\xff\x9e\x00" "\xff\xff\x9e\x00\xff\xff\x9f\x00\xff\xff\x9f\x00\xff\xff\x9f\x00" "\xff\xff\x9f\x00\xff\xff\x9f\x00\xff\xff\x9f\x00\xff\xff\xa0\x00" "\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa0\x00" "\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa1\x00" "\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa1\x00" "\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa2\x00" "\xff\xff\xa2\x00\xff\xff\xa2\x00\xff\xff\xa2\x00\xff\xff\xa2\x00" "\xff\xff\xa2\x00\xff\xff\xa2\x00\xff\xff\xa2\x00\xff\xff\xa2\x00" "\xff\xff\xa2\x00\xff\xff\xa2\x00\xff\xff\xa2\x00\xff\xff\xa2\x00" "\xff\xff\xa2\x00\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00" "\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00" "\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00" "\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00" "\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00" "\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00" "\x00\x00\x08\x00\x00\x00\x0c\x00\x00\x00\x10\x00\x00\x00\x14\x00" "\x01\x00\x17\x00\x73\x00\x1b\x00\xfb\x00\x1f\x00\xff\x00\x22\x00" "\xff\x00\x25\x00\xff\x00\x29\x00\xff\x00\x2c\x00\xff\x00\x2f\x00" "\xff\x00\x33\x00\xff\x00\x36\x00\xff\x00\x38\x00\xff\x00\x3b\x00" "\xff\x00\x3e\x00\xff\x00\x40\x00\xff\x00\x43\x00\xff\x00\x46\x00" "\xff\x00\x48\x00\xff\x00\x4b\x00\xff\x00\x4d\x00\xff\x00\x50\x00" "\xff\x00\x52\x00\xff\x00\x54\x00\xff\x00\x56\x00\xff\x00\x58\x00" "\xff\x00\x5a\x00\xff\x00\x5c\x00\xff\x0d\x5e\x00\xff\x68\x60\x00" "\xff\xd1\x62\x00\xff\xff\x64\x00\xff\xff\x66\x00\xff\xff\x67\x00" "\xff\xff\x69\x00\xff\xff\x6a\x00\xff\xff\x6c\x00\xff\xff\x6e\x00" "\xff\xff\x6f\x00\xff\xff\x71\x00\xff\xff\x72\x00\xff\xff\x74\x00" "\xff\xff\x75\x00\xff\xff\x76\x00\xff\xff\x77\x00\xff\xff\x78\x00" "\xff\xff\x7a\x00\xff\xff\x7b\x00\xff\xff\x7c\x00\xff\xff\x7d\x00" "\xff\xff\x7e\x00\xff\xff\x7f\x00\xff\xff\x81\x00\xff\xff\x81\x00" "\xff\xff\x82\x00\xff\xff\x83\x00\xff\xff\x84\x00\xff\xff\x85\x00" "\xff\xff\x86\x00\xff\xff\x87\x00\xff\xff\x88\x00\xff\xff\x88\x00" "\xff\xff\x89\x00\xff\xff\x8a\x00\xff\xff\x8b\x00\xff\xff\x8c\x00" "\xff\xff\x8c\x00\xff\xff\x8d\x00\xff\xff\x8e\x00\xff\xff\x8e\x00" "\xff\xff\x8f\x00\xff\xff\x90\x00\xff\xff\x90\x00\xff\xff\x91\x00" "\xff\xff\x91\x00\xff\xff\x92\x00\xff\xff\x93\x00\xff\xff\x93\x00" "\xff\xff\x94\x00\xff\xff\x94\x00\xff\xff\x95\x00\xff\xff\x95\x00" "\xff\xff\x96\x00\xff\xff\x96\x00\xff\xff\x96\x00\xff\xff\x97\x00" "\xff\xff\x97\x00\xff\xff\x98\x00\xff\xff\x98\x00\xff\xff\x99\x00" "\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x9a\x00\xff\xff\x9a\x00" "\xff\xff\x9b\x00\xff\xff\x9b\x00\xff\xff\x9b\x00\xff\xff\x9c\x00" "\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9d\x00\xff\xff\x9d\x00" "\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\x9e\x00\xff\xff\x9e\x00" "\xff\xff\x9e\x00\xff\xff\x9e\x00\xff\xff\x9f\x00\xff\xff\x9f\x00" "\xff\xff\x9f\x00\xff\xff\x9f\x00\xff\xff\xa0\x00\xff\xff\xa0\x00" "\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa1\x00" "\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa2\x00" "\xff\xff\xa2\x00\xff\xff\xa2\x00\xff\xff\xa2\x00\xff\xff\xa2\x00" "\xff\xff\xa2\x00\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00" "\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00" "\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa4\x00" "\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa4\x00" "\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa5\x00\xff\xff\xa5\x00" "\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa5\x00" "\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa5\x00" "\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa6\x00\xff\xff\xa6\x00" "\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00" "\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00" "\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00" "\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00" "\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00" "\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00\x0a\x00" "\x00\x00\x0e\x00\x00\x00\x12\x00\x00\x00\x16\x00\x13\x00\x1a\x00" "\xb3\x00\x1d\x00\xff\x00\x21\x00\xff\x00\x24\x00\xff\x00\x27\x00" "\xff\x00\x2b\x00\xff\x00\x2e\x00\xff\x00\x31\x00\xff\x00\x35\x00" "\xff\x00\x38\x00\xff\x00\x3b\x00\xff\x00\x3e\x00\xff\x00\x40\x00" "\xff\x00\x43\x00\xff\x00\x46\x00\xff\x00\x48\x00\xff\x00\x4b\x00" "\xff\x00\x4d\x00\xff\x00\x50\x00\xff\x00\x52\x00\xff\x00\x55\x00" "\xff\x00\x57\x00\xff\x00\x59\x00\xff\x00\x5b\x00\xff\x00\x5d\x00" "\xff\x2d\x5f\x00\xff\x96\x61\x00\xff\xf3\x63\x00\xff\xff\x65\x00" "\xff\xff\x67\x00\xff\xff\x69\x00\xff\xff\x6a\x00\xff\xff\x6c\x00" "\xff\xff\x6e\x00\xff\xff\x6f\x00\xff\xff\x71\x00\xff\xff\x72\x00" "\xff\xff\x74\x00\xff\xff\x75\x00\xff\xff\x77\x00\xff\xff\x78\x00" "\xff\xff\x79\x00\xff\xff\x7a\x00\xff\xff\x7c\x00\xff\xff\x7d\x00" "\xff\xff\x7e\x00\xff\xff\x7f\x00\xff\xff\x80\x00\xff\xff\x81\x00" "\xff\xff\x82\x00\xff\xff\x84\x00\xff\xff\x85\x00\xff\xff\x86\x00" "\xff\xff\x86\x00\xff\xff\x87\x00\xff\xff\x88\x00\xff\xff\x89\x00" "\xff\xff\x8a\x00\xff\xff\x8b\x00\xff\xff\x8c\x00\xff\xff\x8c\x00" "\xff\xff\x8d\x00\xff\xff\x8e\x00\xff\xff\x8f\x00\xff\xff\x90\x00" "\xff\xff\x90\x00\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x92\x00" "\xff\xff\x93\x00\xff\xff\x93\x00\xff\xff\x94\x00\xff\xff\x95\x00" "\xff\xff\x95\x00\xff\xff\x96\x00\xff\xff\x96\x00\xff\xff\x97\x00" "\xff\xff\x97\x00\xff\xff\x98\x00\xff\xff\x98\x00\xff\xff\x99\x00" "\xff\xff\x99\x00\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9b\x00" "\xff\xff\x9b\x00\xff\xff\x9b\x00\xff\xff\x9c\x00\xff\xff\x9c\x00" "\xff\xff\x9d\x00\xff\xff\x9d\x00\xff\xff\x9d\x00\xff\xff\x9e\x00" "\xff\xff\x9e\x00\xff\xff\x9e\x00\xff\xff\x9f\x00\xff\xff\x9f\x00" "\xff\xff\x9f\x00\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa0\x00" "\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa1\x00" "\xff\xff\xa2\x00\xff\xff\xa2\x00\xff\xff\xa2\x00\xff\xff\xa2\x00" "\xff\xff\xa2\x00\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00" "\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa4\x00" "\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa5\x00\xff\xff\xa5\x00" "\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa5\x00" "\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00" "\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa7\x00" "\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa7\x00" "\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa7\x00" "\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa8\x00" "\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa8\x00" "\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa8\x00" "\xff\xff\xa8\x00\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00" "\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00" "\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00" "\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00" "\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00" "\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00" "\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x07\x00\x00\x00\x0b\x00\x00\x00\x0f\x00" "\x00\x00\x14\x00\x00\x00\x17\x00\x3b\x00\x1b\x00\xe2\x00\x1f\x00" "\xff\x00\x23\x00\xff\x00\x26\x00\xff\x00\x2a\x00\xff\x00\x2d\x00" "\xff\x00\x30\x00\xff\x00\x33\x00\xff\x00\x37\x00\xff\x00\x3a\x00" "\xff\x00\x3d\x00\xff\x00\x40\x00\xff\x00\x43\x00\xff\x00\x46\x00" "\xff\x00\x48\x00\xff\x00\x4b\x00\xff\x00\x4d\x00\xff\x00\x50\x00" "\xff\x00\x52\x00\xff\x00\x55\x00\xff\x00\x57\x00\xff\x00\x5a\x00" "\xff\x00\x5c\x00\xff\x07\x5e\x00\xff\x5b\x60\x00\xff\xc4\x62\x00" "\xff\xff\x64\x00\xff\xff\x66\x00\xff\xff\x68\x00\xff\xff\x6a\x00" "\xff\xff\x6b\x00\xff\xff\x6d\x00\xff\xff\x6f\x00\xff\xff\x71\x00" "\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x75\x00\xff\xff\x77\x00" "\xff\xff\x78\x00\xff\xff\x79\x00\xff\xff\x7b\x00\xff\xff\x7c\x00" "\xff\xff\x7e\x00\xff\xff\x7f\x00\xff\xff\x80\x00\xff\xff\x81\x00" "\xff\xff\x82\x00\xff\xff\x83\x00\xff\xff\x84\x00\xff\xff\x85\x00" "\xff\xff\x87\x00\xff\xff\x88\x00\xff\xff\x89\x00\xff\xff\x8a\x00" "\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8c\x00\xff\xff\x8d\x00" "\xff\xff\x8e\x00\xff\xff\x8f\x00\xff\xff\x8f\x00\xff\xff\x90\x00" "\xff\xff\x91\x00\xff\xff\x92\x00\xff\xff\x93\x00\xff\xff\x93\x00" "\xff\xff\x94\x00\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x96\x00" "\xff\xff\x96\x00\xff\xff\x97\x00\xff\xff\x98\x00\xff\xff\x98\x00" "\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x9a\x00\xff\xff\x9a\x00" "\xff\xff\x9b\x00\xff\xff\x9b\x00\xff\xff\x9c\x00\xff\xff\x9c\x00" "\xff\xff\x9d\x00\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\x9e\x00" "\xff\xff\x9e\x00\xff\xff\x9f\x00\xff\xff\x9f\x00\xff\xff\xa0\x00" "\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa1\x00" "\xff\xff\xa1\x00\xff\xff\xa2\x00\xff\xff\xa2\x00\xff\xff\xa2\x00" "\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa4\x00" "\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa5\x00" "\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa5\x00" "\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00" "\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa7\x00" "\xff\xff\xa7\x00\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa8\x00" "\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa8\x00" "\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00" "\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xaa\x00" "\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xaa\x00" "\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xaa\x00" "\xff\xff\xaa\x00\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xab\x00" "\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xab\x00" "\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xab\x00" "\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00" "\x00\x00\x08\x00\x00\x00\x0d\x00\x00\x00\x11\x00\x00\x00\x15\x00" "\x02\x00\x19\x00\x78\x00\x1d\x00\xfc\x00\x21\x00\xff\x00\x25\x00" "\xff\x00\x28\x00\xff\x00\x2c\x00\xff\x00\x2f\x00\xff\x00\x32\x00" "\xff\x00\x35\x00\xff\x00\x39\x00\xff\x00\x3c\x00\xff\x00\x3f\x00" "\xff\x00\x42\x00\xff\x00\x45\x00\xff\x00\x48\x00\xff\x00\x4b\x00" "\xff\x00\x4d\x00\xff\x00\x50\x00\xff\x00\x52\x00\xff\x00\x55\x00" "\xff\x00\x57\x00\xff\x00\x5a\x00\xff\x00\x5c\x00\xff\x0e\x5e\x00" "\xff\x7a\x61\x00\xff\xeb\x63\x00\xff\xff\x65\x00\xff\xff\x67\x00" "\xff\xff\x69\x00\xff\xff\x6a\x00\xff\xff\x6c\x00\xff\xff\x6e\x00" "\xff\xff\x70\x00\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x75\x00" "\xff\xff\x77\x00\xff\xff\x78\x00\xff\xff\x79\x00\xff\xff\x7b\x00" "\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\x7f\x00\xff\xff\x80\x00" "\xff\xff\x82\x00\xff\xff\x83\x00\xff\xff\x84\x00\xff\xff\x85\x00" "\xff\xff\x86\x00\xff\xff\x87\x00\xff\xff\x88\x00\xff\xff\x89\x00" "\xff\xff\x8b\x00\xff\xff\x8c\x00\xff\xff\x8d\x00\xff\xff\x8e\x00" "\xff\xff\x8e\x00\xff\xff\x8f\x00\xff\xff\x90\x00\xff\xff\x91\x00" "\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x93\x00\xff\xff\x94\x00" "\xff\xff\x95\x00\xff\xff\x96\x00\xff\xff\x96\x00\xff\xff\x97\x00" "\xff\xff\x98\x00\xff\xff\x98\x00\xff\xff\x99\x00\xff\xff\x99\x00" "\xff\xff\x9a\x00\xff\xff\x9b\x00\xff\xff\x9b\x00\xff\xff\x9c\x00" "\xff\xff\x9c\x00\xff\xff\x9d\x00\xff\xff\x9d\x00\xff\xff\x9e\x00" "\xff\xff\x9e\x00\xff\xff\x9f\x00\xff\xff\x9f\x00\xff\xff\xa0\x00" "\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa1\x00" "\xff\xff\xa2\x00\xff\xff\xa2\x00\xff\xff\xa3\x00\xff\xff\xa3\x00" "\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa4\x00" "\xff\xff\xa4\x00\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa5\x00" "\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa7\x00" "\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa8\x00" "\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa8\x00" "\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00" "\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xaa\x00" "\xff\xff\xaa\x00\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xab\x00" "\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xab\x00" "\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00" "\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00" "\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xae\x00" "\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xae\x00" "\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xae\x00" "\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xae\x00" "\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xaf\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x06\x00\x00\x00\x0a\x00" "\x00\x00\x0e\x00\x00\x00\x12\x00\x00\x00\x16\x00\x0b\x00\x1a\x00" "\xb3\x00\x1e\x00\xff\x00\x22\x00\xff\x00\x26\x00\xff\x00\x2a\x00" "\xff\x00\x2e\x00\xff\x00\x31\x00\xff\x00\x34\x00\xff\x00\x38\x00" "\xff\x00\x3b\x00\xff\x00\x3e\x00\xff\x00\x41\x00\xff\x00\x44\x00" "\xff\x00\x47\x00\xff\x00\x4a\x00\xff\x00\x4d\x00\xff\x00\x50\x00" "\xff\x00\x52\x00\xff\x00\x55\x00\xff\x00\x57\x00\xff\x00\x5a\x00" "\xff\x00\x5c\x00\xff\x0e\x5e\x00\xff\x7a\x61\x00\xff\xed\x63\x00" "\xff\xff\x65\x00\xff\xff\x67\x00\xff\xff\x69\x00\xff\xff\x6b\x00" "\xff\xff\x6d\x00\xff\xff\x6f\x00\xff\xff\x71\x00\xff\xff\x73\x00" "\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xff\xff\x7a\x00" "\xff\xff\x7b\x00\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\x7f\x00" "\xff\xff\x80\x00\xff\xff\x82\x00\xff\xff\x83\x00\xff\xff\x85\x00" "\xff\xff\x86\x00\xff\xff\x87\x00\xff\xff\x88\x00\xff\xff\x89\x00" "\xff\xff\x8a\x00\xff\xff\x8b\x00\xff\xff\x8c\x00\xff\xff\x8d\x00" "\xff\xff\x8e\x00\xff\xff\x8f\x00\xff\xff\x90\x00\xff\xff\x91\x00" "\xff\xff\x92\x00\xff\xff\x93\x00\xff\xff\x94\x00\xff\xff\x95\x00" "\xff\xff\x95\x00\xff\xff\x96\x00\xff\xff\x97\x00\xff\xff\x98\x00" "\xff\xff\x98\x00\xff\xff\x99\x00\xff\xff\x9a\x00\xff\xff\x9b\x00" "\xff\xff\x9b\x00\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9d\x00" "\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\x9e\x00\xff\xff\x9f\x00" "\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa1\x00" "\xff\xff\xa2\x00\xff\xff\xa2\x00\xff\xff\xa2\x00\xff\xff\xa3\x00" "\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa4\x00" "\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa6\x00\xff\xff\xa6\x00" "\xff\xff\xa6\x00\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa7\x00" "\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa8\x00" "\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xaa\x00" "\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xab\x00" "\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xab\x00" "\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00" "\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xae\x00\xff\xff\xae\x00" "\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xae\x00" "\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xaf\x00\xff\xff\xaf\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb0\x00" "\xff\xff\xb0\x00\xff\xff\xb0\x00\xff\xff\xb0\x00\xff\xff\xb0\x00" "\xff\xff\xb0\x00\xff\xff\xb0\x00\xff\xff\xb0\x00\xff\xff\xb0\x00" "\xff\xff\xb0\x00\xff\xff\xb0\x00\xff\xff\xb1\x00\xff\xff\xb1\x00" "\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00" "\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00" "\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00" "\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00" "\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb2\x00" "\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00" "\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00" "\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00\x0b\x00\x00\x00\x10\x00" "\x00\x00\x14\x00\x00\x00\x17\x00\x14\x00\x1c\x00\xc9\x00\x1f\x00" "\xff\x00\x24\x00\xff\x00\x27\x00\xff\x00\x2b\x00\xff\x00\x2f\x00" "\xff\x00\x33\x00\xff\x00\x36\x00\xff\x00\x3a\x00\xff\x00\x3d\x00" "\xff\x00\x40\x00\xff\x00\x43\x00\xff\x00\x46\x00\xff\x00\x49\x00" "\xff\x00\x4c\x00\xff\x00\x4f\x00\xff\x00\x52\x00\xff\x00\x55\x00" "\xff\x00\x57\x00\xff\x00\x5a\x00\xff\x00\x5c\x00\xff\x0e\x5e\x00" "\xff\x7a\x61\x00\xff\xed\x63\x00\xff\xff\x65\x00\xff\xff\x68\x00" "\xff\xff\x6a\x00\xff\xff\x6c\x00\xff\xff\x6e\x00\xff\xff\x70\x00" "\xff\xff\x72\x00\xff\xff\x73\x00\xff\xff\x75\x00\xff\xff\x77\x00" "\xff\xff\x79\x00\xff\xff\x7a\x00\xff\xff\x7c\x00\xff\xff\x7e\x00" "\xff\xff\x7f\x00\xff\xff\x81\x00\xff\xff\x82\x00\xff\xff\x83\x00" "\xff\xff\x85\x00\xff\xff\x86\x00\xff\xff\x87\x00\xff\xff\x89\x00" "\xff\xff\x8a\x00\xff\xff\x8b\x00\xff\xff\x8c\x00\xff\xff\x8d\x00" "\xff\xff\x8e\x00\xff\xff\x8f\x00\xff\xff\x90\x00\xff\xff\x91\x00" "\xff\xff\x92\x00\xff\xff\x93\x00\xff\xff\x94\x00\xff\xff\x95\x00" "\xff\xff\x96\x00\xff\xff\x97\x00\xff\xff\x97\x00\xff\xff\x98\x00" "\xff\xff\x99\x00\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9b\x00" "\xff\xff\x9c\x00\xff\xff\x9d\x00\xff\xff\x9d\x00\xff\xff\x9e\x00" "\xff\xff\x9e\x00\xff\xff\x9f\x00\xff\xff\xa0\x00\xff\xff\xa0\x00" "\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa2\x00\xff\xff\xa2\x00" "\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa4\x00" "\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa6\x00\xff\xff\xa6\x00" "\xff\xff\xa6\x00\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa8\x00" "\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa9\x00\xff\xff\xa9\x00" "\xff\xff\xa9\x00\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xaa\x00" "\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xab\x00" "\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00" "\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xae\x00" "\xff\xff\xae\x00\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb0\x00" "\xff\xff\xb0\x00\xff\xff\xb0\x00\xff\xff\xb0\x00\xff\xff\xb0\x00" "\xff\xff\xb0\x00\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00" "\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00" "\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00" "\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00" "\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb3\x00" "\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00" "\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00" "\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00" "\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb4\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00" "\x00\x00\x07\x00\x00\x00\x0c\x00\x00\x00\x10\x00\x00\x00\x15\x00" "\x00\x00\x19\x00\x1e\x00\x1d\x00\xd8\x00\x21\x00\xff\x00\x25\x00" "\xff\x00\x29\x00\xff\x00\x2c\x00\xff\x00\x30\x00\xff\x00\x34\x00" "\xff\x00\x38\x00\xff\x00\x3b\x00\xff\x00\x3f\x00\xff\x00\x42\x00" "\xff\x00\x45\x00\xff\x00\x48\x00\xff\x00\x4b\x00\xff\x00\x4e\x00" "\xff\x00\x51\x00\xff\x00\x54\x00\xff\x00\x57\x00\xff\x00\x59\x00" "\xff\x00\x5c\x00\xff\x0e\x5e\x00\xff\x7a\x61\x00\xff\xed\x63\x00" "\xff\xff\x65\x00\xff\xff\x68\x00\xff\xff\x6a\x00\xff\xff\x6c\x00" "\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\x72\x00\xff\xff\x74\x00" "\xff\xff\x76\x00\xff\xff\x78\x00\xff\xff\x79\x00\xff\xff\x7b\x00" "\xff\xff\x7d\x00\xff\xff\x7f\x00\xff\xff\x80\x00\xff\xff\x82\x00" "\xff\xff\x83\x00\xff\xff\x85\x00\xff\xff\x86\x00\xff\xff\x87\x00" "\xff\xff\x89\x00\xff\xff\x8a\x00\xff\xff\x8b\x00\xff\xff\x8c\x00" "\xff\xff\x8e\x00\xff\xff\x8f\x00\xff\xff\x90\x00\xff\xff\x91\x00" "\xff\xff\x92\x00\xff\xff\x93\x00\xff\xff\x94\x00\xff\xff\x95\x00" "\xff\xff\x96\x00\xff\xff\x97\x00\xff\xff\x98\x00\xff\xff\x99\x00" "\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9b\x00\xff\xff\x9c\x00" "\xff\xff\x9c\x00\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\x9f\x00" "\xff\xff\x9f\x00\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa1\x00" "\xff\xff\xa2\x00\xff\xff\xa2\x00\xff\xff\xa3\x00\xff\xff\xa3\x00" "\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa5\x00\xff\xff\xa5\x00" "\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa7\x00\xff\xff\xa7\x00" "\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa9\x00\xff\xff\xa9\x00" "\xff\xff\xa9\x00\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xaa\x00" "\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00" "\xff\xff\xad\x00\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xae\x00" "\xff\xff\xae\x00\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00" "\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb0\x00\xff\xff\xb0\x00" "\xff\xff\xb0\x00\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00" "\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb2\x00" "\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00" "\xff\xff\xb2\x00\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00" "\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00" "\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb6\x00\xff\xff\xb6\x00" "\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00" "\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00" "\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00" "\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00" "\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00" "\xff\xff\xb6\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00" "\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00" "\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x07\x00" "\x00\x00\x0c\x00\x00\x00\x11\x00\x00\x00\x15\x00\x00\x00\x1a\x00" "\x2b\x00\x1e\x00\xe4\x00\x22\x00\xff\x00\x26\x00\xff\x00\x2a\x00" "\xff\x00\x2e\x00\xff\x00\x31\x00\xff\x00\x35\x00\xff\x00\x39\x00" "\xff\x00\x3d\x00\xff\x00\x40\x00\xff\x00\x43\x00\xff\x00\x47\x00" "\xff\x00\x4a\x00\xff\x00\x4d\x00\xff\x00\x50\x00\xff\x00\x53\x00" "\xff\x00\x55\x00\xff\x00\x58\x00\xff\x00\x5b\x00\xff\x0a\x5e\x00" "\xff\x7a\x61\x00\xff\xed\x63\x00\xff\xff\x65\x00\xff\xff\x68\x00" "\xff\xff\x6a\x00\xff\xff\x6c\x00\xff\xff\x6e\x00\xff\xff\x70\x00" "\xff\xff\x73\x00\xff\xff\x75\x00\xff\xff\x77\x00\xff\xff\x78\x00" "\xff\xff\x7a\x00\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\x7f\x00" "\xff\xff\x81\x00\xff\xff\x83\x00\xff\xff\x84\x00\xff\xff\x86\x00" "\xff\xff\x87\x00\xff\xff\x89\x00\xff\xff\x8a\x00\xff\xff\x8b\x00" "\xff\xff\x8c\x00\xff\xff\x8e\x00\xff\xff\x8f\x00\xff\xff\x90\x00" "\xff\xff\x91\x00\xff\xff\x93\x00\xff\xff\x94\x00\xff\xff\x95\x00" "\xff\xff\x96\x00\xff\xff\x97\x00\xff\xff\x97\x00\xff\xff\x98\x00" "\xff\xff\x99\x00\xff\xff\x9a\x00\xff\xff\x9b\x00\xff\xff\x9c\x00" "\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\x9e\x00\xff\xff\x9f\x00" "\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa2\x00" "\xff\xff\xa2\x00\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa4\x00" "\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa6\x00\xff\xff\xa6\x00" "\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa8\x00\xff\xff\xa8\x00" "\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xaa\x00\xff\xff\xaa\x00" "\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00" "\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xaf\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb0\x00" "\xff\xff\xb0\x00\xff\xff\xb0\x00\xff\xff\xb1\x00\xff\xff\xb1\x00" "\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb2\x00" "\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb3\x00\xff\xff\xb3\x00" "\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\xff\xff\xb5\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00" "\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00" "\xff\xff\xb6\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00" "\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00" "\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00" "\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x08\x00\x00\x00\x0d\x00" "\x00\x00\x11\x00\x00\x00\x16\x00\x00\x00\x1a\x00\x3b\x00\x1f\x00" "\xef\x00\x23\x00\xff\x00\x28\x00\xff\x00\x2b\x00\xff\x00\x2f\x00" "\xff\x00\x33\x00\xff\x00\x36\x00\xff\x00\x3a\x00\xff\x00\x3e\x00" "\xff\x00\x41\x00\xff\x00\x45\x00\xff\x00\x48\x00\xff\x00\x4c\x00" "\xff\x00\x4f\x00\xff\x00\x52\x00\xff\x00\x54\x00\xff\x00\x57\x00" "\xff\x00\x5a\x00\xff\x00\x5d\x00\xff\x4b\x60\x00\xff\xdf\x62\x00" "\xff\xff\x65\x00\xff\xff\x68\x00\xff\xff\x6a\x00\xff\xff\x6c\x00" "\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\x73\x00\xff\xff\x75\x00" "\xff\xff\x77\x00\xff\xff\x79\x00\xff\xff\x7b\x00\xff\xff\x7d\x00" "\xff\xff\x7e\x00\xff\xff\x80\x00\xff\xff\x82\x00\xff\xff\x83\x00" "\xff\xff\x85\x00\xff\xff\x87\x00\xff\xff\x88\x00\xff\xff\x8a\x00" "\xff\xff\x8b\x00\xff\xff\x8c\x00\xff\xff\x8e\x00\xff\xff\x8f\x00" "\xff\xff\x90\x00\xff\xff\x91\x00\xff\xff\x93\x00\xff\xff\x94\x00" "\xff\xff\x95\x00\xff\xff\x96\x00\xff\xff\x97\x00\xff\xff\x98\x00" "\xff\xff\x99\x00\xff\xff\x9a\x00\xff\xff\x9b\x00\xff\xff\x9c\x00" "\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\x9e\x00\xff\xff\x9f\x00" "\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa2\x00\xff\xff\xa2\x00" "\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa5\x00" "\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa7\x00\xff\xff\xa7\x00" "\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa9\x00\xff\xff\xa9\x00" "\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xab\x00\xff\xff\xab\x00" "\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xad\x00" "\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xaf\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb0\x00" "\xff\xff\xb0\x00\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00" "\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00" "\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00" "\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\xff\xff\xb5\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00" "\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb7\x00" "\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00" "\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb9\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x08\x00\x00\x00\x0d\x00\x00\x00\x12\x00" "\x00\x00\x16\x00\x00\x00\x1b\x00\x4c\x00\x1f\x00\xf7\x00\x24\x00" "\xff\x00\x28\x00\xff\x00\x2c\x00\xff\x00\x30\x00\xff\x00\x34\x00" "\xff\x00\x38\x00\xff\x00\x3b\x00\xff\x00\x3f\x00\xff\x00\x42\x00" "\xff\x00\x46\x00\xff\x00\x49\x00\xff\x00\x4d\x00\xff\x00\x50\x00" "\xff\x00\x53\x00\xff\x00\x56\x00\xff\x00\x59\x00\xff\x00\x5c\x00" "\xff\x1d\x5f\x00\xff\xae\x61\x00\xff\xff\x64\x00\xff\xff\x67\x00" "\xff\xff\x69\x00\xff\xff\x6c\x00\xff\xff\x6e\x00\xff\xff\x70\x00" "\xff\xff\x73\x00\xff\xff\x75\x00\xff\xff\x77\x00\xff\xff\x79\x00" "\xff\xff\x7b\x00\xff\xff\x7d\x00\xff\xff\x7f\x00\xff\xff\x81\x00" "\xff\xff\x82\x00\xff\xff\x84\x00\xff\xff\x86\x00\xff\xff\x87\x00" "\xff\xff\x89\x00\xff\xff\x8a\x00\xff\xff\x8c\x00\xff\xff\x8d\x00" "\xff\xff\x8f\x00\xff\xff\x90\x00\xff\xff\x91\x00\xff\xff\x93\x00" "\xff\xff\x94\x00\xff\xff\x95\x00\xff\xff\x96\x00\xff\xff\x97\x00" "\xff\xff\x98\x00\xff\xff\x9a\x00\xff\xff\x9b\x00\xff\xff\x9c\x00" "\xff\xff\x9c\x00\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\x9f\x00" "\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa2\x00\xff\xff\xa3\x00" "\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa5\x00\xff\xff\xa5\x00" "\xff\xff\xa6\x00\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa8\x00" "\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xaa\x00\xff\xff\xaa\x00" "\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xae\x00\xff\xff\xae\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xb0\x00" "\xff\xff\xb0\x00\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00" "\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb3\x00" "\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb4\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb6\x00\xff\xff\xb6\x00" "\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb7\x00" "\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb8\x00" "\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00" "\x00\x00\x09\x00\x00\x00\x0e\x00\x00\x00\x12\x00\x00\x00\x17\x00" "\x00\x00\x1b\x00\x5b\x00\x20\x00\xfc\x00\x24\x00\xff\x00\x29\x00" "\xff\x00\x2d\x00\xff\x00\x31\x00\xff\x00\x35\x00\xff\x00\x39\x00" "\xff\x00\x3d\x00\xff\x00\x40\x00\xff\x00\x44\x00\xff\x00\x47\x00" "\xff\x00\x4b\x00\xff\x00\x4e\x00\xff\x00\x51\x00\xff\x00\x55\x00" "\xff\x00\x58\x00\xff\x00\x5b\x00\xff\x05\x5e\x00\xff\x74\x60\x00" "\xff\xf4\x63\x00\xff\xff\x66\x00\xff\xff\x68\x00\xff\xff\x6b\x00" "\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\x73\x00\xff\xff\x75\x00" "\xff\xff\x77\x00\xff\xff\x79\x00\xff\xff\x7b\x00\xff\xff\x7d\x00" "\xff\xff\x7f\x00\xff\xff\x81\x00\xff\xff\x83\x00\xff\xff\x85\x00" "\xff\xff\x86\x00\xff\xff\x88\x00\xff\xff\x89\x00\xff\xff\x8b\x00" "\xff\xff\x8d\x00\xff\xff\x8e\x00\xff\xff\x90\x00\xff\xff\x91\x00" "\xff\xff\x92\x00\xff\xff\x94\x00\xff\xff\x95\x00\xff\xff\x96\x00" "\xff\xff\x97\x00\xff\xff\x98\x00\xff\xff\x9a\x00\xff\xff\x9b\x00" "\xff\xff\x9c\x00\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\x9f\x00" "\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa2\x00" "\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa5\x00\xff\xff\xa6\x00" "\xff\xff\xa6\x00\xff\xff\xa7\x00\xff\xff\xa8\x00\xff\xff\xa8\x00" "\xff\xff\xa9\x00\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xab\x00" "\xff\xff\xab\x00\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xad\x00" "\xff\xff\xae\x00\xff\xff\xae\x00\xff\xff\xaf\x00\xff\xff\xaf\x00" "\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb0\x00\xff\xff\xb1\x00" "\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00" "\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb4\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\xff\xff\xb5\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00" "\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00" "\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x09\x00" "\x00\x00\x0e\x00\x00\x00\x13\x00\x00\x00\x17\x00\x00\x00\x1c\x00" "\x4c\x00\x20\x00\xfc\x00\x25\x00\xff\x00\x29\x00\xff\x00\x2d\x00" "\xff\x00\x32\x00\xff\x00\x36\x00\xff\x00\x3a\x00\xff\x00\x3e\x00" "\xff\x00\x41\x00\xff\x00\x45\x00\xff\x00\x48\x00\xff\x00\x4c\x00" "\xff\x00\x4f\x00\xff\x00\x52\x00\xff\x00\x56\x00\xff\x00\x59\x00" "\xff\x00\x5c\x00\xff\x3b\x5f\x00\xff\xd2\x62\x00\xff\xff\x65\x00" "\xff\xff\x67\x00\xff\xff\x6a\x00\xff\xff\x6d\x00\xff\xff\x6f\x00" "\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x77\x00\xff\xff\x79\x00" "\xff\xff\x7b\x00\xff\xff\x7d\x00\xff\xff\x7f\x00\xff\xff\x81\x00" "\xff\xff\x83\x00\xff\xff\x85\x00\xff\xff\x87\x00\xff\xff\x88\x00" "\xff\xff\x8a\x00\xff\xff\x8c\x00\xff\xff\x8d\x00\xff\xff\x8f\x00" "\xff\xff\x90\x00\xff\xff\x92\x00\xff\xff\x93\x00\xff\xff\x95\x00" "\xff\xff\x96\x00\xff\xff\x97\x00\xff\xff\x98\x00\xff\xff\x9a\x00" "\xff\xff\x9b\x00\xff\xff\x9c\x00\xff\xff\x9d\x00\xff\xff\x9e\x00" "\xff\xff\x9f\x00\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa2\x00" "\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa5\x00\xff\xff\xa5\x00" "\xff\xff\xa6\x00\xff\xff\xa7\x00\xff\xff\xa8\x00\xff\xff\xa9\x00" "\xff\xff\xa9\x00\xff\xff\xaa\x00\xff\xff\xab\x00\xff\xff\xab\x00" "\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xae\x00" "\xff\xff\xae\x00\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xb0\x00" "\xff\xff\xb0\x00\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb2\x00" "\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb3\x00\xff\xff\xb3\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\xff\xff\xb5\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00" "\xff\xff\xb6\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00" "\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x09\x00\x00\x00\x0e\x00" "\x00\x00\x13\x00\x00\x00\x18\x00\x00\x00\x1c\x00\x3a\x00\x21\x00" "\xf6\x00\x25\x00\xff\x00\x29\x00\xff\x00\x2e\x00\xff\x00\x32\x00" "\xff\x00\x36\x00\xff\x00\x3a\x00\xff\x00\x3e\x00\xff\x00\x42\x00" "\xff\x00\x46\x00\xff\x00\x49\x00\xff\x00\x4d\x00\xff\x00\x50\x00" "\xff\x00\x54\x00\xff\x00\x57\x00\xff\x00\x5a\x00\xff\x10\x5d\x00" "\xff\x9c\x60\x00\xff\xff\x63\x00\xff\xff\x66\x00\xff\xff\x69\x00" "\xff\xff\x6c\x00\xff\xff\x6e\x00\xff\xff\x71\x00\xff\xff\x73\x00" "\xff\xff\x76\x00\xff\xff\x78\x00\xff\xff\x7a\x00\xff\xff\x7d\x00" "\xff\xff\x7f\x00\xff\xff\x81\x00\xff\xff\x83\x00\xff\xff\x85\x00" "\xff\xff\x87\x00\xff\xff\x88\x00\xff\xff\x8a\x00\xff\xff\x8c\x00" "\xff\xff\x8e\x00\xff\xff\x8f\x00\xff\xff\x91\x00\xff\xff\x92\x00" "\xff\xff\x94\x00\xff\xff\x95\x00\xff\xff\x97\x00\xff\xff\x98\x00" "\xff\xff\x99\x00\xff\xff\x9b\x00\xff\xff\x9c\x00\xff\xff\x9d\x00" "\xff\xff\x9e\x00\xff\xff\x9f\x00\xff\xff\xa0\x00\xff\xff\xa1\x00" "\xff\xff\xa2\x00\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa5\x00" "\xff\xff\xa6\x00\xff\xff\xa7\x00\xff\xff\xa8\x00\xff\xff\xa8\x00" "\xff\xff\xa9\x00\xff\xff\xaa\x00\xff\xff\xab\x00\xff\xff\xab\x00" "\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xae\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb0\x00" "\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb2\x00" "\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb4\x00" "\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb6\x00" "\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb7\x00\xff\xff\xb7\x00" "\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x08\x00\x00\x00\x0e\x00\x00\x00\x13\x00" "\x00\x00\x18\x00\x00\x00\x1d\x00\x2b\x00\x21\x00\xee\x00\x26\x00" "\xff\x00\x2a\x00\xff\x00\x2e\x00\xff\x00\x32\x00\xff\x00\x37\x00" "\xff\x00\x3b\x00\xff\x00\x3f\x00\xff\x00\x43\x00\xff\x00\x47\x00" "\xff\x00\x4a\x00\xff\x00\x4e\x00\xff\x00\x51\x00\xff\x00\x55\x00" "\xff\x00\x58\x00\xff\x00\x5b\x00\xff\x37\x5e\x00\xff\xdf\x61\x00" "\xff\xff\x64\x00\xff\xff\x67\x00\xff\xff\x6a\x00\xff\xff\x6d\x00" "\xff\xff\x70\x00\xff\xff\x72\x00\xff\xff\x75\x00\xff\xff\x77\x00" "\xff\xff\x7a\x00\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\x81\x00" "\xff\xff\x83\x00\xff\xff\x85\x00\xff\xff\x87\x00\xff\xff\x88\x00" "\xff\xff\x8a\x00\xff\xff\x8c\x00\xff\xff\x8e\x00\xff\xff\x90\x00" "\xff\xff\x91\x00\xff\xff\x93\x00\xff\xff\x94\x00\xff\xff\x96\x00" "\xff\xff\x97\x00\xff\xff\x99\x00\xff\xff\x9a\x00\xff\xff\x9b\x00" "\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\x9f\x00\xff\xff\xa0\x00" "\xff\xff\xa1\x00\xff\xff\xa2\x00\xff\xff\xa3\x00\xff\xff\xa4\x00" "\xff\xff\xa5\x00\xff\xff\xa6\x00\xff\xff\xa7\x00\xff\xff\xa8\x00" "\xff\xff\xa9\x00\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xab\x00" "\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xae\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb1\x00" "\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb3\x00" "\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb5\x00" "\xff\xff\xb5\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00" "\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00" "\x00\x00\x08\x00\x00\x00\x0d\x00\x00\x00\x12\x00\x00\x00\x17\x00" "\x00\x00\x1c\x00\x1d\x00\x21\x00\xe3\x00\x26\x00\xff\x00\x2a\x00" "\xff\x00\x2f\x00\xff\x00\x33\x00\xff\x00\x37\x00\xff\x00\x3b\x00" "\xff\x00\x3f\x00\xff\x00\x43\x00\xff\x00\x47\x00\xff\x00\x4b\x00" "\xff\x00\x4f\x00\xff\x00\x52\x00\xff\x00\x56\x00\xff\x00\x59\x00" "\xff\x01\x5c\x00\xff\x73\x5f\x00\xff\xfb\x62\x00\xff\xff\x66\x00" "\xff\xff\x69\x00\xff\xff\x6c\x00\xff\xff\x6e\x00\xff\xff\x71\x00" "\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x79\x00\xff\xff\x7b\x00" "\xff\xff\x7d\x00\xff\xff\x80\x00\xff\xff\x82\x00\xff\xff\x84\x00" "\xff\xff\x86\x00\xff\xff\x88\x00\xff\xff\x8a\x00\xff\xff\x8c\x00" "\xff\xff\x8e\x00\xff\xff\x90\x00\xff\xff\x91\x00\xff\xff\x93\x00" "\xff\xff\x95\x00\xff\xff\x96\x00\xff\xff\x98\x00\xff\xff\x99\x00" "\xff\xff\x9a\x00\xff\xff\x9c\x00\xff\xff\x9d\x00\xff\xff\x9e\x00" "\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa2\x00\xff\xff\xa3\x00" "\xff\xff\xa4\x00\xff\xff\xa5\x00\xff\xff\xa6\x00\xff\xff\xa7\x00" "\xff\xff\xa8\x00\xff\xff\xa9\x00\xff\xff\xaa\x00\xff\xff\xab\x00" "\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xae\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb1\x00" "\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb3\x00\xff\xff\xb3\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb7\x00\xff\xff\xb7\x00" "\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb9\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x07\x00" "\x00\x00\x0d\x00\x00\x00\x12\x00\x00\x00\x17\x00\x00\x00\x1c\x00" "\x13\x00\x21\x00\xd7\x00\x26\x00\xff\x00\x2a\x00\xff\x00\x2f\x00" "\xff\x00\x33\x00\xff\x00\x37\x00\xff\x00\x3b\x00\xff\x00\x3f\x00" "\xff\x00\x43\x00\xff\x00\x47\x00\xff\x00\x4b\x00\xff\x00\x4f\x00" "\xff\x00\x53\x00\xff\x00\x57\x00\xff\x00\x5a\x00\xff\x13\x5d\x00" "\xff\xb3\x60\x00\xff\xff\x64\x00\xff\xff\x67\x00\xff\xff\x6a\x00" "\xff\xff\x6c\x00\xff\xff\x6f\x00\xff\xff\x72\x00\xff\xff\x75\x00" "\xff\xff\x78\x00\xff\xff\x7a\x00\xff\xff\x7d\x00\xff\xff\x7f\x00" "\xff\xff\x81\x00\xff\xff\x83\x00\xff\xff\x86\x00\xff\xff\x88\x00" "\xff\xff\x8a\x00\xff\xff\x8c\x00\xff\xff\x8e\x00\xff\xff\x90\x00" "\xff\xff\x91\x00\xff\xff\x93\x00\xff\xff\x95\x00\xff\xff\x96\x00" "\xff\xff\x98\x00\xff\xff\x9a\x00\xff\xff\x9b\x00\xff\xff\x9c\x00" "\xff\xff\x9e\x00\xff\xff\x9f\x00\xff\xff\xa0\x00\xff\xff\xa2\x00" "\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa5\x00\xff\xff\xa6\x00" "\xff\xff\xa7\x00\xff\xff\xa8\x00\xff\xff\xa9\x00\xff\xff\xaa\x00" "\xff\xff\xab\x00\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xae\x00" "\xff\xff\xae\x00\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb0\x00" "\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb3\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb6\x00" "\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb7\x00\xff\xff\xb7\x00" "\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00\x0c\x00" "\x00\x00\x11\x00\x00\x00\x16\x00\x00\x00\x1b\x00\x0b\x00\x20\x00" "\xc8\x00\x25\x00\xff\x00\x2a\x00\xff\x00\x2f\x00\xff\x00\x33\x00" "\xff\x00\x38\x00\xff\x00\x3c\x00\xff\x00\x40\x00\xff\x00\x44\x00" "\xff\x00\x48\x00\xff\x00\x4c\x00\xff\x00\x4f\x00\xff\x00\x53\x00" "\xff\x00\x57\x00\xff\x00\x5a\x00\xff\x3b\x5e\x00\xff\xe2\x61\x00" "\xff\xff\x65\x00\xff\xff\x68\x00\xff\xff\x6b\x00\xff\xff\x6d\x00" "\xff\xff\x70\x00\xff\xff\x73\x00\xff\xff\x76\x00\xff\xff\x79\x00" "\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\x80\x00\xff\xff\x83\x00" "\xff\xff\x85\x00\xff\xff\x87\x00\xff\xff\x89\x00\xff\xff\x8b\x00" "\xff\xff\x8d\x00\xff\xff\x8f\x00\xff\xff\x91\x00\xff\xff\x93\x00" "\xff\xff\x95\x00\xff\xff\x96\x00\xff\xff\x98\x00\xff\xff\x9a\x00" "\xff\xff\x9b\x00\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\xa0\x00" "\xff\xff\xa1\x00\xff\xff\xa2\x00\xff\xff\xa3\x00\xff\xff\xa5\x00" "\xff\xff\xa6\x00\xff\xff\xa7\x00\xff\xff\xa8\x00\xff\xff\xa9\x00" "\xff\xff\xaa\x00\xff\xff\xab\x00\xff\xff\xac\x00\xff\xff\xad\x00" "\xff\xff\xae\x00\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xb0\x00" "\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb3\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb6\x00" "\xff\xff\xb6\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb8\x00" "\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x0c\x00\x00\x00\x11\x00" "\x00\x00\x16\x00\x00\x00\x1b\x00\x02\x00\x20\x00\xb1\x00\x25\x00" "\xff\x00\x29\x00\xff\x00\x2e\x00\xff\x00\x33\x00\xff\x00\x37\x00" "\xff\x00\x3c\x00\xff\x00\x40\x00\xff\x00\x44\x00\xff\x00\x48\x00" "\xff\x00\x4c\x00\xff\x00\x50\x00\xff\x00\x53\x00\xff\x00\x57\x00" "\xff\x02\x5b\x00\xff\x78\x5e\x00\xff\xfc\x62\x00\xff\xff\x65\x00" "\xff\xff\x69\x00\xff\xff\x6c\x00\xff\xff\x6e\x00\xff\xff\x71\x00" "\xff\xff\x74\x00\xff\xff\x77\x00\xff\xff\x7a\x00\xff\xff\x7c\x00" "\xff\xff\x7f\x00\xff\xff\x82\x00\xff\xff\x84\x00\xff\xff\x86\x00" "\xff\xff\x88\x00\xff\xff\x8b\x00\xff\xff\x8d\x00\xff\xff\x8f\x00" "\xff\xff\x91\x00\xff\xff\x93\x00\xff\xff\x95\x00\xff\xff\x96\x00" "\xff\xff\x98\x00\xff\xff\x9a\x00\xff\xff\x9b\x00\xff\xff\x9d\x00" "\xff\xff\x9e\x00\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa3\x00" "\xff\xff\xa4\x00\xff\xff\xa5\x00\xff\xff\xa6\x00\xff\xff\xa7\x00" "\xff\xff\xa8\x00\xff\xff\xaa\x00\xff\xff\xab\x00\xff\xff\xac\x00" "\xff\xff\xad\x00\xff\xff\xae\x00\xff\xff\xaf\x00\xff\xff\xaf\x00" "\xff\xff\xb0\x00\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb3\x00" "\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\xff\xff\xb6\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb8\x00" "\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x06\x00\x00\x00\x0b\x00\x00\x00\x10\x00\x00\x00\x15\x00" "\x00\x00\x1a\x00\x00\x00\x1f\x00\x75\x00\x24\x00\xff\x00\x29\x00" "\xff\x00\x2e\x00\xff\x00\x32\x00\xff\x00\x37\x00\xff\x00\x3b\x00" "\xff\x00\x40\x00\xff\x00\x44\x00\xff\x00\x48\x00\xff\x00\x4c\x00" "\xff\x00\x50\x00\xff\x00\x54\x00\xff\x00\x58\x00\xff\x0b\x5b\x00" "\xff\xb3\x5f\x00\xff\xff\x62\x00\xff\xff\x66\x00\xff\xff\x69\x00" "\xff\xff\x6c\x00\xff\xff\x6f\x00\xff\xff\x72\x00\xff\xff\x75\x00" "\xff\xff\x78\x00\xff\xff\x7b\x00\xff\xff\x7d\x00\xff\xff\x80\x00" "\xff\xff\x83\x00\xff\xff\x85\x00\xff\xff\x88\x00\xff\xff\x8a\x00" "\xff\xff\x8c\x00\xff\xff\x8e\x00\xff\xff\x90\x00\xff\xff\x92\x00" "\xff\xff\x94\x00\xff\xff\x96\x00\xff\xff\x98\x00\xff\xff\x9a\x00" "\xff\xff\x9b\x00\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\xa0\x00" "\xff\xff\xa1\x00\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa6\x00" "\xff\xff\xa7\x00\xff\xff\xa8\x00\xff\xff\xa9\x00\xff\xff\xaa\x00" "\xff\xff\xab\x00\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xae\x00" "\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb1\x00\xff\xff\xb2\x00" "\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb5\x00" "\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb7\x00\xff\xff\xb8\x00" "\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00" "\x00\x00\x0a\x00\x00\x00\x0f\x00\x00\x00\x15\x00\x00\x00\x1a\x00" "\x00\x00\x1f\x00\x3a\x00\x24\x00\xfc\x00\x29\x00\xff\x00\x2d\x00" "\xff\x00\x32\x00\xff\x00\x37\x00\xff\x00\x3b\x00\xff\x00\x3f\x00" "\xff\x00\x44\x00\xff\x00\x48\x00\xff\x00\x4c\x00\xff\x00\x50\x00" "\xff\x00\x54\x00\xff\x00\x58\x00\xff\x14\x5b\x00\xff\xc9\x5f\x00" "\xff\xff\x63\x00\xff\xff\x66\x00\xff\xff\x69\x00\xff\xff\x6d\x00" "\xff\xff\x70\x00\xff\xff\x73\x00\xff\xff\x76\x00\xff\xff\x79\x00" "\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\x81\x00\xff\xff\x83\x00" "\xff\xff\x86\x00\xff\xff\x89\x00\xff\xff\x8b\x00\xff\xff\x8d\x00" "\xff\xff\x8f\x00\xff\xff\x91\x00\xff\xff\x93\x00\xff\xff\x95\x00" "\xff\xff\x97\x00\xff\xff\x99\x00\xff\xff\x9b\x00\xff\xff\x9d\x00" "\xff\xff\x9e\x00\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa3\x00" "\xff\xff\xa4\x00\xff\xff\xa6\x00\xff\xff\xa7\x00\xff\xff\xa8\x00" "\xff\xff\xa9\x00\xff\xff\xab\x00\xff\xff\xac\x00\xff\xff\xad\x00" "\xff\xff\xae\x00\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb1\x00" "\xff\xff\xb2\x00\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb4\x00" "\xff\xff\xb5\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb7\x00" "\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x08\x00" "\x00\x00\x0e\x00\x00\x00\x14\x00\x00\x00\x19\x00\x00\x00\x1e\x00" "\x13\x00\x23\x00\xe2\x00\x28\x00\xff\x00\x2d\x00\xff\x00\x31\x00" "\xff\x00\x36\x00\xff\x00\x3b\x00\xff\x00\x3f\x00\xff\x00\x43\x00" "\xff\x00\x48\x00\xff\x00\x4c\x00\xff\x00\x50\x00\xff\x00\x54\x00" "\xff\x00\x58\x00\xff\x1e\x5c\x00\xff\xd8\x5f\x00\xff\xff\x63\x00" "\xff\xff\x66\x00\xff\xff\x6a\x00\xff\xff\x6d\x00\xff\xff\x70\x00" "\xff\xff\x74\x00\xff\xff\x77\x00\xff\xff\x7a\x00\xff\xff\x7d\x00" "\xff\xff\x7f\x00\xff\xff\x82\x00\xff\xff\x84\x00\xff\xff\x87\x00" "\xff\xff\x89\x00\xff\xff\x8c\x00\xff\xff\x8e\x00\xff\xff\x90\x00" "\xff\xff\x93\x00\xff\xff\x95\x00\xff\xff\x96\x00\xff\xff\x98\x00" "\xff\xff\x9a\x00\xff\xff\x9c\x00\xff\xff\x9e\x00\xff\xff\xa0\x00" "\xff\xff\xa1\x00\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa6\x00" "\xff\xff\xa7\x00\xff\xff\xa8\x00\xff\xff\xaa\x00\xff\xff\xab\x00" "\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xae\x00\xff\xff\xaf\x00" "\xff\xff\xb0\x00\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb3\x00" "\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb6\x00\xff\xff\xb7\x00" "\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x0d\x00" "\x00\x00\x12\x00\x00\x00\x17\x00\x00\x00\x1d\x00\x02\x00\x22\x00" "\xb4\x00\x27\x00\xff\x00\x2c\x00\xff\x00\x31\x00\xff\x00\x36\x00" "\xff\x00\x3a\x00\xff\x00\x3f\x00\xff\x00\x43\x00\xff\x00\x47\x00" "\xff\x00\x4c\x00\xff\x00\x50\x00\xff\x00\x54\x00\xff\x00\x58\x00" "\xff\x2b\x5c\x00\xff\xe4\x60\x00\xff\xff\x63\x00\xff\xff\x67\x00" "\xff\xff\x6a\x00\xff\xff\x6d\x00\xff\xff\x71\x00\xff\xff\x74\x00" "\xff\xff\x77\x00\xff\xff\x7a\x00\xff\xff\x7d\x00\xff\xff\x80\x00" "\xff\xff\x83\x00\xff\xff\x85\x00\xff\xff\x88\x00\xff\xff\x8a\x00" "\xff\xff\x8d\x00\xff\xff\x8f\x00\xff\xff\x91\x00\xff\xff\x94\x00" "\xff\xff\x96\x00\xff\xff\x98\x00\xff\xff\x9a\x00\xff\xff\x9b\x00" "\xff\xff\x9d\x00\xff\xff\x9f\x00\xff\xff\xa1\x00\xff\xff\xa2\x00" "\xff\xff\xa4\x00\xff\xff\xa6\x00\xff\xff\xa7\x00\xff\xff\xa8\x00" "\xff\xff\xaa\x00\xff\xff\xab\x00\xff\xff\xac\x00\xff\xff\xad\x00" "\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb1\x00\xff\xff\xb2\x00" "\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\xff\xff\xb6\x00\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xb9\x00" "\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0b\x00\x00\x00\x11\x00" "\x00\x00\x16\x00\x00\x00\x1c\x00\x00\x00\x21\x00\x74\x00\x26\x00" "\xff\x00\x2b\x00\xff\x00\x30\x00\xff\x00\x35\x00\xff\x00\x3a\x00" "\xff\x00\x3e\x00\xff\x00\x43\x00\xff\x00\x47\x00\xff\x00\x4b\x00" "\xff\x00\x4f\x00\xff\x00\x53\x00\xff\x00\x58\x00\xff\x3b\x5b\x00" "\xff\xef\x5f\x00\xff\xff\x63\x00\xff\xff\x67\x00\xff\xff\x6a\x00" "\xff\xff\x6e\x00\xff\xff\x71\x00\xff\xff\x74\x00\xff\xff\x77\x00" "\xff\xff\x7a\x00\xff\xff\x7d\x00\xff\xff\x80\x00\xff\xff\x83\x00" "\xff\xff\x86\x00\xff\xff\x89\x00\xff\xff\x8b\x00\xff\xff\x8d\x00" "\xff\xff\x90\x00\xff\xff\x92\x00\xff\xff\x94\x00\xff\xff\x97\x00" "\xff\xff\x99\x00\xff\xff\x9b\x00\xff\xff\x9d\x00\xff\xff\x9e\x00" "\xff\xff\xa0\x00\xff\xff\xa2\x00\xff\xff\xa3\x00\xff\xff\xa5\x00" "\xff\xff\xa7\x00\xff\xff\xa8\x00\xff\xff\xaa\x00\xff\xff\xab\x00" "\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xaf\x00\xff\xff\xb0\x00" "\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb3\x00\xff\xff\xb4\x00" "\xff\xff\xb5\x00\xff\xff\xb6\x00\xff\xff\xb7\x00\xff\xff\xb8\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x0a\x00\x00\x00\x0f\x00\x00\x00\x15\x00" "\x00\x00\x1a\x00\x00\x00\x1f\x00\x39\x00\x25\x00\xfb\x00\x2a\x00" "\xff\x00\x2f\x00\xff\x00\x34\x00\xff\x00\x39\x00\xff\x00\x3e\x00" "\xff\x00\x42\x00\xff\x00\x47\x00\xff\x00\x4b\x00\xff\x00\x4f\x00" "\xff\x00\x53\x00\xff\x00\x57\x00\xff\x4c\x5b\x00\xff\xf7\x5f\x00" "\xff\xff\x63\x00\xff\xff\x67\x00\xff\xff\x6a\x00\xff\xff\x6e\x00" "\xff\xff\x71\x00\xff\xff\x74\x00\xff\xff\x78\x00\xff\xff\x7b\x00" "\xff\xff\x7e\x00\xff\xff\x81\x00\xff\xff\x84\x00\xff\xff\x86\x00" "\xff\xff\x89\x00\xff\xff\x8c\x00\xff\xff\x8e\x00\xff\xff\x91\x00" "\xff\xff\x93\x00\xff\xff\x95\x00\xff\xff\x97\x00\xff\xff\x99\x00" "\xff\xff\x9c\x00\xff\xff\x9e\x00\xff\xff\x9f\x00\xff\xff\xa1\x00" "\xff\xff\xa3\x00\xff\xff\xa5\x00\xff\xff\xa6\x00\xff\xff\xa8\x00" "\xff\xff\xa9\x00\xff\xff\xab\x00\xff\xff\xac\x00\xff\xff\xad\x00" "\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb1\x00\xff\xff\xb2\x00" "\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb6\x00" "\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00" "\x00\x00\x08\x00\x00\x00\x0e\x00\x00\x00\x14\x00\x00\x00\x19\x00" "\x00\x00\x1e\x00\x12\x00\x23\x00\xe1\x00\x29\x00\xff\x00\x2e\x00" "\xff\x00\x33\x00\xff\x00\x38\x00\xff\x00\x3d\x00\xff\x00\x41\x00" "\xff\x00\x46\x00\xff\x00\x4a\x00\xff\x00\x4f\x00\xff\x00\x53\x00" "\xff\x00\x57\x00\xff\x5b\x5b\x00\xff\xfc\x5f\x00\xff\xff\x63\x00" "\xff\xff\x66\x00\xff\xff\x6a\x00\xff\xff\x6e\x00\xff\xff\x71\x00" "\xff\xff\x75\x00\xff\xff\x78\x00\xff\xff\x7b\x00\xff\xff\x7e\x00" "\xff\xff\x81\x00\xff\xff\x84\x00\xff\xff\x87\x00\xff\xff\x89\x00" "\xff\xff\x8c\x00\xff\xff\x8f\x00\xff\xff\x91\x00\xff\xff\x94\x00" "\xff\xff\x96\x00\xff\xff\x98\x00\xff\xff\x9a\x00\xff\xff\x9c\x00" "\xff\xff\x9e\x00\xff\xff\xa0\x00\xff\xff\xa2\x00\xff\xff\xa4\x00" "\xff\xff\xa6\x00\xff\xff\xa7\x00\xff\xff\xa9\x00\xff\xff\xaa\x00" "\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xaf\x00\xff\xff\xb0\x00" "\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb3\x00\xff\xff\xb4\x00" "\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x07\x00" "\x00\x00\x0d\x00\x00\x00\x12\x00\x00\x00\x17\x00\x00\x00\x1d\x00" "\x00\x00\x22\x00\x9e\x00\x27\x00\xff\x00\x2c\x00\xff\x00\x31\x00" "\xff\x00\x36\x00\xff\x00\x3b\x00\xff\x00\x40\x00\xff\x00\x45\x00" "\xff\x00\x49\x00\xff\x00\x4e\x00\xff\x00\x52\x00\xff\x00\x56\x00" "\xff\x4c\x5a\x00\xff\xfc\x5e\x00\xff\xff\x62\x00\xff\xff\x66\x00" "\xff\xff\x6a\x00\xff\xff\x6d\x00\xff\xff\x71\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7b\x00\xff\xff\x7e\x00\xff\xff\x81\x00" "\xff\xff\x84\x00\xff\xff\x87\x00\xff\xff\x8a\x00\xff\xff\x8c\x00" "\xff\xff\x8f\x00\xff\xff\x92\x00\xff\xff\x94\x00\xff\xff\x97\x00" "\xff\xff\x99\x00\xff\xff\x9b\x00\xff\xff\x9d\x00\xff\xff\x9f\x00" "\xff\xff\xa1\x00\xff\xff\xa3\x00\xff\xff\xa5\x00\xff\xff\xa7\x00" "\xff\xff\xa8\x00\xff\xff\xaa\x00\xff\xff\xab\x00\xff\xff\xad\x00" "\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb1\x00\xff\xff\xb2\x00" "\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x0b\x00" "\x00\x00\x10\x00\x00\x00\x16\x00\x00\x00\x1b\x00\x00\x00\x21\x00" "\x3c\x00\x26\x00\xff\x00\x2b\x00\xff\x00\x30\x00\xff\x00\x35\x00" "\xff\x00\x3a\x00\xff\x00\x3f\x00\xff\x00\x44\x00\xff\x00\x48\x00" "\xff\x00\x4d\x00\xff\x00\x51\x00\xff\x00\x56\x00\xff\x3a\x5a\x00" "\xff\xf6\x5e\x00\xff\xff\x62\x00\xff\xff\x66\x00\xff\xff\x69\x00" "\xff\xff\x6d\x00\xff\xff\x71\x00\xff\xff\x74\x00\xff\xff\x78\x00" "\xff\xff\x7b\x00\xff\xff\x7e\x00\xff\xff\x81\x00\xff\xff\x84\x00" "\xff\xff\x87\x00\xff\xff\x8a\x00\xff\xff\x8d\x00\xff\xff\x8f\x00" "\xff\xff\x92\x00\xff\xff\x95\x00\xff\xff\x97\x00\xff\xff\x99\x00" "\xff\xff\x9c\x00\xff\xff\x9e\x00\xff\xff\xa0\x00\xff\xff\xa2\x00" "\xff\xff\xa4\x00\xff\xff\xa5\x00\xff\xff\xa7\x00\xff\xff\xa9\x00" "\xff\xff\xab\x00\xff\xff\xac\x00\xff\xff\xae\x00\xff\xff\xaf\x00" "\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb3\x00\xff\xff\xb4\x00" "\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xb9\x00" "\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbc\x00" "\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x08\x00\x00\x00\x0e\x00" "\x00\x00\x14\x00\x00\x00\x1a\x00\x00\x00\x20\x00\x05\x00\x25\x00" "\xd3\x00\x2a\x00\xff\x00\x2f\x00\xff\x00\x34\x00\xff\x00\x39\x00" "\xff\x00\x3e\x00\xff\x00\x42\x00\xff\x00\x47\x00\xff\x00\x4c\x00" "\xff\x00\x50\x00\xff\x00\x55\x00\xff\x2b\x59\x00\xff\xee\x5d\x00" "\xff\xff\x61\x00\xff\xff\x65\x00\xff\xff\x69\x00\xff\xff\x6d\x00" "\xff\xff\x70\x00\xff\xff\x74\x00\xff\xff\x77\x00\xff\xff\x7b\x00" "\xff\xff\x7e\x00\xff\xff\x81\x00\xff\xff\x84\x00\xff\xff\x87\x00" "\xff\xff\x8a\x00\xff\xff\x8d\x00\xff\xff\x90\x00\xff\xff\x92\x00" "\xff\xff\x95\x00\xff\xff\x97\x00\xff\xff\x9a\x00\xff\xff\x9c\x00" "\xff\xff\x9e\x00\xff\xff\xa0\x00\xff\xff\xa2\x00\xff\xff\xa4\x00" "\xff\xff\xa6\x00\xff\xff\xa8\x00\xff\xff\xaa\x00\xff\xff\xab\x00" "\xff\xff\xad\x00\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb1\x00" "\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0c\x00\x00\x00\x12\x00" "\x00\x00\x18\x00\x00\x00\x1d\x00\x00\x00\x23\x00\x75\x00\x28\x00" "\xff\x00\x2e\x00\xff\x00\x33\x00\xff\x00\x38\x00\xff\x00\x3d\x00" "\xff\x00\x41\x00\xff\x00\x46\x00\xff\x00\x4b\x00\xff\x00\x4f\x00" "\xff\x00\x54\x00\xff\x1d\x58\x00\xff\xe3\x5c\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x69\x00\xff\xff\x6c\x00\xff\xff\x70\x00" "\xff\xff\x73\x00\xff\xff\x77\x00\xff\xff\x7a\x00\xff\xff\x7e\x00" "\xff\xff\x81\x00\xff\xff\x84\x00\xff\xff\x87\x00\xff\xff\x8a\x00" "\xff\xff\x8d\x00\xff\xff\x90\x00\xff\xff\x92\x00\xff\xff\x95\x00" "\xff\xff\x97\x00\xff\xff\x9a\x00\xff\xff\x9c\x00\xff\xff\x9f\x00" "\xff\xff\xa1\x00\xff\xff\xa3\x00\xff\xff\xa5\x00\xff\xff\xa7\x00" "\xff\xff\xa9\x00\xff\xff\xaa\x00\xff\xff\xac\x00\xff\xff\xae\x00" "\xff\xff\xaf\x00\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb4\x00" "\xff\xff\xb5\x00\xff\xff\xb6\x00\xff\xff\xb7\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbc\x00" "\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x0a\x00\x00\x00\x0f\x00\x00\x00\x15\x00" "\x00\x00\x1b\x00\x00\x00\x21\x00\x1e\x00\x26\x00\xf5\x00\x2c\x00" "\xff\x00\x31\x00\xff\x00\x36\x00\xff\x00\x3b\x00\xff\x00\x40\x00" "\xff\x00\x45\x00\xff\x00\x49\x00\xff\x00\x4e\x00\xff\x00\x52\x00" "\xff\x13\x57\x00\xff\xd7\x5b\x00\xff\xff\x5f\x00\xff\xff\x63\x00" "\xff\xff\x68\x00\xff\xff\x6c\x00\xff\xff\x6f\x00\xff\xff\x73\x00" "\xff\xff\x77\x00\xff\xff\x7a\x00\xff\xff\x7d\x00\xff\xff\x81\x00" "\xff\xff\x84\x00\xff\xff\x87\x00\xff\xff\x8a\x00\xff\xff\x8d\x00" "\xff\xff\x90\x00\xff\xff\x93\x00\xff\xff\x95\x00\xff\xff\x98\x00" "\xff\xff\x9a\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa1\x00" "\xff\xff\xa3\x00\xff\xff\xa5\x00\xff\xff\xa7\x00\xff\xff\xa9\x00" "\xff\xff\xab\x00\xff\xff\xad\x00\xff\xff\xae\x00\xff\xff\xb0\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb6\x00" "\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xba\x00" "\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x07\x00\x00\x00\x0d\x00\x00\x00\x14\x00\x00\x00\x19\x00" "\x00\x00\x1f\x00\x00\x00\x24\x00\xaf\x00\x2a\x00\xff\x00\x2f\x00" "\xff\x00\x34\x00\xff\x00\x3a\x00\xff\x00\x3f\x00\xff\x00\x44\x00" "\xff\x00\x48\x00\xff\x00\x4d\x00\xff\x00\x51\x00\xff\x0b\x56\x00" "\xff\xc8\x5a\x00\xff\xff\x5e\x00\xff\xff\x62\x00\xff\xff\x67\x00" "\xff\xff\x6b\x00\xff\xff\x6e\x00\xff\xff\x72\x00\xff\xff\x76\x00" "\xff\xff\x7a\x00\xff\xff\x7d\x00\xff\xff\x80\x00\xff\xff\x84\x00" "\xff\xff\x87\x00\xff\xff\x8a\x00\xff\xff\x8d\x00\xff\xff\x90\x00" "\xff\xff\x92\x00\xff\xff\x95\x00\xff\xff\x98\x00\xff\xff\x9a\x00" "\xff\xff\x9d\x00\xff\xff\x9f\x00\xff\xff\xa1\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa8\x00\xff\xff\xaa\x00\xff\xff\xab\x00" "\xff\xff\xad\x00\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb2\x00" "\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbc\x00" "\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00" "\x00\x00\x0b\x00\x00\x00\x11\x00\x00\x00\x17\x00\x00\x00\x1c\x00" "\x00\x00\x22\x00\x4c\x00\x27\x00\xff\x00\x2d\x00\xff\x00\x32\x00" "\xff\x00\x38\x00\xff\x00\x3d\x00\xff\x00\x42\x00\xff\x00\x47\x00" "\xff\x00\x4c\x00\xff\x00\x50\x00\xff\x02\x55\x00\xff\xb1\x59\x00" "\xff\xff\x5d\x00\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6a\x00" "\xff\xff\x6d\x00\xff\xff\x71\x00\xff\xff\x75\x00\xff\xff\x79\x00" "\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x83\x00\xff\xff\x86\x00" "\xff\xff\x89\x00\xff\xff\x8c\x00\xff\xff\x8f\x00\xff\xff\x92\x00" "\xff\xff\x95\x00\xff\xff\x98\x00\xff\xff\x9a\x00\xff\xff\x9d\x00" "\xff\xff\x9f\x00\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa6\x00" "\xff\xff\xa8\x00\xff\xff\xaa\x00\xff\xff\xac\x00\xff\xff\xae\x00" "\xff\xff\xaf\x00\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb4\x00" "\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x09\x00" "\x00\x00\x0e\x00\x00\x00\x15\x00\x00\x00\x1a\x00\x00\x00\x20\x00" "\x0a\x00\x25\x00\xdf\x00\x2b\x00\xff\x00\x30\x00\xff\x00\x36\x00" "\xff\x00\x3b\x00\xff\x00\x40\x00\xff\x00\x45\x00\xff\x00\x4a\x00" "\xff\x00\x4f\x00\xff\x00\x53\x00\xff\x75\x58\x00\xff\xff\x5c\x00" "\xff\xff\x60\x00\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6d\x00" "\xff\xff\x70\x00\xff\xff\x74\x00\xff\xff\x78\x00\xff\xff\x7c\x00" "\xff\xff\x7f\x00\xff\xff\x83\x00\xff\xff\x86\x00\xff\xff\x89\x00" "\xff\xff\x8c\x00\xff\xff\x8f\x00\xff\xff\x92\x00\xff\xff\x95\x00" "\xff\xff\x97\x00\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\x9f\x00" "\xff\xff\xa2\x00\xff\xff\xa4\x00\xff\xff\xa6\x00\xff\xff\xa8\x00" "\xff\xff\xaa\x00\xff\xff\xac\x00\xff\xff\xae\x00\xff\xff\xb0\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb6\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xbb\x00" "\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0c\x00" "\x00\x00\x13\x00\x00\x00\x18\x00\x00\x00\x1e\x00\x00\x00\x23\x00" "\x7b\x00\x29\x00\xff\x00\x2e\x00\xff\x00\x33\x00\xff\x00\x39\x00" "\xff\x00\x3e\x00\xff\x00\x43\x00\xff\x00\x48\x00\xff\x00\x4d\x00" "\xff\x00\x52\x00\xff\x3a\x56\x00\xff\xfc\x5b\x00\xff\xff\x5f\x00" "\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6c\x00\xff\xff\x6f\x00" "\xff\xff\x73\x00\xff\xff\x77\x00\xff\xff\x7b\x00\xff\xff\x7e\x00" "\xff\xff\x82\x00\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8c\x00" "\xff\xff\x8f\x00\xff\xff\x92\x00\xff\xff\x95\x00\xff\xff\x97\x00" "\xff\xff\x9a\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa1\x00" "\xff\xff\xa4\x00\xff\xff\xa6\x00\xff\xff\xa8\x00\xff\xff\xaa\x00" "\xff\xff\xac\x00\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb2\x00" "\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbd\x00" "\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x10\x00" "\x00\x00\x16\x00\x00\x00\x1c\x00\x00\x00\x21\x00\x0f\x00\x27\x00" "\xee\x00\x2c\x00\xff\x00\x31\x00\xff\x00\x37\x00\xff\x00\x3c\x00" "\xff\x00\x41\x00\xff\x00\x46\x00\xff\x00\x4b\x00\xff\x00\x50\x00" "\xff\x13\x54\x00\xff\xe2\x59\x00\xff\xff\x5e\x00\xff\xff\x62\x00" "\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x6e\x00\xff\xff\x72\x00" "\xff\xff\x76\x00\xff\xff\x7a\x00\xff\xff\x7d\x00\xff\xff\x81\x00" "\xff\xff\x84\x00\xff\xff\x88\x00\xff\xff\x8b\x00\xff\xff\x8e\x00" "\xff\xff\x91\x00\xff\xff\x94\x00\xff\xff\x97\x00\xff\xff\x9a\x00" "\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa1\x00\xff\xff\xa4\x00" "\xff\xff\xa6\x00\xff\xff\xa8\x00\xff\xff\xaa\x00\xff\xff\xac\x00" "\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb3\x00" "\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xba\x00" "\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0d\x00\x00\x00\x13\x00" "\x00\x00\x19\x00\x00\x00\x1f\x00\x00\x00\x24\x00\x7c\x00\x2a\x00" "\xff\x00\x2f\x00\xff\x00\x35\x00\xff\x00\x3a\x00\xff\x00\x3f\x00" "\xff\x00\x44\x00\xff\x00\x49\x00\xff\x00\x4e\x00\xff\x02\x53\x00" "\xff\xb4\x57\x00\xff\xff\x5c\x00\xff\xff\x60\x00\xff\xff\x65\x00" "\xff\xff\x69\x00\xff\xff\x6d\x00\xff\xff\x71\x00\xff\xff\x75\x00" "\xff\xff\x79\x00\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x83\x00" "\xff\xff\x87\x00\xff\xff\x8a\x00\xff\xff\x8d\x00\xff\xff\x91\x00" "\xff\xff\x94\x00\xff\xff\x97\x00\xff\xff\x99\x00\xff\xff\x9c\x00" "\xff\xff\x9f\x00\xff\xff\xa1\x00\xff\xff\xa3\x00\xff\xff\xa6\x00" "\xff\xff\xa8\x00\xff\xff\xaa\x00\xff\xff\xac\x00\xff\xff\xae\x00" "\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb5\x00" "\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbb\x00" "\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x10\x00\x00\x00\x16\x00" "\x00\x00\x1c\x00\x00\x00\x22\x00\x0f\x00\x28\x00\xef\x00\x2d\x00" "\xff\x00\x33\x00\xff\x00\x38\x00\xff\x00\x3d\x00\xff\x00\x42\x00" "\xff\x00\x47\x00\xff\x00\x4c\x00\xff\x00\x51\x00\xff\x74\x55\x00" "\xff\xff\x5a\x00\xff\xff\x5f\x00\xff\xff\x63\x00\xff\xff\x67\x00" "\xff\xff\x6c\x00\xff\xff\x70\x00\xff\xff\x74\x00\xff\xff\x78\x00" "\xff\xff\x7c\x00\xff\xff\x7f\x00\xff\xff\x83\x00\xff\xff\x86\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x90\x00\xff\xff\x93\x00" "\xff\xff\x96\x00\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\x9e\x00" "\xff\xff\xa1\x00\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa8\x00" "\xff\xff\xaa\x00\xff\xff\xac\x00\xff\xff\xae\x00\xff\xff\xb0\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x07\x00\x00\x00\x0d\x00\x00\x00\x13\x00\x00\x00\x19\x00" "\x00\x00\x1f\x00\x00\x00\x25\x00\x7e\x00\x2a\x00\xff\x00\x30\x00" "\xff\x00\x36\x00\xff\x00\x3b\x00\xff\x00\x40\x00\xff\x00\x45\x00" "\xff\x00\x4a\x00\xff\x00\x4f\x00\xff\x39\x54\x00\xff\xfb\x58\x00" "\xff\xff\x5d\x00\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6a\x00" "\xff\xff\x6e\x00\xff\xff\x72\x00\xff\xff\x76\x00\xff\xff\x7a\x00" "\xff\xff\x7e\x00\xff\xff\x82\x00\xff\xff\x85\x00\xff\xff\x89\x00" "\xff\xff\x8c\x00\xff\xff\x8f\x00\xff\xff\x92\x00\xff\xff\x95\x00" "\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa0\x00" "\xff\xff\xa3\x00\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xaa\x00" "\xff\xff\xac\x00\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb2\x00" "\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00" "\x00\x00\x0a\x00\x00\x00\x10\x00\x00\x00\x16\x00\x00\x00\x1c\x00" "\x00\x00\x22\x00\x10\x00\x28\x00\xef\x00\x2d\x00\xff\x00\x33\x00" "\xff\x00\x38\x00\xff\x00\x3e\x00\xff\x00\x43\x00\xff\x00\x48\x00" "\xff\x00\x4d\x00\xff\x12\x52\x00\xff\xe1\x57\x00\xff\xff\x5b\x00" "\xff\xff\x60\x00\xff\xff\x64\x00\xff\xff\x68\x00\xff\xff\x6d\x00" "\xff\xff\x71\x00\xff\xff\x75\x00\xff\xff\x79\x00\xff\xff\x7d\x00" "\xff\xff\x80\x00\xff\xff\x84\x00\xff\xff\x88\x00\xff\xff\x8b\x00" "\xff\xff\x8e\x00\xff\xff\x91\x00\xff\xff\x94\x00\xff\xff\x97\x00" "\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xac\x00" "\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb4\x00" "\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xba\x00" "\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00" "\x00\x00\x0d\x00\x00\x00\x13\x00\x00\x00\x19\x00\x00\x00\x1f\x00" "\x00\x00\x25\x00\x7f\x00\x2a\x00\xff\x00\x30\x00\xff\x00\x36\x00" "\xff\x00\x3b\x00\xff\x00\x40\x00\xff\x00\x46\x00\xff\x00\x4b\x00" "\xff\x00\x50\x00\xff\x9e\x55\x00\xff\xff\x59\x00\xff\xff\x5e\x00" "\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6b\x00\xff\xff\x6f\x00" "\xff\xff\x73\x00\xff\xff\x77\x00\xff\xff\x7b\x00\xff\xff\x7f\x00" "\xff\xff\x83\x00\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8d\x00" "\xff\xff\x90\x00\xff\xff\x94\x00\xff\xff\x97\x00\xff\xff\x99\x00" "\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa4\x00" "\xff\xff\xa7\x00\xff\xff\xa9\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb3\x00\xff\xff\xb5\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xbc\x00" "\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x0a\x00" "\x00\x00\x10\x00\x00\x00\x16\x00\x00\x00\x1c\x00\x00\x00\x22\x00" "\x10\x00\x28\x00\xf0\x00\x2d\x00\xff\x00\x33\x00\xff\x00\x38\x00" "\xff\x00\x3e\x00\xff\x00\x43\x00\xff\x00\x48\x00\xff\x00\x4d\x00" "\xff\x3c\x52\x00\xff\xff\x57\x00\xff\xff\x5c\x00\xff\xff\x61\x00" "\xff\xff\x65\x00\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x72\x00" "\xff\xff\x76\x00\xff\xff\x7a\x00\xff\xff\x7d\x00\xff\xff\x81\x00" "\xff\xff\x85\x00\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x8f\x00" "\xff\xff\x93\x00\xff\xff\x96\x00\xff\xff\x99\x00\xff\xff\x9c\x00" "\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa6\x00" "\xff\xff\xa9\x00\xff\xff\xab\x00\xff\xff\xad\x00\xff\xff\xaf\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0d\x00" "\x00\x00\x13\x00\x00\x00\x19\x00\x00\x00\x1f\x00\x00\x00\x25\x00" "\x80\x00\x2a\x00\xff\x00\x30\x00\xff\x00\x36\x00\xff\x00\x3b\x00" "\xff\x00\x40\x00\xff\x00\x46\x00\xff\x00\x4b\x00\xff\x05\x50\x00" "\xff\xd3\x55\x00\xff\xff\x5a\x00\xff\xff\x5e\x00\xff\xff\x63\x00" "\xff\xff\x68\x00\xff\xff\x6c\x00\xff\xff\x70\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x83\x00" "\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8e\x00\xff\xff\x91\x00" "\xff\xff\x95\x00\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9e\x00" "\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa5\x00\xff\xff\xa8\x00" "\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xaf\x00\xff\xff\xb1\x00" "\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x10\x00" "\x00\x00\x16\x00\x00\x00\x1c\x00\x00\x00\x22\x00\x09\x00\x28\x00" "\xee\x00\x2d\x00\xff\x00\x33\x00\xff\x00\x38\x00\xff\x00\x3e\x00" "\xff\x00\x43\x00\xff\x00\x48\x00\xff\x00\x4d\x00\xff\x75\x52\x00" "\xff\xff\x57\x00\xff\xff\x5c\x00\xff\xff\x61\x00\xff\xff\x65\x00" "\xff\xff\x6a\x00\xff\xff\x6e\x00\xff\xff\x73\x00\xff\xff\x77\x00" "\xff\xff\x7a\x00\xff\xff\x7e\x00\xff\xff\x82\x00\xff\xff\x86\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x90\x00\xff\xff\x93\x00" "\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\x9f\x00" "\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa7\x00\xff\xff\xaa\x00" "\xff\xff\xac\x00\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb2\x00" "\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00\x00\x00\x13\x00" "\x00\x00\x19\x00\x00\x00\x1f\x00\x00\x00\x25\x00\x5f\x00\x2a\x00" "\xff\x00\x30\x00\xff\x00\x36\x00\xff\x00\x3b\x00\xff\x00\x41\x00" "\xff\x00\x46\x00\xff\x00\x4b\x00\xff\x1e\x50\x00\xff\xf5\x55\x00" "\xff\xff\x5a\x00\xff\xff\x5e\x00\xff\xff\x63\x00\xff\xff\x68\x00" "\xff\xff\x6c\x00\xff\xff\x70\x00\xff\xff\x75\x00\xff\xff\x79\x00" "\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x84\x00\xff\xff\x88\x00" "\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x92\x00\xff\xff\x95\x00" "\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa1\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xa9\x00\xff\xff\xab\x00" "\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb4\x00" "\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbb\x00" "\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x0f\x00\x00\x00\x15\x00" "\x00\x00\x1c\x00\x00\x00\x22\x00\x00\x00\x28\x00\xc8\x00\x2e\x00" "\xff\x00\x33\x00\xff\x00\x38\x00\xff\x00\x3e\x00\xff\x00\x43\x00" "\xff\x00\x48\x00\xff\x00\x4d\x00\xff\xaf\x52\x00\xff\xff\x57\x00" "\xff\xff\x5c\x00\xff\xff\x61\x00\xff\xff\x65\x00\xff\xff\x6a\x00" "\xff\xff\x6e\x00\xff\xff\x73\x00\xff\xff\x77\x00\xff\xff\x7b\x00" "\xff\xff\x7f\x00\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8a\x00" "\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x94\x00\xff\xff\x97\x00" "\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xad\x00" "\xff\xff\xaf\x00\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb5\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbc\x00" "\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x05\x00\x00\x00\x0c\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1e\x00\x00\x00\x24\x00\x31\x00\x2a\x00\xff\x00\x30\x00" "\xff\x00\x36\x00\xff\x00\x3b\x00\xff\x00\x41\x00\xff\x00\x46\x00" "\xff\x00\x4b\x00\xff\x4c\x50\x00\xff\xff\x55\x00\xff\xff\x5a\x00" "\xff\xff\x5e\x00\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6c\x00" "\xff\xff\x70\x00\xff\xff\x75\x00\xff\xff\x79\x00\xff\xff\x7d\x00" "\xff\xff\x81\x00\xff\xff\x85\x00\xff\xff\x88\x00\xff\xff\x8c\x00" "\xff\xff\x8f\x00\xff\xff\x93\x00\xff\xff\x96\x00\xff\xff\x99\x00" "\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa5\x00" "\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x08\x00\x00\x00\x0e\x00\x00\x00\x14\x00\x00\x00\x1b\x00" "\x00\x00\x20\x00\x00\x00\x27\x00\x9a\x00\x2d\x00\xff\x00\x32\x00" "\xff\x00\x38\x00\xff\x00\x3e\x00\xff\x00\x43\x00\xff\x00\x48\x00" "\xff\x0a\x4d\x00\xff\xdf\x52\x00\xff\xff\x57\x00\xff\xff\x5c\x00" "\xff\xff\x61\x00\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6e\x00" "\xff\xff\x73\x00\xff\xff\x77\x00\xff\xff\x7b\x00\xff\xff\x7f\x00" "\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8a\x00\xff\xff\x8e\x00" "\xff\xff\x91\x00\xff\xff\x95\x00\xff\xff\x98\x00\xff\xff\x9b\x00" "\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa6\x00" "\xff\xff\xa9\x00\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb0\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00" "\x00\x00\x0a\x00\x00\x00\x10\x00\x00\x00\x17\x00\x00\x00\x1d\x00" "\x00\x00\x23\x00\x0f\x00\x29\x00\xf5\x00\x2f\x00\xff\x00\x35\x00" "\xff\x00\x3a\x00\xff\x00\x40\x00\xff\x00\x45\x00\xff\x00\x4b\x00" "\xff\x7b\x50\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x5e\x00" "\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6c\x00\xff\xff\x70\x00" "\xff\xff\x75\x00\xff\xff\x79\x00\xff\xff\x7d\x00\xff\xff\x81\x00" "\xff\xff\x85\x00\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00" "\xff\xff\x93\x00\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9d\x00" "\xff\xff\xa0\x00\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00" "\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xaf\x00\xff\xff\xb1\x00" "\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00" "\x00\x00\x0e\x00\x00\x00\x13\x00\x00\x00\x19\x00\x00\x00\x1f\x00" "\x00\x00\x25\x00\x6c\x00\x2b\x00\xff\x00\x31\x00\xff\x00\x37\x00" "\xff\x00\x3d\x00\xff\x00\x42\x00\xff\x00\x47\x00\xff\x0f\x4d\x00" "\xff\xee\x52\x00\xff\xff\x57\x00\xff\xff\x5c\x00\xff\xff\x61\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6e\x00\xff\xff\x73\x00" "\xff\xff\x77\x00\xff\xff\x7b\x00\xff\xff\x7f\x00\xff\xff\x83\x00" "\xff\xff\x87\x00\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x91\x00" "\xff\xff\x95\x00\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9e\x00" "\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xa9\x00" "\xff\xff\xac\x00\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb3\x00" "\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00" "\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x09\x00" "\x00\x00\x0f\x00\x00\x00\x16\x00\x00\x00\x1c\x00\x00\x00\x22\x00" "\x01\x00\x28\x00\xd6\x00\x2e\x00\xff\x00\x34\x00\xff\x00\x39\x00" "\xff\x00\x3f\x00\xff\x00\x44\x00\xff\x00\x4a\x00\xff\x7c\x4f\x00" "\xff\xff\x54\x00\xff\xff\x59\x00\xff\xff\x5e\x00\xff\xff\x63\x00" "\xff\xff\x68\x00\xff\xff\x6c\x00\xff\xff\x70\x00\xff\xff\x75\x00" "\xff\xff\x79\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x93\x00" "\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa0\x00" "\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa8\x00\xff\xff\xab\x00" "\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb4\x00" "\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00" "\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x0c\x00" "\x00\x00\x12\x00\x00\x00\x18\x00\x00\x00\x1e\x00\x00\x00\x24\x00" "\x3f\x00\x2a\x00\xff\x00\x30\x00\xff\x00\x36\x00\xff\x00\x3c\x00" "\xff\x00\x41\x00\xff\x00\x46\x00\xff\x0f\x4c\x00\xff\xef\x51\x00" "\xff\xff\x56\x00\xff\xff\x5b\x00\xff\xff\x60\x00\xff\xff\x65\x00" "\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x72\x00\xff\xff\x77\x00" "\xff\xff\x7b\x00\xff\xff\x7f\x00\xff\xff\x83\x00\xff\xff\x87\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa1\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xac\x00" "\xff\xff\xaf\x00\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb5\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x0e\x00" "\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x21\x00\x00\x00\x27\x00" "\xa7\x00\x2d\x00\xff\x00\x33\x00\xff\x00\x38\x00\xff\x00\x3e\x00" "\xff\x00\x43\x00\xff\x00\x49\x00\xff\x7e\x4e\x00\xff\xff\x53\x00" "\xff\xff\x58\x00\xff\xff\x5d\x00\xff\xff\x62\x00\xff\xff\x67\x00" "\xff\xff\x6b\x00\xff\xff\x70\x00\xff\xff\x74\x00\xff\xff\x79\x00" "\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x85\x00\xff\xff\x88\x00" "\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x93\x00\xff\xff\x96\x00" "\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xad\x00" "\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0a\x00\x00\x00\x11\x00" "\x00\x00\x17\x00\x00\x00\x1d\x00\x00\x00\x23\x00\x0b\x00\x29\x00" "\xf6\x00\x2f\x00\xff\x00\x35\x00\xff\x00\x3b\x00\xff\x00\x40\x00" "\xff\x00\x46\x00\xff\x10\x4b\x00\xff\xef\x50\x00\xff\xff\x55\x00" "\xff\xff\x5a\x00\xff\xff\x5f\x00\xff\xff\x64\x00\xff\xff\x69\x00" "\xff\xff\x6d\x00\xff\xff\x72\x00\xff\xff\x76\x00\xff\xff\x7a\x00" "\xff\xff\x7e\x00\xff\xff\x82\x00\xff\xff\x86\x00\xff\xff\x8a\x00" "\xff\xff\x8e\x00\xff\xff\x91\x00\xff\xff\x95\x00\xff\xff\x98\x00" "\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa4\x00" "\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00\x00\x00\x13\x00" "\x00\x00\x19\x00\x00\x00\x20\x00\x00\x00\x26\x00\x56\x00\x2c\x00" "\xff\x00\x32\x00\xff\x00\x37\x00\xff\x00\x3d\x00\xff\x00\x42\x00" "\xff\x00\x48\x00\xff\x7f\x4d\x00\xff\xff\x52\x00\xff\xff\x57\x00" "\xff\xff\x5c\x00\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6a\x00" "\xff\xff\x6f\x00\xff\xff\x73\x00\xff\xff\x78\x00\xff\xff\x7c\x00" "\xff\xff\x80\x00\xff\xff\x84\x00\xff\xff\x88\x00\xff\xff\x8c\x00" "\xff\xff\x8f\x00\xff\xff\x93\x00\xff\xff\x96\x00\xff\xff\x9a\x00" "\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa6\x00" "\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xad\x00\xff\xff\xb0\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x0f\x00\x00\x00\x15\x00" "\x00\x00\x1b\x00\x00\x00\x22\x00\x00\x00\x28\x00\xab\x00\x2e\x00" "\xff\x00\x34\x00\xff\x00\x3a\x00\xff\x00\x3f\x00\xff\x00\x45\x00" "\xff\x10\x4a\x00\xff\xf0\x4f\x00\xff\xff\x54\x00\xff\xff\x59\x00" "\xff\xff\x5e\x00\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6c\x00" "\xff\xff\x71\x00\xff\xff\x75\x00\xff\xff\x79\x00\xff\xff\x7e\x00" "\xff\xff\x82\x00\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8d\x00" "\xff\xff\x91\x00\xff\xff\x94\x00\xff\xff\x98\x00\xff\xff\x9b\x00" "\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa7\x00" "\xff\xff\xaa\x00\xff\xff\xac\x00\xff\xff\xaf\x00\xff\xff\xb1\x00" "\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x17\x00" "\x00\x00\x1e\x00\x00\x00\x24\x00\x0b\x00\x2a\x00\xf6\x00\x30\x00" "\xff\x00\x36\x00\xff\x00\x3c\x00\xff\x00\x41\x00\xff\x00\x47\x00" "\xff\x80\x4c\x00\xff\xff\x51\x00\xff\xff\x56\x00\xff\xff\x5b\x00" "\xff\xff\x60\x00\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6e\x00" "\xff\xff\x73\x00\xff\xff\x77\x00\xff\xff\x7b\x00\xff\xff\x7f\x00" "\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00" "\xff\xff\x92\x00\xff\xff\x96\x00\xff\xff\x99\x00\xff\xff\x9c\x00" "\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa8\x00" "\xff\xff\xab\x00\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb2\x00" "\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00" "\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc1\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x06\x00\x00\x00\x0d\x00\x00\x00\x13\x00\x00\x00\x19\x00" "\x00\x00\x20\x00\x00\x00\x26\x00\x55\x00\x2c\x00\xff\x00\x32\x00" "\xff\x00\x38\x00\xff\x00\x3d\x00\xff\x00\x43\x00\xff\x09\x49\x00" "\xff\xee\x4e\x00\xff\xff\x53\x00\xff\xff\x59\x00\xff\xff\x5d\x00" "\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00\xff\xff\x70\x00" "\xff\xff\x74\x00\xff\xff\x79\x00\xff\xff\x7d\x00\xff\xff\x81\x00" "\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x90\x00" "\xff\xff\x94\x00\xff\xff\x97\x00\xff\xff\x9b\x00\xff\xff\x9e\x00" "\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00" "\xff\xff\xac\x00\xff\xff\xaf\x00\xff\xff\xb1\x00\xff\xff\xb3\x00" "\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbb\x00" "\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x08\x00\x00\x00\x0f\x00\x00\x00\x15\x00\x00\x00\x1b\x00" "\x00\x00\x22\x00\x00\x00\x28\x00\xaa\x00\x2e\x00\xff\x00\x34\x00" "\xff\x00\x3a\x00\xff\x00\x3f\x00\xff\x00\x45\x00\xff\x5f\x4a\x00" "\xff\xff\x50\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x5f\x00" "\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6d\x00\xff\xff\x72\x00" "\xff\xff\x76\x00\xff\xff\x7b\x00\xff\xff\x7f\x00\xff\xff\x83\x00" "\xff\xff\x87\x00\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00" "\xff\xff\x95\x00\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\x9f\x00" "\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00" "\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb4\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbc\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00" "\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x17\x00\x00\x00\x1e\x00" "\x00\x00\x24\x00\x0a\x00\x2a\x00\xf5\x00\x30\x00\xff\x00\x36\x00" "\xff\x00\x3c\x00\xff\x00\x41\x00\xff\x00\x47\x00\xff\xc8\x4c\x00" "\xff\xff\x52\x00\xff\xff\x57\x00\xff\xff\x5c\x00\xff\xff\x61\x00" "\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x84\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x93\x00" "\xff\xff\x97\x00\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa0\x00" "\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00" "\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb5\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00" "\x00\x00\x0d\x00\x00\x00\x13\x00\x00\x00\x19\x00\x00\x00\x20\x00" "\x00\x00\x26\x00\x54\x00\x2c\x00\xff\x00\x32\x00\xff\x00\x38\x00" "\xff\x00\x3d\x00\xff\x00\x43\x00\xff\x31\x49\x00\xff\xff\x4e\x00" "\xff\xff\x53\x00\xff\xff\x59\x00\xff\xff\x5e\x00\xff\xff\x62\x00" "\xff\xff\x67\x00\xff\xff\x6c\x00\xff\xff\x71\x00\xff\xff\x75\x00" "\xff\xff\x7a\x00\xff\xff\x7e\x00\xff\xff\x82\x00\xff\xff\x86\x00" "\xff\xff\x8a\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00" "\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x08\x00" "\x00\x00\x0f\x00\x00\x00\x15\x00\x00\x00\x1b\x00\x00\x00\x22\x00" "\x00\x00\x28\x00\xa9\x00\x2e\x00\xff\x00\x34\x00\xff\x00\x3a\x00" "\xff\x00\x3f\x00\xff\x00\x45\x00\xff\x9a\x4a\x00\xff\xff\x50\x00" "\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x5f\x00\xff\xff\x64\x00" "\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x72\x00\xff\xff\x77\x00" "\xff\xff\x7b\x00\xff\xff\x7f\x00\xff\xff\x83\x00\xff\xff\x87\x00" "\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x93\x00\xff\xff\x96\x00" "\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0a\x00" "\x00\x00\x11\x00\x00\x00\x17\x00\x00\x00\x1e\x00\x00\x00\x24\x00" "\x0a\x00\x2a\x00\xf5\x00\x30\x00\xff\x00\x36\x00\xff\x00\x3c\x00" "\xff\x00\x41\x00\xff\x0f\x47\x00\xff\xf5\x4c\x00\xff\xff\x52\x00" "\xff\xff\x57\x00\xff\xff\x5c\x00\xff\xff\x61\x00\xff\xff\x66\x00" "\xff\xff\x6b\x00\xff\xff\x6f\x00\xff\xff\x74\x00\xff\xff\x78\x00" "\xff\xff\x7c\x00\xff\xff\x81\x00\xff\xff\x85\x00\xff\xff\x89\x00" "\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00\xff\xff\x97\x00" "\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa4\x00" "\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00" "\x00\x00\x13\x00\x00\x00\x19\x00\x00\x00\x20\x00\x00\x00\x26\x00" "\x4d\x00\x2c\x00\xff\x00\x32\x00\xff\x00\x38\x00\xff\x00\x3d\x00" "\xff\x00\x43\x00\xff\x6c\x49\x00\xff\xff\x4e\x00\xff\xff\x53\x00" "\xff\xff\x58\x00\xff\xff\x5e\x00\xff\xff\x62\x00\xff\xff\x67\x00" "\xff\xff\x6c\x00\xff\xff\x71\x00\xff\xff\x75\x00\xff\xff\x7a\x00" "\xff\xff\x7e\x00\xff\xff\x82\x00\xff\xff\x86\x00\xff\xff\x8a\x00" "\xff\xff\x8e\x00\xff\xff\x91\x00\xff\xff\x95\x00\xff\xff\x99\x00" "\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa5\x00" "\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xad\x00\xff\xff\xb0\x00" "\xff\xff\xb2\x00\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x0e\x00" "\x00\x00\x15\x00\x00\x00\x1b\x00\x00\x00\x22\x00\x00\x00\x28\x00" "\x91\x00\x2e\x00\xff\x00\x34\x00\xff\x00\x3a\x00\xff\x00\x3f\x00" "\xff\x01\x45\x00\xff\xd6\x4a\x00\xff\xff\x50\x00\xff\xff\x55\x00" "\xff\xff\x5a\x00\xff\xff\x5f\x00\xff\xff\x64\x00\xff\xff\x69\x00" "\xff\xff\x6e\x00\xff\xff\x72\x00\xff\xff\x77\x00\xff\xff\x7b\x00" "\xff\xff\x7f\x00\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8b\x00" "\xff\xff\x8f\x00\xff\xff\x93\x00\xff\xff\x96\x00\xff\xff\x9a\x00" "\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa6\x00" "\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xae\x00\xff\xff\xb1\x00" "\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00" "\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x10\x00" "\x00\x00\x16\x00\x00\x00\x1d\x00\x00\x00\x23\x00\x00\x00\x2a\x00" "\xd6\x00\x30\x00\xff\x00\x36\x00\xff\x00\x3c\x00\xff\x00\x41\x00" "\xff\x3f\x47\x00\xff\xff\x4c\x00\xff\xff\x51\x00\xff\xff\x57\x00" "\xff\xff\x5c\x00\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6a\x00" "\xff\xff\x6f\x00\xff\xff\x74\x00\xff\xff\x78\x00\xff\xff\x7c\x00" "\xff\xff\x81\x00\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8c\x00" "\xff\xff\x90\x00\xff\xff\x94\x00\xff\xff\x97\x00\xff\xff\x9b\x00" "\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa7\x00" "\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xaf\x00\xff\xff\xb2\x00" "\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb9\x00\xff\xff\xbb\x00" "\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc1\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x00\x00\x12\x00" "\x00\x00\x18\x00\x00\x00\x1f\x00\x00\x00\x25\x00\x1b\x00\x2b\x00" "\xff\x00\x31\x00\xff\x00\x37\x00\xff\x00\x3d\x00\xff\x00\x43\x00" "\xff\xa7\x48\x00\xff\xff\x4e\x00\xff\xff\x53\x00\xff\xff\x58\x00" "\xff\xff\x5d\x00\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00" "\xff\xff\x71\x00\xff\xff\x75\x00\xff\xff\x7a\x00\xff\xff\x7e\x00" "\xff\xff\x82\x00\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00" "\xff\xff\x91\x00\xff\xff\x95\x00\xff\xff\x98\x00\xff\xff\x9c\x00" "\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00" "\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb3\x00" "\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00" "\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00\x00\x00\x13\x00" "\x00\x00\x1a\x00\x00\x00\x20\x00\x00\x00\x27\x00\x5e\x00\x2d\x00" "\xff\x00\x33\x00\xff\x00\x39\x00\xff\x00\x3f\x00\xff\x0b\x44\x00" "\xff\xf6\x4a\x00\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00" "\xff\xff\x5f\x00\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00" "\xff\xff\x72\x00\xff\xff\x77\x00\xff\xff\x7b\x00\xff\xff\x7f\x00" "\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00" "\xff\xff\x93\x00\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9d\x00" "\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00" "\xff\xff\xac\x00\xff\xff\xaf\x00\xff\xff\xb1\x00\xff\xff\xb3\x00" "\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x0f\x00\x00\x00\x15\x00" "\x00\x00\x1c\x00\x00\x00\x22\x00\x00\x00\x28\x00\xa2\x00\x2e\x00" "\xff\x00\x34\x00\xff\x00\x3a\x00\xff\x00\x40\x00\xff\x56\x46\x00" "\xff\xff\x4b\x00\xff\xff\x51\x00\xff\xff\x56\x00\xff\xff\x5b\x00" "\xff\xff\x60\x00\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00" "\xff\xff\x74\x00\xff\xff\x78\x00\xff\xff\x7c\x00\xff\xff\x81\x00" "\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8c\x00\xff\xff\x90\x00" "\xff\xff\x94\x00\xff\xff\x97\x00\xff\xff\x9b\x00\xff\xff\x9e\x00" "\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00" "\xff\xff\xad\x00\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb4\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x17\x00" "\x00\x00\x1d\x00\x00\x00\x24\x00\x01\x00\x2a\x00\xe6\x00\x30\x00" "\xff\x00\x36\x00\xff\x00\x3c\x00\xff\x00\x42\x00\xff\xab\x47\x00" "\xff\xff\x4d\x00\xff\xff\x52\x00\xff\xff\x58\x00\xff\xff\x5d\x00" "\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00\xff\xff\x70\x00" "\xff\xff\x75\x00\xff\xff\x79\x00\xff\xff\x7e\x00\xff\xff\x82\x00" "\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x91\x00" "\xff\xff\x95\x00\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00" "\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00" "\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x05\x00\x00\x00\x0c\x00\x00\x00\x12\x00\x00\x00\x19\x00" "\x00\x00\x1f\x00\x00\x00\x25\x00\x2b\x00\x2c\x00\xff\x00\x32\x00" "\xff\x00\x38\x00\xff\x00\x3e\x00\xff\x0b\x43\x00\xff\xf6\x49\x00" "\xff\xff\x4e\x00\xff\xff\x54\x00\xff\xff\x59\x00\xff\xff\x5e\x00" "\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x72\x00" "\xff\xff\x76\x00\xff\xff\x7b\x00\xff\xff\x7f\x00\xff\xff\x83\x00" "\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x93\x00" "\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa0\x00" "\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00" "\xff\xff\xaf\x00\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x07\x00\x00\x00\x0e\x00\x00\x00\x14\x00\x00\x00\x1a\x00" "\x00\x00\x21\x00\x00\x00\x27\x00\x6f\x00\x2d\x00\xff\x00\x33\x00" "\xff\x00\x39\x00\xff\x00\x3f\x00\xff\x55\x45\x00\xff\xff\x4a\x00" "\xff\xff\x50\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x5f\x00" "\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x73\x00" "\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x84\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00" "\xff\xff\x97\x00\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa1\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00" "\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x09\x00\x00\x00\x0f\x00\x00\x00\x16\x00\x00\x00\x1c\x00" "\x00\x00\x23\x00\x00\x00\x29\x00\xb4\x00\x2f\x00\xff\x00\x35\x00" "\xff\x00\x3b\x00\xff\x00\x41\x00\xff\xaa\x46\x00\xff\xff\x4c\x00" "\xff\xff\x51\x00\xff\xff\x57\x00\xff\xff\x5c\x00\xff\xff\x61\x00" "\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00" "\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x17\x00\x00\x00\x1e\x00" "\x00\x00\x24\x00\x05\x00\x2a\x00\xf4\x00\x30\x00\xff\x00\x36\x00" "\xff\x00\x3c\x00\xff\x0a\x42\x00\xff\xf5\x48\x00\xff\xff\x4d\x00" "\xff\xff\x53\x00\xff\xff\x58\x00\xff\xff\x5d\x00\xff\xff\x62\x00" "\xff\xff\x67\x00\xff\xff\x6c\x00\xff\xff\x71\x00\xff\xff\x75\x00" "\xff\xff\x7a\x00\xff\xff\x7e\x00\xff\xff\x82\x00\xff\xff\x86\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x96\x00" "\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00" "\x00\x00\x0c\x00\x00\x00\x13\x00\x00\x00\x19\x00\x00\x00\x20\x00" "\x00\x00\x26\x00\x3a\x00\x2c\x00\xff\x00\x32\x00\xff\x00\x38\x00" "\xff\x00\x3e\x00\xff\x54\x44\x00\xff\xff\x49\x00\xff\xff\x4f\x00" "\xff\xff\x54\x00\xff\xff\x59\x00\xff\xff\x5e\x00\xff\xff\x63\x00" "\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x72\x00\xff\xff\x76\x00" "\xff\xff\x7b\x00\xff\xff\x7f\x00\xff\xff\x83\x00\xff\xff\x87\x00" "\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x93\x00\xff\xff\x97\x00" "\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa1\x00\xff\xff\xa4\x00" "\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00" "\x00\x00\x0e\x00\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x21\x00" "\x00\x00\x28\x00\x71\x00\x2e\x00\xff\x00\x34\x00\xff\x00\x3a\x00" "\xff\x00\x40\x00\xff\xa9\x45\x00\xff\xff\x4b\x00\xff\xff\x50\x00" "\xff\xff\x56\x00\xff\xff\x5b\x00\xff\xff\x60\x00\xff\xff\x65\x00" "\xff\xff\x6a\x00\xff\xff\x6e\x00\xff\xff\x73\x00\xff\xff\x78\x00" "\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x84\x00\xff\xff\x88\x00" "\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00\xff\xff\x97\x00" "\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa5\x00" "\xff\xff\xa8\x00\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xb0\x00" "\xff\xff\xb2\x00\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x08\x00" "\x00\x00\x0f\x00\x00\x00\x16\x00\x00\x00\x1c\x00\x00\x00\x23\x00" "\x00\x00\x29\x00\xa7\x00\x2f\x00\xff\x00\x35\x00\xff\x00\x3b\x00" "\xff\x0a\x41\x00\xff\xf5\x47\x00\xff\xff\x4c\x00\xff\xff\x52\x00" "\xff\xff\x57\x00\xff\xff\x5c\x00\xff\xff\x61\x00\xff\xff\x66\x00" "\xff\xff\x6b\x00\xff\xff\x70\x00\xff\xff\x74\x00\xff\xff\x79\x00" "\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x86\x00\xff\xff\x8a\x00" "\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00\xff\xff\x98\x00" "\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa5\x00" "\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb1\x00" "\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb8\x00\xff\xff\xba\x00" "\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x0a\x00" "\x00\x00\x11\x00\x00\x00\x17\x00\x00\x00\x1d\x00\x00\x00\x24\x00" "\x00\x00\x2a\x00\xdd\x00\x31\x00\xff\x00\x37\x00\xff\x00\x3c\x00" "\xff\x4d\x42\x00\xff\xff\x48\x00\xff\xff\x4e\x00\xff\xff\x53\x00" "\xff\xff\x58\x00\xff\xff\x5e\x00\xff\xff\x63\x00\xff\xff\x67\x00" "\xff\xff\x6c\x00\xff\xff\x71\x00\xff\xff\x76\x00\xff\xff\x7a\x00" "\xff\xff\x7e\x00\xff\xff\x82\x00\xff\xff\x87\x00\xff\xff\x8b\x00" "\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x96\x00\xff\xff\x99\x00" "\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa6\x00" "\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00\xff\xff\xb1\x00" "\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00" "\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0b\x00" "\x00\x00\x12\x00\x00\x00\x18\x00\x00\x00\x1f\x00\x00\x00\x25\x00" "\x15\x00\x2c\x00\xff\x00\x32\x00\xff\x00\x38\x00\xff\x00\x3e\x00" "\xff\x91\x43\x00\xff\xff\x49\x00\xff\xff\x4f\x00\xff\xff\x54\x00" "\xff\xff\x59\x00\xff\xff\x5f\x00\xff\xff\x64\x00\xff\xff\x69\x00" "\xff\xff\x6e\x00\xff\xff\x72\x00\xff\xff\x77\x00\xff\xff\x7b\x00" "\xff\xff\x7f\x00\xff\xff\x84\x00\xff\xff\x88\x00\xff\xff\x8c\x00" "\xff\xff\x8f\x00\xff\xff\x93\x00\xff\xff\x97\x00\xff\xff\x9a\x00" "\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa7\x00" "\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xaf\x00\xff\xff\xb2\x00" "\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00" "\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00" "\x00\x00\x13\x00\x00\x00\x1a\x00\x00\x00\x20\x00\x00\x00\x27\x00" "\x4a\x00\x2d\x00\xff\x00\x33\x00\xff\x00\x39\x00\xff\x00\x3f\x00" "\xff\xd6\x45\x00\xff\xff\x4a\x00\xff\xff\x50\x00\xff\xff\x55\x00" "\xff\xff\x5b\x00\xff\xff\x60\x00\xff\xff\x65\x00\xff\xff\x6a\x00" "\xff\xff\x6f\x00\xff\xff\x73\x00\xff\xff\x78\x00\xff\xff\x7c\x00" "\xff\xff\x81\x00\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8d\x00" "\xff\xff\x90\x00\xff\xff\x94\x00\xff\xff\x98\x00\xff\xff\x9b\x00" "\xff\xff\x9e\x00\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00" "\xff\xff\xab\x00\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb3\x00" "\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00" "\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0e\x00" "\x00\x00\x15\x00\x00\x00\x1b\x00\x00\x00\x22\x00\x00\x00\x28\x00" "\x80\x00\x2e\x00\xff\x00\x34\x00\xff\x00\x3a\x00\xff\x1b\x40\x00" "\xff\xff\x46\x00\xff\xff\x4c\x00\xff\xff\x51\x00\xff\xff\x56\x00" "\xff\xff\x5c\x00\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6b\x00" "\xff\xff\x70\x00\xff\xff\x74\x00\xff\xff\x79\x00\xff\xff\x7d\x00" "\xff\xff\x81\x00\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00" "\xff\xff\x91\x00\xff\xff\x95\x00\xff\xff\x99\x00\xff\xff\x9c\x00" "\xff\xff\x9f\x00\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00" "\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb3\x00" "\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x09\x00\x00\x00\x10\x00" "\x00\x00\x16\x00\x00\x00\x1d\x00\x00\x00\x23\x00\x00\x00\x29\x00" "\xb6\x00\x30\x00\xff\x00\x36\x00\xff\x00\x3c\x00\xff\x5e\x41\x00" "\xff\xff\x47\x00\xff\xff\x4d\x00\xff\xff\x52\x00\xff\xff\x58\x00" "\xff\xff\x5d\x00\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00" "\xff\xff\x71\x00\xff\xff\x75\x00\xff\xff\x7a\x00\xff\xff\x7e\x00" "\xff\xff\x82\x00\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8e\x00" "\xff\xff\x92\x00\xff\xff\x96\x00\xff\xff\x99\x00\xff\xff\x9d\x00" "\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00" "\xff\xff\xac\x00\xff\xff\xaf\x00\xff\xff\xb1\x00\xff\xff\xb4\x00" "\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00" "\x00\x00\x17\x00\x00\x00\x1e\x00\x00\x00\x24\x00\x01\x00\x2b\x00" "\xec\x00\x31\x00\xff\x00\x37\x00\xff\x00\x3d\x00\xff\xa2\x43\x00" "\xff\xff\x48\x00\xff\xff\x4e\x00\xff\xff\x53\x00\xff\xff\x59\x00" "\xff\xff\x5e\x00\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00" "\xff\xff\x72\x00\xff\xff\x76\x00\xff\xff\x7b\x00\xff\xff\x7f\x00" "\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00" "\xff\xff\x93\x00\xff\xff\x97\x00\xff\xff\x9a\x00\xff\xff\x9e\x00" "\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00" "\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb4\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x0c\x00\x00\x00\x12\x00" "\x00\x00\x19\x00\x00\x00\x1f\x00\x00\x00\x26\x00\x23\x00\x2c\x00" "\xff\x00\x32\x00\xff\x00\x38\x00\xff\x01\x3e\x00\xff\xe6\x44\x00" "\xff\xff\x4a\x00\xff\xff\x4f\x00\xff\xff\x54\x00\xff\xff\x5a\x00" "\xff\xff\x5f\x00\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00" "\xff\xff\x73\x00\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x80\x00" "\xff\xff\x84\x00\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00" "\xff\xff\x94\x00\xff\xff\x97\x00\xff\xff\x9b\x00\xff\xff\x9e\x00" "\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00" "\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbc\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00\x00\x00\x14\x00" "\x00\x00\x1a\x00\x00\x00\x21\x00\x00\x00\x27\x00\x59\x00\x2d\x00" "\xff\x00\x33\x00\xff\x00\x39\x00\xff\x2b\x3f\x00\xff\xff\x45\x00" "\xff\xff\x4b\x00\xff\xff\x50\x00\xff\xff\x56\x00\xff\xff\x5b\x00" "\xff\xff\x60\x00\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00" "\xff\xff\x73\x00\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00" "\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00" "\xff\xff\x95\x00\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00" "\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00" "\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x0f\x00\x00\x00\x15\x00" "\x00\x00\x1c\x00\x00\x00\x22\x00\x00\x00\x28\x00\x8f\x00\x2f\x00" "\xff\x00\x35\x00\xff\x00\x3b\x00\xff\x6f\x40\x00\xff\xff\x46\x00" "\xff\xff\x4c\x00\xff\xff\x51\x00\xff\xff\x57\x00\xff\xff\x5c\x00" "\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x70\x00" "\xff\xff\x74\x00\xff\xff\x79\x00\xff\xff\x7d\x00\xff\xff\x82\x00" "\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00" "\xff\xff\x95\x00\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00" "\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00" "\xff\xff\xaf\x00\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x10\x00\x00\x00\x16\x00" "\x00\x00\x1d\x00\x00\x00\x23\x00\x00\x00\x2a\x00\xc4\x00\x30\x00" "\xff\x00\x36\x00\xff\x00\x3c\x00\xff\xb4\x42\x00\xff\xff\x47\x00" "\xff\xff\x4d\x00\xff\xff\x53\x00\xff\xff\x58\x00\xff\xff\x5d\x00" "\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00\xff\xff\x71\x00" "\xff\xff\x75\x00\xff\xff\x7a\x00\xff\xff\x7e\x00\xff\xff\x83\x00" "\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x92\x00" "\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa0\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xac\x00" "\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1e\x00\x00\x00\x25\x00\x01\x00\x2b\x00\xf1\x00\x31\x00" "\xff\x00\x37\x00\xff\x05\x3d\x00\xff\xf4\x43\x00\xff\xff\x49\x00" "\xff\xff\x4e\x00\xff\xff\x54\x00\xff\xff\x59\x00\xff\xff\x5e\x00" "\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x72\x00" "\xff\xff\x76\x00\xff\xff\x7b\x00\xff\xff\x7f\x00\xff\xff\x84\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x93\x00" "\xff\xff\x97\x00\xff\xff\x9a\x00\xff\xff\x9e\x00\xff\xff\xa1\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00" "\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x0b\x00\x00\x00\x12\x00\x00\x00\x19\x00" "\x00\x00\x20\x00\x00\x00\x26\x00\x1c\x00\x2c\x00\xff\x00\x32\x00" "\xff\x00\x38\x00\xff\x3a\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x5f\x00" "\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x73\x00" "\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x84\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00" "\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9f\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x06\x00\x00\x00\x0d\x00\x00\x00\x13\x00\x00\x00\x1a\x00" "\x00\x00\x20\x00\x00\x00\x27\x00\x47\x00\x2d\x00\xff\x00\x33\x00" "\xff\x00\x39\x00\xff\x71\x3f\x00\xff\xff\x45\x00\xff\xff\x4b\x00" "\xff\xff\x51\x00\xff\xff\x56\x00\xff\xff\x5b\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa2\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x07\x00\x00\x00\x0e\x00\x00\x00\x15\x00\x00\x00\x1b\x00" "\x00\x00\x22\x00\x00\x00\x28\x00\x72\x00\x2e\x00\xff\x00\x34\x00" "\xff\x00\x3a\x00\xff\xa7\x40\x00\xff\xff\x46\x00\xff\xff\x4c\x00" "\xff\xff\x51\x00\xff\xff\x57\x00\xff\xff\x5c\x00\xff\xff\x61\x00" "\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x70\x00\xff\xff\x75\x00" "\xff\xff\x79\x00\xff\xff\x7e\x00\xff\xff\x82\x00\xff\xff\x86\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x96\x00" "\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x08\x00\x00\x00\x0f\x00\x00\x00\x16\x00\x00\x00\x1c\x00" "\x00\x00\x23\x00\x00\x00\x29\x00\x9d\x00\x2f\x00\xff\x00\x35\x00" "\xff\x00\x3b\x00\xff\xdd\x41\x00\xff\xff\x47\x00\xff\xff\x4d\x00" "\xff\xff\x52\x00\xff\xff\x58\x00\xff\xff\x5d\x00\xff\xff\x62\x00" "\xff\xff\x67\x00\xff\xff\x6c\x00\xff\xff\x71\x00\xff\xff\x75\x00" "\xff\xff\x7a\x00\xff\xff\x7e\x00\xff\xff\x83\x00\xff\xff\x87\x00" "\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x93\x00\xff\xff\x96\x00" "\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa1\x00\xff\xff\xa4\x00" "\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00" "\x00\x00\x09\x00\x00\x00\x10\x00\x00\x00\x17\x00\x00\x00\x1d\x00" "\x00\x00\x24\x00\x00\x00\x2a\x00\xc8\x00\x30\x00\xff\x00\x36\x00" "\xff\x15\x3c\x00\xff\xff\x42\x00\xff\xff\x48\x00\xff\xff\x4e\x00" "\xff\xff\x53\x00\xff\xff\x59\x00\xff\xff\x5e\x00\xff\xff\x63\x00" "\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x72\x00\xff\xff\x76\x00" "\xff\xff\x7b\x00\xff\xff\x7f\x00\xff\xff\x83\x00\xff\xff\x88\x00" "\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x93\x00\xff\xff\x97\x00" "\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa4\x00" "\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xb0\x00" "\xff\xff\xb2\x00\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00" "\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00\x00\x00\x1e\x00" "\x00\x00\x25\x00\x01\x00\x2b\x00\xf2\x00\x31\x00\xff\x00\x37\x00" "\xff\x4a\x3d\x00\xff\xff\x43\x00\xff\xff\x49\x00\xff\xff\x4f\x00" "\xff\xff\x54\x00\xff\xff\x59\x00\xff\xff\x5f\x00\xff\xff\x64\x00" "\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x72\x00\xff\xff\x77\x00" "\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x84\x00\xff\xff\x88\x00" "\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00\xff\xff\x98\x00" "\xff\xff\x9b\x00\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa5\x00" "\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb0\x00" "\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb8\x00\xff\xff\xba\x00" "\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00" "\x00\x00\x0b\x00\x00\x00\x12\x00\x00\x00\x19\x00\x00\x00\x20\x00" "\x00\x00\x26\x00\x1d\x00\x2d\x00\xff\x00\x33\x00\xff\x00\x39\x00" "\xff\x80\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00\xff\xff\x4f\x00" "\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x60\x00\xff\xff\x65\x00" "\xff\xff\x6a\x00\xff\xff\x6e\x00\xff\xff\x73\x00\xff\xff\x78\x00" "\xff\xff\x7c\x00\xff\xff\x81\x00\xff\xff\x85\x00\xff\xff\x89\x00" "\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00\xff\xff\x98\x00" "\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa5\x00" "\xff\xff\xa9\x00\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb1\x00" "\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00" "\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00" "\x00\x00\x0d\x00\x00\x00\x13\x00\x00\x00\x1a\x00\x00\x00\x20\x00" "\x00\x00\x27\x00\x48\x00\x2d\x00\xff\x00\x33\x00\xff\x00\x39\x00" "\xff\xb6\x3f\x00\xff\xff\x45\x00\xff\xff\x4b\x00\xff\xff\x51\x00" "\xff\xff\x56\x00\xff\xff\x5b\x00\xff\xff\x60\x00\xff\xff\x65\x00" "\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00\xff\xff\x79\x00" "\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x86\x00\xff\xff\x8a\x00" "\xff\xff\x8e\x00\xff\xff\x91\x00\xff\xff\x95\x00\xff\xff\x99\x00" "\xff\xff\x9c\x00\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa6\x00" "\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00\xff\xff\xb1\x00" "\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00" "\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00" "\x00\x00\x0e\x00\x00\x00\x15\x00\x00\x00\x1b\x00\x00\x00\x22\x00" "\x00\x00\x28\x00\x73\x00\x2e\x00\xff\x00\x34\x00\xff\x01\x3a\x00" "\xff\xec\x40\x00\xff\xff\x46\x00\xff\xff\x4c\x00\xff\xff\x51\x00" "\xff\xff\x57\x00\xff\xff\x5c\x00\xff\xff\x61\x00\xff\xff\x66\x00" "\xff\xff\x6b\x00\xff\xff\x70\x00\xff\xff\x75\x00\xff\xff\x79\x00" "\xff\xff\x7e\x00\xff\xff\x82\x00\xff\xff\x86\x00\xff\xff\x8a\x00" "\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x96\x00\xff\xff\x99\x00" "\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa7\x00" "\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00\xff\xff\xb2\x00" "\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb9\x00\xff\xff\xbb\x00" "\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc2\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x08\x00" "\x00\x00\x0f\x00\x00\x00\x16\x00\x00\x00\x1c\x00\x00\x00\x23\x00" "\x00\x00\x29\x00\x9e\x00\x2f\x00\xff\x00\x35\x00\xff\x23\x3b\x00" "\xff\xff\x41\x00\xff\xff\x47\x00\xff\xff\x4d\x00\xff\xff\x52\x00" "\xff\xff\x58\x00\xff\xff\x5d\x00\xff\xff\x62\x00\xff\xff\x67\x00" "\xff\xff\x6c\x00\xff\xff\x71\x00\xff\xff\x75\x00\xff\xff\x7a\x00" "\xff\xff\x7e\x00\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8b\x00" "\xff\xff\x8f\x00\xff\xff\x93\x00\xff\xff\x96\x00\xff\xff\x9a\x00" "\xff\xff\x9d\x00\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa7\x00" "\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xaf\x00\xff\xff\xb2\x00" "\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00" "\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x09\x00" "\x00\x00\x10\x00\x00\x00\x17\x00\x00\x00\x1d\x00\x00\x00\x24\x00" "\x00\x00\x2a\x00\xc9\x00\x30\x00\xff\x00\x36\x00\xff\x59\x3c\x00" "\xff\xff\x42\x00\xff\xff\x48\x00\xff\xff\x4e\x00\xff\xff\x53\x00" "\xff\xff\x59\x00\xff\xff\x5e\x00\xff\xff\x63\x00\xff\xff\x68\x00" "\xff\xff\x6d\x00\xff\xff\x72\x00\xff\xff\x76\x00\xff\xff\x7b\x00" "\xff\xff\x7f\x00\xff\xff\x83\x00\xff\xff\x88\x00\xff\xff\x8c\x00" "\xff\xff\x90\x00\xff\xff\x93\x00\xff\xff\x97\x00\xff\xff\x9b\x00" "\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa8\x00" "\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb3\x00" "\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbc\x00" "\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x0a\x00" "\x00\x00\x11\x00\x00\x00\x18\x00\x00\x00\x1e\x00\x00\x00\x25\x00" "\x01\x00\x2b\x00\xf2\x00\x31\x00\xff\x00\x37\x00\xff\x8f\x3d\x00" "\xff\xff\x43\x00\xff\xff\x49\x00\xff\xff\x4f\x00\xff\xff\x54\x00" "\xff\xff\x59\x00\xff\xff\x5f\x00\xff\xff\x64\x00\xff\xff\x69\x00" "\xff\xff\x6e\x00\xff\xff\x72\x00\xff\xff\x77\x00\xff\xff\x7c\x00" "\xff\xff\x80\x00\xff\xff\x84\x00\xff\xff\x88\x00\xff\xff\x8c\x00" "\xff\xff\x90\x00\xff\xff\x94\x00\xff\xff\x98\x00\xff\xff\x9b\x00" "\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00" "\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb3\x00" "\xff\xff\xb5\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0b\x00" "\x00\x00\x12\x00\x00\x00\x19\x00\x00\x00\x20\x00\x00\x00\x26\x00" "\x15\x00\x2c\x00\xff\x00\x33\x00\xff\x00\x39\x00\xff\xc4\x3e\x00" "\xff\xff\x44\x00\xff\xff\x4a\x00\xff\xff\x50\x00\xff\xff\x55\x00" "\xff\xff\x5a\x00\xff\xff\x60\x00\xff\xff\x65\x00\xff\xff\x6a\x00" "\xff\xff\x6e\x00\xff\xff\x73\x00\xff\xff\x78\x00\xff\xff\x7c\x00" "\xff\xff\x81\x00\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8d\x00" "\xff\xff\x91\x00\xff\xff\x95\x00\xff\xff\x98\x00\xff\xff\x9c\x00" "\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa9\x00" "\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb3\x00" "\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x0c\x00" "\x00\x00\x13\x00\x00\x00\x1a\x00\x00\x00\x20\x00\x00\x00\x27\x00" "\x36\x00\x2d\x00\xff\x00\x33\x00\xff\x01\x39\x00\xff\xf1\x3f\x00" "\xff\xff\x45\x00\xff\xff\x4b\x00\xff\xff\x50\x00\xff\xff\x56\x00" "\xff\xff\x5b\x00\xff\xff\x60\x00\xff\xff\x65\x00\xff\xff\x6a\x00" "\xff\xff\x6f\x00\xff\xff\x74\x00\xff\xff\x79\x00\xff\xff\x7d\x00" "\xff\xff\x81\x00\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00" "\xff\xff\x91\x00\xff\xff\x95\x00\xff\xff\x99\x00\xff\xff\x9c\x00" "\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00" "\xff\xff\xac\x00\xff\xff\xaf\x00\xff\xff\xb1\x00\xff\xff\xb4\x00" "\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00" "\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x21\x00\x00\x00\x27\x00" "\x56\x00\x2e\x00\xff\x00\x34\x00\xff\x1c\x3a\x00\xff\xff\x40\x00" "\xff\xff\x46\x00\xff\xff\x4c\x00\xff\xff\x51\x00\xff\xff\x57\x00" "\xff\xff\x5c\x00\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6b\x00" "\xff\xff\x70\x00\xff\xff\x75\x00\xff\xff\x79\x00\xff\xff\x7e\x00" "\xff\xff\x82\x00\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00" "\xff\xff\x92\x00\xff\xff\x96\x00\xff\xff\x99\x00\xff\xff\x9d\x00" "\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa7\x00\xff\xff\xa9\x00" "\xff\xff\xac\x00\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb4\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0e\x00" "\x00\x00\x15\x00\x00\x00\x1b\x00\x00\x00\x22\x00\x00\x00\x28\x00" "\x77\x00\x2f\x00\xff\x00\x35\x00\xff\x47\x3b\x00\xff\xff\x41\x00" "\xff\xff\x47\x00\xff\xff\x4c\x00\xff\xff\x52\x00\xff\xff\x57\x00" "\xff\xff\x5d\x00\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00" "\xff\xff\x71\x00\xff\xff\x75\x00\xff\xff\x7a\x00\xff\xff\x7e\x00" "\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00" "\xff\xff\x93\x00\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9d\x00" "\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00" "\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb5\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x0f\x00" "\x00\x00\x16\x00\x00\x00\x1c\x00\x00\x00\x23\x00\x00\x00\x29\x00" "\x98\x00\x2f\x00\xff\x00\x36\x00\xff\x72\x3c\x00\xff\xff\x42\x00" "\xff\xff\x47\x00\xff\xff\x4d\x00\xff\xff\x53\x00\xff\xff\x58\x00" "\xff\xff\x5d\x00\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00" "\xff\xff\x71\x00\xff\xff\x76\x00\xff\xff\x7b\x00\xff\xff\x7f\x00" "\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8c\x00\xff\xff\x8f\x00" "\xff\xff\x93\x00\xff\xff\x97\x00\xff\xff\x9a\x00\xff\xff\x9e\x00" "\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa8\x00\xff\xff\xaa\x00" "\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbc\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x09\x00\x00\x00\x10\x00" "\x00\x00\x16\x00\x00\x00\x1d\x00\x00\x00\x24\x00\x00\x00\x2a\x00" "\xb9\x00\x30\x00\xff\x00\x36\x00\xff\x9d\x3c\x00\xff\xff\x42\x00" "\xff\xff\x48\x00\xff\xff\x4e\x00\xff\xff\x53\x00\xff\xff\x59\x00" "\xff\xff\x5e\x00\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00" "\xff\xff\x72\x00\xff\xff\x77\x00\xff\xff\x7b\x00\xff\xff\x7f\x00" "\xff\xff\x84\x00\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00" "\xff\xff\x94\x00\xff\xff\x97\x00\xff\xff\x9b\x00\xff\xff\x9e\x00" "\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00" "\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x11\x00" "\x00\x00\x17\x00\x00\x00\x1e\x00\x00\x00\x24\x00\x00\x00\x2b\x00" "\xda\x00\x31\x00\xff\x00\x37\x00\xff\xc8\x3d\x00\xff\xff\x43\x00" "\xff\xff\x49\x00\xff\xff\x4e\x00\xff\xff\x54\x00\xff\xff\x59\x00" "\xff\xff\x5f\x00\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00" "\xff\xff\x72\x00\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x80\x00" "\xff\xff\x84\x00\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00" "\xff\xff\x94\x00\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9f\x00" "\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00" "\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x00\x00\x12\x00" "\x00\x00\x18\x00\x00\x00\x1f\x00\x00\x00\x25\x00\x02\x00\x2c\x00" "\xf9\x00\x32\x00\xff\x01\x38\x00\xff\xf2\x3e\x00\xff\xff\x44\x00" "\xff\xff\x4a\x00\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00" "\xff\xff\x5f\x00\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00" "\xff\xff\x73\x00\xff\xff\x78\x00\xff\xff\x7c\x00\xff\xff\x81\x00" "\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00" "\xff\xff\x95\x00\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00" "\xff\xff\xa2\x00\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00" "\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x00\x00\x12\x00" "\x00\x00\x19\x00\x00\x00\x1f\x00\x00\x00\x26\x00\x1c\x00\x2c\x00" "\xff\x00\x33\x00\xff\x1d\x39\x00\xff\xff\x3f\x00\xff\xff\x45\x00" "\xff\xff\x4a\x00\xff\xff\x50\x00\xff\xff\x55\x00\xff\xff\x5b\x00" "\xff\xff\x60\x00\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00" "\xff\xff\x74\x00\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00" "\xff\xff\x85\x00\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x91\x00" "\xff\xff\x95\x00\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00" "\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00" "\xff\xff\xaf\x00\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x0c\x00\x00\x00\x13\x00" "\x00\x00\x1a\x00\x00\x00\x21\x00\x00\x00\x27\x00\x3d\x00\x2d\x00" "\xff\x00\x33\x00\xff\x48\x3a\x00\xff\xff\x3f\x00\xff\xff\x45\x00" "\xff\xff\x4b\x00\xff\xff\x51\x00\xff\xff\x56\x00\xff\xff\x5b\x00" "\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x70\x00" "\xff\xff\x74\x00\xff\xff\x79\x00\xff\xff\x7d\x00\xff\xff\x82\x00" "\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00" "\xff\xff\x96\x00\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00" "\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00" "\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00\x00\x00\x14\x00" "\x00\x00\x1b\x00\x00\x00\x21\x00\x00\x00\x28\x00\x5e\x00\x2e\x00" "\xff\x00\x34\x00\xff\x73\x3a\x00\xff\xff\x40\x00\xff\xff\x46\x00" "\xff\xff\x4c\x00\xff\xff\x51\x00\xff\xff\x57\x00\xff\xff\x5c\x00" "\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x70\x00" "\xff\xff\x75\x00\xff\xff\x79\x00\xff\xff\x7e\x00\xff\xff\x82\x00" "\xff\xff\x86\x00\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x92\x00" "\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa0\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00" "\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0e\x00\x00\x00\x15\x00" "\x00\x00\x1c\x00\x00\x00\x22\x00\x00\x00\x28\x00\x7f\x00\x2f\x00" "\xff\x00\x35\x00\xff\x9e\x3b\x00\xff\xff\x41\x00\xff\xff\x47\x00" "\xff\xff\x4c\x00\xff\xff\x52\x00\xff\xff\x57\x00\xff\xff\x5d\x00" "\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00\xff\xff\x71\x00" "\xff\xff\x75\x00\xff\xff\x7a\x00\xff\xff\x7f\x00\xff\xff\x83\x00" "\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x93\x00" "\xff\xff\x97\x00\xff\xff\x9a\x00\xff\xff\x9e\x00\xff\xff\xa1\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00" "\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x0f\x00\x00\x00\x16\x00" "\x00\x00\x1c\x00\x00\x00\x23\x00\x00\x00\x29\x00\xa0\x00\x30\x00" "\xff\x00\x36\x00\xff\xc9\x3c\x00\xff\xff\x42\x00\xff\xff\x48\x00" "\xff\xff\x4d\x00\xff\xff\x53\x00\xff\xff\x58\x00\xff\xff\x5d\x00" "\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x71\x00" "\xff\xff\x76\x00\xff\xff\x7b\x00\xff\xff\x7f\x00\xff\xff\x83\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x93\x00" "\xff\xff\x97\x00\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa1\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xad\x00" "\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x10\x00\x00\x00\x17\x00" "\x00\x00\x1d\x00\x00\x00\x24\x00\x00\x00\x2a\x00\xbf\x00\x30\x00" "\xff\x01\x37\x00\xff\xf2\x3d\x00\xff\xff\x42\x00\xff\xff\x48\x00" "\xff\xff\x4e\x00\xff\xff\x53\x00\xff\xff\x59\x00\xff\xff\x5e\x00" "\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x72\x00" "\xff\xff\x77\x00\xff\xff\x7b\x00\xff\xff\x80\x00\xff\xff\x84\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00" "\xff\xff\x97\x00\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x10\x00\x00\x00\x17\x00" "\x00\x00\x1e\x00\x00\x00\x25\x00\x00\x00\x2b\x00\xd8\x00\x31\x00" "\xff\x15\x37\x00\xff\xff\x3e\x00\xff\xff\x43\x00\xff\xff\x49\x00" "\xff\xff\x4f\x00\xff\xff\x54\x00\xff\xff\x59\x00\xff\xff\x5f\x00" "\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x73\x00" "\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x84\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x94\x00" "\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9f\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1f\x00\x00\x00\x25\x00\x00\x00\x2b\x00\xf0\x00\x32\x00" "\xff\x36\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x5f\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6e\x00\xff\xff\x73\x00" "\xff\xff\x78\x00\xff\xff\x7c\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x0b\x00\x00\x00\x12\x00\x00\x00\x19\x00" "\x00\x00\x1f\x00\x00\x00\x26\x00\x09\x00\x2c\x00\xff\x00\x32\x00" "\xff\x56\x39\x00\xff\xff\x3f\x00\xff\xff\x45\x00\xff\xff\x4a\x00" "\xff\xff\x50\x00\xff\xff\x55\x00\xff\xff\x5b\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x05\x00\x00\x00\x0c\x00\x00\x00\x12\x00\x00\x00\x19\x00" "\x00\x00\x20\x00\x00\x00\x26\x00\x22\x00\x2d\x00\xff\x00\x33\x00" "\xff\x77\x39\x00\xff\xff\x3f\x00\xff\xff\x45\x00\xff\xff\x4b\x00" "\xff\xff\x50\x00\xff\xff\x56\x00\xff\xff\x5b\x00\xff\xff\x60\x00" "\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x79\x00\xff\xff\x7d\x00\xff\xff\x82\x00\xff\xff\x86\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x96\x00" "\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x05\x00\x00\x00\x0c\x00\x00\x00\x13\x00\x00\x00\x1a\x00" "\x00\x00\x20\x00\x00\x00\x27\x00\x3a\x00\x2d\x00\xff\x00\x34\x00" "\xff\x98\x3a\x00\xff\xff\x40\x00\xff\xff\x46\x00\xff\xff\x4b\x00" "\xff\xff\x51\x00\xff\xff\x56\x00\xff\xff\x5c\x00\xff\xff\x61\x00" "\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x70\x00\xff\xff\x75\x00" "\xff\xff\x79\x00\xff\xff\x7e\x00\xff\xff\x82\x00\xff\xff\x86\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x96\x00" "\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa4\x00" "\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x06\x00\x00\x00\x0d\x00\x00\x00\x14\x00\x00\x00\x1b\x00" "\x00\x00\x21\x00\x00\x00\x28\x00\x53\x00\x2e\x00\xff\x00\x34\x00" "\xff\xb9\x3a\x00\xff\xff\x40\x00\xff\xff\x46\x00\xff\xff\x4c\x00" "\xff\xff\x51\x00\xff\xff\x57\x00\xff\xff\x5c\x00\xff\xff\x61\x00" "\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x70\x00\xff\xff\x75\x00" "\xff\xff\x7a\x00\xff\xff\x7e\x00\xff\xff\x82\x00\xff\xff\x87\x00" "\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x93\x00\xff\xff\x96\x00" "\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa1\x00\xff\xff\xa4\x00" "\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xb0\x00" "\xff\xff\xb2\x00\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x07\x00\x00\x00\x0e\x00\x00\x00\x14\x00\x00\x00\x1b\x00" "\x00\x00\x22\x00\x00\x00\x28\x00\x6c\x00\x2e\x00\xff\x00\x35\x00" "\xff\xda\x3b\x00\xff\xff\x41\x00\xff\xff\x47\x00\xff\xff\x4c\x00" "\xff\xff\x52\x00\xff\xff\x57\x00\xff\xff\x5d\x00\xff\xff\x62\x00" "\xff\xff\x67\x00\xff\xff\x6c\x00\xff\xff\x71\x00\xff\xff\x75\x00" "\xff\xff\x7a\x00\xff\xff\x7e\x00\xff\xff\x83\x00\xff\xff\x87\x00" "\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x93\x00\xff\xff\x97\x00" "\xff\xff\x9a\x00\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa4\x00" "\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xb0\x00" "\xff\xff\xb2\x00\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x07\x00\x00\x00\x0e\x00\x00\x00\x15\x00\x00\x00\x1c\x00" "\x00\x00\x22\x00\x00\x00\x29\x00\x84\x00\x2f\x00\xff\x02\x35\x00" "\xff\xf9\x3b\x00\xff\xff\x41\x00\xff\xff\x47\x00\xff\xff\x4d\x00" "\xff\xff\x52\x00\xff\xff\x58\x00\xff\xff\x5d\x00\xff\xff\x62\x00" "\xff\xff\x67\x00\xff\xff\x6c\x00\xff\xff\x71\x00\xff\xff\x76\x00" "\xff\xff\x7a\x00\xff\xff\x7f\x00\xff\xff\x83\x00\xff\xff\x87\x00" "\xff\xff\x8c\x00\xff\xff\x8f\x00\xff\xff\x93\x00\xff\xff\x97\x00" "\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa5\x00" "\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xad\x00\xff\xff\xb0\x00" "\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xba\x00" "\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc1\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x08\x00\x00\x00\x0f\x00\x00\x00\x16\x00\x00\x00\x1c\x00" "\x00\x00\x23\x00\x00\x00\x29\x00\x9d\x00\x30\x00\xff\x1c\x36\x00" "\xff\xff\x3c\x00\xff\xff\x42\x00\xff\xff\x48\x00\xff\xff\x4d\x00" "\xff\xff\x53\x00\xff\xff\x58\x00\xff\xff\x5e\x00\xff\xff\x63\x00" "\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x72\x00\xff\xff\x76\x00" "\xff\xff\x7b\x00\xff\xff\x7f\x00\xff\xff\x84\x00\xff\xff\x88\x00" "\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00\xff\xff\x97\x00" "\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa2\x00\xff\xff\xa5\x00" "\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb0\x00" "\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb8\x00\xff\xff\xba\x00" "\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc1\x00" "\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x09\x00\x00\x00\x10\x00\x00\x00\x16\x00\x00\x00\x1d\x00" "\x00\x00\x24\x00\x00\x00\x2a\x00\xb6\x00\x30\x00\xff\x3d\x36\x00" "\xff\xff\x3c\x00\xff\xff\x42\x00\xff\xff\x48\x00\xff\xff\x4e\x00" "\xff\xff\x53\x00\xff\xff\x59\x00\xff\xff\x5e\x00\xff\xff\x63\x00" "\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x72\x00\xff\xff\x77\x00" "\xff\xff\x7b\x00\xff\xff\x80\x00\xff\xff\x84\x00\xff\xff\x88\x00" "\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00\xff\xff\x98\x00" "\xff\xff\x9b\x00\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa5\x00" "\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb1\x00" "\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00" "\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00" "\x00\x00\x09\x00\x00\x00\x10\x00\x00\x00\x17\x00\x00\x00\x1e\x00" "\x00\x00\x24\x00\x00\x00\x2b\x00\xce\x00\x31\x00\xff\x5e\x37\x00" "\xff\xff\x3d\x00\xff\xff\x43\x00\xff\xff\x49\x00\xff\xff\x4f\x00" "\xff\xff\x54\x00\xff\xff\x59\x00\xff\xff\x5f\x00\xff\xff\x64\x00" "\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x73\x00\xff\xff\x77\x00" "\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x84\x00\xff\xff\x89\x00" "\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x94\x00\xff\xff\x98\x00" "\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa5\x00" "\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb1\x00" "\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00" "\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00" "\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00\x00\x00\x1e\x00" "\x00\x00\x25\x00\x00\x00\x2b\x00\xe7\x00\x31\x00\xff\x7f\x38\x00" "\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x49\x00\xff\xff\x4f\x00" "\xff\xff\x54\x00\xff\xff\x5a\x00\xff\xff\x5f\x00\xff\xff\x64\x00" "\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x73\x00\xff\xff\x78\x00" "\xff\xff\x7c\x00\xff\xff\x81\x00\xff\xff\x85\x00\xff\xff\x89\x00" "\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00\xff\xff\x98\x00" "\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa3\x00\xff\xff\xa6\x00" "\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xae\x00\xff\xff\xb1\x00" "\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00" "\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00" "\x00\x00\x0b\x00\x00\x00\x12\x00\x00\x00\x18\x00\x00\x00\x1f\x00" "\x00\x00\x26\x00\x03\x00\x2c\x00\xfd\x00\x32\x00\xff\xa0\x38\x00" "\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00\xff\xff\x4f\x00" "\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x60\x00\xff\xff\x65\x00" "\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x73\x00\xff\xff\x78\x00" "\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x85\x00\xff\xff\x89\x00" "\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00\xff\xff\x99\x00" "\xff\xff\x9c\x00\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa6\x00" "\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00\xff\xff\xb1\x00" "\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb9\x00\xff\xff\xbb\x00" "\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc2\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00" "\x00\x00\x0b\x00\x00\x00\x12\x00\x00\x00\x19\x00\x00\x00\x20\x00" "\x00\x00\x26\x00\x18\x00\x2c\x00\xff\x00\x33\x00\xff\xbf\x39\x00" "\xff\xff\x3f\x00\xff\xff\x45\x00\xff\xff\x4a\x00\xff\xff\x50\x00" "\xff\xff\x56\x00\xff\xff\x5b\x00\xff\xff\x60\x00\xff\xff\x65\x00" "\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00\xff\xff\x79\x00" "\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x86\x00\xff\xff\x8a\x00" "\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x95\x00\xff\xff\x99\x00" "\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa6\x00" "\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00\xff\xff\xb2\x00" "\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00" "\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00" "\x00\x00\x0c\x00\x00\x00\x13\x00\x00\x00\x1a\x00\x00\x00\x20\x00" "\x00\x00\x27\x00\x2e\x00\x2d\x00\xff\x00\x33\x00\xff\xd8\x3a\x00" "\xff\xff\x3f\x00\xff\xff\x45\x00\xff\xff\x4b\x00\xff\xff\x51\x00" "\xff\xff\x56\x00\xff\xff\x5b\x00\xff\xff\x61\x00\xff\xff\x66\x00" "\xff\xff\x6b\x00\xff\xff\x70\x00\xff\xff\x74\x00\xff\xff\x79\x00" "\xff\xff\x7d\x00\xff\xff\x82\x00\xff\xff\x86\x00\xff\xff\x8a\x00" "\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x96\x00\xff\xff\x99\x00" "\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa4\x00\xff\xff\xa7\x00" "\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xaf\x00\xff\xff\xb2\x00" "\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00" "\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00" "\x00\x00\x0c\x00\x00\x00\x13\x00\x00\x00\x1a\x00\x00\x00\x21\x00" "\x00\x00\x27\x00\x40\x00\x2e\x00\xff\x00\x34\x00\xff\xf0\x3a\x00" "\xff\xff\x40\x00\xff\xff\x46\x00\xff\xff\x4b\x00\xff\xff\x51\x00" "\xff\xff\x57\x00\xff\xff\x5c\x00\xff\xff\x61\x00\xff\xff\x66\x00" "\xff\xff\x6b\x00\xff\xff\x70\x00\xff\xff\x75\x00\xff\xff\x79\x00" "\xff\xff\x7e\x00\xff\xff\x82\x00\xff\xff\x86\x00\xff\xff\x8b\x00" "\xff\xff\x8f\x00\xff\xff\x92\x00\xff\xff\x96\x00\xff\xff\x9a\x00" "\xff\xff\x9d\x00\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa7\x00" "\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb2\x00" "\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00" "\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00" "\x00\x00\x0d\x00\x00\x00\x14\x00\x00\x00\x1a\x00\x00\x00\x21\x00" "\x00\x00\x28\x00\x52\x00\x2e\x00\xff\x09\x34\x00\xff\xff\x3a\x00" "\xff\xff\x40\x00\xff\xff\x46\x00\xff\xff\x4c\x00\xff\xff\x51\x00" "\xff\xff\x57\x00\xff\xff\x5c\x00\xff\xff\x61\x00\xff\xff\x67\x00" "\xff\xff\x6c\x00\xff\xff\x70\x00\xff\xff\x75\x00\xff\xff\x7a\x00" "\xff\xff\x7e\x00\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8b\x00" "\xff\xff\x8f\x00\xff\xff\x93\x00\xff\xff\x96\x00\xff\xff\x9a\x00" "\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa7\x00" "\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb2\x00" "\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00" "\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00" "\x00\x00\x0d\x00\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x22\x00" "\x00\x00\x28\x00\x64\x00\x2e\x00\xff\x22\x35\x00\xff\xff\x3b\x00" "\xff\xff\x41\x00\xff\xff\x46\x00\xff\xff\x4c\x00\xff\xff\x52\x00" "\xff\xff\x57\x00\xff\xff\x5d\x00\xff\xff\x62\x00\xff\xff\x67\x00" "\xff\xff\x6c\x00\xff\xff\x71\x00\xff\xff\x76\x00\xff\xff\x7a\x00" "\xff\xff\x7f\x00\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8b\x00" "\xff\xff\x8f\x00\xff\xff\x93\x00\xff\xff\x97\x00\xff\xff\x9a\x00" "\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa7\x00" "\xff\xff\xaa\x00\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb3\x00" "\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xba\x00\xff\xff\xbc\x00" "\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00" "\x00\x00\x0e\x00\x00\x00\x15\x00\x00\x00\x1b\x00\x00\x00\x22\x00" "\x00\x00\x29\x00\x76\x00\x2f\x00\xff\x3a\x35\x00\xff\xff\x3b\x00" "\xff\xff\x41\x00\xff\xff\x47\x00\xff\xff\x4d\x00\xff\xff\x52\x00" "\xff\xff\x58\x00\xff\xff\x5d\x00\xff\xff\x62\x00\xff\xff\x67\x00" "\xff\xff\x6c\x00\xff\xff\x71\x00\xff\xff\x76\x00\xff\xff\x7a\x00" "\xff\xff\x7f\x00\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8c\x00" "\xff\xff\x8f\x00\xff\xff\x93\x00\xff\xff\x97\x00\xff\xff\x9b\x00" "\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa5\x00\xff\xff\xa8\x00" "\xff\xff\xab\x00\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb3\x00" "\xff\xff\xb5\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00" "\x00\x00\x0e\x00\x00\x00\x15\x00\x00\x00\x1c\x00\x00\x00\x23\x00" "\x00\x00\x29\x00\x88\x00\x2f\x00\xff\x53\x35\x00\xff\xff\x3c\x00" "\xff\xff\x41\x00\xff\xff\x47\x00\xff\xff\x4d\x00\xff\xff\x53\x00" "\xff\xff\x58\x00\xff\xff\x5d\x00\xff\xff\x63\x00\xff\xff\x68\x00" "\xff\xff\x6d\x00\xff\xff\x71\x00\xff\xff\x76\x00\xff\xff\x7b\x00" "\xff\xff\x7f\x00\xff\xff\x84\x00\xff\xff\x88\x00\xff\xff\x8c\x00" "\xff\xff\x90\x00\xff\xff\x94\x00\xff\xff\x97\x00\xff\xff\x9b\x00" "\xff\xff\x9e\x00\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00" "\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb3\x00" "\xff\xff\xb5\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x08\x00" "\x00\x00\x0f\x00\x00\x00\x16\x00\x00\x00\x1c\x00\x00\x00\x23\x00" "\x00\x00\x29\x00\x9a\x00\x30\x00\xff\x6c\x36\x00\xff\xff\x3c\x00" "\xff\xff\x42\x00\xff\xff\x48\x00\xff\xff\x4d\x00\xff\xff\x53\x00" "\xff\xff\x58\x00\xff\xff\x5e\x00\xff\xff\x63\x00\xff\xff\x68\x00" "\xff\xff\x6d\x00\xff\xff\x72\x00\xff\xff\x76\x00\xff\xff\x7b\x00" "\xff\xff\x80\x00\xff\xff\x84\x00\xff\xff\x88\x00\xff\xff\x8c\x00" "\xff\xff\x90\x00\xff\xff\x94\x00\xff\xff\x98\x00\xff\xff\x9b\x00" "\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00" "\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb3\x00" "\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x08\x00" "\x00\x00\x0f\x00\x00\x00\x16\x00\x00\x00\x1d\x00\x00\x00\x23\x00" "\x00\x00\x2a\x00\xac\x00\x30\x00\xff\x84\x36\x00\xff\xff\x3c\x00" "\xff\xff\x42\x00\xff\xff\x48\x00\xff\xff\x4e\x00\xff\xff\x53\x00" "\xff\xff\x59\x00\xff\xff\x5e\x00\xff\xff\x63\x00\xff\xff\x68\x00" "\xff\xff\x6d\x00\xff\xff\x72\x00\xff\xff\x77\x00\xff\xff\x7b\x00" "\xff\xff\x80\x00\xff\xff\x84\x00\xff\xff\x88\x00\xff\xff\x8c\x00" "\xff\xff\x90\x00\xff\xff\x94\x00\xff\xff\x98\x00\xff\xff\x9b\x00" "\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00" "\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb3\x00" "\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x09\x00" "\x00\x00\x10\x00\x00\x00\x17\x00\x00\x00\x1d\x00\x00\x00\x24\x00" "\x00\x00\x2a\x00\xbe\x00\x31\x00\xff\x9d\x37\x00\xff\xff\x3d\x00" "\xff\xff\x43\x00\xff\xff\x49\x00\xff\xff\x4e\x00\xff\xff\x54\x00" "\xff\xff\x59\x00\xff\xff\x5e\x00\xff\xff\x64\x00\xff\xff\x69\x00" "\xff\xff\x6e\x00\xff\xff\x72\x00\xff\xff\x77\x00\xff\xff\x7c\x00" "\xff\xff\x80\x00\xff\xff\x84\x00\xff\xff\x89\x00\xff\xff\x8d\x00" "\xff\xff\x91\x00\xff\xff\x94\x00\xff\xff\x98\x00\xff\xff\x9c\x00" "\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa9\x00" "\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb3\x00" "\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x09\x00" "\x00\x00\x10\x00\x00\x00\x17\x00\x00\x00\x1e\x00\x00\x00\x24\x00" "\x00\x00\x2b\x00\xd0\x00\x31\x00\xff\xb6\x37\x00\xff\xff\x3d\x00" "\xff\xff\x43\x00\xff\xff\x49\x00\xff\xff\x4f\x00\xff\xff\x54\x00" "\xff\xff\x5a\x00\xff\xff\x5f\x00\xff\xff\x64\x00\xff\xff\x69\x00" "\xff\xff\x6e\x00\xff\xff\x73\x00\xff\xff\x77\x00\xff\xff\x7c\x00" "\xff\xff\x80\x00\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8d\x00" "\xff\xff\x91\x00\xff\xff\x95\x00\xff\xff\x98\x00\xff\xff\x9c\x00" "\xff\xff\x9f\x00\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00" "\xff\xff\xac\x00\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb4\x00" "\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbd\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x0a\x00" "\x00\x00\x11\x00\x00\x00\x18\x00\x00\x00\x1e\x00\x00\x00\x25\x00" "\x00\x00\x2b\x00\xe2\x00\x32\x00\xff\xce\x38\x00\xff\xff\x3e\x00" "\xff\xff\x44\x00\xff\xff\x49\x00\xff\xff\x4f\x00\xff\xff\x55\x00" "\xff\xff\x5a\x00\xff\xff\x5f\x00\xff\xff\x64\x00\xff\xff\x69\x00" "\xff\xff\x6e\x00\xff\xff\x73\x00\xff\xff\x78\x00\xff\xff\x7c\x00" "\xff\xff\x81\x00\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8d\x00" "\xff\xff\x91\x00\xff\xff\x95\x00\xff\xff\x99\x00\xff\xff\x9c\x00" "\xff\xff\x9f\x00\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00" "\xff\xff\xac\x00\xff\xff\xaf\x00\xff\xff\xb1\x00\xff\xff\xb4\x00" "\xff\xff\xb6\x00\xff\xff\xb8\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0b\x00" "\x00\x00\x12\x00\x00\x00\x18\x00\x00\x00\x1f\x00\x00\x00\x25\x00" "\x00\x00\x2c\x00\xf5\x00\x32\x00\xff\xe7\x38\x00\xff\xff\x3e\x00" "\xff\xff\x44\x00\xff\xff\x4a\x00\xff\xff\x4f\x00\xff\xff\x55\x00" "\xff\xff\x5a\x00\xff\xff\x60\x00\xff\xff\x65\x00\xff\xff\x6a\x00" "\xff\xff\x6f\x00\xff\xff\x73\x00\xff\xff\x78\x00\xff\xff\x7d\x00" "\xff\xff\x81\x00\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8d\x00" "\xff\xff\x91\x00\xff\xff\x95\x00\xff\xff\x99\x00\xff\xff\x9c\x00" "\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00" "\xff\xff\xac\x00\xff\xff\xaf\x00\xff\xff\xb1\x00\xff\xff\xb4\x00" "\xff\xff\xb6\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0b\x00" "\x00\x00\x12\x00\x00\x00\x18\x00\x00\x00\x1f\x00\x00\x00\x26\x00" "\x08\x00\x2c\x00\xff\x03\x32\x00\xff\xfd\x38\x00\xff\xff\x3e\x00" "\xff\xff\x44\x00\xff\xff\x4a\x00\xff\xff\x50\x00\xff\xff\x55\x00" "\xff\xff\x5b\x00\xff\xff\x60\x00\xff\xff\x65\x00\xff\xff\x6a\x00" "\xff\xff\x6f\x00\xff\xff\x74\x00\xff\xff\x78\x00\xff\xff\x7d\x00" "\xff\xff\x81\x00\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00" "\xff\xff\x92\x00\xff\xff\x95\x00\xff\xff\x99\x00\xff\xff\x9d\x00" "\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00" "\xff\xff\xac\x00\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb4\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0b\x00" "\x00\x00\x12\x00\x00\x00\x19\x00\x00\x00\x20\x00\x00\x00\x26\x00" "\x19\x00\x2d\x00\xff\x18\x33\x00\xff\xff\x39\x00\xff\xff\x3f\x00" "\xff\xff\x45\x00\xff\xff\x4b\x00\xff\xff\x50\x00\xff\xff\x56\x00" "\xff\xff\x5b\x00\xff\xff\x60\x00\xff\xff\x65\x00\xff\xff\x6a\x00" "\xff\xff\x6f\x00\xff\xff\x74\x00\xff\xff\x79\x00\xff\xff\x7d\x00" "\xff\xff\x82\x00\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00" "\xff\xff\x92\x00\xff\xff\x96\x00\xff\xff\x99\x00\xff\xff\x9d\x00" "\xff\xff\xa0\x00\xff\xff\xa3\x00\xff\xff\xa7\x00\xff\xff\xaa\x00" "\xff\xff\xac\x00\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb4\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x0c\x00" "\x00\x00\x13\x00\x00\x00\x19\x00\x00\x00\x20\x00\x00\x00\x27\x00" "\x2b\x00\x2d\x00\xff\x2e\x33\x00\xff\xff\x39\x00\xff\xff\x3f\x00" "\xff\xff\x45\x00\xff\xff\x4b\x00\xff\xff\x51\x00\xff\xff\x56\x00" "\xff\xff\x5b\x00\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6b\x00" "\xff\xff\x70\x00\xff\xff\x74\x00\xff\xff\x79\x00\xff\xff\x7e\x00" "\xff\xff\x82\x00\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00" "\xff\xff\x92\x00\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9d\x00" "\xff\xff\xa0\x00\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00" "\xff\xff\xad\x00\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb4\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x0c\x00" "\x00\x00\x13\x00\x00\x00\x1a\x00\x00\x00\x21\x00\x00\x00\x27\x00" "\x3d\x00\x2d\x00\xff\x40\x34\x00\xff\xff\x3a\x00\xff\xff\x40\x00" "\xff\xff\x46\x00\xff\xff\x4b\x00\xff\xff\x51\x00\xff\xff\x56\x00" "\xff\xff\x5c\x00\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6b\x00" "\xff\xff\x70\x00\xff\xff\x75\x00\xff\xff\x79\x00\xff\xff\x7e\x00" "\xff\xff\x82\x00\xff\xff\x86\x00\xff\xff\x8b\x00\xff\xff\x8f\x00" "\xff\xff\x92\x00\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9d\x00" "\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00" "\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb5\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00" "\x00\x00\x14\x00\x00\x00\x1a\x00\x00\x00\x21\x00\x00\x00\x27\x00" "\x4b\x00\x2e\x00\xff\x52\x34\x00\xff\xff\x3a\x00\xff\xff\x40\x00" "\xff\xff\x46\x00\xff\xff\x4c\x00\xff\xff\x51\x00\xff\xff\x57\x00" "\xff\xff\x5c\x00\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00" "\xff\xff\x70\x00\xff\xff\x75\x00\xff\xff\x7a\x00\xff\xff\x7e\x00" "\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00" "\xff\xff\x93\x00\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9e\x00" "\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00" "\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb5\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00" "\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x21\x00\x00\x00\x28\x00" "\x57\x00\x2e\x00\xff\x64\x34\x00\xff\xff\x3a\x00\xff\xff\x40\x00" "\xff\xff\x46\x00\xff\xff\x4c\x00\xff\xff\x52\x00\xff\xff\x57\x00" "\xff\xff\x5c\x00\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00" "\xff\xff\x71\x00\xff\xff\x75\x00\xff\xff\x7a\x00\xff\xff\x7e\x00" "\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00" "\xff\xff\x93\x00\xff\xff\x97\x00\xff\xff\x9a\x00\xff\xff\x9e\x00" "\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00" "\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00" "\xff\xff\xb7\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00" "\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x22\x00\x00\x00\x28\x00" "\x64\x00\x2e\x00\xff\x76\x35\x00\xff\xff\x3b\x00\xff\xff\x41\x00" "\xff\xff\x47\x00\xff\xff\x4c\x00\xff\xff\x52\x00\xff\xff\x57\x00" "\xff\xff\x5d\x00\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00" "\xff\xff\x71\x00\xff\xff\x76\x00\xff\xff\x7a\x00\xff\xff\x7f\x00" "\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00" "\xff\xff\x93\x00\xff\xff\x97\x00\xff\xff\x9a\x00\xff\xff\x9e\x00" "\xff\xff\xa1\x00\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00" "\xff\xff\xad\x00\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00" "\xff\xff\xb7\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0e\x00" "\x00\x00\x15\x00\x00\x00\x1b\x00\x00\x00\x22\x00\x00\x00\x28\x00" "\x70\x00\x2f\x00\xff\x88\x35\x00\xff\xff\x3b\x00\xff\xff\x41\x00" "\xff\xff\x47\x00\xff\xff\x4d\x00\xff\xff\x52\x00\xff\xff\x58\x00" "\xff\xff\x5d\x00\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00" "\xff\xff\x71\x00\xff\xff\x76\x00\xff\xff\x7a\x00\xff\xff\x7f\x00" "\xff\xff\x83\x00\xff\xff\x87\x00\xff\xff\x8c\x00\xff\xff\x90\x00" "\xff\xff\x93\x00\xff\xff\x97\x00\xff\xff\x9b\x00\xff\xff\x9e\x00" "\xff\xff\xa1\x00\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00" "\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0e\x00" "\x00\x00\x15\x00\x00\x00\x1c\x00\x00\x00\x22\x00\x00\x00\x29\x00" "\x7d\x00\x2f\x00\xff\x9a\x35\x00\xff\xff\x3b\x00\xff\xff\x41\x00" "\xff\xff\x47\x00\xff\xff\x4d\x00\xff\xff\x52\x00\xff\xff\x58\x00" "\xff\xff\x5d\x00\xff\xff\x62\x00\xff\xff\x68\x00\xff\xff\x6d\x00" "\xff\xff\x71\x00\xff\xff\x76\x00\xff\xff\x7b\x00\xff\xff\x7f\x00" "\xff\xff\x83\x00\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00" "\xff\xff\x94\x00\xff\xff\x97\x00\xff\xff\x9b\x00\xff\xff\x9e\x00" "\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00" "\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0e\x00" "\x00\x00\x15\x00\x00\x00\x1c\x00\x00\x00\x23\x00\x00\x00\x29\x00" "\x89\x00\x2f\x00\xff\xac\x36\x00\xff\xff\x3c\x00\xff\xff\x42\x00" "\xff\xff\x47\x00\xff\xff\x4d\x00\xff\xff\x53\x00\xff\xff\x58\x00" "\xff\xff\x5e\x00\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00" "\xff\xff\x72\x00\xff\xff\x76\x00\xff\xff\x7b\x00\xff\xff\x7f\x00" "\xff\xff\x84\x00\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00" "\xff\xff\x94\x00\xff\xff\x97\x00\xff\xff\x9b\x00\xff\xff\x9e\x00" "\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00" "\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x0f\x00" "\x00\x00\x16\x00\x00\x00\x1c\x00\x00\x00\x23\x00\x00\x00\x29\x00" "\x96\x00\x30\x00\xff\xbe\x36\x00\xff\xff\x3c\x00\xff\xff\x42\x00" "\xff\xff\x48\x00\xff\xff\x4d\x00\xff\xff\x53\x00\xff\xff\x58\x00" "\xff\xff\x5e\x00\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00" "\xff\xff\x72\x00\xff\xff\x77\x00\xff\xff\x7b\x00\xff\xff\x80\x00" "\xff\xff\x84\x00\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00" "\xff\xff\x94\x00\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9f\x00" "\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00" "\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x0f\x00" "\x00\x00\x16\x00\x00\x00\x1d\x00\x00\x00\x23\x00\x00\x00\x2a\x00" "\xa2\x00\x30\x00\xff\xd0\x36\x00\xff\xff\x3c\x00\xff\xff\x42\x00" "\xff\xff\x48\x00\xff\xff\x4e\x00\xff\xff\x53\x00\xff\xff\x59\x00" "\xff\xff\x5e\x00\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00" "\xff\xff\x72\x00\xff\xff\x77\x00\xff\xff\x7b\x00\xff\xff\x80\x00" "\xff\xff\x84\x00\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00" "\xff\xff\x94\x00\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9f\x00" "\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00" "\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x0f\x00" "\x00\x00\x16\x00\x00\x00\x1d\x00\x00\x00\x23\x00\x00\x00\x2a\x00" "\xae\x00\x30\x00\xff\xe2\x36\x00\xff\xff\x3d\x00\xff\xff\x42\x00" "\xff\xff\x48\x00\xff\xff\x4e\x00\xff\xff\x54\x00\xff\xff\x59\x00" "\xff\xff\x5e\x00\xff\xff\x63\x00\xff\xff\x69\x00\xff\xff\x6d\x00" "\xff\xff\x72\x00\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x80\x00" "\xff\xff\x84\x00\xff\xff\x88\x00\xff\xff\x8d\x00\xff\xff\x90\x00" "\xff\xff\x94\x00\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00" "\xff\xff\xa2\x00\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00" "\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x09\x00\x00\x00\x10\x00" "\x00\x00\x17\x00\x00\x00\x1d\x00\x00\x00\x24\x00\x00\x00\x2a\x00" "\xbb\x00\x31\x00\xff\xf5\x37\x00\xff\xff\x3d\x00\xff\xff\x43\x00" "\xff\xff\x49\x00\xff\xff\x4e\x00\xff\xff\x54\x00\xff\xff\x59\x00" "\xff\xff\x5f\x00\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00" "\xff\xff\x73\x00\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x80\x00" "\xff\xff\x84\x00\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00" "\xff\xff\x94\x00\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00" "\xff\xff\xa2\x00\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00" "\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x10\x00" "\x00\x00\x17\x00\x00\x00\x1e\x00\x00\x00\x24\x00\x00\x00\x2b\x00" "\xc7\x08\x31\x00\xff\xff\x37\x00\xff\xff\x3d\x00\xff\xff\x43\x00" "\xff\xff\x49\x00\xff\xff\x4f\x00\xff\xff\x54\x00\xff\xff\x5a\x00" "\xff\xff\x5f\x00\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00" "\xff\xff\x73\x00\xff\xff\x78\x00\xff\xff\x7c\x00\xff\xff\x80\x00" "\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00" "\xff\xff\x95\x00\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00" "\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00" "\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x10\x00" "\x00\x00\x17\x00\x00\x00\x1e\x00\x00\x00\x24\x00\x00\x00\x2b\x00" "\xd4\x19\x31\x00\xff\xff\x37\x00\xff\xff\x3d\x00\xff\xff\x43\x00" "\xff\xff\x49\x00\xff\xff\x4f\x00\xff\xff\x54\x00\xff\xff\x5a\x00" "\xff\xff\x5f\x00\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00" "\xff\xff\x73\x00\xff\xff\x78\x00\xff\xff\x7c\x00\xff\xff\x81\x00" "\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00" "\xff\xff\x95\x00\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00" "\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00" "\xff\xff\xaf\x00\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00" "\x00\x00\x18\x00\x00\x00\x1e\x00\x00\x00\x25\x00\x00\x00\x2b\x00" "\xe0\x2b\x31\x00\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00" "\xff\xff\x49\x00\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00" "\xff\xff\x5f\x00\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00" "\xff\xff\x73\x00\xff\xff\x78\x00\xff\xff\x7c\x00\xff\xff\x81\x00" "\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00" "\xff\xff\x95\x00\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00" "\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00" "\xff\xff\xaf\x00\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00" "\x00\x00\x18\x00\x00\x00\x1f\x00\x00\x00\x25\x00\x00\x00\x2c\x00" "\xed\x3d\x32\x00\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00" "\xff\xff\x4a\x00\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00" "\xff\xff\x60\x00\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00" "\xff\xff\x73\x00\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00" "\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00" "\xff\xff\x95\x00\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00" "\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00" "\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb6\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x00\x00\x12\x00" "\x00\x00\x18\x00\x00\x00\x1f\x00\x00\x00\x26\x00\x00\x00\x2c\x00" "\xf9\x4b\x32\x00\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00" "\xff\xff\x4a\x00\xff\xff\x50\x00\xff\xff\x55\x00\xff\xff\x5b\x00" "\xff\xff\x60\x00\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00" "\xff\xff\x74\x00\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00" "\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00" "\xff\xff\x95\x00\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00" "\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00" "\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x00\x00\x12\x00" "\x00\x00\x18\x00\x00\x00\x1f\x00\x00\x00\x26\x00\x06\x00\x2c\x00" "\xff\x57\x32\x00\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00" "\xff\xff\x4a\x00\xff\xff\x50\x00\xff\xff\x55\x00\xff\xff\x5b\x00" "\xff\xff\x60\x00\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00" "\xff\xff\x74\x00\xff\xff\x79\x00\xff\xff\x7d\x00\xff\xff\x81\x00" "\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00" "\xff\xff\x96\x00\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00" "\xff\xff\xa3\x00\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00" "\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x00\x00\x12\x00" "\x00\x00\x19\x00\x00\x00\x1f\x00\x00\x00\x26\x00\x11\x00\x2c\x00" "\xff\x64\x33\x00\xff\xff\x39\x00\xff\xff\x3f\x00\xff\xff\x45\x00" "\xff\xff\x4b\x00\xff\xff\x50\x00\xff\xff\x56\x00\xff\xff\x5b\x00" "\xff\xff\x60\x00\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00" "\xff\xff\x74\x00\xff\xff\x79\x00\xff\xff\x7d\x00\xff\xff\x82\x00" "\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00" "\xff\xff\x96\x00\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00" "\xff\xff\xa3\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xac\x00" "\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x00\x00\x12\x00" "\x00\x00\x19\x00\x00\x00\x20\x00\x00\x00\x26\x00\x19\x00\x2d\x00" "\xff\x70\x33\x00\xff\xff\x39\x00\xff\xff\x3f\x00\xff\xff\x45\x00" "\xff\xff\x4b\x00\xff\xff\x50\x00\xff\xff\x56\x00\xff\xff\x5b\x00" "\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x70\x00" "\xff\xff\x74\x00\xff\xff\x79\x00\xff\xff\x7d\x00\xff\xff\x82\x00" "\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00" "\xff\xff\x96\x00\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00" "\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0c\x00\x00\x00\x12\x00" "\x00\x00\x19\x00\x00\x00\x20\x00\x00\x00\x26\x00\x21\x00\x2d\x00" "\xff\x7d\x33\x00\xff\xff\x39\x00\xff\xff\x3f\x00\xff\xff\x45\x00" "\xff\xff\x4b\x00\xff\xff\x51\x00\xff\xff\x56\x00\xff\xff\x5b\x00" "\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x70\x00" "\xff\xff\x74\x00\xff\xff\x79\x00\xff\xff\x7e\x00\xff\xff\x82\x00" "\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00" "\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa0\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00" "\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x0c\x00\x00\x00\x13\x00" "\x00\x00\x19\x00\x00\x00\x20\x00\x00\x00\x27\x00\x29\x00\x2d\x00" "\xff\x89\x33\x00\xff\xff\x39\x00\xff\xff\x3f\x00\xff\xff\x45\x00" "\xff\xff\x4b\x00\xff\xff\x51\x00\xff\xff\x56\x00\xff\xff\x5c\x00" "\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x70\x00" "\xff\xff\x75\x00\xff\xff\x79\x00\xff\xff\x7e\x00\xff\xff\x82\x00" "\xff\xff\x86\x00\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00" "\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa1\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00" "\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x0c\x00\x00\x00\x13\x00" "\x00\x00\x1a\x00\x00\x00\x20\x00\x00\x00\x27\x00\x30\x00\x2d\x00" "\xff\x96\x33\x00\xff\xff\x3a\x00\xff\xff\x40\x00\xff\xff\x45\x00" "\xff\xff\x4b\x00\xff\xff\x51\x00\xff\xff\x56\x00\xff\xff\x5c\x00" "\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x70\x00" "\xff\xff\x75\x00\xff\xff\x79\x00\xff\xff\x7e\x00\xff\xff\x82\x00" "\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x93\x00" "\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa1\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00" "\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x0c\x00\x00\x00\x13\x00" "\x00\x00\x1a\x00\x00\x00\x20\x00\x00\x00\x27\x00\x38\x00\x2d\x00" "\xff\xa2\x34\x00\xff\xff\x3a\x00\xff\xff\x40\x00\xff\xff\x46\x00" "\xff\xff\x4b\x00\xff\xff\x51\x00\xff\xff\x57\x00\xff\xff\x5c\x00" "\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x70\x00" "\xff\xff\x75\x00\xff\xff\x7a\x00\xff\xff\x7e\x00\xff\xff\x82\x00" "\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x93\x00" "\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9d\x00\xff\xff\xa1\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00" "\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x0c\x00\x00\x00\x13\x00" "\x00\x00\x1a\x00\x00\x00\x21\x00\x00\x00\x27\x00\x40\x00\x2e\x00" "\xff\xae\x34\x00\xff\xff\x3a\x00\xff\xff\x40\x00\xff\xff\x46\x00" "\xff\xff\x4c\x00\xff\xff\x51\x00\xff\xff\x57\x00\xff\xff\x5c\x00" "\xff\xff\x61\x00\xff\xff\x66\x00\xff\xff\x6b\x00\xff\xff\x70\x00" "\xff\xff\x75\x00\xff\xff\x7a\x00\xff\xff\x7e\x00\xff\xff\x82\x00" "\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x93\x00" "\xff\xff\x96\x00\xff\xff\x9a\x00\xff\xff\x9e\x00\xff\xff\xa1\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00" "\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xb9\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00\x00\x00\x13\x00" "\x00\x00\x1a\x00\x00\x00\x21\x00\x00\x00\x27\x00\x47\x00\x2e\x00" "\xff\xbb\x34\x00\xff\xff\x3a\x00\xff\xff\x40\x00\xff\xff\x46\x00" "\xff\xff\x4c\x00\xff\xff\x51\x00\xff\xff\x57\x00\xff\xff\x5c\x00" "\xff\xff\x61\x00\xff\xff\x67\x00\xff\xff\x6c\x00\xff\xff\x70\x00" "\xff\xff\x75\x00\xff\xff\x7a\x00\xff\xff\x7e\x00\xff\xff\x83\x00" "\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x93\x00" "\xff\xff\x97\x00\xff\xff\x9a\x00\xff\xff\x9e\x00\xff\xff\xa1\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00" "\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00\x00\x00\x14\x00" "\x00\x00\x1a\x00\x00\x00\x21\x00\x00\x00\x28\x00\x4f\x00\x2e\x00" "\xff\xc7\x34\x00\xff\xff\x3a\x00\xff\xff\x40\x00\xff\xff\x46\x00" "\xff\xff\x4c\x00\xff\xff\x52\x00\xff\xff\x57\x00\xff\xff\x5c\x00" "\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00\xff\xff\x71\x00" "\xff\xff\x75\x00\xff\xff\x7a\x00\xff\xff\x7e\x00\xff\xff\x83\x00" "\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x93\x00" "\xff\xff\x97\x00\xff\xff\x9a\x00\xff\xff\x9e\x00\xff\xff\xa1\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00" "\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00\x00\x00\x14\x00" "\x00\x00\x1b\x00\x00\x00\x21\x00\x00\x00\x28\x00\x57\x00\x2e\x00" "\xff\xd4\x34\x00\xff\xff\x3a\x00\xff\xff\x40\x00\xff\xff\x46\x00" "\xff\xff\x4c\x00\xff\xff\x52\x00\xff\xff\x57\x00\xff\xff\x5d\x00" "\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00\xff\xff\x71\x00" "\xff\xff\x75\x00\xff\xff\x7a\x00\xff\xff\x7f\x00\xff\xff\x83\x00" "\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x93\x00" "\xff\xff\x97\x00\xff\xff\x9a\x00\xff\xff\x9e\x00\xff\xff\xa1\x00" "\xff\xff\xa4\x00\xff\xff\xa7\x00\xff\xff\xaa\x00\xff\xff\xad\x00" "\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00\x00\x00\x14\x00" "\x00\x00\x1b\x00\x00\x00\x21\x00\x00\x00\x28\x00\x5f\x00\x2e\x00" "\xff\xe0\x35\x00\xff\xff\x3b\x00\xff\xff\x41\x00\xff\xff\x47\x00" "\xff\xff\x4c\x00\xff\xff\x52\x00\xff\xff\x57\x00\xff\xff\x5d\x00" "\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00\xff\xff\x71\x00" "\xff\xff\x76\x00\xff\xff\x7a\x00\xff\xff\x7f\x00\xff\xff\x83\x00" "\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x93\x00" "\xff\xff\x97\x00\xff\xff\x9a\x00\xff\xff\x9e\x00\xff\xff\xa1\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xad\x00" "\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0d\x00\x00\x00\x14\x00" "\x00\x00\x1b\x00\x00\x00\x22\x00\x00\x00\x28\x00\x66\x00\x2e\x00" "\xff\xed\x35\x00\xff\xff\x3b\x00\xff\xff\x41\x00\xff\xff\x47\x00" "\xff\xff\x4c\x00\xff\xff\x52\x00\xff\xff\x58\x00\xff\xff\x5d\x00" "\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00\xff\xff\x71\x00" "\xff\xff\x76\x00\xff\xff\x7a\x00\xff\xff\x7f\x00\xff\xff\x83\x00" "\xff\xff\x87\x00\xff\xff\x8b\x00\xff\xff\x8f\x00\xff\xff\x93\x00" "\xff\xff\x97\x00\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa1\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0e\x00\x00\x00\x14\x00" "\x00\x00\x1b\x00\x00\x00\x22\x00\x00\x00\x28\x00\x6e\x00\x2f\x00" "\xff\xf9\x35\x00\xff\xff\x3b\x00\xff\xff\x41\x00\xff\xff\x47\x00" "\xff\xff\x4d\x00\xff\xff\x52\x00\xff\xff\x58\x00\xff\xff\x5d\x00" "\xff\xff\x62\x00\xff\xff\x67\x00\xff\xff\x6c\x00\xff\xff\x71\x00" "\xff\xff\x76\x00\xff\xff\x7a\x00\xff\xff\x7f\x00\xff\xff\x83\x00" "\xff\xff\x87\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x93\x00" "\xff\xff\x97\x00\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa1\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0e\x00\x00\x00\x15\x00" "\x00\x00\x1b\x00\x00\x00\x22\x00\x00\x00\x29\x00\x76\x06\x2f\x00" "\xff\xff\x35\x00\xff\xff\x3b\x00\xff\xff\x41\x00\xff\xff\x47\x00" "\xff\xff\x4d\x00\xff\xff\x52\x00\xff\xff\x58\x00\xff\xff\x5d\x00" "\xff\xff\x62\x00\xff\xff\x68\x00\xff\xff\x6c\x00\xff\xff\x71\x00" "\xff\xff\x76\x00\xff\xff\x7b\x00\xff\xff\x7f\x00\xff\xff\x83\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x93\x00" "\xff\xff\x97\x00\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0e\x00\x00\x00\x15\x00" "\x00\x00\x1c\x00\x00\x00\x22\x00\x00\x00\x29\x00\x7d\x11\x2f\x00" "\xff\xff\x35\x00\xff\xff\x3b\x00\xff\xff\x41\x00\xff\xff\x47\x00" "\xff\xff\x4d\x00\xff\xff\x53\x00\xff\xff\x58\x00\xff\xff\x5d\x00" "\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x71\x00" "\xff\xff\x76\x00\xff\xff\x7b\x00\xff\xff\x7f\x00\xff\xff\x84\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00" "\xff\xff\x97\x00\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0e\x00\x00\x00\x15\x00" "\x00\x00\x1c\x00\x00\x00\x22\x00\x00\x00\x29\x00\x85\x19\x2f\x00" "\xff\xff\x35\x00\xff\xff\x3c\x00\xff\xff\x42\x00\xff\xff\x47\x00" "\xff\xff\x4d\x00\xff\xff\x53\x00\xff\xff\x58\x00\xff\xff\x5e\x00" "\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x72\x00" "\xff\xff\x76\x00\xff\xff\x7b\x00\xff\xff\x7f\x00\xff\xff\x84\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00" "\xff\xff\x97\x00\xff\xff\x9b\x00\xff\xff\x9e\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0e\x00\x00\x00\x15\x00" "\x00\x00\x1c\x00\x00\x00\x23\x00\x00\x00\x29\x00\x8d\x21\x2f\x00" "\xff\xff\x36\x00\xff\xff\x3c\x00\xff\xff\x42\x00\xff\xff\x48\x00" "\xff\xff\x4d\x00\xff\xff\x53\x00\xff\xff\x58\x00\xff\xff\x5e\x00" "\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x72\x00" "\xff\xff\x76\x00\xff\xff\x7b\x00\xff\xff\x7f\x00\xff\xff\x84\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00" "\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9f\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x0f\x00\x00\x00\x15\x00" "\x00\x00\x1c\x00\x00\x00\x23\x00\x00\x00\x29\x00\x94\x29\x30\x00" "\xff\xff\x36\x00\xff\xff\x3c\x00\xff\xff\x42\x00\xff\xff\x48\x00" "\xff\xff\x4d\x00\xff\xff\x53\x00\xff\xff\x58\x00\xff\xff\x5e\x00" "\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x72\x00" "\xff\xff\x77\x00\xff\xff\x7b\x00\xff\xff\x80\x00\xff\xff\x84\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00" "\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9f\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x0f\x00\x00\x00\x16\x00" "\x00\x00\x1c\x00\x00\x00\x23\x00\x00\x00\x29\x00\x9b\x30\x30\x00" "\xff\xff\x36\x00\xff\xff\x3c\x00\xff\xff\x42\x00\xff\xff\x48\x00" "\xff\xff\x4e\x00\xff\xff\x53\x00\xff\xff\x59\x00\xff\xff\x5e\x00" "\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x72\x00" "\xff\xff\x77\x00\xff\xff\x7b\x00\xff\xff\x80\x00\xff\xff\x84\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00" "\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9f\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x0f\x00\x00\x00\x16\x00" "\x00\x00\x1d\x00\x00\x00\x23\x00\x00\x00\x2a\x00\x9f\x38\x30\x00" "\xff\xff\x36\x00\xff\xff\x3c\x00\xff\xff\x42\x00\xff\xff\x48\x00" "\xff\xff\x4e\x00\xff\xff\x53\x00\xff\xff\x59\x00\xff\xff\x5e\x00" "\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x72\x00" "\xff\xff\x77\x00\xff\xff\x7b\x00\xff\xff\x80\x00\xff\xff\x84\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00" "\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9f\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x0f\x00\x00\x00\x16\x00" "\x00\x00\x1d\x00\x00\x00\x23\x00\x00\x00\x2a\x00\xa3\x40\x30\x00" "\xff\xff\x36\x00\xff\xff\x3c\x00\xff\xff\x42\x00\xff\xff\x48\x00" "\xff\xff\x4e\x00\xff\xff\x53\x00\xff\xff\x59\x00\xff\xff\x5e\x00" "\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x72\x00" "\xff\xff\x77\x00\xff\xff\x7b\x00\xff\xff\x80\x00\xff\xff\x84\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00" "\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9f\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x0f\x00\x00\x00\x16\x00" "\x00\x00\x1d\x00\x00\x00\x23\x00\x00\x00\x2a\x00\xa7\x47\x30\x00" "\xff\xff\x36\x00\xff\xff\x3c\x00\xff\xff\x42\x00\xff\xff\x48\x00" "\xff\xff\x4e\x00\xff\xff\x53\x00\xff\xff\x59\x00\xff\xff\x5e\x00" "\xff\xff\x63\x00\xff\xff\x68\x00\xff\xff\x6d\x00\xff\xff\x72\x00" "\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x84\x00" "\xff\xff\x88\x00\xff\xff\x8d\x00\xff\xff\x90\x00\xff\xff\x94\x00" "\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x0f\x00\x00\x00\x16\x00" "\x00\x00\x1d\x00\x00\x00\x23\x00\x00\x00\x2a\x00\xac\x4f\x30\x00" "\xff\xff\x36\x00\xff\xff\x3c\x00\xff\xff\x42\x00\xff\xff\x48\x00" "\xff\xff\x4e\x00\xff\xff\x54\x00\xff\xff\x59\x00\xff\xff\x5e\x00" "\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x72\x00" "\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x84\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x94\x00" "\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa9\x00\xff\xff\xab\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x0f\x00\x00\x00\x16\x00" "\x00\x00\x1d\x00\x00\x00\x24\x00\x00\x00\x2a\x00\xb0\x57\x30\x00" "\xff\xff\x37\x00\xff\xff\x3d\x00\xff\xff\x43\x00\xff\xff\x48\x00" "\xff\xff\x4e\x00\xff\xff\x54\x00\xff\xff\x59\x00\xff\xff\x5e\x00" "\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x72\x00" "\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x84\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x94\x00" "\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa2\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x09\x00\x00\x00\x10\x00\x00\x00\x16\x00" "\x00\x00\x1d\x00\x00\x00\x24\x00\x00\x00\x2a\x00\xb4\x5f\x30\x00" "\xff\xff\x37\x00\xff\xff\x3d\x00\xff\xff\x43\x00\xff\xff\x48\x00" "\xff\xff\x4e\x00\xff\xff\x54\x00\xff\xff\x59\x00\xff\xff\x5e\x00" "\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x72\x00" "\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x84\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x94\x00" "\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa2\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x09\x00\x00\x00\x10\x00\x00\x00\x16\x00" "\x00\x00\x1d\x00\x00\x00\x24\x00\x00\x00\x2a\x00\xb8\x66\x31\x00" "\xff\xff\x37\x00\xff\xff\x3d\x00\xff\xff\x43\x00\xff\xff\x49\x00" "\xff\xff\x4e\x00\xff\xff\x54\x00\xff\xff\x59\x00\xff\xff\x5f\x00" "\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x73\x00" "\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa2\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x09\x00\x00\x00\x10\x00\x00\x00\x17\x00" "\x00\x00\x1d\x00\x00\x00\x24\x00\x00\x00\x2a\x00\xbd\x6e\x31\x00" "\xff\xff\x37\x00\xff\xff\x3d\x00\xff\xff\x43\x00\xff\xff\x49\x00" "\xff\xff\x4e\x00\xff\xff\x54\x00\xff\xff\x59\x00\xff\xff\x5f\x00" "\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x73\x00" "\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xae\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x10\x00\x00\x00\x17\x00" "\x00\x00\x1d\x00\x00\x00\x24\x00\x00\x00\x2a\x00\xc1\x76\x31\x00" "\xff\xff\x37\x00\xff\xff\x3d\x00\xff\xff\x43\x00\xff\xff\x49\x00" "\xff\xff\x4e\x00\xff\xff\x54\x00\xff\xff\x59\x00\xff\xff\x5f\x00" "\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x73\x00" "\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x10\x00\x00\x00\x17\x00" "\x00\x00\x1d\x00\x00\x00\x24\x00\x00\x00\x2b\x00\xc5\x7d\x31\x00" "\xff\xff\x37\x00\xff\xff\x3d\x00\xff\xff\x43\x00\xff\xff\x49\x00" "\xff\xff\x4f\x00\xff\xff\x54\x00\xff\xff\x5a\x00\xff\xff\x5f\x00" "\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x73\x00" "\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x80\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x10\x00\x00\x00\x17\x00" "\x00\x00\x1e\x00\x00\x00\x24\x00\x00\x00\x2b\x00\xca\x85\x31\x00" "\xff\xff\x37\x00\xff\xff\x3d\x00\xff\xff\x43\x00\xff\xff\x49\x00" "\xff\xff\x4f\x00\xff\xff\x54\x00\xff\xff\x5a\x00\xff\xff\x5f\x00" "\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x73\x00" "\xff\xff\x78\x00\xff\xff\x7c\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x98\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x10\x00\x00\x00\x17\x00" "\x00\x00\x1e\x00\x00\x00\x24\x00\x00\x00\x2b\x00\xce\x8d\x31\x00" "\xff\xff\x37\x00\xff\xff\x3d\x00\xff\xff\x43\x00\xff\xff\x49\x00" "\xff\xff\x4f\x00\xff\xff\x54\x00\xff\xff\x5a\x00\xff\xff\x5f\x00" "\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x73\x00" "\xff\xff\x78\x00\xff\xff\x7c\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x10\x00\x00\x00\x17\x00" "\x00\x00\x1e\x00\x00\x00\x24\x00\x00\x00\x2b\x00\xd2\x94\x31\x00" "\xff\xff\x37\x00\xff\xff\x3d\x00\xff\xff\x43\x00\xff\xff\x49\x00" "\xff\xff\x4f\x00\xff\xff\x54\x00\xff\xff\x5a\x00\xff\xff\x5f\x00" "\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x73\x00" "\xff\xff\x78\x00\xff\xff\x7c\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x10\x00\x00\x00\x17\x00" "\x00\x00\x1e\x00\x00\x00\x24\x00\x00\x00\x2b\x00\xd6\x9b\x31\x00" "\xff\xff\x37\x00\xff\xff\x3d\x00\xff\xff\x43\x00\xff\xff\x49\x00" "\xff\xff\x4f\x00\xff\xff\x54\x00\xff\xff\x5a\x00\xff\xff\x5f\x00" "\xff\xff\x64\x00\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x73\x00" "\xff\xff\x78\x00\xff\xff\x7c\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x17\x00" "\x00\x00\x1e\x00\x00\x00\x25\x00\x00\x00\x2b\x00\xdb\x9f\x31\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x49\x00" "\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x5f\x00" "\xff\xff\x64\x00\xff\xff\x6a\x00\xff\xff\x6e\x00\xff\xff\x73\x00" "\xff\xff\x78\x00\xff\xff\x7c\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x17\x00" "\x00\x00\x1e\x00\x00\x00\x25\x00\x00\x00\x2b\x00\xdf\xa3\x31\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x49\x00" "\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x5f\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6e\x00\xff\xff\x73\x00" "\xff\xff\x78\x00\xff\xff\x7c\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb1\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1e\x00\x00\x00\x25\x00\x00\x00\x2b\x00\xe3\xa7\x32\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x5f\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x73\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1e\x00\x00\x00\x25\x00\x00\x00\x2b\x00\xe7\xac\x32\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x73\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8e\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1e\x00\x00\x00\x25\x00\x00\x00\x2b\x00\xea\xb0\x32\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x73\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1e\x00\x00\x00\x25\x00\x00\x00\x2b\x00\xeb\xb4\x32\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1f\x00\x00\x00\x25\x00\x00\x00\x2b\x00\xec\xb8\x32\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1f\x00\x00\x00\x25\x00\x00\x00\x2c\x00\xed\xbd\x32\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1f\x00\x00\x00\x25\x00\x00\x00\x2c\x00\xef\xc1\x32\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1f\x00\x00\x00\x25\x00\x00\x00\x2c\x00\xf0\xc5\x32\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1f\x00\x00\x00\x25\x00\x00\x00\x2c\x00\xf1\xca\x32\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x4f\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1f\x00\x00\x00\x25\x00\x00\x00\x2c\x00\xf2\xce\x32\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x50\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x86\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1f\x00\x00\x00\x25\x00\x00\x00\x2c\x00\xf3\xd2\x32\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x50\x00\xff\xff\x55\x00\xff\xff\x5a\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x86\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1f\x00\x00\x00\x25\x00\x00\x00\x2c\x00\xf5\xd6\x32\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x50\x00\xff\xff\x55\x00\xff\xff\x5b\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x86\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x0b\x00\x00\x00\x12\x00\x00\x00\x18\x00" "\x00\x00\x1f\x00\x00\x00\x26\x00\x00\x00\x2c\x00\xf6\xdb\x32\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x50\x00\xff\xff\x55\x00\xff\xff\x5b\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x86\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x18\x00" "\x00\x00\x1f\x00\x00\x00\x25\x00\x00\x00\x2c\x00\xf7\xdf\x32\x00" "\xff\xff\x38\x00\xff\xff\x3e\x00\xff\xff\x44\x00\xff\xff\x4a\x00" "\xff\xff\x50\x00\xff\xff\x55\x00\xff\xff\x5b\x00\xff\xff\x60\x00" "\xff\xff\x65\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7d\x00\xff\xff\x81\x00\xff\xff\x86\x00" "\xff\xff\x8a\x00\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x95\x00" "\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00\xff\xff\xa3\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xaf\x00" "\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" // Mipmap level 1. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x04\x00\x00\x00\x18\x00\x00\x00\x26\x00\x00\x00" "\x30\x00\x00\x00\x3a\x00\x00\x00\x44\x00\x00\x00\x4e\x00\x00\x00" "\x58\x00\x00\x00\x62\x00\x00\x00\x6c\x00\x01\x00\x76\x00\x01\x00" "\x80\x00\x02\x00\x8a\x00\x03\x00\x94\x00\x03\x00\x9e\x00\x04\x00" "\xa8\x00\x04\x00\xb2\x00\x04\x00\xbc\x00\x05\x00\xc6\x00\x05\x00" "\xce\x00\x05\x00\xd1\x00\x05\x00\xd3\x00\x05\x00\xd6\x00\x05\x00" "\xd9\x00\x06\x00\xdb\x00\x06\x00\xde\x00\x06\x00\xe1\x00\x06\x00" "\xe3\x00\x06\x00\xe6\x00\x06\x00\xe9\x00\x06\x00\xec\x00\x07\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x04\x00\x00\x00\x18\x00\x00\x00\x2e\x00\x00\x00" "\x43\x00\x01\x00\x58\x00\x02\x00\x6d\x00\x03\x00\x83\x00\x04\x00" "\x98\x00\x05\x00\xad\x00\x07\x00\xc3\x00\x08\x00\xd8\x00\x09\x00" "\xed\x00\x09\x00\xff\x00\x0a\x00\xff\x00\x0b\x00\xff\x00\x0b\x00" "\xff\x00\x0c\x00\xff\x00\x0c\x00\xff\x00\x0d\x00\xff\x00\x0d\x00" "\xff\x00\x0e\x00\xff\x00\x0e\x00\xff\x00\x0f\x00\xff\x00\x0f\x00" "\xff\x00\x10\x00\xff\x00\x11\x00\xff\x00\x11\x00\xff\x00\x12\x00" "\xff\x00\x12\x00\xff\x00\x12\x00\xff\x00\x13\x00\xff\x00\x13\x00" "\xff\x00\x13\x00\xff\x00\x13\x00\xff\x00\x13\x00\xff\x00\x13\x00" "\xff\x00\x13\x00\xff\x00\x14\x00\xff\x00\x14\x00\xff\x00\x14\x00" "\xff\x00\x14\x00\xff\x00\x14\x00\xff\x00\x14\x00\xff\x00\x14\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x11\x00\x00\x00\x32\x00\x02\x00\x53\x00\x04\x00" "\x73\x00\x05\x00\x94\x00\x07\x00\xb5\x00\x08\x00\xd5\x00\x09\x00" "\xee\x00\x0a\x00\xff\x00\x0b\x00\xff\x00\x0d\x00\xff\x00\x0e\x00" "\xff\x00\x0f\x00\xff\x00\x10\x00\xff\x00\x11\x00\xff\x00\x12\x00" "\xff\x00\x13\x00\xff\x00\x15\x00\xff\x00\x16\x00\xff\x00\x17\x00" "\xff\x00\x17\x00\xff\x00\x18\x00\xff\x00\x18\x00\xff\x00\x19\x00" "\xff\x00\x19\x00\xff\x00\x1a\x00\xff\x00\x1a\x00\xff\x00\x1b\x00" "\xff\x00\x1b\x00\xff\x00\x1c\x00\xff\x00\x1c\x00\xff\x00\x1d\x00" "\xff\x00\x1e\x00\xff\x00\x1e\x00\xff\x00\x1f\x00\xff\x00\x1f\x00" "\xff\x00\x20\x00\xff\x00\x20\x00\xff\x00\x20\x00\xff\x00\x20\x00" "\xff\x00\x20\x00\xff\x00\x20\x00\xff\x00\x21\x00\xff\x00\x21\x00" "\xff\x00\x21\x00\xff\x00\x21\x00\xff\x00\x21\x00\xff\x00\x21\x00" "\xff\x00\x21\x00\xff\x00\x22\x00\xff\x00\x22\x00\xff\x00\x22\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x18\x00\x02\x00" "\x43\x00\x05\x00\x6d\x00\x07\x00\x98\x00\x09\x00\xc2\x00\x0b\x00" "\xec\x00\x0d\x00\xff\x00\x0e\x00\xff\x00\x10\x00\xff\x00\x12\x00" "\xff\x00\x13\x00\xff\x00\x15\x00\xff\x00\x16\x00\xff\x00\x17\x00" "\xff\x00\x18\x00\xff\x00\x19\x00\xff\x00\x1a\x00\xff\x00\x1b\x00" "\xff\x00\x1c\x00\xff\x00\x1e\x00\xff\x00\x1f\x00\xff\x00\x20\x00" "\xff\x00\x21\x00\xff\x00\x22\x00\xff\x00\x23\x00\xff\x00\x24\x00" "\xff\x00\x24\x00\xff\x00\x25\x00\xff\x00\x26\x00\xff\x00\x26\x00" "\xff\x00\x27\x00\xff\x00\x27\x00\xff\x00\x28\x00\xff\x00\x28\x00" "\xff\x00\x29\x00\xff\x00\x29\x00\xff\x00\x2a\x00\xff\x00\x2a\x00" "\xff\x00\x2b\x00\xff\x00\x2b\x00\xff\x00\x2c\x00\xff\x00\x2c\x00" "\xff\x00\x2d\x00\xff\x00\x2d\x00\xff\x00\x2d\x00\xff\x00\x2d\x00" "\xff\x00\x2d\x00\xff\x00\x2d\x00\xff\x00\x2d\x00\xff\x00\x2e\x00" "\xff\x00\x2e\x00\xff\x00\x2e\x00\xff\x00\x2e\x00\xff\x00\x2e\x00" "\xff\x00\x2e\x00\xff\x00\x2e\x00\xff\x00\x2e\x00\xff\x00\x2f\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x02\x00\x17\x00\x04\x00\x4d\x00\x07\x00" "\x83\x00\x0a\x00\xb9\x00\x0c\x00\xed\x00\x0e\x00\xff\x00\x11\x00" "\xff\x00\x13\x00\xff\x00\x15\x00\xff\x00\x17\x00\xff\x00\x18\x00" "\xff\x00\x1a\x00\xff\x00\x1c\x00\xff\x00\x1e\x00\xff\x00\x1f\x00" "\xff\x00\x21\x00\xff\x00\x22\x00\xff\x00\x23\x00\xff\x00\x24\x00" "\xff\x00\x25\x00\xff\x00\x26\x00\xff\x00\x27\x00\xff\x00\x28\x00" "\xff\x00\x29\x00\xff\x00\x2b\x00\xff\x00\x2c\x00\xff\x00\x2d\x00" "\xff\x00\x2e\x00\xff\x00\x2f\x00\xff\x00\x30\x00\xff\x00\x31\x00" "\xff\x00\x31\x00\xff\x00\x32\x00\xff\x00\x32\x00\xff\x00\x33\x00" "\xff\x00\x33\x00\xff\x00\x34\x00\xff\x00\x34\x00\xff\x00\x35\x00" "\xff\x00\x35\x00\xff\x00\x36\x00\xff\x00\x36\x00\xff\x00\x37\x00" "\xff\x00\x37\x00\xff\x00\x38\x00\xff\x00\x38\x00\xff\x00\x38\x00" "\xff\x00\x39\x00\xff\x00\x39\x00\xff\x00\x39\x00\xff\x00\x39\x00" "\xff\x00\x3a\x00\xff\x00\x3a\x00\xff\x00\x3a\x00\xff\x00\x3a\x00" "\xff\x00\x3a\x00\xff\x00\x3a\x00\xff\x00\x3a\x00\xff\x00\x3a\x00" "\xff\x00\x3b\x00\xff\x00\x3b\x00\xff\x00\x3b\x00\xff\x00\x3b\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x01\x00\x04\x00\x25\x00\x07\x00\x69\x00\x0a\x00" "\xaa\x00\x0d\x00\xe1\x00\x10\x00\xff\x00\x13\x00\xff\x00\x15\x00" "\xff\x00\x17\x00\xff\x00\x1a\x00\xff\x00\x1c\x00\xff\x00\x1e\x00" "\xff\x00\x20\x00\xff\x00\x22\x00\xff\x00\x24\x00\xff\x00\x26\x00" "\xff\x00\x27\x00\xff\x00\x29\x00\xff\x00\x2b\x00\xff\x00\x2c\x00" "\xff\x00\x2e\x00\xff\x00\x2f\x00\xff\x00\x30\x00\xff\x00\x31\x00" "\xff\x00\x32\x00\xff\x00\x33\x00\xff\x00\x34\x00\xff\x00\x35\x00" "\xff\x00\x36\x00\xff\x00\x37\x00\xff\x00\x38\x00\xff\x00\x39\x00" "\xff\x00\x3a\x00\xff\x00\x3b\x00\xff\x00\x3c\x00\xff\x00\x3d\x00" "\xff\x00\x3d\x00\xff\x00\x3e\x00\xff\x00\x3e\x00\xff\x00\x3f\x00" "\xff\x00\x3f\x00\xff\x00\x40\x00\xff\x00\x40\x00\xff\x00\x41\x00" "\xff\x00\x41\x00\xff\x00\x42\x00\xff\x00\x42\x00\xff\x00\x43\x00" "\xff\x00\x43\x00\xff\x00\x44\x00\xff\x00\x44\x00\xff\x00\x44\x00" "\xff\x00\x45\x00\xff\x00\x45\x00\xff\x00\x45\x00\xff\x00\x45\x00" "\xff\x00\x45\x00\xff\x00\x46\x00\xff\x00\x46\x00\xff\x00\x46\x00" "\xff\x00\x46\x00\xff\x00\x46\x00\xff\x00\x46\x00\xff\x00\x46\x00" "\xff\x00\x46\x00\xff\x00\x47\x00\xff\x00\x47\x00\xff\x00\x47\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x03\x00\x15\x00\x07\x00\x58\x00\x0b\x00" "\x9d\x00\x0f\x00\xe1\x00\x12\x00\xff\x00\x15\x00\xff\x00\x18\x00" "\xff\x00\x1a\x00\xff\x00\x1d\x00\xff\x00\x20\x00\xff\x00\x23\x00" "\xff\x00\x24\x00\xff\x00\x27\x00\xff\x00\x29\x00\xff\x00\x2b\x00" "\xff\x00\x2d\x00\xff\x00\x2f\x00\xff\x00\x30\x00\xff\x00\x32\x00" "\xff\x00\x34\x00\xff\x00\x36\x00\xff\x00\x37\x00\xff\x00\x39\x00" "\xff\x00\x3a\x00\xff\x00\x3b\x00\xff\x00\x3c\x00\xff\x00\x3d\x00" "\xff\x00\x3e\x00\xff\x00\x3f\x00\xff\x00\x40\x00\xff\x00\x41\x00" "\xff\x00\x42\x00\xff\x00\x43\x00\xff\x00\x44\x00\xff\x00\x45\x00" "\xff\x00\x46\x00\xff\x00\x47\x00\xff\x00\x48\x00\xff\x00\x49\x00" "\xff\x00\x49\x00\xff\x00\x4a\x00\xff\x00\x4a\x00\xff\x00\x4b\x00" "\xff\x00\x4b\x00\xff\x00\x4b\x00\xff\x00\x4c\x00\xff\x00\x4c\x00" "\xff\x00\x4d\x00\xff\x00\x4d\x00\xff\x00\x4e\x00\xff\x00\x4e\x00" "\xff\x00\x4f\x00\xff\x00\x4f\x00\xff\x00\x4f\x00\xff\x00\x50\x00" "\xff\x00\x50\x00\xff\x00\x50\x00\xff\x00\x51\x00\xff\x00\x51\x00" "\xff\x00\x51\x00\xff\x00\x51\x00\xff\x00\x51\x00\xff\x00\x51\x00" "\xff\x00\x51\x00\xff\x00\x51\x00\xff\x00\x52\x00\xff\x00\x52\x00" "\xff\x00\x52\x00\xff\x00\x52\x00\xff\x00\x52\x00\xff\x00\x52\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x06\x00\x17\x00\x0a\x00" "\x69\x00\x0e\x00\xbe\x00\x12\x00\xfd\x00\x15\x00\xff\x00\x19\x00" "\xff\x00\x1c\x00\xff\x00\x1f\x00\xff\x00\x22\x00\xff\x00\x25\x00" "\xff\x00\x27\x00\xff\x00\x2a\x00\xff\x00\x2c\x00\xff\x00\x2f\x00" "\xff\x00\x31\x00\xff\x00\x33\x00\xff\x00\x35\x00\xff\x00\x37\x00" "\xff\x00\x39\x00\xff\x00\x3b\x00\xff\x00\x3d\x00\xff\x00\x3f\x00" "\xff\x00\x40\x00\xff\x00\x41\x00\xff\x00\x43\x00\xff\x00\x44\x00" "\xff\x00\x46\x00\xff\x00\x47\x00\xff\x00\x48\x00\xff\x00\x49\x00" "\xff\x00\x4a\x00\xff\x00\x4b\x00\xff\x00\x4c\x00\xff\x00\x4d\x00" "\xff\x00\x4e\x00\xff\x00\x4f\x00\xff\x00\x4f\x00\xff\x00\x50\x00" "\xff\x00\x51\x00\xff\x00\x52\x00\xff\x00\x53\x00\xff\x00\x54\x00" "\xff\x00\x54\x00\xff\x04\x55\x00\xff\x18\x55\x00\xff\x26\x56\x00" "\xff\x30\x56\x00\xff\x3a\x57\x00\xff\x44\x57\x00\xff\x4e\x57\x00" "\xff\x58\x58\x00\xff\x62\x58\x00\xff\x6c\x59\x00\xff\x76\x59\x00" "\xff\x80\x5a\x00\xff\x8a\x5a\x00\xff\x94\x5a\x00\xff\x9e\x5b\x00" "\xff\xa8\x5b\x00\xff\xb2\x5b\x00\xff\xbc\x5c\x00\xff\xc6\x5c\x00" "\xff\xce\x5c\x00\xff\xd1\x5c\x00\xff\xd3\x5c\x00\xff\xd6\x5c\x00" "\xff\xd9\x5c\x00\xff\xdb\x5c\x00\xff\xde\x5c\x00\xff\xe1\x5d\x00" "\xff\xe3\x5d\x00\xff\xe6\x5d\x00\xff\xe9\x5d\x00\xff\xec\x5d\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x06\x00" "\x0f\x00\x0b\x00\x69\x00\x0f\x00\xbf\x00\x14\x00\xfd\x00\x18\x00" "\xff\x00\x1b\x00\xff\x00\x1f\x00\xff\x00\x22\x00\xff\x00\x26\x00" "\xff\x00\x28\x00\xff\x00\x2c\x00\xff\x00\x2e\x00\xff\x00\x31\x00" "\xff\x00\x33\x00\xff\x00\x36\x00\xff\x00\x38\x00\xff\x00\x3b\x00" "\xff\x00\x3d\x00\xff\x00\x40\x00\xff\x00\x41\x00\xff\x00\x43\x00" "\xff\x00\x45\x00\xff\x00\x47\x00\xff\x00\x48\x00\xff\x00\x4a\x00" "\xff\x00\x4b\x00\xff\x00\x4d\x00\xff\x00\x4e\x00\xff\x00\x50\x00" "\xff\x00\x51\x00\xff\x00\x52\x00\xff\x00\x53\x00\xff\x00\x54\x00" "\xff\x00\x55\x00\xff\x04\x56\x00\xff\x18\x57\x00\xff\x2e\x58\x00" "\xff\x43\x59\x00\xff\x58\x59\x00\xff\x6d\x5a\x00\xff\x83\x5b\x00" "\xff\x98\x5c\x00\xff\xad\x5d\x00\xff\xc3\x5e\x00\xff\xd8\x5f\x00" "\xff\xed\x5f\x00\xff\xff\x60\x00\xff\xff\x60\x00\xff\xff\x60\x00" "\xff\xff\x61\x00\xff\xff\x61\x00\xff\xff\x62\x00\xff\xff\x62\x00" "\xff\xff\x62\x00\xff\xff\x63\x00\xff\xff\x63\x00\xff\xff\x64\x00" "\xff\xff\x64\x00\xff\xff\x64\x00\xff\xff\x65\x00\xff\xff\x65\x00" "\xff\xff\x66\x00\xff\xff\x66\x00\xff\xff\x66\x00\xff\xff\x66\x00" "\xff\xff\x66\x00\xff\xff\x66\x00\xff\xff\x66\x00\xff\xff\x66\x00" "\xff\xff\x67\x00\xff\xff\x67\x00\xff\xff\x67\x00\xff\xff\x67\x00" "\xff\xff\x67\x00\xff\xff\x67\x00\xff\xff\x67\x00\xff\xff\x67\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x0a\x00\x32\x00\x0f\x00\x9b\x00\x14\x00" "\xf5\x00\x18\x00\xff\x00\x1c\x00\xff\x00\x20\x00\xff\x00\x24\x00" "\xff\x00\x27\x00\xff\x00\x2b\x00\xff\x00\x2e\x00\xff\x00\x31\x00" "\xff\x00\x34\x00\xff\x00\x39\x00\xff\x00\x3a\x00\xff\x00\x3d\x00" "\xff\x00\x3f\x00\xff\x00\x42\x00\xff\x00\x44\x00\xff\x00\x46\x00" "\xff\x00\x48\x00\xff\x00\x4b\x00\xff\x00\x4c\x00\xff\x00\x4e\x00" "\xff\x00\x50\x00\xff\x00\x52\x00\xff\x00\x53\x00\xff\x00\x55\x00" "\xff\x00\x56\x00\xff\x11\x58\x00\xff\x32\x59\x00\xff\x53\x5a\x00" "\xff\x73\x5c\x00\xff\x94\x5d\x00\xff\xb5\x5e\x00\xff\xd5\x5f\x00" "\xff\xee\x60\x00\xff\xff\x60\x00\xff\xff\x61\x00\xff\xff\x62\x00" "\xff\xff\x63\x00\xff\xff\x64\x00\xff\xff\x65\x00\xff\xff\x66\x00" "\xff\xff\x66\x00\xff\xff\x67\x00\xff\xff\x68\x00\xff\xff\x69\x00" "\xff\xff\x69\x00\xff\xff\x6a\x00\xff\xff\x6a\x00\xff\xff\x6b\x00" "\xff\xff\x6b\x00\xff\xff\x6b\x00\xff\xff\x6c\x00\xff\xff\x6c\x00" "\xff\xff\x6c\x00\xff\xff\x6d\x00\xff\xff\x6d\x00\xff\xff\x6e\x00" "\xff\xff\x6e\x00\xff\xff\x6e\x00\xff\xff\x6f\x00\xff\xff\x6f\x00" "\xff\xff\x70\x00\xff\xff\x70\x00\xff\xff\x70\x00\xff\xff\x70\x00" "\xff\xff\x70\x00\xff\xff\x70\x00\xff\xff\x70\x00\xff\xff\x70\x00" "\xff\xff\x70\x00\xff\xff\x71\x00\xff\xff\x71\x00\xff\xff\x71\x00" "\xff\xff\x71\x00\xff\xff\x71\x00\xff\xff\x71\x00\xff\xff\x71\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x07\x00\x04\x00\x0d\x00" "\x5c\x00\x12\x00\xc9\x00\x17\x00\xff\x00\x1b\x00\xff\x00\x20\x00" "\xff\x00\x24\x00\xff\x00\x28\x00\xff\x00\x2c\x00\xff\x00\x30\x00" "\xff\x00\x33\x00\xff\x00\x37\x00\xff\x00\x3a\x00\xff\x00\x3d\x00" "\xff\x00\x40\x00\xff\x00\x44\x00\xff\x00\x46\x00\xff\x00\x48\x00" "\xff\x00\x4b\x00\xff\x00\x4d\x00\xff\x00\x4f\x00\xff\x00\x52\x00" "\xff\x00\x54\x00\xff\x00\x56\x00\xff\x01\x57\x00\xff\x18\x59\x00" "\xff\x43\x5b\x00\xff\x6d\x5c\x00\xff\x98\x5e\x00\xff\xc2\x60\x00" "\xff\xec\x61\x00\xff\xff\x62\x00\xff\xff\x63\x00\xff\xff\x65\x00" "\xff\xff\x67\x00\xff\xff\x67\x00\xff\xff\x68\x00\xff\xff\x69\x00" "\xff\xff\x6a\x00\xff\xff\x6a\x00\xff\xff\x6c\x00\xff\xff\x6c\x00" "\xff\xff\x6d\x00\xff\xff\x6e\x00\xff\xff\x6f\x00\xff\xff\x6f\x00" "\xff\xff\x70\x00\xff\xff\x71\x00\xff\xff\x72\x00\xff\xff\x72\x00" "\xff\xff\x73\x00\xff\xff\x73\x00\xff\xff\x74\x00\xff\xff\x74\x00" "\xff\xff\x75\x00\xff\xff\x75\x00\xff\xff\x75\x00\xff\xff\x76\x00" "\xff\xff\x76\x00\xff\xff\x76\x00\xff\xff\x77\x00\xff\xff\x77\x00" "\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x78\x00\xff\xff\x79\x00" "\xff\xff\x79\x00\xff\xff\x79\x00\xff\xff\x79\x00\xff\xff\x79\x00" "\xff\xff\x79\x00\xff\xff\x79\x00\xff\xff\x7a\x00\xff\xff\x7a\x00" "\xff\xff\x7a\x00\xff\xff\x7a\x00\xff\xff\x7a\x00\xff\xff\x7a\x00" "\xff\xff\x7a\x00\xff\xff\x7a\x00\xff\xff\x7a\x00\xff\xff\x7a\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x08\x00\x04\x00\x0f\x00\x5e\x00\x14\x00\xdb\x00\x1a\x00" "\xff\x00\x1e\x00\xff\x00\x23\x00\xff\x00\x27\x00\xff\x00\x2c\x00" "\xff\x00\x30\x00\xff\x00\x34\x00\xff\x00\x38\x00\xff\x00\x3c\x00" "\xff\x00\x3f\x00\xff\x00\x42\x00\xff\x00\x45\x00\xff\x00\x48\x00" "\xff\x00\x4b\x00\xff\x00\x4e\x00\xff\x00\x51\x00\xff\x00\x53\x00" "\xff\x00\x56\x00\xff\x00\x58\x00\xff\x17\x5a\x00\xff\x4d\x5c\x00" "\xff\x83\x5e\x00\xff\xb9\x60\x00\xff\xed\x62\x00\xff\xff\x63\x00" "\xff\xff\x65\x00\xff\xff\x67\x00\xff\xff\x68\x00\xff\xff\x6a\x00" "\xff\xff\x6b\x00\xff\xff\x6c\x00\xff\xff\x6d\x00\xff\xff\x6f\x00" "\xff\xff\x70\x00\xff\xff\x71\x00\xff\xff\x72\x00\xff\xff\x73\x00" "\xff\xff\x73\x00\xff\xff\x74\x00\xff\xff\x75\x00\xff\xff\x76\x00" "\xff\xff\x76\x00\xff\xff\x77\x00\xff\xff\x78\x00\xff\xff\x79\x00" "\xff\xff\x79\x00\xff\xff\x7a\x00\xff\xff\x7b\x00\xff\xff\x7c\x00" "\xff\xff\x7c\x00\xff\xff\x7d\x00\xff\xff\x7d\x00\xff\xff\x7d\x00" "\xff\xff\x7e\x00\xff\xff\x7e\x00\xff\xff\x7e\x00\xff\xff\x7f\x00" "\xff\xff\x7f\x00\xff\xff\x7f\x00\xff\xff\x80\x00\xff\xff\x80\x00" "\xff\xff\x80\x00\xff\xff\x81\x00\xff\xff\x81\x00\xff\xff\x82\x00" "\xff\xff\x82\x00\xff\xff\x82\x00\xff\xff\x82\x00\xff\xff\x82\x00" "\xff\xff\x82\x00\xff\xff\x82\x00\xff\xff\x82\x00\xff\xff\x83\x00" "\xff\xff\x83\x00\xff\xff\x83\x00\xff\xff\x83\x00\xff\xff\x83\x00" "\xff\xff\x83\x00\xff\xff\x83\x00\xff\xff\x83\x00\xff\xff\x83\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x08\x00\x03\x00\x0f\x00" "\x5d\x00\x15\x00\xda\x00\x1a\x00\xff\x00\x22\x00\xff\x00\x25\x00" "\xff\x00\x2a\x00\xff\x00\x2f\x00\xff\x00\x33\x00\xff\x00\x38\x00" "\xff\x00\x3c\x00\xff\x00\x40\x00\xff\x00\x43\x00\xff\x00\x47\x00" "\xff\x00\x4a\x00\xff\x00\x4e\x00\xff\x00\x50\x00\xff\x00\x53\x00" "\xff\x00\x56\x00\xff\x01\x59\x00\xff\x25\x5c\x00\xff\x69\x5e\x00" "\xff\xaa\x60\x00\xff\xe1\x62\x00\xff\xff\x64\x00\xff\xff\x66\x00" "\xff\xff\x69\x00\xff\xff\x6a\x00\xff\xff\x6c\x00\xff\xff\x6d\x00" "\xff\xff\x6f\x00\xff\xff\x70\x00\xff\xff\x72\x00\xff\xff\x73\x00" "\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x77\x00\xff\xff\x78\x00" "\xff\xff\x79\x00\xff\xff\x7a\x00\xff\xff\x7b\x00\xff\xff\x7c\x00" "\xff\xff\x7c\x00\xff\xff\x7d\x00\xff\xff\x7e\x00\xff\xff\x7f\x00" "\xff\xff\x7f\x00\xff\xff\x80\x00\xff\xff\x81\x00\xff\xff\x82\x00" "\xff\xff\x82\x00\xff\xff\x83\x00\xff\xff\x84\x00\xff\xff\x84\x00" "\xff\xff\x85\x00\xff\xff\x85\x00\xff\xff\x86\x00\xff\xff\x86\x00" "\xff\xff\x86\x00\xff\xff\x87\x00\xff\xff\x87\x00\xff\xff\x87\x00" "\xff\xff\x88\x00\xff\xff\x88\x00\xff\xff\x88\x00\xff\xff\x89\x00" "\xff\xff\x89\x00\xff\xff\x89\x00\xff\xff\x8a\x00\xff\xff\x8a\x00" "\xff\xff\x8a\x00\xff\xff\x8a\x00\xff\xff\x8a\x00\xff\xff\x8b\x00" "\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8b\x00" "\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8b\x00" "\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8c\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x08\x00\x00\x00\x0f\x00\x32\x00\x15\x00\xca\x00\x1a\x00" "\xff\x00\x22\x00\xff\x00\x26\x00\xff\x00\x2c\x00\xff\x00\x31\x00" "\xff\x00\x36\x00\xff\x00\x3a\x00\xff\x00\x3f\x00\xff\x00\x43\x00" "\xff\x00\x47\x00\xff\x00\x4a\x00\xff\x00\x4e\x00\xff\x00\x51\x00" "\xff\x00\x55\x00\xff\x00\x58\x00\xff\x15\x5b\x00\xff\x58\x5e\x00" "\xff\x9d\x60\x00\xff\xe1\x63\x00\xff\xff\x66\x00\xff\xff\x68\x00" "\xff\xff\x6a\x00\xff\xff\x6c\x00\xff\xff\x6e\x00\xff\xff\x70\x00" "\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x75\x00\xff\xff\x77\x00" "\xff\xff\x78\x00\xff\xff\x7a\x00\xff\xff\x7b\x00\xff\xff\x7c\x00" "\xff\xff\x7e\x00\xff\xff\x7f\x00\xff\xff\x80\x00\xff\xff\x81\x00" "\xff\xff\x82\x00\xff\xff\x83\x00\xff\xff\x84\x00\xff\xff\x84\x00" "\xff\xff\x85\x00\xff\xff\x86\x00\xff\xff\x87\x00\xff\xff\x87\x00" "\xff\xff\x88\x00\xff\xff\x89\x00\xff\xff\x89\x00\xff\xff\x8a\x00" "\xff\xff\x8b\x00\xff\xff\x8b\x00\xff\xff\x8c\x00\xff\xff\x8d\x00" "\xff\xff\x8d\x00\xff\xff\x8e\x00\xff\xff\x8e\x00\xff\xff\x8e\x00" "\xff\xff\x8e\x00\xff\xff\x8f\x00\xff\xff\x8f\x00\xff\xff\x8f\x00" "\xff\xff\x90\x00\xff\xff\x90\x00\xff\xff\x90\x00\xff\xff\x91\x00" "\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x92\x00\xff\xff\x92\x00" "\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x92\x00" "\xff\xff\x93\x00\xff\xff\x93\x00\xff\xff\x93\x00\xff\xff\x93\x00" "\xff\xff\x93\x00\xff\xff\x93\x00\xff\xff\x93\x00\xff\xff\x93\x00" "\xff\xff\x93\x00\xff\xff\x93\x00\xff\xff\x93\x00\xff\xff\x93\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x0c\x00" "\x0f\x00\x14\x00\x93\x00\x1a\x00\xfd\x00\x22\x00\xff\x00\x26\x00" "\xff\x00\x2c\x00\xff\x00\x32\x00\xff\x00\x37\x00\xff\x00\x3c\x00" "\xff\x00\x41\x00\xff\x00\x45\x00\xff\x00\x49\x00\xff\x00\x4e\x00" "\xff\x00\x52\x00\xff\x00\x55\x00\xff\x00\x58\x00\xff\x17\x5c\x00" "\xff\x69\x5f\x00\xff\xbe\x62\x00\xff\xfd\x65\x00\xff\xff\x68\x00" "\xff\xff\x6a\x00\xff\xff\x6d\x00\xff\xff\x6f\x00\xff\xff\x71\x00" "\xff\xff\x74\x00\xff\xff\x75\x00\xff\xff\x77\x00\xff\xff\x79\x00" "\xff\xff\x7b\x00\xff\xff\x7d\x00\xff\xff\x7e\x00\xff\xff\x80\x00" "\xff\xff\x81\x00\xff\xff\x82\x00\xff\xff\x84\x00\xff\xff\x85\x00" "\xff\xff\x86\x00\xff\xff\x87\x00\xff\xff\x88\x00\xff\xff\x89\x00" "\xff\xff\x8a\x00\xff\xff\x8b\x00\xff\xff\x8c\x00\xff\xff\x8d\x00" "\xff\xff\x8d\x00\xff\xff\x8e\x00\xff\xff\x8f\x00\xff\xff\x8f\x00" "\xff\xff\x90\x00\xff\xff\x91\x00\xff\xff\x91\x00\xff\xff\x92\x00" "\xff\xff\x92\x00\xff\xff\x93\x00\xff\xff\x94\x00\xff\xff\x94\x00" "\xff\xff\x95\x00\xff\xff\x95\x00\xff\xff\x96\x00\xff\xff\x96\x00" "\xff\xff\x96\x00\xff\xff\x96\x00\xff\xff\x97\x00\xff\xff\x97\x00" "\xff\xff\x97\x00\xff\xff\x98\x00\xff\xff\x98\x00\xff\xff\x98\x00" "\xff\xff\x98\x00\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x99\x00" "\xff\xff\x99\x00\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9a\x00" "\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9a\x00" "\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9a\x00" "\xff\xff\x9a\x00\xff\xff\x9b\x00\xff\xff\x9b\x00\xff\xff\x9b\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x4a\x00\x18\x00" "\xe7\x00\x1f\x00\xff\x00\x26\x00\xff\x00\x2c\x00\xff\x00\x32\x00" "\xff\x00\x37\x00\xff\x00\x3d\x00\xff\x00\x42\x00\xff\x00\x47\x00" "\xff\x00\x4b\x00\xff\x00\x50\x00\xff\x00\x54\x00\xff\x00\x58\x00" "\xff\x0f\x5c\x00\xff\x69\x5f\x00\xff\xbf\x63\x00\xff\xfd\x66\x00" "\xff\xff\x69\x00\xff\xff\x6c\x00\xff\xff\x6f\x00\xff\xff\x71\x00" "\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xff\xff\x7a\x00" "\xff\xff\x7d\x00\xff\xff\x7e\x00\xff\xff\x80\x00\xff\xff\x82\x00" "\xff\xff\x84\x00\xff\xff\x85\x00\xff\xff\x87\x00\xff\xff\x88\x00" "\xff\xff\x89\x00\xff\xff\x8b\x00\xff\xff\x8c\x00\xff\xff\x8d\x00" "\xff\xff\x8e\x00\xff\xff\x8f\x00\xff\xff\x90\x00\xff\xff\x91\x00" "\xff\xff\x92\x00\xff\xff\x93\x00\xff\xff\x94\x00\xff\xff\x94\x00" "\xff\xff\x95\x00\xff\xff\x96\x00\xff\xff\x96\x00\xff\xff\x97\x00" "\xff\xff\x97\x00\xff\xff\x98\x00\xff\xff\x99\x00\xff\xff\x99\x00" "\xff\xff\x9a\x00\xff\xff\x9a\x00\xff\xff\x9b\x00\xff\xff\x9c\x00" "\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9d\x00\xff\xff\x9d\x00" "\xff\xff\x9d\x00\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\x9e\x00" "\xff\xff\x9e\x00\xff\xff\x9f\x00\xff\xff\x9f\x00\xff\xff\x9f\x00" "\xff\xff\x9f\x00\xff\xff\xa0\x00\xff\xff\xa0\x00\xff\xff\xa0\x00" "\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa1\x00" "\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa1\x00" "\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa1\x00" "\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa1\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00" "\x00\x00\x0d\x00\x05\x00\x15\x00\x8a\x00\x1c\x00\xff\x00\x24\x00" "\xff\x00\x2a\x00\xff\x00\x30\x00\xff\x00\x37\x00\xff\x00\x3d\x00" "\xff\x00\x42\x00\xff\x00\x47\x00\xff\x00\x4c\x00\xff\x00\x51\x00" "\xff\x00\x56\x00\xff\x00\x5a\x00\xff\x32\x5e\x00\xff\x9b\x62\x00" "\xff\xf5\x65\x00\xff\xff\x69\x00\xff\xff\x6c\x00\xff\xff\x6f\x00" "\xff\xff\x72\x00\xff\xff\x75\x00\xff\xff\x78\x00\xff\xff\x7a\x00" "\xff\xff\x7c\x00\xff\xff\x7f\x00\xff\xff\x81\x00\xff\xff\x83\x00" "\xff\xff\x85\x00\xff\xff\x87\x00\xff\xff\x88\x00\xff\xff\x8a\x00" "\xff\xff\x8c\x00\xff\xff\x8d\x00\xff\xff\x8f\x00\xff\xff\x90\x00" "\xff\xff\x91\x00\xff\xff\x92\x00\xff\xff\x94\x00\xff\xff\x95\x00" "\xff\xff\x96\x00\xff\xff\x97\x00\xff\xff\x98\x00\xff\xff\x99\x00" "\xff\xff\x99\x00\xff\xff\x9a\x00\xff\xff\x9b\x00\xff\xff\x9c\x00" "\xff\xff\x9c\x00\xff\xff\x9d\x00\xff\xff\x9d\x00\xff\xff\x9e\x00" "\xff\xff\x9e\x00\xff\xff\x9f\x00\xff\xff\xa0\x00\xff\xff\xa0\x00" "\xff\xff\xa1\x00\xff\xff\xa1\x00\xff\xff\xa2\x00\xff\xff\xa2\x00" "\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa4\x00" "\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa5\x00" "\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa6\x00" "\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00\xff\xff\xa6\x00" "\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa7\x00" "\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa7\x00" "\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa8\x00" "\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa8\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x10\x00" "\x1e\x00\x18\x00\xc6\x00\x20\x00\xff\x00\x28\x00\xff\x00\x2e\x00" "\xff\x00\x35\x00\xff\x00\x3b\x00\xff\x00\x41\x00\xff\x00\x47\x00" "\xff\x00\x4d\x00\xff\x00\x51\x00\xff\x00\x57\x00\xff\x04\x5b\x00" "\xff\x5c\x60\x00\xff\xc9\x63\x00\xff\xff\x67\x00\xff\xff\x6b\x00" "\xff\xff\x6f\x00\xff\xff\x72\x00\xff\xff\x75\x00\xff\xff\x78\x00" "\xff\xff\x7b\x00\xff\xff\x7e\x00\xff\xff\x81\x00\xff\xff\x83\x00" "\xff\xff\x85\x00\xff\xff\x87\x00\xff\xff\x89\x00\xff\xff\x8b\x00" "\xff\xff\x8d\x00\xff\xff\x8f\x00\xff\xff\x90\x00\xff\xff\x92\x00" "\xff\xff\x93\x00\xff\xff\x95\x00\xff\xff\x96\x00\xff\xff\x97\x00" "\xff\xff\x98\x00\xff\xff\x9a\x00\xff\xff\x9b\x00\xff\xff\x9c\x00" "\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\x9f\x00\xff\xff\x9f\x00" "\xff\xff\xa0\x00\xff\xff\xa1\x00\xff\xff\xa2\x00\xff\xff\xa2\x00" "\xff\xff\xa3\x00\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa4\x00" "\xff\xff\xa5\x00\xff\xff\xa5\x00\xff\xff\xa6\x00\xff\xff\xa7\x00" "\xff\xff\xa7\x00\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa9\x00" "\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xaa\x00" "\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xab\x00" "\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xab\x00" "\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00" "\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00" "\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xad\x00" "\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xae\x00\xff\xff\xae\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x13\x00\x39\x00\x1b\x00" "\xec\x00\x23\x00\xff\x00\x2b\x00\xff\x00\x32\x00\xff\x00\x39\x00" "\xff\x00\x3f\x00\xff\x00\x45\x00\xff\x00\x4b\x00\xff\x00\x51\x00" "\xff\x00\x57\x00\xff\x04\x5b\x00\xff\x5e\x60\x00\xff\xdb\x65\x00" "\xff\xff\x69\x00\xff\xff\x6d\x00\xff\xff\x71\x00\xff\xff\x74\x00" "\xff\xff\x77\x00\xff\xff\x7b\x00\xff\xff\x7e\x00\xff\xff\x81\x00" "\xff\xff\x83\x00\xff\xff\x86\x00\xff\xff\x89\x00\xff\xff\x8b\x00" "\xff\xff\x8d\x00\xff\xff\x8f\x00\xff\xff\x91\x00\xff\xff\x93\x00" "\xff\xff\x94\x00\xff\xff\x96\x00\xff\xff\x98\x00\xff\xff\x99\x00" "\xff\xff\x9b\x00\xff\xff\x9c\x00\xff\xff\x9d\x00\xff\xff\x9e\x00" "\xff\xff\x9f\x00\xff\xff\xa0\x00\xff\xff\xa2\x00\xff\xff\xa3\x00" "\xff\xff\xa4\x00\xff\xff\xa4\x00\xff\xff\xa5\x00\xff\xff\xa6\x00" "\xff\xff\xa7\x00\xff\xff\xa8\x00\xff\xff\xa8\x00\xff\xff\xa9\x00" "\xff\xff\xa9\x00\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xab\x00" "\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xac\x00\xff\xff\xac\x00" "\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xae\x00\xff\xff\xae\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xaf\x00" "\xff\xff\xb0\x00\xff\xff\xb0\x00\xff\xff\xb0\x00\xff\xff\xb0\x00" "\xff\xff\xb0\x00\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb1\x00" "\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb2\x00" "\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00" "\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00" "\xff\xff\xb2\x00\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00" "\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00" "\x00\x00\x0c\x00\x00\x00\x15\x00\x4c\x00\x1e\x00\xf6\x00\x26\x00" "\xff\x00\x2d\x00\xff\x00\x35\x00\xff\x00\x3c\x00\xff\x00\x43\x00" "\xff\x00\x49\x00\xff\x00\x4f\x00\xff\x00\x55\x00\xff\x03\x5a\x00" "\xff\x5d\x60\x00\xff\xda\x65\x00\xff\xff\x69\x00\xff\xff\x6e\x00" "\xff\xff\x72\x00\xff\xff\x76\x00\xff\xff\x79\x00\xff\xff\x7c\x00" "\xff\xff\x80\x00\xff\xff\x83\x00\xff\xff\x86\x00\xff\xff\x89\x00" "\xff\xff\x8b\x00\xff\xff\x8e\x00\xff\xff\x90\x00\xff\xff\x92\x00" "\xff\xff\x94\x00\xff\xff\x96\x00\xff\xff\x98\x00\xff\xff\x9a\x00" "\xff\xff\x9c\x00\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\xa0\x00" "\xff\xff\xa1\x00\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa5\x00" "\xff\xff\xa6\x00\xff\xff\xa7\x00\xff\xff\xa8\x00\xff\xff\xa9\x00" "\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xab\x00\xff\xff\xac\x00" "\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xae\x00\xff\xff\xae\x00" "\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb0\x00" "\xff\xff\xb0\x00\xff\xff\xb1\x00\xff\xff\xb1\x00\xff\xff\xb2\x00" "\xff\xff\xb2\x00\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00" "\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\xff\xff\xb5\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00" "\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb7\x00" "\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00" "\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00" "\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb7\x00" "\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0d\x00" "\x00\x00\x16\x00\x61\x00\x1f\x00\xfc\x00\x28\x00\xff\x00\x30\x00" "\xff\x00\x38\x00\xff\x00\x3e\x00\xff\x00\x46\x00\xff\x00\x4c\x00" "\xff\x00\x53\x00\xff\x00\x58\x00\xff\x32\x5e\x00\xff\xca\x63\x00" "\xff\xff\x69\x00\xff\xff\x6e\x00\xff\xff\x72\x00\xff\xff\x76\x00" "\xff\xff\x7a\x00\xff\xff\x7e\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x88\x00\xff\xff\x8b\x00\xff\xff\x8e\x00\xff\xff\x90\x00" "\xff\xff\x93\x00\xff\xff\x95\x00\xff\xff\x97\x00\xff\xff\x9a\x00" "\xff\xff\x9b\x00\xff\xff\x9d\x00\xff\xff\x9f\x00\xff\xff\xa1\x00" "\xff\xff\xa2\x00\xff\xff\xa4\x00\xff\xff\xa5\x00\xff\xff\xa6\x00" "\xff\xff\xa7\x00\xff\xff\xa9\x00\xff\xff\xaa\x00\xff\xff\xab\x00" "\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xae\x00" "\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb0\x00\xff\xff\xb1\x00" "\xff\xff\xb2\x00\xff\xff\xb3\x00\xff\xff\xb3\x00\xff\xff\xb3\x00" "\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\xff\xff\xb5\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb7\x00" "\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0e\x00\x00\x00\x17\x00" "\x6a\x00\x20\x00\xff\x00\x29\x00\xff\x00\x31\x00\xff\x00\x3a\x00" "\xff\x00\x41\x00\xff\x00\x48\x00\xff\x00\x4e\x00\xff\x00\x55\x00" "\xff\x0f\x5c\x00\xff\x93\x61\x00\xff\xfd\x67\x00\xff\xff\x6c\x00" "\xff\xff\x71\x00\xff\xff\x76\x00\xff\xff\x7a\x00\xff\xff\x7e\x00" "\xff\xff\x82\x00\xff\xff\x86\x00\xff\xff\x89\x00\xff\xff\x8c\x00" "\xff\xff\x8f\x00\xff\xff\x92\x00\xff\xff\x95\x00\xff\xff\x97\x00" "\xff\xff\x9a\x00\xff\xff\x9c\x00\xff\xff\x9e\x00\xff\xff\xa0\x00" "\xff\xff\xa2\x00\xff\xff\xa3\x00\xff\xff\xa5\x00\xff\xff\xa7\x00" "\xff\xff\xa8\x00\xff\xff\xaa\x00\xff\xff\xab\x00\xff\xff\xac\x00" "\xff\xff\xad\x00\xff\xff\xae\x00\xff\xff\xaf\x00\xff\xff\xb0\x00" "\xff\xff\xb1\x00\xff\xff\xb2\x00\xff\xff\xb3\x00\xff\xff\xb4\x00" "\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb6\x00" "\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xb8\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbb\x00" "\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x0e\x00\x00\x00\x18\x00\x56\x00\x21\x00" "\xfe\x00\x2a\x00\xff\x00\x32\x00\xff\x00\x3a\x00\xff\x00\x42\x00" "\xff\x00\x4a\x00\xff\x00\x51\x00\xff\x00\x57\x00\xff\x4a\x5e\x00" "\xff\xe7\x64\x00\xff\xff\x6a\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x79\x00\xff\xff\x7e\x00\xff\xff\x82\x00\xff\xff\x86\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x90\x00\xff\xff\x93\x00" "\xff\xff\x96\x00\xff\xff\x99\x00\xff\xff\x9c\x00\xff\xff\x9e\x00" "\xff\xff\xa0\x00\xff\xff\xa2\x00\xff\xff\xa4\x00\xff\xff\xa6\x00" "\xff\xff\xa8\x00\xff\xff\xa9\x00\xff\xff\xab\x00\xff\xff\xac\x00" "\xff\xff\xae\x00\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb1\x00" "\xff\xff\xb2\x00\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb5\x00" "\xff\xff\xb6\x00\xff\xff\xb7\x00\xff\xff\xb7\x00\xff\xff\xb8\x00" "\xff\xff\xb9\x00\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xbf\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00" "\x00\x00\x0d\x00\x00\x00\x17\x00\x42\x00\x21\x00\xf9\x00\x2a\x00" "\xff\x00\x33\x00\xff\x00\x3b\x00\xff\x00\x43\x00\xff\x00\x4b\x00" "\xff\x00\x53\x00\xff\x05\x5a\x00\xff\x8a\x60\x00\xff\xff\x66\x00" "\xff\xff\x6c\x00\xff\xff\x72\x00\xff\xff\x77\x00\xff\xff\x7c\x00" "\xff\xff\x80\x00\xff\xff\x85\x00\xff\xff\x89\x00\xff\xff\x8d\x00" "\xff\xff\x90\x00\xff\xff\x94\x00\xff\xff\x97\x00\xff\xff\x9a\x00" "\xff\xff\x9d\x00\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa4\x00" "\xff\xff\xa6\x00\xff\xff\xa8\x00\xff\xff\xaa\x00\xff\xff\xac\x00" "\xff\xff\xad\x00\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb2\x00" "\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb6\x00" "\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xba\x00" "\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0c\x00" "\x00\x00\x16\x00\x2f\x00\x20\x00\xf2\x00\x2a\x00\xff\x00\x33\x00" "\xff\x00\x3c\x00\xff\x00\x44\x00\xff\x00\x4c\x00\xff\x00\x53\x00" "\xff\x1e\x5b\x00\xff\xc6\x62\x00\xff\xff\x68\x00\xff\xff\x6e\x00" "\xff\xff\x74\x00\xff\xff\x79\x00\xff\xff\x7f\x00\xff\xff\x83\x00" "\xff\xff\x88\x00\xff\xff\x8c\x00\xff\xff\x90\x00\xff\xff\x94\x00" "\xff\xff\x97\x00\xff\xff\x9a\x00\xff\xff\x9e\x00\xff\xff\xa1\x00" "\xff\xff\xa3\x00\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xaa\x00" "\xff\xff\xac\x00\xff\xff\xae\x00\xff\xff\xaf\x00\xff\xff\xb1\x00" "\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb5\x00\xff\xff\xb6\x00" "\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x15\x00" "\x0e\x00\x1f\x00\xdc\x00\x29\x00\xff\x00\x32\x00\xff\x00\x3b\x00" "\xff\x00\x44\x00\xff\x00\x4d\x00\xff\x00\x54\x00\xff\x39\x5b\x00" "\xff\xec\x62\x00\xff\xff\x69\x00\xff\xff\x70\x00\xff\xff\x76\x00" "\xff\xff\x7b\x00\xff\xff\x80\x00\xff\xff\x86\x00\xff\xff\x8a\x00" "\xff\xff\x8f\x00\xff\xff\x93\x00\xff\xff\x97\x00\xff\xff\x9a\x00" "\xff\xff\x9e\x00\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa6\x00" "\xff\xff\xa9\x00\xff\xff\xab\x00\xff\xff\xad\x00\xff\xff\xaf\x00" "\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb6\x00" "\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbb\x00" "\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x13\x00\x01\x00\x1e\x00" "\xa9\x00\x28\x00\xff\x00\x31\x00\xff\x00\x3a\x00\xff\x00\x43\x00" "\xff\x00\x4c\x00\xff\x00\x54\x00\xff\x4c\x5c\x00\xff\xf6\x63\x00" "\xff\xff\x6a\x00\xff\xff\x70\x00\xff\xff\x77\x00\xff\xff\x7d\x00" "\xff\xff\x82\x00\xff\xff\x87\x00\xff\xff\x8c\x00\xff\xff\x91\x00" "\xff\xff\x95\x00\xff\xff\x99\x00\xff\xff\x9d\x00\xff\xff\xa0\x00" "\xff\xff\xa4\x00\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xac\x00" "\xff\xff\xae\x00\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb4\x00" "\xff\xff\xb6\x00\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xba\x00" "\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x05\x00\x00\x00\x10\x00\x00\x00\x1b\x00\x69\x00\x26\x00" "\xff\x00\x30\x00\xff\x00\x39\x00\xff\x00\x42\x00\xff\x00\x4b\x00" "\xff\x00\x53\x00\xff\x61\x5b\x00\xff\xfc\x63\x00\xff\xff\x6b\x00" "\xff\xff\x71\x00\xff\xff\x77\x00\xff\xff\x7e\x00\xff\xff\x83\x00" "\xff\xff\x89\x00\xff\xff\x8e\x00\xff\xff\x92\x00\xff\xff\x97\x00" "\xff\xff\x9b\x00\xff\xff\x9f\x00\xff\xff\xa2\x00\xff\xff\xa6\x00" "\xff\xff\xa9\x00\xff\xff\xac\x00\xff\xff\xae\x00\xff\xff\xb1\x00" "\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00" "\x00\x00\x0d\x00\x00\x00\x18\x00\x2c\x00\x23\x00\xf9\x00\x2d\x00" "\xff\x00\x38\x00\xff\x00\x41\x00\xff\x00\x4a\x00\xff\x00\x53\x00" "\xff\x6a\x5b\x00\xff\xff\x62\x00\xff\xff\x6a\x00\xff\xff\x71\x00" "\xff\xff\x78\x00\xff\xff\x7e\x00\xff\xff\x84\x00\xff\xff\x8a\x00" "\xff\xff\x8f\x00\xff\xff\x94\x00\xff\xff\x98\x00\xff\xff\x9d\x00" "\xff\xff\xa1\x00\xff\xff\xa4\x00\xff\xff\xa8\x00\xff\xff\xab\x00" "\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb3\x00\xff\xff\xb5\x00" "\xff\xff\xb7\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbc\x00" "\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc1\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00" "\x00\x00\x15\x00\x02\x00\x20\x00\xc5\x00\x2b\x00\xff\x00\x35\x00" "\xff\x00\x3e\x00\xff\x00\x48\x00\xff\x00\x51\x00\xff\x56\x5a\x00" "\xff\xfe\x62\x00\xff\xff\x69\x00\xff\xff\x70\x00\xff\xff\x77\x00" "\xff\xff\x7e\x00\xff\xff\x85\x00\xff\xff\x8a\x00\xff\xff\x90\x00" "\xff\xff\x95\x00\xff\xff\x9a\x00\xff\xff\x9e\x00\xff\xff\xa2\x00" "\xff\xff\xa6\x00\xff\xff\xa9\x00\xff\xff\xad\x00\xff\xff\xb0\x00" "\xff\xff\xb2\x00\xff\xff\xb5\x00\xff\xff\xb7\x00\xff\xff\xb9\x00" "\xff\xff\xbb\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x11\x00" "\x00\x00\x1c\x00\x63\x00\x28\x00\xff\x00\x32\x00\xff\x00\x3c\x00" "\xff\x00\x46\x00\xff\x00\x4e\x00\xff\x42\x57\x00\xff\xf9\x60\x00" "\xff\xff\x68\x00\xff\xff\x70\x00\xff\xff\x77\x00\xff\xff\x7e\x00" "\xff\xff\x84\x00\xff\xff\x8a\x00\xff\xff\x90\x00\xff\xff\x95\x00" "\xff\xff\x9a\x00\xff\xff\x9f\x00\xff\xff\xa3\x00\xff\xff\xa7\x00" "\xff\xff\xab\x00\xff\xff\xae\x00\xff\xff\xb1\x00\xff\xff\xb4\x00" "\xff\xff\xb6\x00\xff\xff\xb9\x00\xff\xff\xbb\x00\xff\xff\xbd\x00" "\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x18\x00" "\x14\x00\x24\x00\xed\x00\x2e\x00\xff\x00\x39\x00\xff\x00\x43\x00" "\xff\x00\x4c\x00\xff\x2f\x55\x00\xff\xf2\x5e\x00\xff\xff\x66\x00" "\xff\xff\x6e\x00\xff\xff\x76\x00\xff\xff\x7d\x00\xff\xff\x83\x00" "\xff\xff\x8a\x00\xff\xff\x90\x00\xff\xff\x95\x00\xff\xff\x9b\x00" "\xff\xff\x9f\x00\xff\xff\xa4\x00\xff\xff\xa8\x00\xff\xff\xac\x00" "\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb5\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x14\x00\x00\x00\x1f\x00" "\x9a\x00\x2a\x00\xff\x00\x35\x00\xff\x00\x3f\x00\xff\x00\x49\x00" "\xff\x0e\x53\x00\xff\xdc\x5c\x00\xff\xff\x64\x00\xff\xff\x6c\x00" "\xff\xff\x74\x00\xff\xff\x7b\x00\xff\xff\x82\x00\xff\xff\x89\x00" "\xff\xff\x8f\x00\xff\xff\x95\x00\xff\xff\x9a\x00\xff\xff\x9f\x00" "\xff\xff\xa4\x00\xff\xff\xa8\x00\xff\xff\xac\x00\xff\xff\xb0\x00" "\xff\xff\xb3\x00\xff\xff\xb6\x00\xff\xff\xb9\x00\xff\xff\xbb\x00" "\xff\xff\xbe\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x0f\x00\x00\x00\x1a\x00\x24\x00\x26\x00" "\xfc\x00\x30\x00\xff\x00\x3b\x00\xff\x00\x45\x00\xff\x01\x4f\x00" "\xff\xa9\x58\x00\xff\xff\x61\x00\xff\xff\x6a\x00\xff\xff\x72\x00" "\xff\xff\x79\x00\xff\xff\x80\x00\xff\xff\x87\x00\xff\xff\x8e\x00" "\xff\xff\x94\x00\xff\xff\x9a\x00\xff\xff\x9f\x00\xff\xff\xa4\x00" "\xff\xff\xa8\x00\xff\xff\xac\x00\xff\xff\xb0\x00\xff\xff\xb4\x00" "\xff\xff\xb7\x00\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x09\x00\x00\x00\x15\x00\x00\x00\x22\x00\xa1\x00\x2c\x00" "\xff\x00\x37\x00\xff\x00\x41\x00\xff\x00\x4b\x00\xff\x69\x55\x00" "\xff\xff\x5e\x00\xff\xff\x67\x00\xff\xff\x6f\x00\xff\xff\x77\x00" "\xff\xff\x7f\x00\xff\xff\x86\x00\xff\xff\x8c\x00\xff\xff\x92\x00" "\xff\xff\x98\x00\xff\xff\x9e\x00\xff\xff\xa3\x00\xff\xff\xa8\x00" "\xff\xff\xac\x00\xff\xff\xb0\x00\xff\xff\xb4\x00\xff\xff\xb7\x00" "\xff\xff\xba\x00\xff\xff\xbd\x00\xff\xff\xbf\x00\xff\xff\xc1\x00" "\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc6\x00\xff\xff\xc7\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x0f\x00\x00\x00\x1a\x00\x26\x00\x27\x00\xfd\x00\x33\x00" "\xff\x00\x3d\x00\xff\x00\x47\x00\xff\x2c\x51\x00\xff\xf9\x5a\x00" "\xff\xff\x63\x00\xff\xff\x6c\x00\xff\xff\x74\x00\xff\xff\x7c\x00" "\xff\xff\x83\x00\xff\xff\x8b\x00\xff\xff\x91\x00\xff\xff\x97\x00" "\xff\xff\x9d\x00\xff\xff\xa2\x00\xff\xff\xa7\x00\xff\xff\xac\x00" "\xff\xff\xb0\x00\xff\xff\xb4\x00\xff\xff\xb7\x00\xff\xff\xba\x00" "\xff\xff\xbd\x00\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00" "\x00\x00\x15\x00\x00\x00\x22\x00\xa2\x00\x2c\x00\xff\x00\x37\x00" "\xff\x00\x42\x00\xff\x02\x4d\x00\xff\xc5\x57\x00\xff\xff\x60\x00" "\xff\xff\x69\x00\xff\xff\x71\x00\xff\xff\x79\x00\xff\xff\x81\x00" "\xff\xff\x88\x00\xff\xff\x8f\x00\xff\xff\x95\x00\xff\xff\x9b\x00" "\xff\xff\xa1\x00\xff\xff\xa6\x00\xff\xff\xab\x00\xff\xff\xaf\x00" "\xff\xff\xb3\x00\xff\xff\xb7\x00\xff\xff\xba\x00\xff\xff\xbd\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0f\x00" "\x00\x00\x1c\x00\x1b\x00\x27\x00\xfc\x00\x32\x00\xff\x00\x3d\x00" "\xff\x00\x47\x00\xff\x63\x51\x00\xff\xff\x5b\x00\xff\xff\x65\x00" "\xff\xff\x6e\x00\xff\xff\x76\x00\xff\xff\x7e\x00\xff\xff\x85\x00" "\xff\xff\x8c\x00\xff\xff\x93\x00\xff\xff\x99\x00\xff\xff\x9f\x00" "\xff\xff\xa5\x00\xff\xff\xa9\x00\xff\xff\xae\x00\xff\xff\xb2\x00" "\xff\xff\xb6\x00\xff\xff\xba\x00\xff\xff\xbd\x00\xff\xff\xc0\x00" "\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x14\x00" "\x00\x00\x20\x00\x80\x00\x2c\x00\xff\x00\x38\x00\xff\x00\x42\x00" "\xff\x14\x4d\x00\xff\xed\x57\x00\xff\xff\x60\x00\xff\xff\x69\x00" "\xff\xff\x72\x00\xff\xff\x7a\x00\xff\xff\x82\x00\xff\xff\x89\x00" "\xff\xff\x90\x00\xff\xff\x97\x00\xff\xff\x9d\x00\xff\xff\xa2\x00" "\xff\xff\xa8\x00\xff\xff\xad\x00\xff\xff\xb1\x00\xff\xff\xb5\x00" "\xff\xff\xb9\x00\xff\xff\xbc\x00\xff\xff\xbf\x00\xff\xff\xc2\x00" "\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x00\x00\x1a\x00" "\x04\x00\x25\x00\xe5\x00\x31\x00\xff\x00\x3c\x00\xff\x00\x47\x00" "\xff\x9a\x52\x00\xff\xff\x5b\x00\xff\xff\x65\x00\xff\xff\x6e\x00" "\xff\xff\x76\x00\xff\xff\x7e\x00\xff\xff\x86\x00\xff\xff\x8d\x00" "\xff\xff\x94\x00\xff\xff\x9a\x00\xff\xff\xa0\x00\xff\xff\xa6\x00" "\xff\xff\xab\x00\xff\xff\xb0\x00\xff\xff\xb4\x00\xff\xff\xb8\x00" "\xff\xff\xbb\x00\xff\xff\xbf\x00\xff\xff\xc1\x00\xff\xff\xc4\x00" "\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x12\x00\x00\x00\x1e\x00" "\x50\x00\x2a\x00\xff\x00\x36\x00\xff\x00\x41\x00\xff\x24\x4b\x00" "\xff\xfc\x56\x00\xff\xff\x60\x00\xff\xff\x69\x00\xff\xff\x72\x00" "\xff\xff\x7a\x00\xff\xff\x82\x00\xff\xff\x89\x00\xff\xff\x91\x00" "\xff\xff\x97\x00\xff\xff\x9e\x00\xff\xff\xa4\x00\xff\xff\xa9\x00" "\xff\xff\xae\x00\xff\xff\xb2\x00\xff\xff\xb6\x00\xff\xff\xba\x00" "\xff\xff\xbe\x00\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x18\x00\x00\x00\x23\x00" "\xb8\x00\x2f\x00\xff\x00\x3a\x00\xff\x00\x45\x00\xff\xa1\x50\x00" "\xff\xff\x5a\x00\xff\xff\x64\x00\xff\xff\x6d\x00\xff\xff\x76\x00" "\xff\xff\x7e\x00\xff\xff\x86\x00\xff\xff\x8d\x00\xff\xff\x94\x00" "\xff\xff\x9b\x00\xff\xff\xa1\x00\xff\xff\xa6\x00\xff\xff\xac\x00" "\xff\xff\xb1\x00\xff\xff\xb5\x00\xff\xff\xb9\x00\xff\xff\xbc\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc5\x00\xff\xff\xc7\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x0f\x00\x00\x00\x1b\x00\x18\x00\x27\x00" "\xfe\x00\x33\x00\xff\x00\x3f\x00\xff\x26\x49\x00\xff\xfd\x54\x00" "\xff\xff\x5e\x00\xff\xff\x67\x00\xff\xff\x71\x00\xff\xff\x79\x00" "\xff\xff\x81\x00\xff\xff\x89\x00\xff\xff\x91\x00\xff\xff\x97\x00" "\xff\xff\x9e\x00\xff\xff\xa4\x00\xff\xff\xa9\x00\xff\xff\xae\x00" "\xff\xff\xb3\x00\xff\xff\xb7\x00\xff\xff\xbb\x00\xff\xff\xbe\x00" "\xff\xff\xc1\x00\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc8\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x06\x00\x00\x00\x14\x00\x00\x00\x20\x00\x69\x00\x2c\x00" "\xff\x00\x38\x00\xff\x00\x43\x00\xff\xa2\x4e\x00\xff\xff\x58\x00" "\xff\xff\x62\x00\xff\xff\x6b\x00\xff\xff\x74\x00\xff\xff\x7c\x00" "\xff\xff\x85\x00\xff\xff\x8c\x00\xff\xff\x93\x00\xff\xff\x9a\x00" "\xff\xff\xa1\x00\xff\xff\xa6\x00\xff\xff\xac\x00\xff\xff\xb1\x00" "\xff\xff\xb5\x00\xff\xff\xb9\x00\xff\xff\xbd\x00\xff\xff\xc0\x00" "\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x0b\x00\x00\x00\x18\x00\x00\x00\x24\x00\xbe\x00\x30\x00" "\xff\x00\x3c\x00\xff\x1b\x47\x00\xff\xfc\x52\x00\xff\xff\x5c\x00" "\xff\xff\x65\x00\xff\xff\x6f\x00\xff\xff\x78\x00\xff\xff\x80\x00" "\xff\xff\x88\x00\xff\xff\x8f\x00\xff\xff\x96\x00\xff\xff\x9d\x00" "\xff\xff\xa3\x00\xff\xff\xa9\x00\xff\xff\xae\x00\xff\xff\xb3\x00" "\xff\xff\xb7\x00\xff\xff\xbb\x00\xff\xff\xbf\x00\xff\xff\xc2\x00" "\xff\xff\xc4\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x0f\x00\x00\x00\x1c\x00\x16\x00\x28\x00\xfd\x00\x34\x00" "\xff\x00\x40\x00\xff\x80\x4a\x00\xff\xff\x55\x00\xff\xff\x5f\x00" "\xff\xff\x69\x00\xff\xff\x72\x00\xff\xff\x7b\x00\xff\xff\x83\x00" "\xff\xff\x8b\x00\xff\xff\x92\x00\xff\xff\x99\x00\xff\xff\x9f\x00" "\xff\xff\xa5\x00\xff\xff\xab\x00\xff\xff\xb0\x00\xff\xff\xb5\x00" "\xff\xff\xb9\x00\xff\xff\xbd\x00\xff\xff\xc0\x00\xff\xff\xc3\x00" "\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00" "\x00\x00\x14\x00\x00\x00\x20\x00\x68\x00\x2c\x00\xff\x00\x38\x00" "\xff\x04\x43\x00\xff\xe5\x4e\x00\xff\xff\x58\x00\xff\xff\x63\x00" "\xff\xff\x6c\x00\xff\xff\x75\x00\xff\xff\x7e\x00\xff\xff\x86\x00" "\xff\xff\x8e\x00\xff\xff\x95\x00\xff\xff\x9c\x00\xff\xff\xa2\x00" "\xff\xff\xa8\x00\xff\xff\xad\x00\xff\xff\xb2\x00\xff\xff\xb7\x00" "\xff\xff\xbb\x00\xff\xff\xbe\x00\xff\xff\xc2\x00\xff\xff\xc4\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00" "\x00\x00\x18\x00\x00\x00\x24\x00\xb6\x00\x30\x00\xff\x00\x3c\x00" "\xff\x50\x47\x00\xff\xff\x51\x00\xff\xff\x5c\x00\xff\xff\x66\x00" "\xff\xff\x6f\x00\xff\xff\x78\x00\xff\xff\x81\x00\xff\xff\x89\x00" "\xff\xff\x90\x00\xff\xff\x97\x00\xff\xff\x9e\x00\xff\xff\xa4\x00" "\xff\xff\xaa\x00\xff\xff\xaf\x00\xff\xff\xb4\x00\xff\xff\xb8\x00" "\xff\xff\xbc\x00\xff\xff\xc0\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00" "\x00\x00\x1b\x00\x07\x00\x27\x00\xf5\x00\x33\x00\xff\x00\x3f\x00" "\xff\xb8\x4a\x00\xff\xff\x55\x00\xff\xff\x5f\x00\xff\xff\x69\x00" "\xff\xff\x72\x00\xff\xff\x7b\x00\xff\xff\x83\x00\xff\xff\x8b\x00" "\xff\xff\x93\x00\xff\xff\x9a\x00\xff\xff\xa0\x00\xff\xff\xa6\x00" "\xff\xff\xac\x00\xff\xff\xb1\x00\xff\xff\xb6\x00\xff\xff\xba\x00" "\xff\xff\xbe\x00\xff\xff\xc1\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x12\x00" "\x00\x00\x1f\x00\x40\x00\x2b\x00\xff\x00\x37\x00\xff\x18\x42\x00" "\xff\xfe\x4e\x00\xff\xff\x58\x00\xff\xff\x62\x00\xff\xff\x6c\x00" "\xff\xff\x75\x00\xff\xff\x7e\x00\xff\xff\x86\x00\xff\xff\x8e\x00" "\xff\xff\x95\x00\xff\xff\x9c\x00\xff\xff\xa2\x00\xff\xff\xa8\x00" "\xff\xff\xae\x00\xff\xff\xb3\x00\xff\xff\xb7\x00\xff\xff\xbb\x00" "\xff\xff\xbf\x00\xff\xff\xc2\x00\xff\xff\xc5\x00\xff\xff\xc7\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x16\x00" "\x00\x00\x22\x00\x85\x00\x2e\x00\xff\x00\x3a\x00\xff\x69\x45\x00" "\xff\xff\x50\x00\xff\xff\x5b\x00\xff\xff\x65\x00\xff\xff\x6f\x00" "\xff\xff\x78\x00\xff\xff\x81\x00\xff\xff\x89\x00\xff\xff\x90\x00" "\xff\xff\x97\x00\xff\xff\x9e\x00\xff\xff\xa4\x00\xff\xff\xaa\x00" "\xff\xff\xaf\x00\xff\xff\xb4\x00\xff\xff\xb9\x00\xff\xff\xbd\x00" "\xff\xff\xc0\x00\xff\xff\xc3\x00\xff\xff\xc6\x00\xff\xff\xc8\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x18\x00" "\x00\x00\x25\x00\xca\x00\x31\x00\xff\x00\x3d\x00\xff\xbe\x49\x00" "\xff\xff\x53\x00\xff\xff\x5e\x00\xff\xff\x68\x00\xff\xff\x71\x00" "\xff\xff\x7a\x00\xff\xff\x83\x00\xff\xff\x8b\x00\xff\xff\x92\x00" "\xff\xff\x9a\x00\xff\xff\xa0\x00\xff\xff\xa6\x00\xff\xff\xac\x00" "\xff\xff\xb1\x00\xff\xff\xb6\x00\xff\xff\xba\x00\xff\xff\xbe\x00" "\xff\xff\xc1\x00\xff\xff\xc4\x00\xff\xff\xc7\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0f\x00\x00\x00\x1c\x00" "\x11\x00\x28\x00\xfe\x00\x34\x00\xff\x16\x40\x00\xff\xfd\x4b\x00" "\xff\xff\x56\x00\xff\xff\x60\x00\xff\xff\x6a\x00\xff\xff\x74\x00" "\xff\xff\x7c\x00\xff\xff\x85\x00\xff\xff\x8d\x00\xff\xff\x94\x00" "\xff\xff\x9b\x00\xff\xff\xa2\x00\xff\xff\xa8\x00\xff\xff\xae\x00" "\xff\xff\xb3\x00\xff\xff\xb7\x00\xff\xff\xbb\x00\xff\xff\xbf\x00" "\xff\xff\xc2\x00\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x12\x00\x00\x00\x1f\x00" "\x48\x00\x2c\x00\xff\x00\x39\x00\xff\x68\x44\x00\xff\xff\x4e\x00" "\xff\xff\x59\x00\xff\xff\x63\x00\xff\xff\x6d\x00\xff\xff\x76\x00" "\xff\xff\x7f\x00\xff\xff\x87\x00\xff\xff\x8f\x00\xff\xff\x96\x00" "\xff\xff\x9d\x00\xff\xff\xa3\x00\xff\xff\xa9\x00\xff\xff\xaf\x00" "\xff\xff\xb4\x00\xff\xff\xb8\x00\xff\xff\xbc\x00\xff\xff\xc0\x00" "\xff\xff\xc3\x00\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x15\x00\x00\x00\x22\x00" "\x7e\x00\x2e\x00\xff\x00\x3a\x00\xff\xb6\x46\x00\xff\xff\x51\x00" "\xff\xff\x5c\x00\xff\xff\x66\x00\xff\xff\x6f\x00\xff\xff\x78\x00" "\xff\xff\x81\x00\xff\xff\x89\x00\xff\xff\x91\x00\xff\xff\x98\x00" "\xff\xff\x9f\x00\xff\xff\xa5\x00\xff\xff\xab\x00\xff\xff\xb0\x00" "\xff\xff\xb5\x00\xff\xff\xba\x00\xff\xff\xbd\x00\xff\xff\xc1\x00" "\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x18\x00\x00\x00\x24\x00" "\xb5\x00\x31\x00\xff\x07\x3d\x00\xff\xf5\x48\x00\xff\xff\x54\x00" "\xff\xff\x5e\x00\xff\xff\x68\x00\xff\xff\x71\x00\xff\xff\x7b\x00" "\xff\xff\x83\x00\xff\xff\x8b\x00\xff\xff\x93\x00\xff\xff\x9a\x00" "\xff\xff\xa1\x00\xff\xff\xa7\x00\xff\xff\xac\x00\xff\xff\xb2\x00" "\xff\xff\xb6\x00\xff\xff\xbb\x00\xff\xff\xbe\x00\xff\xff\xc2\x00" "\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x0d\x00\x00\x00\x1b\x00\x01\x00\x28\x00" "\xeb\x00\x34\x00\xff\x40\x40\x00\xff\xff\x4b\x00\xff\xff\x56\x00" "\xff\xff\x60\x00\xff\xff\x6a\x00\xff\xff\x73\x00\xff\xff\x7d\x00" "\xff\xff\x85\x00\xff\xff\x8d\x00\xff\xff\x95\x00\xff\xff\x9c\x00" "\xff\xff\xa2\x00\xff\xff\xa8\x00\xff\xff\xae\x00\xff\xff\xb3\x00" "\xff\xff\xb8\x00\xff\xff\xbc\x00\xff\xff\xbf\x00\xff\xff\xc3\x00" "\xff\xff\xc5\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x10\x00\x00\x00\x1d\x00\x22\x00\x2a\x00" "\xff\x00\x36\x00\xff\x85\x42\x00\xff\xff\x4d\x00\xff\xff\x58\x00" "\xff\xff\x62\x00\xff\xff\x6c\x00\xff\xff\x76\x00\xff\xff\x7e\x00" "\xff\xff\x87\x00\xff\xff\x8f\x00\xff\xff\x96\x00\xff\xff\x9d\x00" "\xff\xff\xa4\x00\xff\xff\xaa\x00\xff\xff\xaf\x00\xff\xff\xb4\x00" "\xff\xff\xb9\x00\xff\xff\xbd\x00\xff\xff\xc0\x00\xff\xff\xc3\x00" "\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x05\x00\x00\x00\x13\x00\x00\x00\x20\x00\x58\x00\x2c\x00" "\xff\x00\x38\x00\xff\xca\x44\x00\xff\xff\x4f\x00\xff\xff\x5a\x00" "\xff\xff\x64\x00\xff\xff\x6e\x00\xff\xff\x77\x00\xff\xff\x80\x00" "\xff\xff\x89\x00\xff\xff\x90\x00\xff\xff\x98\x00\xff\xff\x9f\x00" "\xff\xff\xa5\x00\xff\xff\xab\x00\xff\xff\xb0\x00\xff\xff\xb5\x00" "\xff\xff\xba\x00\xff\xff\xbe\x00\xff\xff\xc1\x00\xff\xff\xc4\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x08\x00\x00\x00\x15\x00\x00\x00\x23\x00\x85\x00\x2f\x00" "\xff\x11\x3b\x00\xff\xfe\x47\x00\xff\xff\x52\x00\xff\xff\x5c\x00" "\xff\xff\x66\x00\xff\xff\x70\x00\xff\xff\x79\x00\xff\xff\x82\x00" "\xff\xff\x8a\x00\xff\xff\x92\x00\xff\xff\x99\x00\xff\xff\xa0\x00" "\xff\xff\xa6\x00\xff\xff\xac\x00\xff\xff\xb1\x00\xff\xff\xb6\x00" "\xff\xff\xbb\x00\xff\xff\xbe\x00\xff\xff\xc2\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x0a\x00\x00\x00\x17\x00\x00\x00\x25\x00\xb0\x00\x31\x00" "\xff\x48\x3d\x00\xff\xff\x49\x00\xff\xff\x54\x00\xff\xff\x5e\x00" "\xff\xff\x69\x00\xff\xff\x72\x00\xff\xff\x7b\x00\xff\xff\x84\x00" "\xff\xff\x8c\x00\xff\xff\x93\x00\xff\xff\x9b\x00\xff\xff\xa1\x00" "\xff\xff\xa7\x00\xff\xff\xad\x00\xff\xff\xb2\x00\xff\xff\xb7\x00" "\xff\xff\xbb\x00\xff\xff\xbf\x00\xff\xff\xc2\x00\xff\xff\xc5\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x0c\x00\x00\x00\x1a\x00\x00\x00\x27\x00\xdb\x00\x34\x00" "\xff\x7e\x40\x00\xff\xff\x4b\x00\xff\xff\x56\x00\xff\xff\x60\x00" "\xff\xff\x6a\x00\xff\xff\x74\x00\xff\xff\x7d\x00\xff\xff\x85\x00" "\xff\xff\x8d\x00\xff\xff\x95\x00\xff\xff\x9c\x00\xff\xff\xa3\x00" "\xff\xff\xa9\x00\xff\xff\xae\x00\xff\xff\xb3\x00\xff\xff\xb8\x00" "\xff\xff\xbc\x00\xff\xff\xc0\x00\xff\xff\xc3\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x0e\x00\x00\x00\x1c\x00\x09\x00\x29\x00\xfd\x00\x35\x00" "\xff\xb5\x41\x00\xff\xff\x4c\x00\xff\xff\x57\x00\xff\xff\x62\x00" "\xff\xff\x6c\x00\xff\xff\x75\x00\xff\xff\x7e\x00\xff\xff\x87\x00" "\xff\xff\x8f\x00\xff\xff\x96\x00\xff\xff\x9d\x00\xff\xff\xa4\x00" "\xff\xff\xaa\x00\xff\xff\xaf\x00\xff\xff\xb4\x00\xff\xff\xb9\x00" "\xff\xff\xbd\x00\xff\xff\xc1\x00\xff\xff\xc4\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00" "\x00\x00\x11\x00\x00\x00\x1e\x00\x30\x00\x2b\x00\xff\x01\x37\x00" "\xff\xeb\x43\x00\xff\xff\x4e\x00\xff\xff\x59\x00\xff\xff\x63\x00" "\xff\xff\x6d\x00\xff\xff\x77\x00\xff\xff\x80\x00\xff\xff\x88\x00" "\xff\xff\x90\x00\xff\xff\x97\x00\xff\xff\x9e\x00\xff\xff\xa5\x00" "\xff\xff\xab\x00\xff\xff\xb0\x00\xff\xff\xb5\x00\xff\xff\xba\x00" "\xff\xff\xbe\x00\xff\xff\xc1\x00\xff\xff\xc4\x00\xff\xff\xc7\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00" "\x00\x00\x13\x00\x00\x00\x20\x00\x5b\x00\x2d\x00\xff\x22\x39\x00" "\xff\xff\x45\x00\xff\xff\x50\x00\xff\xff\x5b\x00\xff\xff\x65\x00" "\xff\xff\x6f\x00\xff\xff\x78\x00\xff\xff\x81\x00\xff\xff\x89\x00" "\xff\xff\x91\x00\xff\xff\x99\x00\xff\xff\x9f\x00\xff\xff\xa6\x00" "\xff\xff\xac\x00\xff\xff\xb1\x00\xff\xff\xb6\x00\xff\xff\xba\x00" "\xff\xff\xbe\x00\xff\xff\xc2\x00\xff\xff\xc5\x00\xff\xff\xc7\x00" "\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00" "\x00\x00\x15\x00\x00\x00\x23\x00\x82\x00\x2f\x00\xff\x58\x3b\x00" "\xff\xff\x47\x00\xff\xff\x52\x00\xff\xff\x5d\x00\xff\xff\x67\x00" "\xff\xff\x71\x00\xff\xff\x7a\x00\xff\xff\x82\x00\xff\xff\x8b\x00" "\xff\xff\x92\x00\xff\xff\x9a\x00\xff\xff\xa1\x00\xff\xff\xa7\x00" "\xff\xff\xad\x00\xff\xff\xb2\x00\xff\xff\xb7\x00\xff\xff\xbb\x00" "\xff\xff\xbf\x00\xff\xff\xc2\x00\xff\xff\xc5\x00\xff\xff\xc7\x00" "\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00" "\x00\x00\x17\x00\x00\x00\x24\x00\xa4\x00\x31\x00\xff\x85\x3d\x00" "\xff\xff\x48\x00\xff\xff\x54\x00\xff\xff\x5e\x00\xff\xff\x68\x00" "\xff\xff\x72\x00\xff\xff\x7b\x00\xff\xff\x84\x00\xff\xff\x8c\x00" "\xff\xff\x94\x00\xff\xff\x9b\x00\xff\xff\xa2\x00\xff\xff\xa8\x00" "\xff\xff\xae\x00\xff\xff\xb3\x00\xff\xff\xb7\x00\xff\xff\xbc\x00" "\xff\xff\xbf\x00\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc8\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00" "\x00\x00\x19\x00\x00\x00\x26\x00\xc5\x00\x32\x00\xff\xb0\x3f\x00" "\xff\xff\x4a\x00\xff\xff\x56\x00\xff\xff\x60\x00\xff\xff\x6a\x00" "\xff\xff\x73\x00\xff\xff\x7d\x00\xff\xff\x85\x00\xff\xff\x8d\x00" "\xff\xff\x95\x00\xff\xff\x9c\x00\xff\xff\xa3\x00\xff\xff\xa9\x00" "\xff\xff\xaf\x00\xff\xff\xb4\x00\xff\xff\xb8\x00\xff\xff\xbc\x00" "\xff\xff\xc0\x00\xff\xff\xc3\x00\xff\xff\xc6\x00\xff\xff\xc8\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00" "\x00\x00\x1a\x00\x00\x00\x27\x00\xe6\x00\x34\x00\xff\xdb\x40\x00" "\xff\xff\x4b\x00\xff\xff\x56\x00\xff\xff\x61\x00\xff\xff\x6b\x00" "\xff\xff\x75\x00\xff\xff\x7e\x00\xff\xff\x86\x00\xff\xff\x8e\x00" "\xff\xff\x96\x00\xff\xff\x9d\x00\xff\xff\xa4\x00\xff\xff\xaa\x00" "\xff\xff\xaf\x00\xff\xff\xb4\x00\xff\xff\xb9\x00\xff\xff\xbd\x00" "\xff\xff\xc1\x00\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc8\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00" "\x00\x00\x1c\x00\x09\x00\x29\x00\xff\x09\x36\x00\xff\xfd\x41\x00" "\xff\xff\x4d\x00\xff\xff\x58\x00\xff\xff\x62\x00\xff\xff\x6c\x00" "\xff\xff\x76\x00\xff\xff\x7f\x00\xff\xff\x87\x00\xff\xff\x8f\x00" "\xff\xff\x97\x00\xff\xff\x9e\x00\xff\xff\xa4\x00\xff\xff\xaa\x00" "\xff\xff\xb0\x00\xff\xff\xb5\x00\xff\xff\xb9\x00\xff\xff\xbe\x00" "\xff\xff\xc1\x00\xff\xff\xc4\x00\xff\xff\xc7\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x10\x00" "\x00\x00\x1e\x00\x27\x00\x2b\x00\xff\x30\x37\x00\xff\xff\x43\x00" "\xff\xff\x4e\x00\xff\xff\x59\x00\xff\xff\x64\x00\xff\xff\x6d\x00" "\xff\xff\x77\x00\xff\xff\x80\x00\xff\xff\x88\x00\xff\xff\x90\x00" "\xff\xff\x98\x00\xff\xff\x9f\x00\xff\xff\xa5\x00\xff\xff\xab\x00" "\xff\xff\xb1\x00\xff\xff\xb6\x00\xff\xff\xba\x00\xff\xff\xbe\x00" "\xff\xff\xc1\x00\xff\xff\xc4\x00\xff\xff\xc7\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x12\x00" "\x00\x00\x1f\x00\x48\x00\x2c\x00\xff\x5b\x39\x00\xff\xff\x44\x00" "\xff\xff\x50\x00\xff\xff\x5a\x00\xff\xff\x65\x00\xff\xff\x6f\x00" "\xff\xff\x78\x00\xff\xff\x81\x00\xff\xff\x89\x00\xff\xff\x91\x00" "\xff\xff\x99\x00\xff\xff\xa0\x00\xff\xff\xa6\x00\xff\xff\xac\x00" "\xff\xff\xb1\x00\xff\xff\xb6\x00\xff\xff\xbb\x00\xff\xff\xbe\x00" "\xff\xff\xc2\x00\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc9\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x14\x00" "\x00\x00\x21\x00\x65\x00\x2e\x00\xff\x82\x3a\x00\xff\xff\x46\x00" "\xff\xff\x51\x00\xff\xff\x5c\x00\xff\xff\x67\x00\xff\xff\x70\x00" "\xff\xff\x79\x00\xff\xff\x82\x00\xff\xff\x8a\x00\xff\xff\x92\x00" "\xff\xff\x9a\x00\xff\xff\xa0\x00\xff\xff\xa7\x00\xff\xff\xad\x00" "\xff\xff\xb2\x00\xff\xff\xb7\x00\xff\xff\xbb\x00\xff\xff\xbf\x00" "\xff\xff\xc2\x00\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc9\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x15\x00" "\x00\x00\x22\x00\x7a\x00\x2f\x00\xff\xa4\x3b\x00\xff\xff\x47\x00" "\xff\xff\x52\x00\xff\xff\x5d\x00\xff\xff\x67\x00\xff\xff\x71\x00" "\xff\xff\x7a\x00\xff\xff\x83\x00\xff\xff\x8b\x00\xff\xff\x93\x00" "\xff\xff\x9a\x00\xff\xff\xa1\x00\xff\xff\xa8\x00\xff\xff\xad\x00" "\xff\xff\xb3\x00\xff\xff\xb7\x00\xff\xff\xbc\x00\xff\xff\xbf\x00" "\xff\xff\xc3\x00\xff\xff\xc5\x00\xff\xff\xc8\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x16\x00" "\x00\x00\x23\x00\x8f\x00\x30\x00\xff\xc5\x3c\x00\xff\xff\x48\x00" "\xff\xff\x53\x00\xff\xff\x5e\x00\xff\xff\x68\x00\xff\xff\x72\x00" "\xff\xff\x7b\x00\xff\xff\x84\x00\xff\xff\x8c\x00\xff\xff\x94\x00" "\xff\xff\x9b\x00\xff\xff\xa2\x00\xff\xff\xa8\x00\xff\xff\xae\x00" "\xff\xff\xb3\x00\xff\xff\xb8\x00\xff\xff\xbc\x00\xff\xff\xc0\x00" "\xff\xff\xc3\x00\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x17\x00" "\x00\x00\x24\x00\xa5\x00\x31\x00\xff\xe6\x3d\x00\xff\xff\x49\x00" "\xff\xff\x54\x00\xff\xff\x5f\x00\xff\xff\x69\x00\xff\xff\x73\x00" "\xff\xff\x7c\x00\xff\xff\x85\x00\xff\xff\x8d\x00\xff\xff\x95\x00" "\xff\xff\x9c\x00\xff\xff\xa2\x00\xff\xff\xa9\x00\xff\xff\xae\x00" "\xff\xff\xb3\x00\xff\xff\xb8\x00\xff\xff\xbc\x00\xff\xff\xc0\x00" "\xff\xff\xc3\x00\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x18\x00" "\x00\x00\x25\x00\xba\x09\x32\x00\xff\xff\x3e\x00\xff\xff\x4a\x00" "\xff\xff\x55\x00\xff\xff\x60\x00\xff\xff\x6a\x00\xff\xff\x73\x00" "\xff\xff\x7d\x00\xff\xff\x85\x00\xff\xff\x8d\x00\xff\xff\x95\x00" "\xff\xff\x9c\x00\xff\xff\xa3\x00\xff\xff\xa9\x00\xff\xff\xaf\x00" "\xff\xff\xb4\x00\xff\xff\xb9\x00\xff\xff\xbd\x00\xff\xff\xc0\x00" "\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x19\x00" "\x00\x00\x26\x00\xcf\x27\x33\x00\xff\xff\x3f\x00\xff\xff\x4b\x00" "\xff\xff\x56\x00\xff\xff\x60\x00\xff\xff\x6b\x00\xff\xff\x74\x00" "\xff\xff\x7d\x00\xff\xff\x86\x00\xff\xff\x8e\x00\xff\xff\x96\x00" "\xff\xff\x9d\x00\xff\xff\xa3\x00\xff\xff\xaa\x00\xff\xff\xaf\x00" "\xff\xff\xb4\x00\xff\xff\xb9\x00\xff\xff\xbd\x00\xff\xff\xc1\x00" "\xff\xff\xc4\x00\xff\xff\xc6\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x00\x00\x1a\x00" "\x00\x00\x27\x00\xe4\x48\x34\x00\xff\xff\x40\x00\xff\xff\x4c\x00" "\xff\xff\x57\x00\xff\xff\x61\x00\xff\xff\x6b\x00\xff\xff\x75\x00" "\xff\xff\x7e\x00\xff\xff\x87\x00\xff\xff\x8f\x00\xff\xff\x96\x00" "\xff\xff\x9d\x00\xff\xff\xa4\x00\xff\xff\xaa\x00\xff\xff\xb0\x00" "\xff\xff\xb5\x00\xff\xff\xb9\x00\xff\xff\xbd\x00\xff\xff\xc1\x00" "\xff\xff\xc4\x00\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x1b\x00" "\x01\x00\x28\x00\xfa\x65\x35\x00\xff\xff\x41\x00\xff\xff\x4d\x00" "\xff\xff\x58\x00\xff\xff\x62\x00\xff\xff\x6c\x00\xff\xff\x76\x00" "\xff\xff\x7f\x00\xff\xff\x87\x00\xff\xff\x8f\x00\xff\xff\x97\x00" "\xff\xff\x9e\x00\xff\xff\xa4\x00\xff\xff\xab\x00\xff\xff\xb0\x00" "\xff\xff\xb5\x00\xff\xff\xba\x00\xff\xff\xbe\x00\xff\xff\xc1\x00" "\xff\xff\xc4\x00\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0f\x00\x00\x00\x1c\x00" "\x0f\x00\x2a\x00\xff\x7a\x36\x00\xff\xff\x42\x00\xff\xff\x4e\x00" "\xff\xff\x59\x00\xff\xff\x63\x00\xff\xff\x6d\x00\xff\xff\x77\x00" "\xff\xff\x80\x00\xff\xff\x88\x00\xff\xff\x90\x00\xff\xff\x98\x00" "\xff\xff\x9f\x00\xff\xff\xa5\x00\xff\xff\xab\x00\xff\xff\xb1\x00" "\xff\xff\xb5\x00\xff\xff\xba\x00\xff\xff\xbe\x00\xff\xff\xc1\x00" "\xff\xff\xc4\x00\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x10\x00\x00\x00\x1e\x00" "\x24\x00\x2b\x00\xff\x8f\x37\x00\xff\xff\x43\x00\xff\xff\x4f\x00" "\xff\xff\x59\x00\xff\xff\x64\x00\xff\xff\x6e\x00\xff\xff\x77\x00" "\xff\xff\x80\x00\xff\xff\x89\x00\xff\xff\x91\x00\xff\xff\x98\x00" "\xff\xff\x9f\x00\xff\xff\xa6\x00\xff\xff\xab\x00\xff\xff\xb1\x00" "\xff\xff\xb6\x00\xff\xff\xba\x00\xff\xff\xbe\x00\xff\xff\xc2\x00" "\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x11\x00\x00\x00\x1f\x00" "\x3a\x00\x2c\x00\xff\xa5\x38\x00\xff\xff\x44\x00\xff\xff\x50\x00" "\xff\xff\x5a\x00\xff\xff\x65\x00\xff\xff\x6f\x00\xff\xff\x78\x00" "\xff\xff\x81\x00\xff\xff\x89\x00\xff\xff\x91\x00\xff\xff\x99\x00" "\xff\xff\xa0\x00\xff\xff\xa6\x00\xff\xff\xac\x00\xff\xff\xb1\x00" "\xff\xff\xb6\x00\xff\xff\xbb\x00\xff\xff\xbf\x00\xff\xff\xc2\x00" "\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x12\x00\x00\x00\x20\x00" "\x4f\x00\x2d\x00\xff\xba\x39\x00\xff\xff\x45\x00\xff\xff\x50\x00" "\xff\xff\x5b\x00\xff\xff\x66\x00\xff\xff\x6f\x00\xff\xff\x79\x00" "\xff\xff\x82\x00\xff\xff\x8a\x00\xff\xff\x92\x00\xff\xff\x99\x00" "\xff\xff\xa0\x00\xff\xff\xa7\x00\xff\xff\xac\x00\xff\xff\xb2\x00" "\xff\xff\xb7\x00\xff\xff\xbb\x00\xff\xff\xbf\x00\xff\xff\xc2\x00" "\xff\xff\xc5\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x14\x00\x00\x00\x21\x00" "\x64\x00\x2e\x00\xff\xcf\x3a\x00\xff\xff\x46\x00\xff\xff\x51\x00" "\xff\xff\x5c\x00\xff\xff\x66\x00\xff\xff\x70\x00\xff\xff\x7a\x00" "\xff\xff\x82\x00\xff\xff\x8b\x00\xff\xff\x93\x00\xff\xff\x9a\x00" "\xff\xff\xa1\x00\xff\xff\xa7\x00\xff\xff\xad\x00\xff\xff\xb2\x00" "\xff\xff\xb7\x00\xff\xff\xbb\x00\xff\xff\xbf\x00\xff\xff\xc3\x00" "\xff\xff\xc5\x00\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x15\x00\x00\x00\x22\x00" "\x79\x00\x2f\x00\xff\xe4\x3b\x00\xff\xff\x47\x00\xff\xff\x52\x00" "\xff\xff\x5d\x00\xff\xff\x67\x00\xff\xff\x71\x00\xff\xff\x7a\x00" "\xff\xff\x83\x00\xff\xff\x8b\x00\xff\xff\x93\x00\xff\xff\x9a\x00" "\xff\xff\xa1\x00\xff\xff\xa8\x00\xff\xff\xad\x00\xff\xff\xb3\x00" "\xff\xff\xb7\x00\xff\xff\xbc\x00\xff\xff\xc0\x00\xff\xff\xc3\x00" "\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x16\x00\x00\x00\x23\x00" "\x8f\x01\x30\x00\xff\xfa\x3c\x00\xff\xff\x48\x00\xff\xff\x53\x00" "\xff\xff\x5e\x00\xff\xff\x68\x00\xff\xff\x72\x00\xff\xff\x7b\x00" "\xff\xff\x84\x00\xff\xff\x8c\x00\xff\xff\x94\x00\xff\xff\x9b\x00" "\xff\xff\xa2\x00\xff\xff\xa8\x00\xff\xff\xae\x00\xff\xff\xb3\x00" "\xff\xff\xb8\x00\xff\xff\xbc\x00\xff\xff\xc0\x00\xff\xff\xc3\x00" "\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x17\x00\x00\x00\x24\x00" "\xa1\x0f\x31\x00\xff\xff\x3d\x00\xff\xff\x49\x00\xff\xff\x54\x00" "\xff\xff\x5f\x00\xff\xff\x69\x00\xff\xff\x73\x00\xff\xff\x7c\x00" "\xff\xff\x85\x00\xff\xff\x8d\x00\xff\xff\x95\x00\xff\xff\x9c\x00" "\xff\xff\xa2\x00\xff\xff\xa9\x00\xff\xff\xae\x00\xff\xff\xb3\x00" "\xff\xff\xb8\x00\xff\xff\xbc\x00\xff\xff\xc0\x00\xff\xff\xc3\x00" "\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x17\x00\x00\x00\x25\x00" "\xac\x24\x31\x00\xff\xff\x3e\x00\xff\xff\x49\x00\xff\xff\x54\x00" "\xff\xff\x5f\x00\xff\xff\x69\x00\xff\xff\x73\x00\xff\xff\x7c\x00" "\xff\xff\x85\x00\xff\xff\x8d\x00\xff\xff\x95\x00\xff\xff\x9c\x00" "\xff\xff\xa3\x00\xff\xff\xa9\x00\xff\xff\xaf\x00\xff\xff\xb4\x00" "\xff\xff\xb9\x00\xff\xff\xbd\x00\xff\xff\xc0\x00\xff\xff\xc4\x00" "\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x18\x00\x00\x00\x25\x00" "\xb6\x3a\x32\x00\xff\xff\x3e\x00\xff\xff\x4a\x00\xff\xff\x55\x00" "\xff\xff\x60\x00\xff\xff\x6a\x00\xff\xff\x74\x00\xff\xff\x7d\x00" "\xff\xff\x85\x00\xff\xff\x8e\x00\xff\xff\x95\x00\xff\xff\x9c\x00" "\xff\xff\xa3\x00\xff\xff\xa9\x00\xff\xff\xaf\x00\xff\xff\xb4\x00" "\xff\xff\xb9\x00\xff\xff\xbd\x00\xff\xff\xc1\x00\xff\xff\xc4\x00" "\xff\xff\xc6\x00\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x18\x00\x00\x00\x26\x00" "\xc0\x4f\x32\x00\xff\xff\x3e\x00\xff\xff\x4a\x00\xff\xff\x55\x00" "\xff\xff\x60\x00\xff\xff\x6a\x00\xff\xff\x74\x00\xff\xff\x7d\x00" "\xff\xff\x86\x00\xff\xff\x8e\x00\xff\xff\x96\x00\xff\xff\x9d\x00" "\xff\xff\xa3\x00\xff\xff\xa9\x00\xff\xff\xaf\x00\xff\xff\xb4\x00" "\xff\xff\xb9\x00\xff\xff\xbd\x00\xff\xff\xc1\x00\xff\xff\xc4\x00" "\xff\xff\xc6\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x19\x00\x00\x00\x26\x00" "\xca\x64\x33\x00\xff\xff\x3f\x00\xff\xff\x4b\x00\xff\xff\x56\x00" "\xff\xff\x60\x00\xff\xff\x6b\x00\xff\xff\x74\x00\xff\xff\x7d\x00" "\xff\xff\x86\x00\xff\xff\x8e\x00\xff\xff\x96\x00\xff\xff\x9d\x00" "\xff\xff\xa4\x00\xff\xff\xaa\x00\xff\xff\xaf\x00\xff\xff\xb4\x00" "\xff\xff\xb9\x00\xff\xff\xbd\x00\xff\xff\xc1\x00\xff\xff\xc4\x00" "\xff\xff\xc6\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x19\x00\x00\x00\x27\x00" "\xd4\x79\x33\x00\xff\xff\x3f\x00\xff\xff\x4b\x00\xff\xff\x56\x00" "\xff\xff\x61\x00\xff\xff\x6b\x00\xff\xff\x75\x00\xff\xff\x7e\x00" "\xff\xff\x86\x00\xff\xff\x8f\x00\xff\xff\x96\x00\xff\xff\x9d\x00" "\xff\xff\xa4\x00\xff\xff\xaa\x00\xff\xff\xb0\x00\xff\xff\xb5\x00" "\xff\xff\xb9\x00\xff\xff\xbd\x00\xff\xff\xc1\x00\xff\xff\xc4\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x1a\x00\x00\x00\x27\x00" "\xde\x8f\x34\x00\xff\xff\x40\x00\xff\xff\x4b\x00\xff\xff\x57\x00" "\xff\xff\x61\x00\xff\xff\x6b\x00\xff\xff\x75\x00\xff\xff\x7e\x00" "\xff\xff\x87\x00\xff\xff\x8f\x00\xff\xff\x96\x00\xff\xff\x9d\x00" "\xff\xff\xa4\x00\xff\xff\xaa\x00\xff\xff\xb0\x00\xff\xff\xb5\x00" "\xff\xff\xb9\x00\xff\xff\xbd\x00\xff\xff\xc1\x00\xff\xff\xc4\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x0d\x00\x00\x00\x1a\x00\x00\x00\x28\x00" "\xe8\xa1\x34\x00\xff\xff\x40\x00\xff\xff\x4c\x00\xff\xff\x57\x00" "\xff\xff\x62\x00\xff\xff\x6c\x00\xff\xff\x75\x00\xff\xff\x7e\x00" "\xff\xff\x87\x00\xff\xff\x8f\x00\xff\xff\x97\x00\xff\xff\x9e\x00" "\xff\xff\xa4\x00\xff\xff\xaa\x00\xff\xff\xb0\x00\xff\xff\xb5\x00" "\xff\xff\xba\x00\xff\xff\xbe\x00\xff\xff\xc1\x00\xff\xff\xc4\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x0d\x00\x00\x00\x1b\x00\x00\x00\x28\x00" "\xf2\xac\x35\x00\xff\xff\x41\x00\xff\xff\x4c\x00\xff\xff\x57\x00" "\xff\xff\x62\x00\xff\xff\x6c\x00\xff\xff\x76\x00\xff\xff\x7f\x00" "\xff\xff\x87\x00\xff\xff\x8f\x00\xff\xff\x97\x00\xff\xff\x9e\x00" "\xff\xff\xa5\x00\xff\xff\xab\x00\xff\xff\xb0\x00\xff\xff\xb5\x00" "\xff\xff\xba\x00\xff\xff\xbe\x00\xff\xff\xc1\x00\xff\xff\xc4\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x1b\x00\x01\x00\x29\x00" "\xfc\xb6\x35\x00\xff\xff\x41\x00\xff\xff\x4d\x00\xff\xff\x58\x00" "\xff\xff\x62\x00\xff\xff\x6d\x00\xff\xff\x76\x00\xff\xff\x7f\x00" "\xff\xff\x88\x00\xff\xff\x90\x00\xff\xff\x97\x00\xff\xff\x9e\x00" "\xff\xff\xa5\x00\xff\xff\xab\x00\xff\xff\xb0\x00\xff\xff\xb5\x00" "\xff\xff\xba\x00\xff\xff\xbe\x00\xff\xff\xc1\x00\xff\xff\xc4\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x1c\x00\x06\x00\x29\x00" "\xff\xc0\x36\x00\xff\xff\x42\x00\xff\xff\x4d\x00\xff\xff\x58\x00" "\xff\xff\x63\x00\xff\xff\x6d\x00\xff\xff\x76\x00\xff\xff\x7f\x00" "\xff\xff\x88\x00\xff\xff\x90\x00\xff\xff\x98\x00\xff\xff\x9f\x00" "\xff\xff\xa5\x00\xff\xff\xab\x00\xff\xff\xb1\x00\xff\xff\xb6\x00" "\xff\xff\xba\x00\xff\xff\xbe\x00\xff\xff\xc2\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x0f\x00\x00\x00\x1d\x00\x10\x00\x2a\x00" "\xff\xca\x36\x00\xff\xff\x42\x00\xff\xff\x4e\x00\xff\xff\x59\x00" "\xff\xff\x63\x00\xff\xff\x6d\x00\xff\xff\x77\x00\xff\xff\x80\x00" "\xff\xff\x88\x00\xff\xff\x90\x00\xff\xff\x98\x00\xff\xff\x9f\x00" "\xff\xff\xa5\x00\xff\xff\xab\x00\xff\xff\xb1\x00\xff\xff\xb6\x00" "\xff\xff\xba\x00\xff\xff\xbe\x00\xff\xff\xc2\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x10\x00\x00\x00\x1d\x00\x1a\x00\x2a\x00" "\xff\xd4\x37\x00\xff\xff\x43\x00\xff\xff\x4e\x00\xff\xff\x59\x00" "\xff\xff\x64\x00\xff\xff\x6e\x00\xff\xff\x77\x00\xff\xff\x80\x00" "\xff\xff\x89\x00\xff\xff\x91\x00\xff\xff\x98\x00\xff\xff\x9f\x00" "\xff\xff\xa6\x00\xff\xff\xac\x00\xff\xff\xb1\x00\xff\xff\xb6\x00" "\xff\xff\xba\x00\xff\xff\xbe\x00\xff\xff\xc2\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x10\x00\x00\x00\x1e\x00\x24\x00\x2b\x00" "\xff\xde\x37\x00\xff\xff\x43\x00\xff\xff\x4f\x00\xff\xff\x5a\x00" "\xff\xff\x64\x00\xff\xff\x6e\x00\xff\xff\x78\x00\xff\xff\x81\x00" "\xff\xff\x89\x00\xff\xff\x91\x00\xff\xff\x98\x00\xff\xff\x9f\x00" "\xff\xff\xa6\x00\xff\xff\xac\x00\xff\xff\xb1\x00\xff\xff\xb6\x00" "\xff\xff\xbb\x00\xff\xff\xbf\x00\xff\xff\xc2\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x11\x00\x00\x00\x1e\x00\x2e\x00\x2b\x00" "\xff\xe8\x38\x00\xff\xff\x44\x00\xff\xff\x4f\x00\xff\xff\x5a\x00" "\xff\xff\x64\x00\xff\xff\x6e\x00\xff\xff\x78\x00\xff\xff\x81\x00" "\xff\xff\x89\x00\xff\xff\x91\x00\xff\xff\x99\x00\xff\xff\xa0\x00" "\xff\xff\xa6\x00\xff\xff\xac\x00\xff\xff\xb1\x00\xff\xff\xb6\x00" "\xff\xff\xbb\x00\xff\xff\xbf\x00\xff\xff\xc2\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x11\x00\x00\x00\x1f\x00\x38\x00\x2c\x00" "\xff\xf2\x38\x00\xff\xff\x44\x00\xff\xff\x4f\x00\xff\xff\x5a\x00" "\xff\xff\x65\x00\xff\xff\x6f\x00\xff\xff\x78\x00\xff\xff\x81\x00" "\xff\xff\x8a\x00\xff\xff\x92\x00\xff\xff\x99\x00\xff\xff\xa0\x00" "\xff\xff\xa6\x00\xff\xff\xac\x00\xff\xff\xb2\x00\xff\xff\xb6\x00" "\xff\xff\xbb\x00\xff\xff\xbf\x00\xff\xff\xc2\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x12\x00\x00\x00\x1f\x00\x42\x01\x2c\x00" "\xff\xfc\x39\x00\xff\xff\x44\x00\xff\xff\x50\x00\xff\xff\x5b\x00" "\xff\xff\x65\x00\xff\xff\x6f\x00\xff\xff\x79\x00\xff\xff\x82\x00" "\xff\xff\x8a\x00\xff\xff\x92\x00\xff\xff\x99\x00\xff\xff\xa0\x00" "\xff\xff\xa7\x00\xff\xff\xac\x00\xff\xff\xb2\x00\xff\xff\xb7\x00" "\xff\xff\xbb\x00\xff\xff\xbf\x00\xff\xff\xc2\x00\xff\xff\xc5\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x12\x00\x00\x00\x20\x00\x4c\x06\x2d\x00" "\xff\xff\x39\x00\xff\xff\x45\x00\xff\xff\x50\x00\xff\xff\x5b\x00" "\xff\xff\x66\x00\xff\xff\x70\x00\xff\xff\x79\x00\xff\xff\x82\x00" "\xff\xff\x8a\x00\xff\xff\x92\x00\xff\xff\x9a\x00\xff\xff\xa0\x00" "\xff\xff\xa7\x00\xff\xff\xad\x00\xff\xff\xb2\x00\xff\xff\xb7\x00" "\xff\xff\xbb\x00\xff\xff\xbf\x00\xff\xff\xc2\x00\xff\xff\xc5\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x12\x00\x00\x00\x20\x00\x4f\x10\x2d\x00" "\xff\xff\x39\x00\xff\xff\x45\x00\xff\xff\x50\x00\xff\xff\x5b\x00" "\xff\xff\x66\x00\xff\xff\x70\x00\xff\xff\x79\x00\xff\xff\x82\x00" "\xff\xff\x8a\x00\xff\xff\x92\x00\xff\xff\x9a\x00\xff\xff\xa1\x00" "\xff\xff\xa7\x00\xff\xff\xad\x00\xff\xff\xb2\x00\xff\xff\xb7\x00" "\xff\xff\xbb\x00\xff\xff\xbf\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x13\x00\x00\x00\x20\x00\x52\x1a\x2d\x00" "\xff\xff\x39\x00\xff\xff\x45\x00\xff\xff\x51\x00\xff\xff\x5c\x00" "\xff\xff\x66\x00\xff\xff\x70\x00\xff\xff\x79\x00\xff\xff\x82\x00" "\xff\xff\x8a\x00\xff\xff\x92\x00\xff\xff\x9a\x00\xff\xff\xa1\x00" "\xff\xff\xa7\x00\xff\xff\xad\x00\xff\xff\xb2\x00\xff\xff\xb7\x00" "\xff\xff\xbb\x00\xff\xff\xbf\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x13\x00\x00\x00\x20\x00\x55\x24\x2d\x00" "\xff\xff\x39\x00\xff\xff\x45\x00\xff\xff\x51\x00\xff\xff\x5c\x00" "\xff\xff\x66\x00\xff\xff\x70\x00\xff\xff\x79\x00\xff\xff\x82\x00" "\xff\xff\x8b\x00\xff\xff\x92\x00\xff\xff\x9a\x00\xff\xff\xa1\x00" "\xff\xff\xa7\x00\xff\xff\xad\x00\xff\xff\xb2\x00\xff\xff\xb7\x00" "\xff\xff\xbb\x00\xff\xff\xbf\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x05\x00\x00\x00\x13\x00\x00\x00\x20\x00\x58\x2e\x2d\x00" "\xff\xff\x3a\x00\xff\xff\x45\x00\xff\xff\x51\x00\xff\xff\x5c\x00" "\xff\xff\x66\x00\xff\xff\x70\x00\xff\xff\x79\x00\xff\xff\x82\x00" "\xff\xff\x8b\x00\xff\xff\x93\x00\xff\xff\x9a\x00\xff\xff\xa1\x00" "\xff\xff\xa7\x00\xff\xff\xad\x00\xff\xff\xb2\x00\xff\xff\xb7\x00" "\xff\xff\xbb\x00\xff\xff\xbf\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x05\x00\x00\x00\x13\x00\x00\x00\x20\x00\x5a\x38\x2d\x00" "\xff\xff\x3a\x00\xff\xff\x46\x00\xff\xff\x51\x00\xff\xff\x5c\x00" "\xff\xff\x66\x00\xff\xff\x70\x00\xff\xff\x79\x00\xff\xff\x82\x00" "\xff\xff\x8b\x00\xff\xff\x93\x00\xff\xff\x9a\x00\xff\xff\xa1\x00" "\xff\xff\xa7\x00\xff\xff\xad\x00\xff\xff\xb2\x00\xff\xff\xb7\x00" "\xff\xff\xbc\x00\xff\xff\xbf\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x05\x00\x00\x00\x13\x00\x00\x00\x21\x00\x5d\x42\x2d\x00" "\xff\xff\x3a\x00\xff\xff\x46\x00\xff\xff\x51\x00\xff\xff\x5c\x00" "\xff\xff\x66\x00\xff\xff\x70\x00\xff\xff\x7a\x00\xff\xff\x82\x00" "\xff\xff\x8b\x00\xff\xff\x93\x00\xff\xff\x9a\x00\xff\xff\xa1\x00" "\xff\xff\xa7\x00\xff\xff\xad\x00\xff\xff\xb2\x00\xff\xff\xb7\x00" "\xff\xff\xbc\x00\xff\xff\xbf\x00\xff\xff\xc3\x00\xff\xff\xc5\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x05\x00\x00\x00\x13\x00\x00\x00\x21\x00\x60\x4c\x2e\x00" "\xff\xff\x3a\x00\xff\xff\x46\x00\xff\xff\x51\x00\xff\xff\x5c\x00" "\xff\xff\x66\x00\xff\xff\x70\x00\xff\xff\x7a\x00\xff\xff\x83\x00" "\xff\xff\x8b\x00\xff\xff\x93\x00\xff\xff\x9a\x00\xff\xff\xa1\x00" "\xff\xff\xa7\x00\xff\xff\xad\x00\xff\xff\xb2\x00\xff\xff\xb7\x00" "\xff\xff\xbc\x00\xff\xff\xbf\x00\xff\xff\xc3\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x05\x00\x00\x00\x13\x00\x00\x00\x21\x00\x62\x4f\x2e\x00" "\xff\xff\x3a\x00\xff\xff\x46\x00\xff\xff\x51\x00\xff\xff\x5c\x00" "\xff\xff\x67\x00\xff\xff\x70\x00\xff\xff\x7a\x00\xff\xff\x83\x00" "\xff\xff\x8b\x00\xff\xff\x93\x00\xff\xff\x9a\x00\xff\xff\xa1\x00" "\xff\xff\xa7\x00\xff\xff\xad\x00\xff\xff\xb2\x00\xff\xff\xb7\x00" "\xff\xff\xbc\x00\xff\xff\xbf\x00\xff\xff\xc3\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x05\x00\x00\x00\x14\x00\x00\x00\x21\x00\x65\x52\x2e\x00" "\xff\xff\x3a\x00\xff\xff\x46\x00\xff\xff\x51\x00\xff\xff\x5c\x00" "\xff\xff\x67\x00\xff\xff\x71\x00\xff\xff\x7a\x00\xff\xff\x83\x00" "\xff\xff\x8b\x00\xff\xff\x93\x00\xff\xff\x9a\x00\xff\xff\xa1\x00" "\xff\xff\xa7\x00\xff\xff\xad\x00\xff\xff\xb3\x00\xff\xff\xb7\x00" "\xff\xff\xbc\x00\xff\xff\xbf\x00\xff\xff\xc3\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x06\x00\x00\x00\x14\x00\x00\x00\x21\x00\x68\x55\x2e\x00" "\xff\xff\x3a\x00\xff\xff\x46\x00\xff\xff\x52\x00\xff\xff\x5c\x00" "\xff\xff\x67\x00\xff\xff\x71\x00\xff\xff\x7a\x00\xff\xff\x83\x00" "\xff\xff\x8b\x00\xff\xff\x93\x00\xff\xff\x9a\x00\xff\xff\xa1\x00" "\xff\xff\xa7\x00\xff\xff\xad\x00\xff\xff\xb3\x00\xff\xff\xb7\x00" "\xff\xff\xbc\x00\xff\xff\xc0\x00\xff\xff\xc3\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x06\x00\x00\x00\x14\x00\x00\x00\x21\x00\x6b\x58\x2e\x00" "\xff\xff\x3a\x00\xff\xff\x46\x00\xff\xff\x52\x00\xff\xff\x5d\x00" "\xff\xff\x67\x00\xff\xff\x71\x00\xff\xff\x7a\x00\xff\xff\x83\x00" "\xff\xff\x8b\x00\xff\xff\x93\x00\xff\xff\x9a\x00\xff\xff\xa1\x00" "\xff\xff\xa8\x00\xff\xff\xad\x00\xff\xff\xb3\x00\xff\xff\xb7\x00" "\xff\xff\xbc\x00\xff\xff\xc0\x00\xff\xff\xc3\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x06\x00\x00\x00\x14\x00\x00\x00\x21\x00\x6d\x5a\x2e\x00" "\xff\xff\x3b\x00\xff\xff\x46\x00\xff\xff\x52\x00\xff\xff\x5d\x00" "\xff\xff\x67\x00\xff\xff\x71\x00\xff\xff\x7a\x00\xff\xff\x83\x00" "\xff\xff\x8b\x00\xff\xff\x93\x00\xff\xff\x9a\x00\xff\xff\xa1\x00" "\xff\xff\xa8\x00\xff\xff\xad\x00\xff\xff\xb3\x00\xff\xff\xb8\x00" "\xff\xff\xbc\x00\xff\xff\xc0\x00\xff\xff\xc3\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x07\x00\x00\x00\x14\x00\x00\x00\x22\x00\x70\x5d\x2e\x00" "\xff\xff\x3b\x00\xff\xff\x47\x00\xff\xff\x52\x00\xff\xff\x5d\x00" "\xff\xff\x67\x00\xff\xff\x71\x00\xff\xff\x7a\x00\xff\xff\x83\x00" "\xff\xff\x8b\x00\xff\xff\x93\x00\xff\xff\x9b\x00\xff\xff\xa1\x00" "\xff\xff\xa8\x00\xff\xff\xad\x00\xff\xff\xb3\x00\xff\xff\xb8\x00" "\xff\xff\xbc\x00\xff\xff\xc0\x00\xff\xff\xc3\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x07\x00\x00\x00\x14\x00\x00\x00\x22\x00\x73\x60\x2f\x00" "\xff\xff\x3b\x00\xff\xff\x47\x00\xff\xff\x52\x00\xff\xff\x5d\x00" "\xff\xff\x67\x00\xff\xff\x71\x00\xff\xff\x7a\x00\xff\xff\x83\x00" "\xff\xff\x8c\x00\xff\xff\x93\x00\xff\xff\x9b\x00\xff\xff\xa1\x00" "\xff\xff\xa8\x00\xff\xff\xae\x00\xff\xff\xb3\x00\xff\xff\xb8\x00" "\xff\xff\xbc\x00\xff\xff\xc0\x00\xff\xff\xc3\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x07\x00\x00\x00\x14\x00\x00\x00\x22\x00\x75\x62\x2f\x00" "\xff\xff\x3b\x00\xff\xff\x47\x00\xff\xff\x52\x00\xff\xff\x5d\x00" "\xff\xff\x67\x00\xff\xff\x71\x00\xff\xff\x7a\x00\xff\xff\x83\x00" "\xff\xff\x8c\x00\xff\xff\x93\x00\xff\xff\x9b\x00\xff\xff\xa1\x00" "\xff\xff\xa8\x00\xff\xff\xae\x00\xff\xff\xb3\x00\xff\xff\xb8\x00" "\xff\xff\xbc\x00\xff\xff\xc0\x00\xff\xff\xc3\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" // Mipmap level 2. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x10\x00\x00\x00" "\x26\x00\x00\x00\x3b\x00\x00\x00\x51\x00\x00\x00\x66\x00\x01\x00" "\x7c\x00\x03\x00\x90\x00\x04\x00\x9b\x00\x05\x00\xa5\x00\x06\x00" "\xb0\x00\x07\x00\xba\x00\x08\x00\xc4\x00\x0a\x00\xce\x00\x0b\x00" "\xd9\x00\x0c\x00\xe3\x00\x0c\x00\xea\x00\x0c\x00\xec\x00\x0d\x00" "\xef\x00\x0d\x00\xf1\x00\x0d\x00\xf4\x00\x0d\x00\xf6\x00\x0e\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00" "\x27\x00\x00\x00\x4c\x00\x01\x00\x71\x00\x05\x00\x96\x00\x09\x00" "\xbb\x00\x0d\x00\xdf\x00\x0f\x00\xfa\x00\x12\x00\xff\x00\x14\x00" "\xff\x00\x16\x00\xff\x00\x18\x00\xff\x00\x1b\x00\xff\x00\x1d\x00" "\xff\x00\x1e\x00\xff\x00\x1f\x00\xff\x00\x20\x00\xff\x00\x21\x00" "\xff\x00\x23\x00\xff\x00\x24\x00\xff\x00\x25\x00\xff\x00\x26\x00" "\xff\x00\x27\x00\xff\x00\x27\x00\xff\x00\x27\x00\xff\x00\x27\x00" "\xff\x00\x28\x00\xff\x00\x28\x00\xff\x00\x28\x00\xff\x00\x28\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00" "\x51\x00\x06\x00\x8f\x00\x0d\x00\xcc\x00\x11\x00\xfc\x00\x15\x00" "\xff\x00\x19\x00\xff\x00\x1d\x00\xff\x00\x21\x00\xff\x00\x25\x00" "\xff\x00\x28\x00\xff\x00\x2a\x00\xff\x00\x2c\x00\xff\x00\x2e\x00" "\xff\x00\x30\x00\xff\x00\x32\x00\xff\x00\x34\x00\xff\x00\x37\x00" "\xff\x00\x38\x00\xff\x00\x39\x00\xff\x00\x3a\x00\xff\x00\x3b\x00" "\xff\x00\x3c\x00\xff\x00\x3d\x00\xff\x00\x3e\x00\xff\x00\x3f\x00" "\xff\x00\x3f\x00\xff\x00\x40\x00\xff\x00\x40\x00\xff\x00\x40\x00" "\xff\x00\x40\x00\xff\x00\x41\x00\xff\x00\x41\x00\xff\x00\x41\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00" "\x41\x00\x07\x00\x97\x00\x0f\x00\xd6\x00\x15\x00\xff\x00\x1c\x00" "\xff\x00\x22\x00\xff\x00\x28\x00\xff\x00\x2c\x00\xff\x00\x2f\x00" "\xff\x00\x33\x00\xff\x00\x37\x00\xff\x00\x3a\x00\xff\x00\x3e\x00" "\xff\x00\x40\x00\xff\x00\x42\x00\xff\x00\x44\x00\xff\x00\x46\x00" "\xff\x00\x48\x00\xff\x00\x4a\x00\xff\x00\x4c\x00\xff\x00\x4e\x00" "\xff\x01\x4f\x00\xff\x10\x50\x00\xff\x1b\x51\x00\xff\x25\x52\x00" "\xff\x30\x53\x00\xff\x3a\x54\x00\xff\x44\x55\x00\xff\x4e\x55\x00" "\xff\x59\x56\x00\xff\x63\x56\x00\xff\x6a\x57\x00\xff\x6c\x57\x00" "\xff\x6f\x57\x00\xff\x71\x57\x00\xff\x74\x57\x00\xff\x76\x58\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x28\x00\x07\x00\x85\x00\x13\x00\xe1\x00\x1c\x00" "\xff\x00\x23\x00\xff\x00\x28\x00\xff\x00\x2f\x00\xff\x00\x35\x00" "\xff\x00\x3b\x00\xff\x00\x40\x00\xff\x00\x44\x00\xff\x00\x47\x00" "\xff\x00\x4b\x00\xff\x00\x4e\x00\xff\x01\x51\x00\xff\x16\x55\x00" "\xff\x3b\x57\x00\xff\x5f\x59\x00\xff\x7b\x5b\x00\xff\x90\x5d\x00" "\xff\xa6\x5e\x00\xff\xbb\x60\x00\xff\xd1\x62\x00\xff\xe6\x64\x00" "\xff\xfb\x65\x00\xff\xff\x65\x00\xff\xff\x66\x00\xff\xff\x67\x00" "\xff\xff\x68\x00\xff\xff\x69\x00\xff\xff\x69\x00\xff\xff\x6a\x00" "\xff\xff\x6b\x00\xff\xff\x6b\x00\xff\xff\x6b\x00\xff\xff\x6c\x00" "\xff\xff\x6c\x00\xff\xff\x6c\x00\xff\xff\x6c\x00\xff\xff\x6c\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x45\x00\x10\x00" "\xc7\x00\x1a\x00\xff\x00\x23\x00\xff\x00\x2d\x00\xff\x00\x34\x00" "\xff\x00\x3b\x00\xff\x00\x41\x00\xff\x00\x47\x00\xff\x00\x4b\x00" "\xff\x00\x51\x00\xff\x11\x56\x00\xff\x4c\x5a\x00\xff\x81\x5d\x00" "\xff\xa7\x60\x00\xff\xcc\x63\x00\xff\xf1\x66\x00\xff\xff\x69\x00" "\xff\xff\x6c\x00\xff\xff\x6e\x00\xff\xff\x6f\x00\xff\xff\x71\x00" "\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x77\x00" "\xff\xff\x78\x00\xff\xff\x79\x00\xff\xff\x7a\x00\xff\xff\x7a\x00" "\xff\xff\x7b\x00\xff\xff\x7c\x00\xff\xff\x7c\x00\xff\xff\x7d\x00" "\xff\xff\x7e\x00\xff\xff\x7e\x00\xff\xff\x7e\x00\xff\xff\x7e\x00" "\xff\xff\x7e\x00\xff\xff\x7f\x00\xff\xff\x7f\x00\xff\xff\x7f\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x2c\x00\x11\x00\xb7\x00\x1e\x00\xff\x00\x28\x00" "\xff\x00\x34\x00\xff\x00\x3a\x00\xff\x00\x41\x00\xff\x00\x49\x00" "\xff\x00\x51\x00\xff\x18\x58\x00\xff\x56\x5c\x00\xff\x94\x60\x00" "\xff\xd1\x65\x00\xff\xfe\x6a\x00\xff\xff\x6f\x00\xff\xff\x71\x00" "\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x79\x00\xff\xff\x7c\x00" "\xff\xff\x7e\x00\xff\xff\x80\x00\xff\xff\x81\x00\xff\xff\x83\x00" "\xff\xff\x84\x00\xff\xff\x86\x00\xff\xff\x87\x00\xff\xff\x89\x00" "\xff\xff\x89\x00\xff\xff\x8a\x00\xff\xff\x8b\x00\xff\xff\x8b\x00" "\xff\xff\x8c\x00\xff\xff\x8d\x00\xff\xff\x8d\x00\xff\xff\x8e\x00" "\xff\xff\x8f\x00\xff\xff\x8f\x00\xff\xff\x8f\x00\xff\xff\x8f\x00" "\xff\xff\x8f\x00\xff\xff\x8f\x00\xff\xff\x8f\x00\xff\xff\x90\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x0d\x00" "\x9a\x00\x1c\x00\xfd\x00\x28\x00\xff\x00\x33\x00\xff\x00\x41\x00" "\xff\x00\x48\x00\xff\x00\x4f\x00\xff\x0f\x57\x00\xff\x63\x5e\x00" "\xff\xc1\x65\x00\xff\xff\x6c\x00\xff\xff\x6f\x00\xff\xff\x74\x00" "\xff\xff\x78\x00\xff\xff\x7c\x00\xff\xff\x81\x00\xff\xff\x83\x00" "\xff\xff\x85\x00\xff\xff\x88\x00\xff\xff\x8a\x00\xff\xff\x8c\x00" "\xff\xff\x8f\x00\xff\xff\x91\x00\xff\xff\x92\x00\xff\xff\x93\x00" "\xff\xff\x94\x00\xff\xff\x95\x00\xff\xff\x97\x00\xff\xff\x98\x00" "\xff\xff\x99\x00\xff\xff\x99\x00\xff\xff\x9a\x00\xff\xff\x9b\x00" "\xff\xff\x9b\x00\xff\xff\x9c\x00\xff\xff\x9c\x00\xff\xff\x9d\x00" "\xff\xff\x9d\x00\xff\xff\x9d\x00\xff\xff\x9e\x00\xff\xff\x9e\x00" "\xff\xff\x9e\x00\xff\xff\x9e\x00\xff\xff\x9e\x00\xff\xff\x9e\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x05\x00\x28\x00\x17\x00\xdb\x00\x26\x00" "\xff\x00\x31\x00\xff\x00\x3d\x00\xff\x00\x49\x00\xff\x01\x53\x00" "\xff\x47\x5c\x00\xff\xa7\x64\x00\xff\xf7\x6b\x00\xff\xff\x71\x00" "\xff\xff\x78\x00\xff\xff\x7e\x00\xff\xff\x81\x00\xff\xff\x85\x00" "\xff\xff\x89\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x93\x00" "\xff\xff\x95\x00\xff\xff\x97\x00\xff\xff\x99\x00\xff\xff\x9b\x00" "\xff\xff\x9d\x00\xff\xff\x9f\x00\xff\xff\xa0\x00\xff\xff\xa1\x00" "\xff\xff\xa2\x00\xff\xff\xa3\x00\xff\xff\xa4\x00\xff\xff\xa5\x00" "\xff\xff\xa6\x00\xff\xff\xa7\x00\xff\xff\xa7\x00\xff\xff\xa8\x00" "\xff\xff\xa8\x00\xff\xff\xa9\x00\xff\xff\xa9\x00\xff\xff\xaa\x00" "\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xaa\x00\xff\xff\xaa\x00" "\xff\xff\xaa\x00\xff\xff\xab\x00\xff\xff\xab\x00\xff\xff\xab\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x09\x00\x49\x00\x1a\x00\xf1\x00\x2b\x00\xff\x00\x3a\x00" "\xff\x00\x47\x00\xff\x00\x51\x00\xff\x38\x5c\x00\xff\xc5\x66\x00" "\xff\xff\x6f\x00\xff\xff\x77\x00\xff\xff\x7c\x00\xff\xff\x82\x00" "\xff\xff\x88\x00\xff\xff\x8d\x00\xff\xff\x91\x00\xff\xff\x95\x00" "\xff\xff\x98\x00\xff\xff\x9b\x00\xff\xff\x9f\x00\xff\xff\xa1\x00" "\xff\xff\xa3\x00\xff\xff\xa5\x00\xff\xff\xa6\x00\xff\xff\xa8\x00" "\xff\xff\xaa\x00\xff\xff\xab\x00\xff\xff\xac\x00\xff\xff\xad\x00" "\xff\xff\xae\x00\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb1\x00" "\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb2\x00\xff\xff\xb3\x00" "\xff\xff\xb3\x00\xff\xff\xb4\x00\xff\xff\xb4\x00\xff\xff\xb4\x00" "\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00\xff\xff\xb5\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00" "\x6e\x00\x1e\x00\xfe\x00\x2e\x00\xff\x00\x3e\x00\xff\x00\x4d\x00" "\xff\x21\x5a\x00\xff\xa9\x64\x00\xff\xff\x6e\x00\xff\xff\x77\x00" "\xff\xff\x7f\x00\xff\xff\x87\x00\xff\xff\x8c\x00\xff\xff\x91\x00" "\xff\xff\x97\x00\xff\xff\x9c\x00\xff\xff\x9f\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa8\x00\xff\xff\xab\x00\xff\xff\xad\x00" "\xff\xff\xaf\x00\xff\xff\xb0\x00\xff\xff\xb2\x00\xff\xff\xb3\x00" "\xff\xff\xb4\x00\xff\xff\xb6\x00\xff\xff\xb6\x00\xff\xff\xb7\x00" "\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xba\x00\xff\xff\xba\x00" "\xff\xff\xbb\x00\xff\xff\xbb\x00\xff\xff\xbc\x00\xff\xff\xbc\x00" "\xff\xff\xbc\x00\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbd\x00" "\xff\xff\xbd\x00\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00\xff\xff\xbe\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x54\x00\x21\x00" "\xff\x00\x32\x00\xff\x00\x41\x00\xff\x01\x50\x00\xff\x6b\x5e\x00" "\xff\xf9\x6b\x00\xff\xff\x76\x00\xff\xff\x7e\x00\xff\xff\x86\x00" "\xff\xff\x8e\x00\xff\xff\x95\x00\xff\xff\x9a\x00\xff\xff\x9f\x00" "\xff\xff\xa4\x00\xff\xff\xa8\x00\xff\xff\xac\x00\xff\xff\xae\x00" "\xff\xff\xb0\x00\xff\xff\xb3\x00\xff\xff\xb5\x00\xff\xff\xb7\x00" "\xff\xff\xb8\x00\xff\xff\xba\x00\xff\xff\xbb\x00\xff\xff\xbc\x00" "\xff\xff\xbd\x00\xff\xff\xbe\x00\xff\xff\xbf\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc2\x00" "\xff\xff\xc2\x00\xff\xff\xc2\x00\xff\xff\xc3\x00\xff\xff\xc3\x00" "\xff\xff\xc3\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00\xff\xff\xc4\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x09\x00\x31\x00\x1e\x00\xf6\x00\x32\x00" "\xff\x00\x44\x00\xff\x06\x53\x00\xff\x99\x61\x00\xff\xff\x6d\x00" "\xff\xff\x79\x00\xff\xff\x84\x00\xff\xff\x8d\x00\xff\xff\x94\x00" "\xff\xff\x9b\x00\xff\xff\xa2\x00\xff\xff\xa7\x00\xff\xff\xab\x00" "\xff\xff\xaf\x00\xff\xff\xb2\x00\xff\xff\xb6\x00\xff\xff\xb8\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbe\x00\xff\xff\xbf\x00" "\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc2\x00\xff\xff\xc3\x00" "\xff\xff\xc4\x00\xff\xff\xc5\x00\xff\xff\xc5\x00\xff\xff\xc6\x00" "\xff\xff\xc6\x00\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc7\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x05\x00\x17\x00\x1a\x00\xe2\x00\x2e\x00\xff\x00\x41\x00" "\xff\x15\x53\x00\xff\xc1\x63\x00\xff\xff\x70\x00\xff\xff\x7c\x00" "\xff\xff\x87\x00\xff\xff\x91\x00\xff\xff\x9a\x00\xff\xff\xa0\x00" "\xff\xff\xa7\x00\xff\xff\xac\x00\xff\xff\xb1\x00\xff\xff\xb5\x00" "\xff\xff\xb8\x00\xff\xff\xbb\x00\xff\xff\xbe\x00\xff\xff\xbf\x00" "\xff\xff\xc1\x00\xff\xff\xc3\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc6\x00\xff\xff\xc7\x00\xff\xff\xc7\x00\xff\xff\xc8\x00" "\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x17\x00\xb7\x00\x2b\x00\xff\x00\x3e\x00\xff\x11\x50\x00" "\xff\xd8\x61\x00\xff\xff\x70\x00\xff\xff\x7e\x00\xff\xff\x89\x00" "\xff\xff\x94\x00\xff\xff\x9c\x00\xff\xff\xa5\x00\xff\xff\xab\x00" "\xff\xff\xb1\x00\xff\xff\xb6\x00\xff\xff\xba\x00\xff\xff\xbd\x00" "\xff\xff\xc0\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xc9\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00" "\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00" "\x47\x00\x26\x00\xff\x00\x3a\x00\xff\x04\x4d\x00\xff\xb9\x5e\x00" "\xff\xff\x6d\x00\xff\xff\x7c\x00\xff\xff\x89\x00\xff\xff\x95\x00" "\xff\xff\x9e\x00\xff\xff\xa7\x00\xff\xff\xae\x00\xff\xff\xb4\x00" "\xff\xff\xb9\x00\xff\xff\xbd\x00\xff\xff\xc1\x00\xff\xff\xc4\x00" "\xff\xff\xc5\x00\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00\x1c\x00" "\xd2\x00\x31\x00\xff\x00\x47\x00\xff\x8f\x5a\x00\xff\xff\x6b\x00" "\xff\xff\x7a\x00\xff\xff\x87\x00\xff\xff\x94\x00\xff\xff\x9e\x00" "\xff\xff\xa8\x00\xff\xff\xaf\x00\xff\xff\xb6\x00\xff\xff\xbb\x00" "\xff\xff\xc0\x00\xff\xff\xc3\x00\xff\xff\xc6\x00\xff\xff\xc8\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x62\x00\x28\x00" "\xff\x00\x3d\x00\xff\x60\x51\x00\xff\xff\x64\x00\xff\xff\x76\x00" "\xff\xff\x85\x00\xff\xff\x91\x00\xff\xff\x9c\x00\xff\xff\xa7\x00" "\xff\xff\xaf\x00\xff\xff\xb7\x00\xff\xff\xbc\x00\xff\xff\xc1\x00" "\xff\xff\xc5\x00\xff\xff\xc8\x00\xff\xff\xc9\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x04\x00\x06\x00\x1e\x00\xe5\x00\x33\x00" "\xff\x12\x49\x00\xff\xee\x5c\x00\xff\xff\x6e\x00\xff\xff\x7e\x00" "\xff\xff\x8d\x00\xff\xff\x9a\x00\xff\xff\xa5\x00\xff\xff\xae\x00" "\xff\xff\xb6\x00\xff\xff\xbd\x00\xff\xff\xc2\x00\xff\xff\xc6\x00" "\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x10\x00\x4f\x00\x28\x00\xff\x00\x41\x00" "\xff\x8d\x53\x00\xff\xff\x66\x00\xff\xff\x77\x00\xff\xff\x86\x00" "\xff\xff\x94\x00\xff\xff\xa0\x00\xff\xff\xab\x00\xff\xff\xb5\x00" "\xff\xff\xbb\x00\xff\xff\xc1\x00\xff\xff\xc6\x00\xff\xff\xc9\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x1a\x00\xae\x00\x34\x00\xff\x22\x48\x00" "\xff\xfa\x5c\x00\xff\xff\x6f\x00\xff\xff\x7f\x00\xff\xff\x8e\x00" "\xff\xff\x9b\x00\xff\xff\xa7\x00\xff\xff\xb1\x00\xff\xff\xb9\x00" "\xff\xff\xc0\x00\xff\xff\xc5\x00\xff\xff\xc8\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x08\x00\x13\x00\x24\x00\xfa\x00\x3a\x00\xff\xa9\x4f\x00" "\xff\xff\x64\x00\xff\xff\x77\x00\xff\xff\x87\x00\xff\xff\x95\x00" "\xff\xff\xa2\x00\xff\xff\xac\x00\xff\xff\xb6\x00\xff\xff\xbd\x00" "\xff\xff\xc3\x00\xff\xff\xc8\x00\xff\xff\xca\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x13\x00\x6b\x00\x2d\x00\xff\x21\x42\x00\xff\xff\x57\x00" "\xff\xff\x6b\x00\xff\xff\x7c\x00\xff\xff\x8c\x00\xff\xff\x9a\x00" "\xff\xff\xa7\x00\xff\xff\xb1\x00\xff\xff\xba\x00\xff\xff\xc1\x00" "\xff\xff\xc6\x00\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" "\x00\x00\x1c\x00\xc6\x00\x34\x00\xff\x7f\x4a\x00\xff\xff\x5f\x00" "\xff\xff\x71\x00\xff\xff\x82\x00\xff\xff\x92\x00\xff\xff\x9f\x00" "\xff\xff\xab\x00\xff\xff\xb5\x00\xff\xff\xbd\x00\xff\xff\xc4\x00" "\xff\xff\xc8\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00" "\x0c\x00\x23\x00\xfc\x01\x3c\x00\xff\xdd\x51\x00\xff\xff\x66\x00" "\xff\xff\x78\x00\xff\xff\x88\x00\xff\xff\x97\x00\xff\xff\xa4\x00" "\xff\xff\xaf\x00\xff\xff\xb8\x00\xff\xff\xc0\x00\xff\xff\xc5\x00" "\xff\xff\xc9\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00" "\x45\x00\x2a\x00\xff\x3c\x41\x00\xff\xff\x57\x00\xff\xff\x6b\x00" "\xff\xff\x7d\x00\xff\xff\x8e\x00\xff\xff\x9c\x00\xff\xff\xa8\x00" "\xff\xff\xb2\x00\xff\xff\xbb\x00\xff\xff\xc2\x00\xff\xff\xc7\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00" "\x82\x00\x2f\x00\xff\x9b\x46\x00\xff\xff\x5b\x00\xff\xff\x6f\x00" "\xff\xff\x81\x00\xff\xff\x91\x00\xff\xff\x9f\x00\xff\xff\xab\x00" "\xff\xff\xb5\x00\xff\xff\xbe\x00\xff\xff\xc4\x00\xff\xff\xc8\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00" "\xbf\x01\x35\x00\xff\xe9\x4d\x00\xff\xff\x62\x00\xff\xff\x74\x00" "\xff\xff\x85\x00\xff\xff\x95\x00\xff\xff\xa2\x00\xff\xff\xae\x00" "\xff\xff\xb8\x00\xff\xff\xc0\x00\xff\xff\xc5\x00\xff\xff\xc9\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x06\x00\x22\x00" "\xf7\x26\x3b\x00\xff\xff\x51\x00\xff\xff\x65\x00\xff\xff\x78\x00" "\xff\xff\x89\x00\xff\xff\x98\x00\xff\xff\xa6\x00\xff\xff\xb1\x00" "\xff\xff\xba\x00\xff\xff\xc1\x00\xff\xff\xc7\x00\xff\xff\xca\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x34\x00\x28\x00" "\xff\x63\x40\x00\xff\xff\x56\x00\xff\xff\x6a\x00\xff\xff\x7c\x00" "\xff\xff\x8d\x00\xff\xff\x9b\x00\xff\xff\xa8\x00\xff\xff\xb3\x00" "\xff\xff\xbc\x00\xff\xff\xc3\x00\xff\xff\xc8\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x5b\x00\x2b\x00" "\xff\xa0\x44\x00\xff\xff\x5a\x00\xff\xff\x6f\x00\xff\xff\x81\x00" "\xff\xff\x91\x00\xff\xff\x9f\x00\xff\xff\xab\x00\xff\xff\xb5\x00" "\xff\xff\xbe\x00\xff\xff\xc4\x00\xff\xff\xc9\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x81\x00\x2f\x00" "\xff\xdd\x47\x00\xff\xff\x5d\x00\xff\xff\x71\x00\xff\xff\x83\x00" "\xff\xff\x93\x00\xff\xff\xa1\x00\xff\xff\xad\x00\xff\xff\xb7\x00" "\xff\xff\xbf\x00\xff\xff\xc5\x00\xff\xff\xc9\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\xa6\x1a\x33\x00" "\xff\xff\x4b\x00\xff\xff\x60\x00\xff\xff\x74\x00\xff\xff\x85\x00" "\xff\xff\x95\x00\xff\xff\xa3\x00\xff\xff\xae\x00\xff\xff\xb8\x00" "\xff\xff\xc0\x00\xff\xff\xc6\x00\xff\xff\xca\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x1d\x00\xcc\x48\x37\x00" "\xff\xff\x4e\x00\xff\xff\x63\x00\xff\xff\x76\x00\xff\xff\x88\x00" "\xff\xff\x97\x00\xff\xff\xa4\x00\xff\xff\xb0\x00\xff\xff\xba\x00" "\xff\xff\xc1\x00\xff\xff\xc7\x00\xff\xff\xca\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x05\x00\x01\x00\x21\x00\xf2\x6e\x3a\x00" "\xff\xff\x51\x00\xff\xff\x66\x00\xff\xff\x79\x00\xff\xff\x8a\x00" "\xff\xff\x99\x00\xff\xff\xa6\x00\xff\xff\xb2\x00\xff\xff\xbb\x00" "\xff\xff\xc2\x00\xff\xff\xc7\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x09\x00\x17\x00\x25\x00\xff\x94\x3e\x00" "\xff\xff\x55\x00\xff\xff\x69\x00\xff\xff\x7c\x00\xff\xff\x8c\x00" "\xff\xff\x9b\x00\xff\xff\xa8\x00\xff\xff\xb3\x00\xff\xff\xbc\x00" "\xff\xff\xc3\x00\xff\xff\xc8\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x0e\x00\x36\x00\x29\x00\xff\xb9\x42\x00" "\xff\xff\x58\x00\xff\xff\x6c\x00\xff\xff\x7e\x00\xff\xff\x8f\x00" "\xff\xff\x9d\x00\xff\xff\xaa\x00\xff\xff\xb5\x00\xff\xff\xbd\x00" "\xff\xff\xc4\x00\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x0f\x00\x4c\x00\x2a\x00\xff\xdf\x43\x00" "\xff\xff\x59\x00\xff\xff\x6e\x00\xff\xff\x80\x00\xff\xff\x91\x00" "\xff\xff\x9f\x00\xff\xff\xac\x00\xff\xff\xb6\x00\xff\xff\xbe\x00" "\xff\xff\xc5\x00\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x12\x00\x61\x08\x2c\x00\xff\xfe\x44\x00" "\xff\xff\x5b\x00\xff\xff\x6f\x00\xff\xff\x82\x00\xff\xff\x92\x00" "\xff\xff\xa0\x00\xff\xff\xac\x00\xff\xff\xb6\x00\xff\xff\xbf\x00" "\xff\xff\xc5\x00\xff\xff\xc9\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x14\x00\x77\x29\x2e\x00\xff\xff\x46\x00" "\xff\xff\x5d\x00\xff\xff\x71\x00\xff\xff\x83\x00\xff\xff\x93\x00" "\xff\xff\xa1\x00\xff\xff\xad\x00\xff\xff\xb7\x00\xff\xff\xbf\x00" "\xff\xff\xc5\x00\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x16\x00\x8c\x41\x30\x00\xff\xff\x48\x00" "\xff\xff\x5e\x00\xff\xff\x72\x00\xff\xff\x84\x00\xff\xff\x94\x00" "\xff\xff\xa2\x00\xff\xff\xae\x00\xff\xff\xb8\x00\xff\xff\xc0\x00" "\xff\xff\xc6\x00\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x19\x00\xa2\x56\x32\x00\xff\xff\x4a\x00" "\xff\xff\x60\x00\xff\xff\x74\x00\xff\xff\x86\x00\xff\xff\x95\x00" "\xff\xff\xa3\x00\xff\xff\xaf\x00\xff\xff\xb9\x00\xff\xff\xc0\x00" "\xff\xff\xc6\x00\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x1b\x00\xb7\x6c\x35\x00\xff\xff\x4c\x00" "\xff\xff\x62\x00\xff\xff\x76\x00\xff\xff\x87\x00\xff\xff\x97\x00" "\xff\xff\xa4\x00\xff\xff\xb0\x00\xff\xff\xb9\x00\xff\xff\xc1\x00" "\xff\xff\xc7\x00\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\x1d\x00\xcc\x82\x37\x00\xff\xff\x4e\x00" "\xff\xff\x64\x00\xff\xff\x77\x00\xff\xff\x89\x00\xff\xff\x98\x00" "\xff\xff\xa5\x00\xff\xff\xb1\x00\xff\xff\xba\x00\xff\xff\xc2\x00" "\xff\xff\xc7\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x1e\x00\xd9\x97\x38\x00\xff\xff\x4f\x00" "\xff\xff\x65\x00\xff\xff\x78\x00\xff\xff\x89\x00\xff\xff\x99\x00" "\xff\xff\xa6\x00\xff\xff\xb2\x00\xff\xff\xbb\x00\xff\xff\xc2\x00" "\xff\xff\xc7\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x03\x00\x00\x00\x1f\x00\xe3\xad\x39\x00\xff\xff\x50\x00" "\xff\xff\x65\x00\xff\xff\x79\x00\xff\xff\x8a\x00\xff\xff\x99\x00" "\xff\xff\xa7\x00\xff\xff\xb2\x00\xff\xff\xbb\x00\xff\xff\xc2\x00" "\xff\xff\xc8\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x21\x00\xee\xc2\x3a\x00\xff\xff\x51\x00" "\xff\xff\x66\x00\xff\xff\x7a\x00\xff\xff\x8b\x00\xff\xff\x9a\x00" "\xff\xff\xa7\x00\xff\xff\xb2\x00\xff\xff\xbc\x00\xff\xff\xc3\x00" "\xff\xff\xc8\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x05\x00\x00\x00\x22\x00\xf8\xd4\x3b\x00\xff\xff\x52\x00" "\xff\xff\x67\x00\xff\xff\x7a\x00\xff\xff\x8b\x00\xff\xff\x9b\x00" "\xff\xff\xa8\x00\xff\xff\xb3\x00\xff\xff\xbc\x00\xff\xff\xc3\x00" "\xff\xff\xc8\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x06\x00\x03\x00\x23\x00\xff\xde\x3c\x00\xff\xff\x53\x00" "\xff\xff\x68\x00\xff\xff\x7b\x00\xff\xff\x8c\x00\xff\xff\x9b\x00" "\xff\xff\xa8\x00\xff\xff\xb3\x00\xff\xff\xbc\x00\xff\xff\xc3\x00" "\xff\xff\xc8\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x08\x00\x0c\x00\x24\x00\xff\xe8\x3d\x00\xff\xff\x54\x00" "\xff\xff\x69\x00\xff\xff\x7c\x00\xff\xff\x8d\x00\xff\xff\x9c\x00" "\xff\xff\xa9\x00\xff\xff\xb4\x00\xff\xff\xbc\x00\xff\xff\xc3\x00" "\xff\xff\xc8\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x09\x00\x17\x00\x25\x00\xff\xf3\x3e\x00\xff\xff\x55\x00" "\xff\xff\x6a\x00\xff\xff\x7c\x00\xff\xff\x8d\x00\xff\xff\x9c\x00" "\xff\xff\xa9\x00\xff\xff\xb4\x00\xff\xff\xbd\x00\xff\xff\xc4\x00" "\xff\xff\xc8\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x0a\x00\x21\x01\x26\x00\xff\xfd\x3f\x00\xff\xff\x55\x00" "\xff\xff\x6a\x00\xff\xff\x7d\x00\xff\xff\x8e\x00\xff\xff\x9d\x00" "\xff\xff\xaa\x00\xff\xff\xb4\x00\xff\xff\xbd\x00\xff\xff\xc4\x00" "\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x0c\x00\x29\x07\x27\x00\xff\xff\x3f\x00\xff\xff\x56\x00" "\xff\xff\x6b\x00\xff\xff\x7e\x00\xff\xff\x8f\x00\xff\xff\x9d\x00" "\xff\xff\xaa\x00\xff\xff\xb5\x00\xff\xff\xbd\x00\xff\xff\xc4\x00" "\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x0c\x00\x2c\x11\x27\x00\xff\xff\x40\x00\xff\xff\x56\x00" "\xff\xff\x6b\x00\xff\xff\x7e\x00\xff\xff\x8f\x00\xff\xff\x9d\x00" "\xff\xff\xaa\x00\xff\xff\xb5\x00\xff\xff\xbd\x00\xff\xff\xc4\x00" "\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x0d\x00\x2e\x1c\x27\x00\xff\xff\x40\x00\xff\xff\x57\x00" "\xff\xff\x6b\x00\xff\xff\x7e\x00\xff\xff\x8f\x00\xff\xff\x9e\x00" "\xff\xff\xaa\x00\xff\xff\xb5\x00\xff\xff\xbe\x00\xff\xff\xc4\x00" "\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x0d\x00\x31\x26\x27\x00\xff\xff\x40\x00\xff\xff\x57\x00" "\xff\xff\x6c\x00\xff\xff\x7e\x00\xff\xff\x8f\x00\xff\xff\x9e\x00" "\xff\xff\xaa\x00\xff\xff\xb5\x00\xff\xff\xbe\x00\xff\xff\xc4\x00" "\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x0e\x00\x33\x2b\x28\x00\xff\xff\x40\x00\xff\xff\x57\x00" "\xff\xff\x6c\x00\xff\xff\x7e\x00\xff\xff\x8f\x00\xff\xff\x9e\x00" "\xff\xff\xaa\x00\xff\xff\xb5\x00\xff\xff\xbe\x00\xff\xff\xc4\x00" "\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x0e\x00\x36\x2d\x29\x00\xff\xff\x41\x00\xff\xff\x58\x00" "\xff\xff\x6d\x00\xff\xff\x7f\x00\xff\xff\x90\x00\xff\xff\x9e\x00" "\xff\xff\xab\x00\xff\xff\xb6\x00\xff\xff\xbe\x00\xff\xff\xc5\x00" "\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x0e\x00\x38\x30\x29\x00\xff\xff\x41\x00\xff\xff\x58\x00" "\xff\xff\x6d\x00\xff\xff\x7f\x00\xff\xff\x90\x00\xff\xff\x9e\x00" "\xff\xff\xab\x00\xff\xff\xb6\x00\xff\xff\xbe\x00\xff\xff\xc5\x00" "\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x0e\x00\x3b\x32\x28\x00\xff\xff\x41\x00\xff\xff\x58\x00" "\xff\xff\x6c\x00\xff\xff\x7f\x00\xff\xff\x90\x00\xff\xff\x9e\x00" "\xff\xff\xab\x00\xff\xff\xb5\x00\xff\xff\xbe\x00\xff\xff\xc4\x00" "\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" // Mipmap level 3. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x01\x00\x00\x00\x1c\x00\x00\x00\x42\x00\x00\x00" "\x68\x00\x01\x00\x85\x00\x05\x00\x9a\x00\x0a\x00\xaf\x00\x0e\x00" "\xc3\x00\x11\x00\xcd\x00\x12\x00\xd3\x00\x14\x00\xda\x00\x15\x00" "\xe0\x00\x16\x00\xe6\x00\x17\x00\xec\x00\x19\x00\xf2\x00\x1a\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x01\x00\x00\x00\x38\x00\x00\x00\x7b\x00\x0a\x00" "\xb8\x00\x17\x00\xf1\x00\x20\x00\xff\x00\x28\x00\xff\x00\x30\x00" "\xff\x00\x36\x00\xff\x00\x3a\x00\xff\x00\x3e\x00\xff\x00\x42\x00" "\xff\x04\x44\x00\xff\x0d\x45\x00\xff\x13\x46\x00\xff\x1a\x47\x00" "\xff\x20\x48\x00\xff\x26\x49\x00\xff\x2c\x4a\x00\xff\x32\x4c\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00" "\x7b\x00\x10\x00\xda\x00\x25\x00\xff\x00\x33\x00\xff\x00\x3f\x00" "\xff\x04\x49\x00\xff\x32\x51\x00\xff\x5c\x58\x00\xff\x82\x5e\x00" "\xff\xa8\x63\x00\xff\xc5\x66\x00\xff\xda\x6a\x00\xff\xef\x6d\x00" "\xff\xff\x6f\x00\xff\xff\x70\x00\xff\xff\x71\x00\xff\xff\x71\x00" "\xff\xff\x72\x00\xff\xff\x73\x00\xff\xff\x74\x00\xff\xff\x75\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x04\x00\x00\x00\x70\x00\x15\x00\xee\x00\x31\x00" "\xff\x00\x44\x00\xff\x1d\x55\x00\xff\x78\x60\x00\xff\xbb\x6a\x00" "\xff\xf4\x73\x00\xff\xff\x7a\x00\xff\xff\x7f\x00\xff\xff\x84\x00" "\xff\xff\x88\x00\xff\xff\x8b\x00\xff\xff\x8d\x00\xff\xff\x90\x00" "\xff\xff\x92\x00\xff\xff\x92\x00\xff\xff\x93\x00\xff\xff\x94\x00" "\xff\xff\x94\x00\xff\xff\x95\x00\xff\xff\x96\x00\xff\xff\x97\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x13\x00\x07\x00\xbd\x00\x2a\x00\xff\x00\x44\x00\xff\x3e\x58\x00" "\xff\xbb\x6f\x00\xff\xfe\x77\x00\xff\xff\x83\x00\xff\xff\x8e\x00" "\xff\xff\x93\x00\xff\xff\x9a\x00\xff\xff\x9e\x00\xff\xff\xa2\x00" "\xff\xff\xa5\x00\xff\xff\xa7\x00\xff\xff\xa9\x00\xff\xff\xab\x00" "\xff\xff\xac\x00\xff\xff\xad\x00\xff\xff\xad\x00\xff\xff\xae\x00" "\xff\xff\xae\x00\xff\xff\xaf\x00\xff\xff\xaf\x00\xff\xff\xb0\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x0d\x00" "\xdb\x00\x31\x00\xff\x1a\x4e\x00\xff\xb0\x67\x00\xff\xff\x7d\x00" "\xff\xff\x8b\x00\xff\xff\x96\x00\xff\xff\xa0\x00\xff\xff\xa9\x00" "\xff\xff\xac\x00\xff\xff\xb2\x00\xff\xff\xb4\x00\xff\xff\xb7\x00" "\xff\xff\xba\x00\xff\xff\xbc\x00\xff\xff\xbd\x00\xff\xff\xbe\x00" "\xff\xff\xbf\x00\xff\xff\xbf\x00\xff\xff\xc0\x00\xff\xff\xc0\x00" "\xff\xff\xc0\x00\xff\xff\xc0\x00\xff\xff\xc1\x00\xff\xff\xc1\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x07\x00\xc2\x00\x31\x00" "\xff\x37\x54\x00\xff\xe6\x6f\x00\xff\xff\x86\x00\xff\xff\x97\x00" "\xff\xff\xa4\x00\xff\xff\xaf\x00\xff\xff\xb6\x00\xff\xff\xbb\x00" "\xff\xff\xbf\x00\xff\xff\xc2\x00\xff\xff\xc4\x00\xff\xff\xc5\x00" "\xff\xff\xc7\x00\xff\xff\xc8\x00\xff\xff\xc8\x00\xff\xff\xc9\x00" "\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00\xff\xff\xca\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x2a\x00\xff\x34\x4f\x00" "\xff\xf6\x6f\x00\xff\xff\x8a\x00\xff\xff\x9e\x00\xff\xff\xad\x00" "\xff\xff\xb8\x00\xff\xff\xbf\x00\xff\xff\xc4\x00\xff\xff\xc7\x00" "\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x1a\x00\x16\x00\xf5\x18\x45\x00\xff\xe4\x68\x00" "\xff\xff\x86\x00\xff\xff\x9e\x00\xff\xff\xb0\x00\xff\xff\xbc\x00" "\xff\xff\xc4\x00\xff\xff\xc9\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x8f\x00\x31\x00\xff\xa3\x58\x00\xff\xff\x7d\x00" "\xff\xff\x97\x00\xff\xff\xae\x00\xff\xff\xbc\x00\xff\xff\xc6\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x06\x00\x10\x00\xeb\x33\x45\x00\xff\xff\x6f\x00\xff\xff\x8b\x00" "\xff\xff\xa4\x00\xff\xff\xb8\x00\xff\xff\xc4\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x4e\x00\x25\x00\xff\xa8\x55\x00\xff\xff\x77\x00\xff\xff\x96\x00" "\xff\xff\xaf\x00\xff\xff\xbf\x00\xff\xff\xc9\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x95\x11\x33\x00\xff\xf8\x60\x00\xff\xff\x83\x00\xff\xff\xa0\x00" "\xff\xff\xb6\x00\xff\xff\xc4\x00\xff\xff\xcb\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00" "\xd1\x63\x3f\x00\xff\xff\x6a\x00\xff\xff\x8e\x00\xff\xff\xa9\x00" "\xff\xff\xbb\x00\xff\xff\xc7\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x18\x00" "\xfe\xa4\x4a\x00\xff\xff\x73\x00\xff\xff\x93\x00\xff\xff\xac\x00" "\xff\xff\xbf\x00\xff\xff\xc9\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x00\x21\x00" "\xff\xe0\x51\x00\xff\xff\x7a\x00\xff\xff\x9a\x00\xff\xff\xb2\x00" "\xff\xff\xc2\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x19\x28\x00" "\xff\xff\x58\x00\xff\xff\x7f\x00\xff\xff\x9e\x00\xff\xff\xb5\x00" "\xff\xff\xc4\x00\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x41\x30\x00" "\xff\xff\x5e\x00\xff\xff\x84\x00\xff\xff\xa2\x00\xff\xff\xb7\x00" "\xff\xff\xc5\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\xa3\x68\x36\x00" "\xff\xff\x63\x00\xff\xff\x88\x00\xff\xff\xa5\x00\xff\xff\xba\x00" "\xff\xff\xc7\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\xb8\x8e\x3a\x00" "\xff\xff\x67\x00\xff\xff\x8b\x00\xff\xff\xa7\x00\xff\xff\xbc\x00" "\xff\xff\xc8\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\xcd\xa8\x3e\x00" "\xff\xff\x6a\x00\xff\xff\x8e\x00\xff\xff\xa9\x00\xff\xff\xbd\x00" "\xff\xff\xc8\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\xe1\xbd\x42\x00" "\xff\xff\x6d\x00\xff\xff\x90\x00\xff\xff\xab\x00\xff\xff\xbe\x00" "\xff\xff\xc9\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\xed\xd2\x44\x00" "\xff\xff\x6f\x00\xff\xff\x92\x00\xff\xff\xac\x00\xff\xff\xbf\x00" "\xff\xff\xc9\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\xf3\xe6\x45\x00" "\xff\xff\x70\x00\xff\xff\x92\x00\xff\xff\xad\x00\xff\xff\xbf\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xf9\xee\x46\x00" "\xff\xff\x71\x00\xff\xff\x93\x00\xff\xff\xad\x00\xff\xff\xc0\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00\xff\xf4\x47\x00" "\xff\xff\x71\x00\xff\xff\x94\x00\xff\xff\xae\x00\xff\xff\xc0\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x16\x00\xff\xfa\x48\x00" "\xff\xff\x72\x00\xff\xff\x94\x00\xff\xff\xae\x00\xff\xff\xc0\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x02\x18\x00\xff\xff\x49\x00" "\xff\xff\x73\x00\xff\xff\x95\x00\xff\xff\xaf\x00\xff\xff\xc0\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x12\x07\x1a\x00\xff\xff\x4b\x00" "\xff\xff\x74\x00\xff\xff\x96\x00\xff\xff\xaf\x00\xff\xff\xc1\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x0d\x1a\x00\xff\xff\x4c\x00" "\xff\xff\x75\x00\xff\xff\x97\x00\xff\xff\xb0\x00\xff\xff\xc1\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" // Mipmap level 4. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00" "\x66\x00\x00\x00\x92\x00\x0d\x00\xaf\x00\x19\x00\xcc\x00\x25\x00" "\xe4\x05\x2c\x00\xec\x0c\x2f\x00\xf2\x12\x31\x00\xf8\x18\x34\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x4c\x00\x06\x00\xce\x03\x2f\x00\xff\x3b\x4c\x00" "\xff\x86\x62\x00\xff\xb2\x6c\x00\xff\xcf\x75\x00\xff\xec\x7d\x00" "\xff\xff\x82\x00\xff\xff\x83\x00\xff\xff\x85\x00\xff\xff\x87\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00" "\x9e\x02\x26\x00\xff\x6c\x5d\x00\xff\xeb\x83\x00\xff\xff\x97\x00" "\xff\xff\xa5\x00\xff\xff\xab\x00\xff\xff\xb0\x00\xff\xff\xb4\x00" "\xff\xff\xb7\x00\xff\xff\xb8\x00\xff\xff\xb9\x00\xff\xff\xb9\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x0a\x26\x00" "\xff\xbd\x6f\x00\xff\xff\x98\x00\xff\xff\xb4\x00\xff\xff\xbf\x00" "\xff\xff\xc5\x00\xff\xff\xc9\x00\xff\xff\xca\x00\xff\xff\xcb\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x05\x00\xfa\x90\x5d\x00" "\xff\xff\x98\x00\xff\xff\xbc\x00\xff\xff\xc9\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x80\x33\x2f\x00\xff\xff\x83\x00" "\xff\xff\xb4\x00\xff\xff\xc9\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x89\x4c\x00\xff\xff\x97\x00" "\xff\xff\xbf\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x10\x00\x00\x00\xff\xd6\x62\x00\xff\xff\xa5\x00" "\xff\xff\xc5\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x2f\x14\x0c\x00\xff\xff\x6d\x00\xff\xff\xab\x00" "\xff\xff\xc9\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x4c\x32\x16\x00\xff\xff\x75\x00\xff\xff\xb0\x00" "\xff\xff\xca\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x69\x4f\x23\x00\xff\xff\x7e\x00\xff\xff\xb5\x00" "\xff\xff\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x78\x6c\x2c\x00\xff\xff\x82\x00\xff\xff\xb7\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x7e\x79\x30\x00\xff\xff\x83\x00\xff\xff\xb8\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x84\x7f\x34\x00\xff\xff\x85\x00\xff\xff\xb9\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\x8b\x85\x34\x00\xff\xff\x87\x00\xff\xff\xb9\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" // Mipmap level 5. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00" "\x3e\x00\x00\x00\x52\x00\x00\x00\x62\x00\x00\x00\x71\x03\x00\x00" "\x00\x00\x00\x00\x02\x00\x00\x00\x7c\x1d\x16\x00\xf5\x8d\x6e\x00" "\xff\xce\x8b\x00\xff\xe2\x92\x00\xff\xf2\x9a\x00\xff\xff\xa1\x00" "\x00\x00\x00\x00\x69\x28\x16\x00\xff\xf0\x9e\x00\xff\xff\xc8\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x00\x00\x00\x00\xd5\xb1\x6e\x00\xff\xff\xc8\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x0d\x05\x00\x00\xff\xf7\x8b\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x1e\x17\x00\x00\xff\xff\x93\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x2d\x26\x00\x00\xff\xff\x9a\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x3d\x36\x00\x00\xff\xff\xa1\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" // Mipmap level 6. "\x01\x00\x00\x00\x4c\x1b\x00\x00\xa3\x6b\x41\x00\xb5\x7d\x58\x00" "\x3f\x27\x00\x00\xff\xfa\xcb\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x8b\x83\x41\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" "\x9b\x97\x58\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00" // Mipmap level 7. "\x63\x50\x00\x00\xd7\xbb\xc2\x00\xc8\xc5\xc2\x00\xff\xff\xcc\x00" // Mipmap level 8. "\xb2\xa6\xcc\x00" }; ./src/Ubuntu/Components/plugin/i18n.h0000644000015600001650000000503412700370701017520 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Tim Peeters */ #ifndef UBUNTU_COMPONENTS_I18N_H #define UBUNTU_COMPONENTS_I18N_H #include class QQmlContext; class QQmlEngine; class UbuntuI18n : public QObject { Q_OBJECT Q_PROPERTY(QString domain READ domain WRITE setDomain NOTIFY domainChanged) Q_PROPERTY(QString language READ language WRITE setLanguage NOTIFY languageChanged) private: Q_DISABLE_COPY(UbuntuI18n) explicit UbuntuI18n(QObject* parent = 0); ~UbuntuI18n(); public: static UbuntuI18n *instance(QObject *parent = Q_NULLPTR) { if (!m_i18) { if (!parent) { qFatal("Creating i18n singleton requires a parent object!"); } m_i18 = new UbuntuI18n(parent); } return m_i18; } Q_INVOKABLE void bindtextdomain(const QString& domain_name, const QString& dir_name); Q_INVOKABLE QString tr(const QString& text); Q_INVOKABLE QString tr(const QString& singular, const QString& plural, int n); Q_INVOKABLE QString dtr(const QString& domain, const QString& text); Q_INVOKABLE QString dtr(const QString& domain, const QString& singular, const QString& plural, int n); Q_INVOKABLE QString ctr(const QString& context, const QString& text); Q_INVOKABLE QString dctr(const QString& domain, const QString& context, const QString& text); Q_INVOKABLE QString tag(const QString& text); Q_INVOKABLE QString tag(const QString& context, const QString& text); Q_INVOKABLE QString relativeDateTime(const QDateTime& datetime); // getter QString domain() const; QString language() const; // setter void setDomain(const QString& domain); void setLanguage(const QString& lang); Q_SIGNALS: void domainChanged(); void languageChanged(); private: static UbuntuI18n *m_i18; QString m_domain; QString m_language; }; #endif // UBUNTU_COMPONENTS_I18N_H ./src/Ubuntu/Components/plugin/quickutils.cpp0000644000015600001650000001762412700370714021505 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "quickutils.h" #include #include #include #include #include #include #include #include #include #include #include QuickUtils *QuickUtils::m_instance = nullptr; QuickUtils::QuickUtils(QObject *parent) : QObject(parent), m_rootView(0), m_mouseAttached(false), m_keyboardAttached(false) { QGuiApplication::instance()->installEventFilter(this); m_omitIM << "ibus" << "none" << "compose"; } /*! * \internal * Filter events to catch ChildAdded, when the the application gets the topmost * window assigned. Need to check the topmost windows each time as widgets added * to the application are not signaled in any other way. */ bool QuickUtils::eventFilter(QObject *obj, QEvent *event) { if (!m_rootView && (event->type() == QEvent::ApplicationActivate)) { lookupQuickView(); Q_EMIT activated(); } if (event->type() == QEvent::ApplicationDeactivate) { Q_EMIT deactivated(); } return QObject::eventFilter(obj, event); } /*! * \internal * \deprecated * Returns the current root object. */ QQuickItem *QuickUtils::rootObject() { qmlInfo(this) << "WARNING: QuickUtils.rootObject property is deprecated: Use QuickUtils::rootItem() function instead."; if (!m_rootView) lookupQuickView(); return (m_rootView) ? m_rootView->rootObject() : 0; } /*! * \internal * Returns the root item of a given item. In case there is a QQuickWindow (Window) * found in the hierarchy, the function will return the contentItem of the window. */ QQuickItem *QuickUtils::rootItem(QObject *object) { // make sure we have the m_rootView updated lookupQuickView(); if (!object) { return (m_rootView) ? m_rootView->rootObject() : 0; } QQuickItem *item = qobject_cast(object); // the given object may be a non-visual element (QtObject or QQmlComponent) // therefore those objects' parent object should be considered QQuickItem *parentItem = item ? item->parentItem() : qobject_cast(object->parent()); while (parentItem && parentItem->parentItem()) { parentItem = parentItem->parentItem(); } if (m_rootView && (m_rootView->contentItem() == parentItem)) { // when traversing visual parents of an element from the application, // we reach QQuickView's contentItem, whose size is invalid. Therefore // we need to return the QQuickView's rootObject() instead of the topmost // item found parentItem = m_rootView->rootObject(); } // in case the item found is derived from internal QQuickRootItem, return its first child if (parentItem && parentItem->inherits("QQuickRootItem")) { parentItem = parentItem->childItems()[0]; } return parentItem; } QString QuickUtils::inputMethodProvider() const { QString im(getenv("QT_IM_MODULE")); return m_omitIM.contains(im) ? QString() : im; } bool QuickUtils::touchScreenAvailable() const { // publish internal context property to detect whether we have touch device or not QList touchDevices = QTouchDevice::devices(); Q_FOREACH(const QTouchDevice *device, touchDevices) { if (device->type() == QTouchDevice::TouchScreen) { return true; } } return false; } /*! * \internal * Returns the class name (type) of a QtQuick item. */ QString QuickUtils::className(QObject *item) { if (!item) { return QString("(null)"); } QString result = item->metaObject()->className(); return result.left(result.indexOf("_QML")); } /*! * \internal * The function checks whether an item inherits a given class name. */ bool QuickUtils::inherits(QObject *object, const QString &fromClass) { if (!object || fromClass.isEmpty()) { return false; } const QMetaObject *mo = object->metaObject(); QString className; while (mo) { className = mo->className(); className = className.left(className.indexOf("_QML")); if (className == fromClass) { return true; } mo = mo->superClass(); } return false; } /*! * \internal * Get QQuickView from the application's window list and connect its status change * signal as the root element is set after the root element completion. */ void QuickUtils::lookupQuickView() { if (m_rootView) return; Q_FOREACH (QWindow *w, QGuiApplication::topLevelWindows()) { m_rootView = qobject_cast(w); if (m_rootView) { // connect in case we get the root object changed QObject::connect(m_rootView, SIGNAL(statusChanged(QQuickView::Status)), this, SIGNAL(rootObjectChanged())); // emit changed signal so we update the eventual bindings if (m_rootView->rootObject()) Q_EMIT rootObjectChanged(); break; } } } QObject* QuickUtils::createQmlObject(const QUrl &url, QQmlEngine *engine) { /* FIXME: if the directory pointed to by url contains a qmldir file that declares a JavaScript module then QQmlComponent::create() fails with the error "QQmlComponent: Component is not ready". */ QQmlComponent *component = new QQmlComponent(engine, url, QQmlComponent::PreferSynchronous); QObject* result(Q_NULLPTR); if (component->isError()) { qmlInfo(engine) << component->errorString(); } else { result = component->create(); } delete component; return result; } bool QuickUtils::showDeprecationWarnings() { static int showWarnings = 0; if (showWarnings == 0) { QByteArray warningsFlag = qgetenv("SUPPRESS_DEPRECATED_NOTE"); showWarnings = (warningsFlag.isEmpty() || warningsFlag == "yes") ? 1 : 2; } return showWarnings == 2; } // check whether an item is a descendant of parent bool QuickUtils::descendantItemOf(QQuickItem *item, const QQuickItem *parent) { while (item && parent) { if (item == parent) { return true; } item = item->parentItem(); } return false; } // returns the first key-focusable child item QQuickItem *QuickUtils::firstFocusableChild(QQuickItem *item) { if (!item) { return Q_NULLPTR; } const QList &list = item->childItems(); for (int i = 0; i < list.count(); i++) { QQuickItem *child = list.at(i); if (child->activeFocusOnTab()) { return child; } QQuickItem *focus = firstFocusableChild(child); if (focus) { return focus; } } return Q_NULLPTR; } // returns the last key-focusable child item QQuickItem *QuickUtils::lastFocusableChild(QQuickItem *item) { if (!item) { return Q_NULLPTR; } const QList &list = item->childItems(); int i = list.count() - 1; while (i >= 0) { QQuickItem *child = list.at(i--); if (child->activeFocusOnTab()) { return child; } QQuickItem *focus = lastFocusableChild(child); if (focus) { return focus; } } return Q_NULLPTR; } ./src/Ubuntu/Components/plugin/ucperformancemonitor.h0000644000015600001650000000300512700370701023176 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #ifndef UCPERFORMANCE_MONITOR_H #define UCPERFORMANCE_MONITOR_H #include #include #include #include #include class UCPerformanceMonitor : public QObject { Q_OBJECT public: explicit UCPerformanceMonitor(QObject* parent = 0); ~UCPerformanceMonitor(); private Q_SLOTS: void onApplicationStateChanged(Qt::ApplicationState state); void connectToWindow(QQuickWindow* window); void startTimer(); void stopTimer(); void windowDestroyed(); private: QQuickWindow* findQQuickWindow(); private: int m_framesAboveThreshold; int m_warningCount; QElapsedTimer m_timer; QQuickWindow* m_window; }; Q_DECLARE_LOGGING_CATEGORY(ucPerformance) #endif // UCPERFORMANCE_MONITOR_H ./src/Ubuntu/Components/plugin/sortbehavior.cpp0000644000015600001650000000232312700370701022001 0ustar jenkinsjenkins/* * Copyright (C) 2014 Canonical, Ltd. * * Authors: * Christian Dywan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "sortbehavior.h" SortBehavior::SortBehavior(QObject *parent) : QObject(parent) , m_property(QString()) , m_order(Qt::AscendingOrder) { } QString SortBehavior::property() const { return m_property; } Qt::SortOrder SortBehavior::order() const { return m_order; } void SortBehavior::setProperty(const QString& property) { m_property = property; Q_EMIT propertyChanged(); } void SortBehavior::setOrder(Qt::SortOrder order) { m_order = order; Q_EMIT orderChanged(); } ./src/Ubuntu/Components/plugin/ucactionitem_p.h0000644000015600001650000000311512700370701021742 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCACTIONITEM_P #define UCACTIONITEM_P #include "ucactionitem.h" #include "ucstyleditembase_p.h" class UCActionItemPrivate : public UCStyledItemBasePrivate { Q_DECLARE_PUBLIC(UCActionItem) public: static UCActionItemPrivate* get(UCActionItem *item) { return item->d_func(); } UCActionItemPrivate(); void init(); bool hasBindingOnProperty(const QString &name); void updateProperties(); void attachAction(bool attach); // private slots void _q_visibleBinding(); void _q_enabledBinding(); void _q_invokeActionTrigger(const QVariant &value); enum { CustomText = 0x01, CustomIconSource = 0x02, CustomIconName = 0x04, CustomVisible = 0x40, CustomEnabled = 0x80 }; QString text; QString iconName; QUrl iconSource; UCAction *action; quint8 flags; }; #endif // UCACTIONITEM_P ./src/Ubuntu/Components/plugin/ucfontutils.cpp0000644000015600001650000000575712700370701021667 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "ucfontutils.h" #include "ucunits.h" UCFontUtils *UCFontUtils::m_instance = nullptr; /*! * \qmltype FontUtils * \instantiates UCFontUtils * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu * \brief FontUtils is a \l {http://qt-project.org/doc/qt-5.0/qtqml/qqmlcontext.html#details} {context property}, * which provides utility functions for font manipulations. * * FontUtils cannot be instantiated and it is already available as a context * property, i.e. 'FontUtils' is an instance that can be used from anywhere in * the code. * * Example of a Label implementation which uses the default base scale for the font * size: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * * Text { * property string fontSize: "medium" * font.pixelSize: FontUtils.sizeToPixels(fontSize) * } * \endqml * * Another example of a custom text input component exposing a fontSize property and a base * font unit size to scale its font: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * * TextInput { * property string fontSize: "small" * property int baseFontUnits: units.dp(20) * font.pixelSize: FontUtils.modularScale(fontSize) * units.dp(baseFontUnits) * } * \endqml * */ /*! * \qmlmethod real FontUtils::sizeToPixels(string size) * The function calculates the pixel size of a given scale. The size scale can be * one of the strings specified at modularScale function. On failure returns 0. */ qreal UCFontUtils::sizeToPixels(const QString &size) { return modularScale(size) * UCUnits::instance()->dp(fontUnits); } /*! * \qmlmethod real FontUtils::modularScale(string size) * The function returns the number interpretation of a given font scale. The scale * can have one of the following values: * \list * \li \b{xx-small} * \li \b{x-small} * \li \b{small} * \li \b{medium} * \li \b{large} * \li \b{x-large} * \endlist */ qreal UCFontUtils::modularScale(const QString &size) { if (size.size() < 4) { return 0.0; } switch (SCALE_CODE(size)) { case SCALE_MEDIUM: { return mediumScale; } case SCALE_LARGE: { return largeScale; } case SCALE_SMALL: { return smallScale; } case SCALE_XLARGE: { return xLargeScale; } case SCALE_XSMALL: { return xSmallScale; } case SCALE_XXSMALL: { return xxSmallScale; } default: { return 0.0; } } } ./src/Ubuntu/Components/plugin/ucarguments.h0000644000015600001650000000707512700370701021305 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #ifndef UCARGUMENTS_H #define UCARGUMENTS_H #include "ucargument.h" #include #include #include #include #include #include #include class UCArguments : public QObject, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(UCArgument* defaultArgument READ defaultArgument WRITE setDefaultArgument NOTIFY defaultArgumentChanged) Q_PROPERTY(QQmlListProperty arguments READ arguments) Q_CLASSINFO("DefaultProperty", "arguments") Q_PROPERTY(QQmlPropertyMap* values READ values CONSTANT) Q_PROPERTY(bool error READ error NOTIFY errorChanged) Q_PROPERTY(QString errorMessage READ errorMessage NOTIFY errorMessageChanged) public: explicit UCArguments(QObject *parent = 0); UCArgument* defaultArgument() const; void setDefaultArgument(UCArgument* argument); QQmlPropertyMap* values() const; bool error() const; QString errorMessage() const; Q_INVOKABLE void printUsage(); Q_INVOKABLE void quitWithError(const QString& errorMessage = QString()); // inherited from QQmlParserStatus void classBegin(); void componentComplete(); // methods necessary for implementing property QQmlListProperty arguments void appendArguments(UCArgument* argument); UCArgument* atArguments(int index); int countArguments(); void clearArguments(); QQmlListProperty arguments(); Q_SIGNALS: void defaultArgumentChanged(); void errorChanged(); void errorMessageChanged(); protected: void parseAndExposeArguments(); void setValuesOnArguments(const QHash& argumentsValues); QHash buildExpectedArguments(const QList& declaredArguments); QHash parseRawArguments(const QStringList& rawArguments, const QHash& expectedArguments); QStringList collectArgumentValues(QStringList::const_iterator& i, QStringList::const_iterator end, int nValues); bool usageRequested(const QStringList& argumentNames); bool requiredArgumentsProvided(const QHash& argumentsValues, QString& error); bool requiredDefaultArgumentProvided(const QHash& argumentsValues, QString& error); void exposeArgumentsAsProperties(const QHash& argumentsValues); QString usage(); void setErrorMessage(const QString& errorMessage); void quitApplication(); protected Q_SLOTS: void warningArgumentPropertyChanged(); private: bool m_completed; UCArgument* m_defaultArgument; QList m_arguments; QStringList m_rawArguments; QString m_applicationBinary; QQmlPropertyMap* m_values; bool m_error; QString m_errorMessage; }; #endif // UCARGUMENTS_H ./src/Ubuntu/Components/plugin/ucabstractbutton.h0000644000015600001650000000461412700370701022333 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCABSTRACTBUTTON_H #define UCABSTRACTBUTTON_H #include "ucactionitem.h" #include "ucmargins.h" #include class QQuickMouseArea; class QQuickMouseEvent; class UCAbstractButtonPrivate; class UCAbstractButton : public UCActionItem { Q_OBJECT Q_PROPERTY(bool pressed READ pressed NOTIFY pressedChanged) Q_PROPERTY(bool hovered READ hovered NOTIFY hoveredChanged) Q_PROPERTY(UCMargins *sensingMargins READ sensingMargins CONSTANT FINAL) // internal, declared to support the deprecated ListItem module Q_PROPERTY(bool __acceptEvents READ acceptEvents WRITE setAcceptEvents) Q_PROPERTY(QQuickMouseArea *__mouseArea READ privateMouseArea CONSTANT) public: explicit UCAbstractButton(QQuickItem *parent = 0); bool pressed() const; bool hovered() const; UCMargins *sensingMargins(); bool privateAcceptEvents() const; void setPrivateAcceptEvents(bool accept); bool acceptEvents() const; void setAcceptEvents(bool value); QQuickMouseArea *privateMouseArea() const; protected: void classBegin(); virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); void keyReleaseEvent(QKeyEvent *key); Q_SIGNALS: void pressedChanged(); void hoveredChanged(); void clicked(); void pressAndHold(); protected: UCAbstractButton(UCAbstractButtonPrivate &&, QQuickItem *parent = 0); Q_DECLARE_PRIVATE(UCAbstractButton) Q_PRIVATE_SLOT(d_func(), void _q_mouseAreaPressed()) Q_PRIVATE_SLOT(d_func(), void _q_mouseAreaClicked()) Q_PRIVATE_SLOT(d_func(), void _q_mouseAreaPressAndHold()) Q_PRIVATE_SLOT(d_func(), void _q_adjustSensingArea()) }; QML_DECLARE_TYPE(UCMargins) #endif // UCABSTRACTBUTTON_H ./src/Ubuntu/Components/plugin/ucactionmanager.h0000644000015600001650000000422212700370701022077 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCACTIONMANAGER_H #define UCACTIONMANAGER_H #include #include #include class UCAction; class UCActionContext; class UCActionManager : public QObject, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(QQmlListProperty actions READ actions) Q_PROPERTY(QQmlListProperty localContexts READ localContexts) Q_PROPERTY(UCActionContext *globalContext READ globalContext CONSTANT) Q_CLASSINFO("DefaultProperty", "actions") public: explicit UCActionManager(QObject *parent = 0); void classBegin() {} void componentComplete(); QQmlListProperty actions(); QQmlListProperty localContexts(); UCActionContext *globalContext() const; Q_SIGNALS: void quit(); public Q_SLOTS: void addAction(UCAction *action); void removeAction(UCAction *action); void addLocalContext(UCActionContext *context); void removeLocalContext(UCActionContext *context); private: static void contextAppend(QQmlListProperty *list, UCActionContext *context); static void contextClear(QQmlListProperty *list); static int contextCount(QQmlListProperty *list); static void actionAppend(QQmlListProperty *list, UCAction *action); static void actionClear(QQmlListProperty *list); static int actionCount(QQmlListProperty *list); }; #endif // UCACTIONMANAGER_H ./src/Ubuntu/Components/plugin/uclistitem.cpp0000644000015600001650000020011612700370714021460 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "ucunits.h" #include "uctheme.h" #include "ucnamespace.h" #include "uclistitem.h" #include "uclistitem_p.h" #include "uclistitemactions.h" #include "uclistitemactions_p.h" #include "privates/listitemselection.h" #include "ucubuntuanimation.h" #include "propertychange_p.h" #include "i18n.h" #include "quickutils.h" #include "ucaction.h" #include "ucnamespace.h" #include "privates/listviewextensions.h" #include #include #include #include #include #include #include #include #include "uclistitemstyle.h" #include #include #include #include #include "plugin.h" /****************************************************************************** * Divider */ class UCListItemDividerPrivate : public QQuickItemPrivate { Q_DECLARE_PUBLIC(UCListItemDivider) public: UCListItemDividerPrivate() : QQuickItemPrivate() , colorFromChanged(false) , colorToChanged(false) , listItem(0) {} bool colorFromChanged:1; bool colorToChanged:1; QColor colorFrom; QColor colorTo; QGradientStops gradient; UCListItem *listItem; }; UCListItemDivider::UCListItemDivider(UCListItem *parent) : QQuickItem(*(new UCListItemDividerPrivate), parent) { setFlag(ItemHasContents); } UCListItemDivider::~UCListItemDivider() { } void UCListItemDivider::init(UCListItem *listItem) { Q_D(UCListItemDivider); QQml_setParent_noEvent(this, listItem); d->listItem = listItem; setParentItem(listItem); // anchor to left/right/bottom of the ListItem QQuickAnchors *anchors = d->anchors(); UCListItemPrivate *pListItem = UCListItemPrivate::get(listItem); anchors->setLeft(pListItem->left()); anchors->setRight(pListItem->right()); anchors->setBottom(pListItem->bottom()); // connect visible change so we relayout contentItem // FIXME: do this with itemChange!!! connect(this, SIGNAL(visibleChanged()), listItem, SLOT(_q_relayout())); } void UCListItemDivider::paletteChanged() { Q_D(UCListItemDivider); if (!d->colorFromChanged || !d->colorToChanged) { QColor themeColor; UCTheme *theme = d->listItem->getTheme(); if (theme) { themeColor = d->listItem->getTheme()->getPaletteColor("normal", "base"); } if (!themeColor.isValid()) { return; } if (!d->colorFromChanged) { d->colorFrom = themeColor; } if (!d->colorToChanged) { d->colorTo = themeColor; } updateGradient(); } } void UCListItemDivider::updateGradient() { Q_D(UCListItemDivider); d->gradient.clear(); if (height() > UCUnits::instance()->dp(1)) { d->gradient.append(QGradientStop(0.0, d->colorFrom)); d->gradient.append(QGradientStop(0.49, d->colorFrom)); d->gradient.append(QGradientStop(0.5, d->colorTo)); d->gradient.append(QGradientStop(1.0, d->colorTo)); } update(); } QSGNode *UCListItemDivider::updatePaintNode(QSGNode *node, UpdatePaintNodeData *data) { Q_UNUSED(data); Q_D(UCListItemDivider); QSGRectangleNode *dividerNode = static_cast(node); if (!dividerNode) { dividerNode = d->sceneGraphContext()->createRectangleNode(); } UCListItemPrivate *pListItem = UCListItemPrivate::get(d->listItem); bool lastItem = pListItem->countOwner ? (pListItem->index() == (pListItem->countOwner->property("count").toInt() - 1)): false; if (!lastItem && ((d->colorFrom.alphaF() >= (1.0f / 255.0f)) || (d->colorTo.alphaF() >= (1.0f / 255.0f)))) { dividerNode->setRect(boundingRect()); if (d->gradient.size() > 0) { dividerNode->setGradientStops(d->gradient); } else { dividerNode->setColor(d->colorFrom); } dividerNode->update(); return dividerNode; } else if (node) { // delete the node delete node; } return 0; } QColor UCListItemDivider::colorFrom() const { Q_D(const UCListItemDivider); return d->colorFrom; } void UCListItemDivider::setColorFrom(const QColor &color) { Q_D(UCListItemDivider); if (d->colorFrom == color) { return; } d->colorFrom = color; d->colorFromChanged = true; updateGradient(); Q_EMIT colorFromChanged(); } QColor UCListItemDivider::colorTo() const { Q_D(const UCListItemDivider); return d->colorTo; } void UCListItemDivider::setColorTo(const QColor &color) { Q_D(UCListItemDivider); if (d->colorTo == color) { return; } d->colorTo = color; d->colorToChanged = true; updateGradient(); Q_EMIT colorToChanged(); } /****************************************************************************** * ListItemPrivate */ UCListItemPrivate::UCListItemPrivate() : UCStyledItemBasePrivate() , color(Qt::transparent) , highlightColor(Qt::transparent) , contentItem(new QQuickItem) , divider(new UCListItemDivider) , leadingActions(Q_NULLPTR) , trailingActions(Q_NULLPTR) , mainAction(Q_NULLPTR) , expansion(Q_NULLPTR) , selection(Q_NULLPTR) , xAxisMoveThresholdGU(DEFAULT_SWIPE_THRESHOLD_GU) , button(Qt::NoButton) , highlighted(false) , swipeEnabled(true) , contentMoved(false) , swiped(false) , suppressClick(false) , ready(false) , customColor(false) , listViewKeyNavigation(false) { // the ListItem is not a focus scope isFocusScope = false; } UCListItemPrivate::~UCListItemPrivate() { } void UCListItemPrivate::init() { Q_Q(UCListItem); contentItem->setObjectName("ListItemHolder"); divider->init(q); QQml_setParent_noEvent(contentItem, q); contentItem->setParentItem(q); contentItem->setClip(true); // content will be redirected to the contentItem, therefore we must report // children changes as it would come from the main component QObject::connect(contentItem, &QQuickItem::childrenChanged, q, &UCListItem::listItemChildrenChanged); q->setFlag(QQuickItem::ItemHasContents); // turn activeFocusOnPress on q->setActiveFocusOnPress(true); // update swiped state QObject::connect(contentItem, SIGNAL(xChanged()), q, SLOT(_q_updateSwiping()), Qt::DirectConnection); // connect theme changes QObject::connect(q, SIGNAL(themeChanged()), q, SLOT(_q_themeChanged()), Qt::DirectConnection); // watch grid unit size change and set implicit size QObject::connect(UCUnits::instance(), SIGNAL(gridUnitChanged()), q, SLOT(_q_updateSize())); _q_updateSize(); styleDocument = "ListItemStyle"; // create selection object selection = new ListItemSelection(q); } void UCListItemPrivate::_q_themeChanged() { // call the post theme changes postThemeChanged(); } // inspired from IS_SIGNAL_CONNECTED(q, UCListItem, pressAndHold, ()) // the macro cannot be used due to Arguments cannot be an empty () bool UCListItemPrivate::isClickedConnected() { Q_Q(UCListItem); static QMetaMethod method = QMetaMethod::fromSignal(&UCListItem::clicked); static int signalIdx = QMetaObjectPrivate::signalIndex(method); return QObjectPrivate::get(q)->isSignalConnected(signalIdx); } bool UCListItemPrivate::isPressAndHoldConnected() { Q_Q(UCListItem); static QMetaMethod method = QMetaMethod::fromSignal(&UCListItem::pressAndHold); static int signalIdx = QMetaObjectPrivate::signalIndex(method); return QObjectPrivate::get(q)->isSignalConnected(signalIdx); } void UCListItemPrivate::postThemeChanged() { Q_Q(UCListItem); // update divider colors divider->paletteChanged(); // update colors, panels if (!customColor) { q->resetHighlightColor(); } } // re-layouting the ListItem's contentItem void UCListItemPrivate::_q_relayout() { QQuickAnchors *contentAnchors = QQuickItemPrivate::get(contentItem)->anchors(); QQuickAnchorLine anchorLine; if (divider->isVisible()) { anchorLine = QQuickItemPrivate::get(divider)->top(); } else { anchorLine = bottom(); } contentAnchors->setBottom(anchorLine); } void UCListItemPrivate::_q_updateIndex() { Q_Q(UCListItem); q->update(); } // update contentMoving property when ListItemStyle.snapAnimation stopped() signal is emitted void UCListItemPrivate::_q_contentMoving() { setContentMoving(listItemStyle()->m_snapAnimation->isRunning()); } // synchronizes selection mode, initializes the style if has not been done yet, // which in turn reveals the selection panels // same for the dragMode void UCListItemPrivate::_q_syncDragMode() { loadStyleItem(); Q_Q(UCListItem); Q_EMIT q->dragModeChanged(); } void UCListItemPrivate::preStyleChanged() { snapOut(); UCStyledItemBasePrivate::preStyleChanged(); } // creates the style item, with altered default value of the animatePanels style property // the property is turned on after the panel initialization. bool UCListItemPrivate::loadStyleItem(bool animated) { // the style should be loaded only if one of the condition is satisfied // do not use selectMode() as that will create the selection handler, which may not even be needed at this phase. bool inSelectMode = (selection && selection->inSelectMode()); if (!swiped && !inSelectMode && !dragMode() && !(expansion && expansion->expanded())) { return false; } if (!UCStyledItemBasePrivate::loadStyleItem(animated)) { return false; } UCListItemStyle *myStyle = qobject_cast(styleItem); if (!myStyle) { // the style is not derived from ListItemStyle, clean preStyleChanged(); return false; } myStyle->updateFlickable(flickable); // bring the panels foreground styleItem->setZ(0); listItemStyle()->setAnimatePanels(true); return true; } // called when units size changes void UCListItemPrivate::_q_updateSize() { Q_Q(UCListItem); // update divider thickness divider->setImplicitHeight(UCUnits::instance()->dp(DIVIDER_THICKNESS_DP)); QQuickItem *owner = qobject_cast(q->sender()); if (!owner && parentAttached) { owner = static_cast(parentAttached->parent()); } q->setImplicitWidth(owner ? owner->width() : UCUnits::instance()->gu(IMPLICIT_LISTITEM_WIDTH_GU)); q->setImplicitHeight(UCUnits::instance()->gu(IMPLICIT_LISTITEM_HEIGHT_GU)); } // returns the index of the list item when used in model driven views, // and the child index in other cases int UCListItemPrivate::index() { Q_Q(UCListItem); // is there an index context property? QQmlContext *context = qmlContext(q); QVariant index = context->contextProperty("index"); return index.isValid() ? index.toInt() : (parentItem ? QQuickItemPrivate::get(parentItem)->childItems.indexOf(q) : -1); } // returns true if the highlight is possible; the highlight is possible if the // list item has at least one action, leading/trailing actions set, onClicked // or onPressAndHold signal handlers set bool UCListItemPrivate::canHighlight() { return (isClickedConnected() || isPressAndHoldConnected() || mainAction || leadingActions || trailingActions); } // set highlighted flag and update contentItem void UCListItemPrivate::setHighlighted(bool highlighted) { if (this->highlighted != highlighted) { this->highlighted = highlighted; suppressClick = false; Q_Q(UCListItem); q->update(); if (highlighted) { // start pressandhold timer pressAndHoldTimer.start(QGuiApplication::styleHints()->mousePressAndHoldInterval(), q); } else { pressAndHoldTimer.stop(); } Q_EMIT q->highlightedChanged(); } } // toggles the swiped flag and installs/removes event filter to capture pointer events outside // of list item area void UCListItemPrivate::_q_updateSwiping() { if (swiped) { setSwiped((contentItem->position() != zeroPos) || highlighted); } } void UCListItemPrivate::setSwiped(bool swiped) { suppressClick = swiped; if (this->swiped == swiped) { return; } this->swiped = swiped; Q_Q(UCListItem); QQuickWindow *window = q->window(); if (swiped) { window->installEventFilter(q); } else { window->removeEventFilter(q); // lock contentItem left/right edges lockContentItem(true); } Q_EMIT q->swipedChanged(); } // connects/disconnects from the Flickable anchestor to get notified when to do rebound void UCListItemPrivate::listenToRebind(bool listen) { if (parentAttached) { Q_Q(UCListItem); parentAttached->listenToRebind(q, listen); } } // lock/unlock contentItem's left and right anchors to the ListItem's left and right void UCListItemPrivate::lockContentItem(bool lock) { QQuickAnchors *contentAnchors = QQuickItemPrivate::get(contentItem)->anchors(); if (lock) { contentAnchors->setLeft(left()); contentAnchors->setRight(right()); zeroPos = contentItem->position(); } else { contentAnchors->resetLeft(); contentAnchors->resetRight(); } } void UCListItemPrivate::update() { if (!ready) { return; } Q_Q(UCListItem); q->update(); } /* * Snap out is performed when the ListItem.contentItem returns back to its original * X coordinates (0). At this point both leading and trailing action panels will * be disconnected, ascending Flickables will get unlocked (interactive value restored * to the state before they were locked) and ListItem.contentMoving will be reset. */ void UCListItemPrivate::snapOut() { if (!ready) { return; } setHighlighted(false); if (parentAttached) { Q_Q(UCListItem); // restore flickable's interactive and cleanup q->setKeepMouseGrab(false); // no need to listen flickables any longer listenToRebind(false); } if (styleItem) { listItemStyle()->invokeRebound(); } } // emits the style signal swipeEvent() void UCListItemPrivate::swipeEvent(const QPointF &localPos, UCSwipeEvent::Status status) { UCSwipeEvent event(localPos, lastPos, contentItem->position() + (localPos - lastPos), status); // clamp to the edges if the edge (leading/trailing) doesn't have actions defined if ((event.m_contentPos.x() < zeroPos.x() && !trailingActions) || (event.m_contentPos.x() > zeroPos.x() && !leadingActions)) { event.m_contentPos = zeroPos; } if (styleItem) { listItemStyle()->invokeSwipeEvent(&event); } if (event.m_contentPos != contentItem->position()) { contentItem->setPosition(event.m_contentPos); lastPos = localPos; if (status == UCSwipeEvent::Updated) { setContentMoving(true); setSwiped(true); } } } /*! * \qmltype ListItem * \instantiates UCListItem * \inqmlmodule Ubuntu.Components 1.2 * \ingroup ubuntu-listitem * \since Ubuntu.Components 1.2 * \brief The ListItem element provides Ubuntu design standards for list or grid * views. * The ListItem component was designed to be used in a list view. It does not * define any specific layout, but while its contents can be freely chosen by * the developer, care must be taken to keep the contents light in order to ensure * good performance when used in long list views. * * The component provides two color properties which configures the item's background * when normal or highlighted. This can be configured through \l color and \l highlightColor * properties. The list item is highlighted if there is an action attached to it. * This means that the list item must have an active component declared as child, * at least leading- or trailing actions specified, or to have a slot connected to * \l clicked or \l pressAndHold signal. In any other case the component will not * be highlighted, and \l highlighted property will not be toggled either. Also, * there will be no highlight happening if the click happens on the active component. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * * MainView { * width: units.gu(40) * height: units.gu(71) * * Column { * anchors.fill: parent * ListItem { * Button { * text: "Press me" * } * onClicked: console.log("clicked on ListItem") * } * ListItem { * leadingActions: ListItemActions { * actions: [ * Action { * iconName: "delete" * } * ] * } * onClicked: console.log("clicked on ListItem with leadingActions set") * } * ListItem { * trailingActions: ListItemActions { * actions: [ * Action { * iconName: "edit" * } * ] * } * onClicked: console.log("clicked on ListItem with trailingActions set") * } * ListItem { * Label { * text: "onClicked implemented" * } * onClicked: console.log("clicked on ListItem with onClicked implemented") * } * ListItem { * Label { * text: "onPressAndHold implemented" * } * onPressAndHold: console.log("long-pressed on ListItem with onPressAndHold implemented") * } * ListItem { * Label { * text: "No highlight" * } * } * } * } * \endqml * * \l contentItem holds all components and resources declared as child to ListItem. * Being an Item, all properties can be accessed or altered. However, make sure you * never change \b x, \b y, \b width, \b height or \b anchors properties as those are * controlled by the ListItem itself when leading or trailing actions are revealed * or when selectable and draggable mode is turned on, and thus might cause the * component to misbehave. Anchors margins are free to alter. * * Each ListItem has a thin divider shown on the bottom of the component. This * divider can be configured through the \l divider grouped property, which can * configure its margins from the edges of the ListItem as well as its visibility. * When used in ListView or \l UbuntuListView, the last list item will not * show the divider no matter of the visible property value set. * * ListItem can handle actions that can get swiped from front or back of the item. * These actions are Action elements visualized in panels attached to the front * or to the back of the item, and are revealed by swiping the item horizontally. * The swipe is started only after the mouse/touch move had passed a given threshold. * The actions are visualized by a panel, which is configurable through the \l * ListItemStyle. * * The actions are configured through the \l leadingActions as well as \l * trailingActions properties. * \qml * ListItem { * id: listItem * leadingActions: ListItemActions { * actions: [ * Action { * iconName: "delete" * onTriggered: listItem.destroy() * } * ] * } * trailingActions: ListItemActions { * actions: [ * Action { * iconName: "search" * onTriggered: { * // do some search * } * } * ] * } * } * \endqml * \note When a list item is swiped, it automatically connects both leading and * trailing actions to the list item. If needed, the same ListItemActions instance * can be used in both leading and trailing side. In the following example the * list item can be deleted through both leading and trailing actions using the * same container: * \qml * ListItem { * id: listItem * leadingActions: ListItemActions { * actions: [ * Action { * iconName: "delete" * onTriggered: listItem.destroy() * } * ] * } * trailingActions: leadingActions * } * \endqml * The action is triggered only after all the animations are completed. * \sa ListItemActions * * ListItem provides a set of attached properties which are attached to each panel * of the ListItem. However not all properties are valid in all the circumstances. * * The component is styled using the \l ListItemStyle style interface. * * \section2 Selection mode * The selection mode of a ListItem is controlled by the \l ViewItems::selectMode * attached property. This property is attached to each parent item of the ListItem * exception being when used as delegate in ListView, where the property is attached * to the view itself. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * * Flickable { * width: units.gu(40) * height: units.gu(50) * * // this will not have any effect * ViewItems.selectMode: true * Column { * // this will work * ViewItems.selectMode: false * width: parent.width * Repeater { * model: 25 * ListItem { * Label { * text: "ListItem in Flickable #" + index * } * } * } * } * } * \endqml * The indices selected are stored in \l ViewItems::selectedIndices attached property, * attached the same way as the \l ViewItems::selectMode property is. This is a * read/write property, meaning that initial selected item indices can be set up. * The list contains the indices added in the order of selection, not sorted in * any form. * * \note When in selectable mode, the ListItem content is not disabled and \l clicked * and \l pressAndHold signals are also emitted. The only restriction the component * implies is that leading and trailing actions cannot be swiped in. \ selectable * property can be used to implement different behavior when \l clicked or \l * pressAndHold. * * \section2 Dragging mode * The dragging mode is only supported on ListView, as it requires a model supported * view to be used. The drag mode can be activated through the \l ViewItems::dragMode * attached property, when attached to the ListView. The items will show a panel * as defined in the style, and dragging will be possible when initiated over this * panel. Pressing or clicking anywhere else on the ListItem will invoke the item's * action assigned to the touched area. * * The dragging is realized through the \l ViewItems::dragUpdated signal, and * a signal handler must be implemented in order to have the draging working. * Implementations can drive the drag to be live (each time the dragged item is * dragged over an other item will change the order of the items) or drag'n'drop * way (the dragged item will be moved only when the user releases the item by * dropping it to the desired position). The signal has a \l ListItemDrag \e event * parameter, which gives detailed information about the drag event, like started, * dragged up or downwards or dropped, allowing in this way various restrictions * on the dragging. * * The dragging event provides three states reported in \l ListItemDrag::status * field, \e Started, \e Moving and \e Dropped. The other event field values depend * on the status, therefore the status must be taken into account when implementing * the signal handler. In case live dragging is needed, \e Moving state must be * checked, and for non-live drag (drag'n'drop) the \e Moving state must be blocked * by setting \e {event.accept = false}, otherwise the dragging will not know * whether the model has been updated or not. * * Example of live drag implementation: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * * ListView { * model: ListModel { * Component.onCompleted: { * for (var i = 0; i < 100; i++) { * append({tag: "List item #"+i}); * } * } * } * delegate: ListItem { * Label { * text: modelData * } * color: dragMode ? "lightblue" : "lightgray" * onPressAndHold: ListView.view.ViewItems.dragMode = * !ListView.view.ViewItems.dragMode * } * ViewItems.onDragUpdated: { * if (event.status == ListItemDrag.Moving) { * model.move(event.from, event.to, 1); * } * } * moveDisplaced: Transition { * UbuntuNumberAnimation { * property: "y" * } * } * } * \endqml * * Example of drag'n'drop implementation: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * * ListView { * model: ListModel { * Component.onCompleted: { * for (var i = 0; i < 100; i++) { * append({tag: "List item #"+i}); * } * } * } * delegate: ListItem { * Label { * text: modelData * } * color: dragMode ? "lightblue" : "lightgray" * onPressAndHold: ListView.view.ViewItems.dragMode = * !ListView.view.ViewItems.dragMode * } * ViewItems.onDragUpdated: { * if (event.status == ListItemDrag.Moving) { * // inform dragging that move is not performed * event.accept = false; * } else if (event.status == ListItemDrag.Dropped) { * model.move(event.from, event.to, 1); * } * } * moveDisplaced: Transition { * UbuntuNumberAnimation { * property: "y" * } * } * } * \endqml * * ListItem does not provide animations when the ListView's model is updated. In order * to have animation, use UbuntuListView or provide a transition animation to the * moveDisplaced or displaced property of the ListView. * * \section3 Using non-QAbstractItemModel models * Live dragging (moving content on the move) is only possible when the model is * a derivate of the QAbstractItemModel. When a list model is used, the ListView * will re-create all the items in the view, meaning that the dragged item will * no longer be controlled by the dragging. However, non-live drag'n'drop operations * can still be implemented with these kind of lists as well. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * * ListView { * model: ["plum", "peach", "pomegrenade", "pear", "banana"] * delegate: ListItem { * Label { * text: modelData * } * color: dragMode ? "lightblue" : "lightgray" * onPressAndHold: ListView.view.ViewItems.dragMode = * !ListView.view.ViewItems.dragMode * } * ViewItems.onDragUpdated: { * if (event.status == ListItemDrag.Started) { * return; * } else if (event.status == ListItemDrag.Dropped) { * var fromData = model[event.from]; * // must use a temporary variable as list manipulation * // is not working directly on model * var list = model; * list.splice(event.from, 1); * list.splice(event.to, 0, fromData); * model = list; * } else { * event.accept = false; * } * } * } * \endqml * * When using DelegateModel, it must be taken into account when implementing the * \l ViewItems::dragUpdated signal handler. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * * ListView { * model: DelegateModel { * model: ["apple", "pear", "plum", "peach", "nuts", "dates"] * delegate: ListItem { * Label { * text: modelData * } * onPressAndHold: dragMode = !dragMode; * } * } * ViewItems.onDragUpdated: { * if (event.status == ListItemDrag.Moving) { * event.accept = false * } else if (event.status == ListItemDrag.Dropped) { * var fromData = model.model[event.from]; * var list = model.model; * list.splice(event.from, 1); * list.splice(event.to, 0, fromData); * model.model = list; * } * } * } * \endqml * * \sa ViewItems::dragMode, ViewItems::dragUpdated * * \section2 Expansion * Since Ubuntu.Components 1.3, ListItem supports expansion. ListItems declared * in a view can expand exclusively, having leading and trailing panes locked * when expanded and to be collapsed when tapping outside of the expanded area. * The expansion is driven by the \l expansion group property, and the behavior * by the \l ViewItems::expansionFlags and \l ViewItems::expandedIndices * attached properties. Each ListItem which is required to expand should set a * proper height in the \l expansion.height property, which should be bigger * than the collapsed height of the ListItem is. The expansion itself is driven * by the \l expansion.expanded property, which can be set freely depending on * the use case, on click, on long press, etc. * * The default expansion behavior is set to be exclusive and locked, meaning * there can be only one ListItem expanded within a view and neither leading * nor trailing action panels cannot be swiped in. Expanding an other ListItem * will collapse the previosuly expanded one. There can be cases when tapping * outside of the expanded area of a ListItem we woudl need the expanded one * to collapse automatically. This can be achieved by setting \c ViewItems.CollapseOnOutsidePress * flag to \l ViewItems::expansionFlags. This flag will also turn on \c ViewItems.Exclusive * flag, as tapping outside practicly forbids more than one item to be expanded * at a time. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * * ListView { * width: units.gu(40) * height: units.gu(71) * model: ListModel { * Component.onCompleted: { * for (var i = 0; i < 50; i++) { * append({data: i}); * } * } * } * ViewItems.expansionFlags: ViewItems.CollapseOnOutsidePress * delegate: ListItem { * Label { * text: "Model item #" + modelData * } * trailingActions: ListItemActions { * actions: [ * Action { * icon: "search" * }, * Action { * icon: "edit" * }, * Action { * icon: "copy" * } * ] * } * expansion.height: units.gu(15) * onClicked: expansion.expanded = true * } * } * \endqml * The example above collapses the expanded item whenever it is tapped or mouse * pressed outside of the expanded list item. * \note Set 0 to \l ViewItems::expansionFlags if no restrictions on expanded items * is required (i.e multiple expanded items are allowed, swiping leading/trailing * actions when expanded). * \note Do not bind \l expansion.height to the ListItem's height as is will cause * binding loops. * * \section2 Note on styling * ListItem's styling differs from the other components styling, as ListItem loads * the style only when either of the leadin/trailing panels are swiped, or when the * item enters in select- or drag mode. The component does not assume any visuals * to be present in the style. * \sa ListItemStyle */ /*! * \qmlsignal ListItem::clicked() * The signal is emitted when the component gets released while the \l highlighted property * is set. The signal is not emitted if the ListItem content is swiped or when used in * Flickable (or ListView, GridView) and the Flickable gets moved. * * If the ListItem contains a component which contains an active MouseArea, the clicked * signal will be supressed when clicked over this area. */ /*! * \qmlsignal ListItem::pressAndHold() * The signal is emitted when the list item is long pressed. * * If the ListItem contains a component which contains an active MouseArea, the pressAndHold * signal will be supressed when pressed over this area. */ UCListItem::UCListItem(QQuickItem *parent) : UCStyledItemBase(*(new UCListItemPrivate), parent) { Q_D(UCListItem); d->init(); } UCListItem::~UCListItem() { } // override keyNavigationFocus getter bool UCListItem::keyNavigationFocus() const { Q_D(const UCListItem); return d->keyNavigationFocus ||d->listViewKeyNavigation; } void UCListItemPrivate::setListViewKeyNavigation(bool value) { Q_Q(UCListItem); bool prevKeyNav = q->keyNavigationFocus(); listViewKeyNavigation = value; if (prevKeyNav != q->keyNavigationFocus()) { Q_EMIT q->keyNavigationFocusChanged(); } } QObject *UCListItem::attachedViewItems(QObject *object, bool create) { return qmlAttachedPropertiesObject(object, create); } void UCListItem::classBegin() { UCStyledItemBase::classBegin(); Q_D(UCListItem); d->_q_themeChanged(); d->divider->paletteChanged(); } void UCListItem::componentComplete() { UCStyledItemBase::componentComplete(); Q_D(UCListItem); // set contentItem's context QQmlEngine::setContextForObject(d->contentItem, qmlContext(this)); // anchor contentItem prior doing anything else QQuickAnchors *contentAnchors = QQuickItemPrivate::get(d->contentItem)->anchors(); contentAnchors->setTop(d->top()); d->_q_relayout(); d->lockContentItem(true); d->ready = true; /* We only deal with ListView, as for other cases we would need to check the children * changes, which would have an enormous impact on performance in case of huge amount * of items. However, if the parent item, or Flickable declares a "count" property, * the ListItem will take use of it! */ d->countOwner = (d->flickable && d->flickable->property("count").isValid()) ? d->flickable : (d->parentItem && d->parentItem->property("count").isValid()) ? d->parentItem : 0; if (d->countOwner) { QObject::connect(d->countOwner.data(), SIGNAL(countChanged()), this, SLOT(_q_updateIndex()), Qt::DirectConnection); update(); } if (d->parentAttached) { // update draggable connect(d->parentAttached, SIGNAL(dragModeChanged()), this, SLOT(_q_syncDragMode())); // if selection or drag mode is on, initialize style, with animations turned off if (d->parentAttached->selectMode() || d->parentAttached->dragMode() || (d->expansion && d->expansion->expanded())) { d->loadStyleItem(false); } // set the object name for testing purposes if (d->dragging()) { setObjectName("DraggedListItem"); } } } void UCListItem::itemChange(ItemChange change, const ItemChangeData &data) { UCStyledItemBase::itemChange(change, data); if (change == ItemParentHasChanged) { Q_D(UCListItem); // make sure we are not connected to any previous Flickable d->listenToRebind(false); // check if we are in a positioner, and if that positioner is in a Flickable QQuickBasePositioner *positioner = qobject_cast(data.item); if (positioner && positioner->parentItem()) { d->flickable = qobject_cast(positioner->parentItem()->parentItem()); } else if (data.item && data.item->parentItem()){ // check if we are in a Flickable then d->flickable = qobject_cast(data.item->parentItem()); } // attach ViewItems to parent item or to ListView QQuickItem *parentAttachee = data.item; if (d->flickable && d->flickable->inherits("QQuickListView")) { // attach to ListView d->parentAttached = static_cast(attachedViewItems(d->flickable, true)); parentAttachee = d->flickable; } else if (data.item) { d->parentAttached = static_cast(attachedViewItems(data.item, true)); } else { // mark as not ready, so no action should be performed which depends on readyness d->ready = false; // about to be deleted or reparented, disable attached d->parentAttached = 0; } if (d->styleItem) { UCListItemStyle * myStyle = static_cast(d->styleItem); myStyle->updateFlickable(d->flickable); } if (d->parentAttached) { d->selection->attachToViewItems(d->parentAttached.data()); connect(d->parentAttached.data(), SIGNAL(expandedIndicesChanged(QList)), this, SLOT(_q_updateExpansion(QList)), Qt::DirectConnection); // if the ViewItems is attached to a ListView, disable tab stops on the ListItem setActiveFocusOnTab(!d->parentAttached->isAttachedToListView()); d->isTabFence = d->parentAttached->isAttachedToListView(); } if (parentAttachee) { QObject::connect(parentAttachee, SIGNAL(widthChanged()), this, SLOT(_q_updateSize()), Qt::DirectConnection); // update size d->_q_updateSize(); } } } QSGNode *UCListItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) { Q_UNUSED(data); Q_D(UCListItem); QColor color = d->highlighted ? d->highlightColor : d->color; if (width() <= 0 || height() <= 0) { delete oldNode; return 0; } QSGRectangleNode *rectNode = 0; rectNode = static_cast(oldNode); if (!rectNode) { rectNode = QQuickItemPrivate::get(this)->sceneGraphContext()->createRectangleNode(); } bool updateNode = false; // focus frame bool paintFocus = hasActiveFocus() && keyNavigationFocus(); rectNode->setPenWidth(paintFocus ? UCUnits::instance()->dp(1) : 0); if (paintFocus) { QColor penColor; if (getTheme()) { penColor = getTheme()->getPaletteColor(isEnabled() ? "normal" : "disabled", "focus"); } rectNode->setPenColor(penColor); rectNode->setColor(Qt::transparent); updateNode = true; } QRectF rect(boundingRect()); rect -= QMarginsF(0, 0, UCUnits::instance()->dp(1), 0); d->divider->setOpacity(paintFocus ? 0.0 : 1.0); rectNode->setRect(rect); // highlight color if (color.alphaF() >= (1.0f / 255.0f)) { rectNode->setColor(color); rectNode->setGradientStops(QGradientStops()); rectNode->setAntialiasing(true); rectNode->setAntialiasing(false); updateNode = true; } // update if (updateNode) { rectNode->update(); } else { // delete node, this will delete the divider node as well delete rectNode; rectNode = 0; } oldNode = rectNode; return oldNode; } // grabs the left mouse button event by turning highlight on, and triggering // swipe events; child items should no longer get mouse events void UCListItemPrivate::handleLeftButtonPress(QMouseEvent *event) { Q_Q(UCListItem); button = event->button(); // create style instance loadStyleItem(); setHighlighted(true); lastPos = pressedPos = event->localPos(); // connect the Flickable to know when to rebound listenToRebind(true); if (swiped) { // grab now, and ungrab in snapOut q->setKeepMouseGrab(true); q->grabMouse(); } // stop any ongoing animation! swipeEvent(event->localPos(), UCSwipeEvent::Started); // accept the event so we get the rest of the events as well event->accept(); } void UCListItem::mousePressEvent(QMouseEvent *event) { UCStyledItemBase::mousePressEvent(event); Q_D(UCListItem); d->button = event->button(); if (d->parentAttached && d->parentAttached->isMoving()) { // while moving, we cannot select any items return; } if (d->canHighlight() && !d->highlighted && event->button() == Qt::LeftButton) { d->handleLeftButtonPress(event); } if (d->shouldShowContextMenu(event)) { d->showContextMenu(); } } bool UCListItemPrivate::shouldShowContextMenu(QMouseEvent *event) { if (event->button() != Qt::RightButton) return false; return leadingActions || trailingActions; } void UCListItemPrivate::_q_popoverClosed() { setHighlighted(false); } void UCListItemPrivate::showContextMenu() { Q_Q(UCListItem); // themes 1.2 and below should not have context menu support, so leave quint16 version(importVersion(q)); if (version <= BUILD_VERSION(1, 2)) { return; } // Highlight the Item while the menu is showing setHighlighted(true); // Reset the timer which otherwise is started with highlighting pressAndHoldTimer.stop(); QString versionString(QStringLiteral("%1.%2").arg(MAJOR_VERSION(version)).arg(MINOR_VERSION(version))); const QString relativeUrl = versionString + "/ListItemPopover.qml"; QUrl url(UbuntuComponentsPlugin::pluginUrl().resolved(relativeUrl)); // Open Popover QQmlEngine* engine = qmlEngine(q); QQmlComponent* component = new QQmlComponent(engine, url, QQmlComponent::PreferSynchronous, q); if (component->isError()) { qmlInfo(q) << component->errorString(); } else { QQmlEngine::setContextForObject(component, qmlContext(q)); QQuickItem* item = static_cast(component->create(qmlContext(q))); item->setProperty("caller", QVariant::fromValue(q)); item->setParentItem(QuickUtils::instance()->rootItem(q)); QMetaObject::invokeMethod(item, "show"); QObject::connect(item, SIGNAL(visibleChanged()), q, SLOT(_q_popoverClosed()), Qt::DirectConnection); } delete component; } // ungrabs any previously grabbed left mouse button event void UCListItemPrivate::handleLeftButtonRelease(QMouseEvent *event) { Q_Q(UCListItem); // set released if (highlighted) { // unblock ascending Flickables listenToRebind(false); q->setKeepMouseGrab(false); if (window && window->mouseGrabberItem() == q) { q->ungrabMouse(); } if (!suppressClick) { // emit clicked only if not swiped if (!swiped) { Q_EMIT q->clicked(); if (mainAction) { invokeTrigger(mainAction, index()); } } snapOut(); } else { // inform style about mouse/touch release swipeEvent(event->localPos(), UCSwipeEvent::Finished); suppressClick = false; setHighlighted(false); } } button = Qt::NoButton; event->accept(); } void UCListItem::mouseReleaseEvent(QMouseEvent *event) { Q_D(UCListItem); if (d->shouldShowContextMenu(event)) { return; } UCStyledItemBase::mouseReleaseEvent(event); if (!contains(mapFromScene(event->windowPos()))) d->suppressClick = true; d->handleLeftButtonRelease(event); } // returns true if the mouse is swiped over the threshold value bool UCListItemPrivate::swipedOverThreshold(const QPointF &mousePos, const QPointF relativePos) { if ((!leadingActions || UCListItemActionsPrivate::get(leadingActions)->actions.size() <= 0) && (!trailingActions || UCListItemActionsPrivate::get(trailingActions)->actions.size() <= 0)) { return false; } qreal threshold = UCUnits::instance()->gu(xAxisMoveThresholdGU); qreal mouseX = mousePos.x(); qreal pressedX = relativePos.x(); return swipeEnabled && ((mouseX < (pressedX - threshold)) || (mouseX > (pressedX + threshold))); } void UCListItem::mouseMoveEvent(QMouseEvent *event) { Q_D(UCListItem); UCStyledItemBase::mouseMoveEvent(event); if (d->selectMode() || d->dragMode() || (d->expansion && d->expansion->expandedLocked())) { // no move is allowed while selectable mode is on return; } // accept the tugging only if the move is within the threshold // use saved button because MouseMove has no button() and buttons() isn't reliable if (d->button == Qt::LeftButton && d->highlighted && !d->swiped) { // check if we can initiate the drag at all // only X direction matters, if Y-direction leaves the threshold, but X not, the tug is not valid if (d->swipedOverThreshold(event->localPos(), d->pressedPos)) { // the press went out of the threshold area, enable move, if the direction allows it d->lastPos = event->localPos(); setKeepMouseGrab(true); qreal mouseX = event->localPos().x(); qreal pressedX = d->pressedPos.x(); bool doSwipe = (d->leadingActions && (mouseX > pressedX)) || (d->trailingActions && (mouseX < pressedX)); d->setSwiped(doSwipe); // unlock contentItem's left/right edges d->lockContentItem(!doSwipe); d->loadStyleItem(); d->pressAndHoldTimer.stop(); } } if (d->swiped) { d->pressAndHoldTimer.stop(); // send swipe event to style and update contentItem position d->swipeEvent(event->localPos(), UCSwipeEvent::Updated); } } bool UCListItemPrivate::sendMouseEvent(QQuickItem *item, QMouseEvent *event) { Q_UNUSED(item); Q_Q(UCListItem); QQuickItem *grabber = window ? window->mouseGrabberItem() : Q_NULLPTR; if (grabber == q) { // already the grabber, return return true; } bool consumed = false; if (contentItem->contains(contentItem->mapFromScene(event->windowPos()))) { QPointF localPos = q->mapFromScene(event->windowPos()); switch (event->type()) { case QEvent::MouseButtonPress: { // remember pressed point over active areas if (event->button() == Qt::LeftButton) { if (swiped) { // handle as full press and grab the event from the children QScopedPointer mouseEvent(QQuickWindowPrivate::cloneMouseEvent(event, &localPos)); handleLeftButtonPress(mouseEvent.data()); consumed = true; } else { // remember the position pressedPos = localPos; button = event->button(); } } break; } case QEvent::MouseButtonRelease: { QScopedPointer mouseEvent(QQuickWindowPrivate::cloneMouseEvent(event, &localPos)); handleLeftButtonRelease(mouseEvent.data()); suppressClick = false; break; } case QEvent::MouseMove: { if ((button == Qt::LeftButton) && swipedOverThreshold(localPos, pressedPos) && !highlighted) { // grab the event from the child, so the click doesn't happen anymore, and initiate swiping QMouseEvent pressed(QEvent::MouseButtonPress, localPos, event->windowPos(), event->screenPos(), Qt::LeftButton, event->buttons(), event->modifiers()); handleLeftButtonPress(&pressed); // grab any further events so all land in the list item q->setKeepMouseGrab(true); q->grabMouse(); consumed = true; } break; } default: break; } } return consumed; } bool UCListItem::childMouseEventFilter(QQuickItem *child, QEvent *event) { if (!isVisible() || !isEnabled()) { return UCStyledItemBase::childMouseEventFilter(child, event); } Q_D(UCListItem); switch (event->type()) { case QEvent::MouseButtonPress: case QEvent::MouseMove: case QEvent::MouseButtonRelease: { if (d->sendMouseEvent(child, static_cast(event))) { return true; } } default: break; } return UCStyledItemBase::childMouseEventFilter(child, event); } bool UCListItem::eventFilter(QObject *target, QEvent *event) { QPointF myPos; // only filter press events, and rebound when pressed outside if (event->type() == QEvent::MouseButtonPress) { QMouseEvent *mouse = static_cast(event); QQuickWindow *window = qobject_cast(target); if (window) { myPos = window->contentItem()->mapToItem(this, mouse->localPos()); } } else if (event->type() == QEvent::TouchBegin) { QTouchEvent *touch = static_cast(event); QQuickWindow *window = qobject_cast(target); if (window) { myPos = window->contentItem()->mapToItem(this, touch->touchPoints()[0].pos()); } } if (!myPos.isNull() && !contains(myPos)) { Q_D(UCListItem); d->snapOut(); // only accept event, but let it be handled by the underlying or surrounding Flickables event->accept(); } return UCStyledItemBase::eventFilter(target, event); } void UCListItem::timerEvent(QTimerEvent *event) { Q_D(UCListItem); if (event->timerId() == d->pressAndHoldTimer.timerId() && d->highlighted && !d->swiped) { d->pressAndHoldTimer.stop(); if (isEnabled() && d->isPressAndHoldConnected()) { d->suppressClick = true; Q_EMIT pressAndHold(); } } else { QQuickItem::timerEvent(event); } } void UCListItem::focusInEvent(QFocusEvent *event) { UCStyledItemBase::focusInEvent(event); if (event->reason() == Qt::MouseFocusReason) { d_func()->setListViewKeyNavigation(false); } update(); } void UCListItem::focusOutEvent(QFocusEvent *event) { UCStyledItemBase::focusOutEvent(event); d_func()->setListViewKeyNavigation(false); update(); } // handle horizontal keys to navigate between focusable slots void UCListItem::keyPressEvent(QKeyEvent *event) { UCStyledItemBase::keyPressEvent(event); Q_D(UCListItem); int key = event->key(); if (key != Qt::Key_Left && key != Qt::Key_Right) { return; } bool forwards = (d->effectiveLayoutMirror ? key == Qt::Key_Left : key == Qt::Key_Right); // we must check whether the ListItem has any key navigation focusable child // this is needed due to the Qt bug https://bugreports.qt.io/browse/QTBUG-50516 if (!QuickUtils::firstFocusableChild(this)) { return; } // get the next focusable relative to the active focus item QQuickItem *activeFocus = isFocusScope() ? scopedFocusItem() : window()->activeFocusItem(); if (!activeFocus) { return; } Qt::FocusReason reason = forwards ? Qt::TabFocusReason : Qt::BacktabFocusReason; if ((activeFocus == QuickUtils::firstFocusableChild(this) && !forwards) || (activeFocus == QuickUtils::lastFocusableChild(this) && forwards)) { // first or the last focus child is reached, so we wrap around // but for that we must set the activeFocus to false in order to // be able to focus the ListItem, especially when the ListItem is a Tab fence activeFocus->setFocus(false); forceActiveFocus(reason); } else if (activeFocus == this) { // get the first or last focusable item, depending on the direction QQuickItem *nextFocus = forwards ? QuickUtils::firstFocusableChild(this) : QuickUtils::lastFocusableChild(this); nextFocus->forceActiveFocus(reason); } else { // in case the ListItem is in ListView, we can freely proceed with the focusing QQuickItemPrivate::focusNextPrev(activeFocus, forwards); } } /*! * \qmlproperty ListItemActions ListItem::leadingActions * * The property holds the actions and its configuration to be revealed when swiped * from left to right. * * \sa trailingActions */ UCListItemActions *UCListItem::leadingActions() const { Q_D(const UCListItem); return d->leadingActions; } void UCListItem::setLeadingActions(UCListItemActions *actions) { Q_D(UCListItem); if (d->leadingActions == actions) { return; } // snap out before we change the actions d->snapOut(); d->leadingActions = actions; Q_EMIT leadingActionsChanged(); } /*! * \qmlproperty ListItemActions ListItem::trailingActions * * The property holds the actions and its configuration to be revealed when swiped * from right to left. * * \sa leadingActions */ UCListItemActions *UCListItem::trailingActions() const { Q_D(const UCListItem); return d->trailingActions; } void UCListItem::setTrailingActions(UCListItemActions *actions) { Q_D(UCListItem); if (d->trailingActions == actions) { return; } // snap out before we change the actions d->snapOut(); d->trailingActions = actions; Q_EMIT trailingActionsChanged(); } /*! * \qmlproperty Item ListItem::contentItem * * contentItem holds the components placed on a ListItem. It is anchored to the * ListItem on left, top and right, and to the divider on the bottom, or to the * ListItem's bottom in case the divider is not visible. The content is clipped * by default. It is not recommended to change the anchors as the ListItem controls * them, however any other property value is free to change. * Example: * \qml * ListItem { * contentItem.anchors { * leftMargin: units.gu(2) * rightMargin: units.gu(2) * topMargin: units.gu(0.5) * bottomMargin: units.gu(0.5) * } * } * \endqml */ QQuickItem* UCListItem::contentItem() const { Q_D(const UCListItem); return d->contentItem; } /*! * \qmlpropertygroup ::ListItem::divider * \qmlproperty real ListItem::divider.colorFrom * \qmlproperty real ListItem::divider.colorTo * * This grouped property configures the thin divider shown in the bottom of the * component. The divider is not moved together with the content when swiped left * or right to reveal the actions. \b colorFrom and \b colorTo configure * the starting and ending colors of the divider. Beside these properties all Item * specific properties can be accessed. * * When \b visible is true, the ListItem's content size gets thinner with the * divider's \b thickness. By default the divider is anchored to the bottom, left * right of the ListItem, and has a 2dp height. */ UCListItemDivider* UCListItem::divider() const { Q_D(const UCListItem); return d->divider; } /*! * \qmlproperty bool ListItem::highlighted * True when the item is pressed. The items stays highlighted when the mouse or touch * is moved horizontally. When in Flickable (or ListView), the item gets un-highlighted * (false) when the mouse or touch is moved towards the vertical direction causing * the flickable to move. * * Configures the color when highlighted. Defaults to the theme palette's background * color. * * An item is highlighted, thus highlight state toggled, when pressed and it has * one of the following conditions fulfilled: * \list * \li \l leadingActions or \l trailingActions set, * \li it has an \l action attached * \li if the ListItem has an active child component, such as a \l Button, a * \l Switch, etc. * \li in general, if an active (enabled and visible) \b MouseArea is added * as a child component * \li \l clicked signal handler is implemented or there is a slot or function * connected to it * \li \l pressAndHold signal handler is implemented or there is a slot or * function connected to it. * \endlist * * \note Adding an active component does not mean the component will be activated * when the ListItem will be tapped/clicked outside of the component area. If * such a behavior is needed, that must be done explicitly. * \qml * ListItem { * Label { * text: "This is a label" * } * Switch { * id: toggle * anchors.right: parent.right * } * Component.onCompleted: clicked.connect(toggle.clicked) * } * \endqml * * \sa action, leadingActions, trailingActions */ bool UCListItem::highlighted() const { Q_D(const UCListItem); return d->highlighted; } /*! * \qmlproperty bool ListItem::contentMoving * \readonly * The property describes whether the content is moving or not. The content is * moved when swiped or when snapping in or out, and lasts till the snapping * animation completes. */ /*! * \qmlsignal ListItem::contentMovementStarted() * The signal is emitted when the content movement has started. */ /*! * \qmlsignal ListItem::contentMovementEnded() * The signal is emitted when the content movement has ended. */ bool UCListItemPrivate::contentMoving() const { return contentMoved; } void UCListItemPrivate::setContentMoving(bool moved) { if (contentMoved == moved) { return; } contentMoved = moved; Q_Q(UCListItem); if (contentMoved) { Q_EMIT q->contentMovementStarted(); } else { Q_EMIT q->contentMovementEnded(); } Q_EMIT q->contentMovingChanged(); } /*! * \qmlproperty color ListItem::color * Configures the color of the normal background. The default value is transparent. */ QColor UCListItem::color() const { Q_D(const UCListItem); return d->color; } void UCListItem::setColor(const QColor &color) { Q_D(UCListItem); if (d->color == color) { return; } d->color = color; update(); Q_EMIT colorChanged(); } /*! * \qmlproperty color ListItem::highlightColor * Configures the color when highlighted. Defaults to the theme palette's background * color. If changed, it can be reset by assigning undefined as value. */ QColor UCListItem::highlightColor() const { Q_D(const UCListItem); return d->highlightColor; } void UCListItem::setHighlightColor(const QColor &color) { Q_D(UCListItem); // mark it as custom even if the value is the same as the previous one d->customColor = true; if (d->highlightColor == color) { return; } d->highlightColor = color; update(); Q_EMIT highlightColorChanged(); } void UCListItem::resetHighlightColor() { Q_D(UCListItem); d->customColor = false; UCTheme *theme = getTheme(); if (theme) { d->highlightColor = theme->getPaletteColor("highlighted", "background"); } update(); Q_EMIT highlightColorChanged(); } /*! * \qmlproperty bool ListItem::dragging * The property informs about an ongoing dragging on a ListItem. */ bool UCListItemPrivate::dragging() { return !dragHandler.isNull(); } /*! * \qmlproperty bool ListItem::dragMode * The property reports whether a ListItem is draggable or not. While in drag mode, * the list item content cannot be swiped. The default value is false. */ bool UCListItemPrivate::dragMode() { UCViewItemsAttachedPrivate *attached = UCViewItemsAttachedPrivate::get(parentAttached); return attached ? attached->draggable : false; } void UCListItemPrivate::setDragMode(bool draggable) { if (parentAttached) { parentAttached->setDragMode(draggable); } } /*! * * \qmlproperty bool ListItem::selected * The property drives whether a list item is selected or not. Defaults to false. * * \sa ListItem::selectMode, ViewItems::selectMode */ bool UCListItemPrivate::isSelected() { Q_ASSERT(selection); return selection->isSelected(); } void UCListItemPrivate::setSelected(bool value) { Q_ASSERT(selection); selection->setSelected(value); } /*! * \qmlproperty bool ListItem::selectMode * The property reports whether the component and the view using the component * is in selectable state. While selectable, the ListItem's leading- and trailing * panels cannot be swiped in. \l clicked and \l pressAndHold signals are also * triggered. Selectable mode can be set either through this property or through * the parent attached \l ViewItems::selectMode property. */ bool UCListItemPrivate::selectMode() { Q_Q(UCListItem); if (!selection) { selection = new ListItemSelection(q); } return selection->inSelectMode(); } void UCListItemPrivate::setSelectMode(bool selectable) { Q_Q(UCListItem); if (!selection) { selection = new ListItemSelection(q); } selection->setSelectMode(selectable); } /*! * \qmlproperty Action ListItem::action * The property holds the action which will be triggered when the ListItem is * clicked. ListItem will not visualize the action, that is the responsibility * of the components placed inside the list item. However, when set, the ListItem * will be highlighted on press. * * If the action set has no value type set, ListItem will set its type to \b * Action.Integer and the \l {Action::triggered}{triggered} signal will be getting * the ListItem index as \e value parameter. * * Defaults no null. */ UCAction *UCListItemPrivate::action() const { return mainAction; } void UCListItemPrivate::setAction(UCAction *action) { Q_Q(UCListItem); if (mainAction == action) { return; } if (mainAction) { mainAction->removeOwningItem(q); } mainAction = action; if (mainAction) { mainAction->addOwningItem(q); if (mainAction->m_parameterType == UCAction::None) { // call setProperty to invoke notify signal mainAction->setProperty("parameterType", UCAction::Integer); } } Q_EMIT q->actionChanged(); } /*! * \qmlproperty list ListItem::listItemData * \default * \internal * Overloaded default property containing all the children and resources. */ QQmlListProperty UCListItemPrivate::data() { return QQuickItemPrivate::get(contentItem)->data(); } /*! * \qmlproperty list ListItem::listItemChildren * \internal * Overloaded default property containing all the visible children of the item. */ QQmlListProperty UCListItemPrivate::children() { return QQuickItemPrivate::get(contentItem)->children(); } /*! * \qmlpropertygroup ::ListItem::expansion * \qmlproperty bool ListItem::expansion.expanded * \qmlproperty real ListItem::expansion.height * \since Ubuntu.Components 1.3 * The group drefines the expansion state of the ListItem. */ UCListItemExpansion *UCListItem::expansion() { Q_D(UCListItem); if (!d->expansion) { d->expansion = new UCListItemExpansion(this); } return d->expansion; } void UCListItemPrivate::_q_updateExpansion(const QList &indices) { Q_Q(UCListItem); Q_EMIT q->expansion()->expandedChanged(); // make sure the style is loaded if (indices.contains(index())) { loadStyleItem(); } } /*! * \qmlproperty bool ListItem::swipeEnabled * \since Ubuntu.Components 1.3 * The property enables the swiping of the leading- or trailing actions. This * is useful when an overlay component needs to handle mouse moves or drag events * without the ListItem to steal the events. Defaults to true. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * * ListView { * width: units.gu(40) * height: units.gu(70) * model: 25 * delegate: ListItem { * swipeEnabled: !mouseArea.drag.active * Rectangle { * color: "red" * width: units.gu(2) * height: width * MouseArea { * id: mouseArea * anchors.fill: parent * drag.target: parent * } * } * } * } * \endqml */ bool UCListItem::isSwipeEnabled() const { Q_D(const UCListItem); return d->swipeEnabled; } void UCListItem::setSwipeEnabled(bool swipeEnabled) { Q_D(UCListItem); if (d->swipeEnabled == swipeEnabled) { return; } d->swipeEnabled = swipeEnabled; Q_EMIT swipeEnabledChanged(); } /*! * \qmlproperty bool ListItem::swiped * \readonly * \since Ubuntu.Components 1.3 * The property notifies about the content being swiped so leading or trailing * actions are visible. */ bool UCListItem::isSwiped() { Q_D(UCListItem); return d->swiped; } #include "moc_uclistitem.cpp" ./src/Ubuntu/Components/plugin/ucimportversionchecker_p.h0000644000015600001650000000200212700370701024045 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCIMPORTVERSIONCHECKER_P_H #define UCIMPORTVERSIONCHECKER_P_H #include class UCImportVersionChecker { public: UCImportVersionChecker() {} virtual QString propertyForVersion(quint16 version) const = 0; virtual quint16 importVersion(QObject *object); }; #endif // UCIMPORTVERSIONCHECKER_P_H ./src/Ubuntu/Components/plugin/ucserviceproperties.h0000644000015600001650000000516412700370701023052 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCSERVICEPROPERTIES_H #define UCSERVICEPROPERTIES_H #include #include class UCServicePropertiesPrivate; class UCServiceProperties : public QObject, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(ServiceType type READ type WRITE setType NOTIFY typeChanged REVISION 1) Q_PROPERTY(QString service READ service WRITE setService NOTIFY serviceChanged REVISION 1) Q_PROPERTY(QString path READ path WRITE setPath NOTIFY pathChanged REVISION 1) Q_PROPERTY(QString serviceInterface READ interface WRITE setInterface NOTIFY serviceInterfaceChanged REVISION 1) Q_PROPERTY(QString adaptorInterface READ adaptor WRITE setAdaptor NOTIFY adaptorInterfaceChanged REVISION 1) Q_PROPERTY(QString error READ error NOTIFY errorChanged REVISION 1) Q_PROPERTY(Status status READ status NOTIFY statusChanged REVISION 1) Q_ENUMS(ServiceType Status) public: enum ServiceType { Undefined, System, Session }; enum Status { Inactive, ConnectionError, Synchronizing, Active }; explicit UCServiceProperties(QObject *parent = 0); ~UCServiceProperties(); void classBegin(); void componentComplete(); ServiceType type() const; void setType(ServiceType type); QString service() const; void setService(const QString &value); QString path() const; void setPath(const QString &value); QString interface() const; void setInterface(const QString &value); QString adaptor() const; void setAdaptor(const QString &value); QString error(); Status status() const; Q_SIGNALS: void typeChanged(); void serviceChanged(); void pathChanged(); void serviceInterfaceChanged(); void adaptorInterfaceChanged(); void errorChanged(); void statusChanged(); private: UCServicePropertiesPrivate *d_ptr; Q_DECLARE_PRIVATE_D(d_ptr, UCServiceProperties) }; #endif // UCSERVICEPROPERTIES_H ./src/Ubuntu/Components/plugin/ucbottomedge.h0000644000015600001650000001077512700370714021436 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCBOTTOMEDGE_H #define UCBOTTOMEDGE_H #include "ucstyleditembase.h" #include #include #include class UCBottomEdgeHint; class UCBottomEdgeRegion; class QQuickAbstractAnimation; class UCBottomEdgePrivate; class UCBottomEdge : public UCStyledItemBase { Q_OBJECT Q_ENUMS(Status DragDirection) Q_PROPERTY(UCBottomEdgeHint* hint READ hint CONSTANT FINAL) Q_PROPERTY(qreal dragProgress READ dragProgress NOTIFY dragProgressChanged FINAL) Q_PROPERTY(DragDirection dragDirection READ dragDirection NOTIFY dragDirectionChanged FINAL) Q_PROPERTY(Status status READ status NOTIFY statusChanged FINAL) Q_PROPERTY(QUrl contentUrl READ contentUrl WRITE setContent NOTIFY contentChanged FINAL) Q_PROPERTY(QQmlComponent *contentComponent READ contentComponent WRITE setContentComponent NOTIFY contentComponentChanged FINAL) Q_PROPERTY(QQuickItem* contentItem READ contentItem NOTIFY contentItemChanged FINAL) Q_PROPERTY(QQmlListProperty regions READ regions NOTIFY regionsChanged FINAL) Q_PROPERTY(UCBottomEdgeRegion* activeRegion READ activeRegion NOTIFY activeRegionChanged FINAL) Q_PROPERTY(bool preloadContent READ preloadContent WRITE setPreloadContent NOTIFY preloadContentChanged FINAL DESIGNABLE false) // overloaded data property to catch regions Q_PRIVATE_PROPERTY(UCBottomEdge::d_func(), QQmlListProperty data READ data DESIGNABLE false) Q_CLASSINFO("DefaultProperty", "data") public: enum Status { Hidden, Revealed, Committed }; enum DragDirection { Undefined, Upwards, Downwards }; explicit UCBottomEdge(QQuickItem *parent = 0); virtual ~UCBottomEdge(); UCBottomEdgeHint *hint() const; qreal dragProgress(); DragDirection dragDirection() const; Status status() const; QUrl contentUrl() const; void setContent(const QUrl &url); QQmlComponent *contentComponent() const; void setContentComponent(QQmlComponent *component); QQuickItem *contentItem() const; void setFillWindow(bool fill); QQmlListProperty regions(); UCBottomEdgeRegion *activeRegion(); bool preloadContent() const; void setPreloadContent(bool value); Q_SIGNALS: void dragProgressChanged(qreal dragProgress); void dragDirectionChanged(UCBottomEdge::DragDirection direction); void statusChanged(UCBottomEdge::Status status); void contentChanged(const QUrl url); void contentComponentChanged(QQmlComponent *component); void contentItemChanged(); void regionsChanged(); void activeRegionChanged(UCBottomEdgeRegion *activeRegion); void preloadContentChanged(); void commitStarted(); void commitCompleted(); void collapseStarted(); void collapseCompleted(); public Q_SLOTS: void commit(); void collapse(); protected: static void regions_append(QQmlListProperty *sections, UCBottomEdgeRegion *section); static int regions_count(QQmlListProperty *sections); static UCBottomEdgeRegion *regions_at(QQmlListProperty *sections, int index); static void regions_clear(QQmlListProperty *sections); void initializeComponent(); void classBegin(); void itemChange(ItemChange change, const ItemChangeData &data); bool eventFilter(QObject *target, QEvent *event) override; void unlockOperation(bool running); void onParentHeightChanged(); Q_DECLARE_PRIVATE(UCBottomEdge) private: friend class tst_BottomEdge; }; Q_DECLARE_METATYPE(UCBottomEdge::Status) Q_DECLARE_METATYPE(UCBottomEdge::DragDirection) Q_DECLARE_LOGGING_CATEGORY(ucBottomEdge) #define LOG qCDebug(ucBottomEdge) << "[BottomEdge]" #endif // UCBOTTOMEDGE_H ./src/Ubuntu/Components/plugin/ucaction.cpp0000644000015600001650000003665212700370701021113 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "ucaction.h" #include "quickutils.h" #include "ucactioncontext.h" #include #include #include #include #include Q_LOGGING_CATEGORY(ucAction, "ubuntu.components.Action", QtMsgType::QtWarningMsg) #define ACT_TRACE(params) qCDebug(ucAction) << params bool shortcutContextMatcher(QObject* object, Qt::ShortcutContext context) { UCAction* action = static_cast(object); if (!action->isEnabled()) { return false; } switch (context) { case Qt::ApplicationShortcut: return true; case Qt::WindowShortcut: { QObject* window = object; while (window && !window->isWindowType()) { window = window->parent(); if (QQuickItem* item = qobject_cast(window)) { window = item->window(); } } bool activatable = window && window == QGuiApplication::focusWindow(); if (activatable) { // is the last action owner item in an active context? QQuickItem *pl = action->lastOwningItem(); activatable = false; while (pl) { UCActionContextAttached *attached = static_cast( qmlAttachedPropertiesObject(pl, false)); if (attached) { activatable = attached->context()->active(); if (!activatable) { ACT_TRACE(action << "Inactive context found" << attached->context()); break; } } pl = pl->parentItem(); } if (!activatable) { // check if the action is in an active context UCActionContext *context = qobject_cast(action->parent()); activatable = context && context->active(); } } if (activatable) { ACT_TRACE("SELECTED ACTION" << action); } return activatable; } default: break; } return false; } /*! * \qmltype Action * \instantiates UCAction * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu * \brief Describe an action that can be re-used and shared between different * components. * * Actions can be used to define a specific task to be executed in different * contexts using different components. The same action can be assigned to * a \l Button, a \b Checkbox or even a \l TextField. The \l triggered signal * is emitted depending on the component. \l Button and \b CheckBox for instance * emits the signal when clicked, whereas \l TextField emits the signal when * its accepted signal is triggered. * * If the \l parameterType property is set, the Action is said to be parameterised. * This means that when it is bound to a menu or button, the action expects a * typed input parameter. The type affects the allowed value of the QVariant * that must be passed to the \l trigger and \l triggered. * \qml * Action { * id: action * parameterType: Action.Integer * text: "Int value" * onTriggered: { * // the value will be undefined * console.log("value is", value); * } * Component.onCompleted: trigger("Hello World!") * } * \endqml * * When an Action is assigned to a component, the component takes the values * from the action itself. Therefore assigning the action to a Button is enough * to set up the label and the icon to be shown by the button. * \code * Action { * id: stock * iconName: "call" * text: "Call" * } * Button { * // this binding will set the Button's text, iconName and * // iconSource properties. * action: stock * } * \endcode * * Actions are used to populate different Popovers like \l ActionSelectionPopover * as well as to define actions for pages, or when defining options in \c ListItemOptions. * * Examples: See \l Page * * \section2 Mnemonics * Since Ubuntu.Components 1.3 Action supports mnemonics. Mnemonics are shortcuts * defined in the \l text property, prefixed the shortcut letter with \&. For instance * \c "\&Call" will bint the \c "Alt-C" shortcut to the action. When a mnemonic * is detected on the Action and a keyboard is attached to the device, the \l text * property will provide a formatted text having the mnemonic letter underscored. * \qml * Action { * id: call * iconName: "call" * text: "&Call" * } * \endqml */ /*! * \qmlsignal Action::triggered(var value) * Signal called when the action is triggered. The user visible primary label of * the action when emitted by components. Custom implementations must make sure * this rule is followed, therefore instead of emitting the signal the \l trigger * function should be called. */ /*! * \qmlproperty string Action::description * User visible secondary description for the action. Description is more verbose * than the \l text and should describe the Action with couple of words. */ /*! * \qmlproperty string Action::text * The user visible primary label of the action. * * Mnemonics are shortcuts prefixed in the text with \&. If the text has multiple * occurences of the \& character, the first one will be considered for the shortcut. * The \& character cannot be used as shortcut. */ QString UCAction::text() { // if we have a mnemonic, underscore it if (!m_mnemonic.isEmpty()) { QString mnemonic = "&" + m_mnemonic.toString().remove("Alt+"); // patch special cases mnemonic.replace("Space", " "); int mnemonicIndex = m_text.indexOf(mnemonic); if (mnemonicIndex < 0) { // try lower case mnemonic = mnemonic.toLower(); mnemonicIndex = m_text.indexOf(mnemonic); } ACT_TRACE("MNEM" << mnemonic); QString displayText(m_text); // FIXME: we need QInputDeviceInfo to detect the keyboard attechment // https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1276808 if (QuickUtils::instance()->keyboardAttached()) { // underscore the character displayText.replace(mnemonicIndex, mnemonic.length(), "" + mnemonic[1] + ""); } else { displayText.remove(mnemonicIndex, 1); } return displayText; } return m_text; } void UCAction::setText(const QString &text) { if (m_text == text) { return; } m_text = text; setMnemonicFromText(m_text); Q_EMIT textChanged(); } void UCAction::resetText() { setText(QString()); } void UCAction::setMnemonicFromText(const QString &text) { QKeySequence sequence = QKeySequence::mnemonic(text); if (sequence == m_mnemonic) { return; } if (!m_mnemonic.isEmpty()) { QGuiApplicationPrivate::instance()->shortcutMap.removeShortcut(0, this, m_mnemonic); } m_mnemonic = sequence; if (!m_mnemonic.isEmpty()) { ACT_TRACE("MNEMONIC SET" << m_mnemonic.toString()); Qt::ShortcutContext context = Qt::WindowShortcut; QGuiApplicationPrivate::instance()->shortcutMap.addShortcut(this, m_mnemonic, context, shortcutContextMatcher); } } /*! * \qmlproperty string Action::keywords * Additional user visible keywords for the action. * The format of the keywords string is "Keyword 1;Keyword 2;Keyword 3" to allow * translators to define different number of keywords per language. The keywords * are separated by ; and they may contain spaces. * \qml * Action { * text: i18n.tr("Crop") * description: i18n.tr("Crop the image") * keywords: i18n.tr("Trim;Cut") * } * \endqml */ /*! * \qmlproperty enum Action::parameterType * Type of the parameter passed to \l trigger and \l triggered. * Type is an enumeration: * \list * \li \b Action.None: No paramater. (default) * \li \b Action.String: String parameter. * \li \b Action.Integer: Integer parameter. * \li \b Action.Bool: Boolean parameter. * \li \b Action.Real: Single precision floating point parameter. * \li \b Action.Object: The parameter is an object. * \endlist * \qml * Action { * id: action * parameterType: Action.String * onTriggered: { * // value arguments now contain strings * console.log(value); * } * Component.onCompleted: action.trigger("Hello World") * } * \endqml */ /*! * \qmlproperty bool Action::enabled * If set to false the action can not be triggered. Components visualizing the * action migth either hide the action or make it insensitive. However visibility * can be controlled separately using the \l visible property. */ /*! * \qmlproperty bool Action::visible * Specifies whether the action is visible to the user. Defaults to true. */ UCAction::UCAction(QObject *parent) : QObject(parent) , m_itemHint(Q_NULLPTR) , m_parameterType(None) , m_factoryIconSource(true) , m_enabled(true) , m_visible(true) , m_published(false) { generateName(); // FIXME: we need QInputDeviceInfo to detect the keyboard attechment // https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1276808 connect(QuickUtils::instance(), &QuickUtils::keyboardAttachedChanged, this, &UCAction::onKeyboardAttached); } UCAction::~UCAction() { resetShortcut(); resetText(); } bool UCAction::isValidType(QVariant::Type valueType) { bool valid = (valueType == QVariant::String && m_parameterType == String) || (valueType == QVariant::Int && m_parameterType == Integer) || (valueType == QVariant::Bool && m_parameterType == Bool) || (valueType == QVariant::Double && m_parameterType == Real) || (valueType == QVariant::Invalid && m_parameterType == None) || (valueType == (QVariant::Type)QMetaType::QObjectStar && m_parameterType == Object); return valid; } void UCAction::generateName() { static int id = 0; m_name = QString("unity-action-%1").arg(id++); } /*! * \qmlproperty string Action::iconName * The icon associated with the action. If both iconName and \l iconSource are * defined, iconName will be ignored by the components. * \note The complete list of icons available in Ubuntu is not published yet. * For now please refer to the folder where the icon theme is installed: * \list * \li Ubuntu Touch: \l file:/usr/share/icons/suru * \endlist */ void UCAction::setIconName(const QString &name) { if (m_iconName == name) { return; } m_iconName = name; if (m_factoryIconSource) { m_iconSource = m_iconName.isEmpty() ? QUrl() : QUrl("image://theme/" + m_iconName); Q_EMIT iconSourceChanged(); } Q_EMIT iconNameChanged(); } /*! * \qmlproperty string Action::name * The name of the action. By default an action gets it's name generated automatically * if not overridden with later. If name is set to "" then the action restores it's * autogenerated name. The name is not user visible. */ void UCAction::setName(const QString &name) { if (m_name == name) { return; } m_name = name; if (m_name.isEmpty()) { generateName(); } Q_EMIT nameChanged(); } /*! * \qmlproperty url Action::iconSource * This is a URL to any image file. * In order to use an icon from the Ubuntu theme, use the \l iconName property instead. */ void UCAction::setIconSource(const QUrl &url) { if (m_iconSource == url) { return; } m_iconSource = url; m_factoryIconSource = false; Q_EMIT iconSourceChanged(); } /*! * \qmlproperty Component Action::itemHint * \deprecated * \b {itemHint is DEPRECATED. Use \l ActionItem to specify the representation * of an \l Action.} */ void UCAction::setItemHint(QQmlComponent *) { qWarning() << "Action.itemHint is a DEPRECATED property. Use ActionItems to specify the representation of an Action."; } QKeySequence sequenceFromVariant(const QVariant& variant) { if (variant.type() == QVariant::Int) { return static_cast(variant.toInt()); } if (variant.type() == QVariant::String) { return QKeySequence::fromString(variant.toString()); } return QKeySequence(); } /*! * \qmlproperty var Action::shortcut * The keyboard shortcut that can be used to trigger the action. * \b StandardKey values such as \b StandardKey.Copy * as well as strings in the form "Ctrl+C" are accepted values. * \since 1.3 */ void UCAction::setShortcut(const QVariant& shortcut) { if (m_shortcut.isValid()) QGuiApplicationPrivate::instance()->shortcutMap.removeShortcut(0, this, sequenceFromVariant(m_shortcut)); QKeySequence sequence(sequenceFromVariant(shortcut)); if (!sequence.isEmpty()) { ACT_TRACE("ADD SHORTCUT" << sequence.toString()); QGuiApplicationPrivate::instance()->shortcutMap.addShortcut(this, sequence, Qt::WindowShortcut, shortcutContextMatcher); } else { qmlInfo(this) << "Invalid shortcut: " << shortcut.toString(); } m_shortcut = shortcut; Q_EMIT shortcutChanged(); } void UCAction::resetShortcut() { if (!m_shortcut.isValid()) { return; } QGuiApplicationPrivate::instance()->shortcutMap.removeShortcut(0, this, sequenceFromVariant(m_shortcut)); m_shortcut = QVariant(); Q_EMIT shortcutChanged(); } bool UCAction::event(QEvent *event) { if (event->type() != QEvent::Shortcut) return false; // when we reach this point, we can be sure the Action is used // by a component belonging to an active ActionContext. QShortcutEvent *shortcut_event(static_cast(event)); if (shortcut_event->isAmbiguous()) { qmlInfo(this) << "Ambiguous shortcut: " << shortcut_event->key().toString(); return false; } // do not call trigger() directly but invoke, as it may get overridden in QML invokeTrigger(this, QVariant()); return true; } // trigger text changes whenever HW keyboad is attached/detached void UCAction::onKeyboardAttached() { if (!m_mnemonic.isEmpty()) { Q_EMIT textChanged(); } } /*! * \qmlmethod Action::trigger(var value) * Checks the \c value against the action \l parameterType and triggers the action. * If \l parameterType is \c Action.None, it will trigger as * \code * action.trigger() * \endcode */ void UCAction::trigger(const QVariant &value) { if (!m_enabled) { return; } if (!isValidType(value.type())) { Q_EMIT triggered(QVariant()); } else { Q_EMIT triggered(value); } } void UCAction::addOwningItem(QQuickItem *item) { if (!m_owningItems.contains(item)) { m_owningItems.append(item); ACT_TRACE("ADD ACTION OWNER" << item->objectName() << "TO" << this); } } void UCAction::removeOwningItem(QQuickItem *item) { m_owningItems.removeOne(item); ACT_TRACE("REMOVE ACTION OWNER" << item->objectName() << "FROM" << this); } ./src/Ubuntu/Components/plugin/ucmousefilters.cpp0000644000015600001650000011554712700370701022360 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "ucmouse.h" #include "ucinversemouse.h" #include #include #include #include #include "inversemouseareatype.h" #include "i18n.h" #include "quickutils.h" #include "ucunits.h" // keep in sync with QQuickMouseArea PressAndHoldDelay const int DefaultPressAndHoldDelay = 800; QEvent::Type ForwardedEvent::m_eventBase = QEvent::None; void ForwardedEvent::registerForwardedEvent() { if (m_eventBase > 0) { return; } m_eventBase = (QEvent::Type)QEvent::registerEventType(); } /* * Attached filter instantiator template */ template T *createAttachedFilter(QObject *owner, const QString &qmlName) { QQuickItem *item = qobject_cast(owner); if (!item) { qmlInfo(owner) << QStringLiteral("Warning: %1 filter can only be attached to Items.").arg(qmlName); } T *filter = new T(owner); filter->setEnabled(true); return filter; } /*! \qmltype Mouse \instantiates UCMouse \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Attached property filtering mouse events occured inside the owner. Sometimes we need to provide additional functionality on mouse events beside a QML element's default behavior. Placing a MouseArea over a component however will grab the mouse events from the component underneath, no matter if we set \a preventStealing to false or not. Setting mouse.accepted to false in \a onPressed would result in having the event forwarded to the MouseArea's parent, however MouseArea will no longer receive other mouse events. \qml import QtQuick 2.4 TextInput { width: 100 height: 20 MouseArea { anchors.fill: parent preventStealing: false // do not accept event so it gets propagated to the parent item onPressed: mouse.accepted = false; onReleased: console.log("this will not be printed") } } \endqml Ubuntu UI Toolkit declares filter components similar to Keys, which can be attached to any visual primitve. Mouse filter however will have effect only when attached to items handling mouse events. Events are handled through signals, where the event data is presented through the \a mouse parameter. Events should be accepted if the propagation of those to the owner is not wanted. This is not valid to \l onClicked, \l onPressAndHold composed events. The previous code sample using Mouse filter, which will print the pressed and released mouse buttons would look as follows: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 TextInput { width: 100 height: 20 // do not accept event so it gets propagated to the parent item Mouse.onPressed: console.log("mouse button pressed: " + mouse.button) Mouse.onReleased: console.log("mouse button released: " + mouse.button) } \endqml The event details are reported in the \a mouse parameter, of MouseEvent type, which extends QtQuick's MouseEvent with additional properties. The filter will accept the same mouse buttons the owner accepts, and will accept hover events if the owner does. However it is not possible to alter these settings through the filter. If button handling other than the default ones specified for the primitive is required, MouseAreas can be declared to handle those events. Example of handling right button clicks over a TextInput: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 TextInput { width: 100 height: 20 MouseArea { anchors.fill: parent acceptedButtons: Qt.RightButton onClicked: console.log("right button clicked") } } \endqml In this example left and middle mouse button clicks will reach TextInput as MouseArea only grabs right button events. Mouse filter can be used in combination with MouseArea, where the filter brings additional functionality on top of existing primitive functionality, and MouseArea add new functionality to the primitive. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 TextInput { width: 100 height: 20 // do not accept event so it gets propagated to the parent item Mouse.onPressed: { if (mouse.button === Qt.LeftButton) { // do something } } MouseArea { anchors.fill: parent acceptedButtons: Qt.RightButton Mouse.onPressed: console.log("right button clicked") } } \endqml As mentioned, mouse filters can be attached to any visual item. Attaching it to items that do not handle any mouse events will not have any effect. However child items which handle mouse events can forward the events they handle to their parent. In this way mouse events will land in these items too, and mouse filter attached to those can also handle the event. This is useful when creating custom types where the mouse handling item is nested into a non-mouse handling one, and we want to provide additional filtering possibility to the user. These type of items are called proxy handlers. \qml Item { id: top width: 100 height: 50 Mouse.onPressed: console.log("mouse received from input") TextItem { anchors.fill: parent Mouse.forvardTo: [top] Mouse.onPressed: console.log("pressed over input") Mouse.onPressAndHold: console.log("longpress handled here") } } \endqml In this example the mouse press is first handled by the mouse filter attached to TextInput, then it is forwarded to the top item and finally to the TextInput. Accepting the mouse event will stop propagation to the top item as well as to the TextInput. The topmost item itself does not handle mouse events, therefore it will be a sinple proxy handler item. However, proxies can themself handle mouse events. Therefore each mouse event signal has the \a host parameter specifying the sender of the mouse event reported. \note The forwarded events are handled in the proxy handlers only if the mouse position points inside their area. If the forwarded mouse position falls outside the target area, the event will not be reported, however will be forwarded further to the items in the list. In the following example the mouse press in red rectangle will be printed as well as the proxied mouse press from the main item. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: main width: units.gu(40) height: units.gu(71) Mouse.onPressed: console.log("got the mouse press forwarded by " + host.objectName) Column { anchors.fill: parent spacing: units.gu(1) Rectangle { id: blueRect objectName: "BlueRect" width: parent.width height: units.gu(20) color: "blue" Mouse.forwardTo: [main] Mouse.onPressed: console.log("This should not be printed") } Rectangle { objectName: "RedRect" width: parent.width height: units.gu(20) color: "red" MouseArea { anchors.fill: parent Mouse.forwardTo: [blueRect] Mouse.onPressed: console.log("Pressed in " + host.objectName) } } } } \endqml An interesting feature that can be achieved using Mouse filter is the event "transparency" towards the MouseArea lying behind the items which handle mouse events. This means for example that by forwarding mouse events occurred on a TextInput to a MouseArea that stays behind it in the item hierarchy, the MouseArea will also get all the events occurred on the area covered by the TextInput, acting like it would be above the TextInput. However, due to the nature of the MouseArea event acceptance policy (all events are accepted by default) TextInput will not get these mouse events unless we set the \a accepted field of the mouse event to false in MouseArea. This normally leads to the MouseArea no longer getting further mouse events. However, Mouse filter will continue to forward other mouse events to the MouseArea, so setting \a accepted to false in \a onPressed, \a onReleased will not have the default effect. This is only valid to press and release events, double-click or mouse position change will be blocked by the MouseArea still. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 MouseArea { id: topArea width: units.gu(50) height: units.gu(10) onPressed: { console.log("forwarded pressed") mouse.accepted = false } onReleased: { console.log("released") mouse.accepted = false } TextInput { width: units.gu(40) height: units.gu(5) anchors.centerIn: parent Mouse.forwardTo: [topArea] Mouse.onPressed: console.log("input pressed") Mouse.onReleased: console.log("input released") } } \endqml Mouse filter provides ability to control the order of the event dispatching. The filter can receive the events prior the owner or after the owner. This can be controlled through the \l priority property. In the following example we make sure the TextInput always receives the events before the filter: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 TextInput { id: input width: units.gu(40) height: units.gu(5) activeFocusOnPress: true Mouse.prority: Mouse.AfterItem Mouse.onPressed: if (input.activeFocus) console.log("Text input already handled it") } \endqml Another feature of the mouse filters is the ability to restrict when the composed events like \l onClicked and \l onPressAndHold should be triggered. By default these events are triggered no matter what is the distance between the mouse pressed position and the current position after a certain timeout (for \l onPressAndHold) or upon mouse release (for \l onClicked). In this way the \l onClicked will be emitted even if the user presses the mouse at the left-top edge of the component, then moves it to the right-bottom corner and releases it. This may not be the preferred behavior on certain components (like TextInput). Therefore MouseFilter provides a property which can alter this behavior, the \l clickAndHoldThreshold. This property specifies the radius of the area the up-mentioned composed events are emitted during a mouse move. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 TextInput { width: units.gu(40) height: units.gu(5) activeFocusOnPress: true selectByMouse: true // emit composed events only if the mouse moves within 2 GU radius area Mouse.clickAndHoldThreshold: units.gu(2) Mouse.onClicked: console.log("click happened within threshold value") Mouse.onPressAndHold: console.log("pressAndHold happened within threshold value") } \endqml Similar functionality for the case when the mouse event occurs outside of the owner is brought by the \l InverseMouse attached property. \section1 Mouse events synthesis QtQuick automatically creates artificial mouse events whenever a scene receives touch events that are not consumed by any item (either by using MultiPointTouchArea or a custom C++ item). The Mouse filter provides the possibility to ignore synthesized mouse events by enabling the \l ignoreSynthesizedEvents property. This is really useful when, while developing a convergent application, the app developer wants to avoid triggering the hovering logic using a touchscreen, but still be able to handle the hover events when using a mouse, and at the same time doesn't want to stop the mouse and touch events from propagating to items underneath the MouseArea which handles the hovering. The following is an example of how that functionaly can be implemented: \qml MouseArea { id: proximityArea anchors.fill: parent propagateComposedEvents: true hoverEnabled: true //We use a separate variable to detect whether the area contains //a mouse, because MouseArea's containsMouse is true even when //tapping on it using a touchscreen (due to the touch events being //converted to mouse events if no item consumes them). property bool containsPointerDevice: false //handle hover events using the Mouse filter instead of MouseArea, so that //we can ignore synthesized mouse events and not trigger hover logic when the //user is interacting with the app using a touch device. Mouse.ignoreSynthesizedEvents: true Mouse.onEntered: { console.log("ONLY A MOUSE CAN TRIGGER THIS SLOT") proximityArea.containsPointerDevice = true } Mouse.onExited: proximityArea.containsPointerDevice = false //let mouse and touch events propagate underneath the mouse area onPressed: mouse.accepted = false } \endqml */ UCMouse::UCMouse(QObject *parent) : QObject(parent) , m_owner(qobject_cast(parent)) , m_lastButton(Qt::NoButton) , m_lastButtons(Qt::NoButton) , m_lastModifiers(Qt::NoModifier) , m_pressedButtons(Qt::NoButton) , m_priority(BeforeItem) , m_moveThreshold(0.0) , m_enabled(false) , m_moved(false) , m_longPress(false) , m_hovered(false) , m_doubleClicked(false) , m_ignoreSynthesizedEvents(false) { // if owner is MouseArea or InverseMouseArea, connect to the acceptedButtons // and hoverEnabled change signals QQuickMouseArea* mouseOwner = qobject_cast(m_owner); if (mouseOwner) { connect(mouseOwner, SIGNAL(acceptedButtonsChanged()), this, SIGNAL(acceptedButtonsChanged())); connect(mouseOwner, SIGNAL(hoverEnabledChanged()), this, SIGNAL(hoverEnabledChanged())); } } UCMouse *UCMouse::qmlAttachedProperties(QObject *owner) { return createAttachedFilter(owner, "Mouse"); } bool UCMouse::eventFilter(QObject *target, QEvent *event) { QEvent::Type type = event->type(); bool mouseEvent = isMouseEvent(type); bool hoverEvent = isHoverEvent(type); if (mouseEvent || hoverEvent) { static bool forwardLock = false; if (forwardLock) { return QObject::eventFilter(target, event); } if (m_priority == AfterItem) { // send the event first to the owner, but lock out ourself to avoid // getting into infinite recurence forwardLock = true; QCoreApplication::sendEvent(m_owner, event); forwardLock = false; } if (mouseEvent) { return mouseEvents(target, static_cast(event)); } else { return hoverEvents(target, static_cast(event)); } } else if (type == ForwardedEvent::baseType()) { // this is a forwarded event, handle it as such return forwardedEvents(static_cast(event)); } return QObject::eventFilter(target, event); } void UCMouse::timerEvent(QTimerEvent *event) { if (isEnabled() && (event->timerId() == m_pressAndHoldTimer.timerId())) { m_pressAndHoldTimer.stop(); if (m_pressedButtons && m_hovered) { m_longPress = true; QQuickMouseEvent mev(m_lastPos.x(), m_lastPos.y(), m_lastButton, m_lastButtons, m_lastModifiers, false, m_longPress); mev.setAccepted(false); Q_EMIT pressAndHold(&mev, m_owner); mev.setAccepted(forwardEvent(ForwardedEvent::MouseLongPress, 0, &mev)); // if the event wasn't handled, allow click if (!mev.isAccepted()) { m_longPress = false; } event->setAccepted(mev.isAccepted()); } } else { QObject::timerEvent(event); } } bool UCMouse::mouseEvents(QObject *target, QMouseEvent *event) { bool result = false; Q_UNUSED(target); if (m_ignoreSynthesizedEvents && event->source() == Qt::MouseEventSynthesizedByQt) { return result; } switch (event->type()) { case QEvent::MouseButtonPress: { result = mousePressed(event); } break; case QEvent::MouseButtonRelease: { result = mouseReleased(event); } break; case QEvent::MouseButtonDblClick: { result = mouseDblClick(event); } break; case QEvent::MouseMove: { result = mouseMoved(event); } break; default: break; } return result || event->isAccepted(); } bool UCMouse::hoverEvents(QObject *target, QHoverEvent *event) { bool result = false; Q_UNUSED(target) switch (event->type()) { case QEvent::HoverEnter: { result = hoverEntered(event); } break; case QEvent::HoverMove: { result = hoverMoved(event); } break; case QEvent::HoverLeave: { result = hoverExited(event); } break; default: break; } return result || event->isAccepted(); } // emit signals and forward the events further bool UCMouse::forwardedEvents(ForwardedEvent *event) { // the quick event is always specified! switch (event->subType()) { case ForwardedEvent::MousePress: { Q_EMIT pressed(event->quickEvent(), event->sender()); } break; case ForwardedEvent::MouseRelease: { Q_EMIT released(event->quickEvent(), event->sender()); } break; case ForwardedEvent::MouseMove: { Q_EMIT positionChanged(event->quickEvent(), event->sender()); } break; case ForwardedEvent::MouseDblClick: { Q_EMIT doubleClicked(event->quickEvent(), event->sender()); } break; case ForwardedEvent::HoverEnter: { Q_EMIT entered(event->quickEvent(), event->sender()); } break; case ForwardedEvent::HoverExit: { Q_EMIT exited(event->quickEvent(), event->sender()); } break; // composed events case ForwardedEvent::MouseClick: { Q_EMIT clicked(event->quickEvent(), event->sender()); } break; case ForwardedEvent::MouseLongPress: { Q_EMIT pressAndHold(event->quickEvent(), event->sender()); } break; default: break; } // forward event, but use the current owner as sender event->setAccepted(forwardEvent(event->subType(), event->originalEvent(), event->quickEvent())); return event->isAccepted(); } bool UCMouse::hasAttachedFilter(QQuickItem *item) { return (qmlAttachedPropertiesObject(item, false) != 0); } void UCMouse::setHovered(bool hovered, QEvent *hoverEvent) { if (m_hovered != hovered) { m_hovered = hovered; QQuickMouseEvent mev(m_lastPos.x(), m_lastPos.y(), m_lastButton, m_lastButtons, m_lastModifiers, false, false); mev.setAccepted(false); ForwardedEvent::EventType type = (m_hovered) ? ForwardedEvent::HoverEnter : ForwardedEvent::HoverExit; if (m_hovered) { Q_EMIT entered(&mev, m_owner); } else { m_pressAndHoldTimer.stop(); Q_EMIT exited(&mev, m_owner); } forwardEvent(type, hoverEvent, &mev); } } bool UCMouse::mousePressed(QMouseEvent *event) { m_moved = false; if (event->button() & m_owner->acceptedMouseButtons()) { saveEvent(event); m_pressedButtons |= m_lastButton; m_longPress = m_doubleClicked = false; setHovered(true, 0); QQuickMouseEvent mev(m_lastPos.x(), m_lastPos.y(), m_lastButton, m_lastButtons, m_lastModifiers, false, m_longPress); mev.setAccepted(false); Q_EMIT pressed(&mev, m_owner); event->setAccepted(forwardEvent(ForwardedEvent::MousePress, event, &mev)); // start long press timer m_pressAndHoldTimer.start(DefaultPressAndHoldDelay, this); return mev.isAccepted(); } event->ignore(); return false; } bool UCMouse::mouseMoved(QMouseEvent *event) { if (m_pressedButtons) { saveEvent(event); // check if we should stop pressAndHold if (!m_toleranceArea.contains(m_lastPos)) { m_pressAndHoldTimer.stop(); } setHovered(true, 0); m_moved = true; m_doubleClicked = false; QQuickMouseEvent mev(m_lastPos.x(), m_lastPos.y(), m_lastButton, m_lastButtons, m_lastModifiers, false, m_longPress); mev.setAccepted(false); Q_EMIT positionChanged(&mev, m_owner); event->setAccepted(forwardEvent(ForwardedEvent::MouseMove, event, &mev)); return mev.isAccepted(); } event->ignore(); return false; } bool UCMouse::mouseReleased(QMouseEvent *event) { if (m_pressedButtons) { saveEvent(event); // stop long press timer event m_pressAndHoldTimer.stop(); bool isClicked = (m_pressedButtons & m_lastButton) && !m_longPress && !m_doubleClicked && ((m_moveThreshold <= 0.0) || m_toleranceArea.contains(m_lastPos)); QQuickMouseEvent mev(m_lastPos.x(), m_lastPos.y(), m_lastButton, m_lastButtons, m_lastModifiers, isClicked, m_longPress); mev.setAccepted(false); Q_EMIT released(&mev, m_owner); event->setAccepted(forwardEvent(ForwardedEvent::MouseRelease, event, &mev)); // remove button from press m_pressedButtons &= ~m_lastButton; if (isClicked) { // emit clicked mev.setAccepted(false); Q_EMIT clicked(&mev, m_owner); forwardEvent(ForwardedEvent::MouseClick, 0, &mev); } if (!m_pressedButtons && !m_owner->acceptHoverEvents()) { setHovered(false, 0); } return mev.isAccepted(); } event->ignore(); return false; } bool UCMouse::mouseDblClick(QMouseEvent *event) { if (m_pressedButtons) { saveEvent(event); QQuickMouseEvent mev(m_lastPos.x(), m_lastPos.y(), m_lastButton, m_lastButtons, m_lastModifiers, true, m_longPress); mev.setAccepted(false); // if double click connected, suppress release() and click() signals if (isDoubleClickConnected()) { Q_EMIT doubleClicked(&mev, m_owner); m_doubleClicked = true; } // forward event even if it wasn't handled for the owner event->setAccepted(forwardEvent(ForwardedEvent::MouseDblClick, event, &mev)); return event->isAccepted(); } event->ignore(); return false; } bool UCMouse::hoverEntered(QHoverEvent *event) { m_lastPos = event->posF(); m_lastModifiers = event->modifiers(); m_lastButton = Qt::NoButton; m_lastButtons = Qt::NoButton; setHovered(true, event); return false; } bool UCMouse::hoverMoved(QHoverEvent *event) { m_lastPos = event->posF(); m_lastModifiers = event->modifiers(); QQuickMouseEvent mev(m_lastPos.x(), m_lastPos.y(), Qt::NoButton, Qt::NoButton, m_lastModifiers, false, m_longPress); mev.setAccepted(false); Q_EMIT positionChanged(&mev, m_owner); event->setAccepted(forwardEvent(ForwardedEvent::MouseMove, event, &mev)); return false; } bool UCMouse::hoverExited(QHoverEvent *event) { m_lastPos = event->posF(); m_lastModifiers = event->modifiers(); m_lastButton = Qt::NoButton; m_lastButtons = Qt::NoButton; setHovered(false, event); return false; } void UCMouse::saveEvent(QMouseEvent *event) { m_lastPos = event->localPos(); m_lastScenePos = event->windowPos(); if (event->type() != QEvent::MouseMove) { m_lastButton = event->button(); m_lastButtons = event->buttons(); } m_lastModifiers = event->modifiers(); if ((event->type() == QEvent::MouseButtonPress) && (m_moveThreshold > 0.0)) { m_toleranceArea.setX(m_lastPos.x() - m_moveThreshold); m_toleranceArea.setY(m_lastPos.y() - m_moveThreshold); m_toleranceArea.setWidth(2 * m_moveThreshold); m_toleranceArea.setHeight(2 * m_moveThreshold); } } bool UCMouse::isDoubleClickConnected() { IS_SIGNAL_CONNECTED(this, UCMouse, doubleClicked, (QQuickMouseEvent*,QQuickItem*)); } bool UCMouse::isMouseEvent(QEvent::Type type) { return (type == QEvent::MouseButtonPress) || (type == QEvent::MouseButtonRelease) || (type == QEvent::MouseButtonDblClick) || (type == QEvent::MouseMove); } bool UCMouse::isHoverEvent(QEvent::Type type) { return (type == QEvent::HoverEnter) || (type == QEvent::HoverMove) || (type == QEvent::HoverLeave); } /* * Forwards the events to the listed items. The event coordinates are mapped to the destination's coordinates * and sent to the destination in case the destination has no filter attached. Otherwise the quick event * coordinates will be mapped and sent as ForwardedEvents. */ bool UCMouse::forwardEvent(ForwardedEvent::EventType type, QEvent *event, QQuickMouseEvent *quickEvent) { // first set the accepted flag to the original event if (event && quickEvent) { event->setAccepted(quickEvent->isAccepted()); } bool accepted = event ? event->isAccepted() : (quickEvent ? quickEvent->isAccepted() : false); Q_FOREACH(QQuickItem *item, m_forwardList) { if (accepted) { // the event got accepted, therefore should not be forwarded return accepted; } // skip InverseMouseArea otherwise those will get the event twice if (qobject_cast(item)) { continue; } // map the normal event coordinates to item QEvent *mappedEvent = 0; if (event) { if (isMouseEvent(event->type())) { QMouseEvent *mouse = static_cast(event); QPointF itemPos = item->mapFromScene(m_owner->mapToScene(mouse->pos())); mappedEvent = new QMouseEvent(event->type(), itemPos, mouse->button(), mouse->buttons(), mouse->modifiers()); } else if (isHoverEvent(event->type())){ QHoverEvent *hover = static_cast(event); QPointF itemPos = item->mapFromScene(m_owner->mapToScene(hover->pos())); QPointF itemOldPos = item->mapFromScene(m_owner->mapToScene(hover->oldPos())); mappedEvent = new QHoverEvent(event->type(), itemPos, itemOldPos, hover->modifiers()); } } // if the item has no filter attached, deliver the mapped event to it as it is UCMouse *filter = qobject_cast(qmlAttachedPropertiesObject(item, false)); if (!filter && mappedEvent) { QGuiApplication::sendEvent(item, mappedEvent); accepted = mappedEvent->isAccepted(); } else if (quickEvent) { // map the quick event coordinates as well QPoint itemPos(item->mapFromScene(m_owner->mapToScene(QPointF(quickEvent->x(), quickEvent->y()))).toPoint()); QQuickMouseEvent mev(itemPos.x(), itemPos.y(), (Qt::MouseButton)quickEvent->button(), (Qt::MouseButtons)quickEvent->buttons(), (Qt::KeyboardModifiers)quickEvent->modifiers(), quickEvent->isClick(), quickEvent->wasHeld()); mev.setAccepted(false); ForwardedEvent forwardedEvent(type, m_owner, mappedEvent, &mev); QGuiApplication::sendEvent(item, &forwardedEvent); accepted = mev.isAccepted(); } // cleanup and transfer accepted flag delete mappedEvent; if (event) { event->setAccepted(accepted); } if (quickEvent) { quickEvent->setAccepted(accepted); } } return accepted; } /*! \qmlproperty bool Mouse::enabled */ bool UCMouse::isEnabled() const { return m_enabled; } void UCMouse::setEnabled(bool enabled) { if ((enabled != m_enabled) && m_owner) { m_enabled = enabled; if (m_enabled) { m_owner->installEventFilter(this); } else { m_owner->removeEventFilter(this); m_pressAndHoldTimer.stop(); } Q_EMIT enabledChanged(); } } /*! \qmlproperty bool Mouse::ignoreSynthesizedEvents This property controls how the filter handles the mouse events synthesized by Qt (e.g. the artificial mouse events created when an original touch event is not consumed by any Item in the scene). If the value is true, the filter will ignore the synthesized mouse events. More info at \l{Mouse events synthesis}. The default value is false. */ /*! \qmlproperty Qt::MouseButtons Mouse::acceptedButtons \readonly The property holds the accepted mouse buttons of the owner. */ Qt::MouseButtons UCMouse::acceptedButtons() const { return m_owner ? m_owner->acceptedMouseButtons() : Qt::NoButton; } /*! \qmlproperty bool Mouse::hoverEnabled \readonly The property reports whether the owner accepts hover events or not. When events are accepted \l onEntered, \l onPositionChanged and \l onExited signals containing the mouse cursor position. */ bool UCMouse::hoverEnabled() const { return m_owner ? m_owner->acceptHoverEvents() : false; } /*! \qmlproperty int Mouse::clickAndHoldThreshold The property holds the radius of the tolerance area the mouse can move in both x and y axis when the mouse is pressed, during which the composed events such as \l onClicked and \l onPressAndHold will still be emitted. If the mouse is moved out of this area while the button is pressed, no composed events will be emitted. When this value is 0, the signals will be emitted as in MouseArea, meaning the composed events will come until the mouse is moved inside the owner's area. The default value is 0. \note The value has no effect for the forwarded events. The threshold is only valid when the host handles mouse events. */ int UCMouse::clickAndHoldThreshold() const { return m_moveThreshold; } void UCMouse::setClickAndHoldThreshold(int threshold) { if (m_moveThreshold != threshold) { m_moveThreshold = threshold; Q_EMIT clickAndHoldThresholdChanged(); } } /*! \qmlproperty list Mouse::forwardTo The property provides a way to forward mouse presses, releases, moves and double click events to other items. This can be useful when you want other items to handle different parts of the same mouse event or to handle other mouse events. The items listed will receive the event only if the mouse event falls into their area. Once an item that has forwarded mouse events accepts the event, that will no longer be delivered to the rest of the items in the list. This rule is also applied on the owner when the priority is set to \a BeforeItem. */ QQmlListProperty UCMouse::forwardTo() { return QQmlListProperty(this, m_forwardList); } /*! \qmlproperty enumeration Mouse::priority The property specifies the event dispach relation between the filter, the elements the event is forwarded to and the owner. Similar to Keys' \a priority property, the event dispach is performed in two ways: berfore (\a BeforeItem) or after (\a AfterItem) the owner receives the events. When \a BeforeItem is set the event dispach happens based as follows: \list i \li the event is handled by the mouse filter \li if there are items listed in \l forwardTo property, the event will be forwarded to those items \li the event is handed over the owner. \endlist \raw HTML
\endraw When \a AfterItem is set the event dispach happens based as follows: \list i \li the event is handed over the owner; \li the event is handled by the mouse filter; \li if there are items listed in \l forwardTo property, the event will be forwarded to those items. \endlist The default value is \a BeforeItem. */ UCMouse::Priority UCMouse::priority() const { return m_priority; } void UCMouse::setPriority(Priority priority) { if (priority != m_priority) { m_priority = priority; Q_EMIT priorityChanged(); } } /*! \qmlsignal Mouse::onPressed(MouseEvent event, Item host) The signal reports the mouse press. The \a host specifies the item that triggered the event. */ /*! \qmlsignal Mouse::onReleased(MouseEvent event) The signal reports the mouse release. The \a host specifies the item that triggered the event. */ /*! \qmlsignal Mouse::onClicked(MouseEvent event) The signal reports the mouse click. The signal is not emitted if the onPressAndHold got triggered or if onDoubleClicked is handled (a slot is connected to it). The \a host specifies the item that triggered the event. */ /*! \qmlsignal Mouse::onPressAndHold(MouseEvent event) The signal reports the mouse press and hold. The \a host specifies the item that triggered the event. */ /*! \qmlsignal Mouse::onDoubleClicked(MouseEvent event) The signal reports mouse double click. The \a host specifies the item that triggered the event. */ /*! \qmlsignal Mouse::onPositionChanged(MouseEvent event) The signal reports the mouse pointer position change. If the hover events are enabled for the owner, the signal will come continuously. Otherwise the position chanes are reported when one of the accepted mouse buttons are being kept pressed. The \a host specifies the item that triggered the event. */ /*! \qmlsignal Mouse::onEntered(MouseEvent event) The signal reports that the mouse has entered into the area. The signal is emitted when the hover events are enabled and the mouse enters the area or when one of the accepted mouse button is pressed. The \a host specifies the item that triggered the event. */ /*! \qmlsignal Mouse::onExited(MouseEvent event) The signal reports that the mouse has left the area. The signal is emitted when the hover events are enabled for the owner or if not, when one of the accepted button is released. The \a host specifies the item that triggered the event. */ /****************************************************************************** **/ /*! \qmltype InverseMouse \instantiates UCInverseMouse \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Attached object filtering mouse events occured outside the owner. Similar to Mouse filter attached property, provides mouse event filtering capabilities but for events occurring outside of the owner's area, excluding the input method area. Being derived from Mouse filter element, provides the same behavior as the Mouse filter, except that all the signals are emitted when the mouse event occurs outside the owner's area. Note that accepting composed mouse events does not have any effect on event propagation. Altering \a priority property has no effect on inverse mouse filter as mouse events captured by the filter are not forwarded to the owner, hence forwarding those events first to the owner will not have any effect. */ UCInverseMouse::UCInverseMouse(QObject *parent) : UCMouse(parent) { } UCInverseMouse *UCInverseMouse::qmlAttachedProperties(QObject *owner) { return createAttachedFilter(owner, "InverseMouse"); } QMouseEvent UCInverseMouse::mapMouseToOwner(QObject *target, QMouseEvent* event) { QQuickItem *item = qobject_cast(target); QPointF localPos = (target != m_owner) ? m_owner->mapFromItem(item, event->localPos()) : event->localPos(); QPointF windowPos = (target != m_owner) ? m_owner->mapFromItem(item, event->windowPos()) : event->windowPos(); return QMouseEvent(event->type(), localPos, windowPos, event->screenPos(), event->button(), event->buttons(), event->modifiers()); } QHoverEvent UCInverseMouse::mapHoverToOwner(QObject *target, QHoverEvent *event) { QQuickItem *item = qobject_cast(target); QPointF pos = (target != m_owner) ? m_owner->mapFromItem(item, event->posF()) : event->posF(); QPointF oldPos = (target != m_owner) ? m_owner->mapFromItem(item, event->oldPosF()) : event->oldPosF(); return QHoverEvent(event->type(), pos, oldPos, event->modifiers()); } bool UCInverseMouse::eventFilter(QObject *target, QEvent *event) { // exclude MouseArea and InverseMouseArea targets; InverseMosueArea casts to QQuickMouseArea if ((target != m_owner) && !qobject_cast(target)) { return UCMouse::eventFilter(target, event); } return QObject::eventFilter(target, event); } bool UCInverseMouse::mouseEvents(QObject *target, QMouseEvent *event) { QMouseEvent mouse(mapMouseToOwner(target, event)); if (!contains(&mouse)) { // do not handle mouse event if it's inside the owner return false; } // call base handler return UCMouse::mouseEvents(target, &mouse); } bool UCInverseMouse::hoverEvents(QObject *target, QHoverEvent *event) { QHoverEvent hover(mapHoverToOwner(target, event)); return UCMouse::hoverEvents(target, &hover); } bool UCInverseMouse::hasAttachedFilter(QQuickItem *item) { return UCMouse::hasAttachedFilter(item) || (qmlAttachedPropertiesObject(item, false) != 0); } // check whether the mouse point is in OSK area bool UCInverseMouse::pointInOSK(const QPointF &point) { QPointF scenePoint = m_owner->mapToScene(point); QRectF oskRect = QGuiApplication::inputMethod()->keyboardRectangle(); return oskRect.contains(scenePoint); } // returns true if the point is in the inverse area bool UCInverseMouse::contains(QMouseEvent *mouse) { QPointF localPos = mouse->localPos(); return !m_owner->contains(localPos) && !pointInOSK(localPos); } void UCInverseMouse::setEnabled(bool enabled) { if ((m_enabled != enabled) && m_owner) { m_enabled = enabled; if (m_enabled) { // FIXME: use application's main till we don't get touch events // forwarded to the QQuickItem QGuiApplication::instance()->installEventFilter(this); } else { QGuiApplication::instance()->removeEventFilter(this); } Q_EMIT enabledChanged(); } } void UCInverseMouse::setPriority(Priority priority) { if (priority != m_priority) { qmlInfo(m_owner) << QStringLiteral("Ignoring AfterItem priority for InverseMouse filters."); } } ./src/Ubuntu/Components/plugin/uclabel.cpp0000644000015600001650000001727412700370714020720 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "label_p.h" #include "ucfontutils.h" #include "ucnamespace.h" #include "ucunits.h" #include "uctheme.h" UCLabelPrivate::UCLabelPrivate(UCLabel *qq) : q_ptr(qq) , defaultColor(getDefaultColor) , textSize(UCLabel::Medium) , flags(0) { } UCLabelPrivate::UCLabelPrivate(UCLabel *qq, UCLabel::ColorProviderFunc func) : q_ptr(qq) , defaultColor(func) , textSize(UCLabel::Medium) , flags(0) { } void UCLabelPrivate::updatePixelSize() { if (flags & PixelSizeSet) { return; } Q_Q(UCLabel); const float sizes[] = { UCFontUtils::xxSmallScale, UCFontUtils::xSmallScale, UCFontUtils::smallScale, UCFontUtils::mediumScale, UCFontUtils::largeScale, UCFontUtils::xLargeScale }; QFont textFont = q->font(); textFont.setPixelSize( qRound(sizes[textSize] * UCUnits::instance()->dp(UCFontUtils::fontUnits))); q->setFont(textFont); } void UCLabelPrivate::updateRenderType() { Q_Q(UCLabel); QQuickText *qtext = static_cast(q); if (UCUnits::instance()->gridUnit() <= 10) { qtext->setRenderType(QQuickText::NativeRendering); } else { qtext->setRenderType(QQuickText::QtRendering); } } /*! * \qmltype LabelBase * \qmlabstract * \instantiates UCLabel * \inqmlmodule Ubuntu.Components 1.3 * \ingroup ubuntu * \brief Extended Text item with Ubuntu styling. * * Label is an extended Text item with Ubuntu styling. It exposes an additional property that * provides adaptive resizing based on the measurement unit. * * Example: * \qml * Rectangle { * color: UbuntuColors.warmGrey * width: units.gu(30) * height: units.gu(30) * * Label { * anchors.centerIn: parent * text: "Hello world!" * textSize: Label.Large * } * } * \endqml */ UCLabel::UCLabel(QQuickItem* parent) : QQuickText(parent) , UCThemingExtension(this) , d_ptr(new UCLabelPrivate(this)) { } UCLabel::UCLabel(ColorProviderFunc defaultColor, QQuickItem *parent) : QQuickText(parent) , UCThemingExtension(this) , d_ptr(new UCLabelPrivate(this, defaultColor)) { } UCLabel::~UCLabel() { // disconnect functor, so QQuickItem's enabledChanged won't call into the invalid functor disconnect(this, &UCLabel::enabledChanged, this, &UCLabel::postThemeChanged); } QColor UCLabelPrivate::getDefaultColor(QQuickItem *item, UCTheme *theme) { // FIXME: replace the code below with automatic color // change detection based on the item's state const char *valueSet = item->isEnabled() ? "normal" : "disabled"; return theme ? theme->getPaletteColor(valueSet, "backgroundText") : QColor(); } void UCLabel::classBegin() { Q_D(UCLabel); QQuickText::classBegin(); d->init(); } void UCLabelPrivate::init() { Q_Q(UCLabel); q->postThemeChanged(); updatePixelSize(); defaultFont = q->font(); defaultFont.setFamily("Ubuntu"); defaultFont.setWeight(QFont::Light); q->setFont(defaultFont); updateRenderType(); QObject::connect(UCUnits::instance(), SIGNAL(gridUnitChanged()), q, SLOT(updateRenderType())); QObject::connect(q, &UCLabel::enabledChanged, q, &UCLabel::postThemeChanged, Qt::DirectConnection); QObject::connect(q, &UCLabel::fontChanged, q, &UCLabel::fontChanged2, Qt::DirectConnection); QObject::connect(q, &UCLabel::colorChanged, q, &UCLabel::colorChanged2, Qt::DirectConnection); } void UCLabel::postThemeChanged() { Q_D(UCLabel); if (d->flags & UCLabelPrivate::ColorSet) { return; } UCTheme *theme = getTheme(); if (theme) { setColor(d->defaultColor(this, theme)); } } /*! * \qmlproperty enumeration LabelBase::textSize * \since Ubuntu.Components 1.3 * * This property holds an abstract size that allows adaptive resizing based on the measurement unit * (see Units). The default value is \c Label.Medium. * * \note Setting this disables support for the deprecated \l fontSize property. * * \list * \li \b Label.XxSmall - extremely small font size * \li \b Label.XSmall - very small font size * \li \b Label.Small - small font size * \li \b Label.Medium - medium font size * \li \b Label.Large - large font size * \li \b Label.XLarge - very large font size * \endlist */ UCLabel::TextSize UCLabel::textSize() const { Q_D(const UCLabel); return d->textSize; } void UCLabel::setTextSize(TextSize size) { Q_D(UCLabel); if (!(d->flags & UCLabelPrivate::TextSizeSet)) { Q_EMIT fontSizeChanged(); d->flags |= UCLabelPrivate::TextSizeSet; } if (d->textSize != size) { d->textSize = size; d->updatePixelSize(); Q_EMIT textSizeChanged(); } } void UCLabel::setFont2(const QFont &font) { Q_D(UCLabel); // we must restrict ourself to the pixelSize change as any font property change will // lead to the setter call. if (d->defaultFont.pixelSize() != font.pixelSize()) { d->flags |= UCLabelPrivate::PixelSizeSet; } QQuickText::setFont(font); } void UCLabel::setColor2(const QColor &color) { Q_D(UCLabel); d->flags |= UCLabelPrivate::ColorSet; QQuickText::setColor(color); } void UCLabel::setRenderType(RenderType renderType) { disconnect(UCUnits::instance(), SIGNAL(gridUnitChanged()), this, SLOT(updateRenderType())); QQuickText::setRenderType(renderType); } /*! * \qmlproperty string LabelBase::fontSize * \deprecated * * This property holds an abstract size represented as a string that allows adaptive resizing based * on the measurement unit (see Units). The default value is \c "medium". * * \note Use \l textSize instead. * * Here is the list of allowed strings from the smallest to the largest: * \list * \li \b "xx-small" - extremely small font size * \li \b "x-small" - very small font size * \li \b "small" - small font size * \li \b "medium" - medium font size * \li \b "large" - large font size * \li \b "x-large" - very large font size * \endlist */ QString UCLabel::fontSize() const { Q_D(const UCLabel); if (d->flags & UCLabelPrivate::TextSizeSet) { return ""; } const char* const sizes[] = { "xx-small", "x-small", "small", "medium", "large", "x-large" }; return QString(sizes[d->textSize]); } void UCLabel::setFontSize(const QString& fontSize) { Q_D(UCLabel); if (d->flags & UCLabelPrivate::TextSizeSet) { return; } if (fontSize.size() < 4) { return; } UC_QML_DEPRECATION_WARNING("'fontSize' is deprecated, use 'textSize' property instead."); TextSize textSize; switch (SCALE_CODE(fontSize)) { case SCALE_MEDIUM: { textSize = Medium; break; } case SCALE_LARGE: { textSize = Large; break; } case SCALE_SMALL: { textSize = Small; break; } case SCALE_XLARGE: { textSize = XLarge; break; } case SCALE_XSMALL: { textSize = XSmall; break; } case SCALE_XXSMALL: { textSize = XxSmall; break; } default: { return; } } if (d->textSize != textSize) { d->textSize = textSize; d->updatePixelSize(); Q_EMIT fontSizeChanged(); } } #include "moc_uclabel.cpp" ./src/Ubuntu/Components/plugin/ucslotslayout.h0000644000015600001650000001142412700370701021673 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Andrea Bernabei */ #ifndef UCSLOTSLAYOUT_H #define UCSLOTSLAYOUT_H #include class UCSlotsAttached; class UCSlotsLayoutPadding; class UCSlotsLayoutPrivate; class UCSlotsLayout : public QQuickItem { Q_OBJECT Q_PROPERTY(QQuickItem *mainSlot READ mainSlot WRITE setMainSlot NOTIFY mainSlotChanged) Q_PROPERTY(UCSlotsLayoutPadding *padding READ padding CONSTANT FINAL) Q_ENUMS(UCSlotPosition) public: explicit UCSlotsLayout(QQuickItem *parent = 0); virtual QQuickItem *mainSlot(); virtual QQuickItem *mainSlot() const; virtual void setMainSlot(QQuickItem *item, bool fireSignal = true); UCSlotsLayoutPadding *padding(); enum UCSlotPosition { First = INT_MIN/2, Leading = INT_MIN/4, Trailing = INT_MAX/4, Last = INT_MAX/2 }; static UCSlotsAttached *qmlAttachedProperties(QObject *object); Q_SIGNALS: void mainSlotChanged(); protected: Q_DECLARE_PRIVATE(UCSlotsLayout) void componentComplete(); void itemChange(ItemChange change, const ItemChangeData &data); private: Q_PRIVATE_SLOT(d_func(), void _q_onGuValueChanged()) Q_PRIVATE_SLOT(d_func(), void _q_updateCachedHeight()) Q_PRIVATE_SLOT(d_func(), void _q_updateGuValues()) Q_PRIVATE_SLOT(d_func(), void _q_updateCachedMainSlotHeight()) Q_PRIVATE_SLOT(d_func(), void _q_updateSlotsBBoxHeight()) Q_PRIVATE_SLOT(d_func(), void _q_updateSize()) Q_PRIVATE_SLOT(d_func(), void _q_onSlotWidthChanged()) Q_PRIVATE_SLOT(d_func(), void _q_onSlotOverrideVerticalPositioningChanged()) Q_PRIVATE_SLOT(d_func(), void _q_onSlotPositionChanged()) Q_PRIVATE_SLOT(d_func(), void _q_relayout()) }; QML_DECLARE_TYPEINFO(UCSlotsLayout, QML_HAS_ATTACHED_PROPERTIES) class UCSlotsAttachedPrivate; class UCSlotsAttached : public QObject { Q_OBJECT Q_PROPERTY(UCSlotsLayout::UCSlotPosition position READ position WRITE setPosition NOTIFY positionChanged) Q_PROPERTY(UCSlotsLayoutPadding *padding READ padding CONSTANT FINAL) Q_PROPERTY(bool overrideVerticalPositioning READ overrideVerticalPositioning WRITE setOverrideVerticalPositioning NOTIFY overrideVerticalPositioningChanged) public: UCSlotsAttached(QObject *object = 0); UCSlotsLayout::UCSlotPosition position() const; void setPosition(UCSlotsLayout::UCSlotPosition pos); UCSlotsLayoutPadding *padding(); bool overrideVerticalPositioning() const; void setOverrideVerticalPositioning(bool val); Q_SIGNALS: void positionChanged(); void overrideVerticalPositioningChanged(); protected: Q_DECLARE_PRIVATE(UCSlotsAttached) private: Q_PRIVATE_SLOT(d_func(), void _q_onGuValueChanged()) }; class UCSlotsLayoutPadding : public QObject { Q_OBJECT Q_PROPERTY(qreal leading READ leading WRITE setLeadingQml NOTIFY leadingChanged FINAL) Q_PROPERTY(qreal trailing READ trailing WRITE setTrailingQml NOTIFY trailingChanged FINAL) Q_PROPERTY(qreal top READ top WRITE setTopQml NOTIFY topChanged FINAL) Q_PROPERTY(qreal bottom READ bottom WRITE setBottomQml NOTIFY bottomChanged FINAL) public: explicit UCSlotsLayoutPadding(QObject *parent = 0); qreal leading() const; void setLeading(qreal val); void setLeadingQml(qreal val); qreal trailing() const; void setTrailing(qreal val); void setTrailingQml(qreal val); qreal top() const; void setTop(qreal val); void setTopQml(qreal val); qreal bottom() const; void setBottom(qreal val); void setBottomQml(qreal val); //once the dev tries to change the offsets (and he does so via QML) we'll stop //updating offset's value, for instance when gu value changes or when the //positioning mode changes bool leadingWasSetFromQml : 1; bool trailingWasSetFromQml : 1; bool topWasSetFromQml : 1; bool bottomWasSetFromQml : 1; Q_SIGNALS: void leadingChanged(); void trailingChanged(); void topChanged(); void bottomChanged(); private: //similar to anchors.margins, but we don't use a contentItem so we handle this ourselves qreal m_leading; qreal m_trailing; qreal m_top; qreal m_bottom; }; #endif // UCSLOTSLAYOUT_H ./src/Ubuntu/Components/plugin/unixsignalhandler_p.cpp0000644000015600001650000000506212700370701023333 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "unixsignalhandler_p.h" #include #include #include #include UnixSignalHandler::UnixSignalHandler(QObject *parent) : QObject(parent) { } void UnixSignalHandler::connectSignal(SignalType type) { if (notifiers.contains(type)) { return; } HandlerType handler = createHandler((int)type); notifiers.insert(type, handler); socketRegister.insert(handler.first[1], type); } UnixSignalHandler::HandlerType UnixSignalHandler::createHandler(int signal) { struct sigaction sigAction; sigAction.sa_handler = signalHook; ::sigemptyset(&sigAction.sa_mask); sigAction.sa_flags = SA_RESTART; if (::sigaction(signal, &sigAction, 0) > 0) { qFatal("UNIX signal registration error"); } HandlerType handler; if (::socketpair(AF_UNIX, SOCK_STREAM, 0, handler.first.data())) { qFatal("Cannot create signal socketpair"); } handler.second = new QSocketNotifier(handler.first[1], QSocketNotifier::Read, this); QObject::connect(handler.second, SIGNAL(activated(int)), this, SLOT(notifierActivated(int))); return handler; } void UnixSignalHandler::signalHook(int signal) { HandlerType handler = UnixSignalHandler::instance().notifiers.value((SignalType)signal); char value = 1; ssize_t size = ::write(handler.first[0], &value, sizeof(value)); // this is needed to suppress write return value warning Q_UNUSED(size) } void UnixSignalHandler::notifierActivated(int socket) { // get the socket from the hash SignalType signal = socketRegister.value(socket); HandlerType handler = notifiers.value(signal); handler.second->setEnabled(false); char value; ssize_t size = ::read(handler.first[1], &value, sizeof(value)); // this is needed to suppress read return value warning Q_UNUSED(size) Q_EMIT signalTriggered(signal); handler.second->setEnabled(true); } ./src/Ubuntu/Components/plugin/ucdeprecatedtheme.h0000644000015600001650000000320512700370701022412 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: Zsombor Egri */ #ifndef UCDEPRECATEDTHEME_H #define UCDEPRECATEDTHEME_H #include #include class QQmlComponent; class QQmlContext; class UCTheme; class QQmlEngine; class UCDeprecatedTheme : public QObject { Q_OBJECT Q_PROPERTY(QString name READ name WRITE setName RESET resetName NOTIFY nameChanged) Q_PROPERTY(QObject* palette READ palette NOTIFY paletteChanged) public: explicit UCDeprecatedTheme(UCTheme *theme); // getter/setters QString name(); void setName(const QString& name); void resetName(); QObject* palette(); Q_INVOKABLE QQmlComponent* createStyleComponent(const QString& styleName, QObject* parent); static void registerToContext(QQmlContext* context); Q_SIGNALS: void nameChanged(); void paletteChanged(); private: void showDeprecatedNote(QObject *onItem, const char *note); UCTheme *defaultTheme(); QHash m_notes; }; #endif // UCDEPRECATEDTHEME_H ./src/Ubuntu/Components/plugin/qquickclipboard_p.h0000644000015600001650000000216512700370701022437 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef QQUICKCLIPBOARD_P_H #define QQUICKCLIPBOARD_P_H #include "qquickclipboard.h" #include class QQuickMimeData; class QQuickClipboardPrivate { Q_DECLARE_PUBLIC(QQuickClipboard) public: QQuickClipboardPrivate(QQuickClipboard *qq); QQuickClipboard *q_ptr; QClipboard *clipboard; QClipboard::Mode mode; QQuickMimeData *mimeData; void updateMimeData(); }; #endif // QQUICKCLIPBOARD_P_H ./src/Ubuntu/Components/plugin/uclistitem.h0000644000015600001650000002422512700370714021132 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCLISTITEM_H #define UCLISTITEM_H #include #include "ucstyleditembase.h" class UCListItemContent; class UCListItemDivider; class UCListItemActions; class UCAction; class UCListItemPrivate; class UCListItemExpansion; class UCListItem : public UCStyledItemBase { Q_OBJECT Q_PROPERTY(QQuickItem *contentItem READ contentItem CONSTANT) Q_PROPERTY(UCListItemDivider *divider READ divider CONSTANT) Q_PROPERTY(UCListItemActions *leadingActions READ leadingActions WRITE setLeadingActions NOTIFY leadingActionsChanged DESIGNABLE false) Q_PROPERTY(UCListItemActions *trailingActions READ trailingActions WRITE setTrailingActions NOTIFY trailingActionsChanged DESIGNABLE false) Q_PROPERTY(bool highlighted READ highlighted NOTIFY highlightedChanged) Q_PRIVATE_PROPERTY(UCListItem::d_func(), bool contentMoving READ contentMoving NOTIFY contentMovingChanged) Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) Q_PROPERTY(QColor highlightColor READ highlightColor WRITE setHighlightColor RESET resetHighlightColor NOTIFY highlightColorChanged) Q_PRIVATE_PROPERTY(UCListItem::d_func(), bool dragging READ dragging NOTIFY draggingChanged) Q_PRIVATE_PROPERTY(UCListItem::d_func(), bool dragMode READ dragMode WRITE setDragMode NOTIFY dragModeChanged) Q_PRIVATE_PROPERTY(UCListItem::d_func(), bool selected READ isSelected WRITE setSelected NOTIFY selectedChanged) Q_PRIVATE_PROPERTY(UCListItem::d_func(), bool selectMode READ selectMode WRITE setSelectMode NOTIFY selectModeChanged) Q_PRIVATE_PROPERTY(UCListItem::d_func(), UCAction *action READ action WRITE setAction NOTIFY actionChanged DESIGNABLE false) Q_PRIVATE_PROPERTY(UCListItem::d_func(), QQmlListProperty listItemData READ data DESIGNABLE false) Q_PRIVATE_PROPERTY(UCListItem::d_func(), QQmlListProperty listItemChildren READ children NOTIFY listItemChildrenChanged DESIGNABLE false) Q_CLASSINFO("DefaultProperty", "listItemData") // 1.3 Q_PROPERTY(UCListItemExpansion* expansion READ expansion CONSTANT REVISION 1) Q_PROPERTY(bool swipeEnabled READ isSwipeEnabled WRITE setSwipeEnabled NOTIFY swipeEnabledChanged FINAL REVISION 1) Q_PROPERTY(bool swiped READ isSwiped NOTIFY swipedChanged FINAL REVISION 1) public: explicit UCListItem(QQuickItem *parent = 0); ~UCListItem(); // overrides bool keyNavigationFocus() const override; QQuickItem *contentItem() const; UCListItemDivider *divider() const; UCListItemActions *leadingActions() const; void setLeadingActions(UCListItemActions *options); UCListItemActions *trailingActions() const; void setTrailingActions(UCListItemActions *options); bool highlighted() const; QColor color() const; void setColor(const QColor &color); QColor highlightColor() const; void setHighlightColor(const QColor &color); void resetHighlightColor(); // 1.3 UCListItemExpansion *expansion(); bool isSwipeEnabled() const; void setSwipeEnabled(bool swipeEnabled); bool isSwiped(); protected: virtual QObject *attachedViewItems(QObject *object, bool create); void classBegin(); void componentComplete(); QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data); void itemChange(ItemChange change, const ItemChangeData &data); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); bool childMouseEventFilter(QQuickItem *child, QEvent *event); bool eventFilter(QObject *, QEvent *); void timerEvent(QTimerEvent *event); void focusInEvent(QFocusEvent *event) override; void focusOutEvent(QFocusEvent *event) override; void keyPressEvent(QKeyEvent *event) override; Q_SIGNALS: void leadingActionsChanged(); void trailingActionsChanged(); void highlightedChanged(); void contentMovingChanged(); void colorChanged(); void highlightColorChanged(); void draggingChanged(); void dragModeChanged(); void selectedChanged(); void selectModeChanged(); void actionChanged(); void listItemChildrenChanged(); Q_REVISION(1) void swipeEnabledChanged(); Q_REVISION(1) void swipedChanged(); void clicked(); void pressAndHold(); void contentMovementStarted(); void contentMovementEnded(); public Q_SLOTS: protected: Q_DECLARE_PRIVATE(UCListItem) private: Q_PRIVATE_SLOT(d_func(), void _q_themeChanged()) Q_PRIVATE_SLOT(d_func(), void _q_relayout()) Q_PRIVATE_SLOT(d_func(), void _q_updateSwiping()) Q_PRIVATE_SLOT(d_func(), void _q_updateSize()) Q_PRIVATE_SLOT(d_func(), void _q_updateIndex()) Q_PRIVATE_SLOT(d_func(), void _q_contentMoving()) Q_PRIVATE_SLOT(d_func(), void _q_syncDragMode()) Q_PRIVATE_SLOT(d_func(), void _q_updateExpansion(const QList &indices)) Q_PRIVATE_SLOT(d_func(), void _q_popoverClosed()) }; class UCListItemDividerPrivate; class UCListItemDivider : public QQuickItem { Q_OBJECT Q_PROPERTY(QColor colorFrom READ colorFrom WRITE setColorFrom NOTIFY colorFromChanged) Q_PROPERTY(QColor colorTo READ colorTo WRITE setColorTo NOTIFY colorToChanged) public: explicit UCListItemDivider(UCListItem *parent = 0); ~UCListItemDivider(); void init(UCListItem *listItem); void paletteChanged(); Q_SIGNALS: void colorFromChanged(); void colorToChanged(); protected: QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *data); private: void updateGradient(); QColor colorFrom() const; void setColorFrom(const QColor &color); QColor colorTo() const; void setColorTo(const QColor &color); Q_DECLARE_PRIVATE(UCListItemDivider) }; class UCDragEvent; class UCViewItemsAttachedPrivate; class UCViewItemsAttached : public QObject { Q_OBJECT Q_PROPERTY(bool selectMode READ selectMode WRITE setSelectMode NOTIFY selectModeChanged) Q_PROPERTY(QList selectedIndices READ selectedIndices WRITE setSelectedIndices NOTIFY selectedIndicesChanged) Q_PROPERTY(bool dragMode READ dragMode WRITE setDragMode NOTIFY dragModeChanged) Q_ENUMS(ExpansionFlag) // FIXME these should be revisioned, however bug doesn't allow us to do that // https://bugs.launchpad.net/ubuntu/+source/qtdeclarative-opensource-src/+bug/1389721 Q_PROPERTY(QList expandedIndices READ expandedIndices WRITE setExpandedIndices NOTIFY expandedIndicesChanged) Q_PROPERTY(int expansionFlags READ expansionFlags WRITE setExpansionFlags NOTIFY expansionFlagsChanged) public: enum ExpansionFlag { Exclusive = 0x01, UnlockExpanded = 0x02, CollapseOnOutsidePress = Exclusive | 0x04 }; Q_DECLARE_FLAGS(ExpansionFlags, ExpansionFlag) explicit UCViewItemsAttached(QObject *owner = 0); ~UCViewItemsAttached(); static UCViewItemsAttached *qmlAttachedProperties(QObject *owner); bool listenToRebind(UCListItem *item, bool listen); bool isAttachedToListView(); bool isMoving(); bool isBoundTo(UCListItem *item); // getter/setter bool selectMode() const; void setSelectMode(bool value); QList selectedIndices() const; void setSelectedIndices(const QList &list); bool dragMode() const; void setDragMode(bool value); // 1.3 QList expandedIndices() const; void setExpandedIndices(QList indices); int expansionFlags() const; void setExpansionFlags(int flags); private Q_SLOTS: void unbindItem(); void completed(); Q_SIGNALS: void selectModeChanged(); void selectedIndicesChanged(const QList &indices); void dragModeChanged(); void dragUpdated(UCDragEvent *event); // 1.3 void expandedIndicesChanged(const QList &indices); void expansionFlagsChanged(); private: Q_DECLARE_PRIVATE(UCViewItemsAttached) }; Q_DECLARE_OPERATORS_FOR_FLAGS(UCViewItemsAttached::ExpansionFlags) QML_DECLARE_TYPEINFO(UCViewItemsAttached, QML_HAS_ATTACHED_PROPERTIES) class UCListItemExpansion : public QObject { Q_OBJECT Q_PROPERTY(bool expanded READ expanded WRITE setExpanded NOTIFY expandedChanged) Q_PROPERTY(qreal height MEMBER m_height WRITE setHeight NOTIFY heightChanged) public: explicit UCListItemExpansion(QObject *parent = 0); bool expandedLocked(); void enableClickFiltering(bool enable); bool expanded(); void setExpanded(bool expanded); void setHeight(qreal height); Q_SIGNALS: void expandedChanged(); void heightChanged(); protected: bool eventFilter(QObject *, QEvent *); private: UCListItem *m_listItem; qreal m_height; bool m_filtering:1; friend class UCListItem; friend class UCListItemPrivate; }; class UCDragEvent : public QObject { Q_OBJECT Q_PROPERTY(Status status READ status) Q_PROPERTY(int from READ from) Q_PROPERTY(int to READ to) Q_PROPERTY(int minimumIndex MEMBER m_minimum) Q_PROPERTY(int maximumIndex MEMBER m_maximum) Q_PROPERTY(bool accept MEMBER m_accept) Q_ENUMS(Status) public: enum Status { Started, Moving, Dropped }; explicit UCDragEvent(Status status, int from, int to, int min, int max) : QObject(0), m_status(status), m_from(from), m_to(to), m_minimum(min), m_maximum(max), m_accept(true) {} int from() const { return m_from; } int to() const { return m_to; } Status status() const { return m_status; } private: Status m_status; int m_from; int m_to; int m_minimum; int m_maximum; bool m_accept; friend class ListItemDragArea; }; #endif // UCLISTITEM_H ./src/Ubuntu/Components/plugin/ucslotslayout_p.h0000644000015600001650000001303612700370701022213 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Andrea Bernabei */ #ifndef UCSLOTSLAYOUTPRIVATE_H #define UCSLOTSLAYOUTPRIVATE_H #include #include "ucslotslayout.h" #define IMPLICIT_SLOTSLAYOUT_WIDTH_GU 40 #define IMPLICIT_SLOTSLAYOUT_HEIGHT_GU 7 #define SLOTSLAYOUT_SLOTS_SIDEMARGINS_GU 1 #define SLOTSLAYOUT_SLOTS_TOPBOTTOMMARGINS_GU 0 #define SLOTSLAYOUT_LEFTMARGIN_GU 1 #define SLOTSLAYOUT_RIGHTMARGIN_GU 1 //we want a different top/bottom margin if any of the slot is taller than this #define SLOTSLAYOUT_TOPBOTTOMMARGIN_SIZETHRESHOLD_GU 4 #define SLOTSLAYOUT_TOPMARGIN1_GU 1 #define SLOTSLAYOUT_TOPMARGIN2_GU 2 #define SLOTSLAYOUT_BOTTOMMARGIN1_GU 1 #define SLOTSLAYOUT_BOTTOMMARGIN2_GU 2 class UCSlotsLayoutPrivate : public QQuickItemPrivate { Q_DECLARE_PUBLIC(UCSlotsLayout) public: UCSlotsLayoutPrivate(); virtual ~UCSlotsLayoutPrivate(); void init(); void updateTopBottomPaddingIfNeeded(); //returns true if we want to ignore "slot" during the layout process bool skipSlot(QQuickItem *slot); //utility method that scans a list and adds the slot after all the slots which //have same position void insertSlotIntoSortedList(QQuickItem *slot, UCSlotsLayout::UCSlotPosition desiredSlotPosition, QList &slotsList); //add or remove a slot from the internal data structures void addSlot(QQuickItem *slot); void removeSlot(QQuickItem *slot); //layout "items" in a row, optionally anchoring the row to a sibling with margin siblingAnchorMargin //The optional anchoring behaviour can be disable by passing QQuickAnchorLine() void layoutInRow(qreal siblingAnchorMargin, QQuickAnchorLine siblingAnchor, QList &items); //this method sets up vertical anchors and paddings for a slot ("item"). //Attached properties are taken from "attached", if not null, otherwise //qml engine is queried. void setupSlotsVerticalPositioning(QQuickItem *item, UCSlotsAttached* attached = Q_NULLPTR); //We have two vertical positioning modes according to the visual design rules: //- RETURN VALUE CenterVertically --> All items have to be vertically centered //- RETURN VALUE AlignToTop --> All items have to anchor to the top of the listitem (using a top margin as well) //This is mainly used by the layout method enum UCSlotPositioningMode { AlignToTop, CenterVertically }; UCSlotsLayoutPrivate::UCSlotPositioningMode getVerticalPositioningMode() const; //connect/disconnect item's UCSlotsAttached properties changes to/from the right slot void handleAttachedPropertySignals(QQuickItem *item, bool connect); static inline UCSlotsLayoutPrivate *get(UCSlotsLayout *that) { Q_ASSERT(that); return that->d_func(); } void _q_onGuValueChanged(); void _q_updateCachedHeight(); void _q_updateProgressionStatus(); void _q_updateGuValues(); void _q_updateCachedMainSlotHeight(); void _q_updateSlotsBBoxHeight(); void _q_updateSize(); void _q_onSlotWidthChanged(); void _q_onSlotOverrideVerticalPositioningChanged(); void _q_onSlotPositionChanged(); void _q_relayout(); UCSlotsLayoutPadding padding; //These lists are just to split the children() between leading //and trailing slots. Some of the slots in this lists may be //ignored during relayout, for example if they're not visible or //similar conditions. (see relayout implementation to make sure //what conditions we check before ignoring a slot) QList leadingSlots; QList trailingSlots; QQuickItem* mainSlot; //We cache the current parent so that we can disconnect from the signals when the //parent changes. We need this because itemChange(..) only provides the new parent QQuickItem *m_parentItem; qreal mainSlotHeight; //max slots height ignoring the main slot qreal maxSlotsHeight; //we cache the height so that we only relayout when it goes //from 0 to non-0 and not viceversa qreal _q_cachedHeight; //currently fixed, but we may allow changing this in the future qint32 maxNumberOfLeadingSlots; qint32 maxNumberOfTrailingSlots; //Show the chevron, name taken from old ListItem API to minimize changes bool progression : 1; }; class UCSlotsAttachedPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(UCSlotsAttached) public: UCSlotsAttachedPrivate(); static inline UCSlotsAttachedPrivate *get(UCSlotsAttached *that) { Q_ASSERT(that); return that->d_func(); } void _q_onGuValueChanged(); UCSlotsLayoutPadding padding; UCSlotsLayout::UCSlotPosition position; bool overrideVerticalPositioning : 1; }; #endif // UCSLOTSLAYOUTPRIVATE_H ./src/Ubuntu/Components/plugin/ucactionitem.cpp0000644000015600001650000002662612700370701021772 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "ucactionitem.h" #include "ucactionitem_p.h" #include "ucaction.h" #include "ucstyleditembase_p.h" #define foreach Q_FOREACH #include #undef foreach UCActionItemPrivate::UCActionItemPrivate() : action(Q_NULLPTR) , flags(0) { } void UCActionItemPrivate::init() { Q_Q(UCActionItem); QObject::connect(q, &UCActionItem::enabledChanged, q, &UCActionItem::enabledChanged2); QObject::connect(q, &UCActionItem::visibleChanged, q, &UCActionItem::visibleChanged2); } /*! * \qmltype ActionItem * \instantiates UCActionItem * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu * \brief A visual representation of an Action. The API of ActionItem is a * copy of the API of \l Action, with additional properties to define * visual aspects of the ActionItem. * * If \l action is set, the values of the other properties will by default * be identical to the \l Action's property values. Setting the other properties * will override the properties copied from the \l Action. */ /*! * \qmlsignal ActionItem::triggered(var value) * Called when the actionItem is triggered. */ UCActionItem::UCActionItem(QQuickItem *parent) : UCStyledItemBase(*(new UCActionItemPrivate), parent) { d_func()->init(); } UCActionItem::UCActionItem(UCActionItemPrivate &dd, QQuickItem *parent) : UCStyledItemBase(dd, parent) { d_func()->init(); } bool UCActionItemPrivate::hasBindingOnProperty(const QString &name) { Q_Q(UCActionItem); QQmlProperty property(q, name, qmlContext(q)); return QQmlPropertyPrivate::binding(property) != Q_NULLPTR; } // update visible property void UCActionItemPrivate::_q_visibleBinding() { if (flags & CustomVisible) { return; } if (hasBindingOnProperty(QStringLiteral("visible"))) { flags |= CustomEnabled; return; } bool visible = action ? action->m_visible : true; q_func()->setVisible(visible); } // update enabled property void UCActionItemPrivate::_q_enabledBinding() { if (flags & CustomEnabled) { return; } if (hasBindingOnProperty(QStringLiteral("enabled"))) { flags |= CustomEnabled; return; } bool enabled = action ? action->m_enabled : true; q_func()->setEnabled(enabled); } // invoke actions' overridden triger() function void UCActionItemPrivate::_q_invokeActionTrigger(const QVariant &value) { invokeTrigger(action, value); } // setter called when bindings from QML set the value. Internal functions will // all use the setVisible setter, so initialization and (re)parenting related // visible alteration won't set the custom flag void UCActionItem::setVisible2(bool visible) { // set the custom flag and forward the value to the original proepry setter d_func()->flags |= UCActionItemPrivate::CustomVisible; setVisible(visible); } void UCActionItem::setEnabled2(bool enabled) { d_func()->flags |= UCActionItemPrivate::CustomEnabled; setEnabled(enabled); } void UCActionItemPrivate::updateProperties() { Q_Q(UCActionItem); if (!(flags & CustomText)) { Q_EMIT q->textChanged(); } if (!(flags & CustomIconSource)) { Q_EMIT q->iconSourceChanged(); } if (!(flags & CustomIconName)) { Q_EMIT q->iconNameChanged(); } } void UCActionItemPrivate::attachAction(bool attach) { Q_Q(UCActionItem); if (attach) { action->addOwningItem(q); QObject::connect(q, SIGNAL(triggered(QVariant)), q, SLOT(_q_invokeActionTrigger(QVariant)), Qt::DirectConnection); if (!(flags & CustomVisible)) { QObject::connect(action, SIGNAL(visibleChanged()), q, SLOT(_q_visibleBinding()), Qt::DirectConnection); } if (!(flags & CustomEnabled)) { QObject::connect(action, SIGNAL(enabledChanged()), q, SLOT(_q_enabledBinding()), Qt::DirectConnection); } if (!(flags & CustomText)) { QObject::connect(action, &UCAction::textChanged, q, &UCActionItem::textChanged, Qt::DirectConnection); } if (!(flags & CustomIconSource)) { QObject::connect(action, &UCAction::iconSourceChanged, q, &UCActionItem::iconSourceChanged, Qt::DirectConnection); } if (!(flags & CustomIconName)) { QObject::connect(action, &UCAction::iconNameChanged, q, &UCActionItem::iconNameChanged, Qt::DirectConnection); } } else { action->removeOwningItem(q); QObject::disconnect(q, SIGNAL(triggered(QVariant)), q, SLOT(_q_invokeActionTrigger(QVariant))); if (!(flags & CustomVisible)) { QObject::disconnect(action, SIGNAL(visibleChanged()), q, SLOT(_q_visibleBinding())); } if (!(flags & CustomEnabled)) { QObject::disconnect(action, SIGNAL(enabledChanged()), q, SLOT(_q_enabledBinding())); } if (!(flags & CustomText)) { QObject::disconnect(action, &UCAction::textChanged, q, &UCActionItem::textChanged); } if (!(flags & CustomIconSource)) { QObject::disconnect(action, &UCAction::iconSourceChanged, q, &UCActionItem::iconSourceChanged); } if (!(flags & CustomIconName)) { QObject::disconnect(action, &UCAction::iconNameChanged, q, &UCActionItem::iconNameChanged); } } } /*! * \qmlproperty Action ActionItem::action * The \l Action associated with this ActionItem. If action is set, the values * of the \l Action properties are copied to the values of the ActionItem * properties, unless those were previously overridden. */ UCAction* UCActionItem::action() const { Q_D(const UCActionItem); return d->action; } void UCActionItem::setAction(UCAction *action) { Q_D(UCActionItem); if (d->action == action) { return; } if (d->action) { d->attachAction(false); } d->action = action; Q_EMIT actionChanged(); if (d->action) { d->attachAction(true); } d->_q_visibleBinding(); d->_q_enabledBinding(); d->updateProperties(); } /*! * \qmlproperty string ActionItem::text * The title of the actionItem. Defaults to the \c action.text. */ QString UCActionItem::text() { Q_D(UCActionItem); if (d->flags & UCActionItemPrivate::CustomText) { return d->text; } return d->action ? d->action->text() : QString(); } void UCActionItem::setText(const QString &text) { Q_D(UCActionItem); if (d->action && !(d->flags & UCActionItemPrivate::CustomText)) { // disconnect change signal from Action disconnect(d->action, &UCAction::textChanged, this, &UCActionItem::textChanged); } d->flags |= UCActionItemPrivate::CustomText; if (d->text == text) { return; } d->text = text; Q_EMIT textChanged(); } void UCActionItem::resetText() { Q_D(UCActionItem); d->text.clear(); d->flags &= ~UCActionItemPrivate::CustomText; if (d->action) { // re-connect change signal from Action connect(d->action, &UCAction::textChanged, this, &UCActionItem::textChanged, Qt::DirectConnection); } Q_EMIT textChanged(); } /*! * \qmlproperty url ActionItem::iconSource * The image associated with the ActionItem. Defaults to \c action.iconSource. * * This is the URL of any image file. If both iconSource and \l iconName are defined, * \l iconName will be ignored. */ QUrl UCActionItem::iconSource() { Q_D(UCActionItem); if (d->flags & UCActionItemPrivate::CustomIconSource) { return d->iconSource; } if (d->action) { return d->action->m_iconSource; } return !iconName().isEmpty() ? QUrl(QString("image://theme/%1").arg(iconName())) : QUrl(); } void UCActionItem::setIconSource(const QUrl &iconSource) { Q_D(UCActionItem); if (d->action && !(d->flags & UCActionItemPrivate::CustomIconSource)) { // disconnect change signal from Action disconnect(d->action, &UCAction::iconSourceChanged, this, &UCActionItem::iconSourceChanged); } d->flags |= UCActionItemPrivate::CustomIconSource; if (d->iconSource == iconSource) { return; } d->iconSource = iconSource; Q_EMIT iconSourceChanged(); } void UCActionItem::resetIconSource() { Q_D(UCActionItem); d->iconSource.clear(); d->flags &= ~UCActionItemPrivate::CustomIconSource; if (d->action) { // re-connect change signal from Action connect(d->action, &UCAction::iconSourceChanged, this, &UCActionItem::iconSourceChanged, Qt::DirectConnection); } Q_EMIT iconSourceChanged(); } /*! * \qmlproperty string ActionItem::iconName * The icon associated with the actionItem in the suru icon theme. Defaults to * \c action.iconName. * * \note The complete list of icons available in Ubuntu is not published yet. * For now please refer to the folders where the icon themes are installed: * \list * \li Ubuntu Touch: \l file:/usr/share/icons/suru * \li Ubuntu Desktop: \l file:/usr/share/icons/ubuntu-mono-dark * \endlist * These 2 separate icon themes will be merged soon. * * If both \l iconSource and iconName are defined, iconName will be ignored. */ QString UCActionItem::iconName() { Q_D(UCActionItem); if (d->flags & UCActionItemPrivate::CustomIconName) { return d->iconName; } return d->action ? d->action->m_iconName : QString(); } void UCActionItem::setIconName(const QString &iconName) { Q_D(UCActionItem); if (d->action && !(d->flags & UCActionItemPrivate::CustomIconName)) { // disconnect change signal from Action disconnect(d->action, &UCAction::iconNameChanged, this, &UCActionItem::iconNameChanged); } d->flags |= UCActionItemPrivate::CustomIconName; if (d->iconName == iconName) { return; } d->iconName = iconName; Q_EMIT iconNameChanged(); // also sync iconSource if that is not a custom one or taken from action if (!d->action || (d->flags & UCActionItemPrivate::CustomIconSource)) { Q_EMIT iconSourceChanged(); } } void UCActionItem::resetIconName() { Q_D(UCActionItem); d->iconName.clear(); d->flags &= ~UCActionItemPrivate::CustomIconName; if (d->action) { // re-connect change signal from Action connect(d->action, &UCAction::iconNameChanged, this, &UCActionItem::iconNameChanged, Qt::DirectConnection); } Q_EMIT iconNameChanged(); } /*! * \qmlmethod void ActionItem::trigger(var value) * Trigger this action item if it is enabled. */ void UCActionItem::trigger(const QVariant &value) { if (isEnabled()) { Q_EMIT triggered(value); } } #include "moc_ucactionitem.cpp" ./src/Ubuntu/Components/plugin/gestures/0000755000015600001650000000000012700370701020427 5ustar jenkinsjenkins./src/Ubuntu/Components/plugin/gestures/CandidateInactivityTimer.h0000644000015600001650000000271612700370701025527 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #ifndef UBUNTUGESTURES_CANDIDATE_INACTIVITY_TIMER_H #define UBUNTUGESTURES_CANDIDATE_INACTIVITY_TIMER_H #include class QQuickItem; #include "Timer.h" namespace UbuntuGestures { class UBUNTUGESTURESQML_EXPORT CandidateInactivityTimer : public QObject { Q_OBJECT public: CandidateInactivityTimer(int touchId, QQuickItem *candidate, AbstractTimer *timer, QObject *parent = Q_NULLPTR); virtual ~CandidateInactivityTimer(); const int durationMs = 1000; Q_SIGNALS: void candidateDefaulted(int touchId, QQuickItem *candidate); private Q_SLOTS: void onTimeout(); private: AbstractTimer *m_timer; int m_touchId; QQuickItem *m_candidate; }; } // namespace UbuntuGestures #endif // UBUNTUGESTURES_CANDIDATE_INACTIVITY_TIMER_H ./src/Ubuntu/Components/plugin/gestures/ubuntugesturesqmlglobal.h0000644000015600001650000000147412700370701025605 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #if defined(UBUNTUGESTURESQML_LIBRARY) # define UBUNTUGESTURESQML_EXPORT Q_DECL_EXPORT #else # define UBUNTUGESTURESQML_EXPORT Q_DECL_IMPORT #endif ./src/Ubuntu/Components/plugin/gestures/CandidateInactivityTimer.cpp0000644000015600001650000000261512700370701026060 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "CandidateInactivityTimer.h" namespace UbuntuGestures { CandidateInactivityTimer::CandidateInactivityTimer(int touchId, QQuickItem *candidate, AbstractTimer *timer, QObject *parent) : QObject(parent) , m_timer(timer) , m_touchId(touchId) , m_candidate(candidate) { connect(m_timer, &AbstractTimer::timeout, this, &CandidateInactivityTimer::onTimeout); m_timer->setInterval(durationMs); m_timer->setSingleShot(true); m_timer->start(); } CandidateInactivityTimer::~CandidateInactivityTimer() { delete m_timer; } void CandidateInactivityTimer::onTimeout() { qWarning("[TouchRegistry] Candidate for touch %d defaulted!", m_touchId); Q_EMIT candidateDefaulted(m_touchId, m_candidate); } } // namespace UbuntuGestures ./src/Ubuntu/Components/plugin/ucmainviewbase.h0000644000015600001650000000576512700370701021756 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCMAINVIEWBASE_H #define UCMAINVIEWBASE_H #include "ucpagetreenode.h" class UCMainViewBasePrivate; class UCActionManager; class UCPopupContext; class UCAction; class UCMainViewBase : public UCPageTreeNode { Q_OBJECT Q_PROPERTY(QString applicationName READ applicationName WRITE setApplicationName NOTIFY applicationNameChanged) Q_PROPERTY(bool anchorToKeyboard READ anchorToKeyboard WRITE setAnchorToKeyboard NOTIFY anchorToKeyboardChanged) Q_PROPERTY(QColor headerColor READ headerColor WRITE setHeaderColor NOTIFY headerColorChanged) Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor NOTIFY backgroundColorChanged) Q_PROPERTY(QColor footerColor READ footerColor WRITE setFooterColor NOTIFY footerColorChanged) Q_PROPERTY(QQmlListProperty actions READ actions) Q_PROPERTY(UCActionManager* actionManager READ actionManager NOTIFY actionManagerChanged) Q_PROPERTY(UCPopupContext* actionContext READ actionContext NOTIFY actionContextChanged) public: UCMainViewBase(QQuickItem *parent = nullptr); QString applicationName() const; void setApplicationName(QString applicationName); bool anchorToKeyboard() const; void setAnchorToKeyboard(bool anchorToKeyboard); QColor headerColor() const; void setHeaderColor(QColor headerColor); QColor backgroundColor() const; void setBackgroundColor(QColor backgroundColor); QColor footerColor() const; void setFooterColor(QColor footerColor); QQmlListProperty actions() const; UCActionManager *actionManager() const; UCPopupContext* actionContext() const; // QQmlParserStatus interface virtual void componentComplete() override; virtual void classBegin() override; Q_SIGNALS: void applicationNameChanged(QString applicationName); void anchorToKeyboardChanged(bool anchorToKeyboard); void headerColorChanged(const QColor &headerColor); void backgroundColorChanged(const QColor &backgroundColor); void footerColorChanged(const QColor &footerColor); void actionManagerChanged(UCActionManager* actionManager); void actionContextChanged(UCPopupContext* actionContext); protected: UCMainViewBase(UCMainViewBasePrivate &dd, QQuickItem *parent); private: Q_DECLARE_PRIVATE(UCMainViewBase) Q_PRIVATE_SLOT(d_func(), void _q_updateWindow()) }; #endif // UCMAINVIEWBASE_H ./src/Ubuntu/Components/plugin/ucserviceproperties.cpp0000644000015600001650000002432512700370701023405 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "ucserviceproperties.h" #include "ucserviceproperties_p.h" #include "i18n.h" #include #include #include #include UCServicePropertiesPrivate::UCServicePropertiesPrivate(UCServiceProperties *qq) : q_ptr(qq) , ready(false) , status(UCServiceProperties::Inactive) , type(UCServiceProperties::System) { } UCServicePropertiesPrivate::~UCServicePropertiesPrivate() { } UCServicePropertiesPrivate *UCServicePropertiesPrivate::get(UCServiceProperties *service) { return service->d_func(); } void UCServicePropertiesPrivate::warning(const QString &message) { // append warning messages to the error string if (error.isEmpty()) { setError(message); } else { setError(QString("%1\n%2").arg(error).arg(message)); } QString env = qgetenv("SHOW_SERVICEPROPERTIES_WARNINGS"); if (!env.isEmpty() && (env == "1" || env.toLower() == "true")) { qmlInfo(q_ptr) << message; } } void UCServicePropertiesPrivate::setError(const QString &msg) { if (error == msg) { return; } error = msg; Q_EMIT q_ptr->errorChanged(); } void UCServicePropertiesPrivate::setStatus(UCServiceProperties::Status status) { if (this->status == status) { return; } this->status = status; Q_EMIT q_ptr->statusChanged(); } void printLocked(UCServiceProperties *owner) { UCServicePropertiesPrivate::get(owner)-> warning(QStringLiteral("Changing connection parameters forbidden.")); } /*! * \qmltype ServiceProperties * \instantiates UCServiceProperties * \inqmlmodule Ubuntu.Components 1.1 * \since Ubuntu.Components 1.1 * \ingroup ubuntu-services * \brief The component enables accessing service properties from QML. * * The services accessed by the component are ones providing their interfaces * through DBus. The component is specialized to read properties exposed by these * services, andf to keep these property values up to date. It is not meant to * access signals or slots exposed, nor to change the values of the properties * watched. * * Properties watched should be declared within the body of the component like * any other QML property, preferably defining a default value for them. The component * will enumerate these properties and will ask the service to provide values for * those. When enumerating properties, each property will be checked twice, with * the case specified as well as with the first letter capitalized. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * * ServiceProperties { * service: "org.freenode.AccountsService" * path: "/org/freenode/AccountsService" * serviceInterface: "org.freenode.AccountsService" * adaptorInterface: "com.ubuntu.touch.Accounts.Sound" * // listing properties to watch * // each property name existence will be checked against the current case * // as well as with first character capitalized * property bool incomingCallVibrate: true * } * \endqml * * Note that there are few properties which must be set in order the component * to work. These are \l service, \l path and \l adaptorInterface. Also, once * specified, \l service, \l serviceInterface and \l adaptorInterface values * should not be changed as it cannot be guaranteed that properties watched will * be available on those service. Therefore any change on these properties after * the component completion will be ignored. Property bindings on properties * watched will be ignored as well, as service will report changes in these property * values. * * The service is connected once the component gets completed (Component.onCompleted). * The \l error property specifies any error occured during connection, and the * \l status property notifies whether the connection to the service is active or not. * * \note Pay attention when chosing the service watched, and set your application's * AppArmor rights to ensure a successful service connection. */ UCServiceProperties::UCServiceProperties(QObject *parent) : QObject(parent) , d_ptr(createServicePropertiesAdapter(this)) { } UCServiceProperties::~UCServiceProperties() { delete d_ptr; d_ptr = 0; } void UCServiceProperties::classBegin() { } void UCServiceProperties::componentComplete() { Q_D(UCServiceProperties); d->ready = true; // enumerate properties const QMetaObject *mo = metaObject(); for (int i = mo->propertyOffset(); i < mo->propertyCount(); i++) { const QMetaProperty prop = mo->property(i); QString property(prop.name()); // check the binding on the property and warn if there is one. QQmlProperty qmlProperty(this, property); if (QQmlPropertyPrivate::binding(qmlProperty)) { d->warning(QStringLiteral("Binding detected on property '%1' will be removed by the service updates."). arg(property)); } // insert both the declared and capitalized first character properties d->properties << property; property[0] = property[0].toUpper(); d->properties << property; } // initialize DBus if (d->init()) { d->setStatus(UCServiceProperties::Synchronizing); d->fetchPropertyValues(); } } /*! * \qmlproperty enum ServiceProperties::type * Specifies the DBus connection session type. It can get the following values: * \list * \li - \e ServiceProperties.System when system bus is used (default) * \li - \e ServiceProperties.Session when session bus is used * \endlist */ UCServiceProperties::ServiceType UCServiceProperties::type() const { Q_D(const UCServiceProperties); return d->type; } void UCServiceProperties::setType(ServiceType type) { Q_D(UCServiceProperties); if (d->type == type) { return; } if (d->ready) { printLocked(this); return; } d->type = type; Q_EMIT typeChanged(); } /*! * \qmlproperty string ServiceProperties::service * The proeprty specifies the DBus service URI. It is mandatory to be specified. */ QString UCServiceProperties::service() const { Q_D(const UCServiceProperties); return d->service; } void UCServiceProperties::setService(const QString &value) { Q_D(UCServiceProperties); if (d->service == value) { return; } if (d->ready) { printLocked(this); return; } d->service = value; Q_EMIT serviceChanged(); } /*! * \qmlproperty string ServiceProperties::path * The property specifies the DBus service connection path. It is mandatory to be * specified. */ QString UCServiceProperties::path() const { Q_D(const UCServiceProperties); return d->path; } void UCServiceProperties::setPath(const QString &value) { Q_D(UCServiceProperties); if (d->path == value) { return; } d->path = value; Q_EMIT pathChanged(); if (d->ready) { // need to re-initialize connections d->init(); } } /*! * \qmlproperty string ServiceProperties::serviceInterface * The property specifies the service intertface. If it is an empty string, the * component will refer to the merging of all interfaces found in the service. */ QString UCServiceProperties::interface() const { Q_D(const UCServiceProperties); return d->interface; } void UCServiceProperties::setInterface(const QString &value) { Q_D(UCServiceProperties); if (d->interface == value) { return; } if (d->ready) { printLocked(this); return; } d->interface = value; Q_EMIT serviceInterfaceChanged(); } /*! * \qmlproperty string ServiceProperties::adaptorInterface * The proeprty specifies the dbus adaptor interface which provides the properties * watched. This can be a different interface that the one specified in \l serviceInterface, * and in the same way, it can be empty, in which case all the properties from all * interfaces of the service will be watched. */ QString UCServiceProperties::adaptor() const { Q_D(const UCServiceProperties); return d->adaptor; } void UCServiceProperties::setAdaptor(const QString &value) { Q_D(UCServiceProperties); if (d->adaptor == value) { return; } if (d->ready) { printLocked(this); return; } d->adaptor = value; Q_EMIT adaptorInterfaceChanged(); } /*! * \qmlproperty string ServiceProperties::error * The property is set with a human readablestring each time an error occurrs * during the service connection. Empty string means no error. */ QString UCServiceProperties::error() { Q_D(UCServiceProperties); return d->error; } /*! * \qmlproperty enum ServiceProperties::status * The property presents the status of the component. * \list * \li - \e ServiceProperties.Inactive - the component is inactive, initial state * \li - \e ServiceProperties.ConnectionError - there was a connection error, the * \l error contains the error string. * \li - \e ServiceProperties.Synchronizing - the connection to the service succeeded, * and the properties are being synchronized; * \li - \e ServiceProperties.Active - the service watcher is active and initial * property synchronization completed. * \endlist * \note While the status is set to \e Synchronizing, the properties are checked * against their existence in the service. Each proeprty will be checked as declared * as well with capital first letter. If neither of these exists in the service, * it will be reported in the \l error property separately. */ UCServiceProperties::Status UCServiceProperties::status() const { Q_D(const UCServiceProperties); return d->status; } #include "moc_ucserviceproperties.cpp" ./src/Ubuntu/Components/plugin/uchaptics.cpp0000644000015600001650000001257312700370701021265 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "uchaptics.h" #include "plugin.h" #include #include #include /*! \qmltype Haptics \instantiates UCHaptics \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu-services \brief Singleton defining the haptics feedback used in components, where execution of the feedback is controlled by the system settings. Supports global feedback as well as custom feedback. Global feedback can be configured through its properties, and \l play function will play the default configuration, or a custom one if parameter is given. Example of using Haptics: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 Item { implicitWidth: units.gu(20) implicitHeight: units.gu(5) Label { text: "Press me" anchors.fill: parent horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } MouseArea { anchors.fill: parent onClicked: Haptics.play() } } \endqml Custom effects can be played as follows: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 Item { implicitWidth: units.gu(20) implicitHeight: units.gu(5) Label { text: "Press me" anchors.fill: parent horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } MouseArea { anchors.fill: parent onClicked: Haptics.play({duration: 25, attackIntensity: 0.7}) } } \endqml \note Though the \l effect property exposes \c start, \c stop and \c pause functions, use those only if you want to have feedback independent from what the system setting is. */ UCHaptics::UCHaptics(QObject *parent) : QObject(parent) { connect(HapticsProxy::instance(), &HapticsProxy::enabledChanged, this, &UCHaptics::enabledChanged); } /*! \qmlproperty bool Haptics::enabled \readonly The property specifies whether the haptics feedback is enabled or not by the system. */ bool UCHaptics::enabled() const { return HapticsProxy::instance()->enabled(); } /*! \qmlproperty HapticsEffect Haptics::effect \readonly The property defines the settings of the haptics effect used by the component. The default setting is a haptics effect with a duration of 10 milliseconds with an intensity of 1.0, having fading time of 50 millisecods and fading intensity 0.0, and attack time of 50 milliseconds and with an intensity of 0.0. */ QObject *UCHaptics::effect() const { return HapticsProxy::instance()->effect(); } /*! \qmlmethod void Haptics::play(var customEffect) The function plays the feedback with the configuration specified in \l effect if no parameter is given. Custom effect can be played by specifying the effect properties in a JSON object in \c customEffect. The function will exit unconditionaly if playing the effects is blocked by system settings. The function will not stop any ongoing haptics effect played, if that one was a default haptics effect. In case of custom effects, the previous effect will be stopped, and settings will be restored before the new haptics will be played. The custom settings properties (the ones which are required to be different from the ones defined in the \l effect) must be specified in the parameter in a JSON object. */ void UCHaptics::play(const QVariant &customEffect) { HapticsProxy::instance()->play(customEffect); } /********************************************************* * Proxy implementation */ HapticsProxy *HapticsProxy::m_instance = nullptr; bool HapticsProxy::enabled() { initialize(); return (m_proxyObject) ? m_proxyObject->property("enabled").toBool() : false; } QObject *HapticsProxy::effect() { initialize(); return (m_proxyObject) ? m_proxyObject->property("effect").value() : Q_NULLPTR; } void HapticsProxy::initialize() { if (!m_engine || m_proxyObject) { return; } // load haptics proxy from file system/qrc QUrl path = UbuntuComponentsPlugin::pluginUrl().resolved(QUrl("1.1/Haptics.qml")); QQmlComponent component(m_engine, path, QQmlComponent::PreferSynchronous); if (!component.isError()) { m_proxyObject = component.create(); if (m_proxyObject) { connect(m_proxyObject, SIGNAL(enabledChanged()), this, SIGNAL(enabledChanged())); } } else { qWarning() << qPrintable(component.errorString()); } } void HapticsProxy::play(const QVariant &customEffect) { if (!m_engine) { qWarning() << "Engine not specified, haptics won't play"; } initialize(); if (m_proxyObject) { // invoke play function m_proxyObject->metaObject()->invokeMethod(m_proxyObject, "play", Q_ARG(QVariant, customEffect)); } } ./src/Ubuntu/Components/plugin/ucnamespace.h0000644000015600001650000000472212700370701021230 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #ifndef UCNAMESPACE_H #define UCNAMESPACE_H #include #include "quickutils.h" #define BUILD_VERSION(major, minor) ((((major) & 0x00FF) << 8) | ((minor) & 0x00FF)) #define LATEST_UITK_VERSION BUILD_VERSION(1, 3) #define MAJOR_VERSION(version) ((version) >> 8) #define MINOR_VERSION(version) ((version) & 0x00FF) #define UC_QML_DEPRECATION_WARNING(msg) \ { \ static bool loggedOnce = false; \ if (!loggedOnce) { \ if (QuickUtils::showDeprecationWarnings()) { \ qmlInfo(this) << msg; \ } \ } \ } class UCNamespace : public QObject { Q_OBJECT Q_ENUMS(CaptionsStyle) public: enum CaptionsStyle { TitleCaptionStyle = 5000, SummaryCaptionStyle }; explicit UCNamespace(QObject *parent = 0); }; // this class is for next version, no need to revision it class UCNamespaceV13 : public UCNamespace { Q_OBJECT Q_PROPERTY(quint16 toolkitVersion READ toolkitVersion NOTIFY toolkitVersionChanged) Q_PROPERTY(quint16 toolkitVersionMajor READ toolkitVersionMajor NOTIFY toolkitVersionChanged) Q_PROPERTY(quint16 toolkitVersionMinor READ toolkitVersionMinor NOTIFY toolkitVersionChanged) public: explicit UCNamespaceV13(QObject *parent = 0) : UCNamespace(parent) { m_toolkitVersion = LATEST_UITK_VERSION; } Q_INVOKABLE quint16 version(quint8 major, quint8 minor); Q_SIGNALS: void toolkitVersionChanged(); protected: virtual quint16 toolkitVersion() const { return m_toolkitVersion; } quint16 toolkitVersionMajor() const { return MAJOR_VERSION(m_toolkitVersion); } quint16 toolkitVersionMinor() const { return MINOR_VERSION(m_toolkitVersion); } private: quint16 m_toolkitVersion; }; #endif // UCNAMESPACE_H ./src/Ubuntu/Components/plugin/ucviewitemsattached.cpp0000644000015600001650000005622312700370714023350 0ustar jenkinsjenkins/* * Copyright 2014-2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "ucunits.h" #include "uctheme.h" #include "uclistitem.h" #include "uclistitem_p.h" #include "propertychange_p.h" #include "quickutils.h" #include "i18n.h" #include "uclistitemstyle.h" #include "privates/listitemdragarea.h" #include "privates/listviewextensions.h" #include #include #include #include #include #include /*! * \qmltype ListItemDrag * \inqmlmodule Ubuntu.Components 1.2 * \ingroup ubuntu-listitem * \since Ubuntu.Components 1.2 * \brief Provides information about a ListItem drag event. * * The object cannot be instantiated and it is passed as parameter to \l ViewItems::dragUpdated * attached signal. Developer can decide whether to accept or restrict the dragging * event based on the input provided by this event. * * The direction of the drag can be found via the \l status property and the * source and destination the drag can be applied via \l from and \l to properties. * The allowed directions can be configured through \l minimumIndex and \l maximumIndex * properties, and the event acceptance through \l accept property. If the event is not * accepted, the drag action will be considered as cancelled. */ /*! * \qmlproperty enum ListItemDrag::status * \readonly * The property provides information about the status of the drag. Its value can * be one of the following: * \list * \li \b ListItemDrag.Started - indicates that the dragging is about to start, * giving opportunities to define restrictions on the dragging indexes, * like \l minimumIndex, \l maximumIndex * \li \b ListItemDrag.Moving - the dragged item is moved upwards or downwards * in the ListItem * \li \b ListItemDrag.Dropped - indicates that the drag event is finished, and * the dragged item is about to be dropped to the given position. * \endlist */ /*! * \qmlproperty int ListItemDrag::from * \readonly * Specifies the source index the ListItem is dragged from. */ /*! * \qmlproperty int ListItemDrag::to * \readonly * * Specifies the index the ListItem is dragged to or dropped. */ /*! * \qmlproperty int ListItemDrag::maximumIndex */ /*! * \qmlproperty int ListItemDrag::minimumIndex * These properties configure the minimum and maximum indexes the item can be * dragged. The properties can be set in \l ViewItems::dragUpdated signal. * A negative value means no restriction defined on the dragging interval side. */ /*! * \qmlproperty bool ListItemDrag::accept * The property can be used to dismiss the event. By default its value is true, * meaning the drag event is accepted. The value of false blocks the drag event * to be handled by the ListItem's dragging mechanism. */ /* * The properties are attached to the ListItem's parent item or to its closest * Flickable parent, when embedded in ListView or Flickable. There will be only * one attached property per Flickable for all embedded child ListItems, enabling * in this way the controlling of the interactive flag of the Flickable and all * its ascendant Flickables. */ UCViewItemsAttachedPrivate::UCViewItemsAttachedPrivate() : QObjectPrivate() , listView(0) , dragArea(0) , expansionFlags(UCViewItemsAttached::Exclusive) , selectable(false) , draggable(false) , ready(false) { } UCViewItemsAttachedPrivate::~UCViewItemsAttachedPrivate() { clearFlickablesList(); } void UCViewItemsAttachedPrivate::init() { Q_Q(UCViewItemsAttached); if (parent->inherits("QQuickListView")) { listView = new ListViewProxy(static_cast(parent), q); // ListView focus handling listView->view()->setActiveFocusOnTab(true); // filter ListView events to override up/down focus handling listView->overrideItemNavigation(true); } // listen readyness QQmlComponentAttached *attached = QQmlComponent::qmlAttachedProperties(parent); QObject::connect(attached, &QQmlComponentAttached::completed, q, &UCViewItemsAttached::completed); } // disconnect all flickables void UCViewItemsAttachedPrivate::clearFlickablesList() { Q_Q(UCViewItemsAttached); Q_FOREACH(const QPointer &flickable, flickables) { if (flickable.data()) { QObject::disconnect(flickable.data(), &QQuickFlickable::movementStarted, q, &UCViewItemsAttached::unbindItem); QObject::disconnect(flickable.data(), &QQuickFlickable::flickStarted, q, &UCViewItemsAttached::unbindItem); } } flickables.clear(); } // connect all flickables void UCViewItemsAttachedPrivate::buildFlickablesList() { Q_Q(UCViewItemsAttached); QQuickItem *item = qobject_cast(q->parent()); if (!item) { return; } clearFlickablesList(); while (item) { QQuickFlickable *flickable = qobject_cast(item); if (flickable) { QObject::connect(flickable, &QQuickFlickable::movementStarted, q, &UCViewItemsAttached::unbindItem); QObject::connect(flickable, &QQuickFlickable::flickStarted, q, &UCViewItemsAttached::unbindItem); flickables << flickable; } item = item->parentItem(); } } /*! * \qmltype ViewItems * \instantiates UCViewItemsAttached * \inqmlmodule Ubuntu.Components 1.2 * \ingroup ubuntu-listitem * \since Ubuntu.Components 1.2 * \brief A set of properties attached to the ListItem's parent item or ListView. * * These properties are automatically attached to the parent item of the ListItem, * or to ListView, when the component is used as delegate. */ UCViewItemsAttached::UCViewItemsAttached(QObject *owner) : QObject(*(new UCViewItemsAttachedPrivate()), owner) { d_func()->init(); } UCViewItemsAttached::~UCViewItemsAttached() { } UCViewItemsAttached *UCViewItemsAttached::qmlAttachedProperties(QObject *owner) { return new UCViewItemsAttached(owner); } // register item to be rebound bool UCViewItemsAttached::listenToRebind(UCListItem *item, bool listen) { // we cannot bind the item until we have an other one bound bool result = false; Q_D(UCViewItemsAttached); if (listen) { if (d->boundItem.isNull() || (d->boundItem == item)) { d->boundItem = item; // rebuild flickable list d->buildFlickablesList(); result = true; } } else if (d->boundItem == item) { d->boundItem.clear(); result = true; } return result; } // reports whether the ViewItems is attached to ListView bool UCViewItemsAttached::isAttachedToListView() { return (d_func()->listView != Q_NULLPTR); } // reports true if any of the ascendant flickables is moving bool UCViewItemsAttached::isMoving() { Q_D(UCViewItemsAttached); Q_FOREACH(const QPointer &flickable, d->flickables) { if (flickable && flickable->isMoving()) { return true; } } return false; } // returns true if the given ListItem is bound to listen on moving changes bool UCViewItemsAttached::isBoundTo(UCListItem *item) { Q_D(UCViewItemsAttached); return d->boundItem == item; } void UCViewItemsAttached::unbindItem() { Q_D(UCViewItemsAttached); if (d->boundItem) { // snap out before we unbind UCListItemPrivate::get(d->boundItem)->snapOut(); d->boundItem.clear(); } // clear binding list d->clearFlickablesList(); } // reports completion, and in case the dragMode is turned on, enters drag mode void UCViewItemsAttached::completed() { Q_D(UCViewItemsAttached); d->ready = true; if (d->draggable) { d->enterDragMode(); } else { d->leaveDragMode(); } } /*! * \qmlattachedproperty bool ViewItems::selectMode * The property drives whether list items are selectable or not. * * When set, the ListItems of the Item the property is attached to will enter into * selection state. ListItems provide a visual clue which can be used to toggle * the selection state of each, which in order will be reflected in the * \l {ViewItems::selectedIndices}{ViewItems.selectedIndices} list. */ bool UCViewItemsAttached::selectMode() const { Q_D(const UCViewItemsAttached); return d->selectable; } void UCViewItemsAttached::setSelectMode(bool value) { Q_D(UCViewItemsAttached); if (d->selectable == value) { return; } d->selectable = value; Q_EMIT selectModeChanged(); } /*! * \qmlattachedproperty list ViewItems::selectedIndices * The property contains the indexes of the ListItems marked as selected. The * indexes are model indexes when used in ListView, and child indexes in other * components. The property being writable, initial selection configuration * can be provided for a view, and provides ability to save the selection state. */ QList UCViewItemsAttached::selectedIndices() const { Q_D(const UCViewItemsAttached); return d->selectedList.toList(); } void UCViewItemsAttached::setSelectedIndices(const QList &list) { Q_D(UCViewItemsAttached); if (d->selectedList.toList() == list) { return; } d->selectedList = QSet::fromList(list); Q_EMIT selectedIndicesChanged(list); } bool UCViewItemsAttachedPrivate::addSelectedItem(UCListItem *item) { int index = UCListItemPrivate::get(item)->index(); if (!selectedList.contains(index)) { selectedList.insert(index); Q_EMIT q_func()->selectedIndicesChanged(selectedList.toList()); return true; } return false; } bool UCViewItemsAttachedPrivate::removeSelectedItem(UCListItem *item) { if (selectedList.remove(UCListItemPrivate::get(item)->index()) > 0) { Q_EMIT q_func()->selectedIndicesChanged(selectedList.toList()); return true; } return false; } bool UCViewItemsAttachedPrivate::isItemSelected(UCListItem *item) { return selectedList.contains(UCListItemPrivate::get(item)->index()); } /*! * \qmlattachedproperty bool ViewItems::dragMode * The property drives the dragging mode of the ListItems within a ListView. It * has no effect on any other parent of the ListItem. * * When set, ListItem content will be disabled and a panel will be shown enabling * the dragging mode. The items can be dragged by dragging this handler only. * The feature can be activated same time with \l ListItem::selectMode. * * The panel is configured by the style. * * \sa ListItemStyle, dragUpdated */ /*! * \qmlattachedsignal ViewItems::dragUpdated(ListItemDrag event) * The signal is emitted whenever a dragging related event occurrs. The \b event.status * specifies the dragging event type. Depending on the type, the ListItemDrag event * properties will have the following meaning: * \table * \header * \li status * \li from * \li to * \li minimumIndex * \li maximumIndex * \row * \li Started * \li the index of the item to be dragged * \li -1 * \li default (-1), can be changed to restrict moves * \li default (-1), can be changed to restrict moves * \row * \li Moving * \li source index from where the item dragged from * \li destination index where the item can be dragged to * \li the same value set at \e Started, can be changed * \li the same value set at \e Started, can be changed * \row * \li Dropped * \li source index from where the item dragged from * \li destination index where the item can be dragged to * \li the value set at \e Started/Moving, changes are omitted * \li the value set at \e Started/Moving, changes are omitted * \endtable * Implementations \b {must move the model data} in order to re-order the ListView * content. If the move is not acceptable, it must be cancelled by setting * \b event.accept to \e false, in which case the dragged index (\b from) will * not be updated and next time the signal is emitted will be the same. * * An example implementation of a live dragging with restrictions: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * * ListView { * width: units.gu(40) * height: units.gu(40) * model: ListModel { * // initiate with random data * } * delegate: ListItem { * // content * } * * ViewItems.dragMode: true * ViewItems.onDragUpdated: { * if (event.status == ListViewDrag.Started) { * if (event.from < 5) { * // deny dragging on the first 5 element * event.accept = false; * } else if (event.from >= 5 && event.from <= 10 && * event.to >= 5 && event.to <= 10) { * // specify the interval * event.minimumIndex = 5; * event.maximumIndex = 10; * } else if (event.from > 10) { * // prevent dragging to the first 11 items area * event.minimumIndex = 11; * } * } else { * model.move(event.from, event.to, 1); * } * } * } * \endqml * * A drag'n'drop implementation might be required when model changes are too * expensive, and continuously updating while dragging would cause lot of traffic. * The following example illustrates how to implement such a scenario: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.2 * * ListView { * width: units.gu(40) * height: units.gu(40) * model: ListModel { * // initiate with random data * } * delegate: ListItem { * // content * } * * ViewItems.dragMode: true * ViewItems.onDragUpdated: { * if (event.direction == ListItemDrag.Dropped) { * // this is the last event, so drop the item * model.move(event.from, event.to, 1); * } else if (event.direction != ListItemDrag.Started) { * // do not accept the moving events, so drag.from will * // always contain the original drag index * event.accept = false; * } * } * } * \endqml * * \note Do not forget to set \b{event.accept} to false in \b dragUpdated in * case the drag event handling is not accepted, otherwise the system will not * know whether the move has been performed or not, and selected indexes will * not be synchronized properly. */ bool UCViewItemsAttached::dragMode() const { Q_D(const UCViewItemsAttached); return d->draggable; } void UCViewItemsAttached::setDragMode(bool value) { Q_D(UCViewItemsAttached); if (d->draggable == value) { return; } if (value) { /* * The dragging works only if the ListItem is used inside a ListView, and the * model used is a list, a ListModel or a derivate of QAbstractItemModel. Do * not enable dragging if these conditions are not fulfilled. */ if (!d->listView) { qmlInfo(parent()) << QStringLiteral("Dragging mode requires ListView"); return; } QVariant model = d->listView->model(); // warn if the model is anything else but Instance model (ObjectModel or DelegateModel) // or a derivate of QAbstractItemModel QString warning = QStringLiteral("Dragging is only supported when using a QAbstractItemModel, ListModel or list."); if (model.isValid() && !model.value() && !model.value() && !(model.type() == QVariant::List)) { qmlInfo(parent()) << warning; } // if we have a QQmlDelegateModel we must also check the model property of it QQmlDelegateModel *delegateModel = model.value(); if (delegateModel && delegateModel->model().isValid() && !delegateModel->model().value() && !(delegateModel->model().type() == QVariant::List)) { qmlInfo(parent()) << warning; } } d->draggable = value; if (d->draggable) { d->enterDragMode(); } else { d->leaveDragMode(); } Q_EMIT dragModeChanged(); } void UCViewItemsAttachedPrivate::enterDragMode() { if (dragArea) { dragArea->reset(); return; } dragArea = new ListItemDragArea(listView->view()); dragArea->init(q_func()); } void UCViewItemsAttachedPrivate::leaveDragMode() { if (dragArea) { dragArea->setEnabled(false); } } // returns true when the dragUpdated signal handler is implemented or a function is connected to it bool UCViewItemsAttachedPrivate::isDragUpdatedConnected() { Q_Q(UCViewItemsAttached); static QMetaMethod method = QMetaMethod::fromSignal(&UCViewItemsAttached::dragUpdated); static int signalIdx = QMetaObjectPrivate::signalIndex(method); return QObjectPrivate::get(q)->isSignalConnected(signalIdx); } // updates the selected indices list in ViewAttached which is changed due to dragging void UCViewItemsAttachedPrivate::updateSelectedIndices(int fromIndex, int toIndex) { if (selectedList.count() == listView->count()) { // all indices selected, no need to reorder return; } Q_Q(UCViewItemsAttached); bool isFromSelected = selectedList.contains(fromIndex); if (isFromSelected) { selectedList.remove(fromIndex); Q_EMIT q->selectedIndicesChanged(selectedList.toList()); } // direction is -1 (forwards) or 1 (backwards) int direction = (fromIndex < toIndex) ? -1 : 1; int i = (direction < 0) ? fromIndex + 1 : fromIndex - 1; // loop thru the selectedIndices and fix all indices while (1) { if (((direction < 0) && (i > toIndex)) || ((direction > 0) && (i < toIndex))) { break; } if (selectedList.contains(i)) { selectedList.remove(i); selectedList.insert(i + direction); Q_EMIT q->selectedIndicesChanged(selectedList.toList()); } i -= direction; } if (isFromSelected) { selectedList.insert(toIndex); Q_EMIT q->selectedIndicesChanged(selectedList.toList()); } } /*! * \qmlattachedproperty list ViewItems::expandedIndices * \since Ubuntu.Components 1.3 * The property contains the indexes of the ListItems marked as expanded. The * indexes are model indexes when used in ListView, and child indexes in other * components. The property being writable, initial expansion configuration * can be provided for a view, and provides ability to save the expansion state. * \note If the \l ViewItems::expansionFlags is having \c ViewItems.Exclusive * flags set, only the last item from the list will be considered and set as * expanded. */ QList UCViewItemsAttached::expandedIndices() const { Q_D(const UCViewItemsAttached); return d->expansionList.keys(); } void UCViewItemsAttached::setExpandedIndices(QList indices) { Q_UNUSED(indices); Q_D(UCViewItemsAttached); d->collapseAll(); if (indices.size() > 0) { if (d->expansionFlags & UCViewItemsAttached::Exclusive) { // take only the last one from the list d->expand(indices.last(), QPointer(), false); } else { for (int i = 0; i < indices.size(); i++) { d->expand(indices[i], QPointer(), false); } } } Q_EMIT expandedIndicesChanged(d->expansionList.keys()); } // insert listItem into the expanded indices map void UCViewItemsAttachedPrivate::expand(int index, UCListItem *listItem, bool emitChangeSignal) { expansionList.insert(index, QPointer(listItem)); if (listItem && ((expansionFlags & UCViewItemsAttached::CollapseOnOutsidePress) == UCViewItemsAttached::CollapseOnOutsidePress)) { listItem->expansion()->enableClickFiltering(true); } if (emitChangeSignal) { Q_EMIT static_cast(q_func())->expandedIndicesChanged(expansionList.keys()); } } // collapse the item at index void UCViewItemsAttachedPrivate::collapse(int index, bool emitChangeSignal) { UCListItem *item = expansionList.take(index).data(); bool wasExpanded = item && item->expansion()->expanded(); if (item && ((expansionFlags & UCViewItemsAttached::CollapseOnOutsidePress) == UCViewItemsAttached::CollapseOnOutsidePress)) { item->expansion()->enableClickFiltering(false); } if (emitChangeSignal && wasExpanded) { Q_EMIT static_cast(q_func())->expandedIndicesChanged(expansionList.keys()); } } void UCViewItemsAttachedPrivate::collapseAll() { bool emitChangedSignal = (expansionList.keys().size() > 0); while (expansionList.keys().size() > 0) { collapse(expansionList.keys().last(), false); } if (emitChangedSignal) { Q_EMIT static_cast(q_func())->expandedIndicesChanged(expansionList.keys()); } } /*! * \qmlattachedproperty ExpansionFlags ViewItems::expansionFlags * \since Ubuntu.Components 1.3 * Flags driving the expansion behavior. * \table * \header * \li Flag * \li description * \row * \li ViewItems.Exclusive * \li When set, only one ListItem can be expanded at a time. \b {Set by default}. * \row * \li ViewItems.UnlockExpanded * \li When set, the ListItem's leading/trailing actions can be swiped in. * \row * \li ViewItems.CollapseOnOutsidePress * \li When set, the active expaned ListItem collapses automatically when clicked * outside of its area. The flag also turns \c ViewItems.Exclusive flag on. * \endtable */ int UCViewItemsAttached::expansionFlags() const { Q_D(const UCViewItemsAttached); return d->expansionFlags; } void UCViewItemsAttached::setExpansionFlags(int flags) { Q_D(UCViewItemsAttached); if (d->expansionFlags == (ExpansionFlags)flags) { return; } // disable current flag based restrictions d->toggleExpansionFlags(false); d->expansionFlags = (ExpansionFlags)flags; // enable flag based restrictions d->toggleExpansionFlags(true); Q_EMIT expansionFlagsChanged(); } void UCViewItemsAttachedPrivate::toggleExpansionFlags(bool enable) { bool hasClickOutsideFlag = (expansionFlags & UCViewItemsAttached::CollapseOnOutsidePress) == UCViewItemsAttached::CollapseOnOutsidePress; if (!hasClickOutsideFlag) { return; } QMapIterator > i(expansionList); while (i.hasNext()) { UCListItem *item = i.next().value().data(); // using expansion getter we will get the group created if (item && item->expansion()) { UCListItemPrivate *listItem = UCListItemPrivate::get(item); listItem->expansion->enableClickFiltering(enable); } } } ./src/Ubuntu/Components/plugin/uclistitemactions.h0000644000015600001650000000276712700370701022516 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCLISTITEMACTIONS_H #define UCLISTITEMACTIONS_H #include #include "uclistitem_p.h" class QQmlComponent; class UCAction; class UCListItemActionsPrivate; class UCListItemActions : public QObject { Q_OBJECT Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged) Q_PROPERTY(QQmlListProperty actions READ actions CONSTANT) Q_PROPERTY(QQmlListProperty data READ data) Q_CLASSINFO("DefaultProperty", "data") public: explicit UCListItemActions(QObject *parent = 0); ~UCListItemActions(); QQmlComponent *delegate() const; void setDelegate(QQmlComponent *delegate); QQmlListProperty actions(); QQmlListProperty data(); Q_SIGNALS: void delegateChanged(); private: Q_DECLARE_PRIVATE(UCListItemActions) }; #endif // UCLISTITEMACTIONS_H ./src/Ubuntu/Components/plugin/ucpagetreenode.h0000644000015600001650000000622612700370701021737 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCPAGETREENODE_H #define UCPAGETREENODE_H #include "ucstyleditembase.h" class UCPageTreeNodePrivate; class UCPageTreeNode : public UCStyledItemBase { Q_OBJECT Q_PROPERTY(bool isLeaf READ isLeaf WRITE setIsLeaf NOTIFY isLeafChanged) Q_PROPERTY(QQuickItem* toolbar READ toolbar WRITE setToolbar NOTIFY toolbarChanged) Q_PROPERTY(QQuickItem* activeLeafNode READ activeLeafNode NOTIFY activeLeafNodeChanged) Q_PROPERTY(bool active READ active WRITE setActive NOTIFY activeChanged) Q_PROPERTY(UCPageTreeNode* parentNode READ parentNode WRITE setParentNode NOTIFY parentNodeChanged) Q_PROPERTY(QQuickItem* pageStack READ pageStack WRITE setPageStack NOTIFY pageStackChanged) Q_PROPERTY(bool __isPageTreeNode READ isPageTreeNode NOTIFY isPageTreeNodeChanged) Q_PROPERTY(QObject* __propagated READ propagated WRITE setPropagated NOTIFY propagatedChanged) public: UCPageTreeNode(QQuickItem *parent = 0); void setIsLeaf(bool isLeaf); bool isLeaf() const; void setParentNode(UCPageTreeNode *parentNode); UCPageTreeNode *parentNode() const; virtual void setActive(bool active); bool active() const; void setPageStack(QQuickItem *pageStack); QQuickItem *pageStack() const; QQuickItem *activeLeafNode() const; QObject *propagated() const; void setPropagated(QObject *propagated); void resetPropagated(); QQuickItem *toolbar() const; void setToolbar(QQuickItem *toolbar); bool isPageTreeNode() const; // QQmlParserStatus interface virtual void componentComplete() override; Q_INVOKABLE void dumpNodeTree (); Q_SIGNALS: void isLeafChanged(bool isLeaf); void activeChanged(bool active); void parentNodeChanged(UCPageTreeNode *parentNode); void pageStackChanged(QQuickItem* pageStack); void activeLeafNodeChanged(QQuickItem* activeLeafNode); void propagatedChanged(QObject* propagated); void toolbarChanged(QQuickItem* toolbar); void isPageTreeNodeChanged(bool isPageTreeNode); protected: UCPageTreeNode(UCPageTreeNodePrivate &, QQuickItem *parent); void setActiveLeafNode(QQuickItem* activeLeafNode); // QQuickItem interface virtual void itemChange(ItemChange change, const ItemChangeData &value) override; private: Q_DECLARE_PRIVATE(UCPageTreeNode) Q_PRIVATE_SLOT(d_func(), void _q_activeBinding(bool active)) Q_PRIVATE_SLOT(d_func(), void _q_pageStackBinding (QQuickItem *pageStack)) Q_PRIVATE_SLOT(d_func(), void _q_propagatedBinding (QObject *propagated)) }; #endif // UCPAGETREENODE_H ./src/Ubuntu/Components/plugin/privates/0000755000015600001650000000000012700370716020431 5ustar jenkinsjenkins./src/Ubuntu/Components/plugin/privates/shaders/0000755000015600001650000000000012700370701022054 5ustar jenkinsjenkins./src/Ubuntu/Components/plugin/privates/shaders/frame.vert0000644000015600001650000000215312700370701024051 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Loïc Molinari */ uniform highp mat4 matrix; attribute highp vec4 positionAttrib; attribute mediump vec2 outerCoordAttrib; attribute mediump vec2 innerCoordAttrib; attribute lowp vec4 colorAttrib; varying mediump vec2 outerCoord; varying mediump vec2 innerCoord; varying lowp vec4 color; void main() { outerCoord = outerCoordAttrib; innerCoord = innerCoordAttrib; color = colorAttrib; gl_Position = matrix * positionAttrib; } ./src/Ubuntu/Components/plugin/privates/shaders/frame.frag0000644000015600001650000000236212700370701024012 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Loïc Molinari */ uniform sampler2D texture; uniform lowp float opacity; varying mediump vec2 outerCoord; varying mediump vec2 innerCoord; varying lowp vec4 color; void main(void) { lowp float shapeOut = texture2D(texture, outerCoord).r; lowp float shapeIn = texture2D(texture, innerCoord).r; // Fused multiply-add friendly version of (shapeOut * (1.0 - shapeIn)) lowp float shape = (shapeOut * -shapeIn) + shapeOut; // shape is squared to make thinner corners (particularly visible at stroke 1). gl_FragColor = vec4(shape * shape * opacity) * color; } ./src/Ubuntu/Components/plugin/privates/listitemdraghandler.h0000644000015600001650000000240312700370701024621 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef LISTITEMDRAGHANDLER_H #define LISTITEMDRAGHANDLER_H #include #include #include class UCListItem; class PropertyChange; class ListItemDragHandler : public QObject { Q_OBJECT public: explicit ListItemDragHandler(UCListItem *baseItem, UCListItem *listItem = 0); ~ListItemDragHandler(); void init(); void drop(); void update(UCListItem *hoveredItem); private Q_SLOTS: void dropItem(); private: UCListItem *listItem; QPointer baseItem; PropertyChange *baseVisible; QPointF targetPos; }; #endif // LISTITEMDRAGHANDLER_H ./src/Ubuntu/Components/plugin/privates/ucpagewrapperincubator.cpp0000644000015600001650000000326712700370701025713 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "ucpagewrapperincubator_p.h" #include #include /*! \internal Incubator wrapper object. Used when page is loaded asynchronously. */ UCPageWrapperIncubator::UCPageWrapperIncubator(QQmlIncubator::IncubationMode mode, QObject *parent) : QObject(parent), QQmlIncubator(mode) { } UCPageWrapperIncubator::~UCPageWrapperIncubator() {} void UCPageWrapperIncubator::forceCompletion() { QQmlIncubator::forceCompletion(); } QJSValue UCPageWrapperIncubator::onStatusChanged() const { return m_onStatusChanged; } void UCPageWrapperIncubator::setOnStatusChanged(QJSValue onStatusChanged) { m_onStatusChanged = onStatusChanged; } void UCPageWrapperIncubator::setInitialState(QObject *target) { Q_EMIT initialStateRequested(target); } void UCPageWrapperIncubator::statusChanged(QQmlIncubator::Status status) { Q_EMIT enterOnStatusChanged(); if (m_onStatusChanged.isCallable()) { m_onStatusChanged.call(QJSValueList()<(status))); } Q_EMIT statusHasChanged(status); } ./src/Ubuntu/Components/plugin/privates/ucpagewrapper.h0000644000015600001650000000776712700370701023462 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCPAGEWRAPPER_H #define UCPAGEWRAPPER_H #include "ucpagetreenode.h" class UCPageWrapperPrivate; class UCPageWrapper : public UCPageTreeNode { Q_OBJECT Q_PROPERTY(QVariant reference READ reference WRITE setReference NOTIFY referenceChanged) Q_PROPERTY(QQuickItem* object READ object WRITE setObject NOTIFY objectChanged) Q_PROPERTY(bool canDestroy READ canDestroy NOTIFY canDestroyChanged) Q_PROPERTY(int column READ column WRITE setColumn NOTIFY columnChanged) Q_PROPERTY(QQuickItem* parentPage READ parentPage WRITE setParentPage NOTIFY parentPageChanged) Q_PROPERTY(QQuickItem* parentWrapper READ parentWrapper WRITE setParentWrapper NOTIFY parentWrapperChanged) Q_PROPERTY(QQuickItem* pageHolder READ pageHolder WRITE setPageHolder NOTIFY pageHolderChanged) Q_PROPERTY(QObject* incubator READ incubator NOTIFY incubatorChanged) Q_PROPERTY(bool synchronous READ synchronous WRITE setSynchronous NOTIFY synchronousChanged) Q_PROPERTY(QVariant properties READ properties WRITE setProperties NOTIFY propertiesChanged) //overrides Q_PROPERTY(bool visible READ isVisible WRITE setVisible2 NOTIFY visibleChanged2 FINAL) // FIXME Re-expose property that would be inaccessible due to a QML bug // https://bugs.launchpad.net/ubuntu/+source/qtdeclarative-opensource-src/+bug/1389721 Q_PROPERTY(UCTheme *theme READ getTheme2 WRITE setTheme2 RESET resetTheme2 NOTIFY themeChanged2 FINAL) public: explicit UCPageWrapper(QQuickItem *parent = 0); virtual ~UCPageWrapper(); QVariant reference() const; void setReference(const QVariant &reference); QQuickItem *object() const; void setObject(QQuickItem *object); bool canDestroy() const; int column() const; void setColumn(int column); QQuickItem *parentWrapper() const; void setParentWrapper(QQuickItem* parentWrapper); QQuickItem *pageHolder() const; void setPageHolder(QQuickItem* pageHolder); bool synchronous() const; void setSynchronous(bool synchronous); Q_INVOKABLE bool childOf (QQuickItem *page); QVariant properties() const; void setProperties(const QVariant &properties); QQuickItem *parentPage() const; void setParentPage(QQuickItem* parentPage); QObject *incubator() const; Q_INVOKABLE void destroyObject (); // QQuickItem interface virtual void itemChange(ItemChange change, const ItemChangeData &data) override; //override QQuickItem properties void setVisible2(bool visible); UCTheme *getTheme2(); void setTheme2(UCTheme * theme); void resetTheme2(); Q_SIGNALS: void referenceChanged(const QVariant &reference); void objectChanged(QObject* object); void canDestroyChanged(bool canDestroy); void columnChanged(int column); void parentWrapperChanged(QQuickItem* parentWrapper); void pageHolderChanged(QQuickItem* pageHolder); void synchronousChanged(bool synchronous); void propertiesChanged(const QVariant &properties); void pageLoaded(); void parentPageChanged(QQuickItem* parentPage); void incubatorChanged(QObject* incubator); void visibleChanged2(); void themeChanged2(); protected: UCPageWrapper(UCPageWrapperPrivate &dd, QQuickItem *parent); private: Q_DECLARE_PRIVATE(UCPageWrapper) Q_PRIVATE_SLOT(d_func(), void nextStep()) Q_PRIVATE_SLOT(d_func(), void onActiveChanged()) }; #endif // UCPAGEWRAPPER_H ./src/Ubuntu/Components/plugin/privates/appheaderbase.h0000644000015600001650000000300712700370701023360 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef APPHEADERBASE_H #define APPHEADERBASE_H #include "ucheader.h" class UCTheme; class UCAppHeaderBase : public UCHeader { Q_OBJECT Q_PROPERTY(bool animate MEMBER m_animate WRITE setAnimate NOTIFY animateChanged FINAL) // FIXME Re-expose properties that would be inaccessible due to a QML bug // https://bugs.launchpad.net/ubuntu/+source/qtdeclarative-opensource-src/+bug/1389721 Q_PROPERTY(UCTheme *theme READ theme2 WRITE setTheme2 NOTIFY themeChanged2 FINAL) public: explicit UCAppHeaderBase(QQuickItem *parent = 0); void setAnimate(bool animate); UCTheme* theme2(); void setTheme2(UCTheme* value); Q_SIGNALS: void animateChanged(); void themeChanged2(); protected: virtual void show(bool animate); virtual void hide(bool animate); private: bool m_animate:1; }; #endif // APPHEADERBASE_H ./src/Ubuntu/Components/plugin/privates/listitemdragarea.cpp0000644000015600001650000002477612700370701024470 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "listitemdragarea.h" #include "listitemdraghandler.h" #include "uclistitem.h" #include "uclistitem_p.h" #include "ucunits.h" #include "i18n.h" #include #include #include #define IMPLICIT_DRAG_WIDTH_GU 5 #define DRAG_SCROLL_TIMEOUT 15 #define MIN(x, y) ((x) < (y) ? (x) : (y)) #define MAX(x, y) ((x) > (y) ? (x) : (y)) #define CLAMP(v, min, max) ((min) <= (max) ? MAX(min, MIN(v, max)) : MAX(max, MIN(v, min))) ListItemDragArea::ListItemDragArea(QQuickItem *parent) : QQuickItem(parent) , listView(static_cast(parent)) , viewAttached(0) , scrollDirection(0) , fromIndex(-1) , toIndex(-1) , min(-1) , max(-1) { setAcceptedMouseButtons(Qt::LeftButton); // for testing purposes setObjectName("drag_area"); } void ListItemDragArea::init(UCViewItemsAttached *viewItems) { setParentItem(static_cast(parent())); QQuickAnchors *anchors = QQuickItemPrivate::get(this)->anchors(); anchors->setFill(parentItem()); viewAttached = viewItems; reset(); } void ListItemDragArea::reset() { fromIndex = toIndex = min = max = -1; item = 0; lastPos = QPointF(); setEnabled(true); } void ListItemDragArea::timerEvent(QTimerEvent *event) { QQuickItem::timerEvent(event); if (event->timerId() == scrollTimer.timerId()) { qreal scrollAmount = UCUnits::instance()->gu(0.5) * scrollDirection; qreal contentHeight = listView->contentHeight(); qreal height = listView->height(); if ((contentHeight - height) > 0) { // take topMargin into account when clamping qreal contentY = CLAMP(listView->contentY() + scrollAmount, -listView->topMargin(), contentHeight - height + listView->originY()); listView->setContentY(contentY); // update mouseMoveEvent(0); } } } // starts dragging operation; emits draggingStarted() and if the signal handler is implemented, // depending on the acceptance, will create a fake item and will start dragging. If the start is // cancelled, no dragging will happen void ListItemDragArea::mousePressEvent(QMouseEvent *event) { mousePos = event->localPos(); QPointF pos = mapDragAreaPos(); UCListItem *listItem = itemAt(pos.x(), pos.y()); if (!listItem) { event->setAccepted(false); return; } // check if we tapped over the drag panel UCListItemPrivate *pListItem = UCListItemPrivate::get(listItem); if (pListItem->styleItem && pListItem->listItemStyle()->m_dragPanel) { // convert mouse into local panel coordinates QPointF panelPos = pListItem->listItemStyle()->m_dragPanel->mapFromItem(this, mousePos); if (!pListItem->listItemStyle()->m_dragPanel->contains(panelPos)) { // not tapped over the drag panel, leave event->setAccepted(false); return; } } int index = indexAt(pos.x(), pos.y()); bool start = false; max = min = -1; // call start handler if implemented UCViewItemsAttachedPrivate *pViewAttached = UCViewItemsAttachedPrivate::get(viewAttached); if (pViewAttached->isDragUpdatedConnected()) { UCDragEvent drag(UCDragEvent::Started, index, -1, -1, -1); Q_EMIT viewAttached->dragUpdated(&drag); start = drag.m_accept; min = drag.m_minimum; max = drag.m_maximum; } else { qmlInfo(parentItem()) << QStringLiteral("ListView has no ViewItems.dragUpdated() signal handler implemented. "\ "No dragging will be possible."); } if (start) { // keep the mouse event in house setKeepMouseGrab(true); fromIndex = toIndex = index; lastPos = pos; // create temp drag item createDraggedItem(listItem); } event->setAccepted(start); } // stops dragging, performs drop event (event.direction = ListItemDrag.Steady) // and clears temporary item void ListItemDragArea::mouseReleaseEvent(QMouseEvent *event) { mousePos = event->localPos(); if (item.isNull()) { return; } // stop scroll timer scrollTimer.stop(); UCViewItemsAttachedPrivate *pViewAttached = UCViewItemsAttachedPrivate::get(viewAttached); if (pViewAttached->isDragUpdatedConnected()) { UCDragEvent drag(UCDragEvent::Dropped, fromIndex, toIndex, min, max); Q_EMIT viewAttached->dragUpdated(&drag); updateDraggedItem(); if (drag.m_accept) { pViewAttached->updateSelectedIndices(fromIndex, toIndex); } } // unlock flickables setKeepMouseGrab(false); // perform drop UCListItemPrivate::get(item.data())->dragHandler->drop(); item = 0; fromIndex = toIndex = -1; } void ListItemDragArea::mouseMoveEvent(QMouseEvent *event) { if (event) { mousePos = event->localPos(); } if (!item) { return; } QPointF pos = mapDragAreaPos(); qreal dy = -(lastPos.y() - pos.y()); qreal indexHotspot = item->y() + item->height() / 2; // update dragged item even if the dragging may be forbidden item->setY(item->y() + dy); lastPos = pos; // check what will be the index after the drag int index = indexAt(pos.x(), indexHotspot); if (index < 0) { return; } if ((min >= 0) && (min > index)) { // about to drag beyond the minimum, leave return; } if ((max >= 0) && (max < index)) { // about to drag beyond maximum, leave return; } // should we scroll the view? use a margin of 20% of the dragged item's height from top and bottom of the item qreal scrollMargin = item->height() * 0.2; qreal topHotspot = item->y() + scrollMargin - listView->contentY(); qreal bottomHotspot = item->y() + item->height() - scrollMargin - listView->contentY(); // use MouseArea's top/bottom as limits qreal topViewMargin = y() + listView->topMargin(); qreal bottomViewMargin = y() + height() - listView->bottomMargin(); scrollDirection = 0; if (topHotspot < topViewMargin) { // scroll upwards scrollDirection = -1; } else if (bottomHotspot > bottomViewMargin) { // scroll downwards scrollDirection = 1; } if (!scrollDirection) { scrollTimer.stop(); } else if (!scrollTimer.isActive()){ scrollTimer.start(DRAG_SCROLL_TIMEOUT, this); } // do we have index change? if (toIndex == index) { // no change, leave return; } toIndex = index; if (fromIndex != toIndex) { bool update = true; UCViewItemsAttachedPrivate *pViewAttached = UCViewItemsAttachedPrivate::get(viewAttached); if (pViewAttached->isDragUpdatedConnected()) { UCDragEvent drag(UCDragEvent::Moving, fromIndex, toIndex, min, max); Q_EMIT viewAttached->dragUpdated(&drag); update = drag.m_accept; if (update) { pViewAttached->updateSelectedIndices(fromIndex, toIndex); } } if (update) { // update item coordinates in the dragged item updateDraggedItem(); fromIndex = toIndex; } } } // returns the mapped mouse position of the dragged item's dragHandler to the ListView QPointF ListItemDragArea::mapDragAreaPos() { QPointF pos(mousePos.x(), mousePos.y() + listView->contentY()); pos = listView->mapFromItem(this, pos); return pos; } // calls ListView.indexAt() invokable int ListItemDragArea::indexAt(qreal x, qreal y) { if (!listView) { return -1; } int result = -1; QMetaObject::invokeMethod(listView, "indexAt", Qt::DirectConnection, Q_RETURN_ARG(int, result), Q_ARG(qreal, x), Q_ARG(qreal, y) ); return result; } // calls ListView.itemAt() invokable UCListItem *ListItemDragArea::itemAt(qreal x, qreal y) { if (!listView) { return NULL; } QQuickItem *result = 0; QMetaObject::invokeMethod(listView, "itemAt", Qt::DirectConnection, Q_RETURN_ARG(QQuickItem*, result), Q_ARG(qreal, x), Q_ARG(qreal, y) ); return static_cast(result); } // creates a temporary list item available for the dragging time void ListItemDragArea::createDraggedItem(UCListItem *baseItem) { if (item || !baseItem) { return; } QQmlComponent *delegate = listView->property("delegate").value(); if (!delegate) { return; } // use baseItem's context to get access to the ListView's model roles // use two-step component creation to have similar steps as when it is created in QML, // so itemChanged() is invoked prior to componentComplete() // use dragged item's context as parent context so we get all model roles and // context properties of that item QQmlContext *context = new QQmlContext(qmlContext(baseItem), baseItem); item = static_cast(delegate->beginCreate(context)); if (item) { QQml_setParent_noEvent(item, listView->contentItem()); // create drag handler instance UCListItemPrivate *pItem = UCListItemPrivate::get(item); pItem->dragHandler = new ListItemDragHandler(baseItem, item); pItem->dragHandler->init(); // invokes itemChanged() item->setParentItem(listView->contentItem()); // invoked componentComplete() delegate->completeCreate(); } } void ListItemDragArea::updateDraggedItem() { if (abs(fromIndex - toIndex) > 0) { UCListItem *targetItem = itemAt(item->x(), item->y() + item->height() / 2); UCListItemPrivate::get(item)->dragHandler->update(targetItem); } } ./src/Ubuntu/Components/plugin/privates/listitemdraghandler.cpp0000644000015600001650000000522512700370701025161 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "listitemdraghandler.h" #include "uclistitem.h" #include "uclistitem_p.h" #include "propertychange_p.h" #include ListItemDragHandler::ListItemDragHandler(UCListItem *baseItem, UCListItem *listItem) : QObject(listItem) , listItem(listItem) , baseItem(baseItem) , baseVisible(0) { targetPos = baseItem->position(); baseVisible = new PropertyChange(baseItem, "visible"); } ListItemDragHandler::~ListItemDragHandler() { // make sure the property change object is deleted delete baseVisible; } void ListItemDragHandler::init() { PropertyChange::setValue(baseVisible, false); // position the item and show it listItem->setPosition(baseItem->position()); listItem->setZ(2); listItem->setVisible(true); // emit draggingChanged() signal Q_EMIT listItem->draggingChanged(); } // handles drop gesture animated if the style has animation defined for it void ListItemDragHandler::drop() { QQuickPropertyAnimation *animation = UCListItemPrivate::get(listItem)->listItemStyle()->m_dropAnimation; if (animation) { // complete any previous animation animation->complete(); connect(animation, &QQuickAbstractAnimation::stopped, this, &ListItemDragHandler::dropItem, Qt::DirectConnection); // force properties to contain only the 'y' coordinate animation->setProperties("y"); animation->setTargetObject(listItem); animation->setFrom(listItem->y()); animation->setTo(targetPos.y()); animation->start(); } else { dropItem(); } } // private slot connected to the reposition animation to drop item void ListItemDragHandler::dropItem() { listItem->setVisible(false); listItem->deleteLater(); delete baseVisible; baseVisible = 0; } // update dragged item with the new target item the dragging is hovered over void ListItemDragHandler::update(UCListItem *hoveredItem) { if (hoveredItem) { targetPos = hoveredItem->position(); } } ./src/Ubuntu/Components/plugin/privates/frame.cpp0000644000015600001650000003373312700370701022232 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Loïc Molinari */ #include "frame.h" #include "textures.h" #include #include const QRgb defaultColor = qRgba(255, 255, 255, 255); const float defaultThickness = 20.0f; const float defaultRadius = 50.0f; // --- Shader --- class FrameShader : public QSGMaterialShader { public: FrameShader(); virtual char const* const* attributeNames() const; virtual void initialize(); virtual void updateState( const RenderState& state, QSGMaterial* newEffect, QSGMaterial* oldEffect); private: int m_matrixId; int m_opacityId; }; FrameShader::FrameShader() { setShaderSourceFile( QOpenGLShader::Vertex, QStringLiteral(":/uc/privates/shaders/frame.vert")); setShaderSourceFile( QOpenGLShader::Fragment, QStringLiteral(":/uc/privates/shaders/frame.frag")); } char const* const* FrameShader::attributeNames() const { static char const* const attributes[] = { "positionAttrib", "outerCoordAttrib", "innerCoordAttrib", "colorAttrib", 0 }; return attributes; } void FrameShader::initialize() { QSGMaterialShader::initialize(); program()->bind(); program()->setUniformValue("texture", 0); m_matrixId = program()->uniformLocation("matrix"); m_opacityId = program()->uniformLocation("opacity"); } void FrameShader::updateState( const RenderState& state, QSGMaterial* newEffect, QSGMaterial* oldEffect) { Q_UNUSED(oldEffect); QOpenGLFunctions* funcs = QOpenGLContext::currentContext()->functions(); funcs->glBindTexture( GL_TEXTURE_2D, static_cast(newEffect)->textureId()); if (state.isMatrixDirty()) { program()->setUniformValue(m_matrixId, state.combinedMatrix()); } if (state.isOpacityDirty()) { program()->setUniformValue(m_opacityId, state.opacity()); } } // --- Material --- const int maxTextures = 16; static struct { QOpenGLContext* openglContext; quint32 textureId; } textures[maxTextures]; // Gets the textures' slot used by the given context, or -1 if not stored. static int getTexturesIndex(const QOpenGLContext* openglContext) { int index = 0; while (textures[index].openglContext != openglContext) { index++; if (index == maxTextures) { return -1; } } return index; } // Gets an empty textures' slot. static int getEmptyTexturesIndex() { int index = 0; while (textures[index].openglContext) { index++; if (index == maxTextures) { // Don't bother with a dynamic array, let's just set a high enough // maxTextures and increase the static array size if ever needed. qFatal("reached maximum number of OpenGL contexts supported per item."); } } return index; } UCFrameMaterial::UCFrameMaterial() { setFlag(Blending, true); // Get the texture stored per context and shared by all materials of the same type. QOpenGLContext* openglContext = QOpenGLContext::currentContext(); int index = getTexturesIndex(openglContext); if (index < 0) { QOpenGLFunctions* funcs = openglContext->functions(); index = getEmptyTexturesIndex(); textures[index].openglContext = openglContext; funcs->glGenTextures(1, &textures[index].textureId); funcs->glBindTexture(GL_TEXTURE_2D, textures[index].textureId); funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // FIXME(loicm) GL_LINEAR_MIPMAP_[NEAREST,LINEAR] perf/quality tradeoff. funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Set the highest mipmap level in order to avoid clamp to edge issues // with inner corners starting from mipmap level 5 (OpenGL ES 2 doesn't // support GL_TEXTURE_MAX_LOD). funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, 4.0f); for (int i = 0; i < shapeMipmapCount; i++) { funcs->glTexImage2D(GL_TEXTURE_2D, i, GL_LUMINANCE, shapeMipmapBaseSize >> i, shapeMipmapBaseSize >> i, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, &shapeMipmapData[shapeMipmapOffsets[i]]); } QObject::connect( openglContext, &QOpenGLContext::aboutToBeDestroyed, [index] { QOpenGLFunctions* funcs = textures[index].openglContext->functions(); funcs->glDeleteTextures(1, &textures[index].textureId); textures[index].openglContext = NULL; }); } m_textureId = textures[index].textureId; } QSGMaterialType* UCFrameMaterial::type() const { static QSGMaterialType type; return &type; } QSGMaterialShader* UCFrameMaterial::createShader() const { return new FrameShader; } int UCFrameMaterial::compare(const QSGMaterial* other) const { Q_UNUSED(other); return 0; } // --- Node --- UCFrameNode::UCFrameNode() : QSGGeometryNode() , m_material() , m_geometry(attributeSet(), 20, 34, GL_UNSIGNED_SHORT) { memcpy(m_geometry.indexData(), indices(), 34 * sizeof(unsigned short)); m_geometry.setDrawingMode(GL_TRIANGLE_STRIP); m_geometry.setIndexDataPattern(QSGGeometry::StaticPattern); m_geometry.setVertexDataPattern(QSGGeometry::AlwaysUploadPattern); setMaterial(&m_material); setGeometry(&m_geometry); qsgnode_set_description(this, QLatin1String("frame")); } // static const unsigned short* UCFrameNode::indices() { // The geometry is made of 20 vertices indexed with a triangle strip mode. // 0 -1 ----- 2- 3 // | 4 --- 5 | // 6 / \ 9 // | 7 8 | // | | | | // | 11 12 | // 10 \ / 13 // | 14---15 | // 16 -17 --- 18- 19 static const unsigned short indices[] = { 6, 7, 0, 4, 1, 5, 2, 2, 2, // Degenerate triangle. 2, 5, 3, 8, 9, 12, 13, 13, 13, // Degenerate triangle. 13, 12, 19, 15, 18, 14, 17, 17, 17, // Degenerate triangle. 17, 14, 16, 11, 10, 7, 6 }; return indices; } // static const QSGGeometry::AttributeSet& UCFrameNode::attributeSet() { static const QSGGeometry::Attribute attributes[] = { QSGGeometry::Attribute::create(0, 2, GL_FLOAT, true), QSGGeometry::Attribute::create(1, 2, GL_FLOAT), QSGGeometry::Attribute::create(2, 2, GL_FLOAT), QSGGeometry::Attribute::create(3, 4, GL_UNSIGNED_BYTE) }; static const QSGGeometry::AttributeSet attributeSet = { 4, sizeof(Vertex), attributes }; return attributeSet; } // Pack a color in a premultiplied 32-bit ABGR value. static quint32 packColor(QRgb color) { const quint32 a = qAlpha(color); const quint32 b = ((qBlue(color) * a) + 0xff) >> 8; const quint32 g = ((qGreen(color) * a) + 0xff) >> 8; const quint32 r = ((qRed(color) * a) + 0xff) >> 8; return (a << 24) | ((b & 0xff) << 16) | ((g & 0xff) << 8) | (r & 0xff); } void UCFrameNode::updateGeometry( const QSizeF& itemSize, float thickness, float radius, QRgb color) { UCFrameNode::Vertex* v = reinterpret_cast(m_geometry.vertexData()); const float w = static_cast(itemSize.width()); const float h = static_cast(itemSize.height()); const float maxSize = qMin(w, h) * 0.5f; const float clampedThickness = qMin(thickness, maxSize); const float radiusOut = qBound(0.01f, radius, maxSize); const float radiusIn = radiusOut * ((maxSize - clampedThickness) / maxSize); const float outerCoord1 = (((1.0f - shapeOffset) / radiusOut) * (clampedThickness + radiusIn)) + shapeOffset; const float outerCoord2 = (((1.0f - shapeOffset) / radiusOut) * clampedThickness) + shapeOffset; const float innerCoord1 = (((1.0f - shapeOffset) / radiusIn) * -clampedThickness) + shapeOffset; const float innerCoord2 = (((1.0f - shapeOffset) / radiusIn) * (radiusOut - clampedThickness)) + shapeOffset; const quint32 packedColor = packColor(color); // 1st row. v[0].x = 0.0f; v[0].y = 0.0f; v[0].s1 = shapeOffset; v[0].t1 = shapeOffset; v[0].s2 = innerCoord1; v[0].t2 = innerCoord1; v[0].color = packedColor; v[1].x = radiusOut; v[1].y = 0.0f; v[1].s1 = 1.0f; v[1].t1 = shapeOffset; v[1].s2 = innerCoord2; v[1].t2 = innerCoord1; v[1].color = packedColor; v[2].x = w - radiusOut; v[2].y = 0.0f; v[2].s1 = 1.0f; v[2].t1 = shapeOffset; v[2].s2 = innerCoord2; v[2].t2 = innerCoord1; v[2].color = packedColor; v[3].x = w; v[3].y = 0.0f; v[3].s1 = shapeOffset; v[3].t1 = shapeOffset; v[3].s2 = innerCoord1; v[3].t2 = innerCoord1; v[3].color = packedColor; // 2nd row. v[4].x = clampedThickness + radiusIn; v[4].y = clampedThickness; v[4].s1 = outerCoord1; v[4].t1 = outerCoord2; v[4].s2 = 1.0f; v[4].t2 = shapeOffset; v[4].color = packedColor; v[5].x = w - (clampedThickness + radiusIn); v[5].y = clampedThickness; v[5].s1 = outerCoord1; v[5].t1 = outerCoord2; v[5].s2 = 1.0f; v[5].t2 = shapeOffset; v[5].color = packedColor; // 3rd row. v[6].x = 0.0f; v[6].y = radiusOut; v[6].s1 = shapeOffset; v[6].t1 = 1.0f; v[6].s2 = innerCoord1; v[6].t2 = innerCoord2; v[6].color = packedColor; v[7].x = clampedThickness; v[7].y = clampedThickness + radiusIn; v[7].s1 = outerCoord2; v[7].t1 = outerCoord1; v[7].s2 = shapeOffset; v[7].t2 = 1.0f; v[7].color = packedColor; v[8].x = w - clampedThickness; v[8].y = clampedThickness + radiusIn; v[8].s1 = outerCoord2; v[8].t1 = outerCoord1; v[8].s2 = shapeOffset; v[8].t2 = 1.0f; v[8].color = packedColor; v[9].x = w; v[9].y = radiusOut; v[9].s1 = shapeOffset; v[9].t1 = 1.0f; v[9].s2 = innerCoord1; v[9].t2 = innerCoord2; v[9].color = packedColor; // 4th row. v[10].x = 0.0f; v[10].y = h - radiusOut; v[10].s1 = shapeOffset; v[10].t1 = 1.0f; v[10].s2 = innerCoord1; v[10].t2 = innerCoord2; v[10].color = packedColor; v[11].x = clampedThickness; v[11].y = h - (clampedThickness + radiusIn); v[11].s1 = outerCoord2; v[11].t1 = outerCoord1; v[11].s2 = shapeOffset; v[11].t2 = 1.0f; v[11].color = packedColor; v[12].x = w - clampedThickness; v[12].y = h - (clampedThickness + radiusIn); v[12].s1 = outerCoord2; v[12].t1 = outerCoord1; v[12].s2 = shapeOffset; v[12].t2 = 1.0f; v[12].color = packedColor; v[13].x = w; v[13].y = h - radiusOut; v[13].s1 = shapeOffset; v[13].t1 = 1.0f; v[13].s2 = innerCoord1; v[13].t2 = innerCoord2; v[13].color = packedColor; // 5th row. v[14].x = clampedThickness + radiusIn; v[14].y = h - clampedThickness; v[14].s1 = outerCoord1; v[14].t1 = outerCoord2; v[14].s2 = 1.0f; v[14].t2 = shapeOffset; v[14].color = packedColor; v[15].x = w - (clampedThickness + radiusIn); v[15].y = h - clampedThickness; v[15].s1 = outerCoord1; v[15].t1 = outerCoord2; v[15].s2 = 1.0f; v[15].t2 = shapeOffset; v[15].color = packedColor; // 6th row. v[16].x = 0.0f; v[16].y = h; v[16].s1 = shapeOffset; v[16].t1 = shapeOffset; v[16].s2 = innerCoord1; v[16].t2 = innerCoord1; v[16].color = packedColor; v[17].x = radiusOut; v[17].y = h; v[17].s1 = 1.0f; v[17].t1 = shapeOffset; v[17].s2 = innerCoord2; v[17].t2 = innerCoord1; v[17].color = packedColor; v[18].x = w - radiusOut; v[18].y = h; v[18].s1 = 1.0f; v[18].t1 = shapeOffset; v[18].s2 = innerCoord2; v[18].t2 = innerCoord1; v[18].color = packedColor; v[19].x = w; v[19].y = h; v[19].s1 = shapeOffset; v[19].t1 = shapeOffset; v[19].s2 = innerCoord1; v[19].t2 = innerCoord1; v[19].color = packedColor; markDirty(QSGNode::DirtyGeometry); } // --- Item --- UCFrame::UCFrame(QQuickItem* parent) : QQuickItem(parent) , m_color(defaultColor) , m_thickness(defaultThickness) , m_radius(defaultRadius) { setFlag(ItemHasContents); } void UCFrame::setThickness(qreal thickness) { thickness = qMax(0.0f, static_cast(thickness)); if (m_thickness != thickness) { m_thickness = thickness; update(); Q_EMIT thicknessChanged(); } } void UCFrame::setRadius(qreal radius) { radius = qMax(0.0f, static_cast(radius)); if (m_radius != radius) { m_radius = radius; update(); Q_EMIT radiusChanged(); } } void UCFrame::setColor(const QColor& color) { const QRgb rgbColor = qRgba(color.red(), color.green(), color.blue(), color.alpha()); if (m_color != rgbColor) { m_color = rgbColor; update(); Q_EMIT colorChanged(); } } QSGNode* UCFrame::updatePaintNode(QSGNode* oldNode, UpdatePaintNodeData* data) { Q_UNUSED(data); const QSizeF itemSize(width(), height()); if (itemSize.isEmpty() || m_thickness <= 0.0f) { delete oldNode; return NULL; } UCFrameNode* node = oldNode ? static_cast(oldNode) : new UCFrameNode(); node->updateGeometry(itemSize, m_thickness, m_radius, m_color); return node; } ./src/Ubuntu/Components/plugin/privates/listviewextensions.h0000644000015600001650000000316112700370714024567 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author Zsombor Egri */ #ifndef LISTVIEWEXTENSIONS_H #define LISTVIEWEXTENSIONS_H #include class QQuickFlickable; class QQuickItem; class QFocusEvent; class QKeyEvent; class ListViewProxy : public QObject { Q_OBJECT public: explicit ListViewProxy(QQuickFlickable *listView, QObject *parent = 0); virtual ~ListViewProxy(); inline QQuickFlickable *view() const { return listView; } void overrideItemNavigation(bool override); // proxied methods Qt::Orientation orientation(); int count(); QQuickItem *currentItem(); int currentIndex(); void setCurrentIndex(int index); QVariant model(); protected: bool eventFilter(QObject *, QEvent *) override; bool focusInEvent(QFocusEvent *event); bool keyPressEvent(QKeyEvent *event); void setKeyNavigationForListView(bool value); private: QQuickFlickable *listView; bool isEventFilter:1; }; #endif // LISTVIEWEXTENSIONS_H ./src/Ubuntu/Components/plugin/privates/ucpagewrapper_p.h0000644000015600001650000000406112700370701023761 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCPAGEWRAPPER_P_H #define UCPAGEWRAPPER_P_H #include "ucpagetreenode_p.h" class UCPageWrapper; class UCPageWrapperIncubator; class UCPageWrapperPrivate : public UCPageTreeNodePrivate { Q_DECLARE_PUBLIC(UCPageWrapper) public: UCPageWrapperPrivate (); ~UCPageWrapperPrivate (); void init(); enum PropertyFlags { CustomVisible = LastPageTreeNodeFlag }; enum State { Waiting, LoadingComponent, CreatingObject, NotifyPageLoaded, Ready, Error }; void initPage(); void reset (); void activate (); void deactivate (); QQuickItem *toItem (QObject *theObject, bool canDelete = true); void initItem (QQuickItem *theItem); void copyProperties (QObject *target); void createIncubator (); void destroyIncubator (); void onActiveChanged(); void setCanDestroy(bool canDestroy); //state machine functions void nextStep (); void loadComponentState (); void createObjectState (); void finalizeObjectIfReady (); QVariant m_reference; QVariant m_properties; QQuickItem* m_object; QQuickItem* m_parentPage; QQuickItem* m_parentWrapper; QQuickItem* m_pageHolder; UCPageWrapperIncubator* m_incubator; QQmlComponent *m_component; QQmlContext *m_itemContext; State m_state; int m_column; bool m_canDestroy:1; bool m_synchronous:1; bool m_ownsComponent:1; }; #endif // UCPAGEWRAPPER_P_H ./src/Ubuntu/Components/plugin/privates/ucpagewrapper.cpp0000644000015600001650000005036412700370701024004 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "ucpagewrapper.h" #include "ucpagewrapper_p.h" #include "ucpagewrapperincubator_p.h" #include #include UCPageWrapperPrivate::UCPageWrapperPrivate() : m_object(nullptr), m_parentPage(nullptr), m_parentWrapper(nullptr), m_pageHolder(nullptr), m_incubator(nullptr), m_component(nullptr), m_itemContext(nullptr), m_state(Waiting), m_column(0), m_canDestroy(false), m_synchronous(true), m_ownsComponent(false) { } UCPageWrapperPrivate::~UCPageWrapperPrivate() { reset(); } void UCPageWrapperPrivate::init() { Q_Q(UCPageWrapper); //This value is updated when a PageWrapper is pushed to/popped from a PageStack. q->setActive(false); q->setVisible(false); //bind the value of visible to active QObject::connect(q, SIGNAL(activeChanged(bool)), q, SLOT(onActiveChanged())); QObject::connect(q, &UCPageWrapper::activeChanged, [this](){ if (m_reference.isValid()) { if (m_active) { this->activate(); } else { this->deactivate(); } } }); //FIXME bind re-exposed property signals lp:1389721 QObject::connect(q, SIGNAL(themeChanged()), q, SIGNAL(themeChanged2())); } /*! Starts loading the component in m_reference, cleans up old objects */ void UCPageWrapperPrivate::initPage() { //make sure we are clean reset(); nextStep(); } /*! Reset the internal state of the PageWrapper, deletes also all objects that were created by this PageWrapper instance */ void UCPageWrapperPrivate::reset() { Q_Q(UCPageWrapper); if (m_incubator) { //if incubator is READY the object() is not deleted if (m_incubator->status() == QQmlIncubator::Ready && m_incubator->object()) { m_incubator->object()->deleteLater(); } m_incubator->clear(); destroyIncubator(); } if (m_object) { if (m_canDestroy) { m_object->deleteLater(); } q->setObject(nullptr); } if (m_component && m_ownsComponent) { delete m_component; m_component = nullptr; } //if itemContext is a valid pointer at this place //it was never used and can be deleted if (m_itemContext) { //use deleteLater just to be sure m_itemContext->deleteLater(); m_itemContext = nullptr; } m_state = Waiting; } /*! \internal Create the page object if needed, and make the page object visible. */ void UCPageWrapperPrivate::activate() { Q_Q(UCPageWrapper); if (!m_object && m_state != LoadingComponent && m_state != CreatingObject) { initPage(); } //make sure object is valid now if (!m_object) return; QQuickItem *item = qobject_cast(m_object); if (item){ // Having the same page pushed multiple times on a stack changes // the parent of the page object. Change it back here. item->setParentItem(q); // Some page objects are invisible initially. Make visible. item->setVisible(true); } q->setActive(true); } /*! \internal Hide page object. */ void UCPageWrapperPrivate::deactivate() { q_func()->setActive(false); } /*! Converts the QObject into a QQuickItem, if that is not possible the pointer is destroyed and nullptr is returned */ QQuickItem *UCPageWrapperPrivate::toItem(QObject *theObject, bool canDelete) { Q_Q(UCPageWrapper); QQuickItem *theItem = qobject_cast(theObject); if (!theItem) { //the returned object has to be a Item but if its a Object //do not leak the pointer if (canDelete && theObject) delete theObject; qmlInfo(q) << "PageWrapper only supports components that are derived from Item";; return nullptr; } return theItem; } /*! Initialize the Item and make sure the object property is set */ void UCPageWrapperPrivate::initItem(QQuickItem *theItem) { Q_Q(UCPageWrapper); if (theItem) { theItem->setParentItem(q); copyProperties(theItem); q->setObject(theItem); } } /*! \internal Hide page object. */ void UCPageWrapperPrivate::copyProperties(QObject *target) { if (!target) return; Q_Q(UCPageWrapper); // copy the properties to the page object QVariantMap propMap = m_properties.toMap(); QVariantMap::const_iterator i = propMap.constBegin(); QQmlContext *context = m_itemContext ? m_itemContext : qmlContext(target); for (;i != propMap.constEnd(); i++) { if (!QQmlProperty::write(target, i.key(), i.value(), context)) { qmlInfo(q) << "Could not assign value: "<incubatorChanged(m_incubator); } /*! \internal Destroys the Incubator wrapper if it was set before */ void UCPageWrapperPrivate::destroyIncubator() { if (m_incubator) { m_incubator->deleteLater(); m_incubator = nullptr; Q_EMIT q_func()->incubatorChanged(m_incubator); } } /*! Handles all state transitions and advances the statemachine until the component is either instantiated or an error occured */ void UCPageWrapperPrivate::nextStep() { Q_Q(UCPageWrapper); switch(m_state) { case Waiting:{ loadComponentState(); break; } case LoadingComponent:{ createObjectState(); break; } case CreatingObject:{ finalizeObjectIfReady(); break; } case NotifyPageLoaded: { // emit pageWrapper's pageLoaded signal to complete page activation m_state = Ready; Q_EMIT q->pageLoaded(); break; } default: break; // do nothing } } void UCPageWrapperPrivate::loadComponentState() { Q_Q(UCPageWrapper); m_state = LoadingComponent; if (m_reference.canConvert()) { //m_reference points to a Component already, make sure we do not //delete it later on m_ownsComponent = false; m_component = m_reference.value(); } else if (m_reference.canConvert()) { //m_reference contains a URL to the Component we have to load, in this //case we need to destroy the component ourselves lateron QQmlComponent::CompilationMode cMode = m_synchronous ? QQmlComponent::PreferSynchronous : QQmlComponent::Asynchronous; QUrl componentUrl = QUrl(m_reference.toString()); m_ownsComponent = true; m_component = new QQmlComponent(qmlEngine(q), componentUrl, cMode); } else if (m_reference.canConvert()) { //the object is owned by JS setCanDestroy(false); //m_reference is already a Item, we just need to copy the properties and we are done QQuickItem *theItem = m_reference.value(); initItem(theItem); //proceed to final step m_state = NotifyPageLoaded; nextStep(); return; } else { m_state = Error; qmlInfo(q) << "PageWrapper.reference contains unsupported data"; return; } if (m_component) { if (!m_synchronous) { //The Incubator needs to be created ahead of time because QML code assumes its valid right away createIncubator(); } //check if the component is already available if (m_component->status() != QQmlComponent::Loading) nextStep(); else { //async behaviour, advance to the next state once the component was loaded QSharedPointer connHandle(new QMetaObject::Connection); auto asyncCallback = [this, connHandle](){ if(m_component->status() != QQmlComponent::Loading) { QObject::disconnect(*connHandle); nextStep(); } }; *connHandle = QObject::connect(m_component, &QQmlComponent::statusChanged,asyncCallback); } } } void UCPageWrapperPrivate::createObjectState() { Q_Q(UCPageWrapper); if (m_component->status() == QQmlComponent::Error) { qmlInfo(q) << m_component->errors(); m_state = Error; return; //full stop } //the Component was created, next step is to create a Item instance m_state = CreatingObject; //Object has C++ ownership setCanDestroy(true); // create context // use creation context as parent to create the context we load the style item with QQmlContext *creationContext = m_component->creationContext(); if (!creationContext) { creationContext = qmlContext(q); } if (creationContext && !creationContext->isValid()) { // we are having the changes in the component being under deletion qmlInfo(q) << "Could not get creation context"; m_state = Error; return; } m_itemContext = new QQmlContext(creationContext); if (m_synchronous) { QQuickItem *theItem = toItem(m_component->beginCreate(m_itemContext)); if (theItem) { initItem(theItem); m_itemContext->setParent(theItem); m_itemContext = nullptr; m_component->completeCreate(); m_state = NotifyPageLoaded; nextStep(); } else { delete m_itemContext; m_itemContext = nullptr; m_state = Error; } } else { //connect the change signal first so we definately catch the signal even when the creation finishes right away QObject::connect(m_incubator, SIGNAL(enterOnStatusChanged()), q, SLOT(nextStep())); //make sure we intialize the item before it is instantiated QSharedPointer connHandle(new QMetaObject::Connection); auto asyncCallback = [this, connHandle](QObject *target){ QObject::disconnect(*connHandle); QQuickItem *theItem = toItem(target, false); if (theItem) { initItem(theItem); m_itemContext->setParent(theItem); m_itemContext = nullptr; } }; *connHandle = QObject::connect(m_incubator, &UCPageWrapperIncubator::initialStateRequested, asyncCallback); m_component->create(*m_incubator, m_itemContext); } } void UCPageWrapperPrivate::finalizeObjectIfReady() { Q_Q(UCPageWrapper); if(m_incubator->status() == QQmlIncubator::Ready) { QObject::disconnect(m_incubator, SIGNAL(enterOnStatusChanged()), q, SLOT(nextStep())); QQuickItem *theItem = toItem(m_incubator->object()); if (theItem) { //this code needs to be executed after the Incubator has executed the JS callback QSharedPointer sharedConn(new QMetaObject::Connection); auto asyncCallback = [this, sharedConn](){ QObject::disconnect(*sharedConn); destroyIncubator(); m_state = NotifyPageLoaded; nextStep(); }; *sharedConn = QObject::connect(m_incubator, &UCPageWrapperIncubator::statusHasChanged,asyncCallback); return; } else { m_state = Error; } } else if(m_incubator->status() == QQmlIncubator::Error) { m_state = Error; qmlInfo(q) << m_incubator->errors(); } else if (m_incubator->status() == QQmlIncubator::Null) { //page loading was cancled reset(); return; } // cleanup if(m_incubator->status() != QQmlIncubator::Loading) { //if we reach this point there was a error, make sure the item context is properly //destroyed if (m_itemContext) { delete m_itemContext; m_itemContext = nullptr; } destroyIncubator(); } } void UCPageWrapperPrivate::onActiveChanged() { q_func()->setVisible(m_active); } /*! \internal \qmltype PageWrapper \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Internal class used by \l PageStack */ UCPageWrapper::UCPageWrapper(QQuickItem *parent) : UCPageTreeNode((* new UCPageWrapperPrivate), parent) { d_func()->init(); } UCPageWrapper::UCPageWrapper(UCPageWrapperPrivate &dd, QQuickItem *parent) : UCPageTreeNode(dd, parent) { d_func()->init(); } UCPageWrapper::~UCPageWrapper() { d_func()->deactivate(); } /*! \qmlproperty var PageWrapper::reference The reference to the page object. This can be the page itself (which is an Item), but also a url pointing to a QML file. */ QVariant UCPageWrapper::reference() const { return d_func()->m_reference; } void UCPageWrapper::setReference(const QVariant &reference) { Q_D(UCPageWrapper); if (d->m_reference == reference) return; d->m_reference = reference; d->deactivate(); d->initPage(); if (d->m_active && d->m_reference.isValid()) { if ((d->m_incubator && d->m_incubator->status() == QQmlIncubator::Ready) || d->m_object) { d->activate(); } else { // asynchronous, connect page activation //make sure this connection is destroyed once it was fired. Using a stack //variable does not work because it would not yet be initialized when the variable //is captured QSharedPointer sharedConn(new QMetaObject::Connection); auto asyncCallback = [d, sharedConn](){ d->activate(); QObject::disconnect(*sharedConn); }; *sharedConn = QObject::connect(this, &UCPageWrapper::pageLoaded,asyncCallback); } } Q_EMIT referenceChanged(reference); } /*! \qmlproperty Item PageWrapper::object The initialized page object, or null if the object needs to be created. */ QQuickItem *UCPageWrapper::object() const { return d_func()->m_object; } void UCPageWrapper::setObject(QQuickItem *object) { Q_D(UCPageWrapper); if (d->m_object == object) return; d->m_object = object; Q_EMIT objectChanged(object); } /*! \qmlproperty bool PageWrapper::canDestroy This property will be true if \l object holds an object that was created from the given reference, and thus can be destroyed when no the page is deactivated. */ bool UCPageWrapper::canDestroy() const { return d_func()->m_canDestroy; } void UCPageWrapperPrivate::setCanDestroy(bool canDestroy) { Q_Q(UCPageWrapper); if (m_canDestroy == canDestroy) return; m_canDestroy = canDestroy; Q_EMIT q->canDestroyChanged(canDestroy); } /*! \qmlproperty int PageWrapper::column Column number in AdaptivePageLayout. */ int UCPageWrapper::column() const { return d_func()->m_column; } void UCPageWrapper::setColumn(int column) { Q_D(UCPageWrapper); if (d->m_column == column) return; d->m_column = column; Q_EMIT columnChanged(column); } /*! \qmlproperty Item PageWrapper::parentPage Parent page. */ QQuickItem *UCPageWrapper::parentPage() const { return d_func()->m_parentPage; } void UCPageWrapper::setParentPage(QQuickItem *parentPage) { Q_D(UCPageWrapper); if (d->m_parentPage == parentPage) return; d->m_parentPage = parentPage; Q_EMIT parentPageChanged(parentPage); } /*! \qmlproperty var PageWrapper::incubator Incubator for the asynchronous page creation */ QObject *UCPageWrapper::incubator() const { return d_func()->m_incubator; } /*! \internal \qmlmethod PageWrapper::destroyObject() Destroy \l object. Only call this function if \l canDestroy */ void UCPageWrapper::destroyObject() { Q_D(UCPageWrapper); if (d->m_canDestroy && d->m_object) { d->m_object->deleteLater(); d->m_canDestroy = false; setObject(nullptr); } } void UCPageWrapper::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &data) { if (change == ItemParentHasChanged) { //make sure we always fill the parents space completely QQuickAnchors *anchors = QQuickItemPrivate::get(this)->anchors(); if (data.item) { anchors->setFill(data.item); } else { anchors->resetFill(); } } UCStyledItemBase::itemChange(change, data); } /*! \qmlproperty Item PageWrapper::parentWrapper Parent PageWrapper or the parentPage. */ QQuickItem *UCPageWrapper::parentWrapper() const { return d_func()->m_parentWrapper; } void UCPageWrapper::setParentWrapper(QQuickItem *parentWrapper) { Q_D(UCPageWrapper); if (d->m_parentWrapper == parentWrapper) return; d->m_parentWrapper = parentWrapper; Q_EMIT parentWrapperChanged(parentWrapper); } /*! \qmlproperty Item PageWrapper::pageHolder Page holder in AdaptivePageLayout. */ QQuickItem *UCPageWrapper::pageHolder() const { return d_func()->m_pageHolder; } void UCPageWrapper::setPageHolder(QQuickItem *pageHolder) { Q_D(UCPageWrapper); if (d->m_pageHolder == pageHolder) return; d->m_pageHolder = pageHolder; Q_EMIT pageHolderChanged(pageHolder); } /*! \qmlproperty bool PageWrapper::synchronous Instructs to load the page synchronously or not. Used by AdaptivePageLayout. True by default to keep PageStack integrity. */ bool UCPageWrapper::synchronous() const { return d_func()->m_synchronous; } void UCPageWrapper::setSynchronous(bool synchronous) { Q_D(UCPageWrapper); if (d->m_synchronous == synchronous) return; d->m_synchronous = synchronous; Q_EMIT synchronousChanged(synchronous); } /*! \qmlmethod bool PageWrapper::childOf(Item) Returns true if the current PageWrapper is a child of the given page */ bool UCPageWrapper::childOf(QQuickItem *page) { Q_D(UCPageWrapper); if (d->m_parentPage == page) return true; if (page && d->m_parentWrapper) { UCPageWrapper *wrapper = qobject_cast(d->m_parentWrapper); while (wrapper) { if (wrapper->object() == page) { return true; } wrapper = qobject_cast(wrapper->parentWrapper()); } } return false; } /*! \qmlproperty var PageWrapper::properties Properties are use to initialize a new object, or if reference is already an object, properties are copied to the object when activated. Set properties before setting the reference. */ QVariant UCPageWrapper::properties() const { return d_func()->m_properties; } void UCPageWrapper::setProperties(const QVariant &properties) { Q_D(UCPageWrapper); if (d->m_properties == properties) return; d->m_properties = properties; Q_EMIT propertiesChanged(properties); } void UCPageWrapper::setVisible2(bool visible) { Q_D(UCPageWrapper); //remove the binding to visible if (!(d->m_flags & UCPageWrapperPrivate::CustomVisible)) { disconnect(this, SIGNAL(activeChanged(bool)), this, SLOT(onActiveChanged())); } d->m_flags |= UCPageWrapperPrivate::CustomVisible; setVisible(visible); } UCTheme *UCPageWrapper::getTheme2() { return getTheme(); } void UCPageWrapper::setTheme2(UCTheme *theme) { setTheme(theme); } void UCPageWrapper::resetTheme2() { resetTheme(); } /*! \qmlsignal PageWrapper::pageLoaded() Signal emitted when incubator completes page loading. */ #include "moc_ucpagewrapper.cpp" ./src/Ubuntu/Components/plugin/privates/threelabelsslot_p.h0000644000015600001650000000434112700370701024311 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef THREELABELSSLOT_H #define THREELABELSSLOT_H #include #include //The padding between title and the string below it (i.e. subtitle, or //summary, when subtitle is empty) #define TITLE_SPACING_DP 2 class UCTheme; class UCLabel; class UCThreeLabelsSlotPrivate; class UCThreeLabelsSlot : public QQuickItem { Q_OBJECT Q_PROPERTY(UCLabel *title READ title CONSTANT FINAL) Q_PROPERTY(UCLabel *subtitle READ subtitle CONSTANT FINAL) Q_PROPERTY(UCLabel *summary READ summary CONSTANT FINAL) public: explicit UCThreeLabelsSlot(QQuickItem *parent = 0); UCLabel *title(); UCLabel *subtitle(); UCLabel *summary(); protected: Q_DECLARE_PRIVATE(UCThreeLabelsSlot) private: Q_PRIVATE_SLOT(d_func(), void _q_onGuValueChanged()) Q_PRIVATE_SLOT(d_func(), void _q_updateLabelsAnchorsAndBBoxHeight()) static QColor getSubtitleColor(QQuickItem *item, UCTheme *theme); static QColor getSummaryColor(QQuickItem *item, UCTheme *theme); }; class UCThreeLabelsSlotPrivate : public QQuickItemPrivate { Q_DECLARE_PUBLIC(UCThreeLabelsSlot) public: UCThreeLabelsSlotPrivate(); static inline UCThreeLabelsSlotPrivate *get(UCThreeLabelsSlot *that) { Q_ASSERT(that); return that->d_func(); } void init(); void setTitleProperties(); void setSubtitleProperties(); void setSummaryProperties(); void _q_onGuValueChanged(); void _q_updateLabelsAnchorsAndBBoxHeight(); UCLabel *m_title; UCLabel *m_subtitle; UCLabel *m_summary; }; #endif // THREELABELSSLOT_H ./src/Ubuntu/Components/plugin/privates/threelabelsslot_p.cpp0000644000015600001650000002322612700370714024653 0ustar jenkinsjenkins/* * Copyright 2015-2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "threelabelsslot_p.h" #include "label_p.h" #include "ucunits.h" #include "ucfontutils.h" #include "uctheme.h" UCThreeLabelsSlotPrivate::UCThreeLabelsSlotPrivate() : QQuickItemPrivate() , m_title(Q_NULLPTR) , m_subtitle(Q_NULLPTR) , m_summary(Q_NULLPTR) { } void UCThreeLabelsSlotPrivate::init() { Q_Q(UCThreeLabelsSlot); QObject::connect(UCUnits::instance(), SIGNAL(gridUnitChanged()), q, SLOT(_q_onGuValueChanged())); _q_onGuValueChanged(); } void UCThreeLabelsSlotPrivate::setTitleProperties() { if (m_title != Q_NULLPTR) { //Using WrapAnywhere because ElideRight elides too early when used //together with WrapWord, and that produces an unexpected result. //This will cover most of the usecases. m_title->setWrapMode(UCLabel::WrapAnywhere); m_title->setElideMode(UCLabel::ElideRight); m_title->setMaximumLineCount(1); m_title->setTextSize(UCLabel::Medium); } } void UCThreeLabelsSlotPrivate::setSubtitleProperties() { if (m_subtitle != Q_NULLPTR) { m_subtitle->setWrapMode(UCLabel::WrapAnywhere); m_subtitle->setElideMode(UCLabel::ElideRight); m_subtitle->setMaximumLineCount(1); m_subtitle->setTextSize(UCLabel::Small); } } void UCThreeLabelsSlotPrivate::setSummaryProperties() { if (m_summary != Q_NULLPTR) { m_summary->setWrapMode(UCLabel::WrapAnywhere); m_summary->setElideMode(UCLabel::ElideRight); m_summary->setMaximumLineCount(2); m_summary->setTextSize(UCLabel::Small); } } void UCThreeLabelsSlotPrivate::_q_onGuValueChanged() { if (m_title != Q_NULLPTR || m_subtitle != Q_NULLPTR || m_summary != Q_NULLPTR) { _q_updateLabelsAnchorsAndBBoxHeight(); } } void UCThreeLabelsSlotPrivate::_q_updateLabelsAnchorsAndBBoxHeight() { //if the component is not ready the QML properties may not have been evaluated yet, //it's not worth doing anything if that's the case if (!componentComplete) { return; } Q_Q(UCThreeLabelsSlot); bool skipTitle = m_title == Q_NULLPTR || m_title->text().isEmpty() || !m_title->isVisible(); bool skipSubtitle = m_subtitle == Q_NULLPTR || m_subtitle->text().isEmpty() || !m_subtitle->isVisible(); bool skipSummary = m_summary == Q_NULLPTR || m_summary->text().isEmpty() || !m_summary->isVisible(); if (!skipTitle) { QQuickAnchors *titleAnchors = QQuickItemPrivate::get(m_title)->anchors(); titleAnchors->setTop(top()); } //even if a UCLabel is empty it will have height as if it had one character, so we can't rely //on just anchoring to bottom of the text above us (title in this case) because that will lead //to wrong positioning when title is empty if (!skipSubtitle) { QQuickAnchors *subtitleAnchors = QQuickItemPrivate::get(m_subtitle)->anchors(); subtitleAnchors->setTop(skipTitle ? top() : QQuickItemPrivate::get(m_title)->bottom()); subtitleAnchors->setTopMargin(skipTitle ? 0 : UCUnits::instance()->dp(TITLE_SPACING_DP)); } if (!skipSummary) { QQuickAnchors *summaryAnchors = QQuickItemPrivate::get(m_summary)->anchors(); summaryAnchors->setTop(skipSubtitle ? (skipTitle ? top() : QQuickItemPrivate::get(m_title)->bottom()) : QQuickItemPrivate::get(m_subtitle)->bottom()); summaryAnchors->setTopMargin(skipSubtitle ? (skipTitle ? 0 : UCUnits::instance()->dp(TITLE_SPACING_DP)) : 0); } //Update height of the labels box //NOTE (FIXME? it's stuff in Qt): height is not 0 when the string is empty, its default value is "fontHeight"! qreal labelsBoundingBoxHeight = 0; //We're assuming they're positioned in a column, title->subtitle->summary if (!skipSummary) { labelsBoundingBoxHeight = m_summary->y() + m_summary->height(); } else if (!skipSubtitle) { labelsBoundingBoxHeight = m_subtitle->y() + m_subtitle->height(); } else if (!skipTitle) { labelsBoundingBoxHeight = m_title->y() + m_title->height(); } q->setImplicitHeight(labelsBoundingBoxHeight); } UCThreeLabelsSlot::UCThreeLabelsSlot(QQuickItem *parent) : QQuickItem(*(new UCThreeLabelsSlotPrivate), parent) { setFlag(ItemHasContents); Q_D(UCThreeLabelsSlot); d->init(); } UCLabel *UCThreeLabelsSlot::title() { Q_D(UCThreeLabelsSlot); if (d->m_title == Q_NULLPTR) { d->m_title = new UCLabel(this); QQmlEngine::setContextForObject(d->m_title, qmlContext(this)); UCLabelPrivate::get(d->m_title)->init(); QQuickAnchors *titleAnchors = QQuickItemPrivate::get(d->m_title)->anchors(); titleAnchors->setLeft(d->left()); titleAnchors->setRight(d->right()); //we need this to know when any of the labels is empty. In that case, we'll have to change the //anchors because even if a UCLabel has empty text, its height will not be 0 but "fontHeight", //so anchoring to text's bottom will result in the wrong outcome as a consequence. //FIXME: updating anchors just because text changes is too much, we should probably just //have variables signal when a label becomes empty QObject::connect(d->m_title, SIGNAL(textChanged(QString)), this, SLOT(_q_updateLabelsAnchorsAndBBoxHeight())); //the height may change for many reasons, for instance: //- change of fontsize //- or resizing the layout until text wrapping is triggered //so we have to monitor height change as well QObject::connect(d->m_title, SIGNAL(heightChanged()), this, SLOT(_q_updateLabelsAnchorsAndBBoxHeight())); QObject::connect(d->m_title, SIGNAL(visibleChanged()), this, SLOT(_q_updateLabelsAnchorsAndBBoxHeight())); //When changing fontsize of the title, heightChanged triggers an update of the height of "this", but at that point //baseline anchor and baselineOffset are not updated yet, so the height computed is not correct. //For that reason, we have to update the height of the item also when baselineOffset changes QObject::connect(d->m_title, SIGNAL(baselineOffsetChanged(qreal)), this, SLOT(_q_updateLabelsAnchorsAndBBoxHeight())); d->setTitleProperties(); d->_q_updateLabelsAnchorsAndBBoxHeight(); } return d->m_title; } QColor UCThreeLabelsSlot::getSubtitleColor(QQuickItem *item, UCTheme *theme) { // FIXME: replace the code below with automatic color // change detection based on teh item's state const char *valueSet = item->isEnabled() ? "normal" : "disabled"; return theme ? theme->getPaletteColor(valueSet, "backgroundSecondaryText") : QColor(); } UCLabel *UCThreeLabelsSlot::subtitle() { Q_D(UCThreeLabelsSlot); if (d->m_subtitle == Q_NULLPTR) { d->m_subtitle = new UCLabel(getSubtitleColor, this); QQmlEngine::setContextForObject(d->m_subtitle, qmlContext(this)); UCLabelPrivate::get(d->m_subtitle)->init(); QQuickAnchors *subtitleAnchors = QQuickItemPrivate::get(d->m_subtitle)->anchors(); subtitleAnchors->setLeft(d->left()); subtitleAnchors->setRight(d->right()); QObject::connect(d->m_subtitle, SIGNAL(textChanged(QString)), this, SLOT(_q_updateLabelsAnchorsAndBBoxHeight())); QObject::connect(d->m_subtitle, SIGNAL(heightChanged()), this, SLOT(_q_updateLabelsAnchorsAndBBoxHeight())); QObject::connect(d->m_subtitle, SIGNAL(visibleChanged()), this, SLOT(_q_updateLabelsAnchorsAndBBoxHeight())); d->setSubtitleProperties(); d->_q_updateLabelsAnchorsAndBBoxHeight(); } return d->m_subtitle; } QColor UCThreeLabelsSlot::getSummaryColor(QQuickItem *item, UCTheme *theme) { // FIXME: replace the code below with automatic color // change detection based on teh item's state const char *valueSet = item->isEnabled() ? "normal" : "disabled"; return theme ? theme->getPaletteColor(valueSet, "backgroundTertiaryText") : QColor(); } UCLabel *UCThreeLabelsSlot::summary() { Q_D(UCThreeLabelsSlot); if (d->m_summary == Q_NULLPTR) { d->m_summary = new UCLabel(getSummaryColor, this); QQmlEngine::setContextForObject(d->m_summary, qmlContext(this)); UCLabelPrivate::get(d->m_summary)->init(); QQuickAnchors *summaryAnchors = QQuickItemPrivate::get(d->m_summary)->anchors(); summaryAnchors->setLeft(d->left()); summaryAnchors->setRight(d->right()); QObject::connect(d->m_summary, SIGNAL(textChanged(QString)), this, SLOT(_q_updateLabelsAnchorsAndBBoxHeight())); QObject::connect(d->m_summary, SIGNAL(heightChanged()), this, SLOT(_q_updateLabelsAnchorsAndBBoxHeight())); QObject::connect(d->m_summary, SIGNAL(visibleChanged()), this, SLOT(_q_updateLabelsAnchorsAndBBoxHeight())); d->setSummaryProperties(); d->_q_updateLabelsAnchorsAndBBoxHeight(); } return d->m_summary; } ./src/Ubuntu/Components/plugin/privates/listitemdragarea.h0000644000015600001650000000315012700370701024114 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef LISTITEMDRAGAREA_H #define LISTITEMDRAGAREA_H #include "uclistitem.h" #include #include class QQuickFlickable; class ListItemDragArea : public QQuickItem { Q_OBJECT public: explicit ListItemDragArea(QQuickItem *parent = 0); void init(UCViewItemsAttached *viewItems); void reset(); protected: void timerEvent(QTimerEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); private: QBasicTimer scrollTimer; QPointer item; QQuickFlickable *listView; UCViewItemsAttached *viewAttached; QPointF lastPos, mousePos; int scrollDirection; int fromIndex, toIndex, min, max; QPointF mapDragAreaPos(); int indexAt(qreal x, qreal y); UCListItem *itemAt(qreal x, qreal y); void createDraggedItem(UCListItem *baseItem); void updateDraggedItem(); }; #endif // LISTITEMDRAGAREA_H ./src/Ubuntu/Components/plugin/privates/ucpagewrapperincubator_p.h0000644000015600001650000000340312700370701025667 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCPAGEWRAPPERINCUBATOR_H #define UCPAGEWRAPPERINCUBATOR_H #include #include #include #include class UCPageWrapperIncubator : public QObject, public QQmlIncubator { Q_OBJECT Q_PROPERTY(int status READ status) Q_PROPERTY(QJSValue onStatusChanged READ onStatusChanged WRITE setOnStatusChanged) Q_PROPERTY(QObject* object READ object) public: UCPageWrapperIncubator(QQmlIncubator::IncubationMode mode = QQmlIncubator::Asynchronous, QObject *parent = 0); ~UCPageWrapperIncubator(); // QQmlIncubator interface virtual void statusChanged(Status status) override; Q_INVOKABLE void forceCompletion(); QJSValue onStatusChanged() const; void setOnStatusChanged(QJSValue onStatusChanged); protected: // QQmlIncubator interface virtual void setInitialState(QObject *target) override; Q_SIGNALS: void statusHasChanged (QQmlIncubator::Status status); void initialStateRequested (QObject *target); void enterOnStatusChanged(); private: QJSValue m_onStatusChanged; }; #endif // UCPAGEWRAPPERINCUBATOR_H ./src/Ubuntu/Components/plugin/privates/listitemselection.cpp0000644000015600001650000001065712700370701024700 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "listitemselection.h" #include "uclistitem_p.h" ListItemSelection::ListItemSelection(UCListItem *parent) : QObject(parent) , hostItem(parent) , dirtyFlags(0) , selectMode(false) , selected(false) { } // initialize connections between ViewItems and selection handler void ListItemSelection::attachToViewItems(UCViewItemsAttached *newViewItems) { if (viewItems.data() == newViewItems) { return; } if (viewItems) { disconnect(viewItems.data(), &UCViewItemsAttached::selectModeChanged, this, &ListItemSelection::onSelectModeChanged); disconnect(viewItems.data(), &UCViewItemsAttached::selectedIndicesChanged, this, &ListItemSelection::onSelectedIndicesChanged); viewItems.clear(); } if (newViewItems) { viewItems = newViewItems; connect(viewItems.data(), &UCViewItemsAttached::selectModeChanged, this, &ListItemSelection::onSelectModeChanged); connect(viewItems.data(), &UCViewItemsAttached::selectedIndicesChanged, this, &ListItemSelection::onSelectedIndicesChanged); syncWithViewItems(); } } // synchronize selection handler data to the ViewItems void ListItemSelection::syncWithViewItems() { if (viewItems) { QSignalBlocker blocker(viewItems.data()); // sync selectMode if (dirtyFlags & SelectModeDirty) { viewItems->setSelectMode(selectMode); } else if (viewItems->selectMode() != selectMode) { selectMode = inSelectMode(); Q_EMIT hostItem->selectModeChanged(); } // sync selected if (dirtyFlags & SelectedDirty) { if (selected) { UCViewItemsAttachedPrivate::get(viewItems.data())->addSelectedItem(hostItem); } else { UCViewItemsAttachedPrivate::get(viewItems.data())->removeSelectedItem(hostItem); } } else if (selected != isSelected()) { selected = isSelected(); Q_EMIT hostItem->selectedChanged(); } dirtyFlags = 0; } } bool ListItemSelection::inSelectMode() const { return viewItems ? viewItems->selectMode() : selectMode; } void ListItemSelection::setSelectMode(bool mode) { if (mode == inSelectMode()) { return; } if (viewItems) { // selectMode is updated through the updateSelectMode() viewItems->setSelectMode(mode); } else { selectMode = mode; dirtyFlags |= SelectModeDirty; Q_EMIT hostItem->selectModeChanged(); } } bool ListItemSelection::isSelected() const { if (viewItems) { return UCViewItemsAttachedPrivate::get(viewItems.data())->isItemSelected(hostItem); } return selected; } void ListItemSelection::setSelected(bool selected) { if (selected == isSelected()) { return; } if (viewItems) { // this->selected is updated through updateSelected() if (selected) { UCViewItemsAttachedPrivate::get(viewItems.data())->addSelectedItem(hostItem); } else { UCViewItemsAttachedPrivate::get(viewItems.data())->removeSelectedItem(hostItem); } } else { this->selected = selected; dirtyFlags |= SelectedDirty; Q_EMIT hostItem->selectedChanged(); } } void ListItemSelection::onSelectModeChanged() { UCListItemPrivate *d = UCListItemPrivate::get(hostItem); selectMode = d->parentAttached->selectMode(); d->loadStyleItem(); Q_EMIT hostItem->selectModeChanged(); } void ListItemSelection::onSelectedIndicesChanged(const QList &indices) { UCListItemPrivate *d = UCListItemPrivate::get(hostItem); if (selected != indices.contains(d->index())) { selected = indices.contains(d->index()); Q_EMIT hostItem->selectedChanged(); } } ./src/Ubuntu/Components/plugin/privates/appheaderbase.cpp0000644000015600001650000000400012700370701023705 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "appheaderbase.h" #include "ucstyleditembase_p.h" /*! \qmltype AppHeaderBase \instantiates UCAppHeaderBase \inherits UCHeader \internal \inqmlmodule Ubuntu.Components.Private 1.3 \ingroup ubuntu \since Ubuntu.Components.Private 1.3 \brief Private parent of AppHeader, to disable animations until pages are loaded and initial visibility of the header is set. */ UCAppHeaderBase::UCAppHeaderBase(QQuickItem *parent) : UCHeader(parent) , m_animate(true) { connect(this, &UCHeader::themeChanged, this, &UCAppHeaderBase::themeChanged2); UCStyledItemBasePrivate::get(this)->styleDocument = "PageHeadStyle"; } UCTheme* UCAppHeaderBase::theme2() { return getTheme(); } void UCAppHeaderBase::setTheme2(UCTheme* value) { setTheme(value); } void UCAppHeaderBase::show(bool animate) { UCHeader::show(m_animate && animate); } void UCAppHeaderBase::hide(bool animate) { UCHeader::hide(m_animate && animate); } /*! * \qmlproperty bool AppHeaderBase::animate * Animate the y-value when the value of \l Header::exposed is set or unset. * If the header is already animating while the value is set to false, * the current animation is not cancelled. * Default value: true. */ void UCAppHeaderBase::setAnimate(bool animate) { if (animate != m_animate) { m_animate = animate; Q_EMIT animateChanged(); } } ./src/Ubuntu/Components/plugin/privates/listitemselection.h0000644000015600001650000000274512700370701024344 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef LISTITEMSELECTION_H #define LISTITEMSELECTION_H #include #include class UCViewItemsAttached; class UCListItem; class ListItemSelection : public QObject { Q_OBJECT public: explicit ListItemSelection(UCListItem *parent = 0); void attachToViewItems(UCViewItemsAttached * newViewItems); bool inSelectMode() const; void setSelectMode(bool mode); bool isSelected() const; void setSelected(bool selected); void onSelectModeChanged(); void onSelectedIndicesChanged(const QList &indices); private: QPointer viewItems; UCListItem *hostItem; enum { SelectModeDirty = 0x01, SelectedDirty = 0x02 }; quint8 dirtyFlags; bool selectMode:1; bool selected:1; void syncWithViewItems(); }; #endif // LISTITEMSELECTION_H ./src/Ubuntu/Components/plugin/privates/listitemexpansion.cpp0000644000015600001650000000722712700370701024716 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "uclistitem.h" #include "uclistitem_p.h" UCListItemExpansion::UCListItemExpansion(QObject *parent) : QObject(parent) , m_listItem(static_cast(parent)) , m_height(0.0) , m_filtering(false) { } bool UCListItemExpansion::expandedLocked() { UCListItemPrivate *listItem = UCListItemPrivate::get(m_listItem); UCViewItemsAttachedPrivate *viewItems = UCViewItemsAttachedPrivate::get(listItem->parentAttached); return expanded() && !((viewItems->expansionFlags & UCViewItemsAttached::UnlockExpanded) == UCViewItemsAttached::UnlockExpanded); } void UCListItemExpansion::enableClickFiltering(bool enable) { if (m_filtering == enable) { return; } m_filtering = enable; if (m_filtering) { m_listItem->window()->installEventFilter(this); } else { m_listItem->window()->removeEventFilter(this); } } // event filter for external mouse presses to collapse when pressed outside bool UCListItemExpansion::eventFilter(QObject *target, QEvent *event) { if (event->type() == QEvent::MouseButtonPress) { QMouseEvent *mouse = static_cast(event); QQuickWindow *window = qobject_cast(target); if (window) { QPointF myPos(window->contentItem()->mapToItem(m_listItem, mouse->localPos())); if (!m_listItem->contains(myPos)) { UCListItemPrivate *listItem = UCListItemPrivate::get(m_listItem); UCViewItemsAttachedPrivate *viewItems = UCViewItemsAttachedPrivate::get(listItem->parentAttached); if (viewItems) { // collapse all as there can be only one expanded when the flag is set viewItems->collapseAll(); } } } } return false; } bool UCListItemExpansion::expanded() { UCListItemPrivate *listItem = UCListItemPrivate::get(m_listItem); UCViewItemsAttachedPrivate *viewItems = UCViewItemsAttachedPrivate::get(listItem->parentAttached); return (viewItems && viewItems->expansionList.contains(listItem->index())); } void UCListItemExpansion::setExpanded(bool expanded) { if (this->expanded() == expanded) { return; } UCListItemPrivate *listItem = UCListItemPrivate::get(m_listItem); UCViewItemsAttachedPrivate *viewItems = UCViewItemsAttachedPrivate::get(listItem->parentAttached); if (viewItems) { if (viewItems->expansionFlags & UCViewItemsAttached::Exclusive) { // collapse all the expanded ones viewItems->collapseAll(); } if (expanded) { viewItems->expand(listItem->index(), m_listItem); } else { viewItems->collapse(listItem->index()); } } UCListItemPrivate::get(m_listItem)->loadStyleItem(); // no need to emit changed signal, as ViewItems.expandedIndicesChanged is connected to the change signal } void UCListItemExpansion::setHeight(qreal height) { if (m_height == height) { return; } m_height = height; Q_EMIT heightChanged(); } ./src/Ubuntu/Components/plugin/privates/listviewextensions.cpp0000644000015600001650000001047712700370714025132 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author Zsombor Egri */ #include "listviewextensions.h" #include "uclistitem_p.h" #include "quickutils.h" #include #include ListViewProxy::ListViewProxy(QQuickFlickable *listView, QObject *parent) : QObject(parent) , listView(listView) { } ListViewProxy::~ListViewProxy() { if (isEventFilter) { listView->removeEventFilter(this); } } // proxy methods Qt::Orientation ListViewProxy::orientation() { return (Qt::Orientation)listView->property("orientation").toInt(); } int ListViewProxy::count() { return listView->property("count").toInt(); } QQuickItem *ListViewProxy::currentItem() { return listView->property("currentItem").value(); } int ListViewProxy::currentIndex() { return listView->property("currentIndex").toInt(); } void ListViewProxy::setCurrentIndex(int index) { listView->setProperty("currentIndex", index); } QVariant ListViewProxy::model() { return listView->property("model"); } /********************************************************************* * Additional functionality used in different places in toolkit *********************************************************************/ // Navigation override used by ListItems void ListViewProxy::overrideItemNavigation(bool override) { if (override) { listView->installEventFilter(this); } else { listView->removeEventFilter(this); } isEventFilter = override; } bool ListViewProxy::eventFilter(QObject *, QEvent *event) { switch (event->type()) { case QEvent::FocusIn: return focusInEvent(static_cast(event)); case QEvent::KeyPress: return keyPressEvent(static_cast(event)); default: break; } return false; } void ListViewProxy::setKeyNavigationForListView(bool value) { UCListItem *listItem = qobject_cast(currentItem()); if (listItem) { UCListItemPrivate::get(listItem)->setListViewKeyNavigation(value); listItem->update(); } } // grab focusIn event bool ListViewProxy::focusInEvent(QFocusEvent *event) { switch (event->reason()) { case Qt::TabFocusReason: case Qt::BacktabFocusReason: { QQuickItem *currentItem = this->currentItem(); if (!currentItem && count() > 0) { // set the first one to be the focus setCurrentIndex(0); setKeyNavigationForListView(true); } break; } default: break; } return false; } // override up/down key presses for ListView; returns true if the key event is consumed // in which case ListView won't get it. bool ListViewProxy::keyPressEvent(QKeyEvent *event) { int key = event->key(); Qt::Orientation orientation = this->orientation(); if ((orientation == Qt::Vertical && key != Qt::Key_Up && key != Qt::Key_Down) || (orientation == Qt::Horizontal && key != Qt::Key_Left && key != Qt::Key_Right)) { return false; } // for horizontal moves take into account the layout mirroring bool isRtl = QQuickItemPrivate::get(listView)->effectiveLayoutMirror; bool forwards = (key == Qt::Key_Up || (isRtl ? key == Qt::Key_Left : key == Qt::Key_Right)); int oldIndex = this->currentIndex(); int currentIndex = this->currentIndex(); int count = this->count(); if (currentIndex >= 0 && count > 0) { currentIndex = qBound(0, forwards ? currentIndex - 1 : currentIndex + 1, count - 1); setCurrentIndex(currentIndex); setKeyNavigationForListView(true); } return (oldIndex != currentIndex); } ./src/Ubuntu/Components/plugin/privates/textures.h0000644000015600001650000161362512700370701022475 0ustar jenkinsjenkins// Copyright 2015 Canonical Ltd. // Automatically generated by the createshapetextures tool. const float shapeOffset = 0.0625f; const int shapeMipmapBaseSize = 256; const int shapeMipmapCount = 9; static const int shapeMipmapOffsets[9] = { 0, 65536, 81920, 86016, 87040, 87296, 87360, 87376, 87380 }; static const unsigned char shapeMipmapData[87381] = { // Mipmap level 0. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0f, 0x18,0x1f,0x27,0x2f,0x36,0x3e,0x46,0x4e,0x55,0x5d,0x65,0x6c,0x74,0x7c,0x83,0x8b, 0x93,0x9a,0x9e,0xa2,0xa6,0xab,0xaf,0xb3,0xb8,0xbc,0xc0,0xc4,0xc9,0xcd,0xd1,0xd5, 0xda,0xde,0xe2,0xe6,0xe9,0xeb,0xec,0xed,0xee,0xf0,0xf1,0xf2,0xf3,0xf4,0xf6,0xf7, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x15,0x27,0x39,0x48, 0x55,0x61,0x6e,0x7a,0x87,0x93,0xa0,0xac,0xb9,0xc5,0xd1,0xde,0xea,0xf7,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x14,0x2a, 0x3d,0x4f,0x61,0x73,0x85,0x97,0xa9,0xbb,0xcd,0xdf,0xf1,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x06,0x1e,0x36,0x4f,0x68,0x80,0x99,0xb2,0xca,0xe3,0xfa,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x17,0x38,0x59,0x7a,0x9b, 0xba,0xd4,0xec,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x31,0x52,0x73,0x94,0xb5,0xd6,0xf6,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x19,0x44,0x6e, 0x99,0xc4,0xed,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x1a,0x45,0x6f,0x9a,0xc4,0xef,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x21,0x57,0x8d,0xc3,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x48,0x7e, 0xb4,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x37,0x6f,0xa5,0xdc,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x28,0x6c,0xb0,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x17,0x5b,0x9f,0xe3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x49,0x8e, 0xd2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x50,0xa5,0xf2,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x51,0xa6,0xf3,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0a,0x53,0xa8,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x3a,0xa3,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d, 0x68,0xd1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x96,0xf3, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x5b,0xc4,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x7a,0xeb,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x7a,0xed,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x7a,0xed,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0e,0x7a,0xed,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0a,0x7a,0xed,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b, 0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0xae,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x74,0xf4,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0xd2,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x9c,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x73,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x13,0xb3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3b,0xe2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x78,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0b,0xb3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0xc9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0xd8, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0xe4,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0xef,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0xf7,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0xfc,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0xfc,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0xf6,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0xe3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x13,0xd7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0b,0xc8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0xb1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x75,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3a,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x13,0xe2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0xb4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x74,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39, 0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0xe1, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xd3,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0xf5,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0xdf,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xee,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x10,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x09,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x31,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0f,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x6c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0xd6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0b,0xf6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xab,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b, 0xf6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0xf5, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0xf5,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe6,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xf4,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xec,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9d,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x73,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x15,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x36,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x56,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x77,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x98,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xda,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3d,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x09,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x22,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x53,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x84,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x9d,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xb6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xce,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x2e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x52,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x64,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x76,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x88,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x9a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xac,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xbe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xd0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x19,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3d,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x57,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x64,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7d,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x89,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x96,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xae,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xed,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x06,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x11,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x19,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x21,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x29,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x30,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x38,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x47,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x4f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x57,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x66,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x76,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7d,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x85,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8d,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x94,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x9b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x9f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xac,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xbd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xca,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xce,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xdb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xec,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xed,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // Mipmap level 1. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0d,0x20, 0x2b,0x35,0x3f,0x49,0x53,0x5d,0x67,0x71,0x7b,0x85,0x8f,0x99,0xa3,0xad,0xb7,0xc1, 0xcb,0xcf,0xd2,0xd5,0xd7,0xda,0xdd,0xdf,0xe2,0xe5,0xe7,0xea,0xed,0xf0,0xf2,0xf5, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x0e,0x23,0x38,0x4e,0x63,0x78,0x8d,0xa3,0xb8,0xcd,0xe2,0xf8,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x21,0x42,0x63,0x84,0xa5,0xc6, 0xe3,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0x2d,0x58,0x82,0xad,0xd8,0xfc,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x32, 0x68,0x9e,0xd4,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x47,0x8b,0xc5,0xf7,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x36,0x7a,0xbf,0xf9,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x3e,0x93,0xe6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x38,0x95,0xe7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x67, 0xcf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x94,0xf2,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x9e,0xfc,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x9d,0xfc,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x7e,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x44,0xda,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0e,0xa3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x31,0xdb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x6b,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05, 0xa1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xb6, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0xc9,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0xd6,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xc9,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xb6,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xa0,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0xf9,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0xdc,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x46,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x08,0xdb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x22,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x25,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x26,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x97,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0d,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0xd0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x38,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x95,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xe7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xe6, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0xfa,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xf9,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0xfd,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xfd,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xfa,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf9,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // Mipmap level 2. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x20,0x36,0x4b,0x61,0x76,0x8c, 0x99,0xa3,0xad,0xb7,0xc2,0xcc,0xd6,0xe0,0xe9,0xec,0xee,0xf1,0xf3,0xf6,0xf8,0xfb, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x1d,0x42,0x67,0x8c,0xb1,0xd6,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x42,0x7f, 0xbd,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x84,0xc6,0xfa,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x6d,0xcb,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x27,0xab,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x15,0x94,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x75,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0e,0xb4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24, 0xd6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0xee, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0xee,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xd7,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xb7,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0xf2,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0xfc,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0xfb,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcd,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x01,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x1b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x41,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x66,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0xb2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0xd7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x01,0xf6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x0c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x21,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x37,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x4c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x62,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x77,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xa3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xae,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xb8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xc2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xcc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xd7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xe9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xec,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xf6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // Mipmap level 3. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x17,0x3d,0x64,0x82,0x97,0xac,0xc1,0xcd,0xd3,0xd9,0xdf,0xe5,0xeb,0xf1,0xf8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x74,0xb0, 0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x6e,0xcf,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x5e,0xe3,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0xa6,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0xc7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x01,0xa7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x60,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x0a,0xe5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x6f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0xd0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x2e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x75,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0xb1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x01,0xec,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x18,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x3e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x64,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x83,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x98,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xad,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xc1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xcd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xd3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xd9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xe5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // Mipmap level 4. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x3c,0x7e,0x9e,0xbb,0xd8,0xe8,0xee,0xf4,0xfb, 0x00,0x00,0x00,0x00,0x0d,0x90,0xed,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x33,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x0d,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x90,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x04,0xed,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x3c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x9f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0xbc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0xd9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0xe8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // Mipmap level 5. 0x00,0x00,0x00,0x12,0x45,0x55,0x65,0x75,0x00,0x0d,0xa1,0xfc,0xff,0xff,0xff,0xff, 0x00,0xa1,0xff,0xff,0xff,0xff,0xff,0xff,0x12,0xfc,0xff,0xff,0xff,0xff,0xff,0xff, 0x45,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x56,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x65,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x75,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // Mipmap level 6. 0x03,0x5a,0xa7,0xb7,0x5b,0xff,0xff,0xff,0xa7,0xff,0xff,0xff,0xb7,0xff,0xff,0xff, // Mipmap level 7. 0x70,0xd8,0xd8,0xff, // Mipmap level 8. 0xb7 }; ./src/Ubuntu/Components/plugin/privates/frame.h0000644000015600001650000000571612700370701021677 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Loïc Molinari */ #ifndef FRAME_H #define FRAME_H #include #include #include class UCFrameMaterial : public QSGMaterial { public: UCFrameMaterial(); virtual QSGMaterialType* type() const; virtual QSGMaterialShader* createShader() const; virtual int compare(const QSGMaterial* other) const; quint32 textureId() const { return m_textureId; } private: quint32 m_textureId; }; class UCFrameNode : public QSGGeometryNode { public: struct Vertex { float x, y, s1, t1, s2, t2; quint32 color; }; static const unsigned short* indices(); static const QSGGeometry::AttributeSet& attributeSet(); UCFrameNode(); void updateGeometry(const QSizeF& itemSize, float thickness, float radius, QRgb color); private: UCFrameMaterial m_material; QSGGeometry m_geometry; }; // Renders the frame (border) of a shape. class UCFrame : public QQuickItem { Q_OBJECT // Thickness of the frame in pixels. Q_PROPERTY(qreal thickness READ thickness WRITE setThickness NOTIFY thicknessChanged) // Radius of the shape in pixels. A rectangle frame could be obtained using // a radius of 0 but it's recommended to use a Ractangle with a border for // that as it is a bit more efficient in term of rendering speed (reason is // we don't bother to specify a dedicated mesh and shader when radius is 0). Q_PROPERTY(qreal radius READ radius WRITE setRadius NOTIFY radiusChanged) // Color of the frame. Translucent colors are supported too. Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) public: UCFrame(QQuickItem* parent = 0); qreal thickness() const { return m_thickness; } void setThickness(qreal thickness); qreal radius() const { return m_radius; } void setRadius(qreal radius); QColor color() const { return QColor(qRed(m_color), qGreen(m_color), qBlue(m_color), qAlpha(m_color)); } void setColor(const QColor& color); Q_SIGNALS: void thicknessChanged(); void radiusChanged(); void colorChanged(); private: virtual QSGNode* updatePaintNode(QSGNode* oldNode, UpdatePaintNodeData* data); QRgb m_color; float m_thickness; float m_radius; Q_DISABLE_COPY(UCFrame) }; QML_DECLARE_TYPE(UCFrame) #endif // FRAME_H ./src/Ubuntu/Components/plugin/ucbottomedge.cpp0000644000015600001650000011523212700370714021763 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "ucbottomedge_p.h" #include "ucbottomedgestyle.h" #include "ucbottomedgeregion.h" #include "ucbottomedgeregion_p.h" #include "ucbottomedgehint_p.h" #include "ucstyleditembase_p.h" #include #include #include #include #include #include #include #include "plugin.h" #include "ucnamespace.h" #include "ucheader.h" #include "ucaction.h" #include "quickutils.h" #include "private/ucswipearea_p.h" #include using namespace UbuntuToolkit; Q_LOGGING_CATEGORY(ucBottomEdge, "ubuntu.components.BottomEdge", QtMsgType::QtWarningMsg) UCBottomEdgePrivate::UCBottomEdgePrivate() : UCStyledItemBasePrivate() , defaultRegion(new DefaultRegion(nullptr)) , activeRegion(Q_NULLPTR) , hint(new UCBottomEdgeHint) , bottomPanel(Q_NULLPTR) , previousDistance(0.0) , dragProgress(0.) , status(UCBottomEdge::Hidden) , operationStatus(Idle) , dragDirection(UCBottomEdge::Undefined) , defaultRegionsReset(false) , mousePressed(false) , preloadContent(false) { } void UCBottomEdgePrivate::init() { Q_Q(UCBottomEdge); // initialize hint QQml_setParent_noEvent(hint, q); // keep BottomEdge.enabled in sync with the hint QObject::connect(q, &UCBottomEdge::enabledChanged, [=] { hint->setEnabled2(q->isEnabled()); }); // create default region // enters in this stage when drag ratio reaches 30% of the area UCBottomEdgeRegionPrivate::get(defaultRegion)->attachToBottomEdge(q); QObject::connect(defaultRegion, &UCBottomEdgeRegion::contentChanged, q, &UCBottomEdge::contentChanged); QObject::connect(defaultRegion, &UCBottomEdgeRegion::contentComponentChanged, q, &UCBottomEdge::contentComponentChanged); regions.append(defaultRegion); // set the style name styleDocument = QStringLiteral("BottomEdgeStyle"); } // overload default data property so we can filter out the regions declared // in the body of the component as resources QQmlListProperty UCBottomEdgePrivate::data() { return QQmlListProperty(q_func(), 0, UCBottomEdgePrivate::overload_data_append, QQuickItemPrivate::data_count, QQuickItemPrivate::data_at, UCBottomEdgePrivate::overload_data_clear); } void UCBottomEdgePrivate::overload_data_append(QQmlListProperty *data, QObject *object) { QQuickItemPrivate::data_append(data, object); // if the object is a region, add to the regions as well UCBottomEdgeRegion *region = qobject_cast(object); if (region) { UCBottomEdgePrivate *bottomEdge = UCBottomEdgePrivate::get(static_cast(data->object)); bottomEdge->appendRegion(region); } } void UCBottomEdgePrivate::overload_data_clear(QQmlListProperty *data) { // clear regions as well UCBottomEdgePrivate *bottomEdge = UCBottomEdgePrivate::get(static_cast(data->object)); bottomEdge->clearRegions(false); QQuickItemPrivate::data_clear(data); } // appends a BottomEdgeRegion to the list; clears the default regions before appending the // custom ones void UCBottomEdgePrivate::appendRegion(UCBottomEdgeRegion *region) { Q_Q(UCBottomEdge); Q_ASSERT(region); // the region must be owned by other non-BottomEdge component, // otherwise we cannot "reuse" the region if (region->parent() != q && qobject_cast(region->parent())) { qmlInfo(q) << "Cannot reuse region owned by other BottomEdge components"; return; } // make sure we own the region! QQml_setParent_noEvent(region, q); // take ownership! QQmlEngine::setObjectOwnership(region, QQmlEngine::CppOwnership); UCBottomEdgeRegionPrivate::get(region)->attachToBottomEdge(q); if (!defaultRegionsReset) { defaultRegionsReset = true; regions.clear(); } // validate the region before we append validateRegion(region); // append region definition regions.append(region); LOG << "region added:" << region; } // clears the custom regions list and restores the default ones void UCBottomEdgePrivate::clearRegions(bool destroy) { if (!defaultRegionsReset) { return; } if (destroy) { qDeleteAll(regions); } regions.clear(); defaultRegionsReset = false; regions.append(defaultRegion); LOG << "regions cleared, default restored"; } // validates an added region void UCBottomEdgePrivate::validateRegion(UCBottomEdgeRegion *region, int regionsSize) { // we should not validate unti the bottom edge is not completed, // property changes may invalidate the result of the validation // also leave if the region is disabled if (!componentComplete || !UCBottomEdgeRegionPrivate::get(region)->enabled) { return; } Q_Q(UCBottomEdge); // use QRectF to help on finding the intersection QRectF boundingRect = q->boundingRect(); if (boundingRect.isNull()) { boundingRect = QRectF(0, 0, 1, 1); } if (regionsSize < 0 || regionsSize > regions.size()) { regionsSize = regions.size(); } const QRectF regionRect(region->rect(boundingRect)); for (int i = 0; i < regionsSize; ++i) { UCBottomEdgeRegion *stackedRegion = regions[i]; if (region == stackedRegion || !UCBottomEdgeRegionPrivate::get(stackedRegion)->enabled) { continue; } QRectF rect(stackedRegion->rect(boundingRect)); if (rect.contains(regionRect)) { qmlInfo(region) << QString("Region at index %1 contains this region. This region will never activate.").arg(i); } else { QRectF intersect = regionRect.intersected(stackedRegion->rect(boundingRect)); if (!intersect.isNull()) { qmlInfo(region) << QString("Region intersects the one from index %1 having from: %2 and to: %3") .arg(i) .arg(UCBottomEdgeRegionPrivate::get(stackedRegion)->from) .arg(UCBottomEdgeRegionPrivate::get(stackedRegion)->to); } } } } // update status, drag direction and activeRegion during drag void UCBottomEdgePrivate::updateProgressionStates(qreal distance) { Q_Q(UCBottomEdge); // refresh drag progress setDragProgress(distance / q->height()); detectDirection(distance); if (isLocked()) { // there is an operation ongoing, do not update drag and activeRegion return; } if (distance >= bottomPanel->m_revealThreshold) { // the content can be revealed setStatus(UCBottomEdge::Revealed); } // go through the regions and spot the active region UCBottomEdgeRegion *newActive = Q_NULLPTR; Q_FOREACH(UCBottomEdgeRegion *region, regions) { if (region->contains(dragProgress)) { newActive = region; break; } } // if no active region is found, use the default one if (!newActive) { LOG << "no active region found, fall back to the default"; newActive = defaultRegion; } if (newActive != activeRegion) { setActiveRegion(newActive); } } // set the active region bool UCBottomEdgePrivate::setActiveRegion(UCBottomEdgeRegion *region) { if (activeRegion == region) { return false; } if (activeRegion) { activeRegion->exit(); } activeRegion = region; if (activeRegion) { activeRegion->enter(); } Q_EMIT q_func()->activeRegionChanged(activeRegion); return true; } // updates the dragDirection property void UCBottomEdgePrivate::detectDirection(qreal currentDistance) { if (!previousDistance) { previousDistance = currentDistance; } UCBottomEdge::DragDirection newDirection = dragDirection; qreal delta = previousDistance - currentDistance; bool deltaPassed = abs(delta) >= qApp->styleHints()->startDragDistance(); if (!deltaPassed) { return; } previousDistance = currentDistance; newDirection = (delta < 0) ? UCBottomEdge::Upwards : UCBottomEdge::Downwards; setDragDirection(newDirection); } // internal dragDirection property setter void UCBottomEdgePrivate::setDragDirection(UCBottomEdge::DragDirection direction) { if (dragDirection != direction) { dragDirection = direction; switch (dragDirection) { case UCBottomEdge::Undefined: LOG << "direction: Undefined"; break; case UCBottomEdge::Upwards: LOG << "direction: Upwards"; break; case UCBottomEdge::Downwards: LOG << "direction: Downwards"; break; } Q_EMIT q_func()->dragDirectionChanged(dragDirection); } } // proceed with drag completion action void UCBottomEdgePrivate::onDragEnded() { // collapse if we drag downwards, or not in any active region and we did not pass 30% of the BottomEdge height LOG << "direction:" << dragDirection << ", activeRegion?" << activeRegion << ", dragProgress:" << dragProgress; if (dragDirection == UCBottomEdge::Downwards || (activeRegion && !activeRegion->canCommit(dragProgress))) { q_func()->collapse(); } else { UCBottomEdgeRegion *region = activeRegion ? activeRegion : defaultRegion; if (region->canCommit(dragProgress)) { Q_EMIT region->dragEnded(); commit(UCBottomEdgeRegionPrivate::get(region)->to); } } } void UCBottomEdgePrivate::commit(qreal to) { if (operationStatus == CommitToTop || operationStatus == CommitToRegion || status == UCBottomEdge::Committed) { LOG << "redundant commit call"; return; } Q_Q(UCBottomEdge); setOperationStatus(qFuzzyCompare(to, 1.0) ? CommitToTop : CommitToRegion); if (operationStatus == CommitToTop) { LOG << "emit commitStarted()"; Q_EMIT q->commitStarted(); } // make sure the status is set to revealed first bool animated = bottomPanel && bottomPanel->m_panelAnimation; if (animated) { QObject::connect(bottomPanel->m_panelAnimation, &QQuickAbstractAnimation::runningChanged, q, &UCBottomEdge::unlockOperation, Qt::UniqueConnection); } // make sure the setStatus is set to Revealed first if (status == UCBottomEdge::Hidden) { setStatus(UCBottomEdge::Revealed); } setDragProgress(to); if (!animated) { q->unlockOperation(false); } } // common handler to complete the operations void UCBottomEdge::unlockOperation(bool running) { if (running) { return; } Q_D(UCBottomEdge); if (d->bottomPanel && d->bottomPanel->m_panelAnimation) { disconnect(d->bottomPanel->m_panelAnimation, &QQuickAbstractAnimation::runningChanged, 0, 0); } UCBottomEdgePrivate::OperationStatus oldStatus = d->operationStatus; switch (d->operationStatus) { case UCBottomEdgePrivate::CommitToTop: case UCBottomEdgePrivate::CommitToRegion: d->setStatus(UCBottomEdge::Committed); d->patchContentItemHeader(); if (d->operationStatus == UCBottomEdgePrivate::CommitToTop) { LOG << "emit commitCompleted()"; Q_EMIT commitCompleted(); } break; case UCBottomEdgePrivate::Collapsing: // no active region when collapsed! d->setActiveRegion(nullptr); d->setStatus(UCBottomEdge::Hidden); Q_EMIT collapseCompleted(); break; default: break; } // the operation status may got changed due to a new operation being // initiated from the previosu one (e.g.collapse from commitCompleted, etc if (oldStatus == d->operationStatus) { d->setDragDirection(Undefined); d->setOperationStatus(UCBottomEdgePrivate::Idle); } } // positions the bottom edge panel holding the content to the given height percentage void UCBottomEdgePrivate::setDragProgress(qreal position) { if (dragProgress == position || (position < 0.0) || position > 1.0) { return; } dragProgress = position; Q_EMIT q_func()->dragProgressChanged(dragProgress); } // separated in a derived class to ease testing UCCollapseAction::UCCollapseAction(QObject *parent) : UCAction(parent) { QQmlEngine::setObjectOwnership(this, QQmlEngine::objectOwnership(parent)); } void UCCollapseAction::activate() { setIconName("down"); } // inject collapse action into the content if the content has a PageHeader void UCBottomEdgePrivate::patchContentItemHeader() { // ugly, as it can be, as we don't have the PageHeader in cpp to detect the type UCHeader *header = currentContentItem ? currentContentItem->findChild() : Q_NULLPTR; if (!header || !QuickUtils::inherits(header, "PageHeader")) { return; } LOG << "PATCH HEADER" << currentContentItem.data(); // get the navigationActions and inject an action there QVariant list(header->property("navigationActions")); QQmlListProperty actions = list.value< QQmlListProperty >(); QList *navigationActions = reinterpret_cast*>(actions.data); // do we have any action in the list? if (navigationActions->size()) { // we have actions in the list, check if those are ours UCCollapseAction *collapse = qobject_cast(navigationActions->at(0)); if (!collapse) { // not ours, clear the list navigationActions->clear(); } } if (navigationActions->size() <= 0) { // no actions, patch navigationActions->append(new UCCollapseAction(header)); // invoke PageHeader.navigationActionsChanged signal int signal = header->metaObject()->indexOfSignal("navigationActionsChanged()"); if (signal >= 0) { header->metaObject()->invokeMethod(header, "navigationActionsChanged"); } } // are we committed? if (status == UCBottomEdge::Committed) { // activate the action UCCollapseAction *collapse = qobject_cast(navigationActions->at(0)); Q_ASSERT(collapse); collapse->activate(); QObject::connect(collapse, &UCAction::triggered, q_func(), &UCBottomEdge::collapse, Qt::DirectConnection); } } bool UCBottomEdgePrivate::loadStyleItem(bool animated) { // fix styleVersion if (!styleVersion) { styleVersion = BUILD_VERSION(1, 3); } bool result = UCStyledItemBasePrivate::loadStyleItem(animated); bottomPanel = qobject_cast(styleItem); if (bottomPanel) { // reparent style item to the BottomEdge's parent bottomPanel->setParentItem(parentItem); // bring style item in front bottomPanel->setZ(std::numeric_limits::max()); // anchor to the bottom of the BottomEdge QQuickAnchors *styleAnchors = QQuickItemPrivate::get(bottomPanel)->anchors(); styleAnchors->setBottom(anchors()->bottom()); // move hint under the panel hint->setParentItem(bottomPanel); // and stack it before the panel, so it is covered by the panel when revealed hint->stackBefore(bottomPanel->m_panel); } return result; } // make sure the bottom edge panel is always the last one void UCBottomEdgePrivate::itemChildAdded(QQuickItem *item, QQuickItem *) { // make sure the BottomEdge's panel is the last one QQuickItem *last = item->childItems().last(); if (bottomPanel && last != bottomPanel) { bottomPanel->stackAfter(last); } } // remove this to be change listener from the previous parent void UCBottomEdgePrivate::itemChildRemoved(QQuickItem *item, QQuickItem *child) { Q_Q(UCBottomEdge); if (child == q) { QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Children); } } void UCBottomEdgePrivate::setOperationStatus(OperationStatus s) { operationStatus = s; switch (s) { case Idle: LOG << "OP" << "Idle"; break; case CommitToTop: LOG << "OP" << "CommitToTop"; break; case CommitToRegion: LOG << "OP" << "CommitToRegion"; break; case Collapsing: LOG << "OP" << "Collapsing"; break; } } /*! * \qmltype BottomEdge * \instantiates UCBottomEdge * \inqmlmodule Ubuntu.Components 1.3 * \inherits StyledItem * \ingroup ubuntu * \since Ubuntu.Components 1.3 * \brief A component to handle bottom edge gesture and content. * * The component provides bottom edge content handling. The bottom egde feature * is typically composed of a hint and some content. The contentUrl is committed * (i.e. fully shown) when the drag is completed after it has been dragged for * a certain amount, that is 30% of the height of the BottomEdge. The contentUrl * can be anything, defined by \l contentUrl or \l contentComponent. * * As the name suggests, the component automatically anchors to the bottom of its * parent and takes the width of the parent. The drag is detected within the parent * area, and the height drives till what extent the bottom edge content should be * exposed on \l commit call. The content is centered into a panel which is dragged from * the bottom of the BottomEdge. The content must specify its width and height. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * * MainView { * width: units.gu(40) * height: units.gu(70) * * Page { * id: page * title: "BottomEdge" * * BottomEdge { * height: parent.height - units.gu(20) * hint.text: "My bottom edge" * contentComponent: Rectangle { * width: page.width * height: page.height * color: UbuntuColors.green * } * } * } * } * \endqml * * \note The content is specified either through \l contentUrl or \l contentComponent, * where \l contentComponent has precedence over \l contentUrl. * * There can be situations when the content depends on the progress of the drag. * There are two possibilities to follow this, depending on the use case. The * \l dragProgress provides live updates about the fraction of the drag. * \qml * BottomEdge { * id: bottomEdge * height: parent.height * hint.text: "progression" * contentComponent: Rectangle { * width: bottomEdge.width * height: bottomEdge.height * color: Qt.rgba(0.5, 1, bottomEdge.dragProgress, 1); * } * } * \endqml * * The other use case is when the content needs to be completely different in certain * regions of the area. These regions can be defined through BottomEdgeRegion elements * listed in the \l regions property. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * * MainView { * width: units.gu(40) * height: units.gu(70) * * Page { * title: "BottomEdge" * * BottomEdge { * id: bottomEdge * height: parent.height - units.gu(20) * hint.text: "My bottom edge" * contentComponent: Rectangle { * width: bottomEdge.width * height: bottomEdge.height * color: bottomEdge.activeRegion ? * bottomEdge.activeRegion.color : UbuntuColors.green * } * regions: [ * BottomEdgeRegion { * from: 0.4 * to: 0.6 * property color color: UbuntuColors.red * }, * BottomEdgeRegion { * from: 0.6 * to: 1.0 * property color color: UbuntuColors.silk * } * ] * } * } * } * \endqml * \note Custom regions override the default declared ones. Therefore there must * be one region which has its \l {BottomEdgeRegion::to}{to} limit set to 1.0 * otherwise the content will not be committed at all. * \note Regions can also be declared as child elements the same way as resources. * * The BottomEdge takes ownership over the custom BottomEdgeRegions, therefore * we cannot 'reuse' regions declared in other BottomEdge components, as those * will be destroyed together with the reusing BottomEdge component. The following * scenario only works if the \e customRegion is not used in any other regions. * \qml * Page { * BottomEdge { * id: bottomEdge * hint.text: "reusing regions" * // put your content and setup here * * regions: [customRegion] * } * * BottomEdgeRegion { * id: customRegion * from: 0.2 * } * } * \endqml * \sa BottomEdgeRegion * * \section2 Page As Content * BottomEdge accepts any component to be set as content. Also it can detect * whether the content has a PageHeader component declared, and will inject a * collapse navigation action automatically. In case the content has no header, * the collapse must be provided by the content itself by calling the \l collapse * function. * \qml * BottomEdge { * id: bottomEdge * height: parent.height * hint.text: "Sample collapse" * contentComponent: Rectangle { * width: bottomEdge.width * height: bottomEdge.height * color: Qt.rgba(0.5, 1, bottomEdge.dragProgress, 1); * Button { * text: "Collapse" * onClicked: bottomEdge.collapse() * } * } * } * \endqml * Alternatively you can put a PageHeader component in your custom content * as follows: * \qml * BottomEdge { * id: bottomEdge * height: parent.height * hint.text: "Injected collapse" * contentComponent: Rectangle { * width: bottomEdge.width * height: bottomEdge.height * color: Qt.rgba(0.5, 1, bottomEdge.dragProgress, 1); * PageHeader { * title: "Fancy content" * } * } * } * \endqml * * \section2 Styling * Similar to the other components the default style is expected to be defined * in the theme's \e BottomEdgeStyle. However the style is not parented to the * BottomEdge itself, but to the BottomEdge's parent item. When loaded, the style * does not fill the parent but its bottom anchor is set to the bottom of the * BottomEdge. Beside this the hint is also parented to the style instance. Custom * styles are expected to implement the BottomEgdeStyle API. */ /*! * \qmlsignal BottomEdge::commitStarted() * Signal emitted when the content commit is started. */ /*! * \qmlsignal BottomEdge::commitCompleted() * Signal emitted when the content commit is completed. */ /*! * \qmlsignal BottomEdge::collapseStarted() * Signal emitted when the content collapse is started. */ /*! * \qmlsignal BottomEdge::collapseCompleted() * Signal emitted when the content collapse is completed. */ UCBottomEdge::UCBottomEdge(QQuickItem *parent) : UCStyledItemBase(*(new UCBottomEdgePrivate), parent) { Q_D(UCBottomEdge); d->init(); } UCBottomEdge::~UCBottomEdge() { } void UCBottomEdge::initializeComponent() { Q_D(UCBottomEdge); // initialize hint d->hint->setParentItem(this); d->hint->init(); // hint click() always commits connect(d->hint, SIGNAL(clicked()), this, SLOT(commit()), Qt::DirectConnection); // follow drag progress connect(d->hint->swipeArea(), &UCSwipeArea::distanceChanged, [=](qreal distance) { d->updateProgressionStates(distance); }); // follow swipe end connect(d->hint->swipeArea(), &UCSwipeArea::draggingChanged, [=](bool dragging) { if (!dragging) { d->onDragEnded(); } }); // filter hint for mouse events d->hint->installEventFilter(this); } void UCBottomEdge::onParentHeightChanged() { Q_D(UCBottomEdge); if (d->parentItem) { setImplicitHeight(d->parentItem->height()); } } void UCBottomEdge::classBegin() { UCStyledItemBase::classBegin(); initializeComponent(); } void UCBottomEdgePrivate::completeComponentInitialization() { UCStyledItemBasePrivate::completeComponentInitialization(); Q_Q(UCBottomEdge); // fix the hint's style version as that has no qmlContext of its own // and thus import version check will fail; setting the context for // the hint using this component's hint won't work either as this // component's context does not contain the properties from the hint. UCBottomEdgeHintPrivate *hintPrivate = UCBottomEdgeHintPrivate::get(hint); hintPrivate->styleVersion = styleVersion; // also set the qml data as hint does not have that either QQmlData::get(hint, true); QQmlEngine::setContextForObject(hint, new QQmlContext(qmlContext(q), hint)); // finally complete hint creation hintPrivate->completeComponentInitialization(); // and validate regions, leave out the first one as that supposed to be added first // mimic the top limit of the regions list like we would add them one by one for (int i = 1; i < regions.size(); ++i) { UCBottomEdgeRegion *region = regions[i]; validateRegion(region, i); } } void UCBottomEdge::itemChange(ItemChange change, const ItemChangeData &data) { if (change == ItemParentHasChanged) { Q_D(UCBottomEdge); // disconnect from old parent if (d->oldParentItem) { disconnect(d->oldParentItem, &QQuickItem::heightChanged, this, &UCBottomEdge::onParentHeightChanged); } QQuickAnchors *anchors = QQuickItemPrivate::get(this)->anchors(); if (data.item) { const QQuickAnchorLine left = QQuickItemPrivate::get(data.item)->left(); const QQuickAnchorLine right = QQuickItemPrivate::get(data.item)->right(); const QQuickAnchorLine bottom = QQuickItemPrivate::get(data.item)->bottom(); anchors->setLeft(left); anchors->setRight(right); anchors->setBottom(bottom); QQuickItemPrivate::get(data.item)->addItemChangeListener(d, QQuickItemPrivate::Children); // follow implicitHeight connect(data.item, &QQuickItem::heightChanged, this, &UCBottomEdge::onParentHeightChanged); onParentHeightChanged(); } else { anchors->resetLeft(); anchors->resetRight(); anchors->resetBottom(); } if (d->bottomPanel) { d->bottomPanel->setParentItem(data.item); } } UCStyledItemBase::itemChange(change, data); } bool UCBottomEdge::eventFilter(QObject *target, QEvent *event) { Q_D(UCBottomEdge); switch (event->type()) { case QEvent::MouseButtonPress: { QMouseEvent *mouse = static_cast(event); d->mousePressed = d->hint->contains(mouse->localPos()); LOG << "drag with mouse"; break; } case QEvent::MouseButtonRelease: if (d->mousePressed) { d->onDragEnded(); } d->mousePressed = false; break; case QEvent::MouseMove: { if (d->mousePressed) { QMouseEvent *mouse = static_cast(event); qreal mouseItemY = mapFromScene(mouse->windowPos()).y(); qreal distance = abs(height() - mouseItemY); d->updateProgressionStates(distance); } break; } case QEvent::KeyPress: { QKeyEvent *keyPress = static_cast(event); switch (keyPress->key()) { case Qt::Key_Escape: collapse(); default: break; } } default: break; } return UCStyledItemBase::eventFilter(target, event); } /*! * \qmlproperty BottomEdgeHint BottomEdge::hint * The property holds the component to display the hint for the bottom edge element. */ UCBottomEdgeHint *UCBottomEdge::hint() const { Q_D(const UCBottomEdge); return d->hint; } /*! * \qmlproperty real BottomEdge::dragProgress * \readonly * The property specifies the proggress of the drag within [0..1] interval. */ qreal UCBottomEdge::dragProgress() { Q_D(UCBottomEdge); return d->dragProgress; } /*! * \qmlproperty DragDirection BottomEdge::dragDirection * \readonly * The property reports the current direction of the drag. The direction is flipped * when the drag passes the drag threshold. * \table * \header * \li DragDirection * \li Description * \row * \li Undefined * \li Default. The drag is not performed or the direction is not detected. * \row * \li Upwards * \li The drag is performed from bottom up or it passed the drag threshold from * from the last point the drag was going downwards. * \row * \li Downwards * \li The drag is performed from up to bottom or it passed the drag threshold from * from the last point the drag was going upwards. * \endtable * * Defaults to \e Undefined */ UCBottomEdge::DragDirection UCBottomEdge::dragDirection() const { Q_D(const UCBottomEdge); return d->dragDirection; } /*! * \qmlproperty Status BottomEdge::status * \readonly * The property reports the actual state of the bottom edge. It can have the * following values: * \table * \header * \li Status * \li Description * \row * \li Hidden * \li The bottom edge is hidden. This does not contain the hint states. * \row * \li Revealed * \li The Bottom edge content is revealed. The state can be reached only if the * \l hint is in "Active" state. * \row * \li Committed * \li The bottom edge content is fully exposed. * \endtable * \note Once \e Commited status is set, no further draging is possible on the content. */ UCBottomEdge::Status UCBottomEdge::status() const { Q_D(const UCBottomEdge); return d->status; } void UCBottomEdgePrivate::setStatus(UCBottomEdge::Status status) { if (status == this->status) { return; } this->status = status; // logging switch (status) { case UCBottomEdge::Hidden: LOG << "STATUS" << "Hidden"; break; case UCBottomEdge::Revealed: LOG << "STATUS" << "Revealed"; break; case UCBottomEdge::Committed: LOG << "STATUS" << "Committed"; break; } if (bottomPanel) { bottomPanel->setConsumeMouse(status > UCBottomEdge::Hidden); } Q_EMIT q_func()->statusChanged(this->status); // show content if (status > UCBottomEdge::Hidden) { setCurrentContent(); } else { resetCurrentContent(nullptr); } } /*! * \qmlproperty url BottomEdge::contentUrl * The property holds the url to the document defining the content of the bottom * edge. The property behaves the same way as Loader's \e source property. */ QUrl UCBottomEdge::contentUrl() const { Q_D(const UCBottomEdge); return d->defaultRegion->url(); } void UCBottomEdge::setContent(const QUrl &url) { Q_D(UCBottomEdge); d->defaultRegion->setUrl(url); } /*! * \qmlproperty Component BottomEdge::contentComponent * The property holds the component defining the content of the bottom edge. The * property behaves the same way as Loader's \e sourceComponent property. */ QQmlComponent *UCBottomEdge::contentComponent() const { Q_D(const UCBottomEdge); return d->defaultRegion->component(); } void UCBottomEdge::setContentComponent(QQmlComponent *component) { Q_D(UCBottomEdge); d->defaultRegion->setComponent(component); } /*! * \qmlproperty Item BottomEdge::contentItem * \readonly * The property holds the item created either from \l contentUrl or \l contentComponent * properties. */ QQuickItem *UCBottomEdge::contentItem() const { Q_D(const UCBottomEdge); return d->currentContentItem.data(); } /*! * \qmlmethod void BottomEdge::commit() * The function forces the bottom edge content to be fully exposed. Emits * \l commitStarted and \l commitCompleted signals to notify the start and the * completion of the commit operation. It is safe to call commit() multiple times. */ void UCBottomEdge::commit() { Q_D(UCBottomEdge); // make sure that teh default region's content is loaded! if (!d->activeRegion || d->activeRegion == d->defaultRegion) { // make sure teh default is the active region d->setActiveRegion(d->defaultRegion); } d->commit(1.0); } /*! * \qmlmethod void BottomEdge::collapse() * The function forces the bottom edge content to be hidden. Emits \l collapseStarted * and \l collapseCompleted signals to notify the start and the completion of the * collapse operation. */ void UCBottomEdge::collapse() { Q_D(UCBottomEdge); if (d->operationStatus == UCBottomEdgePrivate::Collapsing || d->status == UCBottomEdge::Hidden) { LOG << "redundant collapse call"; return; } d->setOperationStatus(UCBottomEdgePrivate::Collapsing); Q_EMIT collapseStarted(); bool animated = d->bottomPanel && d->bottomPanel->m_panelAnimation; if (animated) { connect(d->bottomPanel->m_panelAnimation, &QQuickAbstractAnimation::runningChanged, this, &UCBottomEdge::unlockOperation, Qt::UniqueConnection); } // set the setStatus first to Revealed if (d->status == UCBottomEdge::Committed) { d->setStatus(Revealed); } d->setDragProgress(0.0); if (!animated) { unlockOperation(false); } } /*! * \qmlproperty list BottomEdge::regions * The property holds the custom regions configured for the BottomEdge. The default * configuration contains one region, which commits the content when reached. The * defaults can be restored by setting an empty list to the property or by * calling regions.clear(). * See \l BottomEdgeRegion. */ QQmlListProperty UCBottomEdge::regions() { Q_D(UCBottomEdge); return QQmlListProperty(this, &d->regions, regions_append, regions_count, regions_at, regions_clear); } void UCBottomEdge::regions_append(QQmlListProperty *regions, UCBottomEdgeRegion *region) { UCBottomEdgePrivate *bottomEdge = UCBottomEdgePrivate::get(static_cast(regions->object)); bottomEdge->appendRegion(region); } int UCBottomEdge::regions_count(QQmlListProperty *regions) { UCBottomEdgePrivate *bottomEdge = UCBottomEdgePrivate::get(static_cast(regions->object)); return bottomEdge->regions.size(); } UCBottomEdgeRegion *UCBottomEdge::regions_at(QQmlListProperty *regions, int index) { UCBottomEdgePrivate *bottomEdge = UCBottomEdgePrivate::get(static_cast(regions->object)); Q_ASSERT((index >= 0) && (index < bottomEdge->regions.size())); return bottomEdge->regions.at(index); } void UCBottomEdge::regions_clear(QQmlListProperty *regions) { UCBottomEdgePrivate *bottomEdge = UCBottomEdgePrivate::get(static_cast(regions->object)); bottomEdge->clearRegions(true); } /*! * \qmlproperty BottomEdgeRegion BottomEdge::activeRegion * \readonly * Specifies the current active region. */ UCBottomEdgeRegion *UCBottomEdge::activeRegion() { Q_D(UCBottomEdge); return d->activeRegion; } /*! * \qmlproperty bool BottomEdge::preloadContent * If set, all the contents set in the component and in regions will be loaded * in the background, so it will be available before it is revealed. */ bool UCBottomEdge::preloadContent() const { return d_func()->preloadContent; } void UCBottomEdge::setPreloadContent(bool value) { Q_D(UCBottomEdge); if (d->preloadContent == value) { return; } d->preloadContent = value; if (d->preloadContent) { // we load all region's content, but we skip teh default one, // as default one is always preloaded for (int i = 0; i < d->regions.size(); i++) { UCBottomEdgeRegion *region = d->regions[i]; UCBottomEdgeRegionPrivate::get(region)->loadRegionContent(); } } else { // discard all inactive regions content, except default one for (int i = 0; i < d->regions.size(); i++) { UCBottomEdgeRegion *region = d->regions[i]; if (region != d->activeRegion) { UCBottomEdgeRegionPrivate::get(region)->discardRegionContent(); } } } Q_EMIT preloadContentChanged(); } /* * Set the current content. The content is taken from the region if active, or foced * is set. If the region has no item, the logic falls back to use the default region's * content. */ void UCBottomEdgePrivate::setCurrentContent() { QQuickItem *newContent = nullptr; if (activeRegion) { newContent = UCBottomEdgeRegionPrivate::get(activeRegion)->contentItem; LOG << "ACTIVE REGION CONTENT" << activeRegion->objectName() << newContent; } if (!newContent) { newContent = UCBottomEdgeRegionPrivate::get(defaultRegion)->contentItem; LOG << "USING DEFAULT" << newContent; } resetCurrentContent(newContent); } /* * Set the content to the default region one. */ void UCBottomEdgePrivate::resetCurrentContent(QQuickItem *newContent) { if (newContent == currentContentItem) { // same content, no need to reset to return; } if (currentContentItem) { // detach current content, the content will be deleted by the exiting region currentContentItem->setVisible(false); currentContentItem->setParentItem(nullptr); } if (!newContent) { // try to use the default one newContent = UCBottomEdgeRegionPrivate::get(defaultRegion)->contentItem; } // if it is still null, leave - we may not have default content at all! if (!newContent) { return; } LOG << "RESET CONTENT TO" << newContent; currentContentItem = newContent; currentContentItem->setParentItem(bottomPanel->m_panel); QQuickAnchors *anchors = QQuickItemPrivate::get(currentContentItem.data())->anchors(); anchors->setHorizontalCenter(QQuickItemPrivate::get(bottomPanel->m_panel)->horizontalCenter()); currentContentItem->setVisible(true); Q_EMIT q_func()->contentItemChanged(); patchContentItemHeader(); } #include "moc_ucbottomedge.cpp" ./src/Ubuntu/Components/plugin/statesaverbackend_p.h0000644000015600001650000000420212700370701022745 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef STATESAVERBACKEND_P_H #define STATESAVERBACKEND_P_H #include #include #include #include #include #include class StateSaverBackend : public QObject { Q_OBJECT public: ~StateSaverBackend(); // FIXME: with multiple engines/views in an application, we must provide // separate SatteSaver backends per engine! This must be refactored! static StateSaverBackend *instance(QObject *parent = Q_NULLPTR) { if (!m_instance) { Q_ASSERT(parent); m_instance = new StateSaverBackend(parent); } return m_instance; } bool enabled() const; void setEnabled(bool enabled); bool registerId(const QString &id); void removeId(const QString &id); int load(const QString &id, QObject *item, const QStringList &properties); int save(const QString &id, QObject *item, const QStringList &properties); public Q_SLOTS: bool reset(); Q_SIGNALS: void enabledChanged(bool enabled); void initiateStateSaving(); protected: explicit StateSaverBackend(QObject *parent = 0); private Q_SLOTS: void initialize(); void cleanup(); void signalHandler(int type); private: QPointer m_archive; QSet m_register; QStack m_groupStack; bool m_globalEnabled; static StateSaverBackend *m_instance; }; #endif // STATESAVERBACKEND_P_H ./src/Ubuntu/Components/plugin/ucmainviewbase.cpp0000644000015600001650000002206712700370701022303 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "ucmainviewbase.h" #include "ucmainviewbase_p.h" #include "ucnamespace.h" #include "ucactionmanager.h" #include "ucactioncontext.h" #include "ucapplication.h" #include "uctheme.h" #include "i18n.h" #include #include /*! \internal \qmlabstract MainViewBase \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu \brief The base class for MainView and MultiColumnView. */ UCMainViewBasePrivate::UCMainViewBasePrivate() : m_actionManager(nullptr), m_actionContext(nullptr), m_flags(0), m_anchorToKeyboard(false) { } void UCMainViewBasePrivate::init() { Q_Q(UCMainViewBase); //need to init here because the q pointer is null in constructor m_actionManager = new UCActionManager(q); m_actionContext = new UCPopupContext(q); m_actionContext->setObjectName(QStringLiteral("RootContext")); m_actionContext->setActive(true); q->setActive(true); QObject::connect(m_actionManager,&UCActionManager::quit, [](){ // FIXME Wire this up to the application lifecycle management API instead of quit(). qApp->quit(); }); QObject::connect(q, SIGNAL(windowChanged(QQuickWindow*)), q, SLOT(_q_updateWindow())); } void UCMainViewBasePrivate::_q_headerColorBinding(const QColor &col) { Q_Q(UCMainViewBase); if (m_headerColor == col) return; m_headerColor = col; Q_EMIT q->headerColorChanged(col); } void UCMainViewBasePrivate::_q_footerColorBinding(const QColor &col) { Q_Q(UCMainViewBase); if (m_footerColor == col) return; m_footerColor = col; Q_EMIT q->footerColorChanged(col); } void UCMainViewBasePrivate::doAutoTheme() { Q_Q(UCMainViewBase); UCTheme *theme = q->getTheme(); if (!theme) return; if (m_backgroundColor != theme->getPaletteColor("normal", "background")) { QString themeName = UbuntuToolkit::ColorUtils::luminance(m_backgroundColor) >= 0.85 ? QStringLiteral("Ambiance") : QStringLiteral("SuruDark"); // only change the theme if the current one is a system one. if (theme->name().startsWith(QStringLiteral("Ubuntu.Components.Themes"))) { q->getTheme()->setName(QString(QStringLiteral("Ubuntu.Components.Themes.%1")).arg(themeName)); } } } UCMainViewBase::UCMainViewBase(QQuickItem *parent) : UCPageTreeNode(*(new UCMainViewBasePrivate), parent) { d_func()->init(); } void UCMainViewBasePrivate::_q_updateWindow() { Q_Q(UCMainViewBase); if (q->window()) { q->window()->setColor(m_backgroundColor); } } UCMainViewBase::UCMainViewBase(UCMainViewBasePrivate &dd, QQuickItem *parent) : UCPageTreeNode( dd, parent) { d_func()->init(); } /*! \qmlproperty string MainView::applicationName The property holds the application's name, which must be the same as the desktop file's name. The name also sets the name of the QCoreApplication and defaults for data and cache folders that work on the desktop and under confinement, as well as the default gettext domain. C++ code that writes files may use QStandardPaths::writableLocation with QStandardPaths::DataLocation or QStandardPaths::CacheLocation. */ QString UCMainViewBase::applicationName() const { return d_func()->m_applicationName; } void UCMainViewBase::setApplicationName(QString applicationName) { Q_D(UCMainViewBase); if (d->m_applicationName == applicationName) return; d->m_applicationName = applicationName; if (applicationName != "") { UbuntuI18n::instance()->setDomain(applicationName); UCApplication::instance()->setApplicationName(applicationName); } Q_EMIT applicationNameChanged(applicationName); } /*! \qmlproperty bool MainView::anchorToKeyboard The property holds if the application should automatically resize the contents when the input method appears The default value is false. */ bool UCMainViewBase::anchorToKeyboard() const { return d_func()->m_anchorToKeyboard; } void UCMainViewBase::setAnchorToKeyboard(bool anchorToKeyboard) { Q_D(UCMainViewBase); if (d->m_anchorToKeyboard == anchorToKeyboard) return; d->m_anchorToKeyboard = anchorToKeyboard; Q_EMIT anchorToKeyboardChanged(anchorToKeyboard); } // deprecated QColor UCMainViewBase::headerColor() const { return d_func()->m_headerColor; } void UCMainViewBase::setHeaderColor(QColor headerColor) { Q_D(UCMainViewBase); // MainViewStyle is used to draw the gradient background. if (d->styleName().isEmpty()) { d->setStyleName(QStringLiteral("MainViewStyle")); } //disable binding to background color d->m_flags |= UCMainViewBasePrivate::CustomHeaderColor; d->_q_headerColorBinding(headerColor); UC_QML_DEPRECATION_WARNING("MainView.headerColor is deprecated in Ubuntu.Components 1.3.") } /*! \qmlproperty color MainView::backgroundColor Color of the background. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { width: units.gu(40) height: units.gu(60) backgroundColor: UbuntuColors.blue } \endqml */ QColor UCMainViewBase::backgroundColor() const { return d_func()->m_backgroundColor; } void UCMainViewBase::setBackgroundColor(QColor backgroundColor) { Q_D(UCMainViewBase); if (d->m_backgroundColor == backgroundColor) return; d->m_backgroundColor = backgroundColor; Q_EMIT backgroundColorChanged(backgroundColor); if (!(d->m_flags & UCMainViewBasePrivate::CustomHeaderColor)) d->_q_headerColorBinding(d->m_backgroundColor); if (!(d->m_flags & UCMainViewBasePrivate::CustomFooterColor)) d->_q_footerColorBinding(d->m_backgroundColor); d->_q_updateWindow(); // FIXME: Define the background colors in MainViewStyle and get rid of the properties // in MainViewBase. That removes the need for auto-theming. d->doAutoTheme(); } // deprecated QColor UCMainViewBase::footerColor() const { return d_func()->m_footerColor; } void UCMainViewBase::setFooterColor(QColor footerColor) { Q_D(UCMainViewBase); // MainViewStyle is used to draw the gradient background. if (d->styleName().isEmpty()) { d->setStyleName(QStringLiteral("MainViewStyle")); } //disable binding to background color d->m_flags |= UCMainViewBasePrivate::CustomFooterColor; d->_q_footerColorBinding(footerColor); UC_QML_DEPRECATION_WARNING("MainView.footerColor is deprecated in Ubuntu.Components 1.3.") } /*! \qmlproperty list MainView::actions \readonly \deprecated A global list of actions that will be available to the system (including HUD) as long as the application is running. For actions that are not always available to the system, but only when a certain \l Page is active, see the actions property of \l Page. */ QQmlListProperty UCMainViewBase::actions() const { return d_func()->m_actionManager->actions(); } /*! \qmlproperty ActionManager MainView::actionManager \readonly \deprecated The ActionManager that supervises the global and local ActionContexts. The \l actions property should be used preferably since it covers most use cases. The ActionManager is accessible to have a more refined control over the actions, e.g. if one wants to add/remove actions dynamically, create specific action contexts, etc. */ UCActionManager *UCMainViewBase::actionManager() const { return d_func()->m_actionManager; } /*! \qmlproperty ActionContext MainView::actionContext \readonly \since Ubuntu.Components 1.3 The action context of the MainView. */ UCPopupContext *UCMainViewBase::actionContext() const { return d_func()->m_actionContext; } void UCMainViewBase::componentComplete() { Q_D(UCMainViewBase); UCPageTreeNode::componentComplete(); d->doAutoTheme(); if (d->m_actionContext) d->m_actionContext->componentComplete(); if (d->m_actionManager) d->m_actionManager->componentComplete(); } void UCMainViewBase::classBegin() { Q_D(UCMainViewBase); UCPageTreeNode::classBegin(); QQmlContext *contextForThis = qmlContext(this); if (d->m_actionManager) { QQmlEngine::setContextForObject(d->m_actionManager, contextForThis); d->m_actionManager->classBegin(); } if (d->m_actionContext) { QQmlEngine::setContextForObject(d->m_actionContext, contextForThis); d->m_actionContext->classBegin(); } } #include "moc_ucmainviewbase.cpp" ./src/Ubuntu/Components/plugin/plugin.pri0000644000015600001650000001441412700370714020610 0ustar jenkinsjenkinsunix { CONFIG += link_pkgconfig PKGCONFIG += gio-2.0 dbus-1 libnih-dbus } QT *= core-private qml qml-private quick quick-private gui-private dbus svg UbuntuGestures UbuntuGestures_private UbuntuToolkit equals(QT_MAJOR_VERSION, 5):lessThan(QT_MINOR_VERSION, 2) { QT += v8-private } CONFIG += no_keywords c++11 # QOrganizer QT *= organizer #comment in the following line to disable traces #DEFINES += QT_NO_DEBUG_OUTPUT DEFINES += QT_USE_QSTRINGBUILDER INCLUDEPATH+=$$PWD HEADERS += $$PWD/plugin.h \ $$PWD/uctheme.h \ $$PWD/i18n.h \ $$PWD/listener.h \ $$PWD/ucscalingimageprovider.h \ $$PWD/ucunits.h \ $$PWD/ucqquickimageextension.h \ $$PWD/quickutils.h \ $$PWD/ucubuntushapetexture.h \ $$PWD/ucubuntushape.h \ $$PWD/ucubuntushapeoverlay.h \ $$PWD/ucproportionalshape.h \ $$PWD/inversemouseareatype.h \ $$PWD/qquickclipboard.h \ $$PWD/qquickmimedata.h \ $$PWD/qquickclipboard_p.h \ $$PWD/ucubuntuanimation.h \ $$PWD/ucfontutils.h \ $$PWD/ucapplication.h \ $$PWD/ucarguments.h \ $$PWD/ucargument.h \ $$PWD/ucalarm.h \ $$PWD/ucalarm_p.h \ $$PWD/alarmmanager_p_p.h \ $$PWD/alarmmanager_p.h \ $$PWD/ucalarmmodel.h \ $$PWD/unitythemeiconprovider.h \ $$PWD/adapters/alarmsadapter_p.h \ $$PWD/ucstatesaver.h \ $$PWD/sortbehavior.h \ $$PWD/filterbehavior.h \ $$PWD/sortfiltermodel.h \ $$PWD/statesaverbackend_p.h \ $$PWD/ucstatesaver_p.h \ $$PWD/ucurihandler.h \ $$PWD/ucinversemouse.h \ $$PWD/ucmouse.h \ $$PWD/unixsignalhandler_p.h \ $$PWD/ucstyleditembase.h \ $$PWD/ucstyleditembase_p.h \ $$PWD/ucaction.h \ $$PWD/ucactioncontext.h \ $$PWD/ucactionmanager.h \ $$PWD/adapters/actionsproxy_p.h \ $$PWD/adapters/dbuspropertywatcher_p.h \ $$PWD/uclistitem.h \ $$PWD/uclistitem_p.h \ $$PWD/uclistitemactions.h \ $$PWD/uclistitemactions_p.h \ $$PWD/propertychange_p.h \ $$PWD/uclistitemstyle.h \ $$PWD/ucserviceproperties.h \ $$PWD/ucserviceproperties_p.h \ $$PWD/privates/listitemdragarea.h \ $$PWD/privates/listitemdraghandler.h \ $$PWD/privates/listitemselection.h \ $$PWD/ucnamespace.h \ $$PWD/ucdeprecatedtheme.h \ $$PWD/ucdefaulttheme.h \ $$PWD/ucstylehints.h \ $$PWD/ucslotslayout.h \ $$PWD/ucslotslayout_p.h \ $$PWD/livetimer.h \ $$PWD/livetimer_p.h \ $$PWD/timeutils_p.h \ $$PWD/ucactionitem.h \ $$PWD/ucactionitem_p.h \ $$PWD/uchaptics.h \ $$PWD/ucabstractbutton.h \ $$PWD/ucabstractbutton_p.h \ $$PWD/ucmargins.h \ $$PWD/ucthemingextension.h \ $$PWD/ucheader.h \ $$PWD/uclabel.h \ $$PWD/uclistitemlayout.h \ $$PWD/privates/threelabelsslot_p.h \ $$PWD/ucimportversionchecker_p.h \ $$PWD/ucbottomedgehint.h \ $$PWD/ucbottomedgehint_p.h \ $$PWD/gestures/ubuntugesturesqmlglobal.h \ $$PWD/ucmathutils.h \ $$PWD/ucbottomedge.h \ $$PWD/ucbottomedge_p.h \ $$PWD/ucbottomedgestyle.h \ $$PWD/ucbottomedgeregion.h \ $$PWD/ucpagetreenode.h \ $$PWD/ucpagetreenode_p.h \ $$PWD/ucmainviewbase.h \ $$PWD/ucmainviewbase_p.h \ $$PWD/ucperformancemonitor.h \ $$PWD/privates/listviewextensions.h \ $$PWD/privates/frame.h \ $$PWD/privates/ucpagewrapper.h \ $$PWD/privates/ucpagewrapper_p.h \ $$PWD/privates/ucpagewrapperincubator_p.h \ $$PWD/privates/appheaderbase.h \ $$PWD/label_p.h \ $$PWD/ucbottomedgeregion_p.h SOURCES += $$PWD/plugin.cpp \ $$PWD/uctheme.cpp \ $$PWD/i18n.cpp \ $$PWD/listener.cpp \ $$PWD/ucscalingimageprovider.cpp \ $$PWD/ucunits.cpp \ $$PWD/ucqquickimageextension.cpp \ $$PWD/quickutils.cpp \ $$PWD/ucubuntushape.cpp \ $$PWD/ucubuntushapeoverlay.cpp \ $$PWD/ucproportionalshape.cpp \ $$PWD/inversemouseareatype.cpp \ $$PWD/qquickclipboard.cpp \ $$PWD/qquickmimedata.cpp \ $$PWD/ucubuntuanimation.cpp \ $$PWD/ucfontutils.cpp \ $$PWD/ucapplication.cpp \ $$PWD/ucarguments.cpp \ $$PWD/ucargument.cpp \ $$PWD/ucalarm.cpp \ $$PWD/alarmmanager_p.cpp \ $$PWD/ucalarmmodel.cpp \ $$PWD/unitythemeiconprovider.cpp \ $$PWD/ucstatesaver.cpp \ $$PWD/sortbehavior.cpp \ $$PWD/filterbehavior.cpp \ $$PWD/sortfiltermodel.cpp \ $$PWD/statesaverbackend_p.cpp \ $$PWD/ucurihandler.cpp \ $$PWD/ucmousefilters.cpp \ $$PWD/unixsignalhandler_p.cpp \ $$PWD/ucstyleditembase.cpp \ $$PWD/ucaction.cpp \ $$PWD/ucactioncontext.cpp \ $$PWD/ucactionmanager.cpp \ $$PWD/adapters/actionsproxy_p.cpp \ $$PWD/adapters/dbuspropertywatcher_p.cpp \ $$PWD/uclistitem.cpp \ $$PWD/uclistitemactions.cpp \ $$PWD/propertychange_p.cpp \ $$PWD/uclistitemstyle.cpp \ $$PWD/ucviewitemsattached.cpp \ $$PWD/ucserviceproperties.cpp \ $$PWD/privates/listitemdragarea.cpp \ $$PWD/privates/listitemdraghandler.cpp \ $$PWD/privates/listitemexpansion.cpp \ $$PWD/privates/listitemselection.cpp \ $$PWD/ucnamespace.cpp \ $$PWD/ucdeprecatedtheme.cpp \ $$PWD/ucdefaulttheme.cpp \ $$PWD/ucstylehints.cpp \ $$PWD/ucslotslayout.cpp \ $$PWD/livetimer.cpp \ $$PWD/livetimer_p.cpp \ $$PWD/ucactionitem.cpp \ $$PWD/uchaptics.cpp \ $$PWD/ucabstractbutton.cpp \ $$PWD/ucthemingextension.cpp \ $$PWD/ucheader.cpp \ $$PWD/uclabel.cpp \ $$PWD/uclistitemlayout.cpp \ $$PWD/privates/threelabelsslot_p.cpp \ $$PWD/ucimportversionchecker_p.cpp \ $$PWD/ucbottomedgehint.cpp \ $$PWD/ucmathutils.cpp \ $$PWD/ucbottomedge.cpp \ $$PWD/ucbottomedgestyle.cpp \ $$PWD/ucbottomedgeregion.cpp \ $$PWD/ucpagetreenode.cpp \ $$PWD/ucmainviewbase.cpp \ $$PWD/ucperformancemonitor.cpp \ $$PWD/privates/listviewextensions.cpp \ $$PWD/privates/frame.cpp \ $$PWD/privates/ucpagewrapper.cpp \ $$PWD/privates/ucpagewrapperincubator.cpp \ $$PWD/privates/appheaderbase.cpp # adapters SOURCES += $$PWD/adapters/alarmsadapter_organizer.cpp RESOURCES += \ $$PWD/plugin.qrc OTHER_FILES += \ $$PWD/shaders/shape.vert \ $$PWD/shaders/shape.frag \ $$PWD/shaders/shape_no_dfdy.frag \ $$PWD/shaders/shapeoverlay.vert \ $$PWD/shaders/shapeoverlay.frag \ $$PWD/shaders/shapeoverlay_no_dfdy.frag \ $$PWD/privates/shaders/frame.vert \ $$PWD/privates/shaders/frame.frag ./src/Ubuntu/Components/plugin/ucthemingextension.h0000644000015600001650000000341712700370701022664 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCITEMEXTENSION_H #define UCITEMEXTENSION_H #include #include #include #include #include class QQuickItem; class UCTheme; class UCThemingExtension { public: enum ThemeType { Inherited, Custom }; explicit UCThemingExtension(QQuickItem *extendedItem); virtual ~UCThemingExtension(); virtual void preThemeChanged() = 0; virtual void postThemeChanged() = 0; virtual void itemThemeChanged(UCTheme *, UCTheme*); virtual void itemThemeReloaded(UCTheme *); UCTheme *getTheme(); void setTheme(UCTheme *newTheme, ThemeType type = Custom); void resetTheme(); static bool isThemed(QQuickItem *item); static QQuickItem *ascendantThemed(QQuickItem *item); private: QPointer theme; QQuickItem *themedItem; ThemeType themeType; void setParentTheme(); }; #define UCThemingExtension_iid "org.qt-project.Qt.UCThemingExtension" Q_DECLARE_INTERFACE(UCThemingExtension, UCThemingExtension_iid) #endif // UCITEMEXTENSION_H ./src/Ubuntu/Components/plugin/uctheme.cpp0000644000015600001650000006325012700370714020736 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: Zsombor Egri * Florian Boucault */ #include "ucnamespace.h" #include "uctheme.h" #include "listener.h" #include "quickutils.h" #include "i18n.h" #include "ucfontutils.h" #include "ucstyleditembase_p.h" #include "ucthemingextension.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #define foreach Q_FOREACH #include #undef foreach const char *CONTEXT_THEME = "theme"; quint16 UCTheme::previousVersion = 0; /*! * \qmltype ThemeSettings * \instantiates UCTheme * \inqmlmodule Ubuntu.Components 1.3 * \since Ubuntu.Components 1.3 * \ingroup theming * \brief The ThemeSettings class provides facilities to define the theme of a * StyledItem. * * A global instance is exposed as the \b theme context property. * * The theme defines the visual aspect of the Ubuntu components. An application * can use one or more theme the same time. The ThemeSettings component provides * abilities to change the theme used by the component and all its child components. * * Changing the theme of the entire application can be achieved by changing * the name of the root StyledItem's, i.e. MainView's current theme. * * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * * MainView { * width: units.gu(40) * height: units.gu(71) * * theme.name: "Ubuntu.Components.Themes.Ambiance" * } * \endqml * By default, styled items inherit the theme they use from their closest styled * item ancestor. In case the application uses MainView, all components will inherit * the theme from the MainView. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * * MainView { * width: units.gu(40) * height: units.gu(71) * * Page { * title: "Style test" * Button { * text: theme.name == "Ubuntu.Components.Themes.Ambiance" ? * "SuruDark" : "Ambiance" * onClicked: theme.name = (text == "Ambiance" ? * "Ubuntu.Components.Themes.SuruDark" : * "Ubuntu.Components.Themes.Ambiance") * } * } * } * \endqml * \note In the example above the Button inherits the theme from Page, which * inherits it from MainView. Therefore changing the theme name in this way will * result in a change of the inherited theme. In case a different theme is desired, * a new instance of the ThemeSettings must be created on the styled item desired. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * * MainView { * width: units.gu(40) * height: units.gu(71) * * Page { * title: "Style test" * theme: ThemeSettings{} * Button { * text: theme.name == "Ubuntu.Components.Themes.Ambiance" ? * "SuruDark" : "Ambiance" * onClicked: theme.name = (text == "Ambiance" ? * "Ubuntu.Components.Themes.SuruDark" : * "Ubuntu.Components.Themes.Ambiance") * } * } * } * \endqml * * The style can be set on a StyledItem either using \l StyledItem::styleName or * \l StyledItem::style properties. When set through \l StyledItem::styleName, * the component will load the style from the current theme set, and must be a * QML document. The \l StyledItem::style property is a Component which can be * declared local, or loaded with a Loader or created using Qt.createComponent() * function. * The following example will create the style with the inherited theme. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * StyledItem { * styleName: "MyItemStyle" * } * \endqml * All styled toolkit components such as \l Button, \l CheckBox, \l Switch, etc. * create their style in this way. Note that the style component must be part * of the theme, otherwise the style creation will fail. * * \sa {StyledItem} */ const QString THEME_FOLDER_FORMAT("%1/%2/"); const QString PARENT_THEME_FILE("parent_theme"); static inline void updateBinding (QQmlAbstractBinding *binding) { #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) if (binding->isValueTypeProxy()) return; static_cast(binding)->update(); #else binding->update(); #endif } QStringList themeSearchPath() { QString envPath = QLatin1String(getenv("UBUNTU_UI_TOOLKIT_THEMES_PATH")); QStringList pathList = envPath.split(':', QString::SkipEmptyParts); if (pathList.isEmpty()) { // get the default path list from generic data location, which contains // XDG_DATA_DIRS QString xdgDirs = QLatin1String(getenv("XDG_DATA_DIRS")); if (!xdgDirs.isEmpty()) { pathList << xdgDirs.split(':', QString::SkipEmptyParts); } // ~/.local/share pathList << QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation); } // append QML import path(s); we must explicitly support env override here QString qml2ImportPath(getenv("QML2_IMPORT_PATH")); if (!qml2ImportPath.isEmpty()) { pathList << qml2ImportPath.split(':', QString::SkipEmptyParts); } pathList << QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath).split(':', QString::SkipEmptyParts); // fix folders QStringList result; Q_FOREACH(const QString &path, pathList) { if (QDir(path).exists()) { result << path + '/'; } } // prepend current folder result.prepend(QDir::currentPath()); return result; } UCTheme::ThemeRecord pathFromThemeName(QString themeName) { // the first entry from pathList is the app's current folder UCTheme::ThemeRecord record(themeName, QUrl(), false, false); themeName.replace('.', '/'); QStringList pathList = themeSearchPath(); Q_FOREACH(const QString &path, pathList) { QString themeFolder = THEME_FOLDER_FORMAT.arg(path, themeName); // QUrl needs a trailing slash to understand it's a directory QString absoluteThemeFolder = QDir(themeFolder).absolutePath().append('/'); if (QDir(absoluteThemeFolder).exists()) { record.deprecated = QFile::exists(absoluteThemeFolder + "deprecated"); record.shared = QFile::exists(absoluteThemeFolder + "qmldir"); record.path = QUrl::fromLocalFile(absoluteThemeFolder); break; } } return record; } QString parentThemeName(const UCTheme::ThemeRecord& themePath) { QString parentTheme; if (!themePath.isValid()) { qWarning() << qPrintable(QStringLiteral("Theme not found: \"%1\"").arg(themePath.name)); } else { QFile file(themePath.path.resolved(PARENT_THEME_FILE).toLocalFile()); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); parentTheme = in.readLine(); } } return parentTheme; } /****************************************************************************** * Theme::PaletteConfig */ // builds configuration list and applies the configuration on the palette void UCTheme::PaletteConfig::configurePalette(QObject *themePalette) { if (!palette || !themePalette || configured) { return; } if (configList.isEmpty()) { // need to build config list first buildConfig(); } if (!configList.isEmpty()) { apply(themePalette); } } void UCTheme::PaletteConfig::restorePalette() { if (!palette || configList.isEmpty() || !configured) { return; } for (int i = 0; i < configList.count(); i++) { Data &config = configList[i]; if (!config.paletteProperty.isValid()) { continue; } // restore the config binding to the config target #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) if (config.configBinding && !config.configBinding->isValueTypeProxy()) { #else if (config.configBinding && config.configBinding->bindingType() == QQmlAbstractBinding::Binding) { #endif QQmlBinding *qmlBinding = static_cast(config.configBinding); qmlBinding->removeFromObject(); qmlBinding->setTarget(config.configProperty); } if (config.paletteBinding) { // restore the binding to the palette #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) QQmlAbstractBinding::Ptr prev(QQmlPropertyPrivate::binding(config.paletteProperty)); QQmlPropertyPrivate::setBinding(config.paletteProperty, config.paletteBinding); #else QQmlAbstractBinding *prev = QQmlPropertyPrivate::setBinding(config.paletteProperty, config.paletteBinding); #endif if (prev && prev != config.paletteBinding && prev != config.configBinding) { #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) prev->removeFromObject(); prev.reset(); #else prev->destroy(); #endif } updateBinding(config.paletteBinding); } else { config.paletteProperty.write(config.paletteValue); } config.paletteProperty = QQmlProperty(); config.paletteBinding = NULL; config.paletteValue.clear(); } configured = false; } // build palette configuration list void UCTheme::PaletteConfig::buildConfig() { if (!palette) { return; } const char *valueSetList[10] = {"normal", "selected"}; QQmlContext *configContext = qmlContext(palette); for (int i = 0; i < 2; i++) { const char *valueSet = valueSetList[i]; QObject *configObject = palette->property(valueSet).value(); const QMetaObject *mo = configObject->metaObject(); for (int ii = mo->propertyOffset(); ii < mo->propertyCount(); ii++) { const QMetaProperty prop = mo->property(ii); QString propertyName = QString("%1.%2").arg(valueSet).arg(prop.name()); QQmlProperty configProperty(palette, propertyName, configContext); // first we need to check whether the property has a binding or not QQmlAbstractBinding *binding = QQmlPropertyPrivate::binding(configProperty); if (binding) { configList << Data(propertyName, configProperty, binding); } else { QVariant value = configProperty.read(); QColor color = value.value(); if (color.isValid()) { configList << Data(propertyName, configProperty); } } } } } // apply configuration on the palette void UCTheme::PaletteConfig::apply(QObject *themePalette) { QQmlContext *context = qmlContext(themePalette); for (int i = 0; i < configList.count(); i++) { Data &config = configList[i]; config.paletteProperty = QQmlProperty(themePalette, config.propertyName, context); // backup config.paletteBinding = QQmlPropertyPrivate::binding(config.paletteProperty); if (!config.paletteBinding) { config.paletteValue = config.paletteProperty.read(); } // apply configuration if (config.configBinding) { // transfer binding's target #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) if (!config.configBinding->isValueTypeProxy()) { #else if (config.configBinding->bindingType() == QQmlAbstractBinding::Binding) { #endif QQmlBinding *qmlBinding = static_cast(config.configBinding); qmlBinding->setTarget(config.paletteProperty); } QQmlPropertyPrivate::setBinding(config.paletteProperty, config.configBinding); } else { if (config.paletteBinding) { // remove binding so the property doesn't clear it QQmlPropertyPrivate::setBinding(config.paletteProperty, 0); } config.paletteProperty.write(config.configProperty.read()); } } configured = true; } /****************************************************************************** * Theme */ UCTheme::UCTheme(QObject *parent) : QObject(parent) , m_parentTheme(Q_NULLPTR) , m_palette(Q_NULLPTR) , m_completed(false) { init(); } UCTheme *UCTheme::defaultTheme(QQmlEngine *engine) { if (!engine || !engine->rootContext()) { return Q_NULLPTR; } UCTheme *theme = Q_NULLPTR; for (int tryCount = 0; !theme && tryCount < 2; tryCount++) { theme = engine->rootContext()->contextProperty(CONTEXT_THEME).value(); if (!theme) { createDefaultTheme(engine); } } return theme; } void UCTheme::setupDefault() { // FIXME: move this into QPA // set the default font QFont defaultFont = QGuiApplication::font(); defaultFont.setFamily("Ubuntu"); defaultFont.setPixelSize(UCFontUtils::instance()->sizeToPixels("medium")); defaultFont.setWeight(QFont::Light); QGuiApplication::setFont(defaultFont); setObjectName("default"); } void UCTheme::init() { m_completed = false; QObject::connect(&m_defaultTheme, &UCDefaultTheme::themeNameChanged, this, &UCTheme::_q_defaultThemeChanged); updateThemePaths(); } void UCTheme::classBegin() { QQmlEngine *engine = qmlEngine(this); updateEnginePaths(engine); m_palette = UCTheme::defaultTheme(engine)->m_palette; if (!m_palette) { loadPalette(engine); } } void UCTheme::updateEnginePaths(QQmlEngine *engine) { if (!engine) { return; } QStringList paths = themeSearchPath(); Q_FOREACH(const QString &path, paths) { if (QDir(path).exists() && !engine->importPathList().contains(path)) { engine->addImportPath(path); } } } void UCTheme::_q_defaultThemeChanged() { updateThemePaths(); Q_EMIT nameChanged(); } void UCTheme::updateThemePaths() { m_themePaths.clear(); QString themeName = name(); while (!themeName.isEmpty()) { ThemeRecord themePath = pathFromThemeName(themeName); if (themePath.isValid()) { m_themePaths.append(themePath); } themeName = parentThemeName(themePath); } } /*! * \qmlproperty ThemeSettings ThemeSettings::parentTheme * \readonly * The property specifies the parent ThemeSettings instance. */ UCTheme *UCTheme::parentTheme() { return m_parentTheme.data(); } void UCTheme::setParentTheme(UCTheme *parentTheme) { if (m_parentTheme == parentTheme || parentTheme == this) { return; } Q_ASSERT(parentTheme); m_parentTheme = parentTheme; Q_EMIT parentThemeChanged(); } /*! * \qmlproperty string ThemeSettings::name * The name of the current theme in dotted format i.e. "Ubuntu.Components.Themes.Ambiance". */ QString UCTheme::name() const { return !m_name.isEmpty() ? m_name : m_defaultTheme.themeName(); } void UCTheme::setName(const QString& name) { if (name == m_name) { return; } m_name = name; if (name.isEmpty()) { init(); } else { QObject::disconnect(&m_defaultTheme, &UCDefaultTheme::themeNameChanged, this, &UCTheme::_q_defaultThemeChanged); updateThemePaths(); } loadPalette(qmlEngine(this)); Q_EMIT nameChanged(); updateThemedItems(); } void UCTheme::resetName() { setName(QString()); } /*! * \qmlproperty Palette ThemeSettings::palette * The palette of the current theme. When set, only the valid palette values will * be taken into account, which will override the theme defined palette values. * The following example will set the system's default theme palette normal background * color to Ubuntu blue. All other palette values will be untouched. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * import Ubuntu.Components.Themes 1.0 * * MainView { * // your code * theme.palette: Palette { * normal.background: UbuntuColors.blue * } * } * \endqml * \note Palette values applied on inherited themes will be rolled back once the * component declaring the palette is unloaded. This can be demonstracted using * a Loader element: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * import Ubuntu.Components.Themes 1.0 * * MainView { * width: units.gu(40) * height: units.gu(71) * * Loader { * id: loader * onItemChanged: if (item) button.theme.palette = item * } * Component { * id: dynamicPalette * Palette { * normal.background: UbuntuColors.blue * } * } * Button { * id: button * text: "Toggle palette" * onClicked: { * if (loader.item) { * loader.sourceComponent = undefined; * } else { * loader.sourceComponent = dynamicPalette; * } * } * } * } * \endqml * The palette doesn't need to be reset as it automatically resets when the * palette used for configuration is destroyed. */ QObject* UCTheme::palette(quint16 version) { if (!m_palette) { if (version) { // force version to be used previousVersion = version; } loadPalette(qmlEngine(this), false); } return m_palette; } void UCTheme::setPalette(QObject *config) { if (config == m_palette || config == m_config.palette) { return; } if (config && !QuickUtils::inherits(config, "Palette")) { qmlInfo(config) << QStringLiteral("Not a Palette component."); return; } // 1. restore original palette values m_config.restorePalette(); // 2. clear config list m_config.reset(); // disconnect the reset from the previous palette if (m_config.palette) { disconnect(m_config.palette, &QObject::destroyed, this, 0); } // 3. apply palette configuration m_config.palette = config; if (m_config.palette) { connect(m_config.palette, &QObject::destroyed, this, &UCTheme::resetPalette, Qt::DirectConnection); m_config.configurePalette(m_palette); } Q_EMIT paletteChanged(); } void UCTheme::resetPalette() { setPalette(NULL); } QUrl UCTheme::styleUrl(const QString& styleName, quint16 version, bool *isFallback) { if (isFallback) { (*isFallback) = false; } // loop through the versions first, so we will look after the style in all // the parents, then fall back to the older version quint16 major = MAJOR_VERSION(version); // loop through the versions to see if we have one matching // we stop at version 1.2 as we do not have support for earlier themes anymore. for (int minor = MINOR_VERSION(version); minor >= 2; minor--) { // check with each path of the theme Q_FOREACH (const ThemeRecord &themePath, m_themePaths) { QUrl styleUrl; /* * There are two cases where we have to deal with non-versioned styles: application * themes made for the previous theming and deprecated themes. For shared themes, * we have to check the fallback case. */ quint16 styleVersion = BUILD_VERSION(major, minor); if (themePath.deprecated) { styleVersion = 0; } if (themePath.shared && (minor < 2)) { styleVersion = LATEST_UITK_VERSION; } QString versionedName = QStringLiteral("%1.%2/%3").arg(major).arg(minor).arg(styleName); styleUrl = themePath.path.resolved(versionedName); if (styleUrl.isValid() && QFile::exists(styleUrl.toLocalFile())) { // set fallback warning if the theme is shared if (isFallback && themePath.shared && (version != styleVersion)) { (*isFallback) = true; } return styleUrl; } // if we don't get any style, get the non-versioned ones for non-shared and deprecated styles if (!themePath.shared || themePath.deprecated) { styleUrl = themePath.path.resolved(styleName); if (styleUrl.isValid() && QFile::exists(styleUrl.toLocalFile())) { return styleUrl; } } } } return QUrl(); } // registers the default theme property to the root context void UCTheme::createDefaultTheme(QQmlEngine* engine) { QQmlContext *context = engine->rootContext(); UCTheme *theme = new UCTheme(engine); QQmlEngine::setContextForObject(theme, context); context->setContextProperty(CONTEXT_THEME, theme); theme->setupDefault(); theme->updateEnginePaths(engine); ContextPropertyChangeListener *listener = new ContextPropertyChangeListener(context, CONTEXT_THEME); QObject::connect(theme, &UCTheme::nameChanged, listener, &ContextPropertyChangeListener::updateContextProperty); } void UCTheme::attachItem(QQuickItem *item, bool attach) { if (attach) { m_attachedItems.append(item); } else { m_attachedItems.removeOne(item); } } void UCTheme::updateThemedItems() { for (int i = 0; i < m_attachedItems.count(); i++) { UCThemingExtension *extension = qobject_cast(m_attachedItems[i]); if (extension) { extension->itemThemeReloaded(this); } } } /* * Updates the version used by the toolkit/application */ void UCTheme::checkMixedVersionImports(QQuickItem *item, quint16 version) { static bool wasShown = false; if (version != previousVersion && previousVersion && !wasShown) { // the first change is due to the first import detection, any further changes would mean there are // multiple version imports QString msg = QStringLiteral("Mixing of Ubuntu.Components module versions %1.%2 and %3.%4 detected!") .arg(MAJOR_VERSION(version)) .arg(MINOR_VERSION(version)) .arg(MAJOR_VERSION(previousVersion)) .arg(MINOR_VERSION(previousVersion)); qmlInfo(item) << msg; wasShown = true; } previousVersion = version; } /* * Returns an instance of the style component named \a styleName and parented * to \a parent. */ QQmlComponent* UCTheme::createStyleComponent(const QString& styleName, QObject* parent, quint16 version) { QQmlComponent *component = NULL; Q_ASSERT(version); if (parent != NULL) { QQmlEngine* engine = qmlEngine(parent); if (!engine) { // we may be in the phase when the qml context is not yet defined for the parent // so for now we return NULL return Q_NULLPTR; } // make sure we have the paths bool fallback = false; QUrl url = styleUrl(styleName, version, &fallback); if (url.isValid()) { if (fallback) { qmlInfo(parent) << QStringLiteral("Theme '%1' has no '%2' style for version %3.%4, fall back to version %5.%6.") .arg(name()).arg(styleName).arg(MAJOR_VERSION(version)).arg(MINOR_VERSION(version)) .arg(MAJOR_VERSION(LATEST_UITK_VERSION)).arg(MINOR_VERSION(LATEST_UITK_VERSION)); } component = new QQmlComponent(engine, url, QQmlComponent::PreferSynchronous, parent); if (component->isError()) { qmlInfo(parent) << component->errorString(); delete component; component = NULL; } else { // set context for the component QQmlEngine::setContextForObject(component, qmlContext(parent)); } } else { qmlInfo(parent) << QStringLiteral("Warning: Style %1 not found in theme %2").arg(styleName).arg(name()); } } return component; } void UCTheme::loadPalette(QQmlEngine *engine, bool notify) { if (!engine) { return; } if (m_palette) { // restore bindings to the config palette before we delete m_config.restorePalette(); delete m_palette; m_palette = 0; } // theme may not have palette defined QUrl paletteUrl = styleUrl("Palette.qml", previousVersion ? previousVersion : LATEST_UITK_VERSION); if (paletteUrl.isValid()) { m_palette = QuickUtils::instance()->createQmlObject(paletteUrl, engine); if (m_palette) { m_palette->setParent(this); } m_config.configurePalette(m_palette); if (notify) { Q_EMIT paletteChanged(); } } else { // use the default palette if none defined m_palette = defaultTheme(engine)->m_palette; } } // returns the palette color value of a color profile QColor UCTheme::getPaletteColor(const char *profile, const char *color) { QColor result; if (palette()) { QObject *paletteProfile = m_palette->property(profile).value(); if (paletteProfile) { result = paletteProfile->property(color).value(); } } return result; } ./src/Ubuntu/Components/plugin/ucactioncontext.cpp0000644000015600001650000002052412700370701022507 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "ucactioncontext.h" #include "ucaction.h" #include "adapters/actionsproxy_p.h" #include Q_LOGGING_CATEGORY(ucActionContext, "ubuntu.components.ActionContext", QtMsgType::QtWarningMsg) #define CONTEXT_TRACE(params) qCDebug(ucActionContext) << params UCActionContextAttached::UCActionContextAttached(QObject *owner) : QObject(owner) , m_owner(qobject_cast(owner)) , m_context(Q_NULLPTR) { } /*! * \qmltype ActionContext * \instantiates UCActionContext * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu * \brief ActionContext groups actions together and by providing multiple contexts * the developer is able to control the visibility of the actions. The \l ActionManager * then exposes the actions from these different contexts. * * ActionContext drives the state of its \l actions. Shortcuts and mnemonics are * only registered if the context is active or if the action is assigned to an * \l ActionItem all of whose parent contexts are active. In the following * example the ActionContext drives the underlaying \c action1 and \c action2 * shortcuts, and \c orphanAction will never trigger as it is neither enclosed * in an active context nor assigned to an ActionItem. * \qml * import QtQuick 2.4 * import ubuntu.Componenst 1.3 * * Rectangle { * id: root * width: units.gu(40) * height: units.gu(71) * ActionContext { * id: rootContext * active: true * actions: Action { * shortcut: 'Ctrl+A' * text: rootContext.active ? "Deactivate" : "Activate" * onTriggered: rootContext.active = !rootContext.active * } * } * * Action { * id: orphanAction * text: "Orphan" * shortcut: 'Ctrl+O' * onTriggered: console.log("This will not be called") * } * * Column { * Button { * text: rootContext.active ? "Deactivate" : "Activate" * onClicked: rootContext.active = !rootContext.active * } * Button { * action: Action { * id: action1 * text: "F&irst Button" * onTriggered: console.log("First Button triggered") * } * } * Button { * action: Action { * id: action2 * text: "S&econd Button" * shortcut: 'Ctrl+Alt+2' * onTriggered: console.log("Second Button triggered") * } * } * } * } * \endqml * * The toolkit assigns an ActionContext to each Page component, which is * activated/deactivated together with the Page itself, driving the shortcut * activations on the components and actions declared in the Page. * \sa PopupContext */ UCActionContext::UCActionContext(QObject *parent) : QObject(parent) , m_active(false) , m_effectiveActive(true) , m_popup(false) { } UCActionContext::~UCActionContext() { ActionProxy::removeContext(this); } UCActionContextAttached *UCActionContext::qmlAttachedProperties(QObject *owner) { return new UCActionContextAttached(owner); } void UCActionContext::classBegin() { // add the context to the management ActionProxy::addContext(this); // make sure we attach to the parent UCActionContextAttached *attached = static_cast( qmlAttachedPropertiesObject(parent(), true)); attached->m_context = this; } void UCActionContext::componentComplete() { } /* * The function marks all context actions being (un)published. */ void UCActionContext::markActionsPublished(bool mark) { Q_FOREACH(UCAction *action, m_actions) { action->m_published = mark; } } /*! * \qmlproperty list ActionContext::actions * \default * List of Actions in this ActionContext. */ QQmlListProperty UCActionContext::actions() { return QQmlListProperty(this, 0, UCActionContext::append, UCActionContext::count, 0, UCActionContext::clear); } void UCActionContext::append(QQmlListProperty *list, UCAction *action) { UCActionContext *context = qobject_cast(list->object); if (context) { context->m_actions.insert(action); } } void UCActionContext::clear(QQmlListProperty *list) { UCActionContext *context = qobject_cast(list->object); if (context) { context->m_actions.clear(); } } int UCActionContext::count(QQmlListProperty *list) { UCActionContext *context = qobject_cast(list->object); if (context) { return context->m_actions.count(); } return 0; } /*! * \qmlproperty bool ActionContext::active * If true the context is active. If false the context is inactive. Defaults to * false. * * When context has been added to the \l ActionManager setting this value controls * whether or not the actions in a context are available to external components. * * The \l ActionManager monitors the active property of each of the local contexts * that has been added to it. There can be more than one local context active at a. * time. When a local context is set active the manager will notice this and will * export the actions from the context. * \note An Action declared to a component falling under an item that is a child of * an inactive ActiveContext can be triggered manually using the mouse or connections. */ bool UCActionContext::active() { return m_active && m_effectiveActive; } void UCActionContext::setActive(bool active) { if (m_active == active) { return; } // skip deactivation for global context if (!active && (ActionProxy::instance().globalContext == this)) { return; } CONTEXT_TRACE("ACTIVATE CONTEXT" << this << active); m_active = active; ActionProxy::activateContext(this); Q_EMIT activeChanged(); } // similar to setActive() but does not alter the actions from the proxy void UCActionContext::setEffectiveActive(bool active) { if (m_effectiveActive == active) { return; } // skip deactivation for global context if (!active && (ActionProxy::instance().globalContext == this)) { return; } CONTEXT_TRACE("EFECTIVE ACTIVATE CONTEXT" << this << active); m_effectiveActive = active; Q_EMIT activeChanged(); } /*! * \qmlmethod ActionContext::addAction(Action action) * \deprecated * Adds an Action to the context programatically. */ void UCActionContext::addAction(UCAction *action) { if (m_actions.contains(action)) { return; } m_actions.insert(action); } /*! * \qmlmethod ActionContext::removeAction(Action action) * \deprecated * Removes an action from the context programatically. */ void UCActionContext::removeAction(UCAction *action) { if (!action) { return; } m_actions.remove(action); } /*! * \qmltype PopupContext * \instantiates UCPopupContext * \inqmlmodule Ubuntu.Components 1.3 * \since Ubuntu.Components 1.3 * \inherits ActionContext * \ingroup ubuntu * \brief A special ActionContext used in Dialogs and Popups. * * A PopupContext is similar to the ActionContext, with the only difference being * that there can be only one PopupContext active at a time in an application. * A PopupContext can have several active ActionContext children declared, however * when deactivated all child contexts will be deactivated as well, and no Action * declared in these contexts will be available through shortcuts. * * The toolkit provides this kind of contexts in MainView, Popup and Dialog. It is * highly recommended for applications to have a PopupContext defined in their rootItem. */ UCPopupContext::UCPopupContext(QObject *parent) : UCActionContext(parent) { m_popup = true; } ./src/Ubuntu/Components/plugin/ucubuntushapeoverlay.cpp0000644000015600001650000003670112700370701023576 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Loïc Molinari */ // FIXME(loicm) Overlay data is passed as geometry and interpolated as varying so that it can be // batched. It would be very useful to implement it with uniforms and compare the perf by // plotting the rendering speed of a scene with an increasing number of overlaid shapes. #include "ucubuntushapeoverlay.h" // -- Scene graph shader --- ShapeOverlayShader::ShapeOverlayShader() { setShaderSourceFile(QOpenGLShader::Vertex, QStringLiteral(":/uc/shaders/shapeoverlay.vert")); setShaderSourceFile(QOpenGLShader::Fragment, useDistanceFields() ? QStringLiteral(":/uc/shaders/shapeoverlay.frag") : QStringLiteral(":/uc/shaders/shapeoverlay_mipmap.frag")); } char const* const* ShapeOverlayShader::attributeNames() const { static char const* const attributes[] = { "positionAttrib", "shapeCoordAttrib", "sourceCoordAttrib", "yCoordAttrib", "backgroundColorAttrib", "overlayCoordAttrib", "overlayColorAttrib", 0 }; return attributes; } // --- Scene graph material --- QSGMaterialType* ShapeOverlayMaterial::type() const { static QSGMaterialType type; return &type; } QSGMaterialShader* ShapeOverlayMaterial::createShader() const { return new ShapeOverlayShader; } // --- Scene graph node --- ShapeOverlayNode::ShapeOverlayNode() : QSGGeometryNode() , m_material() , m_geometry(attributeSet(), ShapeNode::vertexCount, ShapeNode::indexCount, ShapeNode::indexType) { QSGNode::setFlag(UsePreprocess, true); memcpy(m_geometry.indexData(), ShapeNode::indices(), ShapeNode::indexCount * ShapeNode::indexTypeSize); m_geometry.setDrawingMode(ShapeNode::drawingMode); m_geometry.setIndexDataPattern(ShapeNode::indexDataPattern); m_geometry.setVertexDataPattern(ShapeNode::vertexDataPattern); setMaterial(&m_material); setGeometry(&m_geometry); #ifdef QSG_RUNTIME_DESCRIPTION qsgnode_set_description(this, QLatin1String("ubuntushapeoverlay")); #endif } // static const QSGGeometry::AttributeSet& ShapeOverlayNode::attributeSet() { static const QSGGeometry::Attribute attributes[] = { QSGGeometry::Attribute::create(0, 2, GL_FLOAT, true), QSGGeometry::Attribute::create(1, 2, GL_FLOAT), QSGGeometry::Attribute::create(2, 4, GL_FLOAT), QSGGeometry::Attribute::create(3, 1, GL_FLOAT), QSGGeometry::Attribute::create(4, 4, GL_UNSIGNED_BYTE), QSGGeometry::Attribute::create(5, 2, GL_FLOAT), QSGGeometry::Attribute::create(6, 4, GL_UNSIGNED_BYTE) }; static const QSGGeometry::AttributeSet attributeSet = { 7, sizeof(Vertex), attributes }; return attributeSet; } // --- QtQuick item --- /*! \qmltype UbuntuShapeOverlay \instantiates UCUbuntuShapeOverlay \inqmlmodule Ubuntu.Components 1.2 \ingroup ubuntu \brief Extended UbuntuShape adding a colored overlay layer. The UbuntuShapeOverlay is a rounded rectangle (based on a \l {https://en.wikipedia.org/wiki/Squircle}{squircle}) containing a set of layers composed, from top to bottom, of a colored rectangle overlay, an optional source image and a background color (solid or linear gradient). Different properties allow to change the look of the shape. Example: \qml import Ubuntu.Components 1.2 UbuntuShapeOverlay { backgroundColor: "white" overlayColor: "black" overlayRect: Qt.rect(0.25, 0.25, 0.5, 0.5) } \endqml */ UCUbuntuShapeOverlay::UCUbuntuShapeOverlay(QQuickItem* parent) : UCUbuntuShape(parent) , m_overlayX(0) , m_overlayY(0) , m_overlayWidth(0) , m_overlayHeight(0) , m_overlayColor(qRgba(0, 0, 0, 0)) { } /*! \qmlproperty rect UbuntuShapeOverlay::overlayRect \since Ubuntu.Components 1.2 This property sets the overlay rectangle. The default value is the empty rectangle. It is defined by a position and a size in normalized item coordinates (in the range between 0 and 1) with the origin at the top-left corner. An overlay covering the bottom part and starting at the vertical center can be done like that: \qml UbuntuShapeOverlay { width: 200; height: 200 overlayColor: Qt.rgba(0.0, 0.0, 0.5, 0.5) overlayRect: Qt.rect(0.0, 0.5, 1.0, 0.5) } \endqml Converting a position and a size in pixels to normalized item coordinates can be done with a division by the size. Here is an equivalent of the previous code sample: \qml UbuntuShapeOverlay { width: 200; height: 200 overlayColor: Qt.rgba(0.0, 0.0, 0.5, 0.5) overlayRect: Qt.rect(100.0/width, 100.0/height, 200.0/width, 100.0/height) } \endqml A geometry exceeding the item area is cropped. */ void UCUbuntuShapeOverlay::setOverlayRect(const QRectF& overlayRect) { // Crop rectangle and pack to 16-bit unsigned integers. const float x = qBound(0.0f, static_cast(overlayRect.x()), 1.0f); float width = qMax(0.0f, static_cast(overlayRect.width())); if ((x + width) > 1.0f) { width += 1.0f - (x + width); } const float y = qBound(0.0f, static_cast(overlayRect.y()), 1.0f); float height = qMax(0.0f, static_cast(overlayRect.height())); if ((y + height) > 1.0f) { height += 1.0f - (y + height); } const float f32toU16 = static_cast(0xffff); const quint16 overlayX = static_cast(x * f32toU16); const quint16 overlayY = static_cast(y * f32toU16); const quint16 overlayWidth = static_cast(width * f32toU16); const quint16 overlayHeight = static_cast(height * f32toU16); if ((m_overlayX != overlayX) || (m_overlayY != overlayY) || (m_overlayWidth != overlayWidth) || (m_overlayHeight != overlayHeight)) { m_overlayX = overlayX; m_overlayY = overlayY; m_overlayWidth = overlayWidth; m_overlayHeight = overlayHeight; update(); Q_EMIT overlayRectChanged(); } } /*! \qmlproperty color UbuntuShapeOverlay::overlayColor \since Ubuntu.Components 1.2 This property sets the color of the overlay rectangle defined by \l overlayRect. The default value is transparent black. */ void UCUbuntuShapeOverlay::setOverlayColor(const QColor& overlayColor) { const QRgb overlayColorRgb = qRgba( overlayColor.red(), overlayColor.green(), overlayColor.blue(), overlayColor.alpha()); if (m_overlayColor != overlayColorRgb) { m_overlayColor = overlayColorRgb; update(); Q_EMIT overlayColorChanged(); } } QSGNode* UCUbuntuShapeOverlay::createSceneGraphNode() const { return new ShapeOverlayNode; } // Pack to a premultiplied 32-bit ABGR integer. static quint32 packColor(QRgb color) { const quint32 a = qAlpha(color); const quint32 b = ((qBlue(color) * a) + 0xff) >> 8; const quint32 g = ((qGreen(color) * a) + 0xff) >> 8; const quint32 r = ((qRed(color) * a) + 0xff) >> 8; return (a << 24) | ((b & 0xff) << 16) | ((g & 0xff) << 8) | (r & 0xff); } void UCUbuntuShapeOverlay::updateGeometry( QSGNode* node, const QSizeF& itemSize, float radius, float shapeOffset, const QVector4D& sourceCoordTransform, const QVector4D& sourceMaskTransform, const quint32 backgroundColor[3]) { ShapeOverlayNode::Vertex* v = reinterpret_cast( static_cast(node)->geometry()->vertexData()); // Get the affine transformation for the overlay coordinates, pixels lying inside the mask // (values in the range [-1, 1]) will be considered overlaid in the fragment shader. const float u16toF32 = 1.0f / static_cast(0xffff); const float invOverlayWidth = 1.0f / (m_overlayWidth * u16toF32); const float invOverlayHeight = 1.0f / (m_overlayHeight * u16toF32); const float overlaySx = invOverlayWidth * 2.0f; const float overlaySy = invOverlayHeight * 2.0f; const float overlayTx = -((m_overlayX * u16toF32) * invOverlayWidth) * 2.0f - 1.0f; const float overlayTy = -((m_overlayY * u16toF32) * invOverlayHeight) * 2.0f - 1.0f; // The overlay affine transformation doesn't exist when width or height is null, whenever that // is the case we simply set the color to transparent. GPUs handle NaN/Inf values flowlessly. const quint32 overlayColor = qIsFinite(invOverlayHeight + invOverlayWidth) ? packColor(m_overlayColor) : 0x00000000; // Set top row of 3 vertices. v[0].position[0] = 0.0f; v[0].position[1] = 0.0f; v[0].shapeCoordinate[0] = shapeOffset; v[0].shapeCoordinate[1] = shapeOffset; v[0].sourceCoordinate[0] = sourceCoordTransform.z(); v[0].sourceCoordinate[1] = sourceCoordTransform.w(); v[0].sourceCoordinate[2] = sourceMaskTransform.z(); v[0].sourceCoordinate[3] = sourceMaskTransform.w(); v[0].yCoordinate = -1.0f; v[0].backgroundColor = backgroundColor[0]; v[0].overlayCoordinate[0] = overlayTx; v[0].overlayCoordinate[1] = overlayTy; v[0].overlayColor = overlayColor; v[1].position[0] = 0.5f * itemSize.width(); v[1].position[1] = 0.0f; v[1].shapeCoordinate[0] = (0.5f * itemSize.width()) / radius - shapeOffset; v[1].shapeCoordinate[1] = shapeOffset; v[1].sourceCoordinate[0] = 0.5f * sourceCoordTransform.x() + sourceCoordTransform.z(); v[1].sourceCoordinate[1] = sourceCoordTransform.w(); v[1].sourceCoordinate[2] = 0.5f * sourceMaskTransform.x() + sourceMaskTransform.z(); v[1].sourceCoordinate[3] = sourceMaskTransform.w(); v[1].yCoordinate = -1.0f; v[1].backgroundColor = backgroundColor[0]; v[1].overlayCoordinate[0] = 0.5f * overlaySx + overlayTx; v[1].overlayCoordinate[1] = overlayTy; v[1].overlayColor = overlayColor; v[2].position[0] = itemSize.width(); v[2].position[1] = 0.0f; v[2].shapeCoordinate[0] = shapeOffset; v[2].shapeCoordinate[1] = shapeOffset; v[2].sourceCoordinate[0] = sourceCoordTransform.x() + sourceCoordTransform.z(); v[2].sourceCoordinate[1] = sourceCoordTransform.w(); v[2].sourceCoordinate[2] = sourceMaskTransform.x() + sourceMaskTransform.z(); v[2].sourceCoordinate[3] = sourceMaskTransform.w(); v[2].yCoordinate = -1.0f; v[2].backgroundColor = backgroundColor[0]; v[2].overlayCoordinate[0] = overlaySx + overlayTx; v[2].overlayCoordinate[1] = overlayTy; v[2].overlayColor = overlayColor; // Set middle row of 3 vertices. v[3].position[0] = 0.0f; v[3].position[1] = 0.5f * itemSize.height(); v[3].shapeCoordinate[0] = shapeOffset; v[3].shapeCoordinate[1] = (0.5f * itemSize.height()) / radius - shapeOffset; v[3].sourceCoordinate[0] = sourceCoordTransform.z(); v[3].sourceCoordinate[1] = 0.5f * sourceCoordTransform.y() + sourceCoordTransform.w(); v[3].sourceCoordinate[2] = sourceMaskTransform.z(); v[3].sourceCoordinate[3] = 0.5f * sourceMaskTransform.y() + sourceMaskTransform.w(); v[3].yCoordinate = 0.0f; v[3].backgroundColor = backgroundColor[1]; v[3].overlayCoordinate[0] = overlayTx; v[3].overlayCoordinate[1] = 0.5f * overlaySy + overlayTy; v[3].overlayColor = overlayColor; v[4].position[0] = 0.5f * itemSize.width(); v[4].position[1] = 0.5f * itemSize.height(); v[4].shapeCoordinate[0] = (0.5f * itemSize.width()) / radius - shapeOffset; v[4].shapeCoordinate[1] = (0.5f * itemSize.height()) / radius - shapeOffset; v[4].sourceCoordinate[0] = 0.5f * sourceCoordTransform.x() + sourceCoordTransform.z(); v[4].sourceCoordinate[1] = 0.5f * sourceCoordTransform.y() + sourceCoordTransform.w(); v[4].sourceCoordinate[2] = 0.5f * sourceMaskTransform.x() + sourceMaskTransform.z(); v[4].sourceCoordinate[3] = 0.5f * sourceMaskTransform.y() + sourceMaskTransform.w(); v[4].yCoordinate = 0.0f; v[4].backgroundColor = backgroundColor[1]; v[4].overlayCoordinate[0] = 0.5f * overlaySx + overlayTx; v[4].overlayCoordinate[1] = 0.5f * overlaySy + overlayTy; v[4].overlayColor = overlayColor; v[5].position[0] = itemSize.width(); v[5].position[1] = 0.5f * itemSize.height(); v[5].shapeCoordinate[0] = shapeOffset; v[5].shapeCoordinate[1] = (0.5f * itemSize.height()) / radius - shapeOffset; v[5].sourceCoordinate[0] = sourceCoordTransform.x() + sourceCoordTransform.z(); v[5].sourceCoordinate[1] = 0.5f * sourceCoordTransform.y() + sourceCoordTransform.w(); v[5].sourceCoordinate[2] = sourceMaskTransform.x() + sourceMaskTransform.z(); v[5].sourceCoordinate[3] = 0.5f * sourceMaskTransform.y() + sourceMaskTransform.w(); v[5].yCoordinate = 0.0f; v[5].backgroundColor = backgroundColor[1]; v[5].overlayCoordinate[0] = overlaySx + overlayTx; v[5].overlayCoordinate[1] = 0.5f * overlaySy + overlayTy; v[5].overlayColor = overlayColor; // Set bottom row of 3 vertices. v[6].position[0] = 0.0f; v[6].position[1] = itemSize.height(); v[6].shapeCoordinate[0] = shapeOffset; v[6].shapeCoordinate[1] = shapeOffset; v[6].sourceCoordinate[0] = sourceCoordTransform.z(); v[6].sourceCoordinate[1] = sourceCoordTransform.y() + sourceCoordTransform.w(); v[6].sourceCoordinate[2] = sourceMaskTransform.z(); v[6].sourceCoordinate[3] = sourceMaskTransform.y() + sourceMaskTransform.w(); v[6].yCoordinate = 1.0f; v[6].backgroundColor = backgroundColor[2]; v[6].overlayCoordinate[0] = overlayTx; v[6].overlayCoordinate[1] = overlaySy + overlayTy; v[6].overlayColor = overlayColor; v[7].position[0] = 0.5f * itemSize.width(); v[7].position[1] = itemSize.height(); v[7].shapeCoordinate[0] = (0.5f * itemSize.width()) / radius - shapeOffset; v[7].shapeCoordinate[1] = shapeOffset; v[7].sourceCoordinate[0] = 0.5f * sourceCoordTransform.x() + sourceCoordTransform.z(); v[7].sourceCoordinate[1] = sourceCoordTransform.y() + sourceCoordTransform.w(); v[7].sourceCoordinate[2] = 0.5f * sourceMaskTransform.x() + sourceMaskTransform.z(); v[7].sourceCoordinate[3] = sourceMaskTransform.y() + sourceMaskTransform.w(); v[7].yCoordinate = 1.0f; v[7].backgroundColor = backgroundColor[2]; v[7].overlayCoordinate[0] = 0.5f * overlaySx + overlayTx; v[7].overlayCoordinate[1] = overlaySy + overlayTy; v[7].overlayColor = overlayColor; v[8].position[0] = itemSize.width(); v[8].position[1] = itemSize.height(); v[8].shapeCoordinate[0] = shapeOffset; v[8].shapeCoordinate[1] = shapeOffset; v[8].sourceCoordinate[0] = sourceCoordTransform.x() + sourceCoordTransform.z(); v[8].sourceCoordinate[1] = sourceCoordTransform.y() + sourceCoordTransform.w(); v[8].sourceCoordinate[2] = sourceMaskTransform.x() + sourceMaskTransform.z(); v[8].sourceCoordinate[3] = sourceMaskTransform.y() + sourceMaskTransform.w(); v[8].yCoordinate = 1.0f; v[8].backgroundColor = backgroundColor[2]; v[8].overlayCoordinate[0] = overlaySx + overlayTx; v[8].overlayCoordinate[1] = overlaySy + overlayTy; v[8].overlayColor = overlayColor; node->markDirty(QSGNode::DirtyGeometry); } ./src/Ubuntu/Components/plugin/uclistitemlayout.h0000644000015600001650000000260012700370701022355 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCLISTITEMLAYOUT_H #define UCLISTITEMLAYOUT_H #include "ucslotslayout.h" class UCLabel; class UCListItemLayout : public UCSlotsLayout { Q_OBJECT Q_PROPERTY(UCLabel *title READ title CONSTANT FINAL) Q_PROPERTY(UCLabel *subtitle READ subtitle CONSTANT FINAL) Q_PROPERTY(UCLabel *summary READ summary CONSTANT FINAL) public: explicit UCListItemLayout(QQuickItem *parent = 0); QQuickItem *mainSlot() override; //we don't allow changing the main slot on ListItemLayout because otherwise //accessing title/subtitle/summary would lead to a crash void setMainSlot(QQuickItem *slot, bool fireSignal = true) override; UCLabel *title(); UCLabel *subtitle(); UCLabel *summary(); }; #endif // UCLISTITEMLAYOUT_H ./src/Ubuntu/Components/plugin/ucperformancemonitor.cpp0000644000015600001650000001044212700370714023540 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include "ucperformancemonitor.h" #include Q_LOGGING_CATEGORY(ucPerformance, "[PERFORMANCE]") const int singleFrameThreshold = 32; const int multipleFrameThreshold = 17; const int framesCountThreshold = 10; const int warningCountThreshold = 30; UCPerformanceMonitor::UCPerformanceMonitor(QObject* parent) : QObject(parent), m_framesAboveThreshold(0), m_warningCount(0), m_window(NULL) { QObject::connect((QGuiApplication*)QGuiApplication::instance(), &QGuiApplication::applicationStateChanged, this, &UCPerformanceMonitor::onApplicationStateChanged); } UCPerformanceMonitor::~UCPerformanceMonitor() { } QQuickWindow* UCPerformanceMonitor::findQQuickWindow() { Q_FOREACH (QWindow *w, QGuiApplication::topLevelWindows()) { QQuickWindow* rootWindow = qobject_cast(w); if (rootWindow) { return rootWindow; } } return NULL; } void UCPerformanceMonitor::onApplicationStateChanged(Qt::ApplicationState state) { if (m_warningCount >= warningCountThreshold) { // do not monitor performance if the warning count threshold was reached return; } if (state == Qt::ApplicationActive) { connectToWindow(findQQuickWindow()); } else { connectToWindow(NULL); } } void UCPerformanceMonitor::connectToWindow(QQuickWindow* window) { if (window != m_window) { if (m_window != NULL) { QObject::disconnect(m_window, &QQuickWindow::beforeSynchronizing, this, &UCPerformanceMonitor::startTimer); QObject::disconnect(m_window, &QQuickWindow::afterRendering, this, &UCPerformanceMonitor::stopTimer); QObject::disconnect(m_window, &QWindow::destroyed, this, &UCPerformanceMonitor::windowDestroyed); } m_window = window; if (m_window != NULL) { QObject::connect(m_window, &QQuickWindow::beforeSynchronizing, this, &UCPerformanceMonitor::startTimer, Qt::DirectConnection); QObject::connect(m_window, &QQuickWindow::afterRendering, this, &UCPerformanceMonitor::stopTimer, Qt::DirectConnection); QObject::connect(m_window, &QWindow::destroyed, this, &UCPerformanceMonitor::windowDestroyed); } } } void UCPerformanceMonitor::startTimer() { m_timer.start(); } void UCPerformanceMonitor::stopTimer() { if (!m_timer.isValid()) { return; } const int totalTimeInMs = m_timer.elapsed(); m_timer.invalidate(); if (totalTimeInMs >= singleFrameThreshold) { qCWarning(ucPerformance, "Last frame took %d ms to render.", totalTimeInMs); m_warningCount++; } if (totalTimeInMs >= multipleFrameThreshold) { m_framesAboveThreshold++; if (m_framesAboveThreshold >= framesCountThreshold) { qCWarning(ucPerformance, "Last %d frames took over %d ms to render (last frame: %d ms)", m_framesAboveThreshold, multipleFrameThreshold, totalTimeInMs); m_framesAboveThreshold = 0; m_warningCount++; } } else { m_framesAboveThreshold = 0; } if (m_warningCount >= warningCountThreshold) { qCWarning(ucPerformance, "Too many warnings were given. Performance monitoring stops."); connectToWindow(NULL); } } void UCPerformanceMonitor::windowDestroyed() { connectToWindow(NULL); } ./src/Ubuntu/Components/plugin/ucpagetreenode.cpp0000644000015600001650000004631112700370701022271 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "ucpagetreenode.h" #include "ucpagetreenode_p.h" #include Q_LOGGING_CATEGORY(ucPageTreeNode, "ubuntu.components.PageTreeNode", QtMsgType::QtWarningMsg) #define PT_TRACE(params) qCDebug(ucPageTreeNode).noquote().nospace()<< params UCPageTreeNodePrivate::UCPageTreeNodePrivate() : m_parentNode(nullptr), m_activeLeafNode(nullptr), m_pageStack(nullptr), m_propagated(nullptr), m_toolbar(nullptr), m_flags(0), m_isLeaf(false), m_active(false) {} /*! * \internal * \brief UCPageTreeNodePrivate::init * Initialize the UCPageTreeNode and setup the bindings */ void UCPageTreeNodePrivate::init() { Q_Q(UCPageTreeNode); q->setActiveFocusOnPress(true); auto slotUpdateParentLeafNode = [this] () { updateParentLeafNode(); }; //connect all signals that are required to keep the "activeLeafNode" in the //parents valid. The activeLeadNode property in the parent is set if the current //PTN is a leaf itself (isLeaf = true) or one of its children is a leaf QObject::connect(q, &UCPageTreeNode::activeChanged, slotUpdateParentLeafNode); QObject::connect(q, &UCPageTreeNode::activeLeafNodeChanged, slotUpdateParentLeafNode); QObject::connect(q, &UCPageTreeNode::parentNodeChanged, slotUpdateParentLeafNode); //make sure all bindings are in tact initActive(); initPageStack(); initPropagated(); } /*! * \internal * \brief UCPageTreeNodePrivate::initActive * Initialize active property and setup the propagating binding. * By default the parents active property is propagated to the children. */ void UCPageTreeNodePrivate::initActive() { Q_Q(UCPageTreeNode); bool intialActive = false; if (m_parentNode) { intialActive = m_parentNode->active(); QObject::connect(m_parentNode, SIGNAL(activeChanged(bool)), q, SLOT(_q_activeBinding(bool))); } _q_activeBinding(intialActive); } /*! * \internal * \brief UCPageTreeNodePrivate::initPageStack * Initialize pageStack property and setup the propagating binding. * By default the parents pageStack property is propagated to the children. */ void UCPageTreeNodePrivate::initPageStack() { Q_Q(UCPageTreeNode); QQuickItem *initialPageStack = nullptr; if (m_parentNode) { initialPageStack = m_parentNode->pageStack(); QObject::connect(m_parentNode,SIGNAL(pageStackChanged(QQuickItem*)), q, SLOT(_q_pageStackBinding (QQuickItem *))); } _q_pageStackBinding(initialPageStack); } /*! * \internal * \brief UCPageTreeNodePrivate::initPropagated * Initialize __propagated property and setup the propagating binding. * By default the parents __propagated property is propagated to the children. */ void UCPageTreeNodePrivate::initPropagated() { Q_Q(UCPageTreeNode); QObject *initialPropagated = nullptr; if (m_parentNode) { initialPropagated = m_parentNode->propagated(); QObject::connect(m_parentNode,SIGNAL(propagatedChanged(QObject*)), q, SLOT(_q_propagatedBinding (QObject *))); } _q_propagatedBinding(initialPropagated); } /*! \internal Find the parent node and update the parentNode property */ void UCPageTreeNodePrivate::updatePageTree() { Q_Q(UCPageTreeNode); q->setParentNode(getParentPageTreeNode()); } /*! \internal \brief UCPageTreeNodePrivate::getParentPageTreeNode Returns the parent node in the page tree, or null if the item is the root node or invalid. */ UCPageTreeNode *UCPageTreeNodePrivate::getParentPageTreeNode() { Q_Q(UCPageTreeNode); UCPageTreeNode *node = nullptr; //search the current tree for the next parent item that //is a UCPageTreeNode QQuickItem *currItem = q->parentItem(); while (currItem) { UCPageTreeNode *currPageTreeNode = qobject_cast(currItem); if (currPageTreeNode) { if (currPageTreeNode->isLeaf()) { // children of a leaf are not part of the tree node = nullptr; } else { // current node is part of the tree with currPageTreeNode as its parent. node = currPageTreeNode; } break; } currItem = currItem->parentItem(); } return node; } /*! * \internal * \brief UCPageTreeNodePrivate::_q_activeBinding * Directly updates the activeBinding property. Is used as * callback to support qml style bindings that can be overriden */ void UCPageTreeNodePrivate::_q_activeBinding(bool active) { if (m_active == active) return; Q_Q(UCPageTreeNode); m_active = active; Q_EMIT q->activeChanged(active); } /*! * \internal * \brief UCPageTreeNodePrivate::_q_pageStackBinding * Directly updates the pageStack property. Is used as * callback to support qml style bindings that can be overriden */ void UCPageTreeNodePrivate::_q_pageStackBinding(QQuickItem *pageStack) { if (m_pageStack == pageStack) return; Q_Q(UCPageTreeNode); m_pageStack = pageStack; Q_EMIT q->pageStackChanged(pageStack); } /*! * \internal * \brief UCPageTreeNodePrivate::_q_propagatedBinding * Directly updates the __propagated property. Is used as * callback to support qml style bindings that can be overriden */ void UCPageTreeNodePrivate::_q_propagatedBinding(QObject *propagated) { if (m_propagated == propagated) return; Q_Q(UCPageTreeNode); m_propagated = propagated; Q_EMIT q->propagatedChanged(propagated); } /*! * \internal * \brief UCPageTreeNodePrivate::updateParentLeafNode * Update the activeLeafNode of the parent. The activeLeadNode property * in the parent is set if the current PTN is a leaf itself (isLeaf = true) * or one of its children is a leaf */ void UCPageTreeNodePrivate::updateParentLeafNode() { Q_Q(UCPageTreeNode); if (q->active() && q->parentNode()) { if (q->isLeaf()) q->parentNode()->setActiveLeafNode(q); else q->parentNode()->setActiveLeafNode(q->activeLeafNode()); } } /*! * \brief findPTNChild * Returns only the next level of UCPageTreeNode children of \l rootNode. * Just used for debugging output. */ static QList findPTNChild (QQuickItem *rootNode) { QList nodes; UCPageTreeNode *thisNode = qobject_cast(rootNode); if(thisNode) nodes << thisNode; else { Q_FOREACH(QQuickItem *curr, rootNode->childItems()) { nodes.append(findPTNChild(curr)); } } return nodes; } /*! * \brief collectNodes * Recursively collects all UCPageTreeNodes in a node tree and builds up * a representation of the Tree. Just used for debugging output. */ static QList collectNodes (UCPageTreeNode *root) { if (!root) return QList(); QList nodes; QList items = root->childItems(); Q_FOREACH(QQuickItem *item, items) { QListsubNodes = findPTNChild(item); if (subNodes.isEmpty()) continue; Q_FOREACH(UCPageTreeNode *currPTN, subNodes) { UCPageTreeNodePrivate::Node n; n.m_node = currPTN; n.m_children = collectNodes(currPTN); nodes.append(n); } } return nodes; } /*! * \brief UCPageTreeNodePrivate::dumpNode * Pretty prints the node \l n using the \l oldDepth of the parentNode and * \l depth as the current Nodes prefix. The \l isRoot parameter * specifies if the current Node \l n is the root Node. */ void UCPageTreeNodePrivate::dumpNode (const Node &n, const QString &oldDepth,const QString &depth, bool isRoot) { UCPageTreeNode *currNode = n.m_node; //print the current node name and info if (!isRoot) PT_TRACE(oldDepth<<"+--"<ownership: ").arg(depth)<<"C++"); break; case QQmlEngine::JavaScriptOwnership: PT_TRACE(QString("%1| ->ownership: ").arg(depth)<<"JS"); break; } PT_TRACE(QString("%1| ->parentNode: ").arg(depth)<parentNode()); PT_TRACE(QString("%1| ->parent: ").arg(depth)<parent()); PT_TRACE(QString("%1| ->pageStack: ").arg(depth)<pageStack() <<" custom:"<<((currNode->d_func()->m_flags & UCPageTreeNodePrivate::CustomPageStack) ? true : false)); PT_TRACE(QString("%1| ->propagated: ").arg(depth)<propagated() <<" custom:"<<((currNode->d_func()->m_flags & UCPageTreeNodePrivate::CustomPropagated) ? true : false)); PT_TRACE(QString("%1| ->active: ").arg(depth)<active() <<" custom:"<<((currNode->d_func()->m_flags & UCPageTreeNodePrivate::CustomActive) ? true : false)); PT_TRACE(QString("%1| ->activeLeaf: ").arg(depth)<activeLeafNode()); if (n.m_children.length()) PT_TRACE(QString("%1| ->isLeaf: ").arg(depth)<isLeaf()); else PT_TRACE(QString("%1└ ->isLeaf: ").arg(depth)<isLeaf()); //print the current nodes children for (int i = 0; i < n.m_children.length(); i++) { QString subDepth = depth; if (i == n.m_children.length() - 1 ) //last subDepth.append(" "); else subDepth.append("| "); dumpNode(n.m_children.at(i), depth, subDepth, false); } } /*! * \brief UCPageTreeNodePrivate::dumpNodeTree * Prints the complete node tree this node is part of. * This recursively searches and prints the whole tree, so * its pretty expensive. Do not leaf the calls to it after * finishing the debugging. */ void UCPageTreeNodePrivate::dumpNodeTree() { Q_Q(UCPageTreeNode); UCPageTreeNode *node = q; UCPageTreeNode *rootNode = nullptr; while(node) { rootNode = node; node = node->d_func()->getParentPageTreeNode(); } PT_TRACE("Begin Node List for"<init(); } UCPageTreeNode::UCPageTreeNode(UCPageTreeNodePrivate &dd, QQuickItem *parent) : UCStyledItemBase(dd, parent) { d_func()->init(); } void UCPageTreeNode::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) { Q_D(UCPageTreeNode); //update the parentNode property. //Likely it changes together with the Items parent UCStyledItemBase::itemChange(change, value); if (change == QQuickItem::ItemParentHasChanged) { d->updatePageTree(); } } /*! \qmlproperty Item PageTreeNode::isLeaf Whether or not this node is a leaf, that is if it has no descendant that are nodes. Pages are leafs, and they don't have descendants in the PageTree. */ bool UCPageTreeNode::isLeaf() const { return d_func()->m_isLeaf; } void UCPageTreeNode::setIsLeaf(bool isLeaf) { Q_D(UCPageTreeNode); if (d->m_isLeaf == isLeaf) return; d->m_isLeaf = isLeaf; Q_EMIT isLeafChanged(isLeaf); //notify all our parent nodes that we are the leaf d->updateParentLeafNode(); } /*! \qmlproperty Item PageTreeNode::parentNode The parent node of the current node in the page tree. */ void UCPageTreeNode::setParentNode(UCPageTreeNode *parentNode) { Q_D(UCPageTreeNode); if (d->m_parentNode == parentNode) return; //disconnect from the old parent, we do not want to get //false property updates if (d->m_parentNode && !QQmlData::wasDeleted(d->m_parentNode)) { if (!(d->m_flags & UCPageTreeNodePrivate::CustomActive)) { disconnect(d->m_parentNode, SIGNAL(activeChanged(bool)), this, SLOT(_q_activeBinding(bool))); } if (!(d->m_flags & UCPageTreeNodePrivate::CustomPageStack)) { disconnect(d->m_parentNode,SIGNAL(pageStackChanged(QQuickItem*)), this, SLOT(_q_pageStackBinding (QQuickItem *))); } if (!(d->m_flags & UCPageTreeNodePrivate::CustomPropagated)) { disconnect(d->m_parentNode,SIGNAL(propagatedChanged(QObject*)), this, SLOT(_q_propagatedBinding (QObject *))); } //the parent has changed, in case we or one of our children //were the active leaf node //make sure we are not anymore, since we are not part of that //tree if (d->m_parentNode->activeLeafNode() == this || d->m_parentNode->activeLeafNode() == activeLeafNode()) { d->m_parentNode->setActiveLeafNode(nullptr); } } d->m_parentNode = parentNode; //connect to the property changes of the parent node so they //can be propagated if (d->m_parentNode ) { if (!(d->m_flags & UCPageTreeNodePrivate::CustomActive)) { connect(d->m_parentNode, SIGNAL(activeChanged(bool)), this, SLOT(_q_activeBinding(bool))); } if (!(d->m_flags & UCPageTreeNodePrivate::CustomPageStack)) { connect(d->m_parentNode,SIGNAL(pageStackChanged(QQuickItem*)), this, SLOT(_q_pageStackBinding (QQuickItem *))); } if (!(d->m_flags & UCPageTreeNodePrivate::CustomPropagated)) { connect(d->m_parentNode,SIGNAL(propagatedChanged(QObject*)), this, SLOT(_q_propagatedBinding (QObject *))); } } //update properties if they are not set manually if (!(d->m_flags & UCPageTreeNodePrivate::CustomActive)) d->_q_activeBinding (parentNode && parentNode->active() ); if (!(d->m_flags & UCPageTreeNodePrivate::CustomPageStack)) d->_q_pageStackBinding (parentNode ? parentNode->pageStack() : nullptr); if (!(d->m_flags & UCPageTreeNodePrivate::CustomPropagated)) d->_q_propagatedBinding (parentNode ? parentNode->propagated() : nullptr); Q_EMIT parentNodeChanged (parentNode); } UCPageTreeNode *UCPageTreeNode::parentNode() const { return d_func()->m_parentNode; } void UCPageTreeNode::componentComplete() { UCStyledItemBase::componentComplete(); d_func()->updatePageTree(); } void UCPageTreeNode::dumpNodeTree() { d_func()->dumpNodeTree(); } /*! \internal \qmlproperty Item PageTreeNode::__propagated QtObject containing all the properties that are propagated from the root (MainView) of a page tree to its leafs (Pages). This object contains properties such as the header and toolbar that are instantiated by the MainView. This property is internal because the derived classes (MainView and Page) need to access it, but other components using those classes should not have access to it. */ QObject *UCPageTreeNode::propagated() const { return d_func()->m_propagated; } void UCPageTreeNode::setPropagated(QObject *propagated) { Q_D(UCPageTreeNode); //remove the binding to parent if (d->m_parentNode && !(d->m_flags & UCPageTreeNodePrivate::CustomPropagated)) disconnect(d->m_parentNode,SIGNAL(propagatedChanged(QObject*)), this, SLOT(_q_propagatedBinding (QObject *))); d->m_flags |= UCPageTreeNodePrivate::CustomPropagated; d->_q_propagatedBinding(propagated); } /*! \qmlproperty Item PageTreeNode::toolbar \deprecated The toolbar of the node. Propagates down from the root node. This property is DEPRECATED. */ QQuickItem *UCPageTreeNode::toolbar() const { return d_func()->m_toolbar; } void UCPageTreeNode::setToolbar(QQuickItem *toolbar) { Q_D(UCPageTreeNode); if (d->m_toolbar == toolbar) return; d->m_toolbar = toolbar; Q_EMIT toolbarChanged(toolbar); } /*! \internal \qmlproperty Item PageTreeNode::__isPageTreeNode Used to determine whether an Item is a PageTreeNode */ bool UCPageTreeNode::isPageTreeNode() const { return true; } /*! \qmlproperty Item PageTreeNode::activeLeafNode The leaf node that is active. */ void UCPageTreeNode::setActiveLeafNode(QQuickItem *activeLeafNode) { Q_D(UCPageTreeNode); if (d->m_activeLeafNode == activeLeafNode) return; d->m_activeLeafNode = activeLeafNode; Q_EMIT activeLeafNodeChanged(activeLeafNode); } QQuickItem *UCPageTreeNode::activeLeafNode() const { return d_func()->m_activeLeafNode; } /*! \qmlproperty Item PageTreeNode::active At any time, there is exactly one path from the root node to a Page leaf node where all nodes are active. All other nodes are not active. This is used by \l Tabs and \l PageStack to determine which of multiple nodes in the Tabs or PageStack is the currently active one. */ void UCPageTreeNode::setActive(bool active) { Q_D(UCPageTreeNode); //remove the binding to parent if (d->m_parentNode && !(d->m_flags & UCPageTreeNodePrivate::CustomActive)) { disconnect(d->m_parentNode, SIGNAL(activeChanged(bool)), this, SLOT(_q_activeBinding(bool))); } d->m_flags |= UCPageTreeNodePrivate::CustomActive; d->_q_activeBinding(active); } bool UCPageTreeNode::active() const { return d_func()->m_active; } /*! \qmlproperty Item PageTreeNode::pageStack The \l PageStack that this Page has been pushed on, or null if it is not part of a PageStack. This value is automatically set for pages that are pushed on a PageStack, and propagates to its child nodes. */ // Note: pageStack is not included in the propagated property because there may // be multiple PageStacks in a single page tree. void UCPageTreeNode::setPageStack(QQuickItem *pageStack) { Q_D(UCPageTreeNode); //remove the binding to parent if (d->m_parentNode && !(d->m_flags & UCPageTreeNodePrivate::CustomPageStack)) disconnect(d->m_parentNode,SIGNAL(pageStackChanged(QQuickItem*)), this, SLOT(_q_pageStackBinding (QQuickItem *))); d->m_flags |= UCPageTreeNodePrivate::CustomPageStack; d->_q_pageStackBinding(pageStack); } QQuickItem *UCPageTreeNode::pageStack() const { return d_func()->m_pageStack; } #include "moc_ucpagetreenode.cpp" ./src/Ubuntu/Components/plugin/ucarguments.cpp0000644000015600001650000004101512700370701021630 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include "ucarguments.h" #include "i18n.h" #include #include #include #include #include #include /*! * \qmltype Arguments * \instantiates UCArguments * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu-commandline * \brief The Arguments class provides a way to declare what command line * parameters are expected by the application. * * Example of use: * * \qml * Arguments { * id: args * * defaultArgument.help: "Expects URL of the media to play." * defaultArgument.valueNames: ["URL"] * * Argument { * name: "fullscreen" * help: "whether or not the media will be played fullscreen" * required: false * } * * Argument { * name: "volume" * help: "level to which to set the volume" * required: false * valueNames: ["VOLUME_LEVEL"] * } * } * \endqml * * The code above ensures that at least one argument is passed on the command * line which will then be available in QML via the defaultArgument property. * Optionally two other arguments can be passed: * * \e --fullscreen that will be exposed as a boolean property: \l{values}.fullscreen * * \e --volume that will be exposed as a string property: \l{values}.volume * * \qml * Item { * Label { * text: "volume = " + args.values.volume * } * * Label { * text: "fullscreen = " + args.values.fullscreen * } * * Label { * text: "URL = " + args.defaultArgument.at(0) * } * } * \endqml * * If the application is launched with the incorrect arguments or with the * \e --usage argument an help will be outputted on the command line and the * application will exit: * * \code * Usage: application [--fullscreen] [--volume=VOLUME_LEVEL] URL * Options: * --fullscreen whether or not the media will be played fullscreen * --volume=VOLUME_LEVE level to which to set the volume * * Expects URL of the media to play. * \endcode * * \sa Argument */ UCArguments::UCArguments(QObject *parent) : QObject(parent), m_completed(false), m_defaultArgument(NULL), m_values(new QQmlPropertyMap(this)), m_error(false) { m_rawArguments = QCoreApplication::arguments(); m_applicationBinary = QFileInfo(m_rawArguments[0]).fileName(); m_defaultArgument = new UCArgument(this); } /*! * \qmlproperty Argument Arguments::defaultArgument * * The default argument corresponds to the values passed on the command line * without any name. * * For example in: * * \code * ./application --volume=42 http://myaddress * \endcode * * \e{http://myaddress} is the first value of the default argument. * */ UCArgument* UCArguments::defaultArgument() const { return m_defaultArgument; } void UCArguments::setDefaultArgument(UCArgument* argument) { m_defaultArgument = argument; Q_EMIT(defaultArgumentChanged()); if (m_completed) { parseAndExposeArguments(); } } /*! * \qmlproperty Object Arguments::values * \readonly * * Object of which properties have the values of the command line arguments. * */ QQmlPropertyMap* UCArguments::values() const { return m_values; } /*! * \qmlproperty bool Arguments::error * \readonly * * Whether or not the command line arguments passed to the application correspond * to the expected arguments. * * Also set when calling \l quitWithError */ bool UCArguments::error() const { return m_error; } /*! * \qmlproperty string Arguments::errorMessage * \readonly * * Error message describing how the command line arguments passed to the application * failed to correspond to the expected arguments. * * Also set when calling \l quitWithError * */ QString UCArguments::errorMessage() const { return m_errorMessage; } QString UCArguments::usage() { QLatin1String indentation(" "); QString usage; QTextStream usageStream(&usage); UbuntuI18n* i18n = UbuntuI18n::instance(); usageStream << i18n->tr("Usage: "); // display overall syntax, for example: program --argument=value DEFAULT_ARGUMENT usageStream << m_applicationBinary; Q_FOREACH (UCArgument* argument, m_arguments) { usageStream << ' '; QString syntax = argument->syntax(); if (!argument->required()) { syntax.prepend('[').append(']'); } usageStream << syntax; } if (m_defaultArgument != NULL) { usageStream << ' '; usageStream << m_defaultArgument->syntax(); } // display what each argument is used for usageStream << endl; usageStream << i18n->tr("Options:") << endl; Q_FOREACH (UCArgument* argument, m_arguments) { usageStream << indentation << argument->usage() << endl; } if (m_defaultArgument != NULL) { usageStream << endl << m_defaultArgument->help(); } return usage; } void UCArguments::setErrorMessage(const QString& errorMessage) { m_error = true; m_errorMessage = errorMessage; Q_EMIT errorChanged(); Q_EMIT errorMessageChanged(); } void UCArguments::quitApplication() { /* This function can be called multiple times before the application actually quit. See comment at the end about QCoreApplication::quit(). */ static bool quitting = false; if (quitting) { return; } /* Call QCoreApplication::quit() when the event loop starts running. "If the event loop is not running, [QCoreApplication::quit()] does nothing." Ref.: http://qt-project.org/doc/qt-5.0/qtcore/qcoreapplication.html#exit */ quitting = true; QMetaObject::invokeMethod(QCoreApplication::instance(), "quit", Qt::QueuedConnection); } /*! * \qmlmethod void Arguments::printUsage() * * Outputs help to the console on how to pass arguments to the application. * */ void UCArguments::printUsage() { qWarning() << qPrintable(usage()); } /*! * \qmlmethod void Arguments::quitWithError(string errorMessage) * * Exits the application outputting \a errorMessage to the console. * */ void UCArguments::quitWithError(const QString& errorMessage) { setErrorMessage(errorMessage); // output to the console, first the errorMessage if any then the usage if (!errorMessage.isEmpty()) { qWarning() << qPrintable(errorMessage); } quitApplication(); } void UCArguments::classBegin() { } void UCArguments::componentComplete() { m_completed = true; parseAndExposeArguments(); // changing attributes' name, required and valueNames dynamically is not supported Q_FOREACH (UCArgument* argument, m_arguments) { QObject::connect(argument, &UCArgument::nameChanged, this, &UCArguments::warningArgumentPropertyChanged); QObject::connect(argument, &UCArgument::requiredChanged, this, &UCArguments::warningArgumentPropertyChanged); QObject::connect(argument, &UCArgument::valueNamesChanged, this, &UCArguments::warningArgumentPropertyChanged); } QObject::connect(m_defaultArgument, &UCArgument::nameChanged, this, &UCArguments::warningArgumentPropertyChanged); QObject::connect(m_defaultArgument, &UCArgument::requiredChanged, this, &UCArguments::warningArgumentPropertyChanged); QObject::connect(m_defaultArgument, &UCArgument::valueNamesChanged, this, &UCArguments::warningArgumentPropertyChanged); } void UCArguments::appendArguments(UCArgument* argument) { m_arguments.append(argument); if (m_completed) { parseAndExposeArguments(); } } UCArgument* UCArguments::atArguments(int index) { return m_arguments.at(index); } int UCArguments::countArguments() { return m_arguments.size(); } void UCArguments::clearArguments() { m_arguments.clear(); parseAndExposeArguments(); } // static callbacks calling the methods above void staticAppendArguments(QQmlListProperty* property, UCArgument* argument) { UCArguments* arguments = static_cast(property->data); arguments->appendArguments(argument); } UCArgument* staticAtArguments(QQmlListProperty* property, int index) { UCArguments* arguments = static_cast(property->data); return arguments->atArguments(index); } int staticCountArguments(QQmlListProperty* property) { UCArguments* arguments = static_cast(property->data); return arguments->countArguments(); } void staticClearArguments(QQmlListProperty* property) { UCArguments* arguments = static_cast(property->data); arguments->clearArguments(); } // end of static callbacks /*! * \qmlproperty list Arguments::arguments * \default * \readonly * * List of command line \l{Argument}{arguments} that are expected by the application. * * See detailed description above for an example on how to use it. * */ QQmlListProperty UCArguments::arguments() { return QQmlListProperty(this, this, &staticAppendArguments, &staticCountArguments, &staticAtArguments, &staticClearArguments); } void UCArguments::parseAndExposeArguments() { QHash expectedArguments; QHash argumentsValues; expectedArguments = buildExpectedArguments(m_arguments); argumentsValues = parseRawArguments(m_rawArguments, expectedArguments); if (usageRequested(argumentsValues.keys())) { quitWithError(); printUsage(); } QString error; if (!requiredArgumentsProvided(argumentsValues, error)) { quitWithError(error); printUsage(); } if (!requiredDefaultArgumentProvided(argumentsValues, error)) { quitWithError(error); printUsage(); } setValuesOnArguments(argumentsValues); exposeArgumentsAsProperties(argumentsValues); } void UCArguments::setValuesOnArguments(const QHash& argumentsValues) { // pass the values to the arguments Q_FOREACH (UCArgument* argument, m_arguments) { QString name = argument->name(); if (argumentsValues.contains(name)) { argument->setValues(argumentsValues.value(name)); } } // pass the values to the defaultArgument if (m_defaultArgument != NULL) { if (argumentsValues.contains("")) { int numberArguments = m_defaultArgument->valueNames().size(); m_defaultArgument->setValues(argumentsValues.value("").mid(0, numberArguments)); if (numberArguments > 0) { // FIXME: not very elegant way to inform that values have changed Q_EMIT(defaultArgumentChanged()); } } } } QHash UCArguments::buildExpectedArguments(const QList& declaredArguments) { QHash expectedArguments; Q_FOREACH (UCArgument* argument, declaredArguments) { expectedArguments.insert(argument->name(), argument->valueNames()); } return expectedArguments; } QHash UCArguments::parseRawArguments(const QStringList& rawArguments, const QHash& expectedArguments) { QHash argumentsValues; QString name; QStringList values; if (rawArguments.size() == 0) { return argumentsValues; } QStringList::const_iterator i = rawArguments.constBegin(); // ignore the first item in the rawArguments which is the name of the binary i++; for (; i != rawArguments.constEnd(); ++i) { QString rawArgument = (*i); if (rawArgument.startsWith('-')) { // it starts with a '-' therefore it is a named argument // remove all prepended '-' rawArgument = rawArgument.split('-', QString::SkipEmptyParts).join('-'); // string after the '=' sign is a value for the argument values = rawArgument.split("="); name = values.takeAt(0); if (expectedArguments.contains(name)) { values.append(collectArgumentValues(i, rawArguments.constEnd(), expectedArguments.value(name).size() - values.size())); } argumentsValues.insert(name, values); } else { // default/unnamed argument argumentsValues[""].append(rawArgument); } } return argumentsValues; } QStringList UCArguments::collectArgumentValues(QStringList::const_iterator& i, QStringList::const_iterator end, int nValues) { QStringList values; if (i == end) { return values; } for (; (i+1) != end; ++i) { QString rawArgument = *(i+1); if (rawArgument.startsWith('-')) { break; } else if (values.size() >= nValues) { break; } else { values.append(rawArgument); } } return values; } bool UCArguments::usageRequested(const QStringList& argumentNames) { return argumentNames.contains("help") || argumentNames.contains("h") || argumentNames.contains("usage"); } bool UCArguments::requiredArgumentsProvided(const QHash& argumentsValues, QString& error) { // check if all required named arguments were passed along with their values Q_FOREACH (UCArgument* argument, m_arguments) { if (argument->required()) { if (!argumentsValues.contains(argument->name())) { UbuntuI18n* i18n = UbuntuI18n::instance(); error = i18n->tr("%1 is expecting an additional argument: %2"); error = error.arg(m_applicationBinary).arg(argument->syntax()); return false; } else if (argumentsValues.value(argument->name()).size() < argument->valueNames().size()) { UbuntuI18n* i18n = UbuntuI18n::instance(); error = i18n->tr("%1 is expecting a value for argument: %2"); error = error.arg(m_applicationBinary).arg(argument->syntax()); return false; } } } return true; } bool UCArguments::requiredDefaultArgumentProvided(const QHash& argumentsValues, QString& error) { // check if the required default argument was passed if (m_defaultArgument != NULL && m_defaultArgument->required() && ((!argumentsValues.contains("") && m_defaultArgument->valueNames().size() > 0) || (argumentsValues.value("").size() < m_defaultArgument->valueNames().size()))) { UbuntuI18n* i18n = UbuntuI18n::instance(); error = i18n->tr("%1 is expecting additional arguments: %2").arg(m_applicationBinary).arg(m_defaultArgument->syntax()); return false; } else { return true; } } void UCArguments::exposeArgumentsAsProperties(const QHash& argumentsValues) { Q_FOREACH (UCArgument* argument, m_arguments) { QString name = argument->name(); // if the argument has no value, convert to bool // if the argument has a single value, convert to string // if the argument has multiple values, convert to a list of strings QStringList values = argument->values(); QVariant value; switch (argument->valueNames().size()) { case 0: if (argumentsValues.contains(name)) { value.setValue(true); } else { // case of a boolean argument that was not passed on the command line value.setValue(false); } break; case 1: if (values.size() > 0) { value.setValue(values.at(0)); } break; default: value.setValue(values); break; } m_values->insert(name, value); Q_EMIT m_values->valueChanged(name, value); } } void UCArguments::warningArgumentPropertyChanged() { qWarning() << "Changing properties of arguments dynamically is not supported."; } ./src/Ubuntu/Components/plugin/ucabstractbutton.cpp0000644000015600001650000003143112700370701022663 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "ucabstractbutton.h" #include "ucabstractbutton_p.h" #include "uchaptics.h" #include "ucunits.h" #include "ucaction.h" #include #include #include #define MIN_SENSING_WIDTH_GU 4 #define MIN_SENSING_HEIGHT_GU 4 //#define SENSING_DEBUG UCAbstractButtonPrivate::UCAbstractButtonPrivate() : UCActionItemPrivate() , mouseArea(new QQuickMouseArea) , acceptEvents(true) , pressAndHoldConnected(false) { } void UCAbstractButtonPrivate::init() { Q_Q(UCAbstractButton); q->setActiveFocusOnPress(true); q->setActiveFocusOnTab(true); } /*! \qmltype AbstractButton \instantiates UCAbstractButton \inherits ActionItem \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The AbstractButton class defines the behavior of the button. This class defines the behavior of the button. All components deriving from this class support haptic feedback out of the box. If an action is specified, the button's clicked signal will trigger the action. Subclasses of AbstractButton can use other properties of action (for example the text and iconName). \section2 Sensing area It has been proven that, on touch devices in order to properly aim an active component a minimum of 8x8 millimeters (i.e. 4x4 grid units) area has to be provided. However not all the visuals are of that size, as Icons for example are defaulted to be 2x2 grid units, but a component containing a single Icon still has to be able to capture the press events. Therefore AbstractButton makes sure this rule of 4x4 grid units for the sensing area is provided. In addition it exposes the \l sensingMargins property which extends the component's sensing area in all the directions, so other use cases when the sensing area needs to be extended outside of the component's area, or restricted on a given area of the component can be implemented. The following example extends the sensing area on the left, top and bottom with 1 grid units, and on the right with 10 grid units. \qml AbstractButton { width: units.gu(2) height: units.gu(2) sensingMargins { left: units.gu(1) top: units.gu(1) bottom: units.gu(1) right: units.gu(10) } } \endqml \note Do not set clipping for the component as that will restrict the sensing area to be available on the visual area only. */ /*! * * \qmlsignal AbstractButton::clicked() * This handler is called when there is a mouse click on the button and the button * is not disabled. If \l {ActionItem::action}{action} is defined, the action will be triggered. */ /*! * * \qmlsignal AbstractButton::pressAndHold() * This handler is called when there is a long press. */ UCAbstractButton::UCAbstractButton(QQuickItem *parent) : UCActionItem(*(new UCAbstractButtonPrivate), parent) { d_func()->init(); } UCAbstractButton::UCAbstractButton(UCAbstractButtonPrivate &&dd, QQuickItem *parent) : UCActionItem(dd, parent) { d_func()->init(); } bool UCAbstractButtonPrivate::isPressAndHoldConnected() { Q_Q(UCAbstractButton); IS_SIGNAL_CONNECTED(q, UCAbstractButton, pressAndHold, ()); } void UCAbstractButtonPrivate::onClicked() { Q_Q(UCAbstractButton); // call the overridden QML trigger function invokeTrigger(q, QVariant()); // then emit the clicked signal Q_EMIT q->clicked(); } void UCAbstractButton::classBegin() { UCActionItem::classBegin(); // make sure we have the haptics set up! HapticsProxy::instance()->initialize(); // set up mouse area Q_D(UCAbstractButton); QQml_setParent_noEvent(d->mouseArea, this); d->mouseArea->setParentItem(this); QQuickAnchors *anchors = QQuickItemPrivate::get(d->mouseArea)->anchors(); anchors->setFill(this); d->mouseArea->setHoverEnabled(true); #ifdef SENSING_DEBUG // keep this code for visual debugging purposes to track sensing area changes QQmlComponent component(qmlEngine(this)); QString data = "import QtQuick 2.4; Rectangle { anchors.fill: parent; color: '#19b6ee'; opacity: 0.3 }"; component.setData(data.toLocal8Bit(), QUrl()); if (component.isError()) { qDebug() << "ERROR" << component.errorString(); } else { QQuickItem *item = qobject_cast(component.beginCreate(qmlContext(this))); if (item) { item->setParent(d->mouseArea); item->setParentItem(d->mouseArea); component.completeCreate(); } } #endif } void UCAbstractButtonPrivate::completeComponentInitialization() { UCActionItemPrivate::completeComponentInitialization(); Q_Q(UCAbstractButton); // adjust sensing area _q_adjustSensingArea(); // bind mouse area QObject::connect(mouseArea, &QQuickMouseArea::pressedChanged, q, &UCAbstractButton::pressedChanged); QObject::connect(mouseArea, &QQuickMouseArea::hoveredChanged, q, &UCAbstractButton::hoveredChanged); QObject::connect(mouseArea, SIGNAL(clicked(QQuickMouseEvent*)), q, SLOT(_q_mouseAreaClicked())); QObject::connect(mouseArea, SIGNAL(pressed(QQuickMouseEvent*)), q, SLOT(_q_mouseAreaPressed())); } // check the pressAndHold connection on runtime, as Connections // may not be available on compoennt completion void UCAbstractButtonPrivate::_q_mouseAreaPressed() { if (!mouseArea->pressed()) { return; } bool longPressConnected = isPressAndHoldConnected(); Q_Q(UCAbstractButton); if (longPressConnected && !pressAndHoldConnected) { // do not use UniqueConnection as that has huge impact on performance QObject::connect(mouseArea, SIGNAL(pressAndHold(QQuickMouseEvent*)), q, SLOT(_q_mouseAreaPressAndHold())); pressAndHoldConnected = true; } else if (!longPressConnected && pressAndHoldConnected) { QObject::disconnect(mouseArea, SIGNAL(pressAndHold(QQuickMouseEvent*)), q, SLOT(_q_mouseAreaPressAndHold())); pressAndHoldConnected = false; } } // handle mouseClicked with Haptics void UCAbstractButtonPrivate::_q_mouseAreaClicked() { // required by the deprecated ListItem module if (!acceptEvents) { return; } // play haptics HapticsProxy::instance()->play(QVariant()); onClicked(); } // handle pressAndHold void UCAbstractButtonPrivate::_q_mouseAreaPressAndHold() { // required by the deprecated ListItem module Q_Q(UCAbstractButton); if (!acceptEvents) { return; } Q_EMIT q->pressAndHold(); } // emit clicked when Enter/Return is pressed void UCAbstractButton::keyReleaseEvent(QKeyEvent *event) { UCActionItem::keyReleaseEvent(event); switch (event->key()) { case Qt::Key_Enter: case Qt::Key_Return: case Qt::Key_Space: d_func()->onClicked(); break; default: break; } } void UCAbstractButtonPrivate::_q_adjustSensingArea() { Q_Q(UCAbstractButton); if (!componentComplete) { // we do not hammer the component until completion return; } // use the sensingMargins in the minimum calculation qreal minimumWidth = UCUnits::instance()->gu(MIN_SENSING_WIDTH_GU); qreal minimumHeight = UCUnits::instance()->gu(MIN_SENSING_HEIGHT_GU); qreal hDelta = minimumWidth - (q->width() + (sensingMargins ? (sensingMargins->left() + sensingMargins->right()) : 0.0)); qreal vDelta = minimumHeight - (q->height() + (sensingMargins ? (sensingMargins->top() + sensingMargins->bottom()) : 0.0)); // adjust the sensing area QQuickAnchors *mouseAreaAnchors = QQuickItemPrivate::get(mouseArea)->anchors(); if (hDelta >= 0) { // the horizontal size is still smaller than the minimum mouseAreaAnchors->setLeftMargin(-(hDelta / 2 + (sensingMargins ? sensingMargins->left() : 0.0))); mouseAreaAnchors->setRightMargin(-(hDelta / 2 + (sensingMargins ? sensingMargins->right() : 0.0))); } else { mouseAreaAnchors->setLeftMargin(sensingMargins ? -sensingMargins->left() : 0.0); mouseAreaAnchors->setRightMargin(sensingMargins ? -sensingMargins->right() : 0.0); } if (vDelta >= 0) { // the vertical size is still smaller than the minimum mouseAreaAnchors->setTopMargin(-(vDelta / 2 + (sensingMargins ? sensingMargins->top() : 0.0))); mouseAreaAnchors->setBottomMargin(-(vDelta / 2 + (sensingMargins ? sensingMargins->bottom() : 0.0))); } else { mouseAreaAnchors->setTopMargin(sensingMargins ? -sensingMargins->top() : 0.0); mouseAreaAnchors->setBottomMargin(sensingMargins ? -sensingMargins->bottom() : 0.0); } } void UCAbstractButton::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { UCActionItem::geometryChanged(newGeometry, oldGeometry); // adjust internal mouse area's size d_func()->_q_adjustSensingArea(); } /*! * \qmlproperty bool AbstractButton::pressed * True if the user presses a mouse button in the button's mouse area. */ bool UCAbstractButton::pressed() const { Q_D(const UCAbstractButton); return d->mouseArea ? d->mouseArea->pressed() : false; } /*! * \qmlproperty bool AbstractButton::hovered * True if the mouse cursor hovers over the button's mouse area. */ bool UCAbstractButton::hovered() const { Q_D(const UCAbstractButton); return d->mouseArea ? d->mouseArea->hovered() : false; } bool UCAbstractButton::acceptEvents() const { Q_D(const UCAbstractButton); return d->acceptEvents; } void UCAbstractButton::setAcceptEvents(bool value) { Q_D(UCAbstractButton); d->acceptEvents = value; } QQuickMouseArea *UCAbstractButton::privateMouseArea() const { Q_D(const UCAbstractButton); return d->mouseArea; } /*! * \qmlpropertygroup ::AbstractButton::sensingMargins * \qmlproperty real AbstractButton::sensingMargins.left * \qmlproperty real AbstractButton::sensingMargins.right * \qmlproperty real AbstractButton::sensingMargins.top * \qmlproperty real AbstractButton::sensingMargins.bottom * \qmlproperty real AbstractButton::sensingMargins.all * The property group specifies the margins extending the visual area where the * touch and mouse events are sensed. Positive values mean the area will be extended * on the specified direction outside of the visual area, negative values mean * the sensing will fall under the component's visual border. * All values default to 0. * * \note If the visual area and the sensing margins are not reaching the 4x4 grid * units limit, the component will fall back to these minimum limits. * For example, extending a 2x2 grid unit visual component into 5x4 grid units * sensing area would look as follows: * \qml * AbstractButton { * width: units.gu(2) * height: units.gu(2) * Icon { * name: "settings" * } * sensingArea { * // no need to set the vertical direction as the minimum of * // 4 grid units will be taken automatically * leftMargin: units.gu(1) * // we only have to add 2 grid units as the width + left margin * // already gives us 3 grid units out of 5 * rightMargin: units.gu(2) * } * } * \endqml */ UCMargins *UCAbstractButton::sensingMargins() { Q_D(UCAbstractButton); if (!d->sensingMargins) { d->sensingMargins = new UCMargins(this); // as this is the first time we create the sensing margins we only // connect now to grid unit changes to keep sensing area size in sync connect(UCUnits::instance(), SIGNAL(gridUnitChanged()), this, SLOT(_q_adjustSensingArea())); // also connect to the margin changes connect(d->sensingMargins, SIGNAL(leftChanged()), this, SLOT(_q_adjustSensingArea())); connect(d->sensingMargins, SIGNAL(rightChanged()), this, SLOT(_q_adjustSensingArea())); connect(d->sensingMargins, SIGNAL(topChanged()), this, SLOT(_q_adjustSensingArea())); connect(d->sensingMargins, SIGNAL(bottomChanged()), this, SLOT(_q_adjustSensingArea())); connect(d->sensingMargins, SIGNAL(allChanged()), this, SLOT(_q_adjustSensingArea())); } return d->sensingMargins; } #include "moc_ucabstractbutton.cpp" ./src/Ubuntu/Components/plugin/ucunits.h0000644000015600001650000000353112700370701020433 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #ifndef UBUNTU_COMPONENTS_UNITS_H #define UBUNTU_COMPONENTS_UNITS_H #include #include #include class UCUnits : public QObject { Q_OBJECT Q_PROPERTY(float gridUnit READ gridUnit WRITE setGridUnit NOTIFY gridUnitChanged) public: static UCUnits *instance(QObject *parent = Q_NULLPTR) { if (!m_units) { // we must have a parent! if (!parent) { qFatal("Creating units singleton requires a parent object!"); } m_units = new UCUnits(parent); } return m_units; } explicit UCUnits(QObject *parent = 0); ~UCUnits(); Q_INVOKABLE float dp(float value); Q_INVOKABLE float gu(float value); QString resolveResource(const QUrl& url); // getters float gridUnit(); // setters void setGridUnit(float gridUnit); Q_SIGNALS: void gridUnitChanged(); protected: QString suffixForGridUnit(float gridUnit); float gridUnitSuffixFromFileName(const QString &fileName); private: static UCUnits *m_units; float m_devicePixelRatio; float m_gridUnit; }; #endif // UBUNTU_COMPONENTS_UNITS_H ./src/Ubuntu/Components/plugin/ucthemingextension.cpp0000644000015600001650000002161112700370701023213 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "ucthemingextension.h" #include "uctheme.h" #include #include #include /* * The UCThemingExtension interface provides theme handling on Items extending an existing * QQuickItem derivate class. Items subject fo theming should derive from this class * and implement the pure virtual methods. * The item can expose the theme property and use the getters defined by the * class. * In case the item exposes the theme property, it can use the getters from the * extension and declare the themeChanged signal. */ void notifyThemeChange(QQuickItem *item, UCTheme *oldTheme, UCTheme *newTheme) { Q_FOREACH(QQuickItem *child, item->childItems()) { UCThemingExtension *extension = qobject_cast(child); if (extension) { extension->itemThemeChanged(oldTheme, newTheme); } // StyledItem will handle the broadcast itself depending on whether the theme change was appropriate or not // and will complete the ascendantStyled/theme itself if (!extension) { notifyThemeChange(child, oldTheme, newTheme); } } } void notifyThemeReloaded(QQuickItem *item, UCTheme *theme) { Q_FOREACH(QQuickItem *child, item->childItems()) { UCThemingExtension *extension = qobject_cast(child); if (extension) { extension->itemThemeReloaded(theme); } // StyledItem will handle the broadcast itself depending on whether the theme change was appropriate or not // and will complete the ascendantStyled/theme itself if (!extension) { notifyThemeReloaded(child, theme); } } } /************************************************************************* * Attached to every Item in the system */ static uint xdata = QObject::registerUserData(); class UCItemAttached : public QObjectUserData, public QQuickItemChangeListener { public: explicit UCItemAttached(QQuickItem *owner = 0); ~UCItemAttached(); QQuickItem *m_item; QQuickItem *m_prevParent; void itemParentChanged(QQuickItem *item, QQuickItem *newParent); private: friend class UCThemingExtension; }; UCItemAttached::UCItemAttached(QQuickItem *owner) : m_item(owner) , m_prevParent(Q_NULLPTR) { QQuickItemPrivate::get(m_item)->addItemChangeListener(this, QQuickItemPrivate::Parent); } UCItemAttached::~UCItemAttached() { QQuickItemPrivate::get(m_item)->removeItemChangeListener(this, QQuickItemPrivate::Parent); } bool UCThemingExtension::isThemed(QQuickItem *item) { UCThemingExtension *extension = qobject_cast(item); return extension != Q_NULLPTR; } // handle parent changes void UCItemAttached::itemParentChanged(QQuickItem *, QQuickItem *newParent) { if (newParent == m_prevParent || QQuickItemPrivate::get(m_item)->wasDeleted) { return; } // when we set a parent, the two items must be under the same engine if (newParent && qmlEngine(m_item) != qmlEngine(newParent)) { return; } if (!qmlEngine(m_item)) { // the item is about to be deleted, parent change occurs as the parent is removed Q_ASSERT(!newParent); return; } // make sure we have these handlers attached to each intermediate item QQuickItem *oldThemedAscendant = UCThemingExtension::ascendantThemed(m_prevParent); QQuickItem *newThemedAscendant = UCThemingExtension::ascendantThemed(newParent); UCThemingExtension *oldExtension = qobject_cast(oldThemedAscendant); UCThemingExtension *newExtension = qobject_cast(newThemedAscendant); UCTheme *oldTheme = oldExtension ? oldExtension->getTheme() : UCTheme::defaultTheme(qmlEngine(m_item)); UCTheme *newTheme = newExtension ? newExtension->getTheme() : UCTheme::defaultTheme(qmlEngine(m_item)); // neither of the themes can be null! Q_ASSERT(oldTheme); Q_ASSERT(newTheme); if (oldTheme != newTheme) { UCThemingExtension *extension = qobject_cast(m_item); // send the event to m_item first if (extension) { // only items with extensions should get this event extension->itemThemeChanged(oldTheme, newTheme); } // then broadcast to children, but only if the item is not a styled one if (!extension) { notifyThemeChange(m_item, oldTheme, newTheme); } } m_prevParent = newParent; } /************************************************************************* * */ UCThemingExtension::UCThemingExtension(QQuickItem *extendedItem) : theme(Q_NULLPTR) , themedItem(extendedItem) , themeType(Inherited) { themedItem->setUserData(xdata, new UCItemAttached(themedItem)); } UCThemingExtension::~UCThemingExtension() { if (theme) { theme->attachItem(themedItem, false); } } // set the parent of the theme if the themeType is Custom void UCThemingExtension::setParentTheme() { if (themeType != Custom) { return; } QQuickItem *upperThemed = ascendantThemed(QQuickItemPrivate::get(themedItem)->parentItem); UCThemingExtension *extension = qobject_cast(upperThemed); UCTheme *parentTheme = extension ? extension->getTheme() : UCTheme::defaultTheme(qmlEngine(themedItem)); if (parentTheme != theme) { theme->setParentTheme(parentTheme); } } void UCThemingExtension::itemThemeChanged(UCTheme*, UCTheme *newTheme) { switch (themeType) { case Inherited: { setTheme(newTheme, Inherited); return; } case Custom: { // set the theme's parent theme->setParentTheme(newTheme); return; } default: break; } } void UCThemingExtension::itemThemeReloaded(UCTheme *theme) { switch (themeType) { case Inherited: { preThemeChanged(); postThemeChanged(); return; } case Custom: { if (theme == this->theme) { preThemeChanged(); postThemeChanged(); // forward to children notifyThemeReloaded(themedItem, theme); } else { // emit theme's parentThemeChanged() Q_EMIT this->theme->parentThemeChanged(); } return; } default: break; } } UCTheme *UCThemingExtension::getTheme() { if (!theme) { theme = UCTheme::defaultTheme(qmlEngine(themedItem)); if (!theme) { QString msg = QStringLiteral("The item %1 was created without a valid QML Engine. Styling will not be possible.") .arg(themedItem->metaObject()->className()); qCritical().noquote() << msg; return Q_NULLPTR; } theme->attachItem(themedItem, true); } return theme; } void UCThemingExtension::setTheme(UCTheme *newTheme, ThemeType type) { if (theme == newTheme) { return; } // preform pre-theme change tasks preThemeChanged(); themeType = type; UCTheme *oldTheme = theme; // disconnect from the previous set if (theme) { theme->attachItem(themedItem, false); } theme = newTheme; // connect to the new set if (theme) { theme->attachItem(themedItem, true); // set the parent of the theme if custom setParentTheme(); } // perform post-theme changes, update internal styling postThemeChanged(); // broadcast to the children notifyThemeChange(themedItem, oldTheme, theme); } void UCThemingExtension::resetTheme() { QQuickItem *upperThemed = ascendantThemed(QQuickItemPrivate::get(themedItem)->parentItem); UCThemingExtension *extension = qobject_cast(upperThemed); UCTheme *theme = extension ? extension->getTheme() : UCTheme::defaultTheme(qmlEngine(themedItem)); setTheme(theme, Inherited); } // returns the closest themed ascendant QQuickItem *UCThemingExtension::ascendantThemed(QQuickItem *item) { while (item && !isThemed(item)) { // if the item has no xdata set, means we haven't been here yet if (!item->userData(xdata)) { item->setUserData(xdata, new UCItemAttached(item)); } item = item->parentItem(); } return item; } ./src/Ubuntu/Components/plugin/ucqquickimageextension.cpp0000644000015600001650000001764612700370714024101 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include #include #include #include #include #include "ucqquickimageextension.h" #include "ucunits.h" QHash > UCQQuickImageExtension::s_rewrittenSciFiles; /*! \internal The UCQQuickImageExtension class makes sure that for images loaded via QQuickImageBase the right version is loaded and that they are scaled appropriately. It does so by overriding the QQuickImageBase's 'source' property. */ UCQQuickImageExtension::UCQQuickImageExtension(QObject *parent) : QObject(parent), m_image(static_cast(parent)) { // FIXME(loicm) When the grid unit is changed following a QPA plugin scale // notification, we experienced a crash in reloadSource() while setting // the QQuickImageBase source. It seems like a resource handling issue // in Qt but we have not managed to identify it exactly. We work around // it by using a queued connection for gridUnitChanged() signal for now. QObject::connect(UCUnits::instance(), SIGNAL(gridUnitChanged()), this, SLOT(reloadSource()), Qt::QueuedConnection); if (m_image) { QObject::connect(m_image, &QQuickImageBase::sourceChanged, this, &UCQQuickImageExtension::extendedSourceChanged); } } QUrl UCQQuickImageExtension::source() const { return m_source; } void UCQQuickImageExtension::setSource(const QUrl& url) { if (url != m_source) { m_source = url; reloadSource(); } } void UCQQuickImageExtension::reloadSource() { if (!m_image) { // nothing to do, we don't have the image instance return; } if (m_source.isEmpty()) { m_image->setSource(m_source); return; } QString resolved = UCUnits::instance()->resolveResource(m_source); if (resolved.isEmpty()) { m_image->setSource(m_source); return; } int separatorPosition = resolved.indexOf("/"); QString scaleFactor = resolved.left(separatorPosition); QString selectedFilePath = resolved.mid(separatorPosition+1); QString fragment(m_source.hasFragment() ? "#" + m_source.fragment() : QString("")); if (scaleFactor == "1") { if (qFuzzyCompare(qGuiApp->devicePixelRatio(), (qreal)1.0) || selectedFilePath.endsWith(".svg") || selectedFilePath.endsWith(".svgz")) { // Take care to pass the original fragment QUrl selectedFileUrl(QUrl::fromLocalFile(selectedFilePath)); selectedFileUrl.setFragment(fragment); m_image->setSource(selectedFileUrl); } else { // Need to scale the pixel-based image to suit the devicePixelRatio setting ourselves. // If we let Qt do it, Qt will not choose the UITK-supported "@gu" scaled images. m_image->setSource(QUrl("image://scaling/1/" + selectedFilePath + fragment)); // explicitly set the source size in the QQuickImageBase, this persuades it that the // supplied image is suitable for the current devicePixelRatio. m_image->setSourceSize(m_image->sourceSize()); } } else { // Prepend "image://scaling" for the image to be loaded by UCScalingImageProvider. if (!m_source.path().endsWith(".sci")) { // Regular image file m_image->setSource(QUrl("image://scaling/" + resolved + fragment)); } else { // .sci image file. Rewrite the .sci file into a temporary file. bool rewritten = true; QTemporaryFile* rewrittenSciFile; /* Ensure that only one temporary rewritten .sci file is created for each source .sci file by storing the path to the temporary file in a global hash. */ rewrittenSciFile = UCQQuickImageExtension::s_rewrittenSciFiles.value(m_source).data(); if (rewrittenSciFile == NULL) { rewrittenSciFile = new QTemporaryFile; rewrittenSciFile->setFileTemplate(QDir::tempPath() + "/XXXXXX.sci"); rewrittenSciFile->open(); QTextStream output(rewrittenSciFile); if (qFuzzyCompare(qGuiApp->devicePixelRatio(), (qreal)1.0)) { rewritten = rewriteSciFile(selectedFilePath, scaleFactor, output); } else { QString scaleFactorInDevicePixels = QString::number(scaleFactor.toFloat() / qGuiApp->devicePixelRatio()); rewritten = rewriteSciFile(selectedFilePath, scaleFactorInDevicePixels, output); } rewrittenSciFile->close(); s_rewrittenSciFiles.insert(m_source, QSharedPointer(rewrittenSciFile)); } if (rewritten) { // Take care to pass the original fragment QUrl rewrittenSciFileUrl(QUrl::fromLocalFile(rewrittenSciFile->fileName())); rewrittenSciFileUrl.setFragment(fragment); m_image->setSource(rewrittenSciFileUrl); } else { m_image->setSource(m_source); } } // explicitly set the source size in the QQuickImageBase, this persuades it that the // supplied image is suitable for the current devicePixelRatio. m_image->setSourceSize(m_image->sourceSize()); } } bool UCQQuickImageExtension::rewriteSciFile(const QString &sciFilePath, const QString &scaleFactor, QTextStream& output) { QFile sciFile(sciFilePath); if (sciFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream sciStream(&sciFile); while (!sciStream.atEnd()) { QString line = sciStream.readLine(); if (line.startsWith("border")) { output << scaledBorder(line, scaleFactor) << endl; } else if (line.startsWith("source")) { output << scaledSource(line, sciFilePath, scaleFactor) << endl; } else { output << line << endl; } } return true; } else { return false; } } QString UCQQuickImageExtension::scaledBorder(const QString &border, const QString &scaleFactor) { // Rewrite the border line with a scaled border value QStringList parts = border.split(":"); float scaledValue = parts[1].toFloat() * scaleFactor.toFloat(); return parts[0] + ": " + QString::number(qRound(scaledValue)); } QString UCQQuickImageExtension::scaledSource(QString source, const QString &sciFilePath, const QString &scaleFactor) { // Rewrite the source line by prepending "image://scaling" to the source value QString sciDirectory = QFileInfo(sciFilePath).dir().path() + "/"; QString baseUrl = "image://scaling/" + scaleFactor + "/" + sciDirectory; // If the source url is between quotes "", remove them const QChar quote = '"'; const int quoteFirstIndex = source.indexOf(quote); if (quoteFirstIndex != -1) { source.remove(quoteFirstIndex, 1); } const int quoteLastIndex = source.lastIndexOf(quote); if (quoteLastIndex != -1) { source.remove(quoteLastIndex, 1); } return source.replace("source: ", "source: " + QString(quote) + baseUrl).append(quote); } ./src/Ubuntu/Components/plugin/i18n.cpp0000644000015600001650000003200612700370701020052 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Tim Peeters */ #include "i18n.h" #include "timeutils_p.h" #include namespace C { #include #include #include } #include #include /*! * \qmltype i18n * \instantiates UbuntuI18n * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu * \brief i18n is a context property that provides internationalization support. * * i18n cannot be instantiated, and is already available as a context property. * It is based on \l {https://www.gnu.org/software/gettext/} {gettext}, and thus the standard gettext tools can be used for translating * a project. Example: * \qml * import QtQuick 2.4 * import Ubuntu.Components 0.1 * * Item { * width: units.gu(40) * height: units.gu(50) * * Button { * anchors.centerIn: parent * text: i18n.tr("Press me") * } * } * \endqml */ UbuntuI18n *UbuntuI18n::m_i18 = nullptr; UbuntuI18n::UbuntuI18n(QObject* parent) : QObject(parent) { /* * setlocale * category = LC_ALL: All types of i18n: LC_MESSAGES, LC_NUMERIC, LC_TIME * locale = "": Lookup the environment for $LC_ALL, $LC_* and $LANG in that order * Returns: for example en_US.utf8, da_DK or POSIX * * Note: $LANGUAGE is implicitly respected by gettext() calls and * defines the order of multiple locales */ m_language = setlocale(LC_ALL, ""); } UbuntuI18n::~UbuntuI18n() { m_i18 = nullptr; } /*! * \qmlproperty string i18n::domain * The gettext domain to be used for the translation. The default domain * is the applicationName specified in the application's \l MainView, or the empty string "" if * no applicationName was given or no \l MainView is used. * Use dtr() functions instead of tr() to use a different domain for a single translation * that ignores i18n.domain. */ QString UbuntuI18n::domain() const { return m_domain; } /*! * \qmlproperty string i18n::language * The language that is used for the translation. The default value is * the user's locale dending on $LC_ALL, $LC_MESSAGES and $LANG at the time * of running the application. See the gettext manual for details. */ QString UbuntuI18n::language() const { return m_language; } /** * \qmlmethod void i18n::bindtextdomain(string domain_name, string dir_name) * Specify that the domain_name message catalog can be found * in dir_name rather than in the system locale data base. */ void UbuntuI18n::bindtextdomain(const QString& domain_name, const QString& dir_name) { C::bindtextdomain(domain_name.toUtf8(), dir_name.toUtf8()); Q_EMIT domainChanged(); } void UbuntuI18n::setDomain(const QString &domain) { if (m_domain == domain) return; m_domain = domain; C::textdomain(domain.toUtf8()); /* The default is /usr/share/locale if we don't set a folder For click we use APP_DIR/share/locale e.g. /usr/share/click/preinstalled/com.example.foo/current/share/locale */ QString appDir(getenv("APP_DIR")); if (!QDir::isAbsolutePath (appDir)) { appDir = "/usr"; } QString localePath(QDir(appDir).filePath("share/locale")); C::bindtextdomain(domain.toUtf8(), localePath.toUtf8()); Q_EMIT domainChanged(); } void UbuntuI18n::setLanguage(const QString &lang) { if (m_language == lang) return; m_language = lang; /* This is needed for LP: #1263163. LANGUAGE may be set to one or more languages for example "fi" or "sv:de". gettext prioritizes LANGUAGE over LC_ALL, LC_*, and LANG, so if the session has already set LANGUAGE, calls to gettext will only use that. We must override it here so that future calls to gettext are done in the new language. This only affects the current process. It does not override the user's session LANGUAGE. */ setenv("LANGUAGE", lang.toUtf8().constData(), 1); /* The inverse form of setlocale as used in the constructor, passing a valid locale string updates all category type defaults. */ setlocale(LC_ALL, lang.toUtf8()); Q_EMIT languageChanged(); } /*! * \qmlmethod string i18n::tr(string text) * Translate \a text using gettext and return the translation. */ QString UbuntuI18n::tr(const QString& text) { return QString::fromUtf8(C::gettext(text.toUtf8())); } /*! * \qmlmethod string i18n::tr(string singular, string plural, int n) * Translate the given input string \a singular or \a plural (depending on the number of items \a n) * using gettext. Should be called like this: * tr("%n file", "%n files", count) */ QString UbuntuI18n::tr(const QString &singular, const QString &plural, int n) { return QString::fromUtf8(C::ngettext(singular.toUtf8(), plural.toUtf8(), n)); } /*! * \qmlmethod string i18n::dtr(string domain, string text) * Translate \a text using gettext. Uses the specified domain \a domain instead of i18n.domain. */ QString UbuntuI18n::dtr(const QString& domain, const QString& text) { if (domain.isNull()) { return QString::fromUtf8(C::dgettext(NULL, text.toUtf8())); } else { return QString::fromUtf8(C::dgettext(domain.toUtf8(), text.toUtf8())); } } /*! * \qmlmethod string i18n::dtr(string domain, string singular, string plural, int n) * Translate the given text using gettext. Should be called like this: * tr(domain, "%n file", "%n files", count) * Uses \a domain for the domain instead of i18n.domain, and \a singular or \a plural * as input for the translation depending on the number of items \a n. */ QString UbuntuI18n::dtr(const QString& domain, const QString& singular, const QString& plural, int n) { if (domain.isNull()) { return QString::fromUtf8(C::dngettext(NULL, singular.toUtf8(), plural.toUtf8(), n)); } else { return QString::fromUtf8(C::dngettext(domain.toUtf8(), singular.toUtf8(), plural.toUtf8(), n)); } } /*! * \qmlmethod string i18n::ctr(string context, string text) * Translate \a text using gettext and return the translation. * \a context is only visible to the translator and helps disambiguating for very short texts */ QString UbuntuI18n::ctr(const QString& context, const QString& text) { return dctr(QString(), context, text); } /*! * \qmlmethod string i18n::dctr(string domain, string context, string text) * Translate \a text using gettext. Uses the specified domain \a domain instead of i18n.domain. * \a context is only visible to the translator and helps disambiguating for very short texts */ QString UbuntuI18n::dctr(const QString& domain, const QString& context, const QString& text) { if (domain.isNull()) { return QString::fromUtf8(C::g_dpgettext2(NULL, context.toUtf8(), text.toUtf8())); } else { return QString::fromUtf8(C::g_dpgettext2(domain.toUtf8(), context.toUtf8(), text.toUtf8())); } } /*! * \qmlmethod string i18n::tag(string text) * Mark \a text for translation at a later point. Typically this allows an API * to take the original string and pass it to dtr (or dgettext). * * \qml * import QtQuick 2.4 * import UserMetrics 0.1 * * Metric { * name: "distance" * format: i18n.tag("Distance covered today: %1 km") * emptyFormat: i18n.tag("No running today") * domain: "runner.forest" * } * \endqml * * The strings tagged for localzation above are passed to the implementation * of UserMetrics verbatim, as well as the domain of the app. Display and * translation of the strings will happen in the lockscreen, where the same * strings will be passed to i18n.tr. */ QString UbuntuI18n::tag(const QString& text) { return text; } /*! * \qmlmethod string i18n::tag(string context, string text) * Mark \a text for translation at a later point. Typically this allows an API * to take the original string and pass it to dctr (or g_dpgettext2). * \a context is only visible to the translator and helps disambiguating for very short texts */ QString UbuntuI18n::tag(const QString& context, const QString& text) { Q_UNUSED(context); return text; } /*! * \qmlmethod string i18n::relativeDateTime(datetime dateTime) * Translate a datetime based on proximity to current time. */ QString UbuntuI18n::relativeDateTime(const QDateTime& datetime) { QDateTime relativeTo(QDateTime::currentDateTime()); const date_proximity_t prox = getDateProximity(relativeTo, datetime); switch (prox) { case DATE_PROXIMITY_NOW: /* TRANSLATORS: Time based "this is happening/happened now" */ return dtr("ubuntu-ui-toolkit", "Now"); case DATE_PROXIMITY_HOUR: { qint64 diff = datetime.toMSecsSinceEpoch() - relativeTo.toMSecsSinceEpoch(); qint64 minutes = qRound(float(diff) / 60000); if (minutes < 0) { return dtr("ubuntu-ui-toolkit", "%1 minute ago", "%1 minutes ago", qAbs(minutes)).arg(qAbs(minutes)); } return dtr("ubuntu-ui-toolkit", "%1 minute", "%1 minutes", minutes).arg(minutes); } case DATE_PROXIMITY_TODAY: /* en_US example: "1:00 PM" */ /* TRANSLATORS: Please translated these to your locale datetime format using the format specified by https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 */ return datetime.toString(isLocale12h() ? dtr("ubuntu-ui-toolkit", "h:mm ap"): /* TRANSLATORS: Please translated these to your locale datetime format using the format specified by https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 */ dtr("ubuntu-ui-toolkit", "HH:mm")); case DATE_PROXIMITY_YESTERDAY: /* en_US example: "Yesterday 13:00" */ /* TRANSLATORS: Please translated these to your locale datetime format using the format specified by https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 */ return datetime.toString(isLocale12h() ? dtr("ubuntu-ui-toolkit", "'Yesterday\u2003'h:mm ap") : /* TRANSLATORS: Please translated these to your locale datetime format using the format specified by https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 */ dtr("ubuntu-ui-toolkit", "'Yesterday\u2003'HH:mm")); case DATE_PROXIMITY_TOMORROW: /* en_US example: "Tomorrow 1:00 PM" */ /* TRANSLATORS: Please translated these to your locale datetime format using the format specified by https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 */ return datetime.toString(isLocale12h() ? dtr("ubuntu-ui-toolkit", "'Tomorrow\u2003'h:mm ap") : /* TRANSLATORS: Please translated these to your locale datetime format using the format specified by https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 */ dtr("ubuntu-ui-toolkit", "'Tomorrow\u2003'HH:mm")); case DATE_PROXIMITY_LAST_WEEK: case DATE_PROXIMITY_NEXT_WEEK: /* en_US example: "Fri 1:00 PM" */ /* TRANSLATORS: Please translated these to your locale datetime format using the format specified by https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 */ return datetime.toString(isLocale12h() ? dtr("ubuntu-ui-toolkit", "ddd'\u2003'h:mm ap") : /* TRANSLATORS: Please translated these to your locale datetime format using the format specified by https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 */ dtr("ubuntu-ui-toolkit", "ddd'\u2003'HH:mm")); case DATE_PROXIMITY_FAR_BACK: case DATE_PROXIMITY_FAR_FORWARD: default: /* TRANSLATORS: Please translated these to your locale datetime format using the format specified by https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 */ return datetime.toString(isLocale12h() ? dtr("ubuntu-ui-toolkit", "ddd d MMM'\u2003'h:mm ap") : /* TRANSLATORS: Please translated these to your locale datetime format using the format specified by https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 */ dtr("ubuntu-ui-toolkit", "ddd d MMM'\u2003'HH:mm")); } return datetime.toString(Qt::DefaultLocaleShortDate); } ./src/Ubuntu/Components/plugin/filterbehavior.cpp0000644000015600001650000000233412700370701022301 0ustar jenkinsjenkins/* * Copyright (C) 2014 Canonical, Ltd. * * Authors: * Christian Dywan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "filterbehavior.h" FilterBehavior::FilterBehavior(QObject *parent) : QObject(parent) , m_property(QString()) , m_pattern(QRegExp()) { } QString FilterBehavior::property() const { return m_property; } void FilterBehavior::setProperty(const QString& property) { m_property = property; Q_EMIT propertyChanged(); } QRegExp FilterBehavior::pattern() const { return m_pattern; } void FilterBehavior::setPattern(QRegExp pattern) { m_pattern = pattern; Q_EMIT patternChanged(); } ./src/Ubuntu/Components/plugin/ucargument.cpp0000644000015600001650000001151412700370701021446 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include "ucargument.h" /*! * \qmltype Argument * \instantiates UCArgument * \inqmlmodule Ubuntu.Components 1.1 * \ingroup ubuntu-commandline * \brief The Argument class specifies what type a given command line parameter should be. * * \b Important: Argument is not used on its own but must be a child of \l Arguments. * * An Argument is defined by its \l name and \l valueNames properties which correspond * to a command line parameter (e.g. \e{--target}) and the values passed to it * (e.g. \e{--target=http://myaddress}). * * For example, the following code allows to retrieve parameters on the * command line of the form \e{--target=URL}: * * \qml * Argument { * name: "target" * help: "address of the resource to retrieve" * required: true * valueNames: ["URL"] * } * \endqml * * To retrieve a value passed to the parameter knowing its position, use the \l at * method. * * \sa Arguments * */ UCArgument::UCArgument(QObject *parent) : QObject(parent), m_required(true) { } /*! * \qmlproperty string Argument::name * * Name identifying the command line argument. * * For example 'target' corrsesponds to the \e{'--target'} command line argument. * */ QString UCArgument::name() const { return m_name; } void UCArgument::setName(const QString &name) { m_name = name; Q_EMIT(nameChanged()); } /*! * \qmlproperty string Argument::help * * Help displayed when launching the application with --usage. * */ QString UCArgument::help() const { return m_help; } void UCArgument::setHelp(const QString &help) { m_help = help; Q_EMIT(helpChanged()); } /*! * \qmlproperty bool Argument::required * * Whether or not this argument needs to be passed on the command line when * launching the application. * */ bool UCArgument::required() const { return m_required; } void UCArgument::setRequired(bool required) { m_required = required; Q_EMIT(requiredChanged()); } /*! * \qmlproperty list Argument::valueNames * * Names given to the values of this argument. They are used when displaying the * expected command line arguments of the application. * * Typically all capital letters (e.g. URL). * */ QStringList UCArgument::valueNames() const { return m_valueNames; } void UCArgument::setValueNames(const QStringList &valueNames) { m_valueNames = valueNames; Q_EMIT(valueNamesChanged()); } QString UCArgument::syntax() const { QString syntax; if (!m_name.isEmpty()) { // for named argument: --name=value1 value2 syntax.append("--"); syntax.append(m_name); if (!m_valueNames.empty()) { syntax.append('='); Q_FOREACH (const QString &valueName, m_valueNames) { syntax.append(valueName); if (valueName != m_valueNames.last()) { syntax.append(' '); } } } } else { // for unnamed required argument: value1 value2 // for unnamed optional argument: [value1] [value2] if (!m_valueNames.empty()) { Q_FOREACH (const QString &valueName, m_valueNames) { QString outputName = valueName; if (!m_required) { outputName.prepend('[').append(']'); } syntax.append(outputName); if (valueName != m_valueNames.last()) { syntax.append(' '); } } } } return syntax; } QString UCArgument::usage() const { // ensure that the help string for the arguments are aligned vertically QString usage; usage.append(syntax().leftJustified(20, ' ', true)); usage.append(' ').append(m_help); return usage; } QStringList UCArgument::values() const { return m_values; } void UCArgument::setValues(const QStringList &values) { m_values = values; } /*! * \qmlmethod string Argument::at(int i) * * Returns the \e{i}th value of the argument. * Values are counted from 0. * */ QVariant UCArgument::at(int i) const { if (i >= 0 && i < m_values.size()) { return QVariant(m_values.at(i)); } else { return QVariant(); } } ./src/Ubuntu/Components/plugin/uclistitem_p.h0000644000015600001650000001246212700370714021451 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCVIEWITEM_P_H #define UCVIEWITEM_P_H #include "uclistitem.h" #include "ucstyleditembase_p.h" #include "uclistitemstyle.h" #include #include #include #define IMPLICIT_LISTITEM_WIDTH_GU 40 #define IMPLICIT_LISTITEM_HEIGHT_GU 7 #define DIVIDER_THICKNESS_DP 1 #define DEFAULT_SWIPE_THRESHOLD_GU 1.5 class QQuickFlickable; class UCListItemDivider; class UCListItemActions; class UCListItemStyle; class ListItemDragHandler; class ListItemSelection; class UCListItemPrivate : public UCStyledItemBasePrivate { Q_DECLARE_PUBLIC(UCListItem) public: UCListItemPrivate(); virtual ~UCListItemPrivate(); void init(); static inline UCListItemPrivate *get(UCListItem *that) { Q_ASSERT(that); return that->d_func(); } void _q_themeChanged(); bool isClickedConnected(); bool isPressAndHoldConnected(); void _q_relayout(); void _q_updateSwiping(); void setSwiped(bool swiped); void _q_updateSize(); void _q_updateIndex(); void _q_contentMoving(); void _q_syncDragMode(); void _q_updateExpansion(const QList &indices); int index(); bool canHighlight(); void setHighlighted(bool pressed); void listenToRebind(bool listen); void lockContentItem(bool lock); void update(); void snapOut(); void swipeEvent(const QPointF &localPos, UCSwipeEvent::Status status); bool swipedOverThreshold(const QPointF &mousePos, const QPointF relativePos); void handleLeftButtonPress(QMouseEvent *event); void handleLeftButtonRelease(QMouseEvent *event); bool sendMouseEvent(QQuickItem *item, QMouseEvent *event); bool shouldShowContextMenu(QMouseEvent *event); void _q_popoverClosed(); void showContextMenu(); QPointer countOwner; QPointer flickable; QPointer parentAttached; QPointer dragHandler; QBasicTimer pressAndHoldTimer; QPointF lastPos; QPointF pressedPos; QPointF zeroPos; QColor color; QColor highlightColor; QQuickItem *contentItem; UCListItemDivider *divider; UCListItemActions *leadingActions; UCListItemActions *trailingActions; UCAction *mainAction; UCListItemExpansion *expansion; ListItemSelection *selection; qreal xAxisMoveThresholdGU; Qt::MouseButton button; bool highlighted:1; bool swipeEnabled:1; bool contentMoved:1; bool swiped:1; bool suppressClick:1; bool ready:1; bool customColor:1; bool listViewKeyNavigation:1; // getters/setters QQmlListProperty data(); QQmlListProperty children(); bool contentMoving() const; void setContentMoving(bool moved); virtual void preStyleChanged(); virtual bool loadStyleItem(bool animated = true); bool dragging(); bool dragMode(); void setDragMode(bool draggable); bool isSelected(); void setSelected(bool value); bool selectMode(); void setSelectMode(bool selectable); UCAction *action() const; void setAction(UCAction *action); void setListViewKeyNavigation(bool value); virtual void postThemeChanged(); inline UCListItemStyle *listItemStyle() const; }; UCListItemStyle *UCListItemPrivate::listItemStyle() const { return static_cast(styleItem); } class PropertyChange; class ListItemDragArea; class ListViewProxy; class UCViewItemsAttachedPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(UCViewItemsAttached) public: UCViewItemsAttachedPrivate(); ~UCViewItemsAttachedPrivate(); void init(); static UCViewItemsAttachedPrivate *get(UCViewItemsAttached *item) { return item ? item->d_func() : 0; } void clearFlickablesList(); void buildFlickablesList(); bool addSelectedItem(UCListItem *item); bool removeSelectedItem(UCListItem *item); bool isItemSelected(UCListItem *item); void enterDragMode(); void leaveDragMode(); bool isDragUpdatedConnected(); void updateSelectedIndices(int fromIndex, int toIndex); // expansion void expand(int index, UCListItem *listItem, bool emitChangeSignal = true); void collapse(int index, bool emitChangeSignal = true); void collapseAll(); void toggleExpansionFlags(bool enable); QSet selectedList; QMap > expansionList; QList< QPointer > flickables; QPointer boundItem; ListViewProxy *listView; ListItemDragArea *dragArea; UCViewItemsAttached::ExpansionFlags expansionFlags; bool selectable:1; bool draggable:1; bool ready:1; }; #endif // UCVIEWITEM_P_H ./src/Ubuntu/Components/plugin/sortfiltermodel.h0000644000015600001650000000422712700370701022162 0ustar jenkinsjenkins/* * Copyright (C) 2012-2014 Canonical, Ltd. * * Authors: * Michal Hruby * Christian Dywan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef QSORTFILTERPROXYMODELQML_H #define QSORTFILTERPROXYMODELQML_H #include #include "sortbehavior.h" #include "filterbehavior.h" class Q_DECL_EXPORT QSortFilterProxyModelQML : public QSortFilterProxyModel { Q_OBJECT Q_PROPERTY(QAbstractItemModel* model READ sourceModel WRITE setModel NOTIFY modelChanged) Q_PROPERTY(int count READ count NOTIFY countChanged) Q_PROPERTY(SortBehavior* sort READ sortBehavior NOTIFY sortChanged) Q_PROPERTY(FilterBehavior* filter READ filterBehavior NOTIFY filterChanged) public: explicit QSortFilterProxyModelQML(QObject *parent = 0); Q_INVOKABLE QVariantMap get(int row); QVariant data(int row, int role); Q_INVOKABLE int count(); virtual bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; /* getters */ QHash roleNames() const; /* setters */ void setFilterProperty(const QString& property); void setModel(QAbstractItemModel *model); Q_SIGNALS: void countChanged(); void modelChanged(); void sortChanged(); void filterChanged(); private: SortBehavior m_sortBehavior; SortBehavior* sortBehavior(); void sortChangedInternal(); FilterBehavior m_filterBehavior; FilterBehavior* filterBehavior(); void filterChangedInternal(); int roleByName(const QString& roleName) const; }; #endif // QSORTFILTERPROXYMODELQML_H ./src/Ubuntu/Components/plugin/uclabel.h0000644000015600001650000000527012700370714020356 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCLABEL_H #define UCLABEL_H #include #include "ucthemingextension.h" // C++ std lib for std::function declaration #include class UCLabelPrivate; class UCLabel : public QQuickText, public UCThemingExtension { Q_OBJECT Q_INTERFACES(UCThemingExtension) Q_ENUMS(TextSize) Q_PROPERTY(TextSize textSize READ textSize WRITE setTextSize NOTIFY textSizeChanged FINAL) // Overriden from QQuickText Q_PROPERTY(RenderType renderType READ renderType WRITE setRenderType) Q_PROPERTY(QFont font READ font WRITE setFont2 NOTIFY fontChanged2) Q_PROPERTY(QColor color READ color WRITE setColor2 NOTIFY colorChanged2) // Deprecated. Q_PROPERTY(QString fontSize READ fontSize WRITE setFontSize NOTIFY fontSizeChanged) public: typedef std::function ColorProviderFunc; UCLabel(QQuickItem* parent=0); // custom constructor to create the label with a different default color provider UCLabel(ColorProviderFunc defaultColor, QQuickItem *parent = 0); ~UCLabel(); enum TextSize { XxSmall = 0, XSmall = 1, Small = 2, Medium = 3, Large = 4, XLarge = 5 }; TextSize textSize() const; void setTextSize(TextSize size); // overriden from QQuickText void setFont2(const QFont &font); void setColor2(const QColor &color); void setRenderType(RenderType renderType); // Deprecated. QString fontSize() const; void setFontSize(const QString& fontSize); protected: // from QQuickItem void classBegin(); // from UCItemExtension void preThemeChanged(){} void postThemeChanged(); Q_SIGNALS: void textSizeChanged(); // overrides void fontChanged2(); void colorChanged2(); // Deprecated. void fontSizeChanged(); private: QScopedPointer d_ptr; Q_DECLARE_PRIVATE_D(d_ptr.data(), UCLabel) Q_DISABLE_COPY(UCLabel) Q_PRIVATE_SLOT(d_func(), void updateRenderType()) }; QML_DECLARE_TYPE(UCLabel) #endif // UCLABEL_H ./src/Ubuntu/Components/plugin/uchaptics.h0000644000015600001650000000400612700370701020722 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UCHAPTICS_H #define UCHAPTICS_H #include #include #include class UCHaptics : public QObject { Q_OBJECT Q_PROPERTY(bool enabled READ enabled NOTIFY enabledChanged) Q_PROPERTY(QObject *effect READ effect CONSTANT) public: explicit UCHaptics(QObject *parent = 0); bool enabled() const; QObject *effect() const; Q_SIGNALS: void enabledChanged(); public Q_SLOTS: void play(const QVariant &customEffect = QVariant()); }; class QQmlEngine; class HapticsProxy : public QObject { Q_OBJECT public: explicit HapticsProxy(QObject *parent = 0) : QObject(parent) , m_proxyObject(Q_NULLPTR) , m_engine(static_cast(parent)) { if (!m_engine) { qFatal("HaptixProxy must be a child of the QML Engine!"); } } ~HapticsProxy() { m_instance = Q_NULLPTR; } static HapticsProxy *instance(QQmlEngine *engine = Q_NULLPTR) { if (!m_instance) { m_instance = new HapticsProxy(engine); } return m_instance; } void initialize(); bool enabled(); QObject *effect(); void play(const QVariant &customEffect); Q_SIGNALS: void enabledChanged(); private: static HapticsProxy *m_instance; QObject *m_proxyObject; QQmlEngine *m_engine; }; #endif // UCHAPTICS_H ./src/Ubuntu/Components/plugin/ucbottomedge_p.h0000644000015600001650000000644612700370714021755 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef UCBOTTOMEDGE_P_H #define UCBOTTOMEDGE_P_H #include "ucbottomedge.h" #include "ucstyleditembase_p.h" #include "ucaction.h" #include using namespace UbuntuToolkit; class UCBottomEdgeStyle; class UCBottomEdgePrivate : public UCStyledItemBasePrivate, protected QQuickItemChangeListener { Q_DECLARE_PUBLIC(UCBottomEdge) public: UCBottomEdgePrivate(); static UCBottomEdgePrivate *get(UCBottomEdge *item) { return item->d_func(); } void init(); void completeComponentInitialization() override; // data property QQmlListProperty data(); static void overload_data_append(QQmlListProperty *, QObject *); static void overload_data_clear(QQmlListProperty *); // range funcs void appendRegion(UCBottomEdgeRegion *range); void clearRegions(bool destroy); void validateRegion(UCBottomEdgeRegion *region, int regionsSize = -1); // page header manipulation void patchContentItemHeader(); void updateProgressionStates(qreal distance); bool setActiveRegion(UCBottomEdgeRegion *range); void detectDirection(qreal currentDistance); void setDragDirection(UCBottomEdge::DragDirection direction); void onDragEnded(); void commit(qreal to); // panel positioning void setDragProgress(qreal position); // internal setters void setStatus(UCBottomEdge::Status status); // from UCStyledItemBase bool loadStyleItem(bool animated = true) override; // from QQuickItemChangeListener void itemChildAdded(QQuickItem *item, QQuickItem *child); void itemChildRemoved(QQuickItem *item, QQuickItem *child); void setCurrentContent(); void resetCurrentContent(QQuickItem *newItem); // members QList regions; QPointer currentContentItem; UCBottomEdgeRegion *defaultRegion; UCBottomEdgeRegion *activeRegion; UCBottomEdgeHint *hint; UCBottomEdgeStyle *bottomPanel; qreal previousDistance; qreal dragProgress; UCBottomEdge::Status status; enum OperationStatus { Idle, CommitToTop, CommitToRegion, Collapsing }; OperationStatus operationStatus; UCBottomEdge::DragDirection dragDirection; bool defaultRegionsReset:1; bool mousePressed:1; bool preloadContent:1; // status management void setOperationStatus(OperationStatus s); bool isLocked() { return operationStatus > Idle; } }; class UCCollapseAction : public UCAction { Q_OBJECT public: UCCollapseAction(QObject *parent = 0); void activate(); }; #endif // UCBOTTOMEDGE_P_H ./src/Ubuntu/Components/plugin/qquickclipboard.h0000644000015600001650000000265112700370701022120 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef QQUICKCLIPBOARD_H #define QQUICKCLIPBOARD_H #include #include #include class QQuickMimeData; class QQmlEngine; class QJSEngine; class QQuickClipboardPrivate; class QQuickClipboard : public QObject { Q_OBJECT Q_PROPERTY(QQuickMimeData *data READ data NOTIFY dataChanged) public: explicit QQuickClipboard(QObject *parent = 0); Q_INVOKABLE QQuickMimeData *newData(); private: //getter/setter QQuickMimeData *data(); Q_SIGNALS: void dataChanged(); public Q_SLOTS: void push(const QVariant& data); void clear(); private: Q_DECLARE_PRIVATE(QQuickClipboard) QScopedPointer d_ptr; }; #endif // QQUICKCLIPBOARD_H ./src/Ubuntu/Components/ListItems/0000755000015600001650000000000012700370701017205 5ustar jenkinsjenkins./src/Ubuntu/Components/ListItems/1.3/0000755000015600001650000000000012700370701017506 5ustar jenkinsjenkins./src/Ubuntu/Components/ListItems/1.3/Caption.qml0000644000015600001650000000374112700370701021623 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype Caption \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief List item that shows a piece of text. \note \b{The component is deprecated. Use ListItem and Captiopns components instead.} Examples: \qml import Ubuntu.Components.ListItems 1.3 as ListItem Column { ListItem.Standard { text: "Default list item." } ListItem.Caption { text: "This is a caption text, which can span multiple lines." } } \endqml */ Item { height: captionText.contentHeight + units.gu(2) * 2 width: parent ? parent.width : units.gu(31) /*! The text that is shown in the list item as a label. \qmlproperty string text */ property alias text: captionText.text Label { id: captionText anchors { verticalCenter: parent.verticalCenter left: parent.left right: parent.right //Margins are currently hardcoded to avoid adding new API leftMargin: units.gu(2) rightMargin: units.gu(2) } wrapMode: Text.Wrap color: theme.palette.normal.backgroundText horizontalAlignment: Text.AlignLeft textSize: Label.Small } } ./src/Ubuntu/Components/ListItems/1.3/Expandable.qml0000644000015600001650000001665612700370701022302 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype Expandable \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief An expandable list item with no contents. The Expandable class can be used for generic list items containing other components such as buttons. It subclasses \l Empty and thus brings all that functionality, but additionally provides means to expand and collapse the item. When used together with an \l UbuntuListView or \l ExpandablesColumn it can coordinate with other items in the list to make sure it is scrolled while expanding to be fully visible in the view. Additionally it is made sure that only one Expandable item is expanded at a time and it is collapsed when the user clicks outside the item. You can set \l expanded to true/false to expand/collapse the item. Examples: \qml import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem Item { ListModel { id: listModel } ListItem.UbuntuListView { anchors { left: parent.left; right: parent.right } height: units.gu(24) model: listModel delegate: ListItem.Expandable { id: expandingItem expandedHeight: units.gu(30) onClicked: { expanded = true; } } } } \endqml */ Empty { id: root implicitHeight: expanded ? priv.maxExpandedHeight : collapsedHeight /*! Reflects the expanded state. Set this to true/false to expand/collapse the item. */ property bool expanded: false /*! The collapsed (normal) height of the item. Defaults to the standard height for list items. */ property real collapsedHeight: __height /*! The expanded height of the item's content. Defaults to the same as collapsedHeight which disables the expanding feature. In order for the item to be expandable, set this to the expanded size. Note that the actual expanded size can be smaller if there is not enough space in the containing list. In that case the item becomes flickable automatically. */ property real expandedHeight: collapsedHeight /*! If set to true, the item will collapse again when the user clicks somewhere in the always visible (when collapsed) area. */ property bool collapseOnClick: false /*! Reparent any content to inside the Flickable \qmlproperty QtObject children \default */ default property alias children: flickableContent.data /*! \internal */ QtObject { id: priv /*! \internal Points to the containing ExpandablesListView or ExpandablesColumn */ property Item view: root.ListView.view ? root.ListView.view : (root.parent.parent.parent.hasOwnProperty("expandItem") ? root.parent.parent.parent : null) /*! \internal Gives information whether this item is inside an item based container supporting Expandable items, such as ExpandablesColumn */ readonly property bool isInExpandableColumn: view && view !== undefined && view.hasOwnProperty("expandItem") && view.hasOwnProperty("collapse") /*! \internal Gives information whether this item is inside an index based container supporting Expandable items, such as UbuntuListView */ readonly property bool isInExpandableListView: view && view !== undefined && view.hasOwnProperty("expandedIndex") /*! \internal Gives information if there is another item expanded in the containing ExpandablesListView or ExpandablesColumn */ readonly property bool otherExpanded: (isInExpandableColumn && view.expandedItem !== null && view.expandedItem !== undefined && view.expandedItem !== root) || (isInExpandableListView && view.expandedIndex !== -1 && view.expandedIndex !== index) /*! \internal Gives information about the maximum expanded height, in case that is limited by the containing ExpandablesListView or ExpandablesColumn */ readonly property real maxExpandedHeight: (isInExpandableColumn || isInExpandableListView) ? Math.min(view.height - collapsedHeight, expandedHeight) : expandedHeight } states: [ State { name: "" PropertyChanges { target: root; opacity: 1 } }, State { name: "otherExpanded"; when: priv.otherExpanded PropertyChanges { target: root; opacity: .5 } }, State { name: "expanded"; when: expanded PropertyChanges { target: root; z: 3 } } ] Component.onCompleted: { if (priv.isInExpandableListView && priv.view.expandedIndex == index) { root.expanded = true; } } Connections { target: priv.isInExpandableListView ? priv.view : null onExpandedIndexChanged: { if (priv.view.expandedIndex == index) { root.expanded = true; } else if (root.expanded = true) { root.expanded = false; } } } /*! \internal */ onExpandedChanged: { if (!expanded) { contentFlickable.contentY = 0; } if (priv.isInExpandableColumn) { if (expanded) { priv.view.expandItem(root); } else { priv.view.collapse(); } } } Behavior on height { UbuntuNumberAnimation {} } Behavior on opacity { UbuntuNumberAnimation {} } Flickable { id: contentFlickable objectName: "__expandableContentFlickable" anchors { fill: parent; leftMargin: root.__contentsMargins; rightMargin: __contentsMargins; bottomMargin: divider.height } interactive: root.expanded && contentHeight > height + root.divider.height contentHeight: root.expandedHeight flickableDirection: Flickable.VerticalFlick clip: true Behavior on contentY { UbuntuNumberAnimation {} } Item { id: flickableContent anchors { left: parent.left right: parent.right } height: childrenRect.height } } MouseArea { anchors { left: parent.left; top: parent.top; right: parent.right } enabled: root.collapseOnClick && root.expanded height: root.collapsedHeight onClicked: { if (priv.isInExpandableListView) { priv.view.expandedIndex = -1; } else { root.expanded = false; } } } } ./src/Ubuntu/Components/ListItems/1.3/MultiValue.qml0000644000015600001650000000553312700370701022316 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype MultiValue \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief List item displaying multiple values. \note \b{The component is deprecated. Use ListItem component instead.} Examples: \qml import Ubuntu.Components.ListItems 1.3 as ListItem Column { ListItem.MultiValue { text: "Label" values: ["Value 1", "Value 2", "Value 3", "Value 4"] onClicked: selected = !selected } ListItem.MultiValue { text: "Label" iconName: "compose" values: ["Value 1", "Value 2", "Value 3", "Value 4"] progression: true onClicked: print("clicked") } } \endqml */ Base { id: multiValueListItem /*! The list of values that will be shown under the label text */ property variant values Item { height: label.height + valueLabel.height anchors { verticalCenter: parent.verticalCenter left: parent.left right: parent.right } LabelVisual { id: label selected: multiValueListItem.selected anchors { top: parent.top left: parent.left right: parent.right } text: multiValueListItem.text } LabelVisual { id: valueLabel selected: multiValueListItem.selected secondary: true anchors { top: label.bottom left: parent.left right: parent.right } textSize: Label.Small text: concatenatedValues(multiValueListItem.values) function concatenatedValues(values) { var n = values.length; var result = ""; if (n > 0) { result = values[0]; for (var i = 1; i < n; i++) { result = result + ", " + values[i]; } } return result; } } } } ./src/Ubuntu/Components/ListItems/1.3/IconVisual.qml0000644000015600001650000000313512700370701022277 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 // internal helper class to create the visuals // for the icon. Item { id: iconVisual /*! \qmlproperty url source */ property alias source: icon.source /*! \qmlproperty url fallbackSource */ property alias fallbackSource: icon.fallbackSource /*! \qmlproperty string fallbackIconName */ property string fallbackIconName visible: source != "" property bool hasFrame: true ImageWithFallback { id: icon visible: !iconVisual.hasFrame opacity: iconVisual.enabled ? 1.0 : 0.5 fillMode: Image.PreserveAspectCrop anchors.fill: parent smooth: true asynchronous: true fallbackSource: iconVisual.fallbackIconName ? "image://theme/" + iconVisual.fallbackIconName : "" } UbuntuShape { id: shape visible: iconVisual.hasFrame anchors.fill: parent source: icon } } ./src/Ubuntu/Components/ListItems/1.3/Base.qml0000644000015600001650000001265312700370701021102 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype Base \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief Parent class of various list item classes that can have an icon and a progression symbol. \note \b{The component is deprecated. Use ListItem component instead.} Examples: See subclasses */ Empty { id: baseListItem /*! \deprecated \b{Use iconName or iconSource instead.} The location of the icon to show in the list item (optional), or an Item that is shown on the left side inside the list item. The icon will automatically be anchored to the left side of the list item, and if its height is undefined, to the top and bottom of the list item. \qmlproperty variant icon */ property variant icon: iconSource != "" ? iconSource : undefined /*! The location of the icon to show in the list item if iconSource failed to load (optional). \qmlproperty url fallbackIconSource */ property alias fallbackIconSource: iconHelper.fallbackSource /*! The icon shown in the list item if iconName failed to load (optional). \qmlproperty string fallbackIconName If both fallbackIconSource and fallbackIconName are defined, fallbackIconName will be ignored. \note The complete list of icons available in Ubuntu is not published yet. For now please refer to the folders where the icon themes are installed: \list \li Ubuntu Touch: \l file:/usr/share/icons/suru \li Ubuntu Desktop: \l file:/usr/share/icons/ubuntu-mono-dark \endlist These 2 separate icon themes will be merged soon. */ property alias fallbackIconName: iconHelper.fallbackIconName /*! Show or hide the progression symbol. */ property bool progression: false /*! Show or hide the frame around the icon \qmlproperty bool iconFrame */ property alias iconFrame: iconHelper.hasFrame /*! \internal \deprecated Width of the icon to be displayed */ property real __iconWidth /*! \internal \deprecated Height of the icon to be displayed */ property real __iconHeight /*! \internal \deprecated The margin on the left side of the icon. */ property real __leftIconMargin /*! \internal \deprecated The margin on the right side of the icon. */ property real __rightIconMargin IconVisual { id: iconHelper width: height height: Math.min(units.gu(5), parent.height - units.gu(1)) anchors { left: parent.left leftMargin: baseListItem.__contentsMargins verticalCenter: parent.verticalCenter } } /*! \internal The \l icon property is an Item. The value is false if \l icon is a string, or when no icon was set. */ property bool __iconIsItem: false /*! \internal */ onIconChanged: { if (icon == undefined) return; if (icon != iconSource) { console.warn("WARNING: ListItems.Base.icon is DEPRECATED. " + "Use iconName and iconSource instead.") } if (typeof icon == "string" || typeof icon == typeof iconSource) { // icon is the url of an image iconHelper.source = icon; __iconIsItem = false; } else { // icon is an Item. __iconIsItem = true; iconHelper.source = ""; icon.parent = baseListItem; icon.anchors.left = baseListItem.left; icon.anchors.margins = Qt.binding(function() { return baseListItem.__contentsMargins }); if (!icon.height) { icon.anchors.top = baseListItem.top; icon.anchors.bottom = baseListItem.bottom; } } } /*! \internal */ default property alias children: middle.data Item { id: middle property bool anchorToIconHelper: !__iconIsItem && iconHelper.source != "" anchors { top: parent.top bottom: parent.bottom left: anchorToIconHelper ? iconHelper.right : parent.left right: baseListItem.progression ? progressionHelper.left : parent.right rightMargin: baseListItem.__contentsMargins leftMargin: __iconIsItem ? icon.width + 2 * baseListItem.__contentsMargins : baseListItem.__contentsMargins } } ProgressionVisual { id: progressionHelper visible: baseListItem.progression anchors { right: parent.right rightMargin: baseListItem.__contentsMargins top: parent.top bottom: parent.bottom } } } ./src/Ubuntu/Components/ListItems/1.3/ValueSelector.qml0000644000015600001650000002267612700370701023013 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! ****DEPRECATED! PLEASE USE ITEM SELECTOR OR FOR THE UBUNTU SHAPE VERSION THE OPTION SELECTOR.**** \qmltype ValueSelector \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief List item displaying single selected value when not expanded, where expanding it opens a listing of all the possible values for selection. Examples: \qml import Ubuntu.Components.ListItems 1.3 as ListItem Column { width: 250 ListItem.ValueSelector { text: "Standard" values: ["Value 1", "Value 2", "Value 3", "Value 4"] } ListItem.ValueSelector { text: "Disabled" values: ["Value 1", "Value 2", "Value 3", "Value 4"] enabled: false } ListItem.ValueSelector { text: "Expanded" values: ["Value 1", "Value 2", "Value 3", "Value 4"] expanded: true } ListItem.ValueSelector { text: "Icon" iconName: "compose" values: ["Value 1", "Value 2", "Value 3", "Value 4"] selectedIndex: 2 } } \endqml */ Empty { id: selector __height: column.height /*! The text that is shown in the list item as a label. \qmlproperty string text */ /*! \deprecated \b{Use iconName or iconSource instead.} The location of the icon to show in the list item (optional), or an Item that is shown on the left side inside the list item. The icon will automatically be anchored to the left side of the list item, and if its height is undefined, to the top and bottom of the list item. \qmlproperty variant icon */ property alias icon: selectorMain.icon /*! The location of the icon to show in the list item if iconSource failed to load (optional). \qmlproperty url fallbackIconSource */ property alias fallbackIconSource: selectorMain.fallbackIconSource /*! The icon shown in the list item if iconName failed to load (optional). \qmlproperty string fallbackIconName If both fallbackIconSource and fallbackIconName are defined, fallbackIconName will be ignored. \note The complete list of icons available in Ubuntu is not published yet. For now please refer to the folders where the icon themes are installed: \list \li Ubuntu Touch: \l file:/usr/share/icons/suru \li Ubuntu Desktop: \l file:/usr/share/icons/ubuntu-mono-dark \endlist These 2 separate icon themes will be merged soon. */ property alias fallbackIconName: selectorMain.fallbackIconName /*! \internal \deprecated Width of the icon to be displayed */ property real __iconWidth /*! \internal \deprecated Height of the icon to be displayed */ property real __iconHeight /*! \internal \deprecated The margins on the left side of the icon. */ property real __leftIconMargin /*! \internal \deprecated The margins on the right side of the icon. */ property real __rightIconMargin /*! Show or hide the frame around the icon \qmlproperty bool iconFrame */ property alias iconFrame: selectorMain.iconFrame /*! The list of values that will be shown under the label text */ property variant values /*! The index of the currently selected element from the \l values array. */ property int selectedIndex: 0 /*! Specifies whether the selector is 'open' or 'closed'. */ property bool expanded: false showDivider: false Column { id: column anchors { left: parent.left right: parent.right topMargin: units.dp(2) bottomMargin: units.dp(2) } Base { id: selectorMain height: units.gu(6) showDivider: true onClicked: selector.expanded = !selector.expanded selected: selector.selected iconSource: selector.iconSource LabelVisual { id: label anchors { verticalCenter: parent.verticalCenter left: parent.left } text: selector.text width: Math.min(implicitWidth, parent.width * 0.8) } LabelVisual { id: valueLabel anchors { verticalCenter: parent.verticalCenter right: accordion.left rightMargin: selector.__contentsMargins leftMargin: selector.__contentsMargins left: label.right } textSize: Label.Small text: selector.values[selector.selectedIndex] font.bold: selector.expanded horizontalAlignment: Text.AlignRight } Item { id: accordion width: accordionIcon.width anchors { right: parent.right top: parent.top bottom: parent.bottom } Image { id: accordionIcon anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter source: Qt.resolvedUrl("../../artwork/chevron.png") opacity: enabled ? 1.0 : 0.5 rotation: expanded ? 270 : 90 width: implicitWidth / 1.5 height: implicitHeight / 1.5 states: [ State { name: "expanded" when: selector.expanded PropertyChanges { target: accordionIcon; rotation: 270 } }, State { name: "closed" when: !selector.expanded PropertyChanges { target: accordionIcon; rotation: 90 } } ] transitions: Transition { UbuntuNumberAnimation { target: accordionIcon properties: "rotation" duration: UbuntuAnimation.SnapDuration } } } } } Repeater { id: valueRepeater property int valueHeight: selector.expanded ? units.gu(5) : 0 states: [ State { name: "expanded" when: selector.expanded PropertyChanges { target: valueRepeater valueHeight: units.gu(5) } }, State { name: "closed" when: !selector.expanded PropertyChanges { target: valueRepeater valueHeight: 0 } } ] transitions: Transition { UbuntuNumberAnimation { target: valueRepeater properties: "valueHeight" duration: UbuntuAnimation.SnapDuration } } model: selector.values Rectangle { color: Qt.lighter(theme.palette.normal.base) height: valueRepeater.valueHeight width: parent.width Empty { id: valueBase height: parent.height visible: valueBase.height > 0 onClicked: { selector.selectedIndex = index selector.expanded = false } selected: index === selector.selectedIndex LabelVisual { text: modelData anchors { left: parent.left leftMargin: units.gu(3) verticalCenter: parent.verticalCenter } font.bold: valueBase.selected property real heightMargin: valueBase.height - implicitHeight visible: heightMargin > 0 // fade in/out the values when expanding/contracting the selector. opacity: heightMargin < 10 ? heightMargin/10 : 1 } } } } } } ./src/Ubuntu/Components/ListItems/1.3/Subtitled.qml0000644000015600001650000000651512700370701022167 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype MultiValue \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief List item displaying a second string under the main label. \note \b{The component is deprecated. Use ListItem component instead.} Examples: \qml import Ubuntu.Components.ListItems 1.3 as ListItem Column { ListItem.Subtitled { text: "Idle" subText: "Secondary label" } ListItem.Subtitled { text: "Disabled" enabled: false subText: "Secondary label" } ListItem.Subtitled { text: "Selected" selected: true subText: "Secondary label" } ListItem.Subtitled { text: "Progression" subText: "Secondary label" progression: true } ListItem.Subtitled { text: "Icon" subText: "Secondary label" iconName: "compose" } ListItem.Subtitled { text: "Multiple lines" subText: "This is a multi-line subText.\nUp to 5 lines are supported." } ListItem.Subtitled { text: "Multiple lines" subText: "It also works well with icons and progression." iconName: "compose" progression: true } } \endqml */ Base { id: subtitledListItem __height: Math.max(middleVisuals.height, units.gu(6)) /*! The list of strings that will be shown under the label text \qmlproperty string subText */ property alias subText: subLabel.text Item { id: middleVisuals anchors { left: parent.left right: parent.right verticalCenter: parent.verticalCenter } height: childrenRect.height + label.anchors.topMargin + subLabel.anchors.bottomMargin LabelVisual { id: label text: subtitledListItem.text selected: subtitledListItem.selected anchors { top: parent.top left: parent.left right: parent.right } } LabelVisual { id: subLabel selected: subtitledListItem.selected secondary: true anchors { left: parent.left right: parent.right top: label.bottom } textSize: Label.Small wrapMode: Text.Wrap maximumLineCount: 5 } } } ./src/Ubuntu/Components/ListItems/1.3/ExpandablesColumn.qml0000644000015600001650000000773212700370701023636 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype ExpandablesColumn \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief A column to be used together with the \l Expandable item. This lays out its content just like a regular Column inside a Flickable but when used together with items of type \l Expandable it provides additional features like automatically positioning the expanding item when it expands and collapsing it again when the user taps outside of it. Examples: \qml import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem ListItem.ExpandablesColumn { anchors { left: parent.left; right: parent.right } height: units.gu(24) Repeater { model: 8 ListItem.Expandable { expandedHeight: units.gu(30) onClicked: { expanded = true; } } } } \endqml */ Flickable { id: root contentHeight: column.height /*! Points to the currently expanded item. Null if no item is expanded. \qmlproperty Item expandedItem */ readonly property alias expandedItem: priv.expandedItem /*! Expand the given item. The item must be a child of this ListView. */ function expandItem(item) { if (!item.hasOwnProperty("expandedHeight") || !item.hasOwnProperty("collapsedHeight")) { return; } if (priv.expandedItem != null) { priv.expandedItem.expanded = false; } priv.expandedItem = item; var maxExpandedHeight = root.height - item.collapsedHeight; var expandedItemHeight = Math.min(item.expandedHeight, maxExpandedHeight); var bottomIntersect = root.mapFromItem(item).y + expandedItemHeight - maxExpandedHeight; if (bottomIntersect > 0) { contentY += bottomIntersect; } } /*! Collapse the currently expanded item. If there isn't any item expanded, this function does nothing. */ function collapse() { priv.expandedItem.expanded = false; priv.expandedItem = null; } /*! Reparent any content to inside the Column. \qmlproperty QtObject children \default */ default property alias children: column.data /*! \internal */ QtObject { id: priv /*! \internal Points to the currently expanded item. Null if no item is expanded. */ property var expandedItem: null } Behavior on contentY { UbuntuNumberAnimation { } } Column { id: column anchors { left: parent.left; right: parent.right } } MouseArea { anchors { left: parent.left; right: parent.right; top: parent.top } height: root.mapFromItem(priv.expandedItem).y + root.contentY enabled: priv.expandedItem != null onClicked: root.collapse(); } MouseArea { anchors { left: parent.left; right: parent.right; bottom: parent.bottom } height: priv.expandedItem != null ? root.contentHeight - (root.mapFromItem(priv.expandedItem).y + root.contentY + priv.expandedItem.height) : 0 enabled: priv.expandedItem != null onClicked: root.collapse(); } } ./src/Ubuntu/Components/ListItems/1.3/ThinDivider.qml0000644000015600001650000000521712700370701022437 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype ThinDivider \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief Narrow line used as a divider between ListItems. \note \b{The component is deprecated. Use ListItem component's divider property instead.} ListItems will usually include this line at the bottom of the item to give a visually pleasing list of items. But a divider line can also be inserted manually using this component. Examples: \qml import Ubuntu.Components.ListItems 1.3 as ListItem Column { width: 250 ListItem.ThinDivider {} //can be used as header for list ListItem.Standard { text: "List Item without thin divider line" showDivider: false } ListItem.ThinDivider {} // manually inserted divider line ListItem.Standard { text: "ListItem with thin divider line" } } \endqml */ Rectangle { anchors { left: (parent) ? parent.left : null right: (parent) ? parent.right : null } height: (visible) ? units.dp(2) : 0 // a private property to catch theme background color change // use private property instead of embedding it into a QtObject to avoid further // performance decrease property bool __lightBackground: ColorUtils.luminance(theme.palette.normal.background) > 0.85 // use a gradient of 4 steps instead of instantiating two Rectangles for performance reasons gradient: Gradient { GradientStop { position: 0.0; color: __lightBackground ? Qt.rgba(0, 0, 0, 0.1) : Qt.rgba(0, 0, 0, 0.4) } GradientStop { position: 0.49; color: __lightBackground ? Qt.rgba(0, 0, 0, 0.1) : Qt.rgba(0, 0, 0, 0.4) } GradientStop { position: 0.5; color: __lightBackground ? Qt.rgba(1, 1, 1, 0.4) : Qt.rgba(1, 1, 1, 0.1) } GradientStop { position: 1.0; color: __lightBackground ? Qt.rgba(1, 1, 1, 0.4) : Qt.rgba(1, 1, 1, 0.1) } } } ./src/Ubuntu/Components/ListItems/1.3/Standard.qml0000644000015600001650000002262112700370701021764 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype Standard \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief The standard list item class. It shows a basic list item with a label (text), and optionally an icon, a progression arrow, and it can have an embedded Item (\l control) that can be used for including Buttons, Switches etc. inside the list item. \note \b{The component is deprecated. Use ListItem component instead.} \l {http://design.ubuntu.com/apps/building-blocks/list-items}{See also the Design Guidelines on List Items}. Examples: \qml import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem Column { ListItem.Standard { text: "Selectable standard list item" selected: false onClicked: selected = !selected } ListItem.Standard { text: "List item with icon" iconName: "compose" } ListItem.Standard { text: "With a progression arrow" progression: true } ListItem.Standard { text: "Control" control: Button { text: "Click me" width: units.gu(19) onClicked: print("Clicked") } progression: true } } \endqml */ Empty { id: listItem /*! \deprecated \b{Use iconName or iconSource instead.} The location of the icon to show in the list item (optional), or an Item that is shown on the left side inside the list item. The icon will automatically be anchored to the left side of the list item, and if its height is undefined, to the top and bottom of the list item. \qmlproperty variant icon */ property variant icon: iconSource != "" ? iconSource : undefined /*! The location of the icon to show in the list item if iconSource failed to load (optional). \qmlproperty url fallbackIconSource */ property alias fallbackIconSource: iconHelper.fallbackSource /*! The icon shown in the list item if iconName failed to load (optional). \qmlproperty string fallbackIconName If both fallbackIconSource and fallbackIconName are defined, fallbackIconName will be ignored. \note The complete list of icons available in Ubuntu is not published yet. For now please refer to the folders where the icon themes are installed: \list \li Ubuntu Touch: \l file:/usr/share/icons/suru \li Ubuntu Desktop: \l file:/usr/share/icons/ubuntu-mono-dark \endlist These 2 separate icon themes will be merged soon. */ property alias fallbackIconName: iconHelper.fallbackIconName /*! The text that is shown in the list item as a label. \qmlproperty string text */ /*! Show or hide the progression symbol. */ property bool progression: false /*! \internal \deprecated Width of the icon to be displayed */ property real __iconWidth /*! \internal \deprecated Height of the icon to be displayed */ property real __iconHeight /*! \internal \deprecated The margins on the left side of the icon. */ property real __leftIconMargin /*! \internal \deprecated The margins on the right side of the icon. */ property real __rightIconMargin /*! An optional control that is displayed inside the list item. The width of the control must be specified in order to determine the layout of the list item. \qmlproperty Item control */ property alias control: controlContainer.control /*! Show or hide the frame around the icon \qmlproperty bool iconFrame */ property alias iconFrame: iconHelper.hasFrame // If there is a control, the controlArea covers the listItem's mouseArea, // so in that case use the highlights below when pressed highlightWhenPressed: !listItem.control // Avoid emit clicked signals when clicking on the control area __acceptEvents: false /*! \internal */ property bool __controlAreaPressed: false Rectangle { id: controlHighlight visible: listItem.swipingState === "" ? control && __controlAreaPressed : false anchors { top: parent.top right: progressionHelper.visible ? progressionHelper.left : parent.right bottom: parent.bottom left: parent.left } color: theme.palette.highlighted.background } Rectangle { id: progressionHighlight visible: listItem.swipingState === "" ? listItem.progression && progressionHelper.showSplit && listItem.pressed && !__controlAreaPressed : false anchors { left: progressionHelper.left top: parent.top bottom: parent.bottom right: parent.right } color: theme.palette.highlighted.background } IconVisual { id: iconHelper width: height height: Math.min(units.gu(5), listItem.height - units.gu(1)) anchors { left: parent.left leftMargin: listItem.__contentsMargins verticalCenter: parent.verticalCenter } } /*! \internal The \l icon property is an Item. The value is false if \l icon is a string, or when no icon was set. */ property bool __iconIsItem: false /*! \internal */ onIconChanged: { if (icon == undefined) return; if (icon != iconSource) { console.warn("WARNING: ListItems.Standard.icon is DEPRECATED. " + "Use iconName and iconSource instead.") } if (typeof icon == "string" || typeof icon == typeof iconSource) { // icon is the url of an image iconHelper.source = icon; __iconIsItem = false; } else { // icon is an Item. __iconIsItem = true; iconHelper.source = ""; icon.parent = listItem; icon.anchors.left = listItem.left; icon.anchors.margins = Qt.binding(function() { return listItem.__contentsMargins }); if (!icon.height) { icon.anchors.top = listItem.top; icon.anchors.bottom = listItem.bottom; } } } /*! \internal The \l foregroundGroundColor property stores the internal label color. */ property alias __foregroundColor: label.color LabelVisual { id: label property bool anchorToIconHelper: !__iconIsItem && iconHelper.source != "" selected: listItem.selected anchors { verticalCenter: parent.verticalCenter left: anchorToIconHelper ? iconHelper.right : parent.left leftMargin: __iconIsItem ? icon.width + 2 * listItem.__contentsMargins : listItem.__contentsMargins right: control ? controlContainer.left : (progression ? progressionHelper.left : parent.right) rightMargin: listItem.__contentsMargins } text: listItem.text } Item { id: controlContainer property Item control // use the width of the control if there is (possibly elided) text, // or full width available if there is no text. width: control ? control.width : undefined height: control ? control.height : undefined anchors { right: listItem.progression ? progressionHelper.left : parent.right rightMargin: listItem.__contentsMargins verticalCenter: parent.verticalCenter } onControlChanged: { if (control) control.parent = controlContainer; } Connections { target: listItem.__mouseArea onClicked: { listItem.trigger(); listItem.clicked(); } onPressAndHold: listItem.pressAndHold() } } /*! \internal */ onPressedChanged: { if (listItem.pressed && control && control.enabled && (__mouseArea.mouseX < progressionHelper.x)) { listItem.__controlAreaPressed = true } else { listItem.__controlAreaPressed = false } } ProgressionVisual { id: progressionHelper visible: listItem.progression anchors { right: parent.right rightMargin: listItem.__contentsMargins top: parent.top bottom: parent.bottom } showSplit: control ? true : false splitMargin: listItem.__contentsMargins } } ./src/Ubuntu/Components/ListItems/1.3/LabelVisual.qml0000644000015600001650000000310512700370701022423 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 // internal helper class for text inside the list items. Label { id: label property bool selected: false property bool secondary: false // FIXME: very ugly hack to detect whether the list item is inside a Popover property bool overlay: isInsideOverlay(label) function isInsideOverlay(item) { if (!item.parent) return false; return item.parent.hasOwnProperty("pointerTarget") || label.isInsideOverlay(item.parent) } elide: Text.ElideRight color: selected ? theme.palette.selected.backgroundText : (secondary ? (overlay ? theme.palette.normal.overlaySecondaryText : theme.palette.normal.backgroundSecondaryText) : (overlay ? theme.palette.normal.overlayText : theme.palette.normal.backgroundText)) opacity: label.enabled ? 1.0 : 0.5 } ./src/Ubuntu/Components/ListItems/1.3/Divider.qml0000644000015600001650000000217312700370701021612 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype Divider \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief Divider to break up list items into groups. \note \b{The component is deprecated.} Examples: see \l Header */ Image { source: Qt.resolvedUrl("../../artwork/ListItemDivider6px.png") anchors { left: parent ? parent.left : undefined right: parent ? parent.right : undefined } height: units.gu(1) } ./src/Ubuntu/Components/ListItems/1.3/Empty.qml0000644000015600001650000003411112700370701021317 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype Empty \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief A list item with no contents. \note \b{The component is deprecated. Use ListItem component instead.} The Empty class can be used for generic list items containing other components such as buttons. It is selectable and can take mouse clicks. It will attempt to detect if a thin dividing line at the bottom of the item is suitable, but this behaviour can be overridden (using \l showDivider). For specific types of list items, see its subclasses. The item will still remain in memory after being removed from the list so it is up to the application to destroy it. This can be handled by the signal \l itemRemoved that is fired after all animation is done. Examples: \qml import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem Item { Model { id: contactModel ListElement { name: "Bill Smith" number: "555 3264" } ListElement { name: "John Brown" number: "555 8426" } } ListView { width: 180; height: 200 model: contactModel delegate: ListItem.Empty { height: units.gu(6) removable: true onItemRemoved: contactModel.remove(index) Text { text: name + " " + number anchors.centerIn: parent } } } } \endqml See the documentation of the derived classes of Empty for more examples. */ AbstractButton { id: emptyListItem /*! Specifies whether the list item is selected. */ property bool selected: false /*! Highlight the list item when it is pressed. This is used to disable the highlighting of the full list item when custom highlighting needs to be implemented (for example in ListItem.Standard which can have a split). */ property bool highlightWhenPressed: true /*! Defines if this item can be removed or not. */ property bool removable: false /*! Defines if the item needs confirmation before removing by swiping. \qmlproperty bool confirmRemoval */ property alias confirmRemoval: confirmRemovalDialog.visible /*! \qmlproperty string swipingState The current swiping state ("SwipingRight" or "") */ readonly property alias swipingState: backgroundIndicator.state /*! \qmlproperty bool waitingConfirmationForRemoval Defines if the item is waiting for the user interaction during the swipe to delete */ readonly property alias waitingConfirmationForRemoval: confirmRemovalDialog.waitingForConfirmation /*! This handler is called when the item is removed from the list */ signal itemRemoved /*! \internal Defines the height of the ListItem, so correct height of this component, including divider line is calculated. */ property int __height: units.gu(6) /*! Set to show or hide the thin bottom divider line (drawn by the \l ThinDivider component). This line is shown by default except in cases where this item is the delegate of a ListView. */ property bool showDivider: true /*! \internal Reparent so that the visuals of the children does not occlude the bottom divider line. */ default property alias children: body.data /*! \internal Allows derived class to proper add items inside of this element */ property alias __contents: body /*! \qmlproperty list backgroundIndicator Defines the item background item to be showed during the item swiping */ property alias backgroundIndicator: backgroundIndicator.children /*! \qmlproperty ThinDivider divider Exposes our the bottom line divider. */ property alias divider: bottomDividerLine /*! \internal The spacing inside the list item. */ property real __contentsMargins: units.gu(2) /*! Cancel item romoval */ function cancelItemRemoval() { priv.resetDrag() priv.removed = false } width: parent ? parent.width : units.gu(31) implicitHeight: priv.removed ? 0 : __height + bottomDividerLine.height __mouseArea.drag.axis: Drag.XAxis // Keep compatible with the old version height: implicitHeight LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft LayoutMirroring.childrenInherit: true /*! \internal */ QtObject { id: priv /*! \internal Defines the offset used when the item will start to move */ readonly property int mouseMoveOffset: units.gu(1) /*! \internal Defines the offset limit to consider the item removed */ readonly property int itemMoveOffset: confirmRemoval ? width * 0.5 : width * 0.3 /*! \internal Defines the initial pressed position */ property int pressedPosition: -1 /*! \internal Defines if the item is moving or not */ property bool held: false /*! \internal Defines if the item should be removed after the animation or not */ property bool removeItem: false /*! \internal Defines if the item was removed or not */ property bool removed: false /*! \internal notify the start of the drag operation */ function startDrag() { __mouseArea.drag.target = body held = true __mouseArea.drag.maximumX = parent.width __mouseArea.drag.minimumX = 0 backgroundIndicator.visible = true } /*! \internal Resets the item dragging state */ function resetDrag() { confirmRemovalDialog.waitingForConfirmation = false held = false // before body.x to ensure animation __mouseArea.drag.target = null // stops waitingForConfirmation = true in animation body.x = 0 pressedPosition = -1 removeItem = false backgroundIndicator.opacity = 0.0 backgroundIndicator.visible = false } /*! \internal Commit the necessary changes to remove or not the item based on the mouse final position */ function commitDrag() { if (removeItem) { if (!confirmRemoval) { removeItemAnimation.start() } } else { resetDrag() } } /*! \internal notify the releaso of the mouse button and the end of the drag operation */ function endDrag() { if (Math.abs(body.x) < itemMoveOffset && held == true) { held = false removeItem = false if (body.x == 0) { resetDrag() } else { body.x = 0; } } else if (held == true) { held = false removeItem = true var finalX = body.width if (emptyListItem.confirmRemoval) { finalX = itemMoveOffset } if (body.x > 0) { body.x = finalX } else { body.x = -finalX } } } } // exposed for OptionSelector property alias __highlight: highlight Rectangle { id: highlight z: -1 visible: !priv.removed && emptyListItem.swipingState === "" ? emptyListItem.selected || (emptyListItem.highlightWhenPressed && emptyListItem.pressed) : false anchors { left: parent.left right: parent.right top: parent.top } height: emptyListItem.height - bottomDividerLine.height color: theme.palette.highlighted.background } ThinDivider { id: bottomDividerLine anchors.bottom: parent.bottom visible: showDivider && !priv.removed } Item { id: bodyMargins clip: body.x != 0 visible: body.height > 0 anchors { left: parent.left right: parent.right top: parent.top bottom: parent.bottom } Item { id: body anchors { top: parent.top bottom: parent.bottom } width: parent.width Behavior on x { enabled: !priv.held SequentialAnimation { UbuntuNumberAnimation { } ScriptAction { script: { if (__mouseArea.drag.target !== null) { // if not from resetDrag() confirmRemovalDialog.waitingForConfirmation = true priv.commitDrag() } } } } } onXChanged: { if (x > 0) { backgroundIndicator.state = "SwipingRight" } else { backgroundIndicator.state = "" } } } Item { id: backgroundIndicator opacity: 0.0 visible: false anchors { left: parent.left right: parent.right top: parent.top bottom: parent.bottom } LayoutMirroring.enabled: false LayoutMirroring.childrenInherit: true Item { id: confirmRemovalDialog objectName: "confirmRemovalDialog" property bool waitingForConfirmation: false visible: false width: units.gu(15) x: body.x - width - units.gu(2) anchors { top: parent.top bottom: parent.bottom } Row { anchors { top: parent.top bottom: parent.bottom left: parent.left right: parent.right leftMargin: units.gu(2) rightMargin: units.gu(2) } spacing: units.gu(2) Image { source: Qt.resolvedUrl("../../artwork/delete.png") fillMode: Image.Pad anchors { verticalCenter: parent.verticalCenter } width: units.gu(5) } Label { text: i18n.dtr('ubuntu-ui-toolkit', "Delete") verticalAlignment: Text.AlignVCenter anchors { verticalCenter: parent.verticalCenter } width: units.gu(7) textSize: Label.Medium } } MouseArea { visible: confirmRemovalDialog.waitingForConfirmation anchors.fill: parent onClicked: removeItemAnimation.start() } } states: [ State { name: "SwipingRight" AnchorChanges { target: backgroundIndicator anchors.left: parent.left anchors.right: body.left } PropertyChanges { target: backgroundIndicator opacity: 1.0 } PropertyChanges { target: confirmRemovalDialog x: body.x - confirmRemovalDialog.width - units.gu(2) } } ] } } SequentialAnimation { id: removeItemAnimation running: false UbuntuNumberAnimation { target: emptyListItem property: "height" to: 0 } ScriptAction { script: { priv.removed = true itemRemoved() priv.resetDrag() } } } Connections { target: (emptyListItem.removable) ? __mouseArea : null onPressed: { priv.pressedPosition = mouse.x } onMouseXChanged: { var mouseOffset = priv.pressedPosition - mouse.x if ((priv.pressedPosition != -1) && !priv.held && ( Math.abs(mouseOffset) >= priv.mouseMoveOffset)) { priv.startDrag(); } } onClicked: { if (body.x != 0) { priv.resetDrag() } } onReleased: { priv.endDrag(); } onCanceled: { priv.endDrag(); } } } ./src/Ubuntu/Components/ListItems/1.3/ListItemHeader.qml0000644000015600001650000000404612700370701023070 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype Header \deprecated \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief Header for grouping list items together Examples: \qml import Ubuntu.Components.ListItems 1.3 as ListItem Column { ListItem.Header { text: "Title" } ListItem.Standard { text: "Item one" } ListItem.Standard { text: "Item two" } ListItem.Divider { } ListItem.Standard { text: "Item three" } ListItem.Standard { text: "Item four" } } \endqml */ Item { height: units.gu(4) anchors { left: parent ? parent.left : undefined right: parent ? parent.right : undefined } /*! The text that is shown as the header text. \qmlproperty string text */ property alias text: label.text /*! \internal The \l foregroundGroundColor property stores the internal label color. */ property alias __foregroundColor: label.color LabelVisual { id: label font.weight: Text.Normal anchors { verticalCenter: parent.verticalCenter left: parent.left right: parent.right margins: units.gu(2) } } ThinDivider { anchors { left: parent.left right: parent.right bottom: parent.bottom } } } ./src/Ubuntu/Components/ListItems/1.3/ProgressionVisual.qml0000644000015600001650000000162312700370701023721 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 // Internal helper class for the visuals of // the progression symbol. StyledItem { id: progressionVisual property bool showSplit: false property real splitMargin styleName: "ProgressionVisualStyle" } ./src/Ubuntu/Components/ListItems/1.3/SingleValue.qml0000644000015600001650000000435612700370701022447 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype SingleValue \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief A list item displaying a single value \note \b{The component is deprecated. Use ListItem component instead.} Examples: \qml import Ubuntu.Components.ListItems 1.3 as ListItem Column { ListItem.SingleValue { text: "Label" value: "Status" onClicked: selected = !selected } ListItem.SingleValue { text: "Label" iconName: "compose" value: "Parameter" progression: true onClicked: print("clicked") } } \endqml */ Base { id: listItem /*! The text that is shown in the list item as a label. \qmlproperty string text */ /*! \qmlproperty string value The values that will be shown next to the label text */ property alias value: valueLabel.text LabelVisual { id: label selected: listItem.selected anchors { verticalCenter: parent.verticalCenter left: parent.left } text: listItem.text width: Math.min(implicitWidth, parent.width * 0.8) } LabelVisual { id: valueLabel selected: listItem.selected anchors { verticalCenter: parent.verticalCenter right: parent.right left: label.right leftMargin: listItem.__contentsMargins } horizontalAlignment: Text.AlignRight } } ./src/Ubuntu/Components/ListItems/1.3/ImageWithFallback.qml0000644000015600001650000000262712700370701023526 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 Image { id: image property url fallbackSource property bool fallbackRequired: false function isSourceDefined(sourceUrl) { return sourceUrl != "" && sourceUrl != undefined } function tryLoadingFallbackSource() { if (isSourceDefined(fallbackSource)) { source = fallbackSource } } function checkStatus() { if (!isSourceDefined(source) || (status == Image.Error && source != fallbackSource)) { fallbackRequired = true tryLoadingFallbackSource() } } onSourceChanged: fallbackRequired = false onFallbackSourceChanged: if (fallbackRequired) tryLoadingFallbackSource() onStatusChanged: checkStatus() Component.onCompleted: checkStatus() } ./src/Ubuntu/Components/ListItems/1.3/SingleControl.qml0000644000015600001650000000507512700370701023012 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 /*! \qmltype SingleControl \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief A list item containing a single control \note \b{The component is deprecated. Use ListItem component instead.} Examples: \qml import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem Column { ListItem.SingleControl { control: Button { anchors { margins: units.gu(1) fill: parent } text: "Large button" } } } \endqml */ // TODO: Add more examples when more types of controls become available. Empty { id: singleControlListItem /*! The control of this SingleControl list item. The control will automatically be re-parented to, and centered in, this list item. */ property Item control /*! \internal */ onClicked: if (control && control.enabled && control.hasOwnProperty("clicked")) control.clicked() /*! \internal */ property bool pressed: __mouseArea.pressed || (control && control.hasOwnProperty("pressed") && control.pressed) /*! \internal */ onPressedChanged: if (control && control.enabled && control.hasOwnProperty("pressed")) control.pressed = singleControlListItem.pressed // Ensure that there is always enough vertical padding around the control __height: control.height + __contentsMargins /*! \internal */ function __updateControl() { if (control) { control.parent = __contents; control.anchors.centerIn = __contents; } } /*! \internal This handler is an implementation detail. Mark as internal to prevent QDoc publishing it */ onControlChanged: __updateControl() } ./src/Ubuntu/Components/ListItems/1.3/ItemSelector.qml0000644000015600001650000002326512700370701022630 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import "." as ListItem import Ubuntu.Components 1.3 /*! \qmltype ItemSelector \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief ListItem displaying either a single selected value or expanded multiple choice with an optional image and subtext when not expanded, when expanding it opens a listing of all the possible values for selection with an additional option of always being expanded. If multiple choice is selected the list is expanded automatically. Examples: \qml import Ubuntu.Components.ListItems 1.3 as ListItem Column { anchors.left: parent.left anchors.right: parent.right spacing: units.gu(3) ListItem.ItemSelector { text: i18n.tr("Label") model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } ListItem.ItemSelector { text: i18n.tr("Label") expanded: true model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } ListItem.ItemSelector { text: i18n.tr("Multiple Selection") alwaysExpanded: false expanded: true model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } ListItem.ItemSelector { text: i18n.tr("Label") model: customModel expanded: true colourImage: true delegate: selectorDelegate } Component { id: selectorDelegate OptionSelectorDelegate { text: name; subText: description; iconSource: image } } ListModel { id: customModel ListElement { name: "Name 1"; description: "Description 1"; image: "images.png" } ListElement { name: "Name 2"; description: "Description 2"; image: "images.png" } ListElement { name: "Name 3"; description: "Description 3"; image: "images.png" } ListElement { name: "Name 4"; description: "Description 4"; image: "images.png" } } ListItem.ItemSelector { text: i18n.tr("Label") model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4"), i18n.tr("Value 5"), i18n.tr("Value 6"), i18n.tr("Value 7"), i18n.tr("Value 8")] containerHeight: itemHeight * 4 } ListItem.ItemSelector { text: i18n.tr("Label") expanded: true model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4"), i18n.tr("Value 5"), i18n.tr("Value 6"), i18n.tr("Value 7"), i18n.tr("Value 8")] containerHeight: itemHeight * 4 } } \endqml */ ListItem.Empty { id: itemSelector /*! The list of values that will be shown under the label text. This is a model. */ property var model /*! Specifies whether the list is always expanded. */ property bool expanded: false /*! If multiple choice selection is enabled the list is always expanded. */ property bool multiSelection: false /*! Colours image according to the fieldText colour of the theme, otherwise source colour is maintained. */ property bool colourImage: false /*! ListView delegate. */ property Component delegate: OptionSelectorDelegate { id: selectorDelegate } /*! Custom height for list container which allows scrolling inside the selector. */ property real containerHeight: { /*The reason for this slightly unconventional method of setting the container height is due to the fact that if we set it to the selector height by default (which is bound to the colum height) then we wouldn't be able to scroll to the end of the bottom boundary. The text is also invisible if none is set so this is taken into account too.*/ var textHeight = text === "" ? 0 : label.height + column.spacing; if (parent && parent.height > 0 && parent.height < list.contentHeight) { return parent.height - textHeight; } else { return list.contentHeight; } } /*! \qmlproperty int selectedIndex The index of the currently selected element in our list. */ property alias selectedIndex: list.currentIndex /*! \qmlproperty bool currentlyExpanded Is our list currently expanded? */ property alias currentlyExpanded: listContainer.currentlyExpanded /*! \qmlproperty real itemHeight Height of an individual list item. */ readonly property alias itemHeight: list.itemHeight /*! Called when delegate is clicked. */ signal delegateClicked(int index) /*! Called when the selector has finished expanding or collapsing. */ signal expansionCompleted() __height: column.height showDivider: false Column { id: column anchors { left: parent.left right: parent.right } ListItem.Standard { id: label text: itemSelector.text visible: itemSelector.text !== "" ? true : false } ListItem.Standard { id: listContainer objectName: "listContainer" readonly property url chevron: __styleInstance.chevron readonly property url tick: __styleInstance.tick readonly property color themeColour: theme.palette.selected.fieldText readonly property alias colourImage: itemSelector.colourImage property bool currentlyExpanded: expanded || multiSelection anchors { left: parent.left right: parent.right } state: itemSelector.expanded ? "expanded" : "collapsed" styleName: "ListItemOptionSelectorStyle" states: [ State { name: "expanded" when: listContainer.currentlyExpanded PropertyChanges { target: listContainer height: list.contentHeight < containerHeight ? list.contentHeight : containerHeight } }, State { name: "collapsed" when: !listContainer.currentlyExpanded PropertyChanges { target: listContainer height: list.itemHeight } } ] transitions: [ Transition { SequentialAnimation { UbuntuNumberAnimation { properties: "height" duration: UbuntuAnimation.BriskDuration } ScriptAction { script: { if (listContainer.currentlyExpanded) { expansionCompleted(); } else { list.positionViewAtIndex(selectedIndex, ListView.Beginning); } } } } } ] ListView { id: list objectName: "listView" property int previousIndex: list.currentIndex readonly property alias expanded: itemSelector.expanded readonly property alias multiSelection: itemSelector.multiSelection readonly property alias container: listContainer property real itemHeight signal delegateClicked(int index) onDelegateClicked: itemSelector.delegateClicked(index); interactive: listContainer.height !== list.contentHeight && listContainer.currentlyExpanded ? true : false clip: true currentIndex: 0 model: itemSelector.model anchors.fill: parent delegate: itemSelector.delegate Behavior on contentY { UbuntuNumberAnimation { properties: "contentY" duration: UbuntuAnimation.BriskDuration } } } } } } ./src/Ubuntu/Components/ListItems/artwork/0000755000015600001650000000000012700370701020676 5ustar jenkinsjenkins./src/Ubuntu/Components/ListItems/1.2/0000755000015600001650000000000012700370701017505 5ustar jenkinsjenkins./src/Ubuntu/Components/ListItems/1.2/Caption.qml0000644000015600001650000000373512700370701021625 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype Caption \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief List item that shows a piece of text. \note \b{The component is deprecated. Use ListItem and Captiopns components instead.} Examples: \qml import Ubuntu.Components.ListItems 1.0 as ListItem Column { ListItem.Standard { text: "Default list item." } ListItem.Caption { text: "This is a caption text, which can span multiple lines." } } \endqml */ Item { height: captionText.contentHeight + units.gu(2) * 2 width: parent ? parent.width : units.gu(31) /*! The text that is shown in the list item as a label. \qmlproperty string text */ property alias text: captionText.text Label { id: captionText anchors { verticalCenter: parent.verticalCenter left: parent.left right: parent.right //Margins are currently hardcoded to avoid adding new API leftMargin: units.gu(2) rightMargin: units.gu(2) } wrapMode: Text.Wrap color: Theme.palette.normal.backgroundText horizontalAlignment: Text.AlignLeft fontSize: "small" } } ./src/Ubuntu/Components/ListItems/1.2/Expandable.qml0000644000015600001650000001665612700370701022301 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype Expandable \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief An expandable list item with no contents. The Expandable class can be used for generic list items containing other components such as buttons. It subclasses \l Empty and thus brings all that functionality, but additionally provides means to expand and collapse the item. When used together with an \l UbuntuListView or \l ExpandablesColumn it can coordinate with other items in the list to make sure it is scrolled while expanding to be fully visible in the view. Additionally it is made sure that only one Expandable item is expanded at a time and it is collapsed when the user clicks outside the item. You can set \l expanded to true/false to expand/collapse the item. Examples: \qml import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 as ListItem Item { ListModel { id: listModel } ListItem.UbuntuListView { anchors { left: parent.left; right: parent.right } height: units.gu(24) model: listModel delegate: ListItem.Expandable { id: expandingItem expandedHeight: units.gu(30) onClicked: { expanded = true; } } } } \endqml */ Empty { id: root implicitHeight: expanded ? priv.maxExpandedHeight : collapsedHeight /*! Reflects the expanded state. Set this to true/false to expand/collapse the item. */ property bool expanded: false /*! The collapsed (normal) height of the item. Defaults to the standard height for list items. */ property real collapsedHeight: __height /*! The expanded height of the item's content. Defaults to the same as collapsedHeight which disables the expanding feature. In order for the item to be expandable, set this to the expanded size. Note that the actual expanded size can be smaller if there is not enough space in the containing list. In that case the item becomes flickable automatically. */ property real expandedHeight: collapsedHeight /*! If set to true, the item will collapse again when the user clicks somewhere in the always visible (when collapsed) area. */ property bool collapseOnClick: false /*! Reparent any content to inside the Flickable \qmlproperty QtObject children \default */ default property alias children: flickableContent.data /*! \internal */ QtObject { id: priv /*! \internal Points to the containing ExpandablesListView or ExpandablesColumn */ property Item view: root.ListView.view ? root.ListView.view : (root.parent.parent.parent.hasOwnProperty("expandItem") ? root.parent.parent.parent : null) /*! \internal Gives information whether this item is inside an item based container supporting Expandable items, such as ExpandablesColumn */ readonly property bool isInExpandableColumn: view && view !== undefined && view.hasOwnProperty("expandItem") && view.hasOwnProperty("collapse") /*! \internal Gives information whether this item is inside an index based container supporting Expandable items, such as UbuntuListView */ readonly property bool isInExpandableListView: view && view !== undefined && view.hasOwnProperty("expandedIndex") /*! \internal Gives information if there is another item expanded in the containing ExpandablesListView or ExpandablesColumn */ readonly property bool otherExpanded: (isInExpandableColumn && view.expandedItem !== null && view.expandedItem !== undefined && view.expandedItem !== root) || (isInExpandableListView && view.expandedIndex !== -1 && view.expandedIndex !== index) /*! \internal Gives information about the maximum expanded height, in case that is limited by the containing ExpandablesListView or ExpandablesColumn */ readonly property real maxExpandedHeight: (isInExpandableColumn || isInExpandableListView) ? Math.min(view.height - collapsedHeight, expandedHeight) : expandedHeight } states: [ State { name: "" PropertyChanges { target: root; opacity: 1 } }, State { name: "otherExpanded"; when: priv.otherExpanded PropertyChanges { target: root; opacity: .5 } }, State { name: "expanded"; when: expanded PropertyChanges { target: root; z: 3 } } ] Component.onCompleted: { if (priv.isInExpandableListView && priv.view.expandedIndex == index) { root.expanded = true; } } Connections { target: priv.isInExpandableListView ? priv.view : null onExpandedIndexChanged: { if (priv.view.expandedIndex == index) { root.expanded = true; } else if (root.expanded = true) { root.expanded = false; } } } /*! \internal */ onExpandedChanged: { if (!expanded) { contentFlickable.contentY = 0; } if (priv.isInExpandableColumn) { if (expanded) { priv.view.expandItem(root); } else { priv.view.collapse(); } } } Behavior on height { UbuntuNumberAnimation {} } Behavior on opacity { UbuntuNumberAnimation {} } Flickable { id: contentFlickable objectName: "__expandableContentFlickable" anchors { fill: parent; leftMargin: root.__contentsMargins; rightMargin: __contentsMargins; bottomMargin: divider.height } interactive: root.expanded && contentHeight > height + root.divider.height contentHeight: root.expandedHeight flickableDirection: Flickable.VerticalFlick clip: true Behavior on contentY { UbuntuNumberAnimation {} } Item { id: flickableContent anchors { left: parent.left right: parent.right } height: childrenRect.height } } MouseArea { anchors { left: parent.left; top: parent.top; right: parent.right } enabled: root.collapseOnClick && root.expanded height: root.collapsedHeight onClicked: { if (priv.isInExpandableListView) { priv.view.expandedIndex = -1; } else { root.expanded = false; } } } } ./src/Ubuntu/Components/ListItems/1.2/MultiValue.qml0000644000015600001650000000547212700370701022317 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype MultiValue \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief List item displaying multiple values. \note \b{The component is deprecated. Use ListItem component instead.} Examples: \qml import Ubuntu.Components.ListItems 1.0 as ListItem Column { ListItem.MultiValue { text: "Label" values: ["Value 1", "Value 2", "Value 3", "Value 4"] onClicked: selected = !selected } ListItem.MultiValue { text: "Label" iconName: "compose" values: ["Value 1", "Value 2", "Value 3", "Value 4"] progression: true onClicked: print("clicked") } } \endqml */ Base { id: multiValueListItem /*! The list of values that will be shown under the label text */ property variant values Item { height: label.height + valueLabel.height anchors { verticalCenter: parent.verticalCenter left: parent.left right: parent.right } LabelVisual { id: label selected: multiValueListItem.selected anchors { top: parent.top left: parent.left right: parent.right } text: multiValueListItem.text } LabelVisual { id: valueLabel selected: multiValueListItem.selected secondary: true anchors { top: label.bottom left: parent.left right: parent.right } fontSize: "small" text: concatenatedValues(multiValueListItem.values) function concatenatedValues(values) { var n = values.length; var result = ""; if (n > 0) { result = values[0]; for (var i = 1; i < n; i++) { result = result + ", " + values[i]; } } return result; } } } } ./src/Ubuntu/Components/ListItems/1.2/IconVisual.qml0000644000015600001650000000313412700370701022275 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 // internal helper class to create the visuals // for the icon. Item { id: iconVisual /*! \qmlproperty url source */ property alias source: icon.source /*! \qmlproperty url fallbackSource */ property alias fallbackSource: icon.fallbackSource /*! \qmlproperty string fallbackIconName */ property string fallbackIconName visible: source != "" property bool hasFrame: true ImageWithFallback { id: icon visible: !iconVisual.hasFrame opacity: iconVisual.enabled ? 1.0 : 0.5 fillMode: Image.PreserveAspectCrop anchors.fill: parent smooth: true asynchronous: true fallbackSource: iconVisual.fallbackIconName ? "image://theme/" + iconVisual.fallbackIconName : "" } UbuntuShape { id: shape visible: iconVisual.hasFrame anchors.fill: parent image: icon } } ./src/Ubuntu/Components/ListItems/1.2/Base.qml0000644000015600001650000001265312700370701021101 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype Base \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief Parent class of various list item classes that can have an icon and a progression symbol. \note \b{The component is deprecated. Use ListItem component instead.} Examples: See subclasses */ Empty { id: baseListItem /*! \deprecated \b{Use iconName or iconSource instead.} The location of the icon to show in the list item (optional), or an Item that is shown on the left side inside the list item. The icon will automatically be anchored to the left side of the list item, and if its height is undefined, to the top and bottom of the list item. \qmlproperty variant icon */ property variant icon: iconSource != "" ? iconSource : undefined /*! The location of the icon to show in the list item if iconSource failed to load (optional). \qmlproperty url fallbackIconSource */ property alias fallbackIconSource: iconHelper.fallbackSource /*! The icon shown in the list item if iconName failed to load (optional). \qmlproperty string fallbackIconName If both fallbackIconSource and fallbackIconName are defined, fallbackIconName will be ignored. \note The complete list of icons available in Ubuntu is not published yet. For now please refer to the folders where the icon themes are installed: \list \li Ubuntu Touch: \l file:/usr/share/icons/suru \li Ubuntu Desktop: \l file:/usr/share/icons/ubuntu-mono-dark \endlist These 2 separate icon themes will be merged soon. */ property alias fallbackIconName: iconHelper.fallbackIconName /*! Show or hide the progression symbol. */ property bool progression: false /*! Show or hide the frame around the icon \qmlproperty bool iconFrame */ property alias iconFrame: iconHelper.hasFrame /*! \internal \deprecated Width of the icon to be displayed */ property real __iconWidth /*! \internal \deprecated Height of the icon to be displayed */ property real __iconHeight /*! \internal \deprecated The margin on the left side of the icon. */ property real __leftIconMargin /*! \internal \deprecated The margin on the right side of the icon. */ property real __rightIconMargin IconVisual { id: iconHelper width: height height: Math.min(units.gu(5), parent.height - units.gu(1)) anchors { left: parent.left leftMargin: baseListItem.__contentsMargins verticalCenter: parent.verticalCenter } } /*! \internal The \l icon property is an Item. The value is false if \l icon is a string, or when no icon was set. */ property bool __iconIsItem: false /*! \internal */ onIconChanged: { if (icon == undefined) return; if (icon != iconSource) { console.warn("WARNING: ListItems.Base.icon is DEPRECATED. " + "Use iconName and iconSource instead.") } if (typeof icon == "string" || typeof icon == typeof iconSource) { // icon is the url of an image iconHelper.source = icon; __iconIsItem = false; } else { // icon is an Item. __iconIsItem = true; iconHelper.source = ""; icon.parent = baseListItem; icon.anchors.left = baseListItem.left; icon.anchors.margins = Qt.binding(function() { return baseListItem.__contentsMargins }); if (!icon.height) { icon.anchors.top = baseListItem.top; icon.anchors.bottom = baseListItem.bottom; } } } /*! \internal */ default property alias children: middle.data Item { id: middle property bool anchorToIconHelper: !__iconIsItem && iconHelper.source != "" anchors { top: parent.top bottom: parent.bottom left: anchorToIconHelper ? iconHelper.right : parent.left right: baseListItem.progression ? progressionHelper.left : parent.right rightMargin: baseListItem.__contentsMargins leftMargin: __iconIsItem ? icon.width + 2 * baseListItem.__contentsMargins : baseListItem.__contentsMargins } } ProgressionVisual { id: progressionHelper visible: baseListItem.progression anchors { right: parent.right rightMargin: baseListItem.__contentsMargins top: parent.top bottom: parent.bottom } } } ./src/Ubuntu/Components/ListItems/1.2/ValueSelector.qml0000644000015600001650000002267212700370701023006 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! ****DEPRECATED! PLEASE USE ITEM SELECTOR OR FOR THE UBUNTU SHAPE VERSION THE OPTION SELECTOR.**** \qmltype ValueSelector \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief List item displaying single selected value when not expanded, where expanding it opens a listing of all the possible values for selection. Examples: \qml import Ubuntu.Components.ListItems 1.0 as ListItem Column { width: 250 ListItem.ValueSelector { text: "Standard" values: ["Value 1", "Value 2", "Value 3", "Value 4"] } ListItem.ValueSelector { text: "Disabled" values: ["Value 1", "Value 2", "Value 3", "Value 4"] enabled: false } ListItem.ValueSelector { text: "Expanded" values: ["Value 1", "Value 2", "Value 3", "Value 4"] expanded: true } ListItem.ValueSelector { text: "Icon" iconName: "compose" values: ["Value 1", "Value 2", "Value 3", "Value 4"] selectedIndex: 2 } } \endqml */ Empty { id: selector __height: column.height /*! The text that is shown in the list item as a label. \qmlproperty string text */ /*! \deprecated \b{Use iconName or iconSource instead.} The location of the icon to show in the list item (optional), or an Item that is shown on the left side inside the list item. The icon will automatically be anchored to the left side of the list item, and if its height is undefined, to the top and bottom of the list item. \qmlproperty variant icon */ property alias icon: selectorMain.icon /*! The location of the icon to show in the list item if iconSource failed to load (optional). \qmlproperty url fallbackIconSource */ property alias fallbackIconSource: selectorMain.fallbackIconSource /*! The icon shown in the list item if iconName failed to load (optional). \qmlproperty string fallbackIconName If both fallbackIconSource and fallbackIconName are defined, fallbackIconName will be ignored. \note The complete list of icons available in Ubuntu is not published yet. For now please refer to the folders where the icon themes are installed: \list \li Ubuntu Touch: \l file:/usr/share/icons/suru \li Ubuntu Desktop: \l file:/usr/share/icons/ubuntu-mono-dark \endlist These 2 separate icon themes will be merged soon. */ property alias fallbackIconName: selectorMain.fallbackIconName /*! \internal \deprecated Width of the icon to be displayed */ property real __iconWidth /*! \internal \deprecated Height of the icon to be displayed */ property real __iconHeight /*! \internal \deprecated The margins on the left side of the icon. */ property real __leftIconMargin /*! \internal \deprecated The margins on the right side of the icon. */ property real __rightIconMargin /*! Show or hide the frame around the icon \qmlproperty bool iconFrame */ property alias iconFrame: selectorMain.iconFrame /*! The list of values that will be shown under the label text */ property variant values /*! The index of the currently selected element from the \l values array. */ property int selectedIndex: 0 /*! Specifies whether the selector is 'open' or 'closed'. */ property bool expanded: false showDivider: false Column { id: column anchors { left: parent.left right: parent.right topMargin: units.dp(2) bottomMargin: units.dp(2) } Base { id: selectorMain height: units.gu(6) showDivider: true onClicked: selector.expanded = !selector.expanded selected: selector.selected iconSource: selector.iconSource LabelVisual { id: label anchors { verticalCenter: parent.verticalCenter left: parent.left } text: selector.text width: Math.min(implicitWidth, parent.width * 0.8) } LabelVisual { id: valueLabel anchors { verticalCenter: parent.verticalCenter right: accordion.left rightMargin: selector.__contentsMargins leftMargin: selector.__contentsMargins left: label.right } fontSize: "small" text: selector.values[selector.selectedIndex] font.bold: selector.expanded horizontalAlignment: Text.AlignRight } Item { id: accordion width: accordionIcon.width anchors { right: parent.right top: parent.top bottom: parent.bottom } Image { id: accordionIcon anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter source: Qt.resolvedUrl("../../artwork/chevron.png") opacity: enabled ? 1.0 : 0.5 rotation: expanded ? 270 : 90 width: implicitWidth / 1.5 height: implicitHeight / 1.5 states: [ State { name: "expanded" when: selector.expanded PropertyChanges { target: accordionIcon; rotation: 270 } }, State { name: "closed" when: !selector.expanded PropertyChanges { target: accordionIcon; rotation: 90 } } ] transitions: Transition { UbuntuNumberAnimation { target: accordionIcon properties: "rotation" duration: UbuntuAnimation.SnapDuration } } } } } Repeater { id: valueRepeater property int valueHeight: selector.expanded ? units.gu(5) : 0 states: [ State { name: "expanded" when: selector.expanded PropertyChanges { target: valueRepeater valueHeight: units.gu(5) } }, State { name: "closed" when: !selector.expanded PropertyChanges { target: valueRepeater valueHeight: 0 } } ] transitions: Transition { UbuntuNumberAnimation { target: valueRepeater properties: "valueHeight" duration: UbuntuAnimation.SnapDuration } } model: selector.values Rectangle { color: Qt.lighter(Theme.palette.normal.base) height: valueRepeater.valueHeight width: parent.width Empty { id: valueBase height: parent.height visible: valueBase.height > 0 onClicked: { selector.selectedIndex = index selector.expanded = false } selected: index === selector.selectedIndex LabelVisual { text: modelData anchors { left: parent.left leftMargin: units.gu(3) verticalCenter: parent.verticalCenter } font.bold: valueBase.selected property real heightMargin: valueBase.height - implicitHeight visible: heightMargin > 0 // fade in/out the values when expanding/contracting the selector. opacity: heightMargin < 10 ? heightMargin/10 : 1 } } } } } } ./src/Ubuntu/Components/ListItems/1.2/Subtitled.qml0000644000015600001650000000651112700370701022162 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype MultiValue \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief List item displaying a second string under the main label. \note \b{The component is deprecated. Use ListItem component instead.} Examples: \qml import Ubuntu.Components.ListItems 1.0 as ListItem Column { ListItem.Subtitled { text: "Idle" subText: "Secondary label" } ListItem.Subtitled { text: "Disabled" enabled: false subText: "Secondary label" } ListItem.Subtitled { text: "Selected" selected: true subText: "Secondary label" } ListItem.Subtitled { text: "Progression" subText: "Secondary label" progression: true } ListItem.Subtitled { text: "Icon" subText: "Secondary label" iconName: "compose" } ListItem.Subtitled { text: "Multiple lines" subText: "This is a multi-line subText.\nUp to 5 lines are supported." } ListItem.Subtitled { text: "Multiple lines" subText: "It also works well with icons and progression." iconName: "compose" progression: true } } \endqml */ Base { id: subtitledListItem __height: Math.max(middleVisuals.height, units.gu(6)) /*! The list of strings that will be shown under the label text \qmlproperty string subText */ property alias subText: subLabel.text Item { id: middleVisuals anchors { left: parent.left right: parent.right verticalCenter: parent.verticalCenter } height: childrenRect.height + label.anchors.topMargin + subLabel.anchors.bottomMargin LabelVisual { id: label text: subtitledListItem.text selected: subtitledListItem.selected anchors { top: parent.top left: parent.left right: parent.right } } LabelVisual { id: subLabel selected: subtitledListItem.selected secondary: true anchors { left: parent.left right: parent.right top: label.bottom } fontSize: "small" wrapMode: Text.Wrap maximumLineCount: 5 } } } ./src/Ubuntu/Components/ListItems/1.2/ExpandablesColumn.qml0000644000015600001650000000773212700370701023635 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype ExpandablesColumn \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief A column to be used together with the \l Expandable item. This lays out its content just like a regular Column inside a Flickable but when used together with items of type \l Expandable it provides additional features like automatically positioning the expanding item when it expands and collapsing it again when the user taps outside of it. Examples: \qml import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 as ListItem ListItem.ExpandablesColumn { anchors { left: parent.left; right: parent.right } height: units.gu(24) Repeater { model: 8 ListItem.Expandable { expandedHeight: units.gu(30) onClicked: { expanded = true; } } } } \endqml */ Flickable { id: root contentHeight: column.height /*! Points to the currently expanded item. Null if no item is expanded. \qmlproperty Item expandedItem */ readonly property alias expandedItem: priv.expandedItem /*! Expand the given item. The item must be a child of this ListView. */ function expandItem(item) { if (!item.hasOwnProperty("expandedHeight") || !item.hasOwnProperty("collapsedHeight")) { return; } if (priv.expandedItem != null) { priv.expandedItem.expanded = false; } priv.expandedItem = item; var maxExpandedHeight = root.height - item.collapsedHeight; var expandedItemHeight = Math.min(item.expandedHeight, maxExpandedHeight); var bottomIntersect = root.mapFromItem(item).y + expandedItemHeight - maxExpandedHeight; if (bottomIntersect > 0) { contentY += bottomIntersect; } } /*! Collapse the currently expanded item. If there isn't any item expanded, this function does nothing. */ function collapse() { priv.expandedItem.expanded = false; priv.expandedItem = null; } /*! Reparent any content to inside the Column. \qmlproperty QtObject children \default */ default property alias children: column.data /*! \internal */ QtObject { id: priv /*! \internal Points to the currently expanded item. Null if no item is expanded. */ property var expandedItem: null } Behavior on contentY { UbuntuNumberAnimation { } } Column { id: column anchors { left: parent.left; right: parent.right } } MouseArea { anchors { left: parent.left; right: parent.right; top: parent.top } height: root.mapFromItem(priv.expandedItem).y + root.contentY enabled: priv.expandedItem != null onClicked: root.collapse(); } MouseArea { anchors { left: parent.left; right: parent.right; bottom: parent.bottom } height: priv.expandedItem != null ? root.contentHeight - (root.mapFromItem(priv.expandedItem).y + root.contentY + priv.expandedItem.height) : 0 enabled: priv.expandedItem != null onClicked: root.collapse(); } } ./src/Ubuntu/Components/ListItems/1.2/ThinDivider.qml0000644000015600001650000000506112700370701022433 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype ThinDivider \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief Narrow line used as a divider between ListItems. ListItems will usually include this line at the bottom of the item to give a visually pleasing list of items. But a divider line can also be inserted manually using this component. Examples: \qml import Ubuntu.Components.ListItems 1.0 as ListItem Column { width: 250 ListItem.ThinDivider {} //can be used as header for list ListItem.Standard { text: "List Item without thin divider line" showDivider: false } ListItem.ThinDivider {} // manually inserted divider line ListItem.Standard { text: "ListItem with thin divider line" } } \endqml */ Rectangle { anchors { left: (parent) ? parent.left : null right: (parent) ? parent.right : null } height: (visible) ? units.dp(2) : 0 // a private property to catch theme background color change // use private property instead of embedding it into a QtObject to avoid further // performance decrease property bool __lightBackground: ColorUtils.luminance(Theme.palette.normal.background) > 0.85 // use a gradient of 4 steps instead of instantiating two Rectangles for performance reasons gradient: Gradient { GradientStop { position: 0.0; color: __lightBackground ? Qt.rgba(0, 0, 0, 0.1) : Qt.rgba(0, 0, 0, 0.4) } GradientStop { position: 0.49; color: __lightBackground ? Qt.rgba(0, 0, 0, 0.1) : Qt.rgba(0, 0, 0, 0.4) } GradientStop { position: 0.5; color: __lightBackground ? Qt.rgba(1, 1, 1, 0.4) : Qt.rgba(1, 1, 1, 0.1) } GradientStop { position: 1.0; color: __lightBackground ? Qt.rgba(1, 1, 1, 0.4) : Qt.rgba(1, 1, 1, 0.1) } } } ./src/Ubuntu/Components/ListItems/1.2/Standard.qml0000644000015600001650000002250612700370701021765 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype Standard \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief The standard list item class. It shows a basic list item with a label (text), and optionally an icon, a progression arrow, and it can have an embedded Item (\l control) that can be used for including Buttons, Switches etc. inside the list item. \note \b{The component is deprecated. Use ListItem component instead.} \l {http://design.ubuntu.com/apps/building-blocks/list-items}{See also the Design Guidelines on List Items}. Examples: \qml import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 as ListItem Column { ListItem.Standard { text: "Selectable standard list item" selected: false onClicked: selected = !selected } ListItem.Standard { text: "List item with icon" iconName: "compose" } ListItem.Standard { text: "With a progression arrow" progression: true } ListItem.Standard { text: "Control" control: Button { text: "Click me" width: units.gu(19) onClicked: print("Clicked") } progression: true } } \endqml */ Empty { id: listItem /*! \deprecated \b{Use iconName or iconSource instead.} The location of the icon to show in the list item (optional), or an Item that is shown on the left side inside the list item. The icon will automatically be anchored to the left side of the list item, and if its height is undefined, to the top and bottom of the list item. \qmlproperty variant icon */ property variant icon: iconSource != "" ? iconSource : undefined /*! The location of the icon to show in the list item if iconSource failed to load (optional). \qmlproperty url fallbackIconSource */ property alias fallbackIconSource: iconHelper.fallbackSource /*! The icon shown in the list item if iconName failed to load (optional). \qmlproperty string fallbackIconName If both fallbackIconSource and fallbackIconName are defined, fallbackIconName will be ignored. \note The complete list of icons available in Ubuntu is not published yet. For now please refer to the folders where the icon themes are installed: \list \li Ubuntu Touch: \l file:/usr/share/icons/suru \li Ubuntu Desktop: \l file:/usr/share/icons/ubuntu-mono-dark \endlist These 2 separate icon themes will be merged soon. */ property alias fallbackIconName: iconHelper.fallbackIconName /*! The text that is shown in the list item as a label. \qmlproperty string text */ /*! Show or hide the progression symbol. */ property bool progression: false /*! \internal \deprecated Width of the icon to be displayed */ property real __iconWidth /*! \internal \deprecated Height of the icon to be displayed */ property real __iconHeight /*! \internal \deprecated The margins on the left side of the icon. */ property real __leftIconMargin /*! \internal \deprecated The margins on the right side of the icon. */ property real __rightIconMargin /*! An optional control that is displayed inside the list item. The width of the control must be specified in order to determine the layout of the list item. \qmlproperty Item control */ property alias control: controlContainer.control /*! Show or hide the frame around the icon \qmlproperty bool iconFrame */ property alias iconFrame: iconHelper.hasFrame // If there is a control, the controlArea covers the listItem's mouseArea, // so in that case use the highlights below when pressed highlightWhenPressed: !listItem.control // Avoid emit clicked signals when clicking on the control area __acceptEvents: false /*! \internal */ property bool __controlAreaPressed: false Rectangle { id: controlHighlight visible: listItem.swipingState === "" ? control && __controlAreaPressed : false anchors { top: parent.top right: progressionHelper.visible ? progressionHelper.left : parent.right bottom: parent.bottom left: parent.left } color: Theme.palette.selected.background } Rectangle { id: progressionHighlight visible: listItem.swipingState === "" ? listItem.progression && progressionHelper.showSplit && listItem.pressed && !__controlAreaPressed : false anchors { left: progressionHelper.left top: parent.top bottom: parent.bottom right: parent.right } color: Theme.palette.selected.background } IconVisual { id: iconHelper width: height height: Math.min(units.gu(5), listItem.height - units.gu(1)) anchors { left: parent.left leftMargin: listItem.__contentsMargins verticalCenter: parent.verticalCenter } } /*! \internal The \l icon property is an Item. The value is false if \l icon is a string, or when no icon was set. */ property bool __iconIsItem: false /*! \internal */ onIconChanged: { if (icon == undefined) return; if (icon != iconSource) { console.warn("WARNING: ListItems.Standard.icon is DEPRECATED. " + "Use iconName and iconSource instead.") } if (typeof icon == "string" || typeof icon == typeof iconSource) { // icon is the url of an image iconHelper.source = icon; __iconIsItem = false; } else { // icon is an Item. __iconIsItem = true; iconHelper.source = ""; icon.parent = listItem; icon.anchors.left = listItem.left; icon.anchors.margins = Qt.binding(function() { return listItem.__contentsMargins }); if (!icon.height) { icon.anchors.top = listItem.top; icon.anchors.bottom = listItem.bottom; } } } /*! \internal The \l foregroundGroundColor property stores the internal label color. */ property alias __foregroundColor: label.color LabelVisual { id: label property bool anchorToIconHelper: !__iconIsItem && iconHelper.source != "" selected: listItem.selected anchors { verticalCenter: parent.verticalCenter left: anchorToIconHelper ? iconHelper.right : parent.left leftMargin: __iconIsItem ? icon.width + 2 * listItem.__contentsMargins : listItem.__contentsMargins right: control ? controlContainer.left : (progression ? progressionHelper.left : parent.right) rightMargin: listItem.__contentsMargins } text: listItem.text } Item { id: controlContainer property Item control // use the width of the control if there is (possibly elided) text, // or full width available if there is no text. width: control ? control.width : undefined height: control ? control.height : undefined anchors { right: listItem.progression ? progressionHelper.left : parent.right rightMargin: listItem.__contentsMargins verticalCenter: parent.verticalCenter } onControlChanged: { if (control) control.parent = controlContainer; } Connections { target: listItem.__mouseArea onClicked: listItem.clicked() onPressAndHold: listItem.pressAndHold() } } /*! \internal */ onPressedChanged: { if (listItem.pressed && control && control.enabled && (__mouseArea.mouseX < progressionHelper.x)) { listItem.__controlAreaPressed = true } else { listItem.__controlAreaPressed = false } } ProgressionVisual { id: progressionHelper visible: listItem.progression anchors { right: parent.right rightMargin: listItem.__contentsMargins top: parent.top bottom: parent.bottom } showSplit: control ? true : false splitMargin: listItem.__contentsMargins } } ./src/Ubuntu/Components/ListItems/1.2/LabelVisual.qml0000644000015600001650000000276612700370701022436 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 // internal helper class for text inside the list items. Label { id: label property bool selected: false property bool secondary: false // FIXME: very ugly hack to detect whether the list item is inside a Popover property bool overlay: isInsideOverlay(label) function isInsideOverlay(item) { if (!item.parent) return false; return item.parent.hasOwnProperty("pointerTarget") || label.isInsideOverlay(item.parent) } fontSize: "medium" elide: Text.ElideRight color: selected ? UbuntuColors.orange : secondary ? overlay ? Theme.palette.normal.overlayText : Theme.palette.normal.backgroundText : overlay ? Theme.palette.selected.overlayText : Theme.palette.selected.backgroundText opacity: label.enabled ? 1.0 : 0.5 } ./src/Ubuntu/Components/ListItems/1.2/Divider.qml0000644000015600001650000000217312700370701021611 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype Divider \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief Divider to break up list items into groups. \note \b{The component is deprecated.} Examples: see \l Header */ Image { source: Qt.resolvedUrl("../../artwork/ListItemDivider6px.png") anchors { left: parent ? parent.left : undefined right: parent ? parent.right : undefined } height: units.gu(1) } ./src/Ubuntu/Components/ListItems/1.2/Empty.qml0000644000015600001650000003400212700370701021315 0ustar jenkinsjenkins/* * Copyright 2012, 2013, 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype Empty \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief A list item with no contents. \note \b{The component is deprecated. Use ListItem component instead.} The Empty class can be used for generic list items containing other components such as buttons. It is selectable and can take mouse clicks. It will attempt to detect if a thin dividing line at the bottom of the item is suitable, but this behaviour can be overridden (using \l showDivider). For specific types of list items, see its subclasses. The item will still remain in memory after being removed from the list so it is up to the application to destroy it. This can be handled by the signal \l itemRemoved that is fired after all animation is done. Examples: \qml import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 as ListItem Item { Model { id: contactModel ListElement { name: "Bill Smith" number: "555 3264" } ListElement { name: "John Brown" number: "555 8426" } } ListView { width: 180; height: 200 model: contactModel delegate: ListItem.Empty { height: units.gu(6) removable: true onItemRemoved: contactModel.remove(index) Text { text: name + " " + number anchors.centerIn: parent } } } } \endqml See the documentation of the derived classes of Empty for more examples. */ AbstractButton { id: emptyListItem /*! Specifies whether the list item is selected. */ property bool selected: false /*! Highlight the list item when it is pressed. This is used to disable the highlighting of the full list item when custom highlighting needs to be implemented (for example in ListItem.Standard which can have a split). */ property bool highlightWhenPressed: true /*! Defines if this item can be removed or not. */ property bool removable: false /*! Defines if the item needs confirmation before removing by swiping. \qmlproperty bool confirmRemoval */ property alias confirmRemoval: confirmRemovalDialog.visible /*! \qmlproperty string swipingState The current swiping state ("SwipingRight" or "") */ readonly property alias swipingState: backgroundIndicator.state /*! \qmlproperty bool waitingConfirmationForRemoval Defines if the item is waiting for the user interaction during the swipe to delete */ readonly property alias waitingConfirmationForRemoval: confirmRemovalDialog.waitingForConfirmation /*! This handler is called when the item is removed from the list */ signal itemRemoved /*! \internal Defines the height of the ListItem, so correct height of this component, including divider line is calculated. */ property int __height: units.gu(6) /*! Set to show or hide the thin bottom divider line (drawn by the \l ThinDivider component). This line is shown by default except in cases where this item is the delegate of a ListView. */ property bool showDivider: true /*! \internal Reparent so that the visuals of the children does not occlude the bottom divider line. */ default property alias children: body.data /*! \internal Allows derived class to proper add items inside of this element */ property alias __contents: body /*! \qmlproperty list backgroundIndicator Defines the item background item to be showed during the item swiping */ property alias backgroundIndicator: backgroundIndicator.children /*! \qmlproperty ThinDivider divider Exposes our the bottom line divider. */ property alias divider: bottomDividerLine /*! \internal The spacing inside the list item. */ property real __contentsMargins: units.gu(2) /*! Cancel item romoval */ function cancelItemRemoval() { priv.resetDrag() priv.removed = false } width: parent ? parent.width : units.gu(31) implicitHeight: priv.removed ? 0 : __height + bottomDividerLine.height __mouseArea.drag.axis: Drag.XAxis // Keep compatible with the old version height: implicitHeight LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft LayoutMirroring.childrenInherit: true /*! \internal */ QtObject { id: priv /*! \internal Defines the offset used when the item will start to move */ readonly property int mouseMoveOffset: units.gu(1) /*! \internal Defines the offset limit to consider the item removed */ readonly property int itemMoveOffset: confirmRemoval ? width * 0.5 : width * 0.3 /*! \internal Defines the initial pressed position */ property int pressedPosition: -1 /*! \internal Defines if the item is moving or not */ property bool held: false /*! \internal Defines if the item should be removed after the animation or not */ property bool removeItem: false /*! \internal Defines if the item was removed or not */ property bool removed: false /*! \internal notify the start of the drag operation */ function startDrag() { __mouseArea.drag.target = body held = true __mouseArea.drag.maximumX = parent.width __mouseArea.drag.minimumX = 0 backgroundIndicator.visible = true } /*! \internal Resets the item dragging state */ function resetDrag() { confirmRemovalDialog.waitingForConfirmation = false held = false // before body.x to ensure animation __mouseArea.drag.target = null // stops waitingForConfirmation = true in animation body.x = 0 pressedPosition = -1 removeItem = false backgroundIndicator.opacity = 0.0 backgroundIndicator.visible = false } /*! \internal Commit the necessary changes to remove or not the item based on the mouse final position */ function commitDrag() { if (removeItem) { if (!confirmRemoval) { removeItemAnimation.start() } } else { resetDrag() } } /*! \internal notify the releaso of the mouse button and the end of the drag operation */ function endDrag() { if (Math.abs(body.x) < itemMoveOffset && held == true) { held = false removeItem = false if (body.x == 0) { resetDrag() } else { body.x = 0; } } else if (held == true) { held = false removeItem = true var finalX = body.width if (emptyListItem.confirmRemoval) { finalX = itemMoveOffset } if (body.x > 0) { body.x = finalX } else { body.x = -finalX } } } } Rectangle { id: highlight z: -1 visible: !priv.removed && emptyListItem.swipingState === "" ? emptyListItem.selected || (emptyListItem.highlightWhenPressed && emptyListItem.pressed) : false anchors { left: parent.left right: parent.right top: parent.top } height: emptyListItem.height - bottomDividerLine.height color: Theme.palette.selected.background } ThinDivider { id: bottomDividerLine anchors.bottom: parent.bottom visible: showDivider && !priv.removed } Item { id: bodyMargins clip: body.x != 0 visible: body.height > 0 anchors { left: parent.left right: parent.right top: parent.top bottom: parent.bottom } Item { id: body anchors { top: parent.top bottom: parent.bottom } width: parent.width Behavior on x { enabled: !priv.held SequentialAnimation { UbuntuNumberAnimation { } ScriptAction { script: { if (__mouseArea.drag.target !== null) { // if not from resetDrag() confirmRemovalDialog.waitingForConfirmation = true priv.commitDrag() } } } } } onXChanged: { if (x > 0) { backgroundIndicator.state = "SwipingRight" } else { backgroundIndicator.state = "" } } } Item { id: backgroundIndicator opacity: 0.0 visible: false anchors { left: parent.left right: parent.right top: parent.top bottom: parent.bottom } LayoutMirroring.enabled: false LayoutMirroring.childrenInherit: true Item { id: confirmRemovalDialog objectName: "confirmRemovalDialog" property bool waitingForConfirmation: false visible: false width: units.gu(15) x: body.x - width - units.gu(2) anchors { top: parent.top bottom: parent.bottom } Row { anchors { top: parent.top bottom: parent.bottom left: parent.left right: parent.right leftMargin: units.gu(2) rightMargin: units.gu(2) } spacing: units.gu(2) Image { source: Qt.resolvedUrl("../../artwork/delete.png") fillMode: Image.Pad anchors { verticalCenter: parent.verticalCenter } width: units.gu(5) } Label { text: i18n.dtr('ubuntu-ui-toolkit', "Delete") verticalAlignment: Text.AlignVCenter anchors { verticalCenter: parent.verticalCenter } width: units.gu(7) fontSize: "medium" } } MouseArea { visible: confirmRemovalDialog.waitingForConfirmation anchors.fill: parent onClicked: removeItemAnimation.start() } } states: [ State { name: "SwipingRight" AnchorChanges { target: backgroundIndicator anchors.left: parent.left anchors.right: body.left } PropertyChanges { target: backgroundIndicator opacity: 1.0 } PropertyChanges { target: confirmRemovalDialog x: body.x - confirmRemovalDialog.width - units.gu(2) } } ] } } SequentialAnimation { id: removeItemAnimation running: false UbuntuNumberAnimation { target: emptyListItem property: "height" to: 0 } ScriptAction { script: { priv.removed = true itemRemoved() priv.resetDrag() } } } Connections { target: (emptyListItem.removable) ? __mouseArea : null onPressed: { priv.pressedPosition = mouse.x } onMouseXChanged: { var mouseOffset = priv.pressedPosition - mouse.x if ((priv.pressedPosition != -1) && !priv.held && ( Math.abs(mouseOffset) >= priv.mouseMoveOffset)) { priv.startDrag(); } } onClicked: { if (body.x != 0) { priv.resetDrag() } } onReleased: { priv.endDrag(); } onCanceled: { priv.endDrag(); } } } ./src/Ubuntu/Components/ListItems/1.2/ListItemHeader.qml0000644000015600001650000000410112700370701023057 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype Header \deprecated \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief Header for grouping list items together Examples: \qml import Ubuntu.Components.ListItems 1.0 as ListItem Column { ListItem.Header { text: "Title" } ListItem.Standard { text: "Item one" } ListItem.Standard { text: "Item two" } ListItem.Divider { } ListItem.Standard { text: "Item three" } ListItem.Standard { text: "Item four" } } \endqml */ Item { height: units.gu(4) anchors { left: parent ? parent.left : undefined right: parent ? parent.right : undefined } /*! The text that is shown as the header text. \qmlproperty string text */ property alias text: label.text /*! \internal The \l foregroundGroundColor property stores the internal label color. */ property alias __foregroundColor: label.color LabelVisual { id: label fontSize: "medium" font.weight: Text.Normal anchors { verticalCenter: parent.verticalCenter left: parent.left right: parent.right margins: units.gu(2) } } ThinDivider { anchors { left: parent.left right: parent.right bottom: parent.bottom } } } ./src/Ubuntu/Components/ListItems/1.2/ProgressionVisual.qml0000644000015600001650000000170212700370701023716 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 // Internal helper class for the visuals of // the progression symbol. StyledItem { id: progressionVisual property bool showSplit: false property real splitMargin style: Theme.createStyleComponent("ProgressionVisualStyle.qml", progressionVisual) } ./src/Ubuntu/Components/ListItems/1.2/SingleValue.qml0000644000015600001650000000441112700370701022436 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype SingleValue \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief A list item displaying a single value \note \b{The component is deprecated. Use ListItem component instead.} Examples: \qml import Ubuntu.Components.ListItems 1.0 as ListItem Column { ListItem.SingleValue { text: "Label" value: "Status" onClicked: selected = !selected } ListItem.SingleValue { text: "Label" iconName: "compose" value: "Parameter" progression: true onClicked: print("clicked") } } \endqml */ Base { id: listItem /*! The text that is shown in the list item as a label. \qmlproperty string text */ /*! \qmlproperty string value The values that will be shown next to the label text */ property alias value: valueLabel.text LabelVisual { id: label selected: listItem.selected anchors { verticalCenter: parent.verticalCenter left: parent.left } text: listItem.text width: Math.min(implicitWidth, parent.width * 0.8) } LabelVisual { id: valueLabel selected: listItem.selected anchors { verticalCenter: parent.verticalCenter right: parent.right left: label.right leftMargin: listItem.__contentsMargins } horizontalAlignment: Text.AlignRight fontSize: "medium" } } ./src/Ubuntu/Components/ListItems/1.2/ImageWithFallback.qml0000644000015600001650000000262712700370701023525 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 Image { id: image property url fallbackSource property bool fallbackRequired: false function isSourceDefined(sourceUrl) { return sourceUrl != "" && sourceUrl != undefined } function tryLoadingFallbackSource() { if (isSourceDefined(fallbackSource)) { source = fallbackSource } } function checkStatus() { if (!isSourceDefined(source) || (status == Image.Error && source != fallbackSource)) { fallbackRequired = true tryLoadingFallbackSource() } } onSourceChanged: fallbackRequired = false onFallbackSourceChanged: if (fallbackRequired) tryLoadingFallbackSource() onStatusChanged: checkStatus() Component.onCompleted: checkStatus() } ./src/Ubuntu/Components/ListItems/1.2/SingleControl.qml0000644000015600001650000000503212700370701023002 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 /*! \qmltype SingleControl \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief A list item containing a single control \note \b{The component is deprecated. Use ListItem component instead.} Examples: \qml import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 as ListItem Column { ListItem.SingleControl { control: Button { anchors { margins: units.gu(1) fill: parent } text: "Large button" } } } \endqml */ // TODO: Add more examples when more types of controls become available. Empty { id: singleControlListItem /*! The control of this SingleControl list item. The control will automatically be re-parented to, and centered in, this list item. */ property Item control /*! \internal */ onClicked: if (control && control.enabled && control.hasOwnProperty("clicked")) control.clicked() pressed: __mouseArea.pressed || (control && control.hasOwnProperty("pressed") && control.pressed) /*! \internal */ onPressedChanged: if (control && control.enabled && control.hasOwnProperty("pressed")) control.pressed = singleControlListItem.pressed // Ensure that there is always enough vertical padding around the control __height: control.height + __contentsMargins /*! \internal */ function __updateControl() { if (control) { control.parent = __contents; control.anchors.centerIn = __contents; } } /*! \internal This handler is an implementation detail. Mark as internal to prevent QDoc publishing it */ onControlChanged: __updateControl() } ./src/Ubuntu/Components/ListItems/1.2/ItemSelector.qml0000644000015600001650000002334012700370701022621 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import "." as ListItem import Ubuntu.Components 1.2 /*! \qmltype ItemSelector \inqmlmodule Ubuntu.Components.ListItems 1.0 \ingroup ubuntu-listitems \brief ListItem displaying either a single selected value or expanded multiple choice with an optional image and subtext when not expanded, when expanding it opens a listing of all the possible values for selection with an additional option of always being expanded. If multiple choice is selected the list is expanded automatically. Examples: \qml import Ubuntu.Components.ListItems 1.0 as ListItem Column { anchors.left: parent.left anchors.right: parent.right spacing: units.gu(3) ListItem.ItemSelector { text: i18n.tr("Label") model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } ListItem.ItemSelector { text: i18n.tr("Label") expanded: true model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } ListItem.ItemSelector { text: i18n.tr("Multiple Selection") alwaysExpanded: false expanded: true model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } ListItem.ItemSelector { text: i18n.tr("Label") model: customModel expanded: true colourImage: true delegate: selectorDelegate } Component { id: selectorDelegate OptionSelectorDelegate { text: name; subText: description; iconSource: image } } ListModel { id: customModel ListElement { name: "Name 1"; description: "Description 1"; image: "images.png" } ListElement { name: "Name 2"; description: "Description 2"; image: "images.png" } ListElement { name: "Name 3"; description: "Description 3"; image: "images.png" } ListElement { name: "Name 4"; description: "Description 4"; image: "images.png" } } ListItem.ItemSelector { text: i18n.tr("Label") model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4"), i18n.tr("Value 5"), i18n.tr("Value 6"), i18n.tr("Value 7"), i18n.tr("Value 8")] containerHeight: itemHeight * 4 } ListItem.ItemSelector { text: i18n.tr("Label") expanded: true model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4"), i18n.tr("Value 5"), i18n.tr("Value 6"), i18n.tr("Value 7"), i18n.tr("Value 8")] containerHeight: itemHeight * 4 } } \endqml */ ListItem.Empty { id: itemSelector /*! The list of values that will be shown under the label text. This is a model. */ property var model /*! Specifies whether the list is always expanded. */ property bool expanded: false /*! If multiple choice selection is enabled the list is always expanded. */ property bool multiSelection: false /*! Colours image according to the fieldText colour of the theme, otherwise source colour is maintained. */ property bool colourImage: false /*! ListView delegate. */ property Component delegate: OptionSelectorDelegate { id: selectorDelegate } /*! Custom height for list container which allows scrolling inside the selector. */ property real containerHeight: { /*The reason for this slightly unconventional method of setting the container height is due to the fact that if we set it to the selector height by default (which is bound to the colum height) then we wouldn't be able to scroll to the end of the bottom boundary. The text is also invisible if none is set so this is taken into account too.*/ var textHeight = text === "" ? 0 : label.height + column.spacing; if (parent && parent.height > 0 && parent.height < list.contentHeight) { return parent.height - textHeight; } else { return list.contentHeight; } } /*! \qmlproperty int selectedIndex The index of the currently selected element in our list. */ property alias selectedIndex: list.currentIndex /*! \qmlproperty bool currentlyExpanded Is our list currently expanded? */ property alias currentlyExpanded: listContainer.currentlyExpanded /*! \qmlproperty real itemHeight Height of an individual list item. */ readonly property alias itemHeight: list.itemHeight /*! Called when delegate is clicked. */ signal delegateClicked(int index) /*! Called when the selector has finished expanding or collapsing. */ signal expansionCompleted() __height: column.height showDivider: false Column { id: column anchors { left: parent.left right: parent.right } ListItem.Standard { id: label text: itemSelector.text visible: itemSelector.text !== "" ? true : false } ListItem.Standard { id: listContainer objectName: "listContainer" readonly property url chevron: __styleInstance.chevron readonly property url tick: __styleInstance.tick readonly property color themeColour: Theme.palette.selected.fieldText readonly property alias colourImage: itemSelector.colourImage property bool currentlyExpanded: expanded || multiSelection anchors { left: parent.left right: parent.right } state: itemSelector.expanded ? "expanded" : "collapsed" style: Theme.createStyleComponent("ListItemOptionSelectorStyle.qml", listContainer) states: [ State { name: "expanded" when: listContainer.currentlyExpanded PropertyChanges { target: listContainer height: list.contentHeight < containerHeight ? list.contentHeight : containerHeight } }, State { name: "collapsed" when: !listContainer.currentlyExpanded PropertyChanges { target: listContainer height: list.itemHeight } } ] transitions: [ Transition { SequentialAnimation { UbuntuNumberAnimation { properties: "height" duration: UbuntuAnimation.BriskDuration } ScriptAction { script: { if (listContainer.currentlyExpanded) { expansionCompleted(); } else { list.positionViewAtIndex(selectedIndex, ListView.Beginning); } } } } } ] ListView { id: list objectName: "listView" property int previousIndex: list.currentIndex readonly property alias expanded: itemSelector.expanded readonly property alias multiSelection: itemSelector.multiSelection readonly property alias container: listContainer property real itemHeight signal delegateClicked(int index) onDelegateClicked: itemSelector.delegateClicked(index); interactive: listContainer.height !== list.contentHeight && listContainer.currentlyExpanded ? true : false clip: true currentIndex: 0 model: itemSelector.model anchors.fill: parent delegate: itemSelector.delegate Behavior on contentY { UbuntuNumberAnimation { properties: "contentY" duration: UbuntuAnimation.BriskDuration } } } } } } ./src/Ubuntu/Components/ListItems/qmldir0000644000015600001650000000332212700370701020420 0ustar jenkinsjenkinsmodule Ubuntu.Components.ListItems Empty 0.1 1.2/Empty.qml Base 0.1 1.2/Base.qml Caption 0.1 1.2/Caption.qml Divider 0.1 1.2/Divider.qml Header 0.1 1.2/ListItemHeader.qml internal IconVisual IconVisual.qml internal LabelVisual LabelVisual.qml MultiValue 0.1 1.2/MultiValue.qml ItemSelector 0.1 1.2/ItemSelector.qml internal ProgressionVisual ProgressionVisual.qml ValueSelector 0.1 1.2/ValueSelector.qml SingleValue 0.1 1.2/SingleValue.qml Standard 0.1 1.2/Standard.qml Subtitled 0.1 1.2/Subtitled.qml SingleControl 0.1 1.2/SingleControl.qml ThinDivider 0.1 1.2/ThinDivider.qml Expandable 0.1 1.2/Expandable.qml ExpandablesColumn 0.1 1.2/ExpandablesColumn.qml #version 1.0 Empty 1.0 1.2/Empty.qml Base 1.0 1.2/Base.qml Caption 1.0 1.2/Caption.qml Divider 1.0 1.2/Divider.qml Header 1.0 1.2/ListItemHeader.qml MultiValue 1.0 1.2/MultiValue.qml ItemSelector 1.0 1.2/ItemSelector.qml ValueSelector 1.0 1.2/ValueSelector.qml SingleValue 1.0 1.2/SingleValue.qml Standard 1.0 1.2/Standard.qml Subtitled 1.0 1.2/Subtitled.qml SingleControl 1.0 1.2/SingleControl.qml ThinDivider 1.0 1.2/ThinDivider.qml Expandable 1.0 1.2/Expandable.qml ExpandablesColumn 1.0 1.2/ExpandablesColumn.qml ################################################# #version 1.3 Empty 1.3 1.3/Empty.qml Base 1.3 1.3/Base.qml Caption 1.3 1.3/Caption.qml Divider 1.3 1.3/Divider.qml Header 1.3 1.3/ListItemHeader.qml MultiValue 1.3 1.3/MultiValue.qml ItemSelector 1.3 1.3/ItemSelector.qml ValueSelector 1.3 1.3/ValueSelector.qml SingleValue 1.3 1.3/SingleValue.qml Standard 1.3 1.3/Standard.qml Subtitled 1.3 1.3/Subtitled.qml SingleControl 1.3 1.3/SingleControl.qml ThinDivider 1.3 1.3/ThinDivider.qml Expandable 1.3 1.3/Expandable.qml ExpandablesColumn 1.3 1.3/ExpandablesColumn.qml ./src/Ubuntu/Components/ListItems/ListItems.pro0000644000015600001650000000255712700370701021655 0ustar jenkinsjenkinsTARGETPATH = Ubuntu/Components/ListItems QML_FILES += 1.2/Base.qml \ 1.2/Caption.qml \ 1.2/Divider.qml \ 1.2/Empty.qml \ 1.2/Expandable.qml \ 1.2/ExpandablesColumn.qml \ 1.2/ListItemHeader.qml \ 1.2/IconVisual.qml \ 1.2/ImageWithFallback.qml \ 1.2/ItemSelector.qml \ 1.2/LabelVisual.qml \ 1.2/MultiValue.qml \ 1.2/ProgressionVisual.qml \ 1.2/SingleControl.qml \ 1.2/SingleValue.qml \ 1.2/Standard.qml \ 1.2/Subtitled.qml \ 1.2/ThinDivider.qml \ 1.2/ValueSelector.qml \ 1.3/Base.qml \ 1.3/Caption.qml \ 1.3/Divider.qml \ 1.3/Empty.qml \ 1.3/Expandable.qml \ 1.3/ExpandablesColumn.qml \ 1.3/ListItemHeader.qml \ 1.3/IconVisual.qml \ 1.3/ImageWithFallback.qml \ 1.3/ItemSelector.qml \ 1.3/LabelVisual.qml \ 1.3/MultiValue.qml \ 1.3/ProgressionVisual.qml \ 1.3/SingleControl.qml \ 1.3/SingleValue.qml \ 1.3/Standard.qml \ 1.3/Subtitled.qml \ 1.3/ThinDivider.qml \ 1.3/ValueSelector.qml \ load(ubuntu_qml_module) ./src/Ubuntu/Components/1.2/0000755000015600001650000000000012700370701015570 5ustar jenkinsjenkins./src/Ubuntu/Components/1.2/CheckBox.qml0000644000015600001650000000274212700370701017776 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype CheckBox \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief CheckBox is a component with two states, checked or unchecked. It can be used to set boolean options. The behavior is the same as \l Switch, the only difference is the graphical style. \l {https://design.ubuntu.com/apps/building-blocks/selection}{See also the Design Guidelines on selection}. Example: \qml Item { CheckBox { checked: true } } \endqml */ AbstractButton { id: checkBox /*! Specifies whether the checkbox is checked or not. By default the property is set to false. */ property bool checked: false /*! \internal */ onTriggered: checked = !checked style: Theme.createStyleComponent("CheckBoxStyle.qml", checkBox) } ./src/Ubuntu/Components/1.2/UbuntuListView11.qml0000644000015600001650000000171612700370701021423 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 // documentation in UbuntuListView11.qdoc UbuntuListView { /*! \internal \qmlproperty PullToRefresh pullToRefresh */ property alias pullToRefresh: refreshItem PullToRefresh { objectName: "listview_pulltorefresh" id: refreshItem enabled: false } } ./src/Ubuntu/Components/1.2/Toolbar.qml0000644000015600001650000001062412700370701017710 0ustar jenkinsjenkins/* * Copyright (C) 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \internal \qmltype Toolbar \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Application toolbar. This class is not exposed because it will be automatically added when a Page defines tools. */ Panel { id: toolbar anchors { left: parent ? parent.left : undefined right: parent ? parent.right : undefined bottom: parent ? parent.bottom : undefined } height: background.height LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft LayoutMirroring.childrenInherit: true // Closing of the toolbar on app contents interaction is handled by the Page. __closeOnContentsClicks: false // Open toolbar on hover (for desktop only) __openOnHover: true /*! The list of \l Actions to be shown on the toolbar */ property Item tools: null hideTimeout: 5000 /*! \internal */ onToolsChanged: { internal.updateVisibleTools(); if (tools) { if (tools && tools.hasOwnProperty("locked")) locked = tools.locked; // open the toolbar, except when it is locked in closed position if (tools && tools.hasOwnProperty("locked") && tools.hasOwnProperty("opened") && !tools.opened && tools.locked) { // toolbar is locked in closed state toolbar.close(); } else { toolbar.open(); } if (tools && tools.hasOwnProperty("opened")) { tools.opened = toolbar.opened; } } else { // no tools locked = true; toolbar.close(); } } // if tools is not specified, lock the toolbar in closed position locked: tools && tools.hasOwnProperty("locked") ? tools.locked : false onOpenedChanged: { if (tools && tools.hasOwnProperty("opened")) { tools.opened = toolbar.opened; } } Connections { target: tools ignoreUnknownSignals: true onOpenedChanged: { if (tools.opened) { toolbar.open(); } else { toolbar.close(); } } onLockedChanged: { toolbar.locked = tools.locked; // open the toolbar when it becomes unlocked // (may be because a new page was pushed to the page stack) if (!toolbar.locked) toolbar.open(); } } QtObject { id: internal property Item visibleTools: tools function updateVisibleTools() { if (internal.visibleTools !== toolbar.tools) { if (internal.visibleTools) internal.visibleTools.parent = null; internal.visibleTools = toolbar.tools; } if (internal.visibleTools) internal.visibleTools.parent = visibleToolsContainer; } } onAnimatingChanged: { if (!animating && !opened) { internal.updateVisibleTools(); } } StyledItem { // FIXME: // All theming items go into the background because only the children // of the Panel are being shown/hidden while the toolbar // itself may stay in place. id: background anchors { left: parent.left right: parent.right bottom: parent.bottom } height: units.gu(8) // The values of opened and animated properties are used in the style property bool opened: toolbar.opened property bool animating: toolbar.animating style: Theme.createStyleComponent("DeprecatedToolbarStyle.qml", background) } Item { id: visibleToolsContainer anchors { fill: background } } } ./src/Ubuntu/Components/1.2/dateUtils.js0000644000015600001650000000756412700370701020100 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ .pragma library /* Extending Date with few prototypes */ Date.msPerDay = 86400e3 Date.msPerWeek = Date.msPerDay * 7 /*! The function returns a Date object with the current date and hour set to midnight. */ Date.prototype.midnight = function() { this.setHours(0, 0, 0, 0); return this; } /*! The function returns an invalid date object. Example of use: \code var invalidDate = Date.prototype.getInvalidDate.call(); var otherInvalidDate = (new Date()).getInvalidDate(); \endcode */ Date.prototype.getInvalidDate = function() { return new Date(-1, -1); } /*! The function checks whether the date object is a valid one, meaning the year, month and date fields are positive numbers */ Date.prototype.isValid = function() { if (Object.prototype.toString.call(this) !== "[object Date]") { return false; } return (this.getFullYear() > 0) && (this.getMonth() >= 0) && (this.getDate() > 0); } /*! The function returns the number of days in the month set in the Date object. */ Date.prototype.daysInMonth = function() { return [ 31/*an*/, 28/*Feb*/, 31/*Mar*/, 30/*Apr*/, 31/*May*/, 30/*Jun*/, 31/*Jul*/, 31/*Aug*/, 30/*Sep*/, 31/*Oct*/, 30/*Nov*/, 31/*Dec*/ ][this.getMonth()] + (this.getMonth() === 1) * this.leapYear(); } /*! The function checks whether the year in the Date object is a leap year or not. */ Date.prototype.leapYear = function() { var year = this.getFullYear(); return year % 400 == 0 || (year % 100 !== 0 && year % 4 == 0); } /*! The function returns the distance in months (not calendaristic months) between the Date object and the given one as parameter. */ Date.prototype.monthsTo = function(target) { return target.getMonth() - this.getMonth() + (12 * (target.getFullYear() - this.getFullYear())); } /*! Same as monthsTo, but returns the distance in days. */ Date.prototype.daysTo = function(target) { return !target.isValid() ? 0 : Math.ceil((target - this) / Date.msPerDay); } /*! Same as monthsTo, but returns the distance in hours. */ Date.prototype.hoursTo = function(target) { return !target.isValid() ? 0 : Math.ceil((target.getTime() - this.getTime()) / (1000 * 60 * 60)); } /*! Same as monthsTo, but returns the distance in minutes. */ Date.prototype.minutesTo = function(target) { return !target.isValid() ? 0 : Math.ceil((target.getTime() - this.getTime()) / (1000 * 60)); } /*! Same as monthsTo, but returns the distance in seconds. */ Date.prototype.secondsTo = function(target) { return !target.isValid() ? 0 : Math.ceil((target.getTime() - this.getTime()) / 1000); } /*! The function returns the week number of the date stored in the object. */ Date.prototype.getWeek = function() { // Copy date so don't modify original var date = new Date(this); date.setHours(0, 0, 0, 0); // Set to nearest Thursday: current date + 4 - current day number // Make Sunday's day number 7 date.setDate(date.getDate() + 4 - (date.getDay() || 7)); // Get first day of year var yearStart = new Date(date.getFullYear(), 0, 1); // Calculate full weeks to nearest Thursday var weekNo = Math.ceil((((date - yearStart) / 86400000) + 1) / 7); // Return array of year and week number return weekNo; } ./src/Ubuntu/Components/1.2/stack.js0000644000015600001650000000234112700370701017233 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ .pragma library // By defining Stack as a function, we can make its variables private, // and force calls to Stack to make use of the functions we define. function Stack() { var elements; this.clear = function() { elements = []; } this.clear(); this.push = function(element) { elements.push(element); }; this.pop = function() { elements.pop(); }; this.size = function() { return elements.length; } this.top = function() { if (this.size() < 1) return undefined; return elements[elements.length-1]; } } ./src/Ubuntu/Components/1.2/PageHeadConfiguration.qml0000644000015600001650000001404712700370701022477 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype PageHeadConfiguration \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \since Ubuntu.Components 1.1 \brief Page.head is used to configure the header for a \l Page. For examples how to use Page.head, see \l Page. */ Object { // To be used inside a Page only. id: headerConfig /*! List of actions to show in the header. Example: \qml Page { title: "Custom header actions" head.actions: [ Action { iconName: "save" text: i18n.tr("Save") }, Action { iconName: "add" text: i18n.tr("Add") } ] } \endqml */ property list actions /*! Overrides the default \l PageStack back button and the \l Tabs drawer button in the header. Example: \qml Page { title: "Back Action Page" head.backAction: Action { iconName: "close" onTriggered: { console.log("Run custom back action") } } } \endqml */ property Action backAction: null /*! Set this property to show this Item in the header instead of the title. Use a \l TextField here for implementing search in header. The parent of this Item will be binded while the \l Page is active. The header contents will automatically be anchored to the left and vertically centered inside the header. Example: \qml Page { title: "Invisible title" head.contents: Rectangle { color: UbuntuColors.orange height: units.gu(5) width: parent ? parent.width - units.gu(2) : undefined } } \endqml See \l PageHeadState for an example that shows how search mode can be implemented. */ property Item contents: null QtObject { id: internal property Item oldContents: null } onContentsChanged: { if (internal.oldContents) { // FIX: bug #1341814 and #1400297 // We have to force the removal of the previous head.contents // in order to show the new contents internal.oldContents.parent = null; } internal.oldContents = contents; } // FIXME: The example below can be much simplified using PageHeadState // when bug #1345775 has been fixed. /*! Choose a preset for the header visuals and behavior. The default is an empty string "". By setting this to "select", title will be hidden and actions will be represented by icons with a label. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 MainView { id: mainView width: units.gu(40) height: units.gu(50) Page { id: page title: "Demo" state: "default" states: [ PageHeadState { name: "default" head: page.head actions: [ Action { iconName: "contact" text: "Contact" } ] }, State { id: selectState name: "select" property Action leaveSelect: Action { iconName: "back" text: "Back" onTriggered: page.state = "default" } property list actions: [ Action { iconName: "select" text: "Select All" }, Action { iconName: "delete" text: "Delete" } ] PropertyChanges { target: page.head backAction: selectState.leaveSelect actions: selectState.actions preset: "select" } } ] Label { anchors.centerIn: parent text: "Use back button to leave selection mode." visible: page.state == "select" } Button { anchors.centerIn: parent onClicked: page.state = "select" visible: page.state != "select" text: "selection mode" } } } \endqml */ property string preset: "" /*! \qmlproperty PageHeadSections sections Defines the sections in the page header divider. */ readonly property alias sections: headSections PageHeadSections { id: headSections } /*! The color of the text and icons. */ property color foregroundColor: Theme.palette.selected.backgroundText } ./src/Ubuntu/Components/1.2/PageWrapper.qml0000644000015600001650000000521112700370701020517 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import "PageWrapperUtils.js" as Utils /*! \internal \qmltype PageWrapper \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Internal class used by \l PageStack */ PageTreeNode { id: pageWrapper anchors.fill: parent /*! The reference to the page object. This can be the page itself (which is an Item), but also a url pointing to a QML file. */ property var reference /*! The initialized page object, or null if the object needs to be created. */ property Item object: null /*! This variable will be true if \l object holds an object that was created from the given reference, and thus can be destroyed when no the page is deactivated. */ property bool canDestroy: false /*! This value is updated when a PageWrapper is pushed to/popped from a PageStack. */ active: false /*! \internal */ onActiveChanged: { if (reference) { if (pageWrapper.active) Utils.activate(pageWrapper); else Utils.deactivate(pageWrapper); } } visible: active /*! Properties are use to initialize a new object, or if reference is already an object, properties are copied to the object when activated. Set properties before setting the reference. */ property var properties /*! \internal */ onReferenceChanged: { Utils.deactivate(pageWrapper); if (pageWrapper.object) pageWrapper.object = null; Utils.initPage(pageWrapper); if (pageWrapper.active && reference) { Utils.activate(pageWrapper); } } /*! \internal */ Component.onDestruction: { Utils.deactivate(pageWrapper); if (pageWrapper.canDestroy) Utils.destroyObject(pageWrapper); } /*! \internal Destroy \l object. Only call this function if \l canDestroy */ function destroyObject() { Utils.destroyObject(pageWrapper); } } ./src/Ubuntu/Components/1.2/TextInputPopover.qml0000644000015600001650000000613212700370701021624 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.Popups 1.0 Popover { id: popover objectName: "text_input_contextmenu" property Item target property bool canCopy: target && target.selectedText !== "" && !popover.password property bool password: target && target.hasOwnProperty('echoMode') && target.echoMode == TextInput.Password property list actions: [ Action { text: i18n.dtr('ubuntu-ui-toolkit', "Select All") iconName: "edit-select-all" enabled: target && target.text !== "" && target.selectedText === "" visible: target && (target.selectedText === "" || popover.password) onTriggered: target.selectAll() }, Action { text: i18n.dtr('ubuntu-ui-toolkit', "Cut") iconName: "edit-cut" // If paste/editing is not possible, then disable also "Cut" operation // It is applicable for ReadOnly's TextFields and TextAreas enabled: !target.readOnly visible: popover.canCopy onTriggered: { PopupUtils.close(popover); target.cut(); } }, Action { text: i18n.dtr('ubuntu-ui-toolkit', "Copy") iconName: "edit-copy" visible: popover.canCopy onTriggered: { PopupUtils.close(popover); target.copy(); } }, Action { text: i18n.dtr('ubuntu-ui-toolkit', "Paste") iconName: "edit-paste" enabled: target && target.canPaste onTriggered: { PopupUtils.close(popover); target.paste(); } } ] // removes hide animation function hide() { popover.visible = false; } autoClose: false contentHeight: row.childrenRect.height + padding * 2 contentWidth: row.childrenRect.width + padding * 2 property int padding: units.gu(1) Row { id: row height: units.gu(6) x: popover.padding y: popover.padding Repeater { model: actions.length AbstractButton { id: button width: Math.max(units.gu(5), implicitWidth) + units.gu(2) height: units.gu(6) action: actions[modelData] style: Theme.createStyleComponent("ToolbarButtonStyle.qml", button) } } } } ./src/Ubuntu/Components/1.2/TextArea.qml0000644000015600001650000007260512700370701020032 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 as Ubuntu import Ubuntu.Components.Popups 1.0 /*! \qmltype TextArea \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The TextArea item displays a block of editable, scrollable, formatted text. The TextArea supports fix-size and auto-expanding modes. In fix-size mode the content is scrolled when exceeds the boundaries and can be scrolled both horizontally and vertically, depending on the contentWidth and contentHeight set. The following example will scroll the editing area both horizontally and vertically: \qml TextArea { width: units.gu(20) height: units.gu(12) contentWidth: units.gu(30) contentHeight: units.gu(60) } \endqml The auto-expand mode is realized using two properties: autoSize and maximumLineCount. Setting autoSize will set implicitHeight to one line, and the height will follow the line count, meaning when lines are added the area will expand and when removed the area will shrink. The maximumLineCount specifies how much the editor should be expanded. If this value is set to 0, the area will always expand vertically to fit the content. When autoSize is set, the contentHeight property value is ignored, and the expansion only happens vertically. \qml TextArea { width: units.gu(20) height: units.gu(12) contentWidth: units.gu(30) autoSize: true maximumLineCount: 0 } \endqml TextArea comes with 30 grid-units implicit width and one line height on auto-sizing mode and 4 lines on fixed-mode. The line size is calculated from the font size and the ovarlay and frame spacing specified in the style. \section2 Scrolling and text selection The input is activated when the tap or mouse is released after being pressed over the component. Scrolling the editing area can happen when the size is fixed or in auto-sizing mode when the content size is bigger than the visible area. The scrolling is realized by swipe gestures, or by navigating the cursor. The content can be selected in the following ways: \list \li - double tapping/left mouse clicking over the content, when the word that had been tapped over will be selected \li - by pressing and dragging the selection cursor over the text input. Note that there has to be a delay of approx. 200 ms between the press and drag gesture, time when the input switches from scroll mode to selection mode \endlist The input is focused (activated) upon tap/left mouse button release. The cursor will be placed at the position the mouse/tap point at release time. If the click is happening on a selected area, the selection will be cleared. Long press above a selected area brings up the clipboard context menu. When the long press happens over a non-selected area, the cursor will be moved to the position and the component enters in selection mode. The selection mode can also be activated by tapping and keeping the tap/mouse over for approx 300 ms. If there is a move during this time, the component enters into scrolling mode. The mode is exited once the scrolling finishes. During the scrolling mode the selected text is preserved. \note During text selection all interactive parent Flickables are turned off. */ Ubuntu.StyledItem { id: control implicitWidth: units.gu(30) implicitHeight: (autoSize) ? internal.minimumSize : internal.linesHeight(4) // new properties /*! The property presents whether the TextArea is highlighted or not. By default the TextArea gets highlighted when gets the focus, so can accept text input. This property allows to control the highlight separately from the focused behavior. */ property bool highlighted: focus /*! Text that appears when there is no focus and no content in the component (hint text). \qmlproperty string placeholderText */ property alias placeholderText: hint.text /*! This property contains the text that is displayed on the screen. May differ from the text property value when TextEdit.RichText format is selected. \qmlproperty string displayText */ readonly property alias displayText: internal.displayText /*! The property drives whether text selection should happen with the mouse or not. The default value is true. \qmlproperty bool selectByMouse */ property alias selectByMouse: editor.selectByMouse /*! \deprecated This property specifies whether the text area expands following the entered text or not. The default value is false. The property is deprecated, use autoSize instead */ property bool autoExpand /*! \internal */ onAutoExpandChanged: console.debug("WARNING: autoExpand deprecated, use autoSize instead.") /*! This property specifies whether the text area sizes following the line count or not. The default value is false. */ property bool autoSize: false /*! The property holds the maximum amount of lines to expand when autoSize is enabled. The value of 0 does not put any upper limit and the control will expand forever. The default value is 5 lines. */ property int maximumLineCount: 5 // altered TextEdit properties /*! The property folds the width of the text editing content. This can be equal or bigger than the frame width minus the spacing between the frame and the input area defined in the current theme. The default value is the same as the visible input area's width. */ property real contentWidth: control.width - 2 * internal.frameSpacing /*! The property folds the height of the text editing content. This can be equal or bigger than the frame height minus the spacing between the frame and the input area defined in the current theme. The default value is the same as the visible input area's height. */ property real contentHeight: control.height - 2 * internal.frameSpacing /*! The property overrides the default popover of the TextArea. When set, the TextArea will open the given popover instead of the default one defined. The popover can either be a component or a URL to be loaded. */ property var popover // forwarded properties /*! Whether the TextArea should gain active focus on a mouse press. By default this is set to true. \qmlproperty bool activeFocusOnPress */ property alias activeFocusOnPress: editor.activeFocusOnPress /*! This property specifies a base URL which is used to resolve relative URLs within the text. The default value is the url of the QML file instantiating the TextArea item. \qmlproperty url baseUrl */ property alias baseUrl: editor.baseUrl /*! Returns true if the TextArea is writable and the content of the clipboard is suitable for pasting into the TextArea. \qmlproperty bool canPaste */ property alias canPaste: editor.canPaste /*! Returns true if the TextArea is writable and there are undone operations that can be redone. \qmlproperty bool canRedo */ property alias canRedo: editor.canRedo /*! Returns true if the TextArea is writable and there are previous operations that can be undone. \qmlproperty bool canUndo */ property alias canUndo: editor.canUndo /*! The text color. \qmlproperty color color */ property alias color: editor.color /*! The delegate for the cursor in the TextArea. If you set a cursorDelegate for a TextArea, this delegate will be used for drawing the cursor instead of the standard cursor. An instance of the delegate will be created and managed by the text edit when a cursor is needed, and the x and y properties of delegate instance will be set so as to be one pixel before the top left of the current character. Note that the root item of the delegate component must be a QQuickItem or QQuickItem derived item. */ property Component cursorDelegate: null /*! The position of the cursor in the TextArea. \qmlproperty int cursorPosition */ property alias cursorPosition: editor.cursorPosition /*! The rectangle where the standard text cursor is rendered within the text edit. Read-only. The position and height of a custom cursorDelegate are updated to follow the cursorRectangle automatically when it changes. The width of the delegate is unaffected by changes in the cursor rectangle. \qmlproperty rectangle cursorRectangle */ property alias cursorRectangle: editor.cursorRectangle /*! If true the text edit shows a cursor. This property is set and unset when the text edit gets active focus, but it can also be set directly (useful, for example, if a KeyProxy might forward keys to it). \qmlproperty bool cursorVisible */ property alias cursorVisible: editor.cursorVisible /*! Presents the effective horizontal alignment that can be different from the one specified at horizontalAlignment due to layout mirroring. \qmlproperty enumeration effectiveHorizontalAlignment */ property alias effectiveHorizontalAlignment: editor.effectiveHorizontalAlignment /*! The property holds the font used by the editing. \qmlproperty font font */ property alias font: editor.font /*! Sets the horizontal alignment of the text within the TextAre item's width and height. By default, the text alignment follows the natural alignment of the text, for example text that is read from left to right will be aligned to the left. Valid values for effectiveHorizontalAlignment are: \list \li TextEdit.AlignLeft (default) \li TextEdit.AlignRight \li TextEdit.AlignHCenter \li TextEdit.AlignJustify \endlist \qmlproperty enumeration horizontalAlignment */ property alias horizontalAlignment: editor.horizontalAlignment /*! This property holds whether the TextArea has partial text input from an input method. While it is composing an input method may rely on mouse or key events from the TextArea to edit or commit the partial text. This property can be used to determine when to disable events handlers that may interfere with the correct operation of an input method. \qmlproperty bool inputMethodComposing */ property alias inputMethodComposing: editor.inputMethodComposing /*! Provides hints to the input method about the expected content of the text edit and how it should operate. The value is a bit-wise combination of flags or Qt.ImhNone if no hints are set. Flags that alter behaviour are: \list \li Qt.ImhHiddenText - Characters should be hidden, as is typically used when entering passwords. \li Qt.ImhSensitiveData - Typed text should not be stored by the active input method in any persistent storage like predictive user dictionary. \li Qt.ImhNoAutoUppercase - The input method should not try to automatically switch to upper case when a sentence ends. \li Qt.ImhPreferNumbers - Numbers are preferred (but not required). \li Qt.ImhPreferUppercase - Upper case letters are preferred (but not required). \li Qt.ImhPreferLowercase - Lower case letters are preferred (but not required). \li Qt.ImhNoPredictiveText - Do not use predictive text (i.e. dictionary lookup) while typing. \li Qt.ImhDate - The text editor functions as a date field. \li Qt.ImhTime - The text editor functions as a time field. \endlist Flags that restrict input (exclusive flags) are: \list \li Qt.ImhDigitsOnly - Only digits are allowed. \li Qt.ImhFormattedNumbersOnly - Only number input is allowed. This includes decimal point and minus sign. \li Qt.ImhUppercaseOnly - Only upper case letter input is allowed. \li Qt.ImhLowercaseOnly - Only lower case letter input is allowed. \li Qt.ImhDialableCharactersOnly - Only characters suitable for phone dialing are allowed. \li Qt.ImhEmailCharactersOnly - Only characters suitable for email addresses are allowed. \li Qt.ImhUrlCharactersOnly - Only characters suitable for URLs are allowed. \endlist Masks: \list \li Qt.ImhExclusiveInputMask - This mask yields nonzero if any of the exclusive flags are used. \endlist \qmlproperty enumeration inputMethodHints */ property alias inputMethodHints: editor.inputMethodHints /*! Returns the total number of plain text characters in the TextArea item. As this number doesn't include any formatting markup it may not be the same as the length of the string returned by the text property. This property can be faster than querying the length the text property as it doesn't require any copying or conversion of the TextArea's internal string data. \qmlproperty int length */ property alias length: editor.length /*! Returns the total number of lines in the TextArea item. \qmlproperty int lineCount */ property alias lineCount: editor.lineCount /*! Specifies how text should be selected using a mouse. \list \li TextEdit.SelectCharacters - The selection is updated with individual characters. (Default) \li TextEdit.SelectWords - The selection is updated with whole words. \endlist This property only applies when selectByMouse is true. \qmlproperty enumeration mouseSelectionMode */ property alias mouseSelectionMode: editor.mouseSelectionMode /*! Whether the TextArea should keep the selection visible when it loses active focus to another item in the scene. By default this is set to true; \qmlproperty enumeration persistentSelection */ property alias persistentSelection: editor.persistentSelection /*! Whether the user can interact with the TextArea item. If this property is set to true the text cannot be edited by user interaction. By default this property is false. \qmlproperty bool readOnly */ property alias readOnly: editor.readOnly /*! Override the default rendering type for this component. Supported render types are: \list \li Text.QtRendering - the default \li Text.NativeRendering \endlist Select Text.NativeRendering if you prefer text to look native on the target platform and do not require advanced features such as transformation of the text. Using such features in combination with the NativeRendering render type will lend poor and sometimes pixelated results. \qmlproperty enumeration renderType */ property alias renderType: editor.renderType /*! This read-only property provides the text currently selected in the text edit. \qmlproperty string selectedText */ property alias selectedText: editor.selectedText /*! The selected text color, used in selections. \qmlproperty color selectedTextColor */ property alias selectedTextColor: editor.selectedTextColor /*! The text highlight color, used behind selections. \qmlproperty color selectionColor */ property alias selectionColor: editor.selectionColor /*! The cursor position after the last character in the current selection. This property is read-only. To change the selection, use select(start, end), selectAll(), or selectWord(). See also selectionStart, cursorPosition, and selectedText. \qmlproperty int selectionEnd */ property alias selectionEnd: editor.selectionEnd /*! The cursor position before the first character in the current selection. This property is read-only. To change the selection, use select(start, end), selectAll(), or selectWord(). See also selectionEnd, cursorPosition, and selectedText. \qmlproperty int selectionStart */ property alias selectionStart: editor.selectionStart /*! The text to display. If the text format is AutoText the text edit will automatically determine whether the text should be treated as rich text. This determination is made using Qt::mightBeRichText(). \qmlproperty string text */ property alias text: editor.text /*! The way the text property should be displayed. \list \li TextEdit.AutoText \li TextEdit.PlainText \li TextEdit.RichText \endlist The default is TextEdit.PlainText. If the text format is TextEdit.AutoText the text edit will automatically determine whether the text should be treated as rich text. This determination is made using Qt::mightBeRichText(). \qmlproperty enumeration textFormat */ property alias textFormat: editor.textFormat /*! Sets the vertical alignment of the text within the TextAres item's width and height. By default, the text alignment follows the natural alignment of the text. Valid values for verticalAlignment are: \list \li TextEdit.AlignTop (default) \li TextEdit.AlignBottom \li TextEdit.AlignVCenter \endlist \qmlproperty enumeration verticalAlignment */ property alias verticalAlignment: editor.verticalAlignment /*! Set this property to wrap the text to the TextEdit item's width. The text will only wrap if an explicit width has been set. \list \li TextEdit.NoWrap - no wrapping will be performed. If the text contains insufficient newlines, then implicitWidth will exceed a set width. \li TextEdit.WordWrap - wrapping is done on word boundaries only. If a word is too long, implicitWidth will exceed a set width. \li TextEdit.WrapAnywhere - wrapping is done at any point on a line, even if it occurs in the middle of a word. \li TextEdit.Wrap - if possible, wrapping occurs at a word boundary; otherwise it will occur at the appropriate point on the line, even in the middle of a word. \endlist The default is TextEdit.Wrap \qmlproperty enumeration wrapMode */ property alias wrapMode:editor.wrapMode // signals /*! This handler is called when the user clicks on a link embedded in the text. The link must be in rich text or HTML format and the link string provides access to the particular link. */ signal linkActivated(string link) // functions /*! Copies the currently selected text to the system clipboard. */ function copy() { editor.copy(); } /*! Moves the currently selected text to the system clipboard. */ function cut() { editor.cut(); } /*! Removes active text selection. */ function deselect() { editor.deselect(); } /*! Inserts text into the TextArea at position. */ function insert(position, text) { editor.insert(position, text); } /*! Returns the text position closest to pixel position (x, y). Position 0 is before the first character, position 1 is after the first character but before the second, and so on until position text.length, which is after all characters. */ function positionAt(x, y) { return editor.positionAt(x, y); } /*! Returns true if the natural reading direction of the editor text found between positions start and end is right to left. */ function isRightToLeft(start, end) { return editor.isRightToLeft(start, end) } /*! Moves the cursor to position and updates the selection according to the optional mode parameter. (To only move the cursor, set the cursorPosition property.) When this method is called it additionally sets either the selectionStart or the selectionEnd (whichever was at the previous cursor position) to the specified position. This allows you to easily extend and contract the selected text range. The selection mode specifies whether the selection is updated on a per character or a per word basis. If not specified the selection mode will default to whatever is given in the mouseSelectionMode property. */ function moveCursorSelection(position, mode) { if (mode === undefined) editor.moveCursorSelection(position, mouseSelectionMode); else editor.moveCursorSelection(position, mode); } /*! Places the clipboard or the data given as parameter into the text input. The selected text will be replaces with the data. */ function paste(data) { if ((data !== undefined) && (typeof data === "string") && !editor.readOnly) { var selTxt = editor.selectedText; var txt = editor.text; var pos = (selTxt !== "") ? txt.indexOf(selTxt) : editor.cursorPosition if (selTxt !== "") { editor.text = txt.substring(0, pos) + data + txt.substr(pos + selTxt.length); } else { editor.text = txt.substring(0, pos) + data + txt.substr(pos); } editor.cursorPosition = pos + data.length; } else editor.paste(); } /*! Returns the rectangle at the given position in the text. The x, y, and height properties correspond to the cursor that would describe that position. */ function positionToRectangle(position) { return editor.positionToRectangle(position); } /*! Redoes the last operation if redo is \l{canRedo}{available}. */ function redo() { editor.redo(); } /*! Causes the text from start to end to be selected. If either start or end is out of range, the selection is not changed. After calling this, selectionStart will become the lesser and selectionEnd will become the greater (regardless of the order passed to this method). See also selectionStart and selectionEnd. */ function select(start, end) { editor.select(start, end); } /*! Causes all text to be selected. */ function selectAll() { editor.selectAll(); } /*! Causes the word closest to the current cursor position to be selected. */ function selectWord() { editor.selectWord(); } /*! Returns the section of text that is between the start and end positions. The returned text will be formatted according the textFormat property. */ function getFormattedText(start, end) { return editor.getFormattedText(start, end); } /*! Returns the section of text that is between the start and end positions. The returned text does not include any rich text formatting. A getText(0, length) will result in the same value as displayText. */ function getText(start, end) { return editor.getText(start, end); } /*! Removes the section of text that is between the start and end positions from the TextArea. */ function remove(start, end) { return editor.remove(start, end); } /*! Undoes the last operation if undo is \l{canUndo}{available}. Deselects any current selection, and updates the selection start to the current cursor position. */ function undo() { editor.undo(); } // logic /*!\internal - to remove warnings */ Component.onCompleted: { editor.linkActivated.connect(control.linkActivated); } // activation area on mouse click // the editor activates automatically when pressed in the editor control, // however that one can be slightly spaced to the main control area MouseArea { anchors.fill: parent enabled: internal.frameSpacing > 0 acceptedButtons: Qt.LeftButton | Qt.RightButton // activate input when pressed on the frame preventStealing: false Ubuntu.Mouse.forwardTo: [inputHandler] } //internals opacity: enabled ? 1.0 : 0.3 /*!\internal */ onVisibleChanged: { if (!visible) control.focus = false; } LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft LayoutMirroring.childrenInherit: true QtObject { id: internal // public property locals enabling aliasing property string displayText: editor.getText(0, editor.length) property real frameSpacing: control.__styleInstance.frameSpacing property real minimumSize: units.gu(4) function linesHeight(lines) { return inputHandler.lineSize * lines + 2 * frameSpacing; } function frameSize() { if (control.autoSize) { var max = (control.maximumLineCount <= 0) ? control.lineCount : Math.min(control.maximumLineCount, control.lineCount); control.height = linesHeight(Ubuntu.MathUtils.clamp(control.lineCount, 1, max)); } } } // grab Enter/Return keys which may be stolen from parent components of TextArea // due to forwarded keys from TextEdit Keys.onPressed: { if (readOnly) return; if ((event.key === Qt.Key_Enter) || (event.key === Qt.Key_Return)) { if (editor.textFormat === TextEdit.RichText) { // FIXME: use control.paste("
") instead when paste() gets sich text support editor.insert(editor.cursorPosition, "
"); } else { control.paste("\n"); } event.accepted = true; } else { event.accepted = false; } } Keys.onReleased: event.accepted = (event.key === Qt.Key_Enter) || (event.key === Qt.Key_Return) // holding default values Label { id: fontHolder } //hint Label { id: hint anchors { fill: parent margins: internal.frameSpacing } // hint is shown till user types something in the field visible: (editor.text == "") && !editor.inputMethodComposing color: Theme.palette.normal.backgroundText font: editor.font elide: Text.ElideRight wrapMode: Text.WordWrap } //scrollbars and flickable Scrollbar { id: rightScrollbar flickableItem: flicker } Scrollbar { id: bottomScrollbar flickableItem: flicker align: Qt.AlignBottom } Flickable { id: flicker objectName: "input_scroller" anchors { fill: parent margins: internal.frameSpacing } clip: true contentWidth: editor.paintedWidth contentHeight: editor.paintedHeight // do not allow rebounding boundsBehavior: Flickable.StopAtBounds // editor // Images are not shown when text contains tags // bug to watch: https://bugreports.qt-project.org/browse/QTBUG-27071 TextEdit { objectName: "text_input" readOnly: false id: editor focus: true width: control.contentWidth height: Math.max(control.contentHeight, editor.contentHeight) wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere mouseSelectionMode: TextEdit.SelectWords selectByMouse: true activeFocusOnPress: true onActiveFocusChanged: if (!activeFocus && inputHandler.popover) PopupUtils.close(inputHandler.popover) cursorDelegate: TextCursor { handler: inputHandler } color: control.__styleInstance.color selectedTextColor: control.__styleInstance.selectedTextColor selectionColor: control.__styleInstance.selectionColor font.pixelSize: FontUtils.sizeToPixels("medium") // forward keys to the root element so it can be captured outside of it // as well as to InputHandler to handle PageUp/PageDown keys Keys.forwardTo: [control, inputHandler] // autosize handling onLineCountChanged: internal.frameSize() // input selection and navigation handling Ubuntu.Mouse.forwardTo: [inputHandler] InputHandler { id: inputHandler anchors.fill: parent main: control input: editor flickable: flicker } } } style: Theme.createStyleComponent("TextAreaStyle.qml", control) } ./src/Ubuntu/Components/1.2/Scrollbar.qml0000644000015600001650000001167612700370701020241 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype ScrollBar \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The ScrollBar component provides scrolling functionality for scrollable views (i.e. Flickable, ListView). The ScrollBar can be set to any flickable and has built-in anchoring setup to the attached flickable's front, rear, top or bottom. the scrollbar can also be aligned using anchors, however the built-in align functionality makes sure to have the proper alignemt applied based on theme and layout direction (RTL or LTR). The content position is driven through the attached Flickable. Therefore every style implementation should drive the position through contentX/contentY properties, depending on whether the orientation is vertical or horizontal. Example: \qml Item { ListView { id: list width: units.gu(37) height: units.gu(37) model: 30 delegate: Rectangle { width: ListView.view.width height: units.gu(5) Text { anchors.fill: parent text: "Item " + modelData } } } Scrollbar { flickableItem: list align: Qt.AlignTrailing } } \endqml */ StyledItem { id: scrollbar /*! This property holds the flickable item (Flickable, ListView or GridView) the Scrollbar is attached to. */ property Flickable flickableItem: null /*! The property defines the alignment of the scrollbar to the flickableItem. The implementation handles the alignment as follows: \list \li Qt.AlignLeading anchors to the left on LTR and to the right on RTL layouts \li Qt.AlignTrailing anchors to the right on LTR and to the left on RTL layouts \li Qt.AlignTop anchors to the top \li Qt.AlignBottom anchors to the bottom \endlist The default value is \b Qt.AlignTrailing. */ property int align: Qt.AlignTrailing /*! \internal This property holds whether the scrollbar is active or passive. It is present for testing purposes. */ property bool __interactive: __styleInstance !== null && __styleInstance.interactive implicitWidth: internals.vertical ? units.gu(4) : flickableItem.width implicitHeight: !internals.vertical ? units.gu(4) : flickableItem.height anchors { left: internals.leftAnchor(flickableItem) right: internals.rightAnchor(flickableItem) top: internals.topAnchor(flickableItem) bottom: internals.bottomAnchor(flickableItem) } /*! \internal */ onAlignChanged: if (!internals.checkAlign()) console.log("Wrong alignment set to Scrollbar: "+align) /*! \internal Internals: contains the common logic of the scrollbar like anchoring, alignemt check, scrollability check. */ property alias __private: internals QtObject { id: internals property bool vertical: (align === Qt.AlignLeading) || (align === Qt.AlignTrailing) property bool scrollable: flickableItem && flickableItem.interactive && checkAlign() function checkAlign() { return (align === Qt.AlignLeading) || (align === Qt.AlignTrailing) || (align === Qt.AlignTop) || (align === Qt.AlignBottom); } // LTR and RTL are provided by LayoutMirroring, so no need to check that function leftAnchor(object) { if (!internals.vertical || (align == Qt.AlignLeading)) return object.left; return undefined; } function rightAnchor(object) { if (!internals.vertical || (align == Qt.AlignTrailing)) return object.right; return undefined; } function topAnchor(object) { if (internals.vertical || (align == Qt.AlignTop)) return object.top; return undefined; } function bottomAnchor(object) { if (internals.vertical || (align == Qt.AlignBottom)) return object.bottom; return undefined; } } style: Theme.createStyleComponent("ScrollbarStyle.qml", scrollbar) } ./src/Ubuntu/Components/1.2/AnimatedItem.qml0000644000015600001650000000227712700370701020654 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \qmltype AnimatedItem \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The AnimatedItem drives the animated components behavior inside a Flickable. Reports whether the component whos parent is a Flickable is in the visible area or not, so derived components can pause animations while off-screen. */ import QtQuick 2.4 import Ubuntu.Components 1.2 StyledItem { id: root /*! \deprecated Specifies whether the component is on the visible area of the Flickable or not. */ property bool onScreen: true } ./src/Ubuntu/Components/1.2/OptionSelector.qml0000644000015600001650000002410612700370701021257 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components.ListItems 1.0 as ListItem import Ubuntu.Components 1.2 as Toolkit /*! \qmltype OptionSelector \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu-components \brief Component displaying either a single selected value or expanded multiple choice with an optional image and subtext when not expanded, when expanding it opens a listing of all the possible values for selection with an additional option of always being expanded. If multiple choice is selected the list is expanded automatically. Examples: \qml import Ubuntu.Components 1.2 Column { spacing: units.gu(3) OptionSelector { text: i18n.tr("Label") model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } OptionSelector { text: i18n.tr("Label") expanded: true model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } OptionSelector { objectName: "optionselector_multipleselection" text: i18n.tr("Multiple Selection") expanded: false multiSelection: true model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } OptionSelector { text: i18n.tr("Label") model: customModel expanded: true colourImage: true delegate: selectorDelegate } Component { id: selectorDelegate OptionSelectorDelegate { text: name; subText: description; iconSource: image } } ListModel { id: customModel ListElement { name: "Name 1"; description: "Description 1"; image: "images.png" } ListElement { name: "Name 2"; description: "Description 2"; image: "images.png" } ListElement { name: "Name 3"; description: "Description 3"; image: "images.png" } ListElement { name: "Name 4"; description: "Description 4"; image: "images.png" } } OptionSelector { text: i18n.tr("Label") model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4"), i18n.tr("Value 5"), i18n.tr("Value 6"), i18n.tr("Value 7"), i18n.tr("Value 8")] containerHeight: itemHeight * 4 } OptionSelector { text: i18n.tr("Label") expanded: true model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4"), i18n.tr("Value 5"), i18n.tr("Value 6"), i18n.tr("Value 7"), i18n.tr("Value 8")] containerHeight: itemHeight * 4 } } \endqml */ ListItem.Empty { id: optionSelector /*! The list of values that will be shown under the label text. This is a model. */ property var model /*! Specifies whether the list is always expanded. */ property bool expanded: false /*! If the multiple choice selection is enabled the list is always expanded. */ property bool multiSelection: false /*! Colours image according to the fieldText colour of the theme, otherwise source colour is maintained. */ property bool colourImage: false /*! ListView delegate. */ property Component delegate: Toolkit.OptionSelectorDelegate {} /*! Custom height for list container which allows scrolling inside the selector. */ property real containerHeight: { /*The reason for this slightly unconventional method of setting the container height is due to the fact that if we set it to the selector height by default (which is bound to the colum height) then we wouldn't be able to scroll to the end of the bottom boundary. The text is also invisible if none is set so this is taken into account too.*/ var textHeight = text === "" ? 0 : label.height + column.spacing; if (parent && parent.height < list.contentHeight) { return parent.height - textHeight; } else { list.contentHeight; } } /*! \qmlproperty int selectedIndex The index of the currently selected element in our list. */ property alias selectedIndex: list.currentIndex /*! \qmlproperty bool currentlyExpanded Is our list currently expanded? */ property alias currentlyExpanded: listContainer.currentlyExpanded /*! \qmlproperty real itemHeight Height of an individual list item. */ readonly property alias itemHeight: list.itemHeight /*! Called when delegate is clicked. */ signal delegateClicked(int index) /*! Called when the selector has finished expanding or collapsing. */ signal expansionCompleted() /*! \internal Trigger the action, passing the current index. */ onDelegateClicked: { trigger(index) } __height: column.height showDivider: false Column { id: column spacing: units.gu(2) anchors { left: parent.left right: parent.right } Label { id : label text: optionSelector.text visible: optionSelector.text !== "" ? true : false } Toolkit.StyledItem { id: listContainer objectName: "listContainer" activeFocusOnPress: true readonly property url chevron: __styleInstance.chevron readonly property url tick: __styleInstance.tick readonly property color themeColour: Theme.palette.selected.fieldText readonly property alias colourImage: optionSelector.colourImage property bool currentlyExpanded: expanded || multiSelection anchors { left: parent.left right: parent.right } state: optionSelector.expanded ? "expanded" : "collapsed" style: Theme.createStyleComponent("OptionSelectorStyle.qml", listContainer) states: [ State { name: "expanded" when: listContainer.currentlyExpanded PropertyChanges { target: listContainer height: list.contentHeight < containerHeight ? list.contentHeight : containerHeight } }, State { name: "collapsed" when: !listContainer.currentlyExpanded PropertyChanges { target: listContainer height: list.itemHeight } } ] transitions: [ Transition { SequentialAnimation { Toolkit.UbuntuNumberAnimation { properties: "height" duration: Toolkit.UbuntuAnimation.BriskDuration } ScriptAction { script: { if (listContainer.currentlyExpanded) { expansionCompleted(); } else { list.positionViewAtIndex(selectedIndex, ListView.Beginning); } } } } } ] ListView { id: list property int previousIndex: -1 readonly property alias expanded: optionSelector.expanded readonly property alias multiSelection: optionSelector.multiSelection readonly property alias container: listContainer property real itemHeight signal delegateClicked(int index) onMovementStarted: optionSelector.requestFocus(Qt.MouseFocusReason) onFlickStarted: optionSelector.requestFocus(Qt.MouseFocusReason) Toolkit.Mouse.onClicked: optionSelector.requestFocus(Qt.MouseFocusReason) onDelegateClicked: optionSelector.delegateClicked(index); interactive: listContainer.height !== list.contentHeight && listContainer.currentlyExpanded ? true : false clip: true currentIndex: 0 model: optionSelector.model anchors.fill: parent delegate: optionSelector.delegate Behavior on contentY { Toolkit.UbuntuNumberAnimation { properties: "contentY" duration: Toolkit.UbuntuAnimation.BriskDuration } } } } } } ./src/Ubuntu/Components/1.2/UbuntuNumberAnimation.qml0000644000015600001650000000350212700370701022576 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype UbuntuNumberAnimation \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief UbuntuNumberAnimation is a NumberAnimation that has predefined settings to ensure that Ubuntu applications are consistent in their animations. Example of use: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 Rectangle { width: 100; height: 100 color: UbuntuColors.orange UbuntuNumberAnimation on x { to: 50 } } \endqml UbuntuNumberAnimation is predefined with the following settings: \list \li \e duration: \l{UbuntuAnimation::FastDuration}{UbuntuAnimation.FastDuration} \li \e easing: \l{UbuntuAnimation::StandardEasing}{UbuntuAnimation.StandardEasing} \endlist If the standard duration and easing used by UbuntuNumberAnimation do not satisfy a use case or you need to use a different type of Animation (e.g. ColorAnimation), use standard durations and easing defined in \l UbuntuAnimation manually in order to ensure consistency. */ NumberAnimation { duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } ./src/Ubuntu/Components/1.2/Header.qml0000644000015600001650000000226712700370701017502 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype Header \internal \deprecated */ AppHeader { /*! \internal We need this property so QML exposes this class as Header instead of AppHeader. This way autopilot can select the deprecated header. */ property string _for_autopilot Component.onCompleted: { print("WARNING: Header is an internal component of Ubuntu.Components and" + "its API may change or be removed at any moment." + "Please use MainView and Page instead." ); } } ./src/Ubuntu/Components/1.2/OptionSelectorDelegate.qml0000644000015600001650000002703712700370701022720 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \qmltype OptionSelectorDelegate \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu-components \brief OptionSelector delegate which can display text, subtext and an image from a custom model. Examples: \qml import Ubuntu.Components 1.2 Column { width: 250 OptionSelector { text: i18n.tr("Label") model: customModel delegate: OptionSelectorDelegate { text: name; subText: description; iconSource: image } } ListModel { id: customModel ListElement { name: "Name 1"; description: "Description 1"; image: "images.png" } ListElement { name: "Name 2"; description: "Description 2"; image: "images.png" } ListElement { name: "Name 3"; description: "Description 3"; image: "images.png" } ListElement { name: "Name 4"; description: "Description 4"; image: "images.png" } } } \endqml */ import QtQuick 2.4 import Ubuntu.Components.ListItems 1.0 as ListItem import Ubuntu.Components 1.2 as Toolkit ListItem.Empty { id: option __height: units.gu(5) /*! Subtext which appears below the main text. */ property string subText /*! \deprecated \b{Use iconName or iconSource instead.} Left icon url. */ property url icon: iconSource onIconChanged: if (icon != iconSource) { console.warn("WARNING: OptionSelectorDelegate.icon is DEPRECATED. " + "Use iconName and iconSource instead.") } /*! Constrains the size of the image to nothing greater than that of the delegate. Changes fillMode to Image.PreserveAspectFit. */ property bool constrainImage: false /*! Whether or not left image is coloured by our theme. */ property bool colourImage: listView.container.colourImage /*! Colour of left image. */ property color assetColour: listView.container.themeColour /*! OptionSelector's ListView. */ readonly property ListView listView: ListView.view /*! Colourising fragment shader. */ readonly property string fragColourShader: "varying highp vec2 qt_TexCoord0; uniform sampler2D source; uniform lowp vec4 colour; uniform lowp float qt_Opacity; void main() { lowp vec4 sourceColour = texture2D(source, qt_TexCoord0); gl_FragColor = colour * sourceColour.a * qt_Opacity; }" showDivider: index !== listView.count - 1 ? 1 : 0 highlightWhenPressed: false selected: ListView.isCurrentItem anchors { left: parent.left right: parent.right } onClicked: { if (listView.container.currentlyExpanded) { listView.delegateClicked(index); if (!listView.multiSelection) { listView.previousIndex = listView.currentIndex; listView.currentIndex = index; } else { selected = !selected; } } if (!listView.expanded && !listView.multiSelection) { listView.container.currentlyExpanded = !listView.container.currentlyExpanded; } } Component.onCompleted: { height = listView.itemHeight = childrenRect.height; } //Since we don't want to add states to our divider, we use the exposed alias provided in Empty to access it and alter it's opacity from here. states: [ State { name: "dividerExpanded" when: listView.container.state === "expanded" && index === listView.currentIndex PropertyChanges { target: option.divider opacity: 1 } }, State { name: "dividerCollapsed" when: listView.container.state === "collapsed" && index === listView.currentIndex PropertyChanges { target: option.divider opacity: 0 } } ] //As with our states, we apply the transition with our divider as the target. transitions: [ Transition { from: "dividerExpanded" to: "dividerCollapsed" Toolkit.UbuntuNumberAnimation { target: option.divider properties: "opacity" duration: Toolkit.UbuntuAnimation.SlowDuration } } ] resources: [ Connections { target: listView.container onCurrentlyExpandedChanged: { imageExpansion.stop(); selectedImageCollapse.stop(); deselectedImageCollapse.stop(); if (listView.container.currentlyExpanded === true) { if (!option.selected) { optionExpansion.start(); //Ensure a source change. This solves a bug which happens occasionaly when source is switched correctly. Probably related to the image.source binding. image.source = listView.container.tick } else { imageExpansion.start(); } } else { if (!option.selected) { optionCollapse.start(); } else { if (listView.previousIndex !== listView.currentIndex) selectedImageCollapse.start(); else { deselectedImageCollapse.start(); } } } } }, SequentialAnimation { id: imageExpansion PropertyAnimation { target: image properties: "opacity" from : 1.0 to: 0.0 duration: Toolkit.UbuntuAnimation.FastDuration } PauseAnimation { duration: Toolkit.UbuntuAnimation.BriskDuration - Toolkit.UbuntuAnimation.FastDuration } PropertyAction { target: image property: "source" value: listView.container.tick } PropertyAnimation { target: image properties: "opacity" from : 0.0 to: 1.0 duration: Toolkit.UbuntuAnimation.FastDuration } }, PropertyAnimation { id: optionExpansion target: option properties: "opacity" from : 0.0 to: 1.0 duration: Toolkit.UbuntuAnimation.SlowDuration }, SequentialAnimation { id: deselectedImageCollapse PauseAnimation { duration: Toolkit.UbuntuAnimation.BriskDuration } PropertyAnimation { target: image properties: "opacity" from : 1.0 to: 0.0 duration: Toolkit.UbuntuAnimation.FastDuration } PauseAnimation { duration: Toolkit.UbuntuAnimation.FastDuration } PropertyAction { target: image property: "source" value: listView.container.chevron } PropertyAnimation { target: image properties: "opacity" from : 0.0 to: 1.0 duration: Toolkit.UbuntuAnimation.FastDuration } }, SequentialAnimation { id: selectedImageCollapse PropertyAnimation { target: image properties: "opacity" from : 0.0 to: 1.0 duration: Toolkit.UbuntuAnimation.FastDuration } PauseAnimation { duration: Toolkit.UbuntuAnimation.BriskDuration - Toolkit.UbuntuAnimation.FastDuration } PropertyAnimation { target: image properties: "opacity" from : 1.0 to: 0.0 duration: Toolkit.UbuntuAnimation.FastDuration } PauseAnimation { duration: Toolkit.UbuntuAnimation.FastDuration } PropertyAction { target: image property: "source" value: listView.container.chevron } PropertyAnimation { target: image properties: "opacity" from : 0.0 to: 1.0 duration: Toolkit.UbuntuAnimation.FastDuration } }, PropertyAnimation { id: optionCollapse target: option properties: "opacity" from : 1.0 to: 0.0 duration: Toolkit.UbuntuAnimation.SlowDuration } ] Row { spacing: units.gu(1) anchors { left: parent.left leftMargin: units.gu(2) verticalCenter: parent.verticalCenter } Image { id: leftIcon objectName: "icon" height: constrainImage ? option.height : sourceSize.height source: option.iconSource fillMode: constrainImage ? Image.PreserveAspectFit : Image.Stretch ShaderEffect { property color colour: assetColour property Image source: parent width: source.width height: source.height visible: colourImage fragmentShader: fragColourShader } } Column { anchors { verticalCenter: parent.verticalCenter } Label { text: option.text === "" ? modelData : option.text } Label { text: option.subText visible: option.subText !== "" ? true : false fontSize: "small" } } } Image { id: image width: units.gu(2) height: units.gu(2) source: listView.expanded || listView.multiSelection ? listView.container.tick : listView.container.chevron opacity: option.selected ? 1.0 : 0.0 anchors { right: parent.right rightMargin: units.gu(2) verticalCenter: parent.verticalCenter } //Our behaviour is only enabled for our expanded list due to flickering bugs in relation to all this other animations running on the expanding version. Behavior on opacity { enabled: listView.expanded Toolkit.UbuntuNumberAnimation { properties: "opacity" duration: Toolkit.UbuntuAnimation.FastDuration } } ShaderEffect { property color colour: assetColour property Image source: parent width: source.width height: source.height fragmentShader: fragColourShader } } } ./src/Ubuntu/Components/1.2/MainView.qml0000644000015600001650000002537312700370701020034 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.PerformanceMetrics 1.0 import QtQuick.Window 2.0 /*! \internal */ // Documentation is in MainView.qdoc MainViewBase { id: mainView /*! \qmlproperty bool automaticOrientation */ property bool automaticOrientation: false property bool useDeprecatedToolbar: true /*! \internal Use default property to ensure children added do not draw over the toolbar. */ default property alias contentsItem: contents.data OrientationHelper { id: canvas automaticOrientation: false anchorToKeyboard: mainView.anchorToKeyboard // clip the contents so that it does not overlap the header Item { id: contentsClipper anchors { left: parent.left right: parent.right top: headerItem.bottom bottom: parent.bottom } // only clip when necessary // ListView headers may be positioned at the top, independent from // flickable.contentY, so do not clip depending on activePage.flickable.contentY. clip: headerItem.bottomY > 0 && internal.activePage && internal.activePage.flickable Item { id: contents anchors { fill: parent // move the whole contents up if the toolbar is locked and opened otherwise the toolbar will obscure part of the contents bottomMargin: mainView.useDeprecatedToolbar && toolbarLoader.item.locked && toolbarLoader.item.opened ? toolbarLoader.item.height + toolbarLoader.item.triggerSize : 0 // compensate so that the actual y is always 0 topMargin: -parent.y } } MouseArea { id: contentsArea anchors.fill: contents // This mouse area will be on top of the page contents, but // under the toolbar and header. // It is used for detecting interaction with the page contents // which can close the toolbar and take a tab bar out of selection mode. onPressed: { mouse.accepted = false; if (mainView.useDeprecatedToolbar) { if (!toolbarLoader.item.locked) { toolbarLoader.item.close(); } } if (headerItem.tabBar && !headerItem.tabBar.alwaysSelectionMode) { headerItem.tabBar.selectionMode = false; } } propagateComposedEvents: true enabled: mainView.useDeprecatedToolbar } } /*! Animate header and toolbar. */ property bool animate: true Component { id: toolbarComponent Toolbar { parent: canvas onPressedChanged: { if (!pressed) return; if (headerItem.tabBar !== null) { headerItem.tabBar.selectionMode = false; } } animate: canvas.animate tools: internal.activePage ? internal.activePage.tools : null } } Loader { id: toolbarLoader sourceComponent: mainView.useDeprecatedToolbar ? toolbarComponent : null } /*! The header of the MainView. Can be used to obtain the height of the header in \l Page to determine the area for the \l Page to fill. */ AppHeader { // This objectName is used in the MainView autopilot custom proxy object // in order to select the application header. // Also used in tst_header_locked_visible.qml. objectName: "MainView_Header" id: headerItem property real bottomY: headerItem.y + headerItem.height animate: canvas.animate dividerColor: Qt.darker(mainView.headerColor, 1.1) panelColor: Qt.lighter(mainView.headerColor, 1.1) title: internal.activePage ? internal.activePage.title : "" flickable: internal.activePage ? internal.activePage.flickable : null pageStack: internal.activePage ? internal.activePage.pageStack : null PageHeadConfiguration { id: headerConfig // for backwards compatibility with deprecated tools property actions: internal.activePage ? getActionsFromTools(internal.activePage.tools) : null backAction: internal.activePage && internal.activePage.tools && internal.activePage.tools.hasOwnProperty("back") && internal.activePage.tools.back && internal.activePage.tools.back.hasOwnProperty("action") ? internal.activePage.tools.back.action : null function getActionsFromTools(tools) { if (!tools || !tools.hasOwnProperty("contents")) { // tools is not of type ToolbarActions. Not supported. return null; } var actionList = []; for (var i in tools.contents) { var item = tools.contents[i]; if (item && item.hasOwnProperty("action") && item.action !== null) { var action = item.action; if (action.hasOwnProperty("iconName") && action.hasOwnProperty("text")) { // it is likely that the action is of type Action. actionList.push(action); } } } return actionList; } } contents: internal.activePage ? internal.activePage.__customHeaderContents : null // FIXME: This can be simplified a lot when we drop support for using // the deprecated tools property. config: internal.activePage && internal.activePage.hasOwnProperty("head") && (internal.activePage.head.actions.length > 0 || internal.activePage.head.backAction !== null || internal.activePage.head.contents !== null || internal.activePage.head.sections.model !== undefined) ? internal.activePage.head : headerConfig property Item tabBar: null Binding { target: headerItem property: "tabBar" value: headerItem.__styleInstance.__tabBar when: headerItem.__styleInstance && headerItem.__styleInstance.hasOwnProperty("__tabBar") } Connections { // no connections are made when target is null target: headerItem.tabBar onPressedChanged: { if (mainView.useDeprecatedToolbar) { if (headerItem.tabBar.pressed) { if (!toolbarLoader.item.locked) toolbarLoader.item.close(); } } } } // 'window' is defined by QML between startup and showing on the screen. // There is no signal for when it becomes available and re-declaring it is not safe. property bool windowActive: typeof window != 'undefined' onWindowActiveChanged: { window.title = headerItem.title } Connections { target: headerItem onTitleChanged: { if (headerItem.windowActive) window.title = headerItem.title } } useDeprecatedToolbar: mainView.useDeprecatedToolbar } Connections { target: Qt.application onActiveChanged: { if (Qt.application.active) { canvas.animate = false; headerItem.show(); if (headerItem.tabBar) { headerItem.tabBar.selectionMode = true; } if (mainView.useDeprecatedToolbar) { if (!toolbarLoader.item.locked) toolbarLoader.item.open(); } canvas.animate = true; } } } } Object { id: internal // Even when using MainView 1.1, we still support Page 1.0. // we use PageTreeNode being the base class of all pages. property PageTreeNode activePage: isPage(mainView.activeLeafNode) ? mainView.activeLeafNode : null function isPage(item) { return item && item.hasOwnProperty("__isPageTreeNode") && item.__isPageTreeNode && item.hasOwnProperty("title") && item.hasOwnProperty("tools"); } } __propagated: QtObject { /*! \internal The header that will be propagated to the children in the page tree node. It is used by Tabs to bind header's tabsModel. */ property AppHeader header: headerItem /*! \internal \deprecated The toolbar that will be propagated to the children in the page tree node. */ property Toolbar toolbar: toolbarLoader.item /*! \internal Tabs needs to know whether to use a TabBar or the new header. */ property alias useDeprecatedToolbar: mainView.useDeprecatedToolbar /*! \internal The action manager that has the global context for the MainView's actions, and to which a local context can be added for each Page that has actions.actions. */ property var actionManager: mainView.actionManager } } ./src/Ubuntu/Components/1.2/Tabs.qml0000644000015600001650000004021512700370701017176 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype Tabs \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The Tabs class provides an environment where multible \l Tab children can be added, and the user is presented with a tab bar with tab buttons to select different tab pages. Tabs must be placed inside a \l MainView so that it will automatically have a header that shows the tabs that can be selected, and the toolbar which contains the tools of the \l Page in the currently selected \l Tab. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 as ListItem MainView { width: units.gu(48) height: units.gu(60) Tabs { id: tabs Tab { title: i18n.tr("Simple page") page: Page { Label { id: label anchors.centerIn: parent text: "A centered label" } tools: ToolbarItems { ToolbarButton { text: "action" onTriggered: print("action triggered") } } } } Tab { id: externalTab title: i18n.tr("External") page: Loader { parent: externalTab anchors { left: parent.left right: parent.right bottom: parent.bottom } source: (tabs.selectedTab === externalTab) ? Qt.resolvedUrl("MyCustomPage.qml") : "" } } Tab { title: i18n.tr("List view") page: Page { ListView { clip: true anchors.fill: parent model: 20 delegate: ListItem.Standard { iconName: "compose" text: "Item "+modelData } } } } } } \endqml As the example above shows, an external \l Page inside a \l Tab can be loaded using a Loader. Note that setting the top anchor or the height of the Loader would override the \l Page height. We avoid this because the \l Page automatically adapts its height to accommodate for the header. It is possible to use a Repeater to generate tabs, but when doing so, ensure that the Repeater is declared inside the Tabs at the end, because otherwise the shuffling of the order of children by the Repeater can cause incorrect ordering of the tabs. The \l {http://design.ubuntu.com/apps/global-patterns/navigation}{Navigation Patterns} specify that a tabs header should never be combined with the back button of a \l PageStack. The only way to combine Tabs and \l PageStack that avoids this is by pushing the Tabs as the first page on the \l PageStack, and pushing other pages on top of that, as is shown in the following example: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 MainView { id: mainView width: units.gu(38) height: units.gu(50) PageStack { id: pageStack Component.onCompleted: push(tabs) Tabs { id: tabs Tab { title: "Tab 1" page: Page { Button { anchors.centerIn: parent onClicked: pageStack.push(page3) text: "Press" } } } Tab { title: "Tab 2" page: Page { Label { anchors.centerIn: parent text: "Use header to navigate between tabs" } } } } Page { id: page3 visible: false title: "Page on stack" Label { anchors.centerIn: parent text: "Press back to return to the tabs" } } } } \endqml */ PageTreeNode { id: tabs anchors.fill: parent /*! \qmlproperty int selectedTabIndex The index of the currently selected tab. The first tab is 0, and -1 means that no tab is selected. The initial value is 0 if Tabs has contents, or -1 otherwise. */ property alias selectedTabIndex: tabsModel.selectedIndex /*! The currently selected tab. */ readonly property Tab selectedTab: (selectedTabIndex < 0) || (tabsModel.count <= selectedTabIndex) ? null : tabsModel.get(selectedTabIndex).tab /*! The page of the currently selected tab. */ readonly property Item currentPage: selectedTab ? selectedTab.page : null /*! \deprecated The \l TabBar that will be shown in the header and provides scrollable tab buttons. This property is DEPRECATED. TabBar is now part of the header style. */ property TabBar tabBar: internal.header && internal.header.__styleInstance && internal.header.__styleInstance.hasOwnProperty("__tabBar") ? internal.header.__styleInstance.__tabBar : null /*! Children are placed in a separate item that has functionality to extract the Tab items. \qmlproperty list tabChildren */ default property alias tabChildren: tabStack.data /*! \qmlproperty int count Contains the number of tabs in the Tabs component. */ readonly property alias count: tabsModel.count /*! \deprecated Used by the tabs style to update the tabs header with the titles of all the tabs. This signal is used in an intermediate step in transitioning the tabs to a new implementation and may be removed in the future. */ signal modelChanged() /*! \internal tst_tabs.qml needs access to the model to verify that Repeaters inside Tabs works. */ property var __model: tabsModel /*! \internal required by TabsStyle */ ListModel { id: tabsModel property bool updateDisabled: false /*! The index of the selected tab. */ property int selectedIndex: tabsModel.count > 0 ? 0 : -1 function listModel(tab) { return {"title": tab.title, "tab": tab}; } function updateTabList(tabsList) { var offset = 0; var tabIndex; for (var i in tabsList) { var tab = tabsList[i]; if (internal.isTab(tab)) { tabIndex = i - offset; // make sure we have the right parent tab.parent = tabStack; if (!tab.__protected.inserted) { tab.__protected.index = tabIndex; tab.__protected.inserted = true; insert(tabIndex, listModel(tab)); } else if (!tab.__protected.removedFromTabs && tabsModel.count > tab.index) { get(tab.index).title = tab.title; } // always makes sure that tabsModel has the same order as tabsList move(tab.__protected.index, tabIndex, 1); reindex(); } else { // keep track of children that are not tabs so that we compute // the right index for actual tabs offset += 1; } } internal.sync(); } function reindex(from) { var start = 0; if (from !== undefined) { start = from + 1; } for (var i = start; i < count; i++) { var tab = get(i).tab; tab.__protected.index = i; } } } // FIXME: this component is not really needed, as it doesn't really bring any // value; should be removed in a later MR Item { anchors.fill: parent id: tabStack onChildrenChanged: { internal.connectToRepeaters(tabStack.children); tabsModel.updateTabList(tabStack.children); } } /* This timer is used when tabs are created using Repeaters. Repeater model element moves (shuffling) are causing re-stacking of the tab stack children which may not be realized at the time the rowsMoved/columnsMoved or layoutChanged signals are triggered. Therefore we use an idle timer to update the tabs model, so the tab stack is re-stacked by then. */ Timer { id: updateTimer interval: 1 running: false onTriggered: { tabsModel.updateTabList(tabStack.children); internal.sync(); } } Object { id: internal property AppHeader header: tabs.__propagated ? tabs.__propagated.header : null /* List of connected Repeaters to avoid repeater "hammering" of itemAdded() signal. */ property var repeaters: [] function sync() { if (tabBar && tabBar.__styleInstance && tabBar.__styleInstance.hasOwnProperty("sync")) { tabBar.__styleInstance.sync(); } if (tabs.active && internal.header) { internal.header.show(); } // deprecated, however use it till we remove it completely tabs.modelChanged(); } function isTab(item) { if (item && item.hasOwnProperty("__isPageTreeNode") && item.__isPageTreeNode && item.hasOwnProperty("title") && item.hasOwnProperty("page")) { return true; } else { return false; } } function isRepeater(item) { return (item && item.hasOwnProperty("itemAdded")); } function connectToRepeaters(children) { for (var i = 0; i < children.length; i++) { var child = children[i]; if (internal.isRepeater(child) && internal.repeaters && (internal.repeaters.indexOf(child) < 0)) { internal.connectRepeater(child); } } } /* When inserting a delegate into its parent the Repeater does it in 3 steps: 1) sets the parent of the delegate thus inserting it in the list of children in a position that does not correspond to the position of the corresponding item in the model. At that point the childrenChanged() signal is emitted. 2) reorder the delegate to match the position of the corresponding item in the model. 3) emits the itemAdded() signal. We need to update the list of tabs (tabsModel) when the children are in the adequate order hence the workaround below. It connects to the itemAdded() signal of any repeater it finds and triggers an update of the tabsModel. Somewhat related Qt bug report: https://bugreports.qt-project.org/browse/QTBUG-32438 */ function updateTabsModel() { tabsModel.updateTabList(tabStack.children); } /* Connects a Repeater and stores it so further connects will not happen to the same repeater avoiding in this way hammering. */ function connectRepeater(repeater) { // store repeater repeaters.push(repeater); // connect destruction signal so we have a proper cleanup repeater.Component.onDestruction.connect(internal.disconnectRepeater.bind(repeater)); // connect repeater's itemAdded and itemRemoved signals repeater.itemAdded.connect(internal.updateTabsModel); repeater.itemRemoved.connect(internal.removeTabFromModel); // check if the repeater's model is set, if not, connect to modelChanged to catch that if (repeater.model === undefined) { repeater.modelChanged.connect(internal.connectRepeaterModelChanges.bind(repeater)); } else { connectRepeaterModelChanges(repeater); } } /* Disconnects the given repeater signals. */ function disconnectRepeater() { this.itemAdded.disconnect(internal.updateTabsModel); this.itemRemoved.disconnect(internal.removeTabFromModel); this.modelChanged.disconnect(internal.connectRepeaterModelChanges); } /* Connects a Repeater's model change signals so we get notified whenever those change. This can be called either by the Repeater's modelChanged() signal, in which case the parameter is undefined, or from the connectRepeater() in case the model is given for the Repeater. */ function connectRepeaterModelChanges(repeater) { if (repeater === undefined) { repeater = this; } /* Omit model types which are not derived from object (i.e. are [object Number] or [object Array] typed). JS 'instanceof' operator does not return true for all types of arrays (i.e for property var array: [....] it returns false). The safest way to detect whether the model is really an object we use the toString() prototype of the generic JS Object. Inspired from http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/ */ if (Object.prototype.toString.call(repeater.model) !== "[object Object]") { return; } // other models are most likely derived from QAbstractItemModel, // therefore we can safely connect to the signals to get notified about refreshes repeater.model.rowsMoved.connect(updateTimer.restart); repeater.model.columnsMoved.connect(updateTimer.restart); repeater.model.layoutChanged.connect(updateTimer.restart); } // clean items removed trough a repeater function removeTabFromModel(index, item) { // cannot use index as that one is relative to the Repeater's model, therefore // we need to look after the Tabs models' role to find out which item to remove for (var i = 0; i < tabsModel.count; i++) { if (tabsModel.get(i).tab === item) { tabsModel.remove(i); break; } } tabsModel.reindex(); } } Binding { target: internal.header property: "tabsModel" value: tabsModel when: internal.header && tabs.active } } ./src/Ubuntu/Components/1.2/PageHeadState.qml0000644000015600001650000000657612700370701020760 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 // for Action /*! \qmltype PageHeadState \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \since Ubuntu.Components 1.1 \brief PageHeadState is a helper component to make it easier to configure the page header when changing states. This example shows how to add an action to the header that enables the user to enter search/input mode: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 MainView { id: mainView width: units.gu(40) height: units.gu(50) Page { id: searchPage title: "Click the icon" Label { anchors.centerIn: parent text: searchPage.state == "search" ? "search mode" : "normal mode" } state: "default" states: [ PageHeadState { name: "default" head: searchPage.head actions: Action { iconName: "search" onTriggered: searchPage.state = "search" } }, PageHeadState { id: headerState name: "search" head: searchPage.head actions: [ Action { iconName: "contact" } ] backAction: Action { id: leaveSearchAction text: "back" iconName: "back" onTriggered: searchPage.state = "default" } contents: TextField { placeholderText: "search..." } } ] } } \endqml */ State { id: state /*! The head property of the \l Page which will be the target of the property changes of this State. This property must always be set before the State can be used. */ property PageHeadConfiguration head /*! The actions to be shown in the header with this state. */ property list actions /*! The back action for this state. */ property Action backAction /*! The contents of the header when this state is active. */ property Item contents PropertyChanges { target: state.head backAction: state.backAction actions: state.actions contents: state.contents } } ./src/Ubuntu/Components/1.2/AbstractButton.qml0000644000015600001650000000635412700370701021252 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmlabstract AbstractButton \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The AbstractButton class defines the behavior of the button. This class defines the behavior of the button: it defines the MouseArea and the states. All components deriving from this class support haptic feedback out of the box. */ ActionItem { id: button /*! If an action is specified, the button's clicked signal will trigger the action. Subclasses of AbstractButton can use other properties of action (for example the text and iconName). \qmlproperty Action action */ /*! This handler is called when there is a mouse click on the button and the button is not disabled. If \b action is defined, the action will be triggered. */ signal clicked() /*! If a button is clicked, its triggered() signal will automatically be called. */ onClicked: button.trigger() Keys.onEnterPressed: clicked() Keys.onReturnPressed: clicked() /*! This handler is called when there is a long press. */ signal pressAndHold() /*! True if the user presses a mouse button in the button's mouse area. */ property bool pressed: mouseArea.pressed /*! True if the mouse cursor hovers over the button's mouse area. */ property bool hovered: __acceptEvents && mouseArea.containsMouse /*! \internal Disable or enable signal emition by default. Some classes want to emit the signal by themselves (ListItem.Standard) */ property bool __acceptEvents: true /*! \internal To get the properties of the mouse area in subclasses. */ property alias __mouseArea: mouseArea activeFocusOnPress: true MouseArea { id: mouseArea anchors.fill: parent // if mouseArea is given a new value, disable defaultMouseArea // as it might occlude the newly assigned mouse area. hoverEnabled: true // invoke Haptics singleton earlier than we press the button, // so we give some time for the singleton to sync settings with the service property bool hapticsEnabled: Haptics.enabled onClicked: { if (button.__acceptEvents) { // FIXME (Vivid) call this in the style rather than from AbstractButton Haptics.play(); button.clicked() } } onPressAndHold: { if (button.__acceptEvents) { button.pressAndHold() } } } } ./src/Ubuntu/Components/1.2/ActionList.qml0000644000015600001650000000304012700370701020351 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype ActionList \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief List of \l Action items */ QtObject { id: list // internal objects using nested elements, // which isn't allowed by QtObject; this fix makes this possible /*! Default property to allow adding of children. \qmlproperty list children \default */ default property alias children: list.actions /*! List of already defined actions when not defining them as children of the ActionList. Note that when you set this property, the children of the ActionList will be ignored, so do not set the list and define children. The advantage of setting actions over using the children is that the same \l Action items can be used in several sets of actions. */ property list actions } ./src/Ubuntu/Components/1.2/Switch.qml0000644000015600001650000000260712700370701017551 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ // FIXME(loicm) It would be nice to have a draggable thumb to toggle the switch, // that needs to be validated with designers though. import QtQuick 2.4 /*! \qmltype Switch \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Switch is a component with two states, checked or unchecked. It can be used to set boolean options. The behavior is the same as \l CheckBox, the only difference is the graphical style. \l {https://design.ubuntu.com/apps/building-blocks/selection}{See also the Design Guidelines on selection}. Example: \qml Item { Switch { checked: true } } \endqml */ CheckBox { id: switchItem style: Theme.createStyleComponent("SwitchStyle.qml", switchItem) } ./src/Ubuntu/Components/1.2/Panel.qml0000644000015600001650000005567612700370701017365 0ustar jenkinsjenkins/* * Copyright (C) 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 as Toolkit /*! \qmltype Panel \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief A panel that can be swiped in and out from an edge of the window by the user. For most applications, it is highly recommended to use the \l MainView instead which includes a toolbar at its bottom that can be swiped in or out. Unless your application has very specific needs for a Panel, use a \l MainView with the default toolbar. When using a Panel, do not theme it directly, but theme its contents, because the Panel itself should not have visible elements, since it is in the view (to detect mouse events) even when its contents should be invisible. Set the anchors and/or width/height of the Panel to specify the area that the Panel covers when opened. A black panel that can be swiped in from the lower-right of the window can be created like this: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 Item { width: units.gu(80) height: units.gu(80) Panel { id: panel anchors { right: parent.right bottom: parent.bottom } width: parent.width / 2 height: units.gu(8) Rectangle { anchors.fill: parent color: Theme.palette.normal.overlay Button { anchors.centerIn: parent text: "Click" } } } } \endqml A panel that looks like the standard (bottom-aligned) toolbar, but with custom contents, can be created like this: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 Item { width: units.gu(80) height: units.gu(80) Panel { id: panel anchors { left: parent.left right: parent.right bottom: parent.bottom } height: units.gu(8) Item { anchors.fill: parent // two properties used by the toolbar delegate: property bool opened: panel.opened property bool animating: panel.animating Button { anchors.centerIn: parent text: "Click" } } } } \endqml Any Items can be placed inside the Panel, but MouseAreas can block mouse events from reaching the panel and thus obstruct the swiping behavior for hiding the panel. As a result, the user cannot start swiping on the buttons in the examples above in order to hide the panel. To remedy this, clicked() signals are forwarded from the panel by calling the child's trigger() function. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 Rectangle { color: Theme.palette.normal.background width: units.gu(40) height: units.gu(40) Panel { id: panel anchors { left: parent.left right: parent.right bottom: parent.bottom } height: units.gu(8) Rectangle { color: Theme.palette.normal.overlay anchors.fill: parent Rectangle { width: units.gu(8) height: units.gu(4) anchors.centerIn: parent color: "red" function trigger() { print("The red rectangle was clicked"); } } } } Component.onCompleted: panel.open(); } \endqml Like this, the red rectangle accepts click events, but the user can still swipe down on top of the rectangle in order to hide the panel. */ Item { id: panel /*! Default property, holds the content which will be swiped in and out. \qmlproperty list contents */ default property alias contents: bar.data /*! The property defines the alignment of the panel. The implementation supports the following values: \list \li Qt.AlignBottom to swipe in the panel from the bottom (default) \li Qt.AlignTop to swipe in the panel from the top \li Qt.AlignLeft to swipe in the panel from the left \li Qt.AlignRight to swipe in the panel from the right \li Qt.AlignLeading left when layout mirrorring is disabled, right otherwise \li Qt.AlignTrailing right when layout mirroring is disabled, left otherwise \endlist The default value is \b Qt.AlignBottom, and it is not recommended to change the default value because the left, right and top edge are already used for system functions, while the bottom edge is reserved for app-specific functionality such as a default toolbar. The use of Qt.AlignLeading and Qt.AlignTrailing is preferred over Qt.AlignLeft and Qt.AlignRight in order to more easily support right-to-left user interfaces that use LayoutMirroring. */ property int align: Qt.AlignBottom /*! When opened, the panel is visible, otherwise it is hidden. Use edge swipes to open/close the panel. The opened property is not updated until the swipe gesture is completed. */ // opened is true if state is spread, or if state is moving/hint and the previous state was spread. property bool opened: (panel.state === "spread") || (panel.state === "moving" && internal.previousState === "spread") /*! \internal */ // FIXME: When opened is made read-only, onOpenedChanged can be removed entirely. onOpenedChanged: { if (internal.openedChangedWarning) { console.log("DEPRECATED use of Panel.opened property. This property will be made read-only, please use the opened property of the Page tools or use Panel.open() and Panel.close()."); if (opened) { panel.open(); } else { panel.close(); } // re-establish the previous binding for opened. panel.opened = Qt.binding(function() { return (panel.state === "spread") || (panel.state === "moving" && internal.previousState === "spread"); }) } internal.openedChangedWarning = true; } /*! Open the panel */ function open() { // FIXME: When opened is made readonly, openedChangedWarning must be removed internal.openedChangedWarning = false; panel.state = "spread"; hideTimer.conditionalRestart(); } /*! Close the panel */ function close() { // FIXME: When opened is made readonly, openedChangedWarning must be removed. internal.openedChangedWarning = false; panel.state = ""; hideTimer.stop(); } /*! The time in milliseconds before the panel automatically hides after inactivity when it is not locked. Interacting with the panel resets the timer. Note that adding contents to the panel that accepts mouse events will prevent the panel from detecting interaction and the timer will not be reset. Setting a negative value will disable automatic hiding. Default value: -1 (automatic hiding is disabled). \qmlproperty int hideTimeout */ property alias hideTimeout: hideTimer.interval /*! Disable edge swipe to open/close the panel. False by default. */ property bool locked: false /*! \internal */ onLockedChanged: { if (state == "hint" || state == "moving") { draggingArea.finishMoving(); } if (!hideTimer.conditionalRestart()) { hideTimer.stop(); } } Timer { id: hideTimer interval: -1 running: panel.opened && !panel.locked && interval >= 0 function conditionalRestart() { if (hideTimer.interval >= 0) { if (!panel.locked && panel.opened) { hideTimer.restart(); return true; } } return false; } onIntervalChanged: { if (!conditionalRestart()) { hideTimer.stop(); } } onTriggered: { if (!panel.locked) { panel.close(); } } } // disable the timer when the application is not active to avoid closing // the panel immediately after the application becomes active again Connections { target: Qt.application onActiveChanged: { if (Qt.application.active) { hideTimer.conditionalRestart(); } else { hideTimer.stop(); } } } /*! How much of the panel to show when the user touches the panel's edge. This gives the user a hint that there is a panel hiding at that edge and invites him/her to swipe to show the panel completely. Default value: units.gu(2). */ property real hintSize: units.gu(2) /*! The size (height for top or bottom-aligned panels, width for left or right-aligned panels) of the mouse area used to detect edge swipes to open the panel, when the panel is not opened. Default value: units.gu(2). */ property real triggerSize: units.gu(2) /*! \qmlproperty real position The current position of the edge of the panel. The value is 0 when the panel is opened, and has its maximum value when the panel is closed. The maximum value is the width of the Panel for a left or right-aligned panel, and the height of the panel for top or bottom-aligned panels. When the user drags the Panel from the edge to open it, the position will change from the maximum size (closed) to 0 (fully expanded). */ readonly property alias position: bar.position states: [ State { name: "hint" PropertyChanges { target: bar position: bar.size - panel.hintSize } }, State { name: "moving" PropertyChanges { target: bar position: Toolkit.MathUtils.clamp(draggingArea.mousePosition - internal.movingDelta, 0, bar.size) } }, State { name: "spread" PropertyChanges { target: bar position: 0 } }, State { name: "" PropertyChanges { target: bar position: bar.size explicit: true } } ] /*! Animate transitions between the different panel states. */ property bool animate: true /*! The toolbar is currently not in a stable hidden or visible state. */ readonly property bool animating: draggingArea.pressed || transitionToAll.running || transitionToHint.running || transitionToSpread.running transitions: [ Transition { id: transitionToAll to: "" UbuntuNumberAnimation { target: bar properties: "position" duration: internal.transitionDuration } }, Transition { id: transitionToHint to: "hint" UbuntuNumberAnimation { target: bar properties: "position" duration: internal.transitionDuration } }, Transition { id: transitionToSpread to: "spread" UbuntuNumberAnimation { target: bar properties: "position" duration: internal.transitionDuration } }, Transition { id: transitionToMoving to: "moving" UbuntuNumberAnimation { target: bar properties: "position" duration: panel.animate ? Toolkit.UbuntuAnimation.SnapDuration : 0 } } ] QtObject { id: internal // FIXME: Remove when opened property is made readonly property bool openedChangedWarning: true /*! The duration in milliseconds of sliding in or out transitions when opening, closing, and showing the hint. Default value: 250 */ property real transitionDuration: panel.animate ? Toolkit.UbuntuAnimation.FastDuration : 0 property string previousState: "" property int movingDelta // Convert from Qt.AlignLeading to Qt.AlignTrailing to Qt.AlignLeft and Qt.AlignRight property int align: { if (panel.align === Qt.AlignLeading) { if (panel.LayoutMirroring.enabled) { return Qt.AlignRight; } else { return Qt.AlignLeft; } } else if (panel.align === Qt.AlignTrailing) { if (panel.LayoutMirroring.enabled) { return Qt.AlignLeft; } else { return Qt.AlignRight; } } else { return panel.align; } } readonly property int orientation: (panel.align === Qt.AlignTop || panel.align === Qt.AlignBottom) ? Qt.Horizontal : Qt.Vertical } /*! \internal */ onStateChanged: { if (state == "hint") { internal.movingDelta = panel.hintSize + draggingArea.initialPosition - bar.size; } else if (state == "moving" && internal.previousState == "spread") { internal.movingDelta = draggingArea.initialPosition; } } /*! \internal \deprecated Enable the InverseMouseArea that closes the panel when the user clicks outside of the panel. This functionality moved to the MainView to deal with Toolbar hiding, but this InverseMouseArea is still in the Panel for backwards compatibility in apps that use it directly. Default value is false. FIXME: Remove __closeOnContentsClicks and the IMA below when all apps use Toolbar instead of Panel. */ property bool __closeOnContentsClicks: false Toolkit.InverseMouseArea { anchors.fill: draggingArea onPressed: { mouse.accepted = false; // the mouse click may cause an update // of locked by the clicked Item behind if (!panel.locked) panel.close(); } propagateComposedEvents: true visible: panel.__closeOnContentsClicks && panel.locked == false && panel.state == "spread" } /*! \internal \deprecated Enable automatic reveal of panel on mouse hover over hint area, and hide when leaving the panel area. This is disabled by default, because Panel may be used to implement bottom edge behaviors that are completely different from the toolbar, but the property is enabled in Toolbar to make more usable on desktop. */ property bool __openOnHover: false /*! The user presses on the opened toolbar, or when the toolbar is closed but not locked, the user presses in the toolbar trigger area. \qmlproperty bool pressed */ // This is a simple alias to draggingArea.pressed, but the documentation is accurate // because of the visible definition of draggingArea. Pressed is false when draggingArea // is not visible. property alias pressed: draggingArea.pressed DraggingArea { id: draggingArea orientation: internal.orientation === Qt.Horizontal ? Qt.Vertical : Qt.Horizontal zeroVelocityCounts: true anchors { top: panel.align === Qt.AlignBottom ? undefined : parent.top bottom: panel.align === Qt.AlignTop ? undefined : parent.bottom left: panel.align === Qt.AlignRight || panel.align === Qt.AlignTrailing ? undefined : parent.left right: panel.align === Qt.AlignLeft || panel.align === Qt.AlignLeading ? undefined : parent.right } height: internal.orientation === Qt.Horizontal ? panel.opened ? bar.size + units.gu(1) : panel.triggerSize : undefined width: internal.orientation === Qt.Vertical ? panel.opened ? bar.size + units.gu(1) : panel.triggerSize : undefined visible: !panel.locked || panel.opened hoverEnabled: panel.__openOnHover property int mousePosition: getMousePosition() function getMousePosition() { switch (internal.align) { case Qt.AlignLeft: return -mouseX; case Qt.AlignRight: return mouseX; case Qt.AlignBottom: return mouseY; case Qt.AlignTop: return -mouseY; } } // set in onPressed, reset when entering "moving" state property Item pressedItem: null // find the first child with a triggered property: function getTriggerableItem(mouse) { var item = bar; // contains the children while (item && !item.hasOwnProperty("trigger")) { var coords = mapToItem(item, mouse.x, mouse.y); // FIXME: When using a ListView the highlight may be // returned instead of the Item that you are looking for item = item.childAt(coords.x, coords.y); } return item; // will be null if no item has trigger() function. } // forward trigger() events to any child Item with trigger() function. // This must also happen when the panel is locked, so the DraggingArea is // never disabled, and other signal handlers will return when panel.locked is true. onClicked: { if (pressedItem && pressedItem === getTriggerableItem(mouse)) { // Click event positioned at the Item where the user first pressed pressedItem.trigger(); } } property int initialPosition onPressed: { hideTimer.stop(); pressedItem = getTriggerableItem(mouse); if (panel.locked) return; initialPosition = getMousePosition(); if (panel.state == "") panel.state = "hint"; } /*! The minimum amount of movement while pressed before switching to "moving" state. This threshold is needed to avoid detecting unintentional small movements while "clicking" as a drag. */ property real dragThreshold: units.gu(1) onPositionChanged: { if (!pressed) return; if (panel.locked) return; if (panel.state == "hint" && mousePosition < initialPosition - dragThreshold) { internal.previousState = "hint"; panel.state = "moving"; pressedItem = null; } else if (panel.state == "spread" && mousePosition > initialPosition + dragThreshold) { internal.previousState = "spread"; panel.state = "moving"; pressedItem = null; } } onReleased: { if (panel.state == "moving" || panel.state == "hint") { finishMoving(); } else { hideTimer.conditionalRestart(); } } // Mouse cursor moving out of the window while pressed on desktop onCanceled: { if (panel.state == "moving" || panel.state == "hint") { finishMoving(); } else { hideTimer.conditionalRestart(); } } onEntered: { if (panel.__openOnHover) { panel.open(); } hideTimer.stop(); } onExited: { // panel.__openOnHover // Ensure the panel is not still opening. The draggingArea will // change after the panel finishes the opening animation. if (!animating) { hideTimer.conditionalRestart(); } } // FIXME: Make all parameters below themable and resolution-independent. // The value of 44 was copied from the Launcher. function finishMoving() { if (draggingArea.dragVelocity < -44) { if (internal.align === Qt.AlignBottom || internal.align === Qt.AlignRight) { panel.open(); } else { panel.close(); } } else if (draggingArea.dragVelocity > 44) { if (internal.align === Qt.AlignBottom || internal.align === Qt.AlignRight) { panel.close(); } else { panel.open(); } } else { if (bar.position < bar.size / 2) { panel.open(); } else { panel.close(); } } } } Item { id: bar objectName: "bar_item" height: parent.height width: parent.width anchors { left: internal.orientation === Qt.Horizontal ? parent.left : undefined right: internal.orientation === Qt.Horizontal ? parent.right : undefined top: internal.orientation === Qt.Vertical ? parent.top : undefined bottom: internal.orientation === Qt.Vertical ? parent.bottom : undefined } property real size: internal.orientation === Qt.Horizontal ? height : width //position will always be in the range 0..size, where position==0 means spread, position==size means hidden. property real position: panel.opened ? 0 : size onSizeChanged: position = panel.opened ? 0 : size y: internal.align === Qt.AlignTop ? -position : internal.align === Qt.AlignBottom ? position : 0 x: internal.align === Qt.AlignLeft ? -position : internal.align === Qt.AlignRight ? position : 0 } } ./src/Ubuntu/Components/1.2/MainViewBase.qml0000644000015600001650000000607312700370701020623 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 as Toolkit import Ubuntu.PerformanceMetrics 1.0 import QtQuick.Window 2.0 /*! \internal */ // Documentation is in MainView.qdoc PageTreeNode { id: mainView property string applicationName: "" property bool anchorToKeyboard: false property alias headerColor: background.headerColor property alias backgroundColor: background.backgroundColor property alias footerColor: background.footerColor // FIXME: Make sure that the theming is only in the background, and the style // should not occlude contents of the MainView. When making changes here, make // sure that bug https://bugs.launchpad.net/manhattan/+bug/1124076 does not come back. Toolkit.StyledItem { id: background anchors.fill: parent style: Theme.createStyleComponent("MainViewStyle.qml", background) property color headerColor: backgroundColor property color backgroundColor: Theme.palette.normal.background property color footerColor: backgroundColor /* As we don't know the order the property bindings and onXXXChanged signals are evaluated we should rely only on one property when changing the theme to avoid intermediate theme changes due to properties being evaluated separately. Qt bug: https://bugreports.qt-project.org/browse/QTBUG-11712 */ property string themeName: (Toolkit.ColorUtils.luminance(backgroundColor) >= 0.85) ? "Ambiance" : "SuruDark" onThemeNameChanged: { // only change the theme if the current one is a system one. if (themeName !== "" && (Theme.name.search("Ubuntu.Components.Themes") >= 0)) { Theme.name = "Ubuntu.Components.Themes.%1".arg(themeName); } } } active: true property alias actions: unityActionManager.actions property alias actionManager: unityActionManager Toolkit.ActionManager { id: unityActionManager onQuit: { // FIXME Wire this up to the application lifecycle management API instead of quit(). Qt.quit() } } onApplicationNameChanged: { if (applicationName !== "") { i18n.domain = applicationName; UbuntuApplication.applicationName = applicationName } } PerformanceOverlay { id: performanceOverlay active: false } } ./src/Ubuntu/Components/1.2/ToolbarButton.qml0000644000015600001650000000551412700370701021106 0ustar jenkinsjenkins/* * Copyright (C) 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype ToolbarButton \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief An \l ActionItem that represents a button in the toolbar. ToolbarButtons should be included in \l ToolbarItems to define the tools of a \l Page. The behavior and look of the toolbar button can be specified by setting an \l Action for the button, or by setting the other properties inherited by the \l ActionItem. Example of different ways to define the toolbar button: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 MainView { width: units.gu(50) height: units.gu(80) Action { id: action1 text: "action 1" iconName: "compose" onTriggered: print("one!") } Page { title: "test page" Label { anchors.centerIn: parent text: "Hello, world" } tools: ToolbarItems { // reference to an action: ToolbarButton { action: action1 } // define the action: ToolbarButton { action: Action { text: "Second action" iconName: "add" onTriggered: print("two!") } // override the text of the action: text: "action 2" } // no associated action: ToolbarButton { iconName: "cancel" text: "button" onTriggered: print("three!") } } } } \endqml See \l ToolbarItems for more information on how to use ToolbarButton. */ ActionItem { id: toolbarButton height: parent ? parent.height : undefined width: units.gu(5) style: Theme.createStyleComponent("ToolbarButtonStyle.qml", toolbarButton) } ./src/Ubuntu/Components/1.2/CrossFadeImage11.qml0000644000015600001650000001320712700370701021264 0ustar jenkinsjenkins/* * Copyright (C) 2014 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.4 // FIXME: When a module contains QML, C++ and JavaScript elements exported, // we need to use named imports otherwise namespace collision is reported // by the QML engine. As workaround, we use Ubuntu named import. // Bug to watch: https://bugreports.qt-project.org/browse/QTBUG-27645 import Ubuntu.Components 1.2 as Ubuntu /*! \internal Documentation is in CrossFadeImage.qdoc */ Item { id: crossFadeImage property url source property int fillMode : Image.PreserveAspectFit property int fadeDuration: Ubuntu.UbuntuAnimation.FastDuration // FIXME: Support resetting sourceSize property size sourceSize: internals.loadingImage ? Qt.size(internals.loadingImage.sourceSize.width, internals.loadingImage.sourceSize.height) : Qt.size(0, 0) property string fadeStyle: "overlay" readonly property bool running: nextImageFadeIn.running readonly property int status: internals.loadingImage ? internals.loadingImage.status : Image.Null Binding { target: crossFadeImage property: "sourceSize" value: internals.loadingImage ? Qt.size(internals.loadingImage.sourceSize.width, internals.loadingImage.sourceSize.height) : Qt.size(0, 0) when: internals.forcedSourceSize === undefined } /*! \internal */ onSourceSizeChanged: { if (internals.loadingImage && (sourceSize != Qt.size(internals.loadingImage.sourceSize.width, internals.loadingImage.sourceSize.height))) { internals.forcedSourceSize = sourceSize; } } QtObject { id: internals /*! \internal Source size specified by the setting crossFadeImage.sourceSize. */ property size forcedSourceSize /*! \internal Defines the image currently being shown */ property Image currentImage: image1 /*! \internal Defines the image being changed to */ property Image nextImage: image2 property Image loadingImage: currentImage function swapImages() { internals.currentImage.z = 0; internals.nextImage.z = 1; nextImageFadeIn.start(); var tmpImage = internals.currentImage; internals.currentImage = internals.nextImage; internals.nextImage = tmpImage; } } QtObject { // dummy object used to disable crossfade animation id: fadeOutDummy property real opacity } Image { id: image1 anchors.fill: parent cache: false asynchronous: true fillMode: parent.fillMode z: 1 Binding { target: image1 property: "sourceSize" value: internals.forcedSourceSize when: internals.forcedSourceSize !== undefined } } Image { id: image2 anchors.fill: parent cache: false asynchronous: true fillMode: parent.fillMode z: 0 Binding { target: image2 property: "sourceSize" value: internals.forcedSourceSize when: internals.forcedSourceSize !== undefined } } /*! \internal Do the fading when the source is updated */ onSourceChanged: { // On creation, the souce handler is called before image pointers are set. if (internals.currentImage === null) { internals.currentImage = image1; internals.nextImage = image2; } nextImageFadeIn.stop(); // Don't fade in initial picture, only fade changes if (internals.currentImage.source == "") { internals.currentImage.source = source; internals.loadingImage = internals.currentImage; } else { nextImageFadeIn.stop(); internals.nextImage.opacity = 0.0; internals.nextImage.source = source; internals.loadingImage = internals.nextImage; // If case the image is still in QML's cache, status will be "Ready" immediately if (internals.nextImage.status === Image.Ready || internals.nextImage.source === "") { internals.swapImages(); } } } Connections { target: internals.nextImage onStatusChanged: { if (internals.nextImage.status == Image.Ready) { internals.swapImages(); } } } ParallelAnimation { id: nextImageFadeIn Ubuntu.UbuntuNumberAnimation { id: currentImageFadeOut target: fadeStyle == "cross" ? internals.currentImage : fadeOutDummy property: "opacity" to: 0.0 duration: crossFadeImage.fadeDuration } Ubuntu.UbuntuNumberAnimation { target: internals.nextImage property: "opacity" to: 1.0 duration: crossFadeImage.fadeDuration } onRunningChanged: { if (!running) { internals.nextImage.source = ""; } } } } ./src/Ubuntu/Components/1.2/OrientationHelper.qml0000644000015600001650000001562512700370701021747 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Window 2.0 import Ubuntu.Components 1.2 /*! \qmltype OrientationHelper \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The OrientationHelper automatically rotates its children following the orientation of the device. Any Item placed inside an Orientation Helper will be automatically rotated following the orientation of the device. Note that OrientationHelper is always filling its parent (anchors.parent: fill). Example: \qml Item { OrientationHelper { Label { text: "Automatically rotated" } Button { text: "Automatically rotated" } } } \endqml */ Item { id: orientationHelper /*! Sets whether it will be automatically rotating when the device is. The default value is true. \qmlproperty bool automaticOrientation */ property bool automaticOrientation: true /*! Sets whether the rotation transition is performed. The default value is true. \qmlproperty bool transitionEnabled */ property bool transitionEnabled: true /*! Exposes whether the orientationTransition is running. \qmlproperty alias rotating */ readonly property bool rotating: d.transitioning /*! \qmlproperty int __orientationAngle \deprecated Use orientationAngle instead. */ property alias __orientationAngle: orientationHelper.orientationAngle /*! \qmlproperty int orientationAngle Calculates the current orientation angle. */ property int orientationAngle: automaticOrientation ? Screen.angleBetween(Screen.primaryOrientation, Screen.orientation) : 0 // Screen.primaryOrientation and Screen.orientation can change one right after the other, // causing orientationAngle to momentarily change. To avoid responding to such // intermediate states, wait for its value to stabilize before rotating to it. onOrientationAngleChanged: { automaticOrientation ? stableOrientationAngleTimer.restart() : d.tryUpdateState(); } /*! The property holds if the OrientationHelper should automatically resize the contents when the input method appears The default value is false. */ property bool anchorToKeyboard: false x: parent ? (parent.width - width) / 2 : 0 y: parent ? (d.availableParentHeight - height) / 2 : 0 width: parent ? (d.flipDimensions ? d.availableParentHeight : parent.width) : 0 height: parent ? (d.flipDimensions ? parent.width : d.availableParentHeight) : 0 /* The attached property Screen.orientation is only valid inside Item or derived components. Inside Object it evaluates to 0 with no error. Also be aware that some apps eg. webbrowser-app set window.contentOrientation and thus can hide failure to update it from this code. See http://qt-project.org/doc/qt-5.0/qtquick/qml-qtquick-window2-screen.html */ Item { id: d property real availableParentHeight: { if (!orientationHelper.parent) return 0; var availableHeight = orientationHelper.parent.height; if (d.stateAngle === 0 && UbuntuApplication.inputMethod.visible && anchorToKeyboard) availableHeight -= UbuntuApplication.inputMethod.keyboardRectangle.height; return availableHeight; } /*! 'window' is defined by QML between startup and showing on the screen. There is no signal for when it becomes available and re-declaring it is not safe. http://qt-project.org/doc/qt-5.1/qtqml/qml-qtqml2-qt.html http://qt-project.org/doc/qt-5.1/qtquick/qmlmodule-qtquick-window2-qtquick-window-2.html */ property bool windowActive: typeof window != 'undefined' /*! Report the current orientation of the application via QWindow::contentOrientation. http://qt-project.org/doc/qt-5.0/qtgui/qwindow.html#contentOrientation-prop */ function applyOrientation() { if (windowActive && window) window.contentOrientation = Screen.orientation } onWindowActiveChanged: { if (automaticOrientation) applyOrientation(); } Timer { id: stableOrientationAngleTimer interval: 250 onTriggered: { d.tryUpdateState(); } } readonly property bool flipDimensions: d.stateAngle == 90 || d.stateAngle == 270 property bool transitioning: false onTransitioningChanged: { d.tryUpdateState(); } // NB: Using a binding would cause QML to detect a // binding loop and break the binding, thus the imperative code to update the state. function tryUpdateState() { if (!d.transitioning) { d.oldAngle = d.stateAngle; d.stateAngle = orientationHelper.orientationAngle; d.state = orientationHelper.orientationAngle.toString(); d.applyOrientation(); } } state: "0" states: [ State { name: "0" }, State { name: "90" }, State { name: "180" }, State { name: "270" } ] property int stateAngle: 0 property int oldAngle: 0 transitions: [ Transition { id: animatedTransition enabled: orientationHelper.transitionEnabled SequentialAnimation { ScriptAction { script: { d.transitioning = true; } } RotationAnimator { target: orientationHelper duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing direction: RotationAnimation.Shortest from: d.oldAngle to: d.stateAngle } ScriptAction { script: { d.transitioning = false; } } } }, Transition { enabled: !orientationHelper.transitionEnabled ScriptAction { script: { orientationHelper.rotation = d.stateAngle; } } } ] } } ./src/Ubuntu/Components/1.2/DraggingArea.qml0000644000015600001650000000673512700370701020631 0ustar jenkinsjenkins/* * Copyright (C) 2013 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 MouseArea { id: draggingArea property int orientation: Qt.Vertical property bool dragging property real dragVelocity: 0 property real dragValue: (orientation == Qt.Vertical ? (mouseY - __pressedPosition.y) : (mouseX - __pressedPosition.x)) property real lateralPosition: orientation == Qt.Horizontal ? MathUtils.clamp(mouseY, 0, height) : MathUtils.clamp(mouseX, 0, width) property point __pressedPosition: Qt.point(0, 0) property var __dragEvents: [] property bool clickValidated: true property bool zeroVelocityCounts: false signal dragStart signal dragEnd onDragValueChanged: { if (dragValue != 0 && pressed) { dragging = true } } onDraggingChanged: { if (dragging) { dragStart() } else { dragEnd() } } function updateSpeed() { var totalSpeed = 0 for (var i=0; i<__dragEvents.length; i++) { totalSpeed += __dragEvents[i][3] } if (zeroVelocityCounts || Math.abs(totalSpeed) > 0.001) { dragVelocity = totalSpeed / __dragEvents.length * 1000 } } function cullOldDragEvents(currentTime) { // cull events older than 50 ms but always keep the latest 2 events for (var numberOfCulledEvents=0; numberOfCulledEvents<__dragEvents.length-2; numberOfCulledEvents++) { // __dragEvents[numberOfCulledEvents][0] is the dragTime if (currentTime - __dragEvents[numberOfCulledEvents][0] <= 50) break } __dragEvents.splice(0, numberOfCulledEvents) } function getEventSpeed(currentTime, event) { if (__dragEvents.length != 0) { var lastDrag = __dragEvents[__dragEvents.length-1] var duration = Math.max(1, currentTime - lastDrag[0]) if (orientation == Qt.Vertical) { return (event.y - lastDrag[2]) / duration } else { return (event.x - lastDrag[1]) / duration } } else { return 0 } } function pushDragEvent(event) { var currentTime = new Date().getTime() __dragEvents.push([currentTime, event.x, event.y, getEventSpeed(currentTime, event)]) cullOldDragEvents(currentTime) updateSpeed() } onPositionChanged: { if (dragging) { pushDragEvent(mouse) } if (!draggingArea.containsMouse) clickValidated = false } onPressed: { __pressedPosition = Qt.point(mouse.x, mouse.y) __dragEvents = [] pushDragEvent(mouse) clickValidated = true } onReleased: { dragging = false __pressedPosition = Qt.point(mouse.x, mouse.y) } } ./src/Ubuntu/Components/1.2/sliderUtils.js0000644000015600001650000000210512700370701020427 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ .pragma library /*! The function returns the live value of the slider. */ function liveValue(item) { return item.__internals.liveValue; } /*! The function returns the normalized live value of the slider. */ function normalizedValue(item) { return item.__internals.normalizedValue; } /*! The function returns whether the slider is being pressed or not. */ function isPressed(item) { return item.__internals.isPressed; } ./src/Ubuntu/Components/1.2/Label.qml0000644000015600001650000000300612700370701017321 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype Label \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Text with Ubuntu styling. Example: \qml Rectangle { color: UbuntuColors.coolGrey width: units.gu(30) height: units.gu(30) Label { anchors.centerIn: parent text: "Hello, world!" fontSize: "large" } } \endqml */ Text { id: label /*! The size of the text. One of the following strings (from smallest to largest): \list \li "xx-small" \li "x-small" \li "small" \li "medium" \li "large" \li "x-large" \endlist Default value is "medium". */ property string fontSize: "medium" font.pixelSize: FontUtils.sizeToPixels(fontSize) color: Theme.palette.selected.backgroundText } ./src/Ubuntu/Components/1.2/TextField.qml0000644000015600001650000010376312700370701020205 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 as Ubuntu import Ubuntu.Components.Popups 1.0 /*! \qmltype TextField \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The TextField element displays a single line of editable plain text. Input constraints can be set through validator or inputMask. Setting echoMode to an appropriate value enables TextField to be used as password input field. \l {https://design.ubuntu.com/apps/building-blocks/text-input#text-field}{See also the Design Guidelines on the Text Field}. Example: \qml Item { TextField { placeholderText: "hint text" } TextField { placeholderText: "without clear sign" hasClearButton: false } TextField { placeholderText: "password" echoMode: TextInput.Password } TextField { placeholderText: "overlaid in front" primaryItem: Image { height: parent.height width: height source: "magnifier.png" } secondaryItem: Row { Button { height: parent.height width: height iconName: "compose" onClicked: doSomething() } Button { height: parent.height width: height iconName: "undo" onClicked: doSomething() } } } } \endqml \section2 Scrolling and text selection The input is activated when the tap or mouse is released after being pressed over the component. The text can be scrolled horizontally by swiping over the content both when the component is active or inactive. The content can be selected in the following ways: \list \li - double tapping/left mouse clicking over the content, when the word that had been tapped over will be selected \li - by pressing and dragging the selection cursor over the text input. Note that there has to be a delay of approx. 200 ms between the press and drag gesture, time when the input switches from scroll mode to selection mode \endlist The input is focused (activated) upon tap/left mouse button release. The cursor will be placed at the position the mouse/tap point at release time. If the click is happening on a selected area, the selection will be cleared. Long press above a selected area brings up the clipboard context menu. When the long press happens over a non-selected area, the cursor will be moved to the position and the component enters in selection mode. The selection mode can also be activated by tapping and keeping the tap/mouse over for approx 300 ms. If there is a move during this time, the component enters into scrolling mode. The mode is exited once the scrolling finishes. During the scrolling mode the selected text is preserved. \note During text selection all interactive parent Flickables are turned off. */ Ubuntu.ActionItem { id: control implicitWidth: units.gu(25) implicitHeight: units.gu(4) /*! The property presents whether the TextField is highlighted or not. By default the TextField gets highlighted when gets the focus, so can accept text input. This property allows to control the highlight separately from the focused behavior. */ property bool highlighted: focus /*! Text that appears when there is no content in the component. \qmlproperty string placeholderText */ property alias placeholderText: hint.text /*! Specifies whether the control has a clear button or not. */ property bool hasClearButton: true /*! \deprecated Component to be shown and used instead of the default On Screen Keyboard. */ property Component customSoftwareInputPanel onCustomSoftwareInputPanelChanged: console.error("customSoftwareInputPanel property deprecated.") /*! The property overrides the default popover of the TextField. When set, the TextField will open the given popover instead of the default one defined. The popover can either be a component or a URL to be loaded. */ property var popover /*! Overlaid component that can be set for the fore side of the TextField, e.g.showing a magnifier to implement search functionality. \qmlproperty list primaryItem */ property alias primaryItem: leftPane.data /*! Overlaid component that can be set for the rear side of the TextField, e.g.showing a CAPS LOCK or NUM LOCK indication. The overlaid components will be placed right after the clear button. \qmlproperty list secondaryItem */ property alias secondaryItem: rightPane.data /*! Allows highlighting errors in the TextField. */ property bool errorHighlight: !acceptableInput // aliased properties from TextInput /*! This property is always true unless a validator or input mask has been set. If a validator or input mask has been set, this property will only be true if the current text is acceptable to the validator or input mask as a final string (not as an intermediate string). \qmlproperty bool acceptableInput */ property alias acceptableInput: editor.acceptableInput /*! Whether the TextField should gain active focus on a mouse press. By default this is set to true. \qmlproperty bool activeFocusOnPress */ property alias activeFocusOnPress: editor.activeFocusOnPress /*! Whether the TextField should scroll when the text is longer than the width. By default this is set to true. \qmlproperty bool autoScroll */ property alias autoScroll: editor.autoScroll /*! Returns true if the TextField is writable and the content of the clipboard is suitable for pasting into the TextField. \qmlproperty bool canPaste */ property alias canPaste: editor.canPaste /*! Returns true if the TextField is writable and there are undone operations that can be redone. \qmlproperty bool canRedo */ property alias canRedo: editor.canRedo /*! Returns true if the TextField is writable and there are previous operations that can be undone. \qmlproperty bool canUndo */ property alias canUndo: editor.canUndo /*! The text color. \qmlproperty color color */ property alias color: editor.color /*! Returns the height of the text, including the height past the height that is covered if the text does not fit within the set height. \qmlproperty real contentHeight */ property alias contentHeight: editor.contentHeight /*! Returns the width of the text, including the width past the width which is covered due to insufficient wrapping if wrapMode is set. \qmlproperty real contentWidth */ property alias contentWidth: editor.contentWidth /*! The delegate for the cursor in the TextField. If you set a cursorDelegate for a TextField, this delegate will be used for drawing the cursor instead of the standard cursor. An instance of the delegate will be created and managed by the TextField when a cursor is needed, and the x property of delegate instance will be set so as to be one pixel before the top left of the current character. Note that the root item of the delegate component must be a QQuickItem or QQuickItem derived item. */ property Component cursorDelegate: null /*! The position of the cursor in the TextField. \qmlproperty int cursorPosition */ property alias cursorPosition: editor.cursorPosition /*! The rectangle where the standard text cursor is rendered within the text input. Read only. The position and height of a custom cursorDelegate are updated to follow the cursorRectangle automatically when it changes. The width of the delegate is unaffected by changes in the cursor rectangle. \qmlproperty rectangle cursorRectangle */ property alias cursorRectangle: editor.cursorRectangle /*! Set to true when the TextField shows a cursor. This property is set and unset when the TextField gets active focus, so that other properties can be bound to whether the cursor is currently showing. As it gets set and unset automatically, when you set the value yourself you must keep in mind that your value may be overwritten. It can be set directly in script, for example if a KeyProxy might forward keys to it and you desire it to look active when this happens (but without actually giving it active focus). It should not be set directly on the item, like in the below QML, as the specified value will be overridden an lost on focus changes. \qml TextField { text: "Text" cursorVisible: false } \endqml In the above snippet the cursor will still become visible when the TextField gains active focus. \qmlproperty bool cursorVisible */ property alias cursorVisible: editor.cursorVisible /*! This is the text displayed in the TextField. If echoMode is set to TextInput::Normal, this holds the same value as the \l text property. Otherwise, this property holds the text visible to the user, while the text property holds the actual entered text. \qmlproperty string displayText */ property alias displayText: editor.displayText /*! Specifies how the text should be displayed in the TextField. \list \li - TextInput.Normal - Displays the text as it is. (Default) \li - TextInput.Password - Displays asterixes instead of characters. \li - TextInput.NoEcho - Displays nothing. \li - TextInput.PasswordEchoOnEdit - Displays characters as they are entered while editing, otherwise displays asterisks. \endlist \qmlproperty enumeration echoMode */ property alias echoMode: editor.echoMode /*! Font used in the TextField. \qmlproperty font font */ property alias font: editor.font /*! Allows you to set an input mask on the TextField, restricting the text inputs. See QLineEdit::inputMask for further details, as the exact same mask strings are used by TextField. \qmlproperty string inputMask */ property alias inputMask: editor.inputMask /*! This property holds whether the TextInput has partial text input from an input method. While it is composing an input method may rely on mouse or key events from the TextField to edit or commit the partial text. This property can be used to determine when to disable events handlers that may interfere with the correct operation of an input method. \qmlproperty bool inputMethodComposing */ property alias inputMethodComposing: editor.inputMethodComposing /*! Provides hints to the input method about the expected content of the text input and how it should operate. The value is a bit-wise combination of flags, or Qt.ImhNone if no hints are set. Flags that alter behaviour are: \list \li - Qt.ImhHiddenText - Characters should be hidden, as is typically used when entering passwords. This is automatically set when setting echoMode to \c TextInput.Password. \li - Qt.ImhSensitiveData - Typed text should not be stored by the active input method in any persistent storage like predictive user dictionary. \li - Qt.ImhNoAutoUppercase - The input method should not try to automatically switch to upper case when a sentence ends. \li - Qt.ImhPreferNumbers - Numbers are preferred (but not required). \li - Qt.ImhPreferUppercase - Upper case letters are preferred (but not required). \li - Qt.ImhPreferLowercase - Lower case letters are preferred (but not required). \li - Qt.ImhNoPredictiveText - Do not use predictive text (i.e. dictionary lookup) while typing. \li - Qt.ImhDate - The text editor functions as a date field. \li - Qt.ImhTime - The text editor functions as a time field. \endlist Flags that restrict input (exclusive flags) are: \list \li - Qt.ImhDigitsOnly - Only digits are allowed. \li - Qt.ImhFormattedNumbersOnly - Only number input is allowed. This includes decimal point and minus sign. \li - Qt.ImhUppercaseOnly - Only upper case letter input is allowed. \li - Qt.ImhLowercaseOnly - Only lower case letter input is allowed. \li - Qt.ImhDialableCharactersOnly - Only characters suitable for phone dialing are allowed. \li - Qt.ImhEmailCharactersOnly - Only characters suitable for email addresses are allowed. \li - Qt.ImhUrlCharactersOnly - Only characters suitable for URLs are allowed. \endlist Masks: \list \li - Qt.ImhExclusiveInputMask - This mask yields nonzero if any of the exclusive flags are used. \endlist \qmlproperty enumeration inputMethodHints */ property alias inputMethodHints: editor.inputMethodHints /*! Returns the total number of characters in the TextField item. If the TextField has an inputMask the length will include mask characters and may differ from the length of the string returned by the text property. This property can be faster than querying the length the text property as it doesn't require any copying or conversion of the TextField's internal string data. \qmlproperty int length */ property alias length: editor.length /*! The maximum permitted length of the text in the TextField. If the text is too long, it is truncated at the limit. By default, this property contains a value of 32767. \qmlproperty int maximumLength */ property alias maximumLength: editor.maximumLength /*! Specifies how text should be selected using a mouse. \list \li -TextInput.SelectCharacters - The selection is updated with individual characters. (Default) \li -TextInput.SelectWords - The selection is updated with whole words. \endlist This property only applies when selectByMouse is true. \qmlproperty enumeration mouseSelectionMode */ property alias mouseSelectionMode: editor.mouseSelectionMode /*! Whether the TextField should keep its selection when it loses active focus to another item in the scene. By default this is set to false. \qmlproperty bool persistentSelection */ property alias persistentSelection: editor.persistentSelection /*! Sets whether user input can modify the contents of the TextField. If readOnly is set to true, then user input will not affect the text property. Any bindings or attempts to set the text property will still work. \qmlproperty bool readOnly */ property alias readOnly: editor.readOnly /*! Override the default rendering type for this component. Supported render types are: \list \li - Text.QtRendering - (default) \li - Text.NativeRendering \endlist Select Text.NativeRendering if you prefer text to look native on the target platform and do not require advanced features such as transformation of the text. Using such features in combination with the NativeRendering render type will lend poor and sometimes pixelated results. \qmlproperty enumeration renderType */ property alias renderType: editor.renderType /*! Defaults to true. If false, the user cannot use the mouse to select text, only can use it to focus the input. \qmlproperty bool selectByMouse */ property alias selectByMouse: editor.selectByMouse /*! This read-only property provides the text currently selected in the text input. It is equivalent to the following snippet, but is faster and easier to use. \code myTextInput.text.toString().substring(myTextInput.selectionStart, myTextInput.selectionEnd); \endcode \qmlproperty string selectedText */ readonly property alias selectedText: editor.selectedText /*! The cursor position before the first character in the current selection. This property is read-only. To change the selection, use select(start,end), selectAll(), or selectWord(). \qmlproperty int selectionStart */ property alias selectionStart: editor.selectionStart /*! The cursor position after the last character in the current selection. This property is read-only. To change the selection, use select(start,end), selectAll(), or selectWord(). \qmlproperty int selectionEnd */ property alias selectionEnd: editor.selectionEnd /*! The text in the TextField. \qmlproperty string text */ property alias text: editor.text /*! Allows you to set a validator on the TextInput. When a validator is set the TextField will only accept input which leaves the text property in an acceptable or intermediate state. The accepted signal will only be sent if the text is in an acceptable state when enter is pressed. Currently supported validators are IntValidator, DoubleValidator and RegExpValidator. An example of using validators is shown below, which allows input of integers between 11 and 31 into the text input: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 TextField{ validator: IntValidator{bottom: 11; top: 31;} focus: true } \endqml \sa acceptableInput, inputMask \qmlproperty Validator validator */ property alias validator: editor.validator /*! Sets the horizontal alignment of the text within the item's width and height. By default, the text alignment follows the natural alignment of the text, for example text that is read from left to right will be aligned to the left. TextField does not have vertical alignment, as the natural height is exactly the height of the single line of text. If you set the height manually to something larger, TextInput will always be top aligned vertically. You can use anchors to align it however you want within another item. The valid values for horizontalAlignment are TextInput.AlignLeft, TextInput.AlignRight and TextInput.AlignHCenter. Valid values for verticalAlignment are TextInput.AlignTop (default), TextInput.AlignBottom TextInput.AlignVCenter. When using the attached property LayoutMirroring::enabled to mirror application layouts, the horizontal alignment of text will also be mirrored. However, the property horizontalAlignment will remain unchanged. To query the effective horizontal alignment of TextField, use the read-only property effectiveHorizontalAlignment. \qmlproperty enumeration horizontalAlignment */ property alias horizontalAlignment: editor.horizontalAlignment /*! \qmlproperty enumeration effectiveHorizontalAlignment See \l horizontalAlignment for details. */ property alias effectiveHorizontalAlignment: editor.effectiveHorizontalAlignment /*! \qmlproperty enumeration verticalAlignment See \l horizontalAlignment for details. */ property alias verticalAlignment: editor.verticalAlignment /*! This is the character displayed when echoMode is set to Password or PasswordEchoOnEdit. By default it is the unicode character 2022. If this property is set to a string with more than one character, the first character is used. If the string is empty, the value is ignored and the property is not set. \qmlproperty string passwordCharacter */ property alias passwordCharacter: editor.passwordCharacter /*! The text highlight color, used behind selections. \qmlproperty color selectionColor */ property alias selectionColor: editor.selectionColor /*! The highlighted text color, used in selections. \qmlproperty color selectedTextColor */ property alias selectedTextColor: editor.selectedTextColor /*! This handler is called when the Return or Enter key is pressed. Note that if there is a validator or inputMask set on the text input, the handler will only be emitted if the input is in an acceptable state. */ signal accepted() /*! \internal If used with an action or Option accepting propagates the new text. */ onAccepted: { control.triggered(control.text) } /*! Copies the currently selected text to the system clipboard. */ function copy() { editor.copy(); } /*! Moves the currently selected text to the system clipboard. */ function cut() { editor.cut(); } /*! Places the clipboard or the data given as parameter into the text input. The selected text will be replaces with the data. */ function paste(data) { if ((data !== undefined) && (typeof data === "string") && !editor.readOnly) { var selTxt = editor.selectedText; var txt = editor.text; var pos = (selTxt !== "") ? txt.indexOf(selTxt) : editor.cursorPosition if (selTxt !== "") { editor.text = txt.substring(0, pos) + data + txt.substr(pos + selTxt.length); } else { editor.text = txt.substring(0, pos) + data + txt.substr(pos); } editor.cursorPosition = pos + data.length; } else editor.paste(); } /*! Removes active text selection. */ function deselect() { editor.deselect(); } /*! Inserts \a text into the TextField at \a position. */ function insert(position, text) { editor.insert(position, text); } /*! This function returns the character position at x pixels from the left of the TextField. Position 0 is before the first character, position 1 is after the first character but before the second, and so on until position text.length, which is after all characters. This means that for all x values before the first character this function returns 0, and for all x values after the last character this function returns text.length. The cursor position type specifies how the cursor position should be resolved. \list \li - TextInput.CursorBetweenCharacters - Returns the position between characters that is nearest x. \li - TextInput.CursorOnCharacter - Returns the position before the character that is nearest x. \endlist */ function positionAt(x, position) { if (position == undefined) return editor.positionAt(x); else return editor.positionAt(x, position); } /*! This function takes a character position and returns the rectangle that the cursor would occupy, if it was placed at that character position. This is similar to setting the cursorPosition, and then querying the cursor rectangle, but the cursorPosition is not changed. */ function positionToRectangle(pos) { return editor.positionToRectangle(pos); } /*! Causes the text from start to end to be selected. If either start or end is out of range, the selection is not changed. After calling this, selectionStart will become the lesser and selectionEnd will become the greater (regardless of the order passed to this method). */ function select(start, end) { editor.select(start, end); } /*! Causes all text to be selected. */ function selectAll() { editor.selectAll(); } /*! Causes the word closest to the current cursor position to be selected. */ function selectWord() { editor.selectWord(); } /*! Returns true if the natural reading direction of the editor text found between positions start and end is right to left. */ function isRightToLeft(start, end) { return editor.isRightToLeft(start, end); } /*! Moves the cursor to position and updates the selection according to the optional mode parameter. (To only move the cursor, set the cursorPosition property.) When this method is called it additionally sets either the selectionStart or the selectionEnd (whichever was at the previous cursor position) to the specified position. This allows you to easily extend and contract the selected text range. The selection mode specifies whether the selection is updated on a per character or a per word basis. If not specified the selection mode will default to TextInput.SelectCharacters. \list \li - TextInput.SelectCharacters - Sets either the selectionStart or selectionEnd (whichever was at the previous cursor position) to the specified position. \li - TextInput.SelectWords - Sets the selectionStart and selectionEnd to include all words between the specified position and the previous cursor position. Words partially in the range are included. \endlist For example, take this sequence of calls: \code cursorPosition = 5 moveCursorSelection(9, TextInput.SelectCharacters) moveCursorSelection(7, TextInput.SelectCharacters) \endcode This moves the cursor to position 5, extend the selection end from 5 to 9 and then retract the selection end from 9 to 7, leaving the text from position 5 to 7 selected (the 6th and 7th characters). The same sequence with TextInput.SelectWords will extend the selection start to a word boundary before or on position 5 and extend the selection end to a word boundary on or past position 9. */ function moveCursorSelection(position, mode) { editor.moveCursorSelection(position, mode) } /*! Redoes the last operation if redo is \l {canRedo}{available}. */ function redo() { editor.redo(); } /*! Undoes the last operation if undo is \l {canUndo}{available}. Deselects any current selection, and updates the selection start to the current cursor position. */ function undo() { editor.undo(); } /*! Removes the section of text that is between the start and end positions from the TextField. */ function remove(start, end) { editor.remove(start, end); } /*! Returns the section of text that is between the start and end positions. If the TextField has an inputMask the length will include mask characters. */ function getText(start, end) { return editor.getText(start, end); } // internals opacity: enabled ? 1.0 : 0.3 activeFocusOnPress: true /*! \internal */ onVisibleChanged: { if (!visible) control.focus = false; } LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft LayoutMirroring.childrenInherit: true // grab clicks from the area between the frame and the input MouseArea { anchors.fill: parent acceptedButtons: Qt.LeftButton | Qt.RightButton // use it only when there is space between the frame and input enabled: internal.spacing > 0 preventStealing: false // forward mouse events to input so we can handle those uniformly Ubuntu.Mouse.forwardTo: [inputHandler] } Text { id: fontHolder } //internals QtObject { id: internal // array of borders in left, top, right, bottom order property real spacing: control.__styleInstance.frameSpacing property int type: action ? action.parameterType : Ubuntu.Action.None onTypeChanged: { // Don't undo explicitly specified hints if (inputMethodHints != Qt.ImhNone) return if (type == Ubuntu.Action.Integer || type == Ubuntu.Action.Real) inputMethodHints = Qt.ImhDigitsOnly } } //left pane Item { id: leftPane anchors { left: parent.left leftMargin: internal.spacing verticalCenter: parent.verticalCenter } // the left pane width depends on its children width height: parent.height width: childrenRect.width // Overlay needs to have priority z: 1 onChildrenChanged: { // reparenting for (var i = 0; i < children.length; i++) { children[i].parent = leftPane; children[i].anchors.verticalCenter = verticalCenter; } } } // right pane Item { id: rightPane anchors { right: parent.right rightMargin: internal.spacing verticalCenter: parent.verticalCenter } // the right pane width depends on its children width height: parent.height width: childrenRect.width // Overlay needs to have priority z: 1 onChildrenChanged: { // reparenting for (var i = 0; i < children.length; i++) { children[i].parent = rightPane; children[i].anchors.verticalCenter = verticalCenter; } } } AbstractButton { id: clearButton objectName: "clear_button" activeFocusOnPress: false anchors { top: parent.top right: rightPane.left bottom: parent.bottom margins: internal.spacing } /* draggedItemMouseArea and dragger in TextCursor are reparented to the TextField and end up being on top of the clear button. Ensure that the clear button receives touch/mouse events first. */ z: 100 width: visible ? icon.width : 0 visible: control.hasClearButton && !control.readOnly && (control.activeFocus && ((editor.text != "") || editor.inputMethodComposing)) Ubuntu.Icon { id: icon anchors.verticalCenter: parent.verticalCenter width: units.gu(2.5) height: width // use icon from icon-theme name: control.hasClearButton && !control.readOnly ? "edit-clear" : "" } onClicked: editor.text = "" } // hint text Label { id: hint verticalAlignment: Text.AlignVCenter horizontalAlignment: editor.horizontalAlignment anchors { left: leftPane.right right: clearButton.left top: parent.top bottom: parent.bottom margins: internal.spacing } // hint is shown till user types something in the field visible: (editor.text == "") && !editor.inputMethodComposing color: Theme.palette.normal.backgroundText font: editor.font elide: Text.ElideRight } // text input Flickable { id: flicker objectName: "input_scroller" anchors { left: leftPane.right right: clearButton.left top: parent.top bottom: parent.bottom margins: internal.spacing } topMargin: internal.spacing // do not allow rebounding boundsBehavior: Flickable.StopAtBounds // need to forward events as events occurred on topMargin area are not grabbed by the MouseArea. Ubuntu.Mouse.forwardTo: [inputHandler] clip: true contentWidth: editor.contentWidth contentHeight: editor.contentHeight TextInput { id: editor objectName: "text_input" // FocusScope will forward focus to this component focus: true anchors.verticalCenter: parent.verticalCenter verticalAlignment: TextInput.AlignVCenter width: flicker.width height: flicker.height cursorDelegate: TextCursor { handler: inputHandler } color: control.__styleInstance.color selectedTextColor: control.__styleInstance.selectedTextColor selectionColor: control.__styleInstance.selectionColor font.pixelSize: FontUtils.sizeToPixels("medium") passwordCharacter: "\u2022" // forward keys to the root element so it can be captured outside of it // as well as to InputHandler to handle PageUp/PageDown keys Keys.forwardTo: [control, inputHandler] // overrides selectByMouse: true activeFocusOnPress: true onActiveFocusChanged: if (!activeFocus && inputHandler.popover) PopupUtils.close(inputHandler.popover) // input selection and navigation handling Ubuntu.Mouse.forwardTo: [inputHandler] InputHandler { id: inputHandler anchors.fill: parent main: control input: editor flickable: flicker } } } Component.onCompleted: { editor.accepted.connect(control.accepted); cursorPosition = 0; } style: Theme.createStyleComponent("TextFieldStyle.qml", control) } ./src/Ubuntu/Components/1.2/PageTreeNode.qml0000644000015600001650000001251112700370701020605 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \internal \qmltype PageTreeNode \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The common parent of \l Page, \l MainView, \l PageStack and \l Tabs. It is used to propagate properties such as \l header and \l toolbar from a \l MainView (the root node) to each \l Page (leaf node) in the tree. */ StyledItem { id: node /*! \internal Used to determine whether an Item is a PageTreeNode */ property bool __isPageTreeNode: true /*! \internal */ onParentChanged: internal.updatePageTree() /*! \internal */ Component.onCompleted: internal.updatePageTree() /*! \deprecated The header of the node. Propagates down from the root node. This property is DEPRECATED. */ property Item header: node.__propagated ? node.__propagated.header : null /*! \deprecated The toolbar of the node. Propagates down from the root node. This property is DEPRECATED. */ property Toolbar toolbar: node.__propagated && node.__propagated.hasOwnProperty("toolbar") ? node.__propagated.toolbar : null /*! \internal QtObject containing all the properties that are propagated from the root (MainView) of a page tree to its leafs (Pages). This object contains properties such as the header and toolbar that are instantiated by the MainView. This property is internal because the derived classes (MainView and Page) need to access it, but other components using those classes should not have access to it. */ property QtObject __propagated: node.parentNode ? node.parentNode.__propagated : null /*! At any time, there is exactly one path from the root node to a Page leaf node where all nodes are active. All other nodes are not active. This is used by \l Tabs and \l PageStack to determine which of multiple nodes in the Tabs or PageStack is the currently active one. */ property bool active: node.parentNode ? node.parentNode.active : false /*! The \l PageStack that this Page has been pushed on, or null if it is not part of a PageStack. This value is automatically set for pages that are pushed on a PageStack, and propagates to its child nodes. */ // Note: pageStack is not included in the propagated property because there may // be multiple PageStacks in a single page tree. property Item pageStack: node.parentNode ? node.parentNode.pageStack : null /*! The parent node of the current node in the page tree. */ property Item parentNode: null /*! The leaf node that is active. */ property Item activeLeafNode /*! Whether or not this node is a leaf, that is if it has no descendant that are nodes. Pages are leafs, and they don't have descendants in the PageTree. */ property bool isLeaf: false // turn on focusing activeFocusOnPress: true Binding { target: node.parentNode property: "activeLeafNode" value: node.isLeaf ? node : node.activeLeafNode when: node.active } Item { id: internal function isPageTreeNode(object) { // FIXME: Use QuickUtils.className() when it becomes available. return (object && object.hasOwnProperty("__isPageTreeNode") && object.__isPageTreeNode); } /*! Return the parent node in the page tree, or null if the item is the root node or invalid. */ function getParentPageTreeNode(item) { var node = null; if (item) { var i = item.parent; while (i) { if (internal.isPageTreeNode(i)) { if (i.isLeaf) { // children of a leaf are not part of the tree node = null; print("WARNING! " + "Do not put Page/Tabs/PageStack inside another "+ "Page because that causes confusion which is the "+ "active page that sets the title and actions."); } else { // current node is part of the tree with i as its parent. node = i; } break; } i = i.parent; } } return node; } /*! Find the parent node. */ function updatePageTree() { node.parentNode = internal.getParentPageTreeNode(node); } } } ./src/Ubuntu/Components/1.2/Tab.qml0000644000015600001650000001214712700370701017016 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype Tab \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Component to represent a single tab in a \l Tabs environment. Examples: See \l Tabs. */ PageTreeNode { id: tab anchors.fill: parent ? parent : undefined /*! The title that is shown on the tab button used to select this tab. */ property string title /*! \deprecated The location of the icon that is displayed inside the button used to select this tab (optional). Either \l title or iconSource, or both must be defined. Deprecated because our new tab buttons in the header do not display an icon. */ property url iconSource /*! The contents of the Tab. Use a \l Page or a Loader that instantiates a Component or loads an external \l Page. When using a Loader, do not set the anchors or dimensions of the Loader so that the \l Page can control the height and prevent overlapping the header. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 MainView { width: units.gu(40) height: units.gu(50) Component { id: pageComponent Page { Label { anchors.centerIn: parent text: "Loaded when tab is selected." } } } Tabs { id: tabs Tab { title: i18n.tr("Simple page") page: Page { Label { anchors.centerIn: parent text: i18n.tr("Always loaded") } } } Tab { id: loaderTab title: i18n.tr("Page loader") page: Loader { // no anchors id: loader sourceComponent: tabs.selectedTab == loaderTab ? pageComponent : null onStatusChanged: if (loader.status == Loader.Ready) console.log('Loaded') } } } } \endqml */ property Item page: null // In case the page is a Loader with a Page inside, the Loader needs to be // anchored to the bottom of the Tab. Width and height are set by the Page. Binding { target: page property: "anchors.bottom" value: tab.bottom when: page } /*! \qmlproperty int index \readonly The property holds the index of the tab within the Tabs. */ readonly property alias index: internal.index /*! When page is updated, set its parent to be tab. */ onPageChanged: if (page) page.parent = tab /*! The tab is active when it is the selected tab of its parent Tabs item. Setting tab to active will automatically make child nodes active. */ active: parentNode && parentNode.active && parentNode.hasOwnProperty("selectedTab") && parentNode.selectedTab === tab visible: active /*! \internal */ onTitleChanged: { if (active) { // ensure the parent node is an instance of Tabs if (parentNode.hasOwnProperty("selectedTab")) { parentNode.modelChanged(); } } } /*! \internal */ property alias __protected: internal QtObject { id: internal /* Specifies the index of the Tab in Tabs. */ property int index: -1 /* Specifies whether the Tab has already been inserted in Tabs model or not. Pre-declared tabs are added one by one automatically before Tabs component completion, therefore we need this flag to exclude adding those Tab elements again which were already added. */ property bool inserted: false /* Specifies whether the Tab was created dynamically or not. A dynamically created Tab is destroyed upon removal. */ property bool dynamic: false /* This flag is used by the Tabs to determine whether the pre-declared Tab was removed from the Tabs model or not. The flag guards adding back pre-declared tabs upon Tabs component stack (children) change. */ property bool removedFromTabs: false } } ./src/Ubuntu/Components/1.2/Page11.qml0000644000015600001650000000424112700370701017322 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \internal */ // Documentation in Page.qdoc Page10 { id: page /*! \qmlproperty PageHeadConfiguration head */ readonly property alias head: headerConfig PageHeadConfiguration { id: headerConfig } onToolsChanged: { print("Page.tools is a deprecated property. Please use Page.head instead."); } Object { id: internal // Note: The bindings below need to check whether headerConfig.contents // is valid in the "value", even when that is required in the Binding's "when" // property, to avoid TypeErrors while/after a page becomes (in)active. // // Note 2: contents.parent binding is made by PageHeadStyle. property bool hasParent: headerConfig.contents && headerConfig.contents.parent Binding { target: headerConfig.contents property: "visible" value: page.active when: headerConfig.contents } Binding { target: headerConfig.contents property: "anchors.verticalCenter" value: internal.hasParent ? headerConfig.contents.parent.verticalCenter : undefined when: headerConfig.contents } Binding { target: headerConfig.contents property: "anchors.left" value: internal.hasParent ? headerConfig.contents.parent.left : undefined when: headerConfig.contents } } } ./src/Ubuntu/Components/1.2/Page10.qml0000644000015600001650000001035612700370701017325 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 as Toolkit /*! \internal Documentation is in Page.qdoc */ PageTreeNode { id: page anchors { left: parent ? parent.left : undefined bottom: parent ? parent.bottom : undefined } // Set width and height so that a parent Loader can be automatically resized // to the size of the loaded Page. width: parentNode ? parentNode.width - page.x : undefined height: parentNode ? page.flickable ? parentNode.height : parentNode.height - internal.headerHeight : undefined isLeaf: true property string title: parentNode && parentNode.hasOwnProperty("title") ? parentNode.title : "" // deprecated property Item tools: toolsLoader.item Loader { id: toolsLoader source: internal.header && internal.header.useDeprecatedToolbar ? "ToolbarItems.qml" : "" asynchronous: true } /*! \internal \deprecated Set this property to replace the title label in the header by any Item. It will be automatically anchored to fill the title space in the header. */ property Item __customHeaderContents: null property Flickable flickable: internal.getFlickableChild(page) /*! \internal */ onActiveChanged: { internal.updateActions(); } /*! \qmlproperty list actions */ property alias actions: actionContext.actions Object { id: internal // Toolkit ActionContext registers automatically to ActionManager Toolkit.ActionContext { id: actionContext } function updateActions() { actionContext.active = page.active; } property Item header: page.__propagated && page.__propagated.header ? page.__propagated.header : null // Used to position the Page when there is no flickable. // When there is a flickable, the header will automatically position it. property real headerHeight: internal.header && internal.header.visible ? internal.header.height : 0 Binding { target: tools property: "pageStack" value: page.pageStack when: tools && tools.hasOwnProperty("pageStack") } Binding { target: tools property: "visible" value: false when: internal.header && !internal.header.useDeprecatedToolbar && page.tools !== null } function isVerticalFlickable(object) { if (object && object.hasOwnProperty("flickableDirection") && object.hasOwnProperty("contentHeight")) { var direction = object.flickableDirection; if ( ((direction === Flickable.AutoFlickDirection) && (object.contentHeight !== object.height) ) || direction === Flickable.VerticalFlick || direction === Flickable.HorizontalAndVerticalFlick) { return true; } } return false; } /*! Return the first flickable child of this page. */ function getFlickableChild(item) { if (item && item.hasOwnProperty("children")) { for (var i=0; i < item.children.length; i++) { var child = item.children[i]; if (internal.isVerticalFlickable(child)) { if (child.anchors.top === page.top || child.anchors.fill === page) { return item.children[i]; } } } } return null; } } } ./src/Ubuntu/Components/1.2/Captions.qml0000644000015600001650000001226112700370701020065 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Layouts 1.1 import Ubuntu.Components 1.2 /*! \qmltype Captions \inqmlmodule Ubuntu.Components 1.2 \ingroup ubuntu-listitem \since Ubuntu.Components 1.2 \brief Container providing captionStyles for a twin-label column that can be used in RowLayout or GridLayout. The labels are placed in a column and can be accessed through \l title and \l subtitle properties. The default spacing between the labels is 0.5 grid units. The container only shows the labels which has its text property set to a valid string. The labels not having any text set are not occupying the space. When embedded in a positioner or in a RowLayout, the container is aligned vertically centered. It is recommended to be used in context with RowLayout or GridLayout, however can be used with any component. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 ListItem { RowLayout { Captions { title.text: "Caption" subtitle.text: "Subtitle text" // attached properties of an Item type property // can be changed only with assignment Component.onCompleted: subtitle.Layout.alignment = Qt.AlignRight } Captions { captionStyle: Ubuntu.SummaryCaptionStyle title.text: "Text" subtitle.text: "Text" } } } \endqml Additional items can also be added to the layout after the two labels. \qml Captions { title.text: "Caption" subtitle.text: "Subtitle" Label { text: "third line" fontSize: "xx-small" } } \endqml */ ColumnLayout { id: captions /*! \qmlproperty enumeration captionStyle The property configures the arrangement and font sizes of the Labels in the component. It can take the following values: \list \li \b Ubuntu.TitleCaptionStyle - (default) typical configuration for a left aligned twin-label setup, where the text covers the remaining area on a list layout. \li \b Ubuntu.SummaryCaptionStyle - configuration for a right-aligned twin label setup, with 6 grid units width. \endlist */ property int captionStyle: Ubuntu.TitleCaptionStyle /*! \qmlproperty Label title \readonly Label occupying the top area of the container. */ property alias title: titleLabel /*! \qmlproperty Label subtitle \readonly Label occupying the bottom area of the container. */ property alias subtitle: subtitleLabel clip: true spacing: units.gu(0.5) Layout.fillWidth: (captionStyle == Ubuntu.TitleCaptionStyle) Layout.alignment: Qt.AlignVCenter | ((captionStyle == Ubuntu.SummaryCaptionStyle) ? Qt.AlignRight : Qt.AlignLeft) Layout.minimumWidth: 0 Layout.maximumWidth: (captionStyle == Ubuntu.SummaryCaptionStyle) ? units.gu(6) : parent.width Layout.preferredWidth: (captionStyle == Ubuntu.SummaryCaptionStyle) ? Layout.maximumWidth : 0 Layout.minimumHeight: 0 Layout.maximumHeight: parent ? parent.height : childrenRect.height Layout.preferredHeight: childrenRect.height // handle visibility, do not override visible property! // 'hide' column if title and subtitle is an empty string and // there's no more children added states: State { name: "__q_invisible" when: (title.text === "" && subtitle.text === "") && (captions.children.length == 2) PropertyChanges { target: captions visible: false } } Label { id: titleLabel anchors { left: parent.left right: parent.right } fontSize: (captionStyle == Ubuntu.SummaryCaptionStyle) ? "small" : "medium" horizontalAlignment: (captionStyle == Ubuntu.SummaryCaptionStyle) ? Text.AlignRight : Text.AlignLeft visible: text !== "" elide: (captionStyle == Ubuntu.TitleCaptionStyle) ? Text.ElideRight : Text.ElideNone } Label { id: subtitleLabel anchors { left: parent.left right: parent.right } fontSize: "small" horizontalAlignment: (captionStyle == Ubuntu.SummaryCaptionStyle) ? Text.AlignRight : Text.AlignLeft visible: text !== "" maximumLineCount: (captionStyle == Ubuntu.TitleCaptionStyle) ? 2 : 1 wrapMode: (captionStyle == Ubuntu.TitleCaptionStyle) ? Text.Wrap : Text.NoWrap elide: (captionStyle == Ubuntu.TitleCaptionStyle) ? Text.ElideRight : Text.ElideNone } } ./src/Ubuntu/Components/1.2/PullToRefresh.qml0000644000015600001650000002002312700370701021036 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype PullToRefresh \inqmlmodule Ubuntu.Components 0.1 \ingroup ubuntu \since Ubuntu.Components 1.1 \brief Pull-to-refresh component for Flickables to reload a model upon pull. The component provides ability to initiate data model refresh by pulling the attached Flickable's content. The refresh can be initiated when the flickable content is at its top boundary. By dragging the content further, reaching the threshold value defined by the style will initiate the manual refresh by emitting the \l refresh signal. The progress of the refresh must be notified to the component by defining the completion clause to the \l refreshing property. \qml import QtQuick 2.4 import QtQuick.XmlListModel 2.0 import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 MainView { width: units.gu(40) height: units.gu(71) XmlListModel { id: listModel source: "http://feeds.reuters.com/reuters/topNews" query: "/rss/channel/item" XmlRole { name: "title"; query: "title/string()" } } Page { title: "Reuters" ListView { id: view anchors.fill: parent model: listModel delegate: Standard { width: ListView.view.width height: units.gu(5) text: title } PullToRefresh { refreshing: view.model.status === XmlListModel.Loading onRefresh: view.model.reload() } } } } \endqml \note UbuntuListView has a built-in PullToRefresh, therefore it is recommended to use UbuntuListView instead of ListView. The component will also show the progress of the model's update when the refresh gets initiated by the model or from other party. Style implementations can decide whether to visualize that or not. As default, the component displays a Label visualizing the two states of the component, which is pull to refresh and release to refresh. As mentioned, this is driven by the threshold value specified by the style, and the state is reported by the \l releaseToRefresh property. The \l content specifies the visuals to be shown by the component. Custom implementations can hold any component, which will be anchor filled to the component itself. \qml import QtQuick 2.4 import QtQuick.XmlListModel 2.0 import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 MainView { width: units.gu(40) height: units.gu(71) XmlListModel { id: listModel source: "http://feeds.reuters.com/reuters/topNews" query: "/rss/channel/item" XmlRole { name: "title"; query: "title/string()" } } Page { title: "Reuters" ListView { id: view anchors.fill: parent model: listModel delegate: Standard { width: ListView.view.width height: units.gu(5) text: title } PullToRefresh { id: pullToRefresh refreshing: view.model.status === XmlListModel.Loading onRefresh: view.model.reload() content: Item { Icon { name: pullToRefresh.releaseToRefresh ? "search" : "" height: parent.height width: height anchors.horizontalCenter: parent.horizontalCenter } } } } } } \endqml \note When declared as child of Flickable, set parent to the flickable explicitly so the component does not land in the \c content of Flickable. \qml import QtQuick 2.4 import QtQuick.XmlListModel 2.0 import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 MainView { id: main width: units.gu(40) height: units.gu(71) XmlListModel { id: rssFeed source: "http://feeds.reuters.com/reuters/topNews" query: "/rss/channel/item" XmlRole { name: "title"; query: "title/string()" } } Page { title: "Reuters" Flickable { id: flickable anchors.fill: parent contentHeight: column.childrenRect.height contentWidth: column.childrenRect.width Column { id: column Repeater { model: rssFeed Standard { width: main.width height: units.gu(5) text: title } } } PullToRefresh { parent: flickable refreshing: rssFeed.status === XmlListModel.Loading onRefresh: rssFeed.reload() } } } } \endqml \section2 Styling The component style API is defined by the \l PullToRefreshStyle component. Styles may define different ways to initiate refresh upon dragging. */ StyledItem { id: control /*! The property specifies when the component is ready to trigger the refresh() signal. The logic is defined by the style and the value is transferred from the style's releaseToRefresh property. The property can be used to define custom visuals for \l content. */ readonly property bool releaseToRefresh: __styleInstance.releaseToRefresh /*! The property holds the offset the component is pulled from the \l target Flickable's \a topMargin. The property can be used to provide animations in custom contents. */ readonly property real offset: -(target.topMargin - (y + height)) /*! The property holds the visuals to be displayed when the component is revealed upon manual refresh. The default value is a Label showing "Pull to refresh..." text when the component is pulled down till the activation threshold, and "Release to refresh..." after that. */ property Component content: __styleInstance.defaultContent /*! The Flickable or derivate the component is attached to. This can only be the parent or a sibling of the component. Defaults to the parent. */ property Flickable target: parent /*! The property notifies the component about the ongoing refresh operation. */ property bool refreshing: false /*! Signal emitted when the model refresh is initiated by the component. */ signal refresh() style: Theme.createStyleComponent("PullToRefreshStyle.qml", control) implicitHeight: __styleInstance.implicitHeight anchors { left: target.left right: target.right } y: -(internals.contentY + height) QtObject { id: internals property bool completed: false property real contentY: target.contentY - target.originY } Component.onCompleted: { internals.completed = true; } } ./src/Ubuntu/Components/1.2/TextCursor.qml0000644000015600001650000002625012700370701020432 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 as Ubuntu import Ubuntu.Components.Popups 1.0 Ubuntu.StyledItem { id: cursorItem height: cursorRectangle.height /* Property holding the text input's cursor position property. Can be one of the following ones: cursorPosition, selectionStart and selectionEnd. */ property string positionProperty: "cursorPosition" /* Input handler instance */ property InputHandler handler /* Cursor delegate used. This is the visual component from the main */ readonly property Component cursorDelegate: handler.main.cursorDelegate ? handler.main.cursorDelegate : __styleInstance.cursorDelegate style: Theme.createStyleComponent("TextCursorStyle.qml", cursorItem); objectName: "textCursor" //Caret instance from the style. property Item caret: __styleInstance.caret property int absX: { return fakeCursor.parent.mapFromItem(handler.main, cursorItem.x, cursorItem.y).x } property int absY: { // Take parent flickable movement into account var flickable = handler.main; do { flickable = flickable.parent; } while (flickable && !flickable.contentY && flickable != fakeCursor.parent); return fakeCursor.parent.mapFromItem(handler.main, cursorItem.x, cursorItem.y).y } // Returns "x" or "y" relative to the item handlers are a child of function mappedCursorPosition(coordinate) { var cpos = cursorItem["abs" + coordinate.toUpperCase()]; cpos += handler.frameDistance[coordinate]; cpos += handler.input[coordinate]; cpos -= handler.flickable["content" + coordinate.toUpperCase()]; return cpos; } /* The function opens the text input popover setting the text cursor as caller. */ Connections { target: handler onPressAndHold: { // open context menu only for cursorPosition or selectionStart as to // ensure that only one popover gets opened if (positionProperty !== "selectionEnd") { openPopover(fromTouch); } } onTextModified: typing = true onTap: { typing = false if (handler.popover != null) { PopupUtils.close(handler.popover); } } } Binding { target: handler property: "cursorPositionCursor" value: cursorItem } function openPopover() { if (!visible || opacity === 0.0 || dragger.dragActive) { return; } if (handler.popover != null) { PopupUtils.close(handler.popover); } var component = handler.main.popover; if (component === undefined) component = Qt.resolvedUrl("TextInputPopover.qml"); // if the cursor is out of the visible viewport, anchor the // contextual menu to the input field var anchor = caret.visible ? draggedItem : handler.main var popup = PopupUtils.open(component, anchor, { "target": handler.main, }); // hide the arrow popup.__foreground.direction = "none"; cursorItem.Component.onDestruction.connect(popup.__closePopup); contextMenuVisible = true; popup.onVisibleChanged.connect(contextMenuHidden.bind(undefined, popup)); // do not grab focus! popup.__foreground.activeFocusOnPress = false; handler.popover = popup; } visible: handler.main.cursorVisible && !(positionProperty === "cursorPosition" && handler.main.selectedText !== "") // cursor visual loader Loader { id: cursorLoader sourceComponent: cursorDelegate height: parent.height } /* * Caret dragging handling. We need a separate item which is dragged along the * component's area, which can move freely and not attached to the caret itself. * This area will then be used to update the caret position. */ Binding { target: caret when: caret property: "visible" value: QuickUtils.touchScreenAvailable && (contextMenuVisible || !typing) && handler.main.text !== "" } property bool typing: false property bool contextMenuVisible: false property bool readOnly: handler.main.readOnly function contextMenuHidden(p) { contextMenuVisible = false } //dragged item property Item draggedItem: Item { objectName: cursorItem.positionProperty + "_draggeditem" width: caret.width + units.gu(2) onWidthChanged: draggedItem.moveToCaret() height: cursorItem.height + caret.height + units.gu(2) parent: fakeCursor.parent visible: caret.visible /* Mouse area to turn on dragging or selection mode when pressed on the handler area. The drag mode is turned off when the drag gets inactive or when the LeftButton is released. */ MouseArea { id: draggedItemMouseArea objectName: cursorItem.positionProperty + "_activator" anchors.fill: parent acceptedButtons: Qt.LeftButton preventStealing: true enabled: parent.width && parent.height && parent.visible && !handler.doubleTapInProgress onPressedChanged: { if (!pressed) { // when the dragging ends, reposition the dragger back to caret draggedItem.moveToCaret(); } } Ubuntu.Mouse.forwardTo: [dragger] Ubuntu.Mouse.onClicked: openPopover() Ubuntu.Mouse.onPressAndHold: { handler.main.selectWord(); handler.pressAndHold(-1, false); } Ubuntu.Mouse.onDoubleClicked: handler.main.selectWord() Ubuntu.Mouse.enabled: enabled // Visible touch target area for debugging purposes Rectangle { anchors.fill: parent color: 'red' opacity: 0.1 visible: false // draggedItemMouseArea.enabled } } // aligns the draggedItem to the caret and resets the dragger function moveToCaret() { if (!caret) { return; } // The style may render handlers either on top or bottom var flip = caret.rotation == 180; draggedItem.x = fakeCursor.x + (flip ? -units.gu(1) : -draggedItem.width + units.gu(1)); draggedItem.y = fakeCursor.y - caret.height - units.gu(0.5); } // positions caret to the dragged position function positionCaret() { if (dragger.dragActive) { var dx = dragger.dragStartX + dragger.dragAmountX + handler.flickable.contentX; var dy = dragger.dragStartY + dragger.dragAmountY + handler.flickable.contentY; dx -= handler.frameDistance.x; dy -= handler.frameDistance.y; handler.positionCaret(positionProperty, dx, dy); } } } MouseArea { id: dragger objectName: cursorItem.positionProperty + "_dragger" // fill the entire component area parent: handler.main anchors.fill: parent enabled: draggedItemMouseArea.enabled && draggedItemMouseArea.pressed && caret.visible onEnabledChanged: { if (enabled) { dragAmountX = 0; dragAmountY = 0; firstMouseXChange = true; firstMouseYChange = true; } else { dragActive = false; } } property int dragStartX property int dragAmountX property int dragStartY property int dragAmountY property bool dragActive: false property int dragThreshold: units.gu(2) property bool firstMouseXChange: true property bool firstMouseYChange: true onMouseXChanged: { if (firstMouseXChange) { dragStartX = mouseX; firstMouseXChange = false; } else { var amount = mouseX - dragStartX; if (Math.abs(amount) >= dragThreshold) { dragActive = true; } if (dragActive) { dragAmountX = amount; draggedItem.positionCaret(); } } } onMouseYChanged: { if (firstMouseYChange) { dragStartY = mouseY; firstMouseYChange = false; } else { var amount = mouseY - dragStartY; if (Math.abs(amount) >= dragThreshold) { dragActive = true; } if (dragActive) { dragAmountY = amount; draggedItem.positionCaret() } } } onDragActiveChanged: { // close contextual menu when dragging and reopen it at the end of the drag if (dragActive) { if (handler.popover != null) { PopupUtils.close(handler.popover); } } else { handler.pressAndHold(-1, false); } } } // fake cursor, caret is reparented to it to avoid caret clipping Item { id: fakeCursor objectName: positionProperty + "FakeCursor" parent: QuickUtils.rootItem(handler.main) width: cursorItem.width height: cursorItem.height Component.onCompleted: caret.parent = fakeCursor x: mappedCursorPosition("x") y: mappedCursorPosition("y") onXChanged: draggedItem.moveToCaret() onYChanged: draggedItem.moveToCaret() // manual clipping: the caret should be visible only while the cursor's // top/bottom falls into the text area visible: { if (!caret || !cursorItem.visible || cursorItem.opacity < 1.0) return false; var pos = handler.main.mapFromItem(fakeCursor.parent, fakeCursor.x, fakeCursor.y); var leftTop = Qt.point(pos.x - handler.frameDistance.x, pos.y + handler.frameDistance.y + handler.lineSpacing); var rightBottom = Qt.point(pos.x - handler.frameDistance.x, pos.y + height - handler.frameDistance.y - handler.lineSpacing); return (handler.visibleArea.contains(leftTop) || handler.visibleArea.contains(rightBottom)); } } } ./src/Ubuntu/Components/1.2/ComboButton.qml0000644000015600001650000003245212700370701020544 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components.Popups 1.0 import Ubuntu.Components 1.2 as Toolkit /*! \qmltype ComboButton \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Ubuntu button providing a drop-down panel visualizing custom options. The component is composed of three main blocks: \b {main button}, \b {dropdown} and \b {combo list}. The \a {main button} holds the main functionailty of the component, and it is located at the left-top side of the expanded button. The \a clicked() signal is triggered only when this button is pressed. The \a {dropdown} is a button located on the right of the main button. Its functionality is to drive the component's expanded state. The \a {combo list} is a panel showing the content specified in \l comboList property when expanded. The content is stretched horizontally to the component's width, and its height is controlled by the \l expandedHeight property as follows: \list \li If the content height is smaller than the value of \l expandedHeight, the combo list will be expanded only to the height of the content. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 ComboButton { text: "smaller content" Rectangle { height: units.gu(5) // smaller than the default expandedHeight color: "blue" } } \endqml \li If the content height is greater than \l expandedHeight, the combo list will expand till the height specified by the property and the content will be scrolled; in case the combo list content is one single Flickable, ListView, GridView or PathView, the content scrolling will be provided by the content itself. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 ComboButton { text: "long scrolled content" Column { Repeater { model: 5 spacing: units.gu(1) Rectangle { height: units.gu(5) color: "blue" } } } } \endqml \li In case the content is a single Flickable, ListView, GridView or PathView, the content will be filling the entire combo list area defined. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 ComboButton { text: "listview" ListView { model: 10 delegate: Standard { text: "Item #" + modelData } } } \endqml \li Vertical anchoring of combo list content to its parent is not possible as the expansion calculation is done based on the combo list content height. If the content wants to take the size of the entire combo list, it should bind its height to the \l comboListHeight property. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 ComboButton { id: combo text: "smaller content" Rectangle { height: combo.comboListHeight color: "blue" } } \endqml \li In case the expansion needs to be the size of the combo list content, the \l expandedHeight should be set to -1. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 ComboButton { text: "auto-sized content" expandedHeight: -1 Column { Repeater { model: 5 spacing: units.gu(1) Button { text: "Button #" + modelData } } } } \endqml \endlist The combo list can be expanded/collapsed either through the \l expanded property or by clicking on the dropdown button. It is not collapsed when pressing the main button or clicking on the combo list. In order to do an auto-collapsing button you must reset the expanded property (set it to false) when the main button is clicked or when a selection is taken from the combo list content. The following example illustrates a possible implementation. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 ComboButton { id: combo text: "Auto closing" expanded: true expandedHeight: units.gu(30) onClicked: expanded = false UbuntuListView { width: parent.width height: combo.comboListHeight model: 20 delegate: Standard { text: "Action #" + modelData onClicked: { combo.text = text; combo.expanded = false; } } } } \endqml \section2 Styling The style of the component is defined in \l ComboButtonStyle. */ Toolkit.Button { id: combo /*! Specifies whether the combo list is expanded or not. The default falue is false. */ property bool expanded: false /*! The property holds the height of the component when collapsed. By default the value is the implicit height of the component. */ property real collapsedHeight: implicitHeight /*! The property holds the maximum height value the component should expand. When setting the property, remember to take into account the \l collapsedHeight value. The best practice is to use bind it with collapsedHeight. \qml ComboButton { text: "altered expandedHeight" expandedHeight: collapsedHeight + units.gu(25) } \endqml A value of -1 will instruct the component to expand the combo list as much as its content height is. The default value is \l collapsedHeight + 19.5 GU, so at least 3 ListItems can fit in the combo list. \sa collapsedHeight */ property real expandedHeight: collapsedHeight + units.gu(19.5) /*! The property holds the maximum combo list height allowed based on the \l expandedHeight and \l collapsedHeight values. It is a convenience property that can be used to size the combo list content. \qml import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 0.1 ComboButton { id: combo text: "Full comboList size" ListView { anchors { left: parent.left right: parent.right } height: combo.comboListHeight model: 20 delegate: Standard { text: "Action #" + modelData } } } \endqml \sa collapsedHeight, expandedHeight */ readonly property real comboListHeight: (expandedHeight < 0) ? comboListHolder.height : (expandedHeight - collapsedHeight - (combo.__styleInstance ? combo.__styleInstance.comboListMargin : 0)) /*! \qmlproperty list comboList \default Property holding the list of items to be shown in the combo list. Being a default property children items declared will land in the combo list. \note The component is not responsible for layouting the content. It only provides scrolling abilities for the case the content exceeds the defined expanded height. */ default property alias comboList: comboListHolder.data /* ----------------- Color and font configurations ----------------- */ /*! The property specifies the color of the dropdown button and the combo list for both collapsed and expanded states. You can use \l expanded to define different colors for expanded or collapsed states. */ property color dropdownColor: __styleInstance ? __styleInstance.defaultDropdownColor : color style: Theme.createStyleComponent("ComboButtonStyle.qml", combo) Component.onCompleted: { // update mouse area to report clicks only on the main button area // area excluding dropDown button and combo list // we must do separate bindings as __mouseArea is a read-only property __mouseArea.anchors.fill = undefined; __mouseArea.anchors.left = Qt.binding(function() {return combo.left;}); __mouseArea.anchors.top = Qt.binding(function() {return combo.top;}); __mouseArea.anchors.right = Qt.binding(function() {return combo.right;}); __mouseArea.anchors.rightMargin = Qt.binding(function() {return combo.__styleInstance.dropDownWidth + combo.__styleInstance.dropDownSeparatorWidth;}); __mouseArea.height = Qt.binding(function() {return collapsedHeight;}); // for autopilot, set the main button name __mouseArea.objectName = "combobutton_mainbutton"; // bind a height calculation to avoid unwanted change combo.height = Qt.binding(function() {return collapsedHeight + __styleInstance.comboListPanel.height}); } // dropdown button AbstractButton { id: dropDown objectName: "combobutton_dropdown" anchors { right: parent.right top: parent.top } width: combo.__styleInstance ? combo.__styleInstance.dropDownWidth : 0 height: combo.collapsedHeight // open dropdown when pressed, not when clicked onClicked: { // toggle expanded combo.expanded = !combo.expanded; } } // expansion list Flickable { id: comboHolder objectName: "combobutton_contentflicker" parent: combo.__styleInstance ? combo.__styleInstance.comboListHolder : combo anchors.fill: parent interactive: combo.expanded && !contentIsFlickable() && (combo.expandedHeight > 0) flickableDirection: Flickable.VerticalFlick contentHeight: comboListHolder.height // consider PathView as Flickable in this case as well! function contentIsFlickable() { return (comboListHolder.children.length === 1) && comboListHolder.children[0].hasOwnProperty("flicking"); } Item { id: comboListHolder objectName: "combobutton_combolist" anchors { left: parent.left right: parent.right } // stretch children width to holder's width // must do binding to height manually to avoid binding loops caused // by the vertical stretching when the component is a single flickable property bool stretch: (combo.expandedHeight > 0 && comboHolder.contentIsFlickable()) onStretchChanged: stretchChildren() onChildrenChanged: stretchChildren() function stretchChildren() { for (var i in comboListHolder.children) { var child = comboListHolder.children[i]; if (comboListHolder.stretch) { child.anchors.left = undefined; child.anchors.right = undefined; child.anchors.fill = comboListHolder; comboListHolder.height = Qt.binding(function() { return combo.comboListHeight; }); } else { child.anchors.left = comboListHolder.left; child.anchors.right = comboListHolder.right; comboListHolder.height = Qt.binding(function() { return comboListHolder.childrenRect.height; }); } } } } } Scrollbar { flickableItem: comboHolder } /* Drive the expansion height of the combo list holder This is a common functionaity in all combo buttons, therefore we can have it in the main component. */ Binding { target: combo.__styleInstance.comboListPanel property: "height" value: { if (!expanded) { return 0; } if (comboListHolder.stretch) { return combo.comboListHeight + combo.__styleInstance.comboListMargin; } var h = comboListHolder.height; var max = combo.comboListHeight + combo.__styleInstance.comboListMargin; if (combo.expandedHeight < 0) { return max; } return Toolkit.MathUtils.clamp(h, 0, max); } } } ./src/Ubuntu/Components/1.2/UbuntuListView.qml0000644000015600001650000001071412700370701021257 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 as Toolkit /*! \qmltype UbuntuListView \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief A ListView with special features tailored for a look and feel fitting the Ubuntu Touch platform. The UbuntuListView works just like a regular ListView, but it adds special features such as expanding/collapsing items (when used together with the Expandable item). It provides features like automatically positioning the expanding item when it expands and collapsing it again when the user taps outside of it. Examples: \qml import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 as ListItem Item { ListModel { id: listModel } UbuntuListView { id: ubuntuListView anchors { left: parent.left; right: parent.right } height: units.gu(24) model: listModel delegate: ListItem.Expandable { id: expandingItem expandedHeight: units.gu(30) onClicked: { ubuntuListView.expandedIndex = index; } } } } \endqml */ ListView { id: root /*! The index of the currently expanded item. -1 if no item is expanded. */ property int expandedIndex: -1 QtObject { id: priv function positionViewAtIndexAnimated(expandedIndex) { animation.from = root.contentY; root.currentIndex = expandedIndex; if (expandedIndex == root.count - 1) { root.positionViewAtIndex(expandedIndex, ListView.End); } else { root.positionViewAtIndex(expandedIndex + 1, ListView.End); } var effectiveExpandedHeight = Math.min(root.currentItem.expandedHeight, root.height - root.currentItem.collapsedHeight); if (root.contentY - root.originY == 0) { if (((root.currentIndex + 1) * root.currentItem.collapsedHeight) + effectiveExpandedHeight > root.height) { animation.to = ((root.currentIndex + 1) * root.currentItem.collapsedHeight + effectiveExpandedHeight) - root.height + root.originY } else { animation.to = root.originY } } else { animation.to = root.contentY + (effectiveExpandedHeight - root.currentItem.collapsedHeight); } animation.start(); } function requestFocus(reason) { // lookup for the currentItem, and if it is a FocusScope, focus the view // this will also focus the currentItem if (root.currentItem && root.currentItem.hasOwnProperty("activeFocusOnPress")) { root.forceActiveFocus(reason); } } } focus: true /*! \internal Grab focus when moved, flicked or clicked */ onMovementStarted: priv.requestFocus(Qt.MouseFocusReason) onFlickStarted: priv.requestFocus(Qt.MouseFocusReason) Toolkit.Mouse.onClicked: priv.requestFocus(Qt.MouseFocusReason) /*! Expand the item at the given index. */ onExpandedIndexChanged: { if (expandedIndex < 0) { return; } priv.positionViewAtIndexAnimated(expandedIndex, ListView.End) } UbuntuNumberAnimation { id: animation target: root property: "contentY" } MouseArea { parent: contentItem anchors.fill: parent z: 2 enabled: root.expandedIndex != -1 onClicked: root.expandedIndex = -1; } // animate move displaced moveDisplaced: Transition { UbuntuNumberAnimation { properties: "x,y" } } } ./src/Ubuntu/Components/1.2/ActivityIndicator.qml0000644000015600001650000000353012700370701021735 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype ActivityIndicator \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief The ActivityIndicator component visually indicates that a task of unknown duration is in progress, e.g. busy indication, connection in progress indication, etc. Note: for time consuming JavaScript operations use WorkerScript, otherwise no UI interaction will be possible and the ActicityIndicator animation will freeze. Example: \qml Item { ActivityIndicator { id: activity } Button { id: toggleActive text: (activity.running) ? "Deactivate" : "Activate" onClicked: activity.running = !activity.running } } \endqml */ AnimatedItem { id: indicator /*! Presents whether there is activity to be visualized or not. The default value is false. When activated (set to true), an animation is shown indicating an ongoing activity, which continues until deactivated (set to false). */ property bool running: false implicitWidth: units.gu(3) implicitHeight: units.gu(3) style: Theme.createStyleComponent("ActivityIndicatorStyle.qml", indicator) } ./src/Ubuntu/Components/1.2/InputHandler.qml0000644000015600001650000004416412700370701020711 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /* This component is a unified text selection and scrolling handler for both TextField and TextArea components. */ MultiPointTouchArea { id: inputHandler objectName: "input_handler" // the root control property Item main // the input instance property Item input // the Flickable holding the input instance property Flickable flickable // item filling the visible text input area used to check handler visibility property Item visibleArea: Item { parent: flickable anchors.fill: parent } // line size and spacing property real lineSpacing: units.dp(3) property real lineSize: input.font.pixelSize + lineSpacing // input x/y distance from the frame property point frameDistance: Qt.point(flickable.x, flickable.y) // signal triggered when popup should be opened signal pressAndHold(int pos, bool fromTouch) signal tap(int pos) property string oldText: "" signal textModified() function activateInput() { if (!input.activeFocus) { input.forceActiveFocus(); } showInputPanel(); } function showInputPanel() { if (!UbuntuApplication.inputMethod.visible) { UbuntuApplication.inputMethod.show(); } textChanged = false; } // internal properties/functions readonly property bool singleLine: input.hasOwnProperty("validator") property var flickableList: new Array() property bool textChanged: false property var popover property bool suppressReleaseEvent: false property int pressedPosition: -1 // move properties property int moveStarts: -1 property int moveEnds: -1 // set scroller to the first Flickable that scrolls the input // this can be the internal Flickable if the full autosize is disabled // or one of the input's parent Flickable readonly property bool scrollingDisabled: main && main.hasOwnProperty("autoSize") ? (main.autoSize && (main.maximumLineCount <= 0)) : false onScrollingDisabledChanged: if (state == "") flickable.interactive = !scrollingDisabled readonly property Flickable grandScroller: firstFlickableParent(main) readonly property Flickable scroller: (scrollingDisabled && grandScroller) ? grandScroller : flickable // ensures the text cursorRectangle is always in the internal Flickable's visible area function ensureVisible(rect) { if (flickable.moving || flickable.flicking) return; if (flickable.contentX >= rect.x) flickable.contentX = rect.x; else if (flickable.contentX + flickable.width <= rect.x + rect.width) flickable.contentX = rect.x + rect.width - flickable.width; if (flickable.contentY >= rect.y) flickable.contentY = rect.y; else if (flickable.contentY + flickable.height <= rect.y + rect.height) flickable.contentY = rect.y + rect.height - flickable.height; } // returns the cursor position from x,y pair function unadulteratedCursorPosition(x, y) { return singleLine ? input.positionAt(x, TextInput.CursorOnCharacter) : input.positionAt(x, y, TextInput.CursorOnCharacter); } // returns the cursor position taking frame into account function cursorPosition(x, y) { var frameSpacing = main.__styleInstance.frameSpacing; var cursorPosition = unadulteratedCursorPosition(x, y); if (cursorPosition == 0) cursorPosition = unadulteratedCursorPosition(x + frameSpacing, y + frameSpacing); if (cursorPosition == text.length) cursorPosition = unadulteratedCursorPosition(x - frameSpacing, y - frameSpacing); return cursorPosition } // returns the mouse position function mousePosition(mouse) { return cursorPosition(mouse.x, mouse.y); } // checks whether the position is in the selected text function positionInSelection(pos) { return (input.selectionStart !== input.selectionEnd) && (pos >= Math.min(input.selectionStart, input.selectionEnd)) && (pos <= Math.max(input.selectionStart, input.selectionEnd)); } // check whether the mouse is inside a selected text area function mouseInSelection(mouse) { var pos = mousePosition(mouse); return positionInSelection(pos); } // selects text function selectText(mouse) { state = "select"; moveEnds = mousePosition(mouse); if (moveStarts < 0) { moveStarts = moveEnds; } input.select(moveStarts, moveEnds); } // returns the first Flickable parent of a given item function firstFlickableParent(item) { var p = item ? item.parent : null; while (p && !p.hasOwnProperty("flicking")) { p = p.parent; } return p; } // focuses the input if not yet focused, and shows the context menu function openContextMenu(mouse, noAutoselect, fromTouch) { var pos = mousePosition(mouse); if (!main.focus || !mouseInSelection(mouse)) { activateInput(); input.cursorPosition = pressedPosition = mousePosition(mouse); if (!noAutoselect) { input.selectWord(); } } // open context menu at the cursor position inputHandler.pressAndHold(input.cursorPosition, fromTouch); // if opened with left press (touch falls into this criteria as well), we need to set state to inactive // so the mouse moves won't result in selected text loss/change if (mouse.button === Qt.LeftButton) { state = "inactive"; } } // disables interactive Flickable parents, stops at the first non-interactive flickable. function toggleFlickablesInteractive(turnOn) { var p; if (!turnOn) { // handle the scroller separately p = firstFlickableParent(scroller) while (p) { if (p.interactive) { flickableList.push(p); p.interactive = false; } else { break; } p = firstFlickableParent(p); } } else { while (flickableList.length > 0) { p = flickableList.pop(); p.interactive = true; } } } // moves the specified position, called by the cursor handler // positioner = "currentPosition/selectionStart/selectionEnd" function positionCaret(positioner, x, y) { if (positioner === "cursorPosition") { input[positioner] = cursorPosition(x, y); } else { var pos = cursorPosition(x, y); if (positioner === "selectionStart" && (pos < input.selectionEnd)) { input.select(pos, input.selectionEnd); } else if (positioner === "selectionEnd" && (pos > input.selectionStart)) { input.select(input.selectionStart, pos); } } } // moves the cursor one page forward with or without positioning the cursor function movePage(forward) { var cx = input.cursorRectangle.x; var cy = input.cursorRectangle.y; if (forward) { if (singleLine) { cx += visibleArea.width; } else { cy += visibleArea.height; } } else { if (singleLine) { cx -= visibleArea.width; } else { cy -= visibleArea.height; } } input.cursorPosition = cursorPosition(cx, cy); } Component.onCompleted: { state = (main.focus) ? "" : "inactive"; // FIXME: Qt5.3 related! mouseEnabled is a 5.3 related property which has a positive // default value. That value messes up teh current understanding (5.2) of the // MultiPointTouchArea functioning. We need to set it to false until 5.3 will be the // default supported Qt version, when we can have a clean property value assignment if (inputHandler.hasOwnProperty("mouseEnabled")) { inputHandler.mouseEnabled = false; } } // states states: [ // override default state to turn on the saved Flickable interactive mode State { name: "" StateChangeScript { // restore interactive for all Flickable parents script: toggleFlickablesInteractive(true); } }, State { name: "inactive" // we do not disable scroller here as in case the internal scrolling // is disabled (scrollingDisabled = true) the outer scroller (grandScroller) // would be blocked as well, which we don't want to PropertyChanges { target: flickable interactive: false } }, State { name: "scrolling" StateChangeScript { script: { // stop scrolling all the parents toggleFlickablesInteractive(false); // stop touch timers touchPoint.reset(); } } }, State { name: "select" // during select state all the flickables are blocked (interactive = false) // we can use scroller here as we need to disable the outer scroller too! PropertyChanges { target: scroller interactive: false } StateChangeScript { script: { // turn off interactive for all parent flickables toggleFlickablesInteractive(false); if (!positionInSelection(pressedPosition)) { input.cursorPosition = pressedPosition; } } } } ] // brings the state back to default when the component looses focus // and ensures input has active focus when component regains focus Connections { target: main ignoreUnknownSignals: true onFocusChanged: { UbuntuApplication.inputMethod.commit() state = (main.focus) ? "" : "inactive"; if (main.focus) { input.forceActiveFocus() } } } // input specific signals Connections { target: input onCursorRectangleChanged: ensureVisible(input.cursorRectangle) onTextChanged: { textChanged = true; if (oldText != input.text) { textModified() oldText = text } } // make sure we show the OSK onActiveFocusChanged: showInputPanel() } // inner or outer Flickable controlling Connections { target: scroller // turn scrolling state on onFlickStarted: toggleScrollingState(true) onMovementStarted: toggleScrollingState(true) // reset to default state onMovementEnded: toggleScrollingState(false) function toggleScrollingState(turnOn) { if (!main.focus) { return; } inputHandler.state = (turnOn) ? "scrolling" : "" } } // PageUp and PageDown handling Keys.onPressed: { if (event.key === Qt.Key_PageUp && event.modifiers === Qt.NoModifier) { movePage(false); } else if (event.key === Qt.Key_PageDown && event.modifiers === Qt.NoModifier) { movePage(true); } } // touch and mous handling function handlePressed(event, touch) { if (touch) { // we do not have longTap or double tap, therefore we need to generate those event.touch(); } else { // consume event so it does not get forwarded to the input event.accepted = true; } // remember pressed position as we need it when entering into selection state pressedPosition = mousePosition(event); } function handleReleased(event, touch) { if (touch) { event.untouch(); } if ((!main.focus && !main.activeFocusOnPress) || suppressReleaseEvent === true) { suppressReleaseEvent = false; return; } activateInput(); if (state === "" || touch) { input.cursorPosition = mousePosition(event); } moveStarts = moveEnds = -1; state = ""; // check if we get right-click from the frame or the area that has no text if (event.button === Qt.RightButton) { // open the popover inputHandler.pressAndHold(input.cursorPosition, touch); } else { inputHandler.tap(input.cursorPosition); } } function handleMove(event, touch ) { // leave if not focus, not the left button or not in select state if (!input.activeFocus || (!touch && event.button !== Qt.LeftButton) || !main.selectByMouse) { return; } selectText(event); } function handleDblClick(event, touch) { if (main.selectByMouse) { openContextMenu(event, false, touch); // turn selection state temporarily so the selection is not cleared on release state = "selection"; suppressReleaseEvent = true; } } // Mouse handling Mouse.forwardTo: [main] Mouse.onPressed: handlePressed(mouse, false) Mouse.onReleased: handleReleased(mouse, false) Mouse.onPositionChanged: handleMove(mouse, false) Mouse.onDoubleClicked: handleDblClick(mouse, false) // right button handling MouseArea { anchors.fill: parent acceptedButtons: Qt.RightButton // trigger pressAndHold onReleased: openContextMenu(mouse, true, false) } Keys.onMenuPressed: inputHandler.pressAndHold(input.cursorPosition, false); // touch handling touchPoints: TouchPoint { id: touchPoint function touch() { longTap.restart(); if (!doubleTap.running) { doubleTap.restart(); } else if (doubleTap.tapCount > 0) { doubleTap.running = false; handleDblClick(touchPoint, true); } } function untouch() { longTap.running = false; } function reset() { longTap.running = false; doubleTap.running = false; } } Timer { id: longTap // sync with QQuickMouseArea constant interval: 800 onTriggered: { // do not open context menu if the input is not focus if (!main.focus) { return; } // do not open context menu if this is scrolling if (touchPoint.startY - touchPoint.y < -units.gu(2)) return; openContextMenu(touchPoint, false, true); suppressReleaseEvent = true; } } property bool doubleTapInProgress: doubleTap.running Timer { id: doubleTap property int tapCount: 0 interval: 400 onRunningChanged: { tapCount = running; } } onPressed: handlePressed(touchPoints[0], true) onReleased: handleReleased(touchPoints[0], true) property Item cursorPositionCursor: null property Item selectionStartCursor: null property Item selectionEndCursor: null // cursors to use when text is selected Connections { target: input onSelectedTextChanged: { if (selectedText !== "") { if (!selectionStartCursor) { selectionStartCursor = input.cursorDelegate.createObject( input, { "positionProperty": "selectionStart", "handler": inputHandler, } ); moveSelectionCursor(selectionStartCursor); selectionEndCursor = input.cursorDelegate.createObject( input, { "positionProperty": "selectionEnd", "handler": inputHandler, } ); moveSelectionCursor(selectionEndCursor); } } else { if (selectionStartCursor) { selectionStartCursor.destroy(); selectionStartCursor = null; selectionEndCursor.destroy(); selectionEndCursor = null; } } } onSelectionStartChanged: moveSelectionCursor(selectionStartCursor, true); onSelectionEndChanged: moveSelectionCursor(selectionEndCursor, true); function moveSelectionCursor(cursor, updateProperty) { if (!cursor) { return; } // workaround for https://bugreports.qt-project.org/browse/QTBUG-38704 // selectedTextChanged signal is not emitted for TextEdit when selectByMouse is false if (updateProperty && QuickUtils.className(input) === "QQuickTextEdit") { input.selectedTextChanged(); } var pos = input.positionToRectangle(input[cursor.positionProperty]); cursor.x = pos.x; cursor.y = pos.y; cursor.height = pos.height; ensureVisible(pos); } } } ./src/Ubuntu/Components/1.2/PageStack.qml0000644000015600001650000002571612700370701020160 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import "stack.js" as Stack /*! \qmltype PageStack \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief A stack of \l Page items that is used for inter-Page navigation. Pages on the stack can be popped, and new Pages can be pushed. The page on top of the stack is the visible one. PageStack should be used inside a \l MainView in order to automatically add a header and toolbar to control the stack. The PageStack will automatically set the header title to the title of the \l Page that is currently on top of the stack, and the tools of the toolbar to the tools of the \l Page on top of the stack. When more than one Pages are on the stack, the toolbar will automatically feature a back-button that pop the stack when triggered. The anchors of the PageStack are set to fill its parent by default. To use left/right/top/bottom anchors, explicitly set anchors.fill of the PageStack to undefined: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 MainView { width: units.gu(40) height: units.gu(71) PageStack { id: mainStack anchors { fill: undefined // unset the default to make the other anchors work left: parent.left right: parent.right top: parent.top bottom: rect.top } } Rectangle { id: rect color: UbuntuColors.red anchors { left: parent.left right: parent.right bottom: parent.bottom } height: units.gu(10) } Component.onCompleted: mainStack.push(Qt.resolvedUrl("MyPage.qml")) } \endqml Pages that are defined inside the PageStack must initially set their visibility to false to avoid the pages occluding the PageStack before they are pushed. When pushing a \l Page, its visibility is automatically updated. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 as ListItem MainView { width: units.gu(48) height: units.gu(60) PageStack { id: pageStack Component.onCompleted: push(page0) Page { id: page0 title: i18n.tr("Root page") visible: false Column { anchors.fill: parent ListItem.Standard { text: i18n.tr("Page one") onClicked: pageStack.push(page1, {color: UbuntuColors.orange}) progression: true } ListItem.Standard { text: i18n.tr("External page") onClicked: pageStack.push(Qt.resolvedUrl("MyCustomPage.qml")) progression: true } } } Page { title: "Rectangle" id: page1 visible: false property alias color: rectangle.color Rectangle { id: rectangle anchors { fill: parent margins: units.gu(5) } } } } } \endqml As shown in the example above, the push() function can take an Item, Component or URL as input. */ PageTreeNode { id: pageStack anchors.fill: parent /*! \internal Please do not use this property any more. \l MainView now has a header property that controls when the header is shown/hidden. */ property bool __showHeader: true QtObject { property alias showHeader: pageStack.__showHeader onShowHeaderChanged: print("__showHeader is deprecated. Do not use it.") } /*! The current size of the stack */ //FIXME: would prefer this be readonly, but readonly properties are only bound at //initialisation. Trying to update it in push or pop fails. Not sure how to fix. property int depth: 0 /*! The currently active page */ property Item currentPage: null /*! Push a page to the stack, and apply the given (optional) properties to the page. The pushed page may be an Item, Component or URL. The function returns the Item that was pushed, or the Item that was created from the Component or URL. Depending on the animation of the header, the returned Page may or may not be active and on top of the PageStack yet. */ function push(page, properties) { internal.finishPreviousAction(); internal.pageWrapper = internal.createWrapper(page, properties); var pageObject = internal.pageWrapper.object; if (internal.animateHeader && internal.stack.size() > 0) { internal.headStyle.animateOutFinished.connect(internal.pushWrapperObject); internal.headStyle.animateOut(); } else { internal.pushWrapperObject(); } return pageObject; } /*! Pop the top item from the stack if the stack size is at least 1. Do not do anything if 0 or 1 items are on the stack. */ function pop() { internal.finishPreviousAction(); if (internal.stack.size() < 1) { print("WARNING: Trying to pop an empty PageStack. Ignoring."); return; } // do not animate if there is no page to animate back in after popping if (internal.animateHeader && internal.stack.size() > 1) { internal.headStyle.animateOutFinished.connect(internal.popAndDestroy); internal.headStyle.animateOut(); } else { internal.popAndDestroy(); } } /*! Deactivate the active page and clear the stack. */ function clear() { internal.finishPreviousAction(); while (internal.stack.size() > 0) { internal.stack.top().active = false; if (internal.stack.top().canDestroy) internal.stack.top().destroyObject(); internal.stack.pop(); } internal.stackUpdated(); } QtObject { id: internal property Item headStyle: (pageStack.__propagated && pageStack.__propagated.header && pageStack.__propagated.header.__styleInstance) ? pageStack.__propagated.header.__styleInstance : null property bool animateHeader: pageStack.__propagated.hasOwnProperty("animateHeader") && pageStack.__propagated.animateHeader // Call this function before pushing or popping to ensure correct order // of pushes/pops on the stack. This terminates any currently running // header transition. function finishPreviousAction() { // no action required when animating IN because the PageStack was // already updated before that transition started. if (internal.animateHeader && internal.headStyle.state == "OUT") { // force instant update of the PageStack without waiting for // the OUT animation to finish: internal.headStyle.animateOutFinished(); } } // The PageWrapper to be pushed on the stack by pushWrapperObject(). property var pageWrapper: null // Called when the header animate OUT transition finishes for push() or instantly // when header animations are disabled. function pushWrapperObject() { if (internal.animateHeader) { headStyle.animateOutFinished.disconnect(internal.pushWrapperObject); } if (internal.stack.size() > 0) internal.stack.top().active = false; internal.stack.push(internal.pageWrapper); internal.pageWrapper = null; internal.stackUpdated(); } // Called when header animate OUT transition finishes for pop() or instantly // when header animations are disabled. function popAndDestroy() { if (internal.animateHeader) { headStyle.animateOutFinished.disconnect(internal.popAndDestroy); } internal.stack.top().active = false; if (internal.stack.top().canDestroy) internal.stack.top().destroyObject(); internal.stack.pop(); internal.stackUpdated(); } /*! The instance of the stack from javascript */ property var stack: new Stack.Stack() function createWrapper(page, properties) { var wrapperComponent = Qt.createComponent("PageWrapper.qml"); var wrapperObject = wrapperComponent.createObject(pageStack); wrapperObject.pageStack = pageStack; wrapperObject.properties = properties; // set reference last because it will trigger creation of the object // with specified properties. wrapperObject.reference = page; return wrapperObject; } // Update depth and makes the Item on top of the stack active, and // then animates IN the new header contents if header animations are enabled. function stackUpdated() { pageStack.depth = stack.size(); if (pageStack.depth > 0) { internal.stack.top().active = true; currentPage = stack.top().object; if (internal.animateHeader) { headStyle.animateIn(); } } else { currentPage = null; } } } /*! \qmlproperty list data Children of PageStack are placed in a separate item such that they are not active by default until they are pushed on the PageStack. */ default property alias data: inactiveNode.data PageTreeNode { anchors.fill: parent id: inactiveNode active: false } } ./src/Ubuntu/Components/1.2/ToolbarItems.qml0000644000015600001650000001701612700370701020714 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype ToolbarItems \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \deprecated \brief Row of Items to be placed in a toolbar. \b DEPRECATED: DO NOT USE THIS. USE \b head.actions IN \l Page INSTEAD. Each \l Page has a tools property that can be set to change the tools of toolbar supplied by \l MainView when the \l Page is active. Each ToolbarItems consists of a set of Items and several properties that specify the behavior of the toolbar when the \l Page is active. When a \l Page is used inside a \l MainView, \l Tabs or \l PageStack, the toolbar will automatically show the tools of the active \l Page. When the active \l Page inside the \l Tabs or \l PageStack is updated by changing the selected \l Tab or by pushing/popping a \l Page on the \l PageStack, the toolbar will automatically hide, except if the new active \l Page has the \l locked property set. It is recommended to use \l ToolbarButton inside the ToolbarItems to define the buttons that will be visible to the user: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 MainView { width: units.gu(50) height: units.gu(50) Page { title: "Tools example" Label { anchors.centerIn: parent text: "Custom back button\nToolbar locked" } tools: ToolbarItems { ToolbarButton { action: Action { text: "button" iconName: "compose" onTriggered: print("success!") } } locked: true opened: true } } } \endqml However, it is possible to include non-\l ToolbarButton Items inside ToolbarItems, and to mix ToolbarButtons and other Items (for example standard Buttons). ToolbarButtons automatically span the full height of the toolbar, and other Items you will probably want to center vertically: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 MainView { width: units.gu(50) height: units.gu(50) Page { title: "Tools example" Label { anchors.centerIn: parent text: "buttons!" } tools: ToolbarItems { ToolbarButton { action: Action { text: "toolbar" iconName: "compose" onTriggered: print("success!") } } Button { anchors.verticalCenter: parent.verticalCenter text: "standard" } } } } \endqml */ Item { id: toolbarItems anchors.fill: parent /*! Default property, holds the content which will shown in the toolbar. \qmlproperty list contents */ default property alias contents: toolsContainer.data /*! The back button. If it is visible, it will be shown on the left-side of the toolbar. If there is a \l PageStack with depth greater than 1, the back button will be visible and triggering it will pop the page on top of the stack. If there is no \l PageStack with depth greater than 1, the back button is hidden by default The following example shows how to have a classic cancel button that is always visible in the toolbar, instead of the default toolbar-styled back button: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 MainView { width: units.gu(50) height: units.gu(50) Page { title: "Custom back button" tools: ToolbarItems { back: Button { text: "cancel" } } } } \endqml */ property Item back: ToolbarButton { objectName: "back_toolbar_button" iconSource: Qt.resolvedUrl("../artwork/back.png") text: i18n.dtr('ubuntu-ui-toolkit', "Back") visible: toolbarItems.pageStack && toolbarItems.pageStack.depth > 1 /*! If there is a \l PageStack of sufficient depth, triggering the back button will pop the \l Page on top of the \l PageStack. */ onTriggered: if (toolbarItems.pageStack && toolbarItems.pageStack.depth > 1) toolbarItems.pageStack.pop() } /*! PageStack for the back button. \l Page will automatically set the pageStack property of its tools. */ property Item pageStack: null /*! The toolbar is opened. When the toolbar is not locked, this value is automatically updated when the toolbar is opened/closed by user interaction or by other events (such as changing the active \l Page). */ property bool opened: false /*! The toolbar cannot be opened/closed by bottom-edge swipes. If the ToolbarItems contains no visible Items, it is automatically locked (in closed state). */ property bool locked: !internal.hasVisibleItems() QtObject { id: internal /* Determine whether this ToolbarItems has any visible Items */ function hasVisibleItems() { if (back && back.visible) return true; for (var i=0; i < toolsContainer.children.length; i++) { if (toolsContainer.children[i].visible) return true; } return false; } } Item { id: backContainer anchors { left: parent.left top: parent.top bottom: parent.bottom leftMargin: units.gu(2) } width: childrenRect.width // internal link to the previous back Item to unset its parent // when toolbarItems.back is updated. property Item previousBackItem: null function updateBackItem() { if (backContainer.previousBackItem) backContainer.previousBackItem.parent = null; backContainer.previousBackItem = toolbarItems.back; if (toolbarItems.back) toolbarItems.back.parent = backContainer; } Connections { target: toolbarItems onBackChanged: backContainer.updateBackItem() Component.onCompleted: backContainer.updateBackItem() } } Row { id: toolsContainer anchors { right: parent.right bottom: parent.bottom top: parent.top rightMargin: units.gu(2) } spacing: units.gu(1) } } ./src/Ubuntu/Components/1.2/CrossFadeImage10.qml0000644000015600001650000001221112700370701021255 0ustar jenkinsjenkins/* * Copyright (C) 2013 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.4 // FIXME: When a module contains QML, C++ and JavaScript elements exported, // we need to use named imports otherwise namespace collision is reported // by the QML engine. As workaround, we use Ubuntu named import. // Bug to watch: https://bugreports.qt-project.org/browse/QTBUG-27645 import Ubuntu.Components 1.2 as Ubuntu /*! \internal Documentation is in CrossFadeImage.qdoc */ Item { id: crossFadeImage property url source property int fillMode : Image.PreserveAspectFit property int fadeDuration: Ubuntu.UbuntuAnimation.FastDuration // FIXME: Support resetting sourceSize property size sourceSize: internals.loadingImage ? Qt.size(internals.loadingImage.sourceSize.width, internals.loadingImage.sourceSize.height) : Qt.size(0, 0) readonly property bool running: nextImageFadeIn.running readonly property int status: internals.loadingImage ? internals.loadingImage.status : Image.Null Binding { target: crossFadeImage property: "sourceSize" value: internals.loadingImage ? Qt.size(internals.loadingImage.sourceSize.width, internals.loadingImage.sourceSize.height) : Qt.size(0, 0) when: internals.forcedSourceSize === undefined } /*! \internal */ onSourceSizeChanged: { if (internals.loadingImage && (sourceSize != Qt.size(internals.loadingImage.sourceSize.width, internals.loadingImage.sourceSize.height))) { internals.forcedSourceSize = sourceSize; } } QtObject { id: internals /*! \internal Source size specified by the setting crossFadeImage.sourceSize. */ property size forcedSourceSize /*! \internal Defines the image currently being shown */ property Image currentImage: image1 /*! \internal Defines the image being changed to */ property Image nextImage: image2 property Image loadingImage: currentImage function swapImages() { internals.currentImage.z = 0; internals.nextImage.z = 1; nextImageFadeIn.start(); var tmpImage = internals.currentImage; internals.currentImage = internals.nextImage; internals.nextImage = tmpImage; } } Image { id: image1 anchors.fill: parent cache: false asynchronous: true fillMode: parent.fillMode z: 1 Binding { target: image1 property: "sourceSize" value: internals.forcedSourceSize when: internals.forcedSourceSize !== undefined } } Image { id: image2 anchors.fill: parent cache: false asynchronous: true fillMode: parent.fillMode z: 0 Binding { target: image2 property: "sourceSize" value: internals.forcedSourceSize when: internals.forcedSourceSize !== undefined } } /*! \internal Do the fading when the source is updated */ onSourceChanged: { // On creation, the souce handler is called before image pointers are set. if (internals.currentImage === null) { internals.currentImage = image1; internals.nextImage = image2; } nextImageFadeIn.stop(); // Don't fade in initial picture, only fade changes if (internals.currentImage.source == "") { internals.currentImage.source = source; internals.loadingImage = internals.currentImage; } else { nextImageFadeIn.stop(); internals.nextImage.opacity = 0.0; internals.nextImage.source = source; internals.loadingImage = internals.nextImage; // If case the image is still in QML's cache, status will be "Ready" immediately if (internals.nextImage.status === Image.Ready || internals.nextImage.source === "") { internals.swapImages(); } } } Connections { target: internals.nextImage onStatusChanged: { if (internals.nextImage.status == Image.Ready) { internals.swapImages(); } } } UbuntuNumberAnimation { id: nextImageFadeIn target: internals.nextImage property: "opacity" to: 1.0 duration: crossFadeImage.fadeDuration onRunningChanged: { if (!running) { internals.nextImage.source = ""; } } } } ./src/Ubuntu/Components/1.2/Slider.qml0000644000015600001650000001606212700370701017532 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ // FIXME(loicm) Add support for keyboard shortcuts (basically left/right). import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype Slider \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Slider is a component to select a value from a continuous range of values. The slider's sensing area is defined by the width and height, therefore styles should take this into account when defining the visuals, and alter these values to align the graphics' sizes. \l {https://design.ubuntu.com/apps/building-blocks/selection#slider}{See also the Design Guidelines on Sliders}. Example: \qml Item { Slider { function formatValue(v) { return v.toFixed(2) } minimumValue: -3.14 maximumValue: 3.14 value: 0.0 live: true } } \endqml */ StyledItem { id: slider /*! The minimum value from the continuous range of values. If this value is greater than maximumValue, the component will be in an inconsistent state. */ property real minimumValue: 0.0 /*! The maximum value from the continuous range of values. If this value is lesser than minimumValue, the component will be in an inconsistent state. */ property real maximumValue: 100.0 // FIXME(loicm) Add Support for the stepSize property. // /*! // The distance between two selectable values in the range defined by // [minimumValue, maximumValue]. // */ // property real stepSize: 1.0 /*! The current value of the slider. This property is not changed while the thumb is dragged unless the live property is set to true. */ property real value: 0.0 /*! Defines whether the value is updated while the thumb is dragged or just when the thumb is released. */ property bool live: false /*! \qmlproperty bool pressed Whether the Slider is currently being pressed. */ property alias pressed: mouseArea.pressed /*! The signal is emitted when there is a click on the slider. The onThumb parameter provides information if the click, was inside of the thumb element. */ signal touched(bool onThumb) /*! This function is used by the value indicator to show the current value. Reimplement this function if you want to show different information. By default, the value v is rounded to the nearest interger value. */ function formatValue(v) { return v.toFixed(0) } // Private symbols. /*! \internal */ property alias __internals: mouseArea /*! \internal */ onValueChanged: mouseArea.liveValue = slider.value activeFocusOnPress: true Binding { target: slider property: "value" value: mouseArea.liveValue when: slider.live } MouseArea { id: mouseArea anchors.fill: parent property Item bar: slider.__styleInstance ? slider.__styleInstance.bar : null property Item thumb: slider.__styleInstance ? slider.__styleInstance.thumb : null property real thumbSpacing: slider.__styleInstance ? slider.__styleInstance.thumbSpacing : 0 property real barMinusThumb: bar && thumb ? bar.width - (thumb.width + 2.0*thumbSpacing) : 0.0 property real liveValue: 0.0 property real normalizedValue: normalizedValueFromValue(liveValue) property real dragInitMouseX: 0.0 property real dragInitNormalizedValue: 0.0 property Flickable flickable: { // traverse parents to catch whether we have an ancestor Flickable var pl = slider.parent; while (pl) { if (pl.hasOwnProperty("flicking")) { return pl; } pl = pl.parent; } return null; } states: State { name: "sliding" when: mouseArea.flickable && mouseArea.pressed PropertyChanges { target: mouseArea.flickable interactive: false } } function normalizedValueFromValue(value) { if (Qt.application.layoutDirection == Qt.RightToLeft) { return MathUtils.clampAndProject(value, slider.minimumValue, slider.maximumValue, 1.0, 0.0); } else { return MathUtils.clampAndProject(value, slider.minimumValue, slider.maximumValue, 0.0, 1.0); } } function valueFromNormalizedValue(normalizedValue) { if (Qt.application.layoutDirection == Qt.RightToLeft) { return MathUtils.lerp(MathUtils.clamp(normalizedValue, 0.0, 1.0), slider.maximumValue, slider.minimumValue); } else { return MathUtils.lerp(MathUtils.clamp(normalizedValue, 0.0, 1.0), slider.minimumValue, slider.maximumValue); } } /* Mimic the behaviour of the 'pressed' property with one important difference: 'pressed' is set to true only after the onPressed handler has been executed. That prevents us from doing interesting animations upon press. */ property bool isPressed: false onPressed: { isPressed = true; var thumbPressed = mouse.x >= thumb.x && mouse.x <= thumb.x + thumb.width; if (!thumbPressed) { var normalizedX = (mouseX - thumbSpacing - thumb.width * 0.5) / barMinusThumb; liveValue = valueFromNormalizedValue(normalizedX); } dragInitMouseX = mouse.x; dragInitNormalizedValue = normalizedValue; slider.touched(thumbPressed); } onReleased: { isPressed = false; if (!slider.live) { slider.value = liveValue; } } onPositionChanged: { // Left button dragging var normalizedOffsetX = (mouseArea.mouseX - dragInitMouseX) / barMinusThumb; liveValue = valueFromNormalizedValue(dragInitNormalizedValue + normalizedOffsetX); } onClicked: slider.requestFocus(Qt.MouseFocusReason) onLiveValueChanged: if (isPressed) slider.requestFocus(Qt.MouseFocusReason) } style: Theme.createStyleComponent("SliderStyle.qml", slider) } ./src/Ubuntu/Components/1.2/AppHeader.qml0000644000015600001650000002117512700370701020142 0ustar jenkinsjenkins/* * Copyright 2013-2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 as Components /*! \internal \qmltype AppHeader \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu */ Components.StyledItem { id: header anchors { left: parent.left right: parent.right } y: 0 /*! Animate showing and hiding of the header. */ property bool animate: true /*! The background color of the divider. Value set by MainView. */ property color dividerColor /*! The background color of the panel. Value set by MainView. */ property color panelColor Behavior on y { enabled: animate && !(header.flickable && header.flickable.moving) SmoothedAnimation { duration: Components.UbuntuAnimation.BriskDuration } } /*! \internal */ onHeightChanged: { internal.checkFlickableMargins(); internal.movementEnded(); } visible: title || contents || tabsModel onVisibleChanged: { internal.checkFlickableMargins(); } enabled: header.y === 0 /*! Show the header */ function show() { // Enable the header as soon as it finished animating // to the fully visible state: header.enabled = Qt.binding(function() { return header.y === 0; }); header.y = 0; } /*! Hide the header */ function hide() { // Disable the header immediately (the update of the y-value // is delayed because of the Behavior defined on it): header.enabled = false; header.y = - header.height; } /*! The text to display in the header */ property string title: "" onTitleChanged: { header.show(); } /*! The contents of the header. If this is set, \l title will be ignored. */ property Item contents: null onContentsChanged: { header.show(); } /*! A model of tabs to represent in the header. This is automatically set by \l Tabs. */ property var tabsModel: null /*! If it is possible to pop this PageStack, a back button will be shown in the header. */ property var pageStack: null /*! \deprecated \qmlproperty list actions The list of actions actions that will be shown in the header. DEPRECATED. Use Page.head.actions instead. */ property var actions onActionsChanged: print("WARNING: Header.actions property is DEPRECATED. "+ "Use Page.head.actions instead.") /*! \internal \deprecated Action shown before the title. Setting this will disable the back button and tabs drawer button in the new header and replace it with a button representing the action below. DEPRECATED. Use Page.head.backAction property instead. */ property var __customBackAction: null // FIXME: Currently autopilot can only get visual items, but once bug #1273956 // is fixed to support non-visual items, a QtObject may be used. // --timp - 2014-03-20 Item { // FIXME: This is a workaround to be able to get the properties of // tabsModel in an autopilot test. objectName: "tabsModelProperties" property int count: tabsModel ? tabsModel.count : 0 property int selectedIndex: tabsModel ? tabsModel.selectedIndex : -1 } Item { // FIXME: This is a workaround to be able to get the properties of // the sections in an autopilot test. objectName: "sectionsProperties" property int selectedIndex: header.config ? header.config.sections.selectedIndex : -1 } /*! The flickable that controls the movement of the header. Will be set automatically by Pages inside a MainView, but can be overridden. */ property Flickable flickable: null onFlickableChanged: { internal.checkFlickableMargins(); internal.connectFlickable(); header.show(); } /*! Set by \l MainView */ property bool useDeprecatedToolbar: true /*! Configuration of the header. */ property PageHeadConfiguration config: null /*! The header is not fully opened or fully closed. This property is true if the header is animating towards a fully opened or fully closed state, or if the header is moving due to user interaction with the flickable. The value of moving is always false when using an old version of PageHeadConfiguration (which does not have the visible property). Used in tst_header_locked_visible.qml. */ readonly property bool moving: false QtObject { id: internal /*! Track the y-position inside the flickable. */ property real previousContentY: 0 /*! The previous flickable to disconnect events */ property Flickable previousFlickable: null /*! Disconnect previous flickable, and connect the new one. */ function connectFlickable() { if (previousFlickable) { previousFlickable.contentYChanged.disconnect(internal.scrollContents); previousFlickable.movementEnded.disconnect(internal.movementEnded); previousFlickable.interactiveChanged.disconnect(internal.interactiveChanged); } if (flickable) { // Connect flicking to movements of the header previousContentY = flickable.contentY; flickable.contentYChanged.connect(internal.scrollContents); flickable.movementEnded.connect(internal.movementEnded); flickable.interactiveChanged.connect(internal.interactiveChanged); flickable.contentHeightChanged.connect(internal.contentHeightChanged); } previousFlickable = flickable; } /*! Update the position of the header to scroll with the flickable. */ function scrollContents() { // Avoid updating header.y when rebounding or being dragged over the bounds. if (!flickable.atYBeginning && !flickable.atYEnd) { var deltaContentY = flickable.contentY - previousContentY; header.y = Components.MathUtils.clamp(header.y - deltaContentY, -header.height, 0); } previousContentY = flickable.contentY; } /*! Fully show or hide the header, depending on its current y. */ function movementEnded() { if (flickable && flickable.contentY < 0) header.show(); else if (header.y < -header.height/2) header.hide(); else header.show(); } /* Content height of flickable changed */ function contentHeightChanged() { if (flickable && flickable.height >= flickable.contentHeight) header.show(); } /* Flickable became interactive or non-interactive. */ function interactiveChanged() { if (flickable && !flickable.interactive) header.show(); } /* Check the topMargin of the flickable and set it if needed to avoid contents becoming unavailable behind the header. */ function checkFlickableMargins() { if (header.flickable) { var headerHeight = header.visible ? header.height : 0 if (flickable.topMargin !== headerHeight) { var previousHeaderHeight = flickable.topMargin; flickable.topMargin = headerHeight; // push down contents when header grows, // pull up contents when header shrinks. flickable.contentY -= headerHeight - previousHeaderHeight; } } } } style: header.useDeprecatedToolbar ? Theme.createStyleComponent("HeaderStyle.qml", header) : Theme.createStyleComponent("PageHeadStyle.qml", header) } ./src/Ubuntu/Components/1.2/PageWrapperUtils.js0000644000015600001650000000662512700370701021375 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ //.pragma library // FIXME: cannot refer to Component.Error if I use this. // FIXME: ideally we would make this a stateless library, but that breaks applications // that rely on accessing context variables in pages that were pushed on a PageStack // by url (PageStack.push("FileName.qml")) because of a Qt bug: // https://bugreports.qt-project.org/browse/QTBUG-31347 /*! \internal Initialize pageWrapper.object. */ function initPage(pageWrapper) { var pageComponent; if (pageWrapper.reference.createObject) { // page reference is a component pageComponent = pageWrapper.reference; } else if (typeof pageWrapper.reference == "string") { // page reference is a string (url) pageComponent = Qt.createComponent(pageWrapper.reference); } var pageObject; if (pageComponent) { if (pageComponent.status === Component.Error) { throw new Error("Error while loading page: " + pageComponent.errorString()); } else { // create the object if (pageWrapper.properties) { // initialize the object with the given properties pageObject = pageComponent.createObject(pageWrapper, pageWrapper.properties); } else { pageObject = pageComponent.createObject(pageWrapper); } pageWrapper.canDestroy = true; } } else { // page reference is an object pageObject = pageWrapper.reference; pageObject.parent = pageWrapper; pageWrapper.canDestroy = false; // copy the properties to the page object for (var prop in pageWrapper.properties) { if (pageWrapper.properties.hasOwnProperty(prop)) { pageObject[prop] = pageWrapper.properties[prop]; } } } pageWrapper.object = pageObject; return pageObject; } /*! \internal Create the page object if needed, and make the page object visible. */ function activate(pageWrapper) { if (!pageWrapper.object) { initPage(pageWrapper); } // Having the same page pushed multiple times on a stack changes // the parent of the page object. Change it back here. pageWrapper.object.parent = pageWrapper; // Some page objects are invisible initially. Make visible. pageWrapper.object.visible = true; pageWrapper.active = true; } /*! \internal Hide page object. */ function deactivate(pageWrapper) { pageWrapper.active = false; } /*! \internal Destroy the page object if pageWrapper.canDestroy is true. Do nothing if pageWrapper.canDestroy is false. */ function destroyObject(pageWrapper) { if (pageWrapper.canDestroy) { pageWrapper.object.destroy(); pageWrapper.object = null; pageWrapper.canDestroy = false; } } ./src/Ubuntu/Components/1.2/MainView12.qml0000644000015600001650000001427012700370701020171 0ustar jenkinsjenkins/* * Copyright 2012-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 as Toolkit import Ubuntu.PerformanceMetrics 1.0 import QtQuick.Window 2.2 /*! \internal */ // Documentation is in MainView.qdoc MainViewBase { id: mainView property alias automaticOrientation: canvas.automaticOrientation /*! \internal Use default property to ensure children added do not draw over the header. */ default property alias contentsItem: contents.data OrientationHelper { id: canvas automaticOrientation: false anchorToKeyboard: mainView.anchorToKeyboard // clip the contents so that it does not overlap the header Item { id: contentsClipper anchors { left: parent.left right: parent.right top: headerItem.bottom bottom: parent.bottom } // only clip when necessary // ListView headers may be positioned at the top, independent from // flickable.contentY, so do not clip depending on activePage.flickable.contentY. clip: headerItem.bottomY > 0 && internal.activePage && internal.activePage.flickable Item { id: contents anchors { fill: parent // compensate so that the actual y is always 0 topMargin: -parent.y } } } /*! The header of the MainView. Can be used to obtain the height of the header in \l Page to determine the area for the \l Page to fill. */ AppHeader { // This objectName is used in the MainView autopilot custom proxy object // in order to select the application header. objectName: "MainView_Header" id: headerItem property real bottomY: headerItem.y + headerItem.height animate: true dividerColor: Qt.darker(mainView.headerColor, 1.1) panelColor: Qt.lighter(mainView.headerColor, 1.1) title: internal.activePage ? internal.activePage.title : "" flickable: internal.activePage ? internal.activePage.flickable : null pageStack: internal.activePage ? internal.activePage.pageStack : null contents: internal.activePage ? internal.activePage.__customHeaderContents : null PageHeadConfiguration { id: defaultConfig // Used when there is no active Page, or a Page 1.0 is used which // does not have a PageHeadConfiguration. } config: internal.activePage && internal.activePage.hasOwnProperty("head") ? internal.activePage.head : defaultConfig // 'window' is defined by QML between startup and showing on the screen. // There is no signal for when it becomes available and re-declaring it is not safe. property bool windowActive: typeof window != 'undefined' onWindowActiveChanged: { window.title = headerItem.title } Connections { target: headerItem onTitleChanged: { if (headerItem.windowActive) window.title = headerItem.title } } // Use of the deprecated toolbar is no longer supported in MainView 1.2. useDeprecatedToolbar: false } Connections { target: Qt.application onActiveChanged: { if (Qt.application.active) { headerItem.animate = false; headerItem.show(); headerItem.animate = true; } } } } Object { id: internal // Even when using MainView 1.1, we still support Page 1.0. // PageBase (=Page 1.0) is the superclass of Page 1.1. property PageTreeNode activePage: isPage(mainView.activeLeafNode) ? mainView.activeLeafNode : null function isPage(item) { return item && item.hasOwnProperty("__isPageTreeNode") && item.__isPageTreeNode && item.hasOwnProperty("title") && item.hasOwnProperty("tools"); } } __propagated: QtObject { /*! \internal The header that will be propagated to the children in the page tree node. It is used by Tabs to bind header's tabsModel. */ property AppHeader header: headerItem /*! \internal The action manager that has the global context for the MainView's actions, and to which a local context can be added for each Page that has actions.actions. */ property var actionManager: mainView.actionManager /*! \internal Used by PageStack. This property only exists in MainView 1.2 and later. */ readonly property bool animateHeader: false // FIXME: Currently disabled to prevent bug 1461729 // readonly property bool animateHeader: headerItem.__styleInstance && // headerItem.__styleInstance.hasOwnProperty("animateIn") && // headerItem.__styleInstance.hasOwnProperty("animateOut") && // headerItem.__styleInstance.hasOwnProperty("animateInFinished") && // headerItem.__styleInstance.hasOwnProperty("animateOutFinished") } } ./src/Ubuntu/Components/1.2/PageHeadSections.qml0000644000015600001650000000455612700370701021463 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype PageHeadSections \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \since Ubuntu.Components 1.1 \brief PageHeadSections is used to configure the sections for a \l Page. These sections will be shown in the bottom part of the header. This component does not need to be instantiated by the developer, it is automatically part of \l PageHeadConfiguration. */ QtObject { // To be used inside PageHeadConfiguration id: sections /*! Set this property to false to disable user interaction to change the selected section. Default value: true */ property bool enabled: true /*! List of strings that represent section names. Example: \qml import Ubuntu.Components 1.2 import QtQuick 2.4 MainView { width: units.gu(50) height: units.gu(80) Page { id: page title: "Sections" head { sections { model: ["one", "two", "three"] } } Label { anchors.centerIn: parent text: "Section " + page.head.sections.selectedIndex } } } \endqml It is strongly recommended to limit the number of sections to two or three. */ property var model onModelChanged: { if (model && model.length > 3) { console.warn("It is not recommended or supported to use more than three sections in Page.head.sections.model."); } } /*! The index of the currently selected section in \l model. */ property int selectedIndex: model ? 0 : -1 } ./src/Ubuntu/Components/1.2/Object.qml0000644000015600001650000000245512700370701017517 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype Object \internal \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Internal type used for lightweight objects that can have children. */ QtObject { id: object // internal objects using nested elements, // which isn't allowed by QtObject; this fix makes this possible /*! \internal Default property to allow adding of children. */ default property alias children: object.__defaultPropertyFix /*! \internal Property list to allow adding of children. */ property list __defaultPropertyFix: [QtObject {}] //QML doesn't allow an empty list here } ./src/Ubuntu/Components/1.2/TabBar.qml0000644000015600001650000001311012700370701017432 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype TabBar \inqmlmodule Ubuntu.Components 1.1 \ingroup ubuntu \brief Tab bar that will be shown in the header when \l Tabs is active. This component does not need to be instantiated by the developer, it is automatically created by the \l Tabs. */ StyledItem { id: tabBar /*! \deprecated The \l Tabs item that tab bar belongs to. Will be automatically set by \l Tabs when the TabBar is created. */ // tabsItem is of type Tabs, but using that type would cause an include loop property Item tabsItem /*! \internal */ onTabsItemChanged: console.error("tabsItem property is deprecated. TabBar functionality no longer requires it.") /*! The model containing the tabs to be controlled by the TabBar. The tabs are visualized by the style, displaying controlling elements based on the data specified by the roles. The default style mandates the existence of either the \b title or \b tab role, but different styles may require to have other roles (e.g. image, color). The order the role existence is checked is also determined by the style component, Default style checks the existence of the \b tab role first, and if not defined will use the \b title role. */ property var model: null /*! The user is interacting with the tab bar. Depends on the style pressed property. */ readonly property bool pressed: __styleInstance !== null && __styleInstance.hasOwnProperty("pressed") ? __styleInstance.pressed : false /*! An inactive tab bar only displays the currently selected tab, and an active tab bar can be interacted with to select a tab. */ property bool selectionMode: true /*! The property holds the index of the selected Tab item. Note: Setting this property is DEPRECATED. Set the selectedIndex of the model instead. */ property int selectedIndex: (model && internal.modelChecked) ? model.selectedIndex : -1 /*! \internal */ onSelectedIndexChanged: { if (!model) return; if (tabBar.selectedIndex !== model.selectedIndex) { console.warn("Setting TabBar.selectedIndex is DEPRECATED. Set selectedIndex of the model instead"); tabBar.selectedIndex = Qt.binding(function() { return (model && internal.modelChecked) ? model.selectedIndex : -1 }); } } /*! Do not deactivate the tab bar after a specified idle time or when the user selects a new tab. Off by default. */ property bool alwaysSelectionMode: false /*! Automatically activate the tab bar when \l alwaysSelectionMode is set. */ onAlwaysSelectionModeChanged: { if (tabBar.alwaysSelectionMode) selectionMode = true; } /*! Show animations when the state changes. Default: true. */ property bool animate: true implicitHeight: units.gu(7.5) activeFocusOnPress: true style: Theme.createStyleComponent("TabBarStyle.qml", tabBar) QtObject { id: internal property bool modelChecked: true; // returns true if the roles are good, false otherwise. function checkRoles() { if (tabBar.model.count <= 0) return false; modelChecked = true; var f = tabBar.model.get(0); if (f.tab === undefined && f.title === undefined) { console.error("TabBar model must provide either tab or title role."); tabBar.model = null; return false; } if (f.tab !== undefined && f.tab.title === undefined) { console.error("TabBar model's tab role must have title property."); tabBar.model = null; return false; } return true; } } /*! \internal */ onModelChanged: { internal.modelChecked = true; if (!model) return; if (!model.hasOwnProperty("selectedIndex")) { console.error("TabBar model must have selectedIndex property defined."); tabBar.model = null; return; } if (!model.hasOwnProperty("count")) { console.error("TabBar model must have count property defined."); tabBar.model = null; return; } if (!model.hasOwnProperty("get")) { console.error("TabBar model must provide get() function."); tabBar.model = null; return; } if (model.count > 0) { if (internal.checkRoles()) { model.selectedIndex = Math.max(Math.min(model.selectedIndex, model.count - 1), 0); } } else { internal.modelChecked = false; } } Connections { target: !internal.modelChecked ? tabBar.model : null onCountChanged: internal.checkRoles(); } } ./src/Ubuntu/Components/Components.pro0000644000015600001650000000024312700370701020136 0ustar jenkinsjenkinsTEMPLATE = subdirs SUBDIRS += ListItems \ ComponentModule.pro \ Pickers \ Popups \ Styles \ Themes ./src/Ubuntu/Components/Popups/0000755000015600001650000000000012700370701016556 5ustar jenkinsjenkins./src/Ubuntu/Components/Popups/Popups.pro0000644000015600001650000000127612700370701020574 0ustar jenkinsjenkinsTARGETPATH = Ubuntu/Components/Popups QML_FILES += 1.2/ActionSelectionPopover.qml \ 1.2/ComposerSheet.qml \ 1.2/DefaultSheet.qml \ 1.2/Dialog.qml \ 1.2/internalPopupUtils.js \ 1.2/Popover.qml \ 1.2/PopupBase.qml \ 1.2/popupUtils.js \ 1.2/SheetBase.qml \ 1.3/ActionSelectionPopover.qml \ 1.3/ComposerSheet.qml \ 1.3/DefaultSheet.qml \ 1.3/Dialog.qml \ 1.3/internalPopupUtils.js \ 1.3/Popover.qml \ 1.3/PopupBase.qml \ 1.3/popupUtils.js \ 1.3/SheetBase.qml load(ubuntu_qml_module) ./src/Ubuntu/Components/Popups/1.3/0000755000015600001650000000000012700370716017065 5ustar jenkinsjenkins./src/Ubuntu/Components/Popups/1.3/SheetBase.qml0000644000015600001650000000673112700370701021444 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype SheetBase \deprecated \inqmlmodule Ubuntu.Components.Popups 1.0 \ingroup ubuntu-popups \brief Parent class of different types of sheets. Not to be used directly. \deprecated Examples: See subclasses. \b{Sheets are deprecated. Consider using \l Dialog, \l Popover or \l PageStack instead.} */ PopupBase { id: sheet Component.onCompleted: { print("WARNING: Sheets are deprecated. " + "Consider using Dialog, Popover or PageStack instead.") } /*! \qmlproperty list container Content will be put inside the foreround of the sheet. */ default property alias container: containerItem.data /*! Override the default width of the contents of the sheet. Total sheet width will be clamped between 50 grid units and the screen width. \qmlproperty real contentsWidth */ property alias contentsWidth: foreground.contentsWidth /*! Override the default height of the contents of the sheet. Total sheet height will be clamped between 40 grid units and the screen height. \qmlproperty real contentsHeight */ property alias contentsHeight: foreground.contentsHeight /*! The text shown in the header of the sheet. \qmlproperty string title */ property alias title: foreground.title /*! The property controls whether the sheet is modal or not. Modal sheets block event propagation to items under dismissArea, when non-modal ones let these events passed to these items. The default value is true. */ property bool modal: true /*! \internal */ property alias __leftButton: foreground.leftButton /*! \internal */ property alias __rightButton: foreground.rightButton fadingAnimation: UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } __foreground: foreground __eventGrabber.enabled: modal StyledItem { id: foreground activeFocusOnPress: true property string title property real contentsWidth: units.gu(64) property real contentsHeight: units.gu(40) property Button leftButton property Button rightButton y: Math.min(units.gu(15), (sheet.height - height)/2) anchors.horizontalCenter: parent.horizontalCenter property real minWidth: Math.min(units.gu(50), sheet.width) property real maxWidth: sheet.width property real minHeight: Math.min(units.gu(40), sheet.height) property real maxHeight: sheet.height Item { id: containerItem parent: foreground.__styleInstance.contentItem anchors { fill: parent margins: units.gu(1) } } styleName: "SheetForegroundStyle" } } ./src/Ubuntu/Components/Popups/1.3/DefaultSheet.qml0000644000015600001650000000636212700370701022156 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype DefaultSheet \deprecated \inherits SheetBase \inqmlmodule Ubuntu.Components.Popups 1.0 \ingroup ubuntu-popups \brief The Default Sheet allows an application to insert a content view over the focused view without disrupting the navigation pattern (tabs state or drill-down path are maintained. When the sheet is dismissed the user continues the journey from the point (s)he left it). The Default Sheet can be closed using either a "close" button (top left) or a "done" button (top right). The sheet cannot be dismissed any other way. Use the \l doneButton property to configure whether the "close" or the "done" button is used. Example: \qml import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 Item { Component { id: defaultSheet DefaultSheet { id: sheet title: "Default sheet with done button" doneButton: true Label { anchors.fill: parent text: "A default sheet with a done button." wrapMode: Text.WordWrap } onDoneClicked: PopupUtils.close(sheet) } } Button { anchors.centerIn: parent text: "default" width: units.gu(16) onClicked: PopupUtils.open(defaultSheet) } } \endqml \b{Sheets are deprecated. Consider using \l Dialog, \l Popover or \l PageStack instead.} */ SheetBase { id: sheet /*! If set, a "done" button is visible in the top right of the sheet's header, if unset a "cancel" button is available in the top left of the sheet's header. */ property bool doneButton: false /*! This handler is called when the close button is clicked. */ signal closeClicked /*! This handler is called when the done button is clicked. */ signal doneClicked __leftButton: Button { text: i18n.dtr("ubuntu-ui-toolkit", "Close") visible: !doneButton /*! \internal */ onClicked: { sheet.closeClicked(); sheet.hide(); } } __rightButton: Button { text: i18n.dtr("ubuntu-ui-toolkit", "Done") color: UbuntuColors.orange visible: doneButton /*! \internal */ onClicked: { sheet.doneClicked(); sheet.hide(); } } } ./src/Ubuntu/Components/Popups/1.3/popupUtils.js0000644000015600001650000000667212700370701021614 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \qmltype popupUtils \inqmlmodule Ubuntu.Components.Popups 1.0 \ingroup ubuntu-popups \brief Popover utility functions. */ /*! \qmlmethod popupUtils::open(popup, caller, params) The function creates and shows a popup object from either a \b Component or URL of a QML document. The caller drives the placement of the popup as well as the pointer's. The third parameter (param) can hold a series of properties configuring the popup to be opened. This can be any property defined by the popups and additional custom ones defined in derived popups. \a caller should be given when a \l ComposerSheet or \l Dialog is specified using a URL and opened inside a \b Window. If not, the application's root item will be the dismiss area. Returns a popop object, which can be closed using \l close. \qml import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 Button { onClicked: PopupUtils.open(popoverComponent, popoverButton, { 'dummy': true } ) } \endqml See \l Popover, \l ComposerSheet and \l Dialog for their respective documentation and more examples. */ function open(popup, caller, params) { var popupComponent = null; var rootObject = null; if (popup.createObject) { // popup is a component and can create an object popupComponent = popup; rootObject = QuickUtils.rootItem(popup); } else if (typeof popup === "string") { popupComponent = Qt.createComponent(popup); rootObject = (caller !== undefined) ? QuickUtils.rootItem(caller) : QuickUtils.rootItem(null); } else { print("PopupUtils.open(): "+popup+" is not a component or a link"); return null; } var popupObject; if (params !== undefined) { popupObject = popupComponent.createObject(rootObject, params); } else { popupObject = popupComponent.createObject(rootObject); } if (!popupObject) { print(popupComponent.errorString().slice(0, -1)); print("PopupUtils.open(): Failed to create the popup object."); return; } else if (popupObject.hasOwnProperty("caller") && caller) popupObject.caller = caller; // if caller is specified, connect its cleanup to the popup's close // so popups will be removed together with the caller. if (caller) caller.Component.onDestruction.connect(popupObject.__closePopup); popupObject.show(); popupObject.onVisibleChanged.connect(popupObject.__closeIfHidden); return popupObject; } /*! \qmlmethod popupUtils::close(popupObject) Closes (hides and destroys) the given popup. \qml import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 Button { onClicked: PopupUtils.close(popup) } \endqml */ function close(popupObject) { popupObject.hide(); } ./src/Ubuntu/Components/Popups/1.3/ActionSelectionPopover.qml0000644000015600001650000001270012700370701024230 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 /*! \qmltype ActionSelectionPopover \inherits Popover \inqmlmodule Ubuntu.Components.Popups 1.0 \ingroup ubuntu-popups \brief A special popover presenting actions to the user. The popover is closed automatically when the action is chosen. The actions can be given either using ActionList or as an array of action objects. The visualization of the actions is realized either using the default visualization, which is realised using list items having centered text, or using the component given as delegate. The actions are triggered with the specified target as parameter. The popover recognizes the following properties from the delegate: \list \li data properties like \b modelData, \b refModelData or \b action. When either of these is detected the popover will set their value to the action object to be visualized. \li trigger signals like \b clicked, \b accepted or \b triggered. When these are detected, the popover will automatically connect those to the action's trigger. \endlist An example presenting list of actions using ActionList: \qml ActionSelectionPopover { delegate: ListItems.Standard { text: action.text } actions: ActionList { Action { text: "Action one" onTriggered: print(text) } Action { text: "Action two" onTriggered: print(text) } } } \endqml An array of actions can be used when the actions to be presented are reused from a set of predefined actions: \qml Item { Action { id: action1 text: "Action one" onTriggered: print(text) } Action { id: action2 text: "Action two" onTriggered: print(text) } Action { id: action3 text: "Action three" onTriggered: print(text) } ActionListPopover { actions: [action1, action3] delegate: ListItems.Standard { text: action.text } } } \endqml */ Popover { id: popover /*! The property holds the object on which the action will be performed. */ property Item target /*! The property holds the list of actions to be presented. Each action triggered will use the actionHost as caller. */ property var actions /*! The property holds the delegate to visualize the action. The delegate should define one of the data holder properties recognized by the popover in order to access action data. */ property Component delegate: Empty { id: listItem Label { text: listItem.text anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } wrapMode: Text.Wrap color: theme.palette.normal.overlayText } /*! \internal */ onTriggered: popover.hide() visible: enabled && ((action === undefined) || action.visible) height: visible ? implicitHeight : 0 } grabDismissAreaEvents: false Column { id: body anchors { left: parent.left top: parent.top right: parent.right } property bool isActionsObject: (popover.actions !== undefined) && popover.actions.hasOwnProperty("actions") Repeater { id: repeater model: body.isActionsObject ? popover.actions.children : popover.actions Loader { width: body.width height: modelData.visible ? item.height : 0 sourceComponent: delegate onStatusChanged: { if (item && status == Loader.Ready) { // set model data if (item.hasOwnProperty("action")) { item.action = modelData; item.objectName = item.action.objectName + '_button'; } if (item.hasOwnProperty("refModelData")) item.refModelData = modelData; if (item.hasOwnProperty("modelData")) item.modelData = modelData; // auto-connect trigger // if the delegate is a list item, hide divider of the last one if (item.hasOwnProperty("showDivider")) item.showDivider = index < (repeater.count - 1); } } } } } } ./src/Ubuntu/Components/Popups/1.3/internalPopupUtils.js0000644000015600001650000003041012700370701023274 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ .pragma library .import Ubuntu.Components 1.3 as Toolkit // Simple positioning on the screen, not relative to a caller Item. function SimplePositioning(foreground, area, edgeMargins) { // all coordinate computation are relative inside "area". // return the x-coordinate to center item horizontally in area this.horizontalCenter = function(item) { return area.width/2 - item.width/2; } // return the y-coordinate to center item vertically in area this.verticalCenter = function(item) { return area.height/2 - item.height/2; } // check whether item fits inside area, obeying the given margins this.checkVerticalPosition = function(item, y, marginBothSides, marginOneSide) { if (y < marginBothSides) return false; if (y + item.height > area.height - marginBothSides) return false; if (marginBothSides >= marginOneSide) return true; if (y > marginOneSide) return true; if (y + item.height < area.height - marginOneSide) return true; return false; } // check whether item fits inside area, obeying the given margins this.checkHorizontalPosition = function(item, x, marginBothSides, marginOneSide) { if (x < marginBothSides) return false; if (x + item.width > area.width - marginBothSides) return false; if (marginBothSides >= marginOneSide) return true; if (x > marginOneSide) return true; if (x + item.width < area.width - marginOneSide) return true; return false; } // position foreground at the top of the screen, horizontally centered this.autoSmallScreenPortrait = function() { foreground.x = this.horizontalCenter(foreground); foreground.y = 0; } // position foreground at the left side of the screen, vertically centered this.autoSmallScreenLandscape = function() { foreground.x = 0; foreground.y = this.verticalCenter(foreground); } // position foreground centered on a large screen this.autoLargeScreen = function() { foreground.x = this.horizontalCenter(foreground); foreground.y = this.verticalCenter(foreground); } // automatically position foreground on the screen this.auto = function(margin) { if (foreground.width >= area.width - 2*edgeMargins) { // the popover uses (almost) the full width of the screen this.autoSmallScreenPortrait(); return; } if (foreground.height >= area.height - 2*edgeMargins) { // the popover uses (almost) the full height of the screen this.autoSmallScreenLandscape(); return; } this.autoLargeScreen(); } } // caller is optional. // if caller is given, pointer and callerMargins must be specified, otherwise they are ignored. function CallerPositioning(foreground, pointer, area, caller, pointerTarget, edgeMargins, callerMargins) { var simplePos = new SimplePositioning(foreground, area, edgeMargins); // -1 values are not relevant. // return y-coordinate to position item a distance of margin above caller this.above = function(item, margin, anchorItem) { return area.mapFromItem(anchorItem, -1, 0).y - (item ? item.height : 0) - margin; } // return y-coordinate to position item a distance of margin below caller this.below = function(item, margin, anchorItem) { return area.mapFromItem(anchorItem, -1, anchorItem.height).y + margin; } // return x-coordinate to position item a distance of margin left of caller this.left = function(item, margin, anchorItem) { return area.mapFromItem(anchorItem, 0, -1).x - (item ? item.width : 0) - margin; } // return x-coodinate to position item a distance of margin right of caller this.right = function(item, margin, anchorItem) { return area.mapFromItem(anchorItem, anchorItem.width, -1).x + margin; } // return x-coordinate to align center of item horizontally with center of caller this.horizontalAlign = function(item, anchorItem) { var x = area.mapFromItem(anchorItem, anchorItem.width/2, -1).x - item.width/2; return Toolkit.MathUtils.clamp(x, edgeMargins, area.width - item.width - edgeMargins); } // return y-coordinate to align center of item vertically with center of caller this.verticalAlign = function(item, anchorItem) { var y = area.mapFromItem(anchorItem, -1, anchorItem.height/2).y - item.height/2; return Toolkit.MathUtils.clamp(y, edgeMargins, area.height - item.height - edgeMargins); } this.closestToHorizontalCenter = function(anchorItem, margin) { var center = area.mapFromItem(anchorItem, anchorItem.width/2, -1).x; return Toolkit.MathUtils.clamp(center, edgeMargins + margin, area.width - (edgeMargins + margin)); } this.closestToVerticalCenter = function(anchorItem, margin) { var center = area.mapFromItem(anchorItem, -1, anchorItem.height/2).y; return Toolkit.MathUtils.clamp(center, edgeMargins + margin, area.height - (edgeMargins + margin)); } // position foreground and pointer automatically on a small screen in portrait mode this.autoSmallScreenPortrait = function() { if (!caller) { simplePos.autoSmallScreenPortrait(); pointer.direction = "none"; return; } foreground.x = simplePos.horizontalCenter(foreground); var ycoord = this.above(foreground, callerMargins + pointer.size, caller); if (simplePos.checkVerticalPosition(foreground, ycoord, 0, area.height/4)) { foreground.y = ycoord; pointer.direction = "down"; pointer.y = this.above(null, callerMargins, caller); pointer.x = this.closestToHorizontalCenter(pointerTarget, pointer.horizontalMargin); return; } ycoord = this.below(foreground, callerMargins + pointer.size, caller); if (simplePos.checkVerticalPosition(foreground, ycoord, 0, area.height/4)) { foreground.y = ycoord; pointer.direction = "up"; pointer.y = this.below(null, callerMargins, caller); pointer.x = this.closestToHorizontalCenter(pointerTarget, pointer.horizontalMargin); return; } simplePos.autoSmallScreenPortrait(); pointer.direction = "none"; } // position foreground and pointer automatically on a small screen in landscape mode. this.autoSmallScreenLandscape = function() { if (!caller) { simplePos.autoSmallScreenLandscape(); pointer.direction = "none"; return; } foreground.y = simplePos.verticalCenter(foreground); var xcoord = this.left(foreground, callerMargins + pointer.size, caller); if (simplePos.checkHorizontalPosition(foreground, xcoord, 0, area.width/4)) { foreground.x = xcoord; pointer.direction = "right"; pointer.x = this.left(null, callerMargins, caller); pointer.y = this.closestToVerticalCenter(pointerTarget, pointer.verticalMargin); return; } xcoord = this.right(foreground, callerMargins + pointer.size, caller); if (simplePos.checkHorizontalPosition(foreground, xcoord, 0, area.width/4)) { foreground.x = xcoord; pointer.direction = "left"; pointer.x = this.right(null, callerMargins, caller); pointer.y = this.closestToVerticalCenter(pointerTarget, pointer.verticalMargin); return; } // position at the left of the screen simplePos.autoSmallScreenLandscape(); pointer.direction = "none"; } // position foreground and pointer above caller; the pointer's y will be aligned // to the caller, and x to the pointerTarget this.positionAbove = function() { var coord = this.above(foreground, callerMargins + pointer.size, caller); if (simplePos.checkVerticalPosition(foreground, coord, edgeMargins, 0)) { foreground.y = coord; foreground.x = this.horizontalAlign(foreground, caller); pointer.direction = "down"; pointer.y = this.above(null, callerMargins, caller); pointer.x = this.closestToHorizontalCenter(pointerTarget, pointer.horizontalMargin); return true; } return false; } // position foreground and pointer below caller; the pointer's y will be aligned // to the caller, and x to the pointerTarget this.positionBelow = function() { var coord = this.below(foreground, callerMargins + pointer.size, caller); if (simplePos.checkVerticalPosition(foreground, coord, edgeMargins, 0)) { foreground.y = coord; foreground.x = this.horizontalAlign(foreground, caller); pointer.direction = "up"; pointer.y = this.below(null, callerMargins, caller); pointer.x = this.closestToHorizontalCenter(pointerTarget, pointer.horizontalMargin); return true; } return false; } // position foreground and pointer in front of caller; the pointer's x will be aligned // to the caller, and y to the pointerTarget this.positionInFront = function() { var coord = this.left(foreground, callerMargins + pointer.size, caller); if (simplePos.checkHorizontalPosition(foreground, coord, edgeMargins, 0)) { foreground.x = coord; foreground.y = this.verticalAlign(foreground, caller); pointer.direction = "right"; pointer.x = this.left(null, callerMargins, caller); pointer.y = this.closestToVerticalCenter(pointerTarget, pointer.verticalMargin); return true; } return false; } // position foreground and pointer behind caller; the pointer's x will be aligned // to the caller, and y to the pointerTarget this.positionBehind = function() { var coord = this.right(foreground, callerMargins + pointer.size, caller) if (simplePos.checkHorizontalPosition(foreground, coord, edgeMargins, 0)) { foreground.x = coord; foreground.y = this.verticalAlign(foreground, caller); pointer.direction = "left"; pointer.x = this.right(null, callerMargins, caller); pointer.y = this.closestToVerticalCenter(pointerTarget, pointer.verticalMargin); return true; } return false; } // position foreground and pointer automatically on a large screen. this.autoLargeScreen = function() { if (!caller) { simplePos.autoLargeScreen(); pointer.direction = "none"; return; } // position with the following priorities: above, below, right, left. var order = ["positionAbove", "positionBelow", "positionBehind", "positionInFront"]; for (var i = 0; i < order.length; i++) { if (this[order[i]]()) return; } // not enough space on any of the sides to fit within the margins. simplePos.autoLargeScreen(); pointer.direction = "none"; } this.auto = function() { // area may be null some times... if (!area) return; if (!pointerTarget) pointerTarget = caller; if (foreground.width >= area.width - 2*edgeMargins) { // the popover uses (almost) the full width of the screen this.autoSmallScreenPortrait(); return; } if (foreground.height >= area.height - 2*edgeMargins) { // the popover uses (almost) the full height of the screen this.autoSmallScreenLandscape(); return; } this.autoLargeScreen(); } } ./src/Ubuntu/Components/Popups/1.3/Popover.qml0000644000015600001650000002611212700370714021232 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import "internalPopupUtils.js" as InternalPopupUtils import Ubuntu.Components 1.3 /*! \qmltype Popover \inherits PopupBase \inqmlmodule Ubuntu.Components.Popups 1.0 \ingroup ubuntu-popups \brief A popover allows an application to present additional content without changing the view. A popover has a fixed width and automatic height, depending on is contents. It can be closed by clicking anywhere outside of the popover area. \l {https://design.ubuntu.com/apps/building-blocks/dialog#popover}{See also the Design Guidelines on Popovers}. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem import Ubuntu.Components.Popups 1.3 Rectangle { color: theme.palette.normal.background width: units.gu(80) height: units.gu(80) Component { id: popoverComponent Popover { id: popover Column { id: containerLayout anchors { left: parent.left top: parent.top right: parent.right } ListItem.Header { text: "Standard list items" } ListItem.Standard { text: "Do something" } ListItem.Standard { text: "Do something else" } ListItem.Header { text: "Buttons" } ListItem.SingleControl { highlightWhenPressed: false control: Button { text: "Do nothing" anchors { fill: parent margins: units.gu(1) } } } ListItem.SingleControl { highlightWhenPressed: false control: Button { text: "Close" anchors { fill: parent margins: units.gu(1) } onClicked: PopupUtils.close(popover) } } } } } Button { id: popoverButton anchors.centerIn: parent text: "open" onClicked: PopupUtils.open(popoverComponent, popoverButton) } } \endqml */ PopupBase { id: popover /*! \qmlproperty list container Content will be put inside the foreround of the Popover. */ default property alias container: containerItem.data /*! \qmlproperty real contentWidth Use this property to override the default content width. */ property alias contentWidth: foreground.width /*! \qmlproperty real contentHeight Use this property to override the default content height. */ property alias contentHeight: foreground.height /*! The Item such as a \l Button that the user interacted with to open the Dialog. This property will be used for the automatic positioning of the Dialog next to the caller, if possible. */ property Item caller /*! The property holds the item to which the pointer should be anchored to. This can be same as the caller or any child of the caller. By default the property is set to caller. */ property Item pointerTarget: caller /*! The property holds the margins from the popover's dismissArea. The property is themed. */ property real edgeMargins: foreground.square ? 0 : units.gu(2) /*! The property holds the margin from the popover's caller. The property is themed. */ property real callerMargin: 0 /*! The property drives the automatic closing of the Popover when user taps on the dismissArea. The default behavior is to close the Popover, therefore set to true. When set to false, closing the Popover is the responsibility of the caller. Also, the mouse and touch events are not blocked from the dismissArea. */ property bool autoClose: true /*! \qmlproperty Component foregroundStyle Exposes the style property of the \l StyledItem contained in the Popover. Refer to \l StyledItem how to use it. */ property alias foregroundStyle: foreground.style /*! Make the popover visible. Reparent to the background area object first if needed. Only use this function if you handle memory management. Otherwise use PopupUtils.open() to do it automatically. */ function show() { /* Cannot call parent's show() however PopupBase::show() does not do anything useful to us. https://bugreports.qt-project.org/browse/QTBUG-25942 http://qt-project.org/forums/viewthread/19577 */ visible = true; foreground.show(); foreground.forceActiveFocus(); } /*! Hide the popover. Only use this function if you handle memory management. Otherwise use PopupUtils.close() to do it automatically. */ function hide() { foreground.hide(); } Component.onCompleted: foreground.hideCompleted.connect(popover.__makeInvisible) /*! \internal */ function __makeInvisible() { visible = false; } QtObject { id: internal property bool portrait: width < height // private function updatePosition() { if (pointerTarget && pointerTarget.parent && popover.parent) popover.y = (popover.parent.height - popover.height) / 2; var pos = new InternalPopupUtils.CallerPositioning(foreground, pointer, dismissArea, caller, pointerTarget, edgeMargins, callerMargin); pos.auto(); } } __foreground: foreground __eventGrabber.enabled: autoClose __closeOnDismissAreaPress: true y: parent ? (parent.height - height) / 2 : 0 /*! \qmlproperty ThemeSettings theme \since Ubuntu.Components 1.3 Configure the theme of the Popover foreground and all its subcomponents. \sa StyledItem::theme, Dialog::theme */ property alias theme: foreground.theme /*! \qmlproperty string styleName The style name of the foreground of the Popover. \since Ubuntu.Components 1.3 \sa StyledItem::styleName */ property alias styleName: foreground.styleName /*! \qmlproperty Component style The style of the foreground of the Popover. This property takes precedence over \l styleName \since Ubuntu.Components 1.3 \sa StyledItem::style */ property alias style: foreground.style StyledItem { id: foreground objectName: "popover_foreground" Keys.onEscapePressed: hideCompleted() //styling properties property real minimumWidth: units.gu(40) property real maxWidth: dismissArea ? (internal.portrait ? dismissArea.width : dismissArea.width * 3/4) : 0.0 property real maxHeight: dismissArea ? (internal.portrait ? dismissArea.height * 3/4 : dismissArea.height) : 0.0 width: Math.min(minimumWidth, maxWidth) height: containerItem.height Item { id: containerItem parent: foreground.__styleInstance.contentItem anchors { left: parent.left top: parent.top right: parent.right } height: childrenRect.height // put the PopupContext inside the container to save one step // in the context lookup PopupContext { id: popupContext objectName: popover.objectName + "PopupContext" active: foreground.visible } } onWidthChanged: internal.updatePosition() onHeightChanged: internal.updatePosition() property point target: Qt.point(pointer.x - x, pointer.y - y) property string direction: pointer.direction property bool clipContent: true property bool square: popover.hasOwnProperty("square") ? popover.square : false signal show() signal hide() signal showCompleted() signal hideCompleted() styleName: "PopoverForegroundStyle" } QtObject { id: pointer /* Input variables for InternalPopupUtils are the properties: - horizontalMargin - verticalMargin - size Output variables of InternalPopupUtils are the properties: - x - y - direction */ property real arrowSize: units.dp(15) property real cornerSize: units.dp(11) /* Minimum distance between the top or bottom of the popup and the tip of the pointer when the direction is left or right. */ property real horizontalMargin: arrowSize/2.0 + cornerSize /* Minimum distance between the left or right of the popup and the tip of the pointer when the direction is up or down. */ property real verticalMargin: arrowSize/2.0 + cornerSize /* Either: - distance between the left or right of the popup and the tip of the pointer when the direction is left or right. - distance between the top or bottom of the popup and the tip of the pointer when the direction is up or down. */ property real size: units.dp(6) property real x property real y property string direction } /*! \internal */ onCallerChanged: internal.updatePosition() /*! \internal */ onPointerTargetChanged: internal.updatePosition() /*! \internal */ onWidthChanged: internal.updatePosition() /*! \internal */ onHeightChanged: internal.updatePosition() /*! \internal */ onRotatingChanged: hide() Connections { target: pointerTarget onXChanged: internal.updatePosition() onYChanged: internal.updatePosition() onWidthChanged: internal.updatePosition() onHeightChanged: internal.updatePosition() } } ./src/Ubuntu/Components/Popups/1.3/Dialog.qml0000644000015600001650000002232412700370714021000 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import "internalPopupUtils.js" as InternalPopupUtils /*! \qmltype Dialog \inherits PopupBase \inqmlmodule Ubuntu.Components.Popups 1.0 \ingroup ubuntu-popups \brief The Dialog caters for cases in which the application requires the user to determine between optional actions. The Dialog will interrupt the user flow and lock the view for further interaction before the user has selected a desired action. It can only be closed by selecting an optional action confirming or cancelling the operation. \l {http://design.ubuntu.com/apps/building-blocks/dialog}{See also the Design Guidelines on Dialogs}. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 Item { width: units.gu(80) height: units.gu(80) Component { id: dialog Dialog { id: dialogue title: "Save file" text: "Are you sure that you want to save this file?" Button { text: "cancel" onClicked: PopupUtils.close(dialogue) } Button { text: "overwrite previous version" color: UbuntuColors.orange onClicked: PopupUtils.close(dialogue) } Button { text: "save a copy" color: UbuntuColors.orange onClicked: PopupUtils.close(dialogue) } } } Button { anchors.centerIn: parent id: saveButton text: "save" onClicked: PopupUtils.open(dialog) } } \endqml */ PopupBase { id: dialog /*! \qmlproperty list contents Content will be put inside a column in the foreround of the Dialog. */ default property alias contents: contentsColumn.data /*! The title of the question to ask the user. \qmlproperty string title */ property alias title: foreground.title /*! The question to the user. \qmlproperty string text */ property alias text: foreground.text /*! \deprecated The Item such as a \l Button that the user interacted with to open the Dialog. This property will be used for the automatic positioning of the Dialog next to the caller, if possible. */ property Item caller onCallerChanged: console.warn("'caller' is DEPRECATED. It has no effect.") /*! The property holds the margins from the dialog's dismissArea. The property is themed. */ property real edgeMargins: units.gu(2) /*! The property holds the margin from the dialog's caller. The property is themed. */ property real callerMargin: units.gu(1) /*! The property controls whether the dialog is modal or not. Modal dialogs block event propagation to items under dismissArea, when non-modal ones let these events passed to these items. In addition, non-modal dialogs do not dim the dismissArea. The default value is true. */ property bool modal: true /*! \qmlproperty real contentWidth \since Ubuntu.Components 1.3 Specifies the width of the dialog content. */ property alias contentWidth: foreground.width /*! \qmlproperty real contentHeight \since Ubuntu.Components 1.3 Specifies the height of the dialog content. */ property alias contentHeight: foreground.height /*! \qmlproperty ThemeSettings theme \since Ubuntu.Components 1.3 Configure the theme of the Dialog foreground and all its subcomponents. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 MainView { width: units.gu(40) height: units.gu(71) // make sure the main theme is Ambiance theme.name: "Ubuntu.Components.Themes.Ambiance" Component { id: dialogComponent Dialog { id: dialog title: "Input dialog" // the dialog and its children will use SuruDark theme: ThemeSettings { name: "Ubuntu.Components.Themes.SuruDark" } TextField { placeholderText: "enter text" } Button { text: "Close" onClicked: PopupUtils.close(dialog) } } } Button { text: "Open dialog" onClicked: PopupUtils.open(dialogComponent) } } \endqml \sa StyledItem::theme */ property alias theme: foreground.theme /*! \qmlproperty string styleName The style name of the foreground of the Dialog. \since Ubuntu.Components 1.3 \sa StyledItem::styleName */ property alias styleName: foreground.styleName /*! \qmlproperty Component style The style of the foreground of the Dialog. This property takes precedence over \l styleName \since Ubuntu.Components 1.3 \sa StyledItem::style */ property alias style: foreground.style __foreground: foreground __eventGrabber.enabled: modal __dimBackground: modal fadingAnimation: UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } StyledItem { id: foreground // Grab focus when Dialog is shown focus: visible width: Math.min(minimumWidth, dialog.width) anchors.centerIn: parent clip: true objectName: 'dialogForeground' // used in the style property string title property string text property real minimumWidth: units.gu(38) property real minimumHeight: units.gu(32) property real maxHeight: 3*dialog.height/4 property real margins: units.gu(4) property real itemSpacing: units.gu(2) property Item dismissArea: dialog.dismissArea property real keyboardHeight: dialog.anchorToKeyboard && UbuntuApplication.inputMethod.visible ? UbuntuApplication.inputMethod.keyboardRectangle.height : 0 height: Math.min(contentsColumn.height + foreground.margins, dialog.height - keyboardHeight) Keys.onEscapePressed: dialog.hide() Flickable { anchors.fill: parent anchors.margins: foreground.margins contentWidth: contentsColumn.width contentHeight: contentsColumn.height - foreground.margins boundsBehavior: Flickable.StopAtBounds Column { id: contentsColumn spacing: foreground.itemSpacing width: foreground.width - foreground.margins * 2 height: childrenRect.height + foreground.margins onWidthChanged: updateChildrenWidths(); // put the context into this component to save ActionContext lookup PopupContext { id: localContext objectName: dialog.objectName + "DialogContext" active: foreground.visible } Label { horizontalAlignment: Text.AlignHCenter text: dialog.title wrapMode: Text.Wrap maximumLineCount: 2 elide: Text.ElideRight textSize: Label.Large color: theme.palette.normal.overlayText visible: (text !== "") } Label { horizontalAlignment: Text.AlignHCenter text: dialog.text color: theme.palette.normal.overlayText wrapMode: Text.Wrap visible: (text !== "") } onChildrenChanged: updateChildrenWidths() function updateChildrenWidths() { for (var i = 0; i < children.length; i++) { children[i].width = contentsColumn.width; } } } } styleName: "DialogForegroundStyle" Component.onCompleted: foreground.forceActiveFocus() } } ./src/Ubuntu/Components/Popups/1.3/PopupBase.qml0000644000015600001650000002017212700370701021472 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype PopupBase \inqmlmodule Ubuntu.Components.Popups 1.0 \ingroup ubuntu-popups \brief The base class for all dialogs, sheets and popovers. Do not use directly. Examples: See subclasses. */ OrientationHelper { id: popupBase /*! The property holds the area used to dismiss the popups, the area from where mouse and touch events will be grabbed. By default this area is the Popup itself. */ property Item dismissArea: popupBase /*! The property specifies whether to forward or not the mouse and touch events happening outside of the popover. By default all events are grabbed. */ property bool grabDismissAreaEvents: true /*! \internal FIXME: publish this property once agreed */ property PropertyAnimation fadingAnimation: PropertyAnimation{duration: 0} // without specifying width and height below, some width calculations go wrong in Sheet. // I guess popupBase.width is not correctly set initially width: parent ? parent.width : undefined height: parent ? parent.height : undefined // copy value of automaticOrientation from root object (typically a MainView) automaticOrientation: stateWrapper.rootItem && stateWrapper.rootItem.automaticOrientation ? stateWrapper.rootItem.automaticOrientation : false anchorToKeyboard: true LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft LayoutMirroring.childrenInherit: true /*! Make the popup visible. Reparent to the background area object first if needed. Only use this function if you handle memory management. Otherwise use PopupUtils.open() to do it automatically. */ function show() { if ((typeof popupBase["reparentToRootItem"]) === "boolean") { // So the property exists. Let's use it then. if (reparentToRootItem) { parent = stateWrapper.rootItem; } } else { // The property does not exist. Default is to reparent parent = stateWrapper.rootItem; } if (!dismissArea) { dismissArea = parent } // Without setting the parent, mapFromItem() breaks in internalPopupUtils. stateWrapper.state = 'opened'; } /*! Hide the popup. Only use this function if you handle memory management. Otherwise use PopupUtils.close() to do it automatically. */ function hide() { stateWrapper.state = 'closed'; } /*! \internal When the popup is created by calling PopupUtils.open(), onVisibleChanged is connected to __closeIfHidden(). */ function __closeIfHidden() { if (!visible) __closePopup(); } /*! \internal The function closes the popup. This is called when popup's caller is no longer valid. */ function __closePopup() { if (popupBase !== undefined) { popupBase.destroy(); } } /*! \internal Foreground component excluded from InverseMouseArea */ property Item __foreground /*! \internal Set to true if the InverseMouseArea should dismiss the area */ property bool __closeOnDismissAreaPress: false /*! \internal Property driving dimming the popup's background. The default is the same as defined in the style */ property alias __dimBackground: background.dim /*! \internal Property to control dismissArea event capture. */ property alias __eventGrabber: eventGrabber // dimmer Rectangle { id: background // styling properties property bool dim: false anchors.fill: parent visible: dim color: popupBase.width > units.gu(60) ? Qt.rgba(0, 0, 0, 0.6) : Qt.rgba(0, 0, 0, 0.9) } InverseMouseArea { id: eventGrabber enabled: true acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton anchors.fill: __foreground sensingArea: dismissArea propagateComposedEvents: !grabDismissAreaEvents onPressed: if (__closeOnDismissAreaPress) popupBase.hide() onWheel: wheel.accepted = true } MouseArea { acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton anchors.fill: __foreground onWheel: wheel.accepted = true } // set visible as false by default visible: false opacity: 0.0 /*! \internal */ onVisibleChanged: stateWrapper.state = (visible) ? 'opened' : 'closed' /*! \internal */ onParentChanged: stateWrapper.rootItem = QuickUtils.rootItem(popupBase) Component.onCompleted: { stateWrapper.saveActiveFocus(); stateWrapper.rootItem = QuickUtils.rootItem(popupBase); } Item { id: stateWrapper property Item rootItem: QuickUtils.rootItem(popupBase) property bool windowIsValid: typeof window != "undefined" property Item prevFocus function saveActiveFocus() { // 'window' context property is exposed to QML after component completion // before rendering is complete, therefore a simple 'if (window)' check is // not enough. if (windowIsValid) { prevFocus = window.activeFocusItem; windowIsValidChanged.disconnect(saveActiveFocus); } else { // connect the function so we can save the original focus item windowIsValidChanged.connect(saveActiveFocus); } } function restoreActiveFocus() { if (prevFocus) { if (prevFocus.hasOwnProperty("requestFocus")) { prevFocus.requestFocus(Qt.OtherFocusReason); } else { prevFocus.forceActiveFocus(Qt.OtherFocusReason); } } } states: [ State { name: 'closed' extend: '' }, State { name: 'opened' } ] transitions: [ Transition { from: "*" to: "opened" SequentialAnimation { ScriptAction { script: popupBase.visible = true } NumberAnimation { target: popupBase property: "opacity" from: 0.0 to: 1.0 duration: fadingAnimation.duration easing: fadingAnimation.easing } } }, Transition { from: "opened" to: "closed" SequentialAnimation { NumberAnimation { target: popupBase property: "opacity" from: 1.0 to: 0.0 duration: fadingAnimation.duration easing: fadingAnimation.easing } ScriptAction { script: { popupBase.visible = false; if (eventGrabber.enabled) { stateWrapper.restoreActiveFocus(); } } } } } ] } } ./src/Ubuntu/Components/Popups/1.3/ComposerSheet.qml0000644000015600001650000000614612700370701022361 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \qmltype ComposerSheet \inherits SheetBase \inqmlmodule Ubuntu.Components.Popups 1.0 \deprecated \ingroup ubuntu-popups \brief Much like the \l DefaultSheet the Composer Sheet allows an application to insert a content view over the focused view without disrupting the navigation pattern. However the Composer Sheet is optimised for scenarios in which user content is at risk of corruption, most often (but not solely) when creating or editing content (e.g compose new message). There are two ways to dismiss it: user confirming the manipulation or user cancelling the manipulation, using the "confirm" and "cancel" buttons shown in the right and left side of the composer header. Example: \qml import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 Item { Component { id: composerSheet ComposerSheet { id: sheet title: "Composer sheet" Label { text: "A composer sheet has cancel and confirm buttons." } onCancelClicked: PopupUtils.close(sheet) onConfirmClicked: PopupUtils.close(sheet) } } Button { anchors.centerIn: parent text: "composer" width: units.gu(16) onClicked: PopupUtils.open(composerSheet) } } \endqml \b{Sheets are deprecated. Consider using \l Dialog, \l Popover or \l PageStack instead.} */ SheetBase { id: composer /*! The user clicked the "cancel" button. */ signal cancelClicked /*! The user clicked the "confirm" button. */ signal confirmClicked __leftButton: Button { text: i18n.dtr("ubuntu-ui-toolkit", "Cancel") objectName: "cancelButton" /*! \internal */ // avoid warning when generating documentation onClicked: { composer.cancelClicked(); composer.hide(); } } __rightButton: Button { text: i18n.dtr("ubuntu-ui-toolkit", "Confirm") objectName: "confirmButton" color: UbuntuColors.orange /*! \internal */ // avoid warning when generating documentation onClicked: { composer.confirmClicked(); composer.hide(); } } } ./src/Ubuntu/Components/Popups/1.2/0000755000015600001650000000000012700370701017056 5ustar jenkinsjenkins./src/Ubuntu/Components/Popups/1.2/SheetBase.qml0000644000015600001650000000675412700370701021450 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype SheetBase \deprecated \inqmlmodule Ubuntu.Components.Popups 1.0 \ingroup ubuntu-popups \brief Parent class of different types of sheets. Not to be used directly. Examples: See subclasses. \b{Sheets are deprecated. Consider using \l Dialog, \l Popover or \l PageStack instead.} */ PopupBase { id: sheet Component.onCompleted: { print("WARNING: Sheets are deprecated. " + "Consider using Dialog, Popover or PageStack instead.") } /*! \qmlproperty list container Content will be put inside the foreround of the sheet. */ default property alias container: containerItem.data /*! Override the default width of the contents of the sheet. Total sheet width will be clamped between 50 grid units and the screen width. \qmlproperty real contentsWidth */ property alias contentsWidth: foreground.contentsWidth /*! Override the default height of the contents of the sheet. Total sheet height will be clamped between 40 grid units and the screen height. \qmlproperty real contentsHeight */ property alias contentsHeight: foreground.contentsHeight /*! The text shown in the header of the sheet. \qmlproperty string title */ property alias title: foreground.title /*! The property controls whether the sheet is modal or not. Modal sheets block event propagation to items under dismissArea, when non-modal ones let these events passed to these items. The default value is true. */ property bool modal: true /*! \internal */ property alias __leftButton: foreground.leftButton /*! \internal */ property alias __rightButton: foreground.rightButton fadingAnimation: UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } __foreground: foreground __eventGrabber.enabled: modal StyledItem { id: foreground activeFocusOnPress: true property string title property real contentsWidth: units.gu(64) property real contentsHeight: units.gu(40) property Button leftButton property Button rightButton y: Math.min(units.gu(15), (sheet.height - height)/2) anchors.horizontalCenter: parent.horizontalCenter property real minWidth: Math.min(units.gu(50), sheet.width) property real maxWidth: sheet.width property real minHeight: Math.min(units.gu(40), sheet.height) property real maxHeight: sheet.height Item { id: containerItem parent: foreground.__styleInstance.contentItem anchors { fill: parent margins: units.gu(1) } } style: Theme.createStyleComponent("SheetForegroundStyle.qml", sheet) } } ./src/Ubuntu/Components/Popups/1.2/DefaultSheet.qml0000644000015600001650000000636212700370701022155 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype DefaultSheet \deprecated \inherits SheetBase \inqmlmodule Ubuntu.Components.Popups 1.0 \ingroup ubuntu-popups \brief The Default Sheet allows an application to insert a content view over the focused view without disrupting the navigation pattern (tabs state or drill-down path are maintained. When the sheet is dismissed the user continues the journey from the point (s)he left it). The Default Sheet can be closed using either a "close" button (top left) or a "done" button (top right). The sheet cannot be dismissed any other way. Use the \l doneButton property to configure whether the "close" or the "done" button is used. Example: \qml import Ubuntu.Components 1.2 import Ubuntu.Components.Popups 1.0 Item { Component { id: defaultSheet DefaultSheet { id: sheet title: "Default sheet with done button" doneButton: true Label { anchors.fill: parent text: "A default sheet with a done button." wrapMode: Text.WordWrap } onDoneClicked: PopupUtils.close(sheet) } } Button { anchors.centerIn: parent text: "default" width: units.gu(16) onClicked: PopupUtils.open(defaultSheet) } } \endqml \b{Sheets are deprecated. Consider using \l Dialog, \l Popover or \l PageStack instead.} */ SheetBase { id: sheet /*! If set, a "done" button is visible in the top right of the sheet's header, if unset a "cancel" button is available in the top left of the sheet's header. */ property bool doneButton: false /*! This handler is called when the close button is clicked. */ signal closeClicked /*! This handler is called when the done button is clicked. */ signal doneClicked __leftButton: Button { text: i18n.dtr("ubuntu-ui-toolkit", "Close") visible: !doneButton /*! \internal */ onClicked: { sheet.closeClicked(); sheet.hide(); } } __rightButton: Button { text: i18n.dtr("ubuntu-ui-toolkit", "Done") color: UbuntuColors.orange visible: doneButton /*! \internal */ onClicked: { sheet.doneClicked(); sheet.hide(); } } } ./src/Ubuntu/Components/Popups/1.2/popupUtils.js0000644000015600001650000000530712700370701021605 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! The function opens a popup object which can be either a Component or in a separate QML document. The caller drives the Popup's and Dialog's placement as well as the pointer's. The third parameter (param) can hold a series of properties configuring the popup to be opened. This can be any property defined by the popups and additional custom ones defined in derived popups. caller parameter must be given when the Sheet or Dialog is specified using url and opened inside a Window component. If not, the Sheet or Dialog will use the application's root item as dismiss area. */ function open(popup, caller, params) { var popupComponent = null; var rootObject = null; if (popup.createObject) { // popup is a component and can create an object popupComponent = popup; rootObject = QuickUtils.rootItem(popup); } else if (typeof popup === "string") { popupComponent = Qt.createComponent(popup); rootObject = (caller !== undefined) ? QuickUtils.rootItem(caller) : QuickUtils.rootItem(null); } else { print("PopupUtils.open(): "+popup+" is not a component or a link"); return null; } var popupObject; if (params !== undefined) { popupObject = popupComponent.createObject(rootObject, params); } else { popupObject = popupComponent.createObject(rootObject); } if (!popupObject) { print(popupComponent.errorString().slice(0, -1)); print("PopupUtils.open(): Failed to create the popup object."); return; } else if (popupObject.hasOwnProperty("caller") && caller) popupObject.caller = caller; // if caller is specified, connect its cleanup to the popup's close // so popups will be removed together with the caller. if (caller) caller.Component.onDestruction.connect(popupObject.__closePopup); popupObject.show(); popupObject.onVisibleChanged.connect(popupObject.__closeIfHidden); return popupObject; } /*! Closes (hides and destroys) the given popup. */ function close(popupObject) { popupObject.hide(); } ./src/Ubuntu/Components/Popups/1.2/ActionSelectionPopover.qml0000644000015600001650000001270212700370701024231 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 /*! \qmltype ActionSelectionPopover \inherits Popover \inqmlmodule Ubuntu.Components.Popups 1.0 \ingroup ubuntu-popups \brief A special popover presenting actions to the user. The popover is closed automatically when the action is chosen. The actions can be given either using ActionList or as an array of action objects. The visualization of the actions is realized either using the default visualization, which is realised using list items having centered text, or using the component given as delegate. The actions are triggered with the specified target as parameter. The popover recognizes the following properties from the delegate: \list \li data properties like \b modelData, \b refModelData or \b action. When either of these is detected the popover will set their value to the action object to be visualized. \li trigger signals like \b clicked, \b accepted or \b triggered. When these are detected, the popover will automatically connect those to the action's trigger. \endlist An example presenting list of actions using ActionList: \qml ActionSelectionPopover { delegate: ListItems.Standard { text: action.text } actions: ActionList { Action { text: "Action one" onTriggered: print(text) } Action { text: "Action two" onTriggered: print(text) } } } \endqml An array of actions can be used when the actions to be presented are reused from a set of predefined actions: \qml Item { Action { id: action1 text: "Action one" onTriggered: print(text) } Action { id: action2 text: "Action two" onTriggered: print(text) } Action { id: action3 text: "Action three" onTriggered: print(text) } ActionListPopover { actions: [action1, action3] delegate: ListItems.Standard { text: action.text } } } \endqml */ Popover { id: popover /*! The property holds the object on which the action will be performed. */ property Item target /*! The property holds the list of actions to be presented. Each action triggered will use the actionHost as caller. */ property var actions /*! The property holds the delegate to visualize the action. The delegate should define one of the data holder properties recognized by the popover in order to access action data. */ property Component delegate: Empty { id: listItem Label { text: listItem.text anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } wrapMode: Text.Wrap color: Theme.palette.normal.overlayText } /*! \internal */ onTriggered: popover.hide() visible: enabled && ((action === undefined) || action.visible) height: visible ? implicitHeight : 0 } grabDismissAreaEvents: false Column { id: body anchors { left: parent.left top: parent.top right: parent.right } property bool isActionsObject: (popover.actions !== undefined) && popover.actions.hasOwnProperty("actions") Repeater { id: repeater model: body.isActionsObject ? popover.actions.children : popover.actions Loader { width: parent.width height: modelData.visible ? item.height : 0 sourceComponent: delegate onStatusChanged: { if (item && status == Loader.Ready) { // set model data if (item.hasOwnProperty("action")) { item.action = modelData; item.objectName = item.action.objectName + '_button'; } if (item.hasOwnProperty("refModelData")) item.refModelData = modelData; if (item.hasOwnProperty("modelData")) item.modelData = modelData; // auto-connect trigger // if the delegate is a list item, hide divider of the last one if (item.hasOwnProperty("showDivider")) item.showDivider = index < (repeater.count - 1); } } } } } } ./src/Ubuntu/Components/Popups/1.2/internalPopupUtils.js0000644000015600001650000003041012700370701023273 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ .pragma library .import Ubuntu.Components 1.2 as Toolkit // Simple positioning on the screen, not relative to a caller Item. function SimplePositioning(foreground, area, edgeMargins) { // all coordinate computation are relative inside "area". // return the x-coordinate to center item horizontally in area this.horizontalCenter = function(item) { return area.width/2 - item.width/2; } // return the y-coordinate to center item vertically in area this.verticalCenter = function(item) { return area.height/2 - item.height/2; } // check whether item fits inside area, obeying the given margins this.checkVerticalPosition = function(item, y, marginBothSides, marginOneSide) { if (y < marginBothSides) return false; if (y + item.height > area.height - marginBothSides) return false; if (marginBothSides >= marginOneSide) return true; if (y > marginOneSide) return true; if (y + item.height < area.height - marginOneSide) return true; return false; } // check whether item fits inside area, obeying the given margins this.checkHorizontalPosition = function(item, x, marginBothSides, marginOneSide) { if (x < marginBothSides) return false; if (x + item.width > area.width - marginBothSides) return false; if (marginBothSides >= marginOneSide) return true; if (x > marginOneSide) return true; if (x + item.width < area.width - marginOneSide) return true; return false; } // position foreground at the top of the screen, horizontally centered this.autoSmallScreenPortrait = function() { foreground.x = this.horizontalCenter(foreground); foreground.y = 0; } // position foreground at the left side of the screen, vertically centered this.autoSmallScreenLandscape = function() { foreground.x = 0; foreground.y = this.verticalCenter(foreground); } // position foreground centered on a large screen this.autoLargeScreen = function() { foreground.x = this.horizontalCenter(foreground); foreground.y = this.verticalCenter(foreground); } // automatically position foreground on the screen this.auto = function(margin) { if (foreground.width >= area.width - 2*edgeMargins) { // the popover uses (almost) the full width of the screen this.autoSmallScreenPortrait(); return; } if (foreground.height >= area.height - 2*edgeMargins) { // the popover uses (almost) the full height of the screen this.autoSmallScreenLandscape(); return; } this.autoLargeScreen(); } } // caller is optional. // if caller is given, pointer and callerMargins must be specified, otherwise they are ignored. function CallerPositioning(foreground, pointer, area, caller, pointerTarget, edgeMargins, callerMargins) { var simplePos = new SimplePositioning(foreground, area, edgeMargins); // -1 values are not relevant. // return y-coordinate to position item a distance of margin above caller this.above = function(item, margin, anchorItem) { return area.mapFromItem(anchorItem, -1, 0).y - (item ? item.height : 0) - margin; } // return y-coordinate to position item a distance of margin below caller this.below = function(item, margin, anchorItem) { return area.mapFromItem(anchorItem, -1, anchorItem.height).y + margin; } // return x-coordinate to position item a distance of margin left of caller this.left = function(item, margin, anchorItem) { return area.mapFromItem(anchorItem, 0, -1).x - (item ? item.width : 0) - margin; } // return x-coodinate to position item a distance of margin right of caller this.right = function(item, margin, anchorItem) { return area.mapFromItem(anchorItem, anchorItem.width, -1).x + margin; } // return x-coordinate to align center of item horizontally with center of caller this.horizontalAlign = function(item, anchorItem) { var x = area.mapFromItem(anchorItem, anchorItem.width/2, -1).x - item.width/2; return Toolkit.MathUtils.clamp(x, edgeMargins, area.width - item.width - edgeMargins); } // return y-coordinate to align center of item vertically with center of caller this.verticalAlign = function(item, anchorItem) { var y = area.mapFromItem(anchorItem, -1, anchorItem.height/2).y - item.height/2; return Toolkit.MathUtils.clamp(y, edgeMargins, area.height - item.height - edgeMargins); } this.closestToHorizontalCenter = function(anchorItem, margin) { var center = area.mapFromItem(anchorItem, anchorItem.width/2, -1).x; return Toolkit.MathUtils.clamp(center, edgeMargins + margin, area.width - (edgeMargins + margin)); } this.closestToVerticalCenter = function(anchorItem, margin) { var center = area.mapFromItem(anchorItem, -1, anchorItem.height/2).y; return Toolkit.MathUtils.clamp(center, edgeMargins + margin, area.height - (edgeMargins + margin)); } // position foreground and pointer automatically on a small screen in portrait mode this.autoSmallScreenPortrait = function() { if (!caller) { simplePos.autoSmallScreenPortrait(); pointer.direction = "none"; return; } foreground.x = simplePos.horizontalCenter(foreground); var ycoord = this.above(foreground, callerMargins + pointer.size, caller); if (simplePos.checkVerticalPosition(foreground, ycoord, 0, area.height/4)) { foreground.y = ycoord; pointer.direction = "down"; pointer.y = this.above(null, callerMargins, caller); pointer.x = this.closestToHorizontalCenter(pointerTarget, pointer.horizontalMargin); return; } ycoord = this.below(foreground, callerMargins + pointer.size, caller); if (simplePos.checkVerticalPosition(foreground, ycoord, 0, area.height/4)) { foreground.y = ycoord; pointer.direction = "up"; pointer.y = this.below(null, callerMargins, caller); pointer.x = this.closestToHorizontalCenter(pointerTarget, pointer.horizontalMargin); return; } simplePos.autoSmallScreenPortrait(); pointer.direction = "none"; } // position foreground and pointer automatically on a small screen in landscape mode. this.autoSmallScreenLandscape = function() { if (!caller) { simplePos.autoSmallScreenLandscape(); pointer.direction = "none"; return; } foreground.y = simplePos.verticalCenter(foreground); var xcoord = this.left(foreground, callerMargins + pointer.size, caller); if (simplePos.checkHorizontalPosition(foreground, xcoord, 0, area.width/4)) { foreground.x = xcoord; pointer.direction = "right"; pointer.x = this.left(null, callerMargins, caller); pointer.y = this.closestToVerticalCenter(pointerTarget, pointer.verticalMargin); return; } xcoord = this.right(foreground, callerMargins + pointer.size, caller); if (simplePos.checkHorizontalPosition(foreground, xcoord, 0, area.width/4)) { foreground.x = xcoord; pointer.direction = "left"; pointer.x = this.right(null, callerMargins, caller); pointer.y = this.closestToVerticalCenter(pointerTarget, pointer.verticalMargin); return; } // position at the left of the screen simplePos.autoSmallScreenLandscape(); pointer.direction = "none"; } // position foreground and pointer above caller; the pointer's y will be aligned // to the caller, and x to the pointerTarget this.positionAbove = function() { var coord = this.above(foreground, callerMargins + pointer.size, caller); if (simplePos.checkVerticalPosition(foreground, coord, edgeMargins, 0)) { foreground.y = coord; foreground.x = this.horizontalAlign(foreground, caller); pointer.direction = "down"; pointer.y = this.above(null, callerMargins, caller); pointer.x = this.closestToHorizontalCenter(pointerTarget, pointer.horizontalMargin); return true; } return false; } // position foreground and pointer below caller; the pointer's y will be aligned // to the caller, and x to the pointerTarget this.positionBelow = function() { var coord = this.below(foreground, callerMargins + pointer.size, caller); if (simplePos.checkVerticalPosition(foreground, coord, edgeMargins, 0)) { foreground.y = coord; foreground.x = this.horizontalAlign(foreground, caller); pointer.direction = "up"; pointer.y = this.below(null, callerMargins, caller); pointer.x = this.closestToHorizontalCenter(pointerTarget, pointer.horizontalMargin); return true; } return false; } // position foreground and pointer in front of caller; the pointer's x will be aligned // to the caller, and y to the pointerTarget this.positionInFront = function() { var coord = this.left(foreground, callerMargins + pointer.size, caller); if (simplePos.checkHorizontalPosition(foreground, coord, edgeMargins, 0)) { foreground.x = coord; foreground.y = this.verticalAlign(foreground, caller); pointer.direction = "right"; pointer.x = this.left(null, callerMargins, caller); pointer.y = this.closestToVerticalCenter(pointerTarget, pointer.verticalMargin); return true; } return false; } // position foreground and pointer behind caller; the pointer's x will be aligned // to the caller, and y to the pointerTarget this.positionBehind = function() { var coord = this.right(foreground, callerMargins + pointer.size, caller) if (simplePos.checkHorizontalPosition(foreground, coord, edgeMargins, 0)) { foreground.x = coord; foreground.y = this.verticalAlign(foreground, caller); pointer.direction = "left"; pointer.x = this.right(null, callerMargins, caller); pointer.y = this.closestToVerticalCenter(pointerTarget, pointer.verticalMargin); return true; } return false; } // position foreground and pointer automatically on a large screen. this.autoLargeScreen = function() { if (!caller) { simplePos.autoLargeScreen(); pointer.direction = "none"; return; } // position with the following priorities: above, below, right, left. var order = ["positionAbove", "positionBelow", "positionBehind", "positionInFront"]; for (var i = 0; i < order.length; i++) { if (this[order[i]]()) return; } // not enough space on any of the sides to fit within the margins. simplePos.autoLargeScreen(); pointer.direction = "none"; } this.auto = function() { // area may be null some times... if (!area) return; if (!pointerTarget) pointerTarget = caller; if (foreground.width >= area.width - 2*edgeMargins) { // the popover uses (almost) the full width of the screen this.autoSmallScreenPortrait(); return; } if (foreground.height >= area.height - 2*edgeMargins) { // the popover uses (almost) the full height of the screen this.autoSmallScreenLandscape(); return; } this.autoLargeScreen(); } } ./src/Ubuntu/Components/Popups/1.2/Popover.qml0000644000015600001650000002403712700370701021231 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import "internalPopupUtils.js" as InternalPopupUtils import Ubuntu.Components 1.2 /*! \qmltype Popover \inherits PopupBase \inqmlmodule Ubuntu.Components.Popups 1.0 \ingroup ubuntu-popups \brief A popover allows an application to present additional content without changing the view. A popover has a fixed width and automatic height, depending on is contents. It can be closed by clicking anywhere outside of the popover area. \l {https://design.ubuntu.com/apps/building-blocks/dialog#popover}{See also the Design Guidelines on Popovers}. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 as ListItem import Ubuntu.Components.Popups 1.0 Rectangle { color: Theme.palette.normal.background width: units.gu(80) height: units.gu(80) Component { id: popoverComponent Popover { id: popover Column { id: containerLayout anchors { left: parent.left top: parent.top right: parent.right } ListItem.Header { text: "Standard list items" } ListItem.Standard { text: "Do something" } ListItem.Standard { text: "Do something else" } ListItem.Header { text: "Buttons" } ListItem.SingleControl { highlightWhenPressed: false control: Button { text: "Do nothing" anchors { fill: parent margins: units.gu(1) } } } ListItem.SingleControl { highlightWhenPressed: false control: Button { text: "Close" anchors { fill: parent margins: units.gu(1) } onClicked: PopupUtils.close(popover) } } } } } Button { id: popoverButton anchors.centerIn: parent text: "open" onClicked: PopupUtils.open(popoverComponent, popoverButton) } } \endqml */ PopupBase { id: popover /*! \qmlproperty list container Content will be put inside the foreround of the Popover. */ default property alias container: containerItem.data /*! \qmlproperty real contentWidth Use this property to override the default content width. */ property alias contentWidth: foreground.width /*! \qmlproperty real contentHeight Use this property to override the default content height. */ property alias contentHeight: foreground.height /*! The Item such as a \l Button that the user interacted with to open the Dialog. This property will be used for the automatic positioning of the Dialog next to the caller, if possible. */ property Item caller /*! The property holds the item to which the pointer should be anchored to. This can be same as the caller or any child of the caller. By default the property is set to caller. */ property Item pointerTarget: caller /*! The property holds the margins from the popover's dismissArea. The property is themed. */ property real edgeMargins: foreground.square ? 0 : units.gu(2) /*! The property holds the margin from the popover's caller. The property is themed. */ property real callerMargin: 0 /*! The property drives the automatic closing of the Popover when user taps on the dismissArea. The default behavior is to close the Popover, therefore set to true. When set to false, closing the Popover is the responsibility of the caller. Also, the mouse and touch events are not blocked from the dismissArea. */ property bool autoClose: true /*! \qmlproperty Component foregroundStyle Exposes the style property of the \l StyledItem contained in the Popover. Refer to \l StyledItem how to use it. */ property alias foregroundStyle: foreground.style /*! Make the popover visible. Reparent to the background area object first if needed. Only use this function if you handle memory management. Otherwise use PopupUtils.open() to do it automatically. */ function show() { /* Cannot call parent's show() however PopupBase::show() does not do anything useful to us. https://bugreports.qt-project.org/browse/QTBUG-25942 http://qt-project.org/forums/viewthread/19577 */ visible = true; foreground.show(); } /*! Hide the popover. Only use this function if you handle memory management. Otherwise use PopupUtils.close() to do it automatically. */ function hide() { foreground.hide(); } Component.onCompleted: foreground.hideCompleted.connect(popover.__makeInvisible) /*! \internal */ function __makeInvisible() { visible = false; } QtObject { id: internal property bool portrait: width < height // private function updatePosition() { if (pointerTarget && pointerTarget.parent) popover.y = (popover.parent.height - popover.height) / 2; var pos = new InternalPopupUtils.CallerPositioning(foreground, pointer, dismissArea, caller, pointerTarget, edgeMargins, callerMargin); pos.auto(); } } __foreground: foreground __eventGrabber.enabled: autoClose __closeOnDismissAreaPress: true y: parent ? (parent.height - height) / 2 : 0 StyledItem { id: foreground activeFocusOnPress: true objectName: "popover_foreground" //styling properties property real minimumWidth: units.gu(40) property real maxWidth: dismissArea ? (internal.portrait ? dismissArea.width : dismissArea.width * 3/4) : 0.0 property real maxHeight: dismissArea ? (internal.portrait ? dismissArea.height * 3/4 : dismissArea.height) : 0.0 width: Math.min(minimumWidth, maxWidth) height: containerItem.height Item { id: containerItem parent: foreground.__styleInstance.contentItem anchors { left: parent.left top: parent.top right: parent.right } height: childrenRect.height } onWidthChanged: internal.updatePosition() onHeightChanged: internal.updatePosition() property point target: Qt.point(pointer.x - x, pointer.y - y) property string direction: pointer.direction property bool clipContent: true property bool square: popover.hasOwnProperty("square") ? popover.square : false signal show() signal hide() signal showCompleted() signal hideCompleted() style: Theme.createStyleComponent("PopoverForegroundStyle.qml", foreground) } QtObject { id: pointer /* Input variables for InternalPopupUtils are the properties: - horizontalMargin - verticalMargin - size Output variables of InternalPopupUtils are the properties: - x - y - direction */ property real arrowSize: units.dp(15) property real cornerSize: units.dp(11) /* Minimum distance between the top or bottom of the popup and the tip of the pointer when the direction is left or right. */ property real horizontalMargin: arrowSize/2.0 + cornerSize /* Minimum distance between the left or right of the popup and the tip of the pointer when the direction is up or down. */ property real verticalMargin: arrowSize/2.0 + cornerSize /* Either: - distance between the left or right of the popup and the tip of the pointer when the direction is left or right. - distance between the top or bottom of the popup and the tip of the pointer when the direction is up or down. */ property real size: units.dp(6) property real x property real y property string direction } /*! \internal */ onCallerChanged: internal.updatePosition() /*! \internal */ onPointerTargetChanged: internal.updatePosition() /*! \internal */ onWidthChanged: internal.updatePosition() /*! \internal */ onHeightChanged: internal.updatePosition() /*! \internal */ onRotatingChanged: hide() Connections { target: pointerTarget onXChanged: internal.updatePosition() onYChanged: internal.updatePosition() onWidthChanged: internal.updatePosition() onHeightChanged: internal.updatePosition() } } ./src/Ubuntu/Components/Popups/1.2/Dialog.qml0000644000015600001650000001630312700370701020773 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 import "internalPopupUtils.js" as InternalPopupUtils /*! \qmltype Dialog \inherits PopupBase \inqmlmodule Ubuntu.Components.Popups 1.0 \ingroup ubuntu-popups \brief The Dialog caters for cases in which the application requires the user to determine between optional actions. The Dialog will interrupt the user flow and lock the view for further interaction before the user has selected a desired action. It can only be closed by selecting an optional action confirming or cancelling the operation. \l {http://design.ubuntu.com/apps/building-blocks/dialog}{See also the Design Guidelines on Dialogs}. Example: \qml import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.Popups 1.0 Item { width: units.gu(80) height: units.gu(80) Component { id: dialog Dialog { id: dialogue title: "Save file" text: "Are you sure that you want to save this file?" Button { text: "cancel" onClicked: PopupUtils.close(dialogue) } Button { text: "overwrite previous version" color: UbuntuColors.orange onClicked: PopupUtils.close(dialogue) } Button { text: "save a copy" color: UbuntuColors.orange onClicked: PopupUtils.close(dialogue) } } } Button { anchors.centerIn: parent id: saveButton text: "save" onClicked: PopupUtils.open(dialog) } } \endqml */ PopupBase { id: dialog /*! \qmlproperty list contents Content will be put inside a column in the foreround of the Dialog. */ default property alias contents: contentsColumn.data /*! The title of the question to ask the user. \qmlproperty string title */ property alias title: foreground.title /*! The question to the user. \qmlproperty string text */ property alias text: foreground.text /*! The Item such as a \l Button that the user interacted with to open the Dialog. This property will be used for the automatic positioning of the Dialog next to the caller, if possible. */ property Item caller /*! The property holds the item to which the pointer should be anchored to. This can be same as the caller or any child of the caller. By default the property is set to caller. */ property Item pointerTarget /*! \internal */ onPointerTargetChanged: { console.debug("pointerTarget DEPRECATED") } /*! The property holds the margins from the dialog's dismissArea. The property is themed. */ property real edgeMargins: units.gu(2) /*! The property holds the margin from the dialog's caller. The property is themed. */ property real callerMargin: units.gu(1) /*! The property controls whether the dialog is modal or not. Modal dialogs block event propagation to items under dismissArea, when non-modal ones let these events passed to these items. In addition, non-modal dialogs do not dim the dismissArea. The default value is true. */ property bool modal: true /* QtObject { id: internal function updatePosition() { var pos = new InternalPopupUtils.CallerPositioning(foreground, pointer, dialog, caller, pointerTarget, edgeMargins, callerMargin); pos.auto(); } } Pointer { id: pointer } */ __foreground: foreground __eventGrabber.enabled: modal __dimBackground: modal fadingAnimation: UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } StyledItem { id: foreground activeFocusOnPress: true width: Math.min(minimumWidth, dialog.width) anchors.centerIn: parent clip: true objectName: 'dialogForeground' // used in the style property string title property string text property real minimumWidth: units.gu(38) property real minimumHeight: units.gu(32) property real maxHeight: 3*dialog.height/4 property real margins: units.gu(4) property real itemSpacing: units.gu(2) property Item dismissArea: dialog.dismissArea property real keyboardHeight: dialog.anchorToKeyboard && UbuntuApplication.inputMethod.visible ? UbuntuApplication.inputMethod.keyboardRectangle.height : 0 height: Math.min(contentsColumn.height + foreground.margins, dialog.height - keyboardHeight) Flickable { anchors.fill: parent anchors.margins: foreground.margins contentWidth: contentsColumn.width contentHeight: contentsColumn.height - foreground.margins boundsBehavior: Flickable.StopAtBounds Column { id: contentsColumn spacing: foreground.itemSpacing width: foreground.width - foreground.margins * 2 height: childrenRect.height + foreground.margins onWidthChanged: updateChildrenWidths(); Label { horizontalAlignment: Text.AlignHCenter text: dialog.title wrapMode: Text.Wrap maximumLineCount: 2 elide: Text.ElideRight fontSize: "large" color: UbuntuColors.darkGrey visible: (text !== "") } Label { horizontalAlignment: Text.AlignHCenter text: dialog.text fontSize: "medium" color: UbuntuColors.darkGrey wrapMode: Text.Wrap visible: (text !== "") } onChildrenChanged: updateChildrenWidths() function updateChildrenWidths() { for (var i = 0; i < children.length; i++) { children[i].width = contentsColumn.width; } } } } style: Theme.createStyleComponent("DialogForegroundStyle.qml", foreground) } } ./src/Ubuntu/Components/Popups/1.2/PopupBase.qml0000644000015600001650000002017212700370701021471 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype PopupBase \inqmlmodule Ubuntu.Components.Popups 1.0 \ingroup ubuntu-popups \brief The base class for all dialogs, sheets and popovers. Do not use directly. Examples: See subclasses. */ OrientationHelper { id: popupBase /*! The property holds the area used to dismiss the popups, the area from where mouse and touch events will be grabbed. By default this area is the Popup itself. */ property Item dismissArea: popupBase /*! The property specifies whether to forward or not the mouse and touch events happening outside of the popover. By default all events are grabbed. */ property bool grabDismissAreaEvents: true /*! \internal FIXME: publish this property once agreed */ property PropertyAnimation fadingAnimation: PropertyAnimation{duration: 0} // without specifying width and height below, some width calculations go wrong in Sheet. // I guess popupBase.width is not correctly set initially width: parent ? parent.width : undefined height: parent ? parent.height : undefined // copy value of automaticOrientation from root object (typically a MainView) automaticOrientation: stateWrapper.rootItem && stateWrapper.rootItem.automaticOrientation ? stateWrapper.rootItem.automaticOrientation : false anchorToKeyboard: true LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft LayoutMirroring.childrenInherit: true /*! Make the popup visible. Reparent to the background area object first if needed. Only use this function if you handle memory management. Otherwise use PopupUtils.open() to do it automatically. */ function show() { if ((typeof popupBase["reparentToRootItem"]) === "boolean") { // So the property exists. Let's use it then. if (reparentToRootItem) { parent = stateWrapper.rootItem; } } else { // The property does not exist. Default is to reparent parent = stateWrapper.rootItem; } if (!dismissArea) { dismissArea = parent } // Without setting the parent, mapFromItem() breaks in internalPopupUtils. stateWrapper.state = 'opened'; } /*! Hide the popup. Only use this function if you handle memory management. Otherwise use PopupUtils.close() to do it automatically. */ function hide() { stateWrapper.state = 'closed'; } /*! \internal When the popup is created by calling PopupUtils.open(), onVisibleChanged is connected to __closeIfHidden(). */ function __closeIfHidden() { if (!visible) __closePopup(); } /*! \internal The function closes the popup. This is called when popup's caller is no longer valid. */ function __closePopup() { if (popupBase !== undefined) { popupBase.destroy(); } } /*! \internal Foreground component excluded from InverseMouseArea */ property Item __foreground /*! \internal Set to true if the InverseMouseArea should dismiss the area */ property bool __closeOnDismissAreaPress: false /*! \internal Property driving dimming the popup's background. The default is the same as defined in the style */ property alias __dimBackground: background.dim /*! \internal Property to control dismissArea event capture. */ property alias __eventGrabber: eventGrabber // dimmer Rectangle { id: background // styling properties property bool dim: false anchors.fill: parent visible: dim color: popupBase.width > units.gu(60) ? Qt.rgba(0, 0, 0, 0.6) : Qt.rgba(0, 0, 0, 0.9) } InverseMouseArea { id: eventGrabber enabled: true acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton anchors.fill: __foreground sensingArea: dismissArea propagateComposedEvents: !grabDismissAreaEvents onPressed: if (__closeOnDismissAreaPress) popupBase.hide() onWheel: wheel.accepted = true } MouseArea { acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton anchors.fill: __foreground onWheel: wheel.accepted = true } // set visible as false by default visible: false opacity: 0.0 /*! \internal */ onVisibleChanged: stateWrapper.state = (visible) ? 'opened' : 'closed' /*! \internal */ onParentChanged: stateWrapper.rootItem = QuickUtils.rootItem(popupBase) Component.onCompleted: { stateWrapper.saveActiveFocus(); stateWrapper.rootItem = QuickUtils.rootItem(popupBase); } Item { id: stateWrapper property Item rootItem: QuickUtils.rootItem(popupBase) property bool windowIsValid: typeof window != "undefined" property Item prevFocus function saveActiveFocus() { // 'window' context property is exposed to QML after component completion // before rendering is complete, therefore a simple 'if (window)' check is // not enough. if (windowIsValid) { prevFocus = window.activeFocusItem; windowIsValidChanged.disconnect(saveActiveFocus); } else { // connect the function so we can save the original focus item windowIsValidChanged.connect(saveActiveFocus); } } function restoreActiveFocus() { if (prevFocus) { if (prevFocus.hasOwnProperty("requestFocus")) { prevFocus.requestFocus(Qt.OtherFocusReason); } else { prevFocus.forceActiveFocus(Qt.OtherFocusReason); } } } states: [ State { name: 'closed' extend: '' }, State { name: 'opened' } ] transitions: [ Transition { from: "*" to: "opened" SequentialAnimation { ScriptAction { script: popupBase.visible = true } NumberAnimation { target: popupBase property: "opacity" from: 0.0 to: 1.0 duration: fadingAnimation.duration easing: fadingAnimation.easing } } }, Transition { from: "opened" to: "closed" SequentialAnimation { NumberAnimation { target: popupBase property: "opacity" from: 1.0 to: 0.0 duration: fadingAnimation.duration easing: fadingAnimation.easing } ScriptAction { script: { popupBase.visible = false; if (eventGrabber.enabled) { stateWrapper.restoreActiveFocus(); } } } } } ] } } ./src/Ubuntu/Components/Popups/1.2/ComposerSheet.qml0000644000015600001650000000614612700370701022360 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /*! \qmltype ComposerSheet \inherits SheetBase \inqmlmodule Ubuntu.Components.Popups 1.0 \deprecated \ingroup ubuntu-popups \brief Much like the \l DefaultSheet the Composer Sheet allows an application to insert a content view over the focused view without disrupting the navigation pattern. However the Composer Sheet is optimised for scenarios in which user content is at risk of corruption, most often (but not solely) when creating or editing content (e.g compose new message). There are two ways to dismiss it: user confirming the manipulation or user cancelling the manipulation, using the "confirm" and "cancel" buttons shown in the right and left side of the composer header. Example: \qml import Ubuntu.Components 1.2 import Ubuntu.Components.Popups 1.0 Item { Component { id: composerSheet ComposerSheet { id: sheet title: "Composer sheet" Label { text: "A composer sheet has cancel and confirm buttons." } onCancelClicked: PopupUtils.close(sheet) onConfirmClicked: PopupUtils.close(sheet) } } Button { anchors.centerIn: parent text: "composer" width: units.gu(16) onClicked: PopupUtils.open(composerSheet) } } \endqml \b{Sheets are deprecated. Consider using \l Dialog, \l Popover or \l PageStack instead.} */ SheetBase { id: composer /*! The user clicked the "cancel" button. */ signal cancelClicked /*! The user clicked the "confirm" button. */ signal confirmClicked __leftButton: Button { text: i18n.dtr("ubuntu-ui-toolkit", "Cancel") objectName: "cancelButton" /*! \internal */ // avoid warning when generating documentation onClicked: { composer.cancelClicked(); composer.hide(); } } __rightButton: Button { text: i18n.dtr("ubuntu-ui-toolkit", "Confirm") objectName: "confirmButton" color: UbuntuColors.orange /*! \internal */ // avoid warning when generating documentation onClicked: { composer.confirmClicked(); composer.hide(); } } } ./src/Ubuntu/Components/Popups/qmldir0000644000015600001650000000171612700370701017776 0ustar jenkinsjenkinsmodule Ubuntu.Components.Popups Dialog 0.1 1.2/Dialog.qml PopupBase 0.1 1.2/PopupBase.qml Popover 0.1 1.2/Popover.qml SheetBase 0.1 1.2/SheetBase.qml DefaultSheet 0.1 1.2/DefaultSheet.qml ComposerSheet 0.1 1.2/ComposerSheet.qml ActionSelectionPopover 0.1 1.2/ActionSelectionPopover.qml PopupUtils 0.1 1.2/popupUtils.js #version 1.0 Dialog 1.0 1.2/Dialog.qml PopupBase 1.0 1.2/PopupBase.qml Popover 1.0 1.2/Popover.qml SheetBase 1.0 1.2/SheetBase.qml DefaultSheet 1.0 1.2/DefaultSheet.qml ComposerSheet 1.0 1.2/ComposerSheet.qml ActionSelectionPopover 1.0 1.2/ActionSelectionPopover.qml PopupUtils 1.0 1.2/popupUtils.js ################################################# #version 1.3 Dialog 1.3 1.3/Dialog.qml PopupBase 1.3 1.3/PopupBase.qml Popover 1.3 1.3/Popover.qml SheetBase 1.3 1.3/SheetBase.qml DefaultSheet 1.3 1.3/DefaultSheet.qml ComposerSheet 1.3 1.3/ComposerSheet.qml ActionSelectionPopover 1.3 1.3/ActionSelectionPopover.qml PopupUtils 1.3 1.3/popupUtils.js ./src/Ubuntu/Components/qmldir0000644000015600001650000001106012700370701016501 0ustar jenkinsjenkinsmodule Ubuntu.Components plugin UbuntuComponents ActionList 0.1 1.2/ActionList.qml ToolbarItems 0.1 1.2/ToolbarItems.qml ToolbarButton 0.1 1.2/ToolbarButton.qml MainView 0.1 1.2/MainView.qml Button 0.1 1.0/Button.qml Panel 0.1 1.2/Panel.qml internal DraggingArea 1.2/DraggingArea.qml Tab 0.1 1.2/Tab.qml TabBar 0.1 1.2/TabBar.qml Tabs 0.1 1.2/Tabs.qml Label 0.1 1.2/Label.qml AbstractButton 0.1 1.2/AbstractButton.qml ActivityIndicator 0.1 1.2/ActivityIndicator.qml ProgressBar 0.1 1.0/ProgressBar.qml TextField 0.1 1.2/TextField.qml TextArea 0.1 1.2/TextArea.qml Switch 0.1 1.2/Switch.qml CheckBox 0.1 1.2/CheckBox.qml Slider 0.1 1.2/Slider.qml Scrollbar 0.1 1.2/Scrollbar.qml Object 0.1 1.2/Object.qml OptionSelector 0.1 1.2/OptionSelector.qml OptionSelectorDelegate 0.1 1.2/OptionSelectorDelegate.qml Page 0.1 1.2/Page10.qml PageStack 0.1 1.2/PageStack.qml Toolbar 0.1 1.2/Toolbar.qml internal AppHeader 1.2/AppHeader.qml Header 0.1 1.2/Header.qml internal AnimatedItem 1.2/AnimatedItem.qml internal PageWrapper 1.2/PageWrapper.qml CrossFadeImage 0.1 1.2/CrossFadeImage10.qml Icon 0.1 1.0/Icon.qml OrientationHelper 0.1 1.2/OrientationHelper.qml UbuntuNumberAnimation 0.1 1.2/UbuntuNumberAnimation.qml UbuntuListView 0.1 1.2/UbuntuListView.qml singleton UbuntuColors 0.1 1.0/UbuntuColors.qml SliderUtils 0.1 1.2/sliderUtils.js DateUtils 0.1 1.2/dateUtils.js #version 1.0 ActionList 1.0 1.2/ActionList.qml ToolbarItems 1.0 1.2/ToolbarItems.qml ToolbarButton 1.0 1.2/ToolbarButton.qml MainView 1.0 1.2/MainView.qml Button 1.0 1.0/Button.qml Panel 1.0 1.2/Panel.qml Tab 1.0 1.2/Tab.qml TabBar 1.0 1.2/TabBar.qml Tabs 1.0 1.2/Tabs.qml Label 1.0 1.2/Label.qml AbstractButton 1.0 1.2/AbstractButton.qml ActivityIndicator 1.0 1.2/ActivityIndicator.qml ProgressBar 1.0 1.0/ProgressBar.qml TextField 1.0 1.2/TextField.qml TextArea 1.0 1.2/TextArea.qml Switch 1.0 1.2/Switch.qml CheckBox 1.0 1.2/CheckBox.qml Slider 1.0 1.2/Slider.qml Scrollbar 1.0 1.2/Scrollbar.qml Object 1.0 1.2/Object.qml OptionSelector 1.0 1.2/OptionSelector.qml OptionSelectorDelegate 1.0 1.2/OptionSelectorDelegate.qml Page 1.0 1.2/Page10.qml PageStack 1.0 1.2/PageStack.qml Header 1.0 1.2/Header.qml CrossFadeImage 1.0 1.2/CrossFadeImage10.qml Icon 1.0 1.0/Icon.qml OrientationHelper 1.0 1.2/OrientationHelper.qml UbuntuNumberAnimation 1.0 1.2/UbuntuNumberAnimation.qml singleton UbuntuColors 1.0 1.0/UbuntuColors.qml SliderUtils 1.0 1.2/sliderUtils.js DateUtils 1.0 1.2/dateUtils.js UbuntuListView 1.0 1.2/UbuntuListView.qml #version 1.1 ComboButton 1.1 1.2/ComboButton.qml Button 1.1 1.1/Button.qml ProgressBar 1.1 1.1/ProgressBar.qml CrossFadeImage 1.1 1.2/CrossFadeImage11.qml PullToRefresh 1.1 1.2/PullToRefresh.qml UbuntuListView 1.1 1.2/UbuntuListView11.qml Page 1.1 1.2/Page11.qml PageHeadConfiguration 1.1 1.2/PageHeadConfiguration.qml PageHeadSections 1.1 1.2/PageHeadSections.qml PageHeadState 1.1 1.2/PageHeadState.qml Icon 1.1 1.1/Icon.qml singleton UbuntuColors 1.1 1.1/UbuntuColors.qml #version 1.2 MainView 1.2 1.2/MainView12.qml Captions 1.2 1.2/Captions.qml ################################################# #version 1.3 ActionBar 1.3 1.3/ActionBar.qml ActionList 1.3 1.3/ActionList.qml AdaptivePageLayout 1.3 1.3/AdaptivePageLayout.qml PageColumnsLayout 1.3 1.3/PageColumnsLayout.qml PageColumn 1.3 1.3/PageColumn.qml ToolbarItems 1.3 1.3/ToolbarItems.qml ToolbarButton 1.3 1.3/ToolbarButton.qml MainView 1.3 1.3/MainView.qml ComboButton 1.3 1.3/ComboButton.qml Button 1.3 1.3/Button.qml Panel 1.3 1.3/Panel.qml Tab 1.3 1.3/Tab.qml TabBar 1.3 1.3/TabBar.qml Tabs 1.3 1.3/Tabs.qml ActivityIndicator 1.3 1.3/ActivityIndicator.qml ProgressBar 1.3 1.3/ProgressBar.qml TextField 1.3 1.3/TextField.qml TextArea 1.3 1.3/TextArea.qml Switch 1.3 1.3/Switch.qml CheckBox 1.3 1.3/CheckBox.qml Slider 1.3 1.3/Slider.qml Scrollbar 1.3 1.3/Scrollbar.qml OptionSelector 1.3 1.3/OptionSelector.qml OptionSelectorDelegate 1.3 1.3/OptionSelectorDelegate.qml Page 1.3 1.3/Page.qml PageStack 1.3 1.3/PageStack.qml PageHeadConfiguration 1.3 1.3/PageHeadConfiguration.qml PageHeadSections 1.3 1.3/PageHeadSections.qml PageHeadState 1.3 1.3/PageHeadState.qml Sections 1.3 1.3/Sections.qml CrossFadeImage 1.3 1.3/CrossFadeImage.qml OrientationHelper 1.3 1.3/OrientationHelper.qml UbuntuNumberAnimation 1.3 1.3/UbuntuNumberAnimation.qml PullToRefresh 1.3 1.3/PullToRefresh.qml UbuntuListView 1.3 1.3/UbuntuListView.qml Captions 1.3 1.3/Captions.qml DateUtils 1.3 1.3/dateUtils.js ProgressionSlot 1.3 1.3/ProgressionSlot.qml ScrollView 1.3 1.3/ScrollView.qml PageHeader 1.3 1.3/PageHeader.qml Toolbar 1.3 1.3/Toolbar.qml singleton UbuntuColors 1.3 1.3/UbuntuColors.qml Icon 1.3 1.3/Icon.qml ./src/Ubuntu/Components/ComponentModule.pro0000644000015600001650000001025712700370701021127 0ustar jenkinsjenkinsCXX_MODULE = qml TARGET = UbuntuComponents TARGETPATH = Ubuntu/Components IMPORT_VERSION = 0.1 include(plugin/plugin.pri) #artwork files ARTWORK_FILES = $$system(find artwork -type f) QML_FILES += $$ARTWORK_FILES #1.0 QML_FILES += 1.0/Button.qml \ 1.0/Icon.qml \ 1.0/ProgressBar.qml \ 1.0/UbuntuColors.qml #1.1 QML_FILES += 1.1/Button.qml \ 1.1/Haptics.qml \ 1.1/Icon.qml \ 1.1/ProgressBar.qml \ 1.1/UbuntuColors.qml #1.2 QML_FILES += 1.2/AbstractButton.qml \ 1.2/ActionList.qml \ 1.2/ActivityIndicator.qml \ 1.2/AnimatedItem.qml \ 1.2/AppHeader.qml \ 1.2/Captions.qml \ 1.2/CheckBox.qml \ 1.2/ComboButton.qml \ 1.2/CrossFadeImage10.qml \ 1.2/CrossFadeImage11.qml \ 1.2/dateUtils.js \ 1.2/DraggingArea.qml \ 1.2/Header.qml \ 1.2/InputHandler.qml \ 1.2/Label.qml \ 1.2/MainView12.qml \ 1.2/MainViewBase.qml \ 1.2/MainView.qml \ 1.2/Object.qml \ 1.2/OptionSelectorDelegate.qml \ 1.2/OptionSelector.qml \ 1.2/OrientationHelper.qml \ 1.2/Page10.qml \ 1.2/Page11.qml \ 1.2/PageHeadConfiguration.qml \ 1.2/PageHeadSections.qml \ 1.2/PageHeadState.qml \ 1.2/PageStack.qml \ 1.2/PageTreeNode.qml \ 1.2/PageWrapper.qml \ 1.2/PageWrapperUtils.js \ 1.2/Panel.qml \ 1.2/PullToRefresh.qml \ 1.2/Scrollbar.qml \ 1.2/Slider.qml \ 1.2/sliderUtils.js \ 1.2/stack.js \ 1.2/Switch.qml \ 1.2/TabBar.qml \ 1.2/Tab.qml \ 1.2/Tabs.qml \ 1.2/TextArea.qml \ 1.2/TextCursor.qml \ 1.2/TextField.qml \ 1.2/TextInputPopover.qml \ 1.2/ToolbarButton.qml \ 1.2/ToolbarItems.qml \ 1.2/Toolbar.qml \ 1.2/UbuntuListView11.qml \ 1.2/UbuntuListView.qml \ 1.2/UbuntuNumberAnimation.qml #1.3 QML_FILES += 1.3/ActionBar.qml \ 1.3/ActionList.qml \ 1.3/ActivityIndicator.qml \ 1.3/AdaptivePageLayout.qml \ 1.3/AnimatedItem.qml \ 1.3/AppHeader.qml \ 1.3/Button.qml \ 1.3/Captions.qml \ 1.3/CheckBox.qml \ 1.3/ComboButton.qml \ 1.3/CrossFadeImage.qml \ 1.3/dateUtils.js \ 1.3/DraggingArea.qml \ 1.3/InputHandler.qml \ 1.3/MainView.qml \ 1.3/OptionSelectorDelegate.qml \ 1.3/OptionSelector.qml \ 1.3/OrientationHelper.qml \ 1.3/PageHeadConfiguration.qml \ 1.3/PageHeadSections.qml \ 1.3/PageHeadState.qml \ 1.3/Page.qml \ 1.3/PageStack.qml \ 1.3/pageUtils.js \ 1.3/Panel.qml \ 1.3/ProgressBar.qml \ 1.3/PullToRefresh.qml \ 1.3/Scrollbar.qml \ 1.3/Sections.qml \ 1.3/Slider.qml \ 1.3/Switch.qml \ 1.3/TabBar.qml \ 1.3/Tab.qml \ 1.3/Tabs.qml \ 1.3/TextArea.qml \ 1.3/TextCursor.qml \ 1.3/TextField.qml \ 1.3/TextInputPopover.qml \ 1.3/Toolbar.qml \ 1.3/ToolbarButton.qml \ 1.3/ToolbarItems.qml \ 1.3/UbuntuColors.qml \ 1.3/UbuntuListView.qml \ 1.3/UbuntuNumberAnimation.qml \ 1.3/ListItemPopover.qml \ 1.3/PageColumn.qml \ 1.3/PageColumnsLayout.qml \ 1.3/ProgressionSlot.qml \ 1.3/ScrollView.qml \ 1.3/PageHeader.qml \ 1.3/Icon.qml OTHER_FILES+= qmldir \ 1.3/CrossFadeImage.qdoc \ 1.3/PageHeadConfiguration.qdoc \ 1.3/MainView.qdoc \ 1.3/Icon.qdoc load(ubuntu_qml_plugin) ./src/Ubuntu/Components/Themes/0000755000015600001650000000000012700370701016515 5ustar jenkinsjenkins./src/Ubuntu/Components/Themes/1.3/0000755000015600001650000000000012700370701017016 5ustar jenkinsjenkins./src/Ubuntu/Components/Themes/1.3/Palette.qml0000644000015600001650000000473612700370701021141 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype Palette \inqmlmodule Ubuntu.Components.Themes 1.0 \ingroup theme-module \brief Provides the palette of colors from the theme that widgets use to draw themselves. Palette provides access to colors defined by the current theme. The actual color palette to use depends on the state of the widget being drawn. A color palette (\l PaletteValues) has various roles to choose from depending on what part of the widget is being drawn (the base of the widget, the foreground, etc.). For each color there is a corresponding 'text' color that is guaranteed to provide good legibility for text or icons placed on top of a background of the corresponding color. Example of a Text on top of a background Rectangle: \qml Item { Rectangle { color: theme.palette.normal.base } Text { color: theme.palette.normal.baseText } } \endqml */ QtObject { /*! Color palette to use when the widget is in the default state. */ property PaletteValues normal: PaletteValues{} /*! Color palette to use when the widget is in the disabled (enabled: false) state. \since Ubuntu.Components.Themes 1.3 */ property PaletteValues disabled: PaletteValues{} /*! Color palette to use when the widget is selected, for example when a tab is the current one. */ property PaletteValues selected: PaletteValues{} /*! Color palette to use when the widget is selected and disabled. \since Ubuntu.Components.Themes 1.3 */ property PaletteValues selectedDisabled: PaletteValues{} /*! Color palette values to use when the widget is highlighted. \since Ubuntu.Components.Themes 1.3 */ property PaletteValues highlighted: PaletteValues{} } ./src/Ubuntu/Components/Themes/1.3/PaletteValues.qml0000644000015600001650000001123212700370701022306 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype PaletteValues \inqmlmodule Ubuntu.Components.Themes 1.0 \ingroup theme-module \brief Color values used for a given widget state. */ QtObject { /*! Color applied to the background of the application. */ property color background /*! Color applied to elements placed on top of the \l background color. Typically used for labels and images. */ property color backgroundText /*! Color applied to secondary content on the \l background color. \since Ubuntu.Components.Themes 1.3 */ property color backgroundSecondaryText /*! Color applied to tertiary content on the \l background color. \since Ubuntu.Components.Themes 1.3 */ property color backgroundTertiaryText /*! Color applied to the background of widgets. */ property color base /*! Color applied to elements placed on top of the \l base color. Typically used for labels and images. */ property color baseText /*! Color applied to widgets on top of the base colour. */ property color foreground /*! Color applied to elements placed on top of the \l foreground color. Typically used for labels and images. */ property color foregroundText /*! Color applied to widgets on top of any layer, background or base. \since Ubuntu.Components.Themes 1.3 */ property color raised /*! Color applied to elements placed on top of the \l raised color. \since Ubuntu.Components.Themes 1.3 */ property color raisedText /*! Color applied to seconday elements placed on top of the \l raised color. \since Ubuntu.Components.Themes 1.3 */ property color raisedSecondaryText /*! Color applied to the background of widgets floating over other widgets. For example popovers, menus, dialogs. */ property color overlay /*! Color applied to elements placed on top of the \l overlay color. Typically used for labels and images. */ property color overlayText /*! Color applied to secondary elements placed on top of the \l overlay color. \since Ubuntu.Components.Themes 1.3 */ property color overlaySecondaryText /*! Colour applied to the background of text input fields. */ property color field /*! Color applied to elements placed on top of the \l field color. Typically used for labels and images. */ property color fieldText /*! Colour applied to the positive actions. \since Ubuntu.Components.Themes 1.3 */ property color positive /*! Color applied to elements placed on top of the \l positive color. \since Ubuntu.Components.Themes 1.3 */ property color positiveText /*! Colour applied to the negative actions. \since Ubuntu.Components.Themes 1.3 */ property color negative /*! Color applied to elements placed on top of the \l negative color. \since Ubuntu.Components.Themes 1.3 */ property color negativeText /*! Colour applied to the activity colors. Typical example is progress indication, activity indication. \since Ubuntu.Components.Themes 1.3 */ property color activity /*! Color applied to elements placed on top of the \l activity color. \since Ubuntu.Components.Themes 1.3 */ property color activityText /*! Color applied to selected text in editable components. */ property color selection /*! Color applied to elements placed on top of the \l selection color. \since Ubuntu.Components.Themes 1.3 */ property color selectionText /*! Color applied for the focus frame drawn around the active focus component if it was focused using keyboard navigation. */ property color focus /*! Color applied to elements placed on top of the \l focus color. */ property color focusText } ./src/Ubuntu/Components/Themes/Ambiance/0000755000015600001650000000000012700370701020214 5ustar jenkinsjenkins./src/Ubuntu/Components/Themes/Ambiance/1.3/0000755000015600001650000000000012700370716020523 5ustar jenkinsjenkins./src/Ubuntu/Components/Themes/Ambiance/1.3/TextAreaStyle.qml0000644000015600001650000000542512700370701023774 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 // frame // FIXME: stabilize API Item { id: visuals // style properties // FIXME: needs type checking in themes to define the proper type to be used // if color type is used, alpha value gets lost property color color: styledItem.enabled ? ((styledItem.activeFocus || styledItem.highlighted) ? theme.palette.selected.fieldText : theme.palette.normal.fieldText) : theme.palette.disabled.fieldText property color selectedTextColor: styledItem.enabled ? theme.palette.selected.selectionText : theme.palette.disabled.selectionText property color selectionColor: styledItem.enabled ? theme.palette.selected.selection : theme.palette.disabled.selection /*! Background fill color */ property color backgroundColor: styledItem.enabled ? ((styledItem.activeFocus || styledItem.highlighted) ? theme.palette.selected.field : theme.palette.normal.field) : theme.palette.disabled.field property color errorColor: styledItem.enabled ? theme.palette.normal.negative : theme.palette.disabled.negative /*! Spacing between the frame and the text editor area */ property real frameSpacing: units.gu(1) // Obsolete property alias overlaySpacing: visuals.frameSpacing // style body anchors.fill: parent objectName: "textarea_style" z: -1 /*! Text input background */ property Component background: UbuntuShape { property bool error: (styledItem.hasOwnProperty("errorHighlight") && styledItem.errorHighlight && !styledItem.acceptableInput) onErrorChanged: (error) ? visuals.errorColor : visuals.backgroundColor; backgroundColor: visuals.backgroundColor anchors.fill: parent visible: !styledItem.readOnly } Loader { id: backgroundLoader sourceComponent: background anchors.fill: parent } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/PopoverForegroundStyle.qml0000644000015600001650000000235412700370701025742 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 BubbleShape { property alias contentItem: content color: styledItem.enabled ? theme.palette.normal.overlay : theme.palette.disabled.overlay target: styledItem.target direction: styledItem.direction clipContent: styledItem.clipContent square: styledItem.square onShowCompleted: styledItem.showCompleted() onHideCompleted: styledItem.hideCompleted() Item { id: content anchors.fill: parent Connections { target: styledItem onShow: show() onHide: hide() } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/SwitchStyle.qml0000644000015600001650000000673312700370701023523 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: switchStyle /*! The padding between the thumb and the outside border of the switch. */ property real thumbPadding: 0 implicitWidth: units.gu(5) implicitHeight: units.gu(2.5) LayoutMirroring.enabled: false LayoutMirroring.childrenInherit: true /*! The background color of the switch. */ property color backgroundColor: styledItem.enabled ? theme.palette.normal.base : theme.palette.disabled.base /*! The background color of the checked switch. */ property color checkedBackgroundColor: styledItem.enabled ? theme.palette.normal.positive : theme.palette.disabled.base /*! The background color of the thumb. */ property color thumbColor: styledItem.enabled ? theme.palette.normal.raised : theme.palette.disabled.raised FocusShape { } UbuntuShape { id: background anchors.fill: parent backgroundColor: switchStyle.backgroundColor clip: true UbuntuShape { id: thumb states: [ State { name: "checked" when: styledItem.checked AnchorChanges { target: thumb anchors.left: undefined anchors.right: parent.right } PropertyChanges { target: background backgroundColor: switchStyle.checkedBackgroundColor } } ] transitions: [ // Avoid animations on width changes (during initialization) // by explicitly setting from and to for the Transitions. Transition { from: "*" to: "checked" reversible: true enabled: animated AnchorAnimation { targets: thumb duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } ColorAnimation { target: thumb properties: "backgroundColor" duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } } ] backgroundColor: switchStyle.thumbColor width: (background.width - switchStyle.thumbPadding * 3.0) / 2.0 anchors { top: parent.top bottom: parent.bottom left: parent.left topMargin: switchStyle.thumbPadding bottomMargin: switchStyle.thumbPadding } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/ActivityIndicatorStyle.qml0000644000015600001650000000224712700370701025707 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Image { id: container anchors.fill: parent smooth: true visible: styledItem.running && styledItem.visible fillMode: Image.PreserveAspectFit horizontalAlignment: Image.AlignHCenter verticalAlignment: Image.AlignVCenter source: Qt.resolvedUrl("../artwork/spinner.png") RotationAnimator on rotation { running: styledItem.running from: 0 to: 360 loops: Animation.Infinite duration: UbuntuAnimation.SleepyDuration } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/PageHeaderStyle.qml0000644000015600001650000000567312700370701024251 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Window 2.2 import Ubuntu.Components 1.3 import Ubuntu.Components.Styles 1.3 as Style Style.PageHeaderStyle { id: pageHeaderStyle foregroundColor: theme.palette.normal.backgroundText backgroundColor: theme.palette.normal.background dividerColor: theme.palette.normal.base property int fontWeight: Font.Light property int textSize: Label.Large // reduced content height on a phone in landscape mode contentHeight: Screen.height > units.gu(50) ? units.gu(6) : units.gu(5) implicitHeight: contentHeight + divider.height + internal.extensionHeight Object { id: internal property real extensionHeight: styledItem.extension ? styledItem.extension.height : styledItem.sections.height } defaultActionDelegate: AbstractButton { style: IconButtonStyle { } objectName: action.objectName + "_button" height: parent ? parent.height : undefined action: modelData StyleHints { // FIXME: introduce inactiveForegroundColor to PageHeaderStyle foregroundColor: pageHeaderStyle.foregroundColor } } titleComponent: Item { // The wrapping inside the extra Item is needed to // be able to position the Label vertically. Without it, // the Loader resizes the Label to span the full height. Label { id: titleLabel objectName: "header_title_label" text: styledItem.title anchors { left: parent.left right: parent.right verticalCenter: parent.verticalCenter } color: pageHeaderStyle.foregroundColor font.weight: pageHeaderStyle.fontWeight textSize: pageHeaderStyle.textSize elide: Text.ElideRight } } Rectangle { objectName: "header_background" anchors.fill: parent color: pageHeaderStyle.backgroundColor } Rectangle { id: divider objectName: "header_divider" anchors { left: parent.left right: parent.right bottom: parent.bottom } height: units.dp(1) color: pageHeaderStyle.dividerColor } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/HighlightMagnifier.qml0000644000015600001650000000403312700370701024761 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 ShaderEffect { id: magnifier property ShaderEffectSource source property real scaleFactor: 1.2 // Everything in the sourceItem that is not transparent will be made this color // in the output, but the transparency of the input is respected. property color outputColor: "red" // Specify the region of the sourceRect that must be enlarged as // x, y, width, height in texture coordinates. (0, 0, 1, 1) is full sourceRect. property rect texCoordRange: Qt.rect(0.0, 0.0, 1.0, 1.0); vertexShader: " uniform highp vec4 texCoordRange; attribute highp vec4 qt_Vertex; attribute highp vec2 qt_MultiTexCoord0; uniform highp mat4 qt_Matrix; uniform highp float scaleFactor; varying highp vec2 qt_TexCoord0; void main() { vec2 texCoord = vec2(0.5 - 1.0 / (2.0 * scaleFactor)) + qt_MultiTexCoord0 / vec2(scaleFactor); qt_TexCoord0 = texCoordRange.xy + texCoord*texCoordRange.zw; gl_Position = qt_Matrix * qt_Vertex; }" fragmentShader: " uniform lowp float qt_Opacity; varying highp vec2 qt_TexCoord0; uniform sampler2D source; uniform highp vec4 outputColor; void main() { lowp vec4 tex = texture2D(source, qt_TexCoord0); gl_FragColor = vec4(outputColor.rgb, outputColor.a*tex.a) * qt_Opacity; }" } ./src/Ubuntu/Components/Themes/Ambiance/1.3/PageHeadStyle.qml0000644000015600001650000003451612700370714023724 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Window 2.0 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 import Ubuntu.Components.Styles 1.3 as Style Style.PageHeadStyle { id: headerStyle objectName: "PageHeadStyle" // used in unit tests contentHeight: Screen.height > units.gu(50) ? units.gu(6) : units.gu(5) fontWeight: Font.Light textSize: Label.Large textLeftMargin: units.gu(2) maximumNumberOfActions: 3 PageHeadConfiguration { id: defaultConfig } property PageHeadConfiguration config: styledItem.config ? styledItem.config : defaultConfig /*! The color of the buttons in the header. */ property color buttonColor: headerStyle.config.foregroundColor /*! The color of the title text. */ property color titleColor: headerStyle.config.foregroundColor /*! The background color of the header. */ property color backgroundColor: styledItem.backgroundColor Rectangle { anchors.fill: parent color: headerStyle.backgroundColor } // FIXME: When the three panel color properties below are removed, // update unity8/Dash/PageHeader to use the new theming (currently // in progress) to set these colors. /*! \deprecated The background color of the tabs panel and the actions overflow panel. */ property color panelBackgroundColor: styledItem.panelColor /*! \deprecated The background color of the tapped item in the panel. */ property color panelHighlightColor: theme.palette.highlighted.background /*! \deprecated The foreground color (icon and text) of actions in the panel. */ property color panelForegroundColor: styledItem.enabled ? theme.palette.normal.backgroundText : theme.palette.disabled.backgroundText /*! The text color of unselected sections and the section divider. */ property color sectionColor: styledItem.enabled ? theme.palette.normal.backgroundText : theme.palette.disabled.backgroundText /*! The text color of the selected section. */ property color selectedSectionColor: styledItem.enabled ? theme.palette.selected.backgroundText : theme.palette.selectedDisabled.backgroundText /*! The background color of the pressed section. */ property color sectionHighlightColor: theme.palette.highlighted.background implicitHeight: headerStyle.contentHeight + divider.height + sectionsItem.height // Used by unit tests and autopilot tests to wait for animations to finish readonly property bool animating: headerStyle.state == "OUT" || leftAnchor.anchors.leftMargin < 0 // for Unity8 // FIXME: Remove this property when we introduce a header preset that does not // have a separator. property alias __separator_visible: divider.visible Rectangle { id: divider anchors { left: parent.left right: parent.right bottom: parent.bottom } height: units.dp(1) color: styledItem.dividerColor } SectionsForPageHead { id: sectionsItem objectName: "headerSectionsItem" anchors { left: parent.left leftMargin: units.gu(2) bottom: divider.top } visible: model && model.length > 0 enabled: sections.enabled height: visible ? implicitHeight : 0 property PageHeadSections sections: headerStyle.config.sections model: sections ? sections.model : null onSelectedIndexChanged: { if (sections) { sections.selectedIndex = sectionsItem.selectedIndex; } } Binding { target: sectionsItem when: sectionsItem.sections property: "selectedIndex" value: sectionsItem.sections.selectedIndex } } states: [ State { name: "IN" PropertyChanges { target: allContents opacity: 1.0 } }, State { name: "OUT" PropertyChanges { target: allContents opacity: 0.0 } } ] function animateOut() { state = "OUT"; } function animateIn() { state = "IN"; } signal animateOutFinished() signal animateInFinished() transitions: [ Transition { id: transitionOut from: "IN" to: "OUT" SequentialAnimation { ParallelAnimation { UbuntuNumberAnimation { target: allContents property: "opacity" from: 1.0 to: 0.0 } UbuntuNumberAnimation { target: leftAnchor properties: "anchors.leftMargin" from: 0.0 to: -units.gu(5) } UbuntuNumberAnimation { target: rightAnchor properties: "anchors.rightMargin" from: 0 to: -units.gu(5) } } ScriptAction { script: headerStyle.animateOutFinished() } } }, Transition { id: transitionIn from: "OUT" to: "IN" SequentialAnimation { ParallelAnimation { UbuntuNumberAnimation { target: allContents property: "opacity" from: 0.0 to: 1.0 } UbuntuNumberAnimation { target: leftAnchor properties: "anchors.leftMargin" from: -units.gu(5) to: 0 } UbuntuNumberAnimation { target: rightAnchor properties: "anchors.rightMargin" from: -units.gu(5) to: 0 } } ScriptAction { script: headerStyle.animateInFinished() } } } ] Item { id: allContents anchors.fill: parent Item { id: leftAnchor anchors { top: parent.top bottom: parent.bottom left: parent.left leftMargin: 0 } width: 0 } Item { id: rightAnchor anchors { top: parent.top bottom: parent.bottom right: parent.right rightMargin: 0 } width: 0 } Item { id: leftButtonContainer anchors { left: leftAnchor.right top: parent.top leftMargin: width > 0 ? units.gu(1) : 0 } width: childrenRect.width height: headerStyle.contentHeight PageHeadButton { id: customBackButton objectName: "customBackButton" action: headerStyle.config.backAction visible: null !== headerStyle.config.backAction && headerStyle.config.backAction.visible color: headerStyle.config.foregroundColor } PageHeadButton { id: backButton objectName: "backButton" iconName: "back" property bool stackBack: styledItem.pageStack !== null && styledItem.pageStack !== undefined && styledItem.pageStack.depth > 1 // MultiColumnView adds the following properties: multiColumn, page, showBackButton. property bool treeBack: styledItem.hasOwnProperty("multiColumn") && styledItem.showBackButton visible: !headerStyle.config.backAction && (stackBack || treeBack) text: "back" color: headerStyle.config.foregroundColor onTriggered: { if (stackBack) { styledItem.pageStack.pop(); } else { // treeBack styledItem.multiColumn.removePages(styledItem.page); } } } PageHeadButton { id: tabsButton objectName: "tabsButton" iconName: "navigation-menu" visible: styledItem.tabsModel !== null && styledItem.tabsModel !== undefined && !backButton.visible && !customBackButton.visible text: visible ? styledItem.tabsModel.count + " tabs" : "" color: headerStyle.buttonColor onTriggered: PopupUtils.open(tabsPopoverComponent, tabsButton) Component { id: tabsPopoverComponent OverflowPanel { id: tabsPopover objectName: "tabsPopover" actions: actionsFromTabs(styledItem.tabsModel) function getActionFromTab(tab) { return tab.__protected.action; } function actionsFromTabs(tabsList) { var result = []; var tab; for (var i=0; i < tabsList.count; i++) { tab = tabsList.get(i).tab; result.push(getActionFromTab(tab)); } return result; } backgroundColor: headerStyle.panelBackgroundColor foregroundColor: headerStyle.panelForegroundColor highlightColor: headerStyle.panelHighlightColor } } } } Item { id: foreground anchors { left: leftButtonContainer.right top: parent.top // don't keep a margin if there is already a button with spacing leftMargin: leftButtonContainer.width > 0 ? 0 : headerStyle.textLeftMargin } width: parent.width - anchors.leftMargin - leftButtonContainer.anchors.leftMargin - leftButtonContainer.width - actionsContainer.anchors.rightMargin - actionsContainer.width height: headerStyle.contentHeight Label { objectName: "header_title_label" LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft visible: !contentsContainer.visible && headerStyle.config.preset === "" anchors { left: parent.left right: parent.right verticalCenter: parent.verticalCenter } text: headerStyle.config.title font.weight: headerStyle.fontWeight textSize: headerStyle.textSize color: headerStyle.titleColor elide: Text.ElideRight } Item { // This Item is used to make the custom header item invisible // when styledItem.contents is unset and its parent is not updated // when the bindings below is no longer active id: contentsContainer anchors.fill: parent visible: styledItem.contents || headerStyle.config.contents } Binding { target: styledItem.contents property: "anchors.fill" value: contentsContainer when: styledItem.contents } Binding { target: styledItem.contents property: "parent" value: contentsContainer when: styledItem.contents } Binding { target: headerStyle.config.contents property: "parent" value: contentsContainer when: headerStyle.config.contents && !styledItem.contents } } ActionBar { id: actionsContainer objectName: "headerActionBar" anchors { top: parent.top right: rightAnchor.left rightMargin: actionsContainer.width > 0 ? units.gu(1) : 0 } height: headerStyle.contentHeight actions: headerStyle.config.actions numberOfSlots: 3 delegate: AbstractButton { style: IconButtonStyle { } objectName: action.objectName + "_button" height: parent ? parent.height : undefined action: modelData StyleHints { foregroundColor: headerStyle.buttonColor } } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/IconButtonStyle.qml0000644000015600001650000000446312700370701024344 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: iconButtonStyle implicitWidth: units.gu(4) implicitHeight: units.gu(4) /*! The color of the icons. */ property color foregroundColor: styledItem.enabled ? theme.palette.normal.backgroundText : theme.palette.disabled.backgroundText /*! The background color of the button. */ property color backgroundColor: styledItem.pressed ? theme.palette.highlighted.background : "transparent" property real iconWidth: units.gu(2) property real iconHeight: iconWidth /*! Show a text label under the icon. */ property bool showLabel: false Rectangle { id: background color: iconButtonStyle.backgroundColor anchors.fill: parent } Icon { id: icon anchors.centerIn: parent width: iconButtonStyle.iconWidth height: iconButtonStyle.iconHeight source: styledItem.iconSource color: iconButtonStyle.foregroundColor FocusShape { } } Component { id: labelComponent Label { objectName: styledItem.objectName + "_label" color: iconButtonStyle.foregroundColor text: styledItem.text textSize: Label.XxSmall } } Loader { anchors { top: icon.bottom topMargin: units.gu(0.5) horizontalCenter: parent.horizontalCenter } sourceComponent: iconButtonStyle.showLabel ? labelComponent : null } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/BottomEdgeHintStyle.qml0000644000015600001650000001152312700370714025133 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 Item { id: bottomEdgeHintStyle implicitWidth: styledItem.parent.width implicitHeight: units.gu(4) readonly property BottomEdgeHint hint: styledItem property color backgroundColor: styledItem.enabled ? theme.palette.normal.overlay : theme.palette.disabled.overlay property color foregroundColor: styledItem.enabled ? theme.palette.normal.overlayText : theme.palette.disabled.overlayText // translate hint status into state state: { switch (hint.status) { case BottomEdgeHint.Hidden: return "Hidden"; case BottomEdgeHint.Inactive: return "Inactive" case BottomEdgeHint.Active: return "Active" case BottomEdgeHint.Locked: return "Locked" } } states: [ State { name: "Inactive" extend: "" }, State { name: "Active" PropertyChanges { target: h1 anchors.verticalCenterOffset: styledItem.height / 2 } PropertyChanges { target: h2 anchors.topMargin: 0 } }, State { name: "Hidden" PropertyChanges { target: styledItem opacity: 0.0 } }, State { name: "Locked" PropertyChanges { target: h1 anchors.verticalCenterOffset: styledItem.height / 2 } PropertyChanges { target: h2 anchors.topMargin: 0 } } ] transitions: [ Transition { from: "*" to: "Active" reversible: true UbuntuNumberAnimation { targets: [h1, h2] properties: "anchors.verticalCenterOffset, anchors.topMargin" } }, Transition { from: "*" to: "Hidden" reversible: true UbuntuNumberAnimation { target: styledItem property: "opacity" duration: UbuntuAnimation.SlowDuration } } ] clip: true Icon { id: h1 width: units.gu(3) height: units.gu(1.5) anchors { centerIn: parent topMargin: styledItem.height } name: "toolkit_bottom-edge-hint" color: foregroundColor FocusShape { } } Rectangle { id: h2 anchors { top: parent.top left: parent.left right: parent.right topMargin: styledItem.height } height: styledItem.height color: backgroundColor ThinDivider { anchors.top: parent.top } FocusShape { anchors { fill: undefined margins: 0 top: parent.top bottom: parent.bottom horizontalCenter: parent.horizontalCenter } // icon, spacing, label, margin on either side width: icon.width + units.gu(1) + label.width + units.gu(0.46) * 2 } Row { anchors { top: parent.top bottom: parent.bottom horizontalCenter: parent.horizontalCenter } spacing: units.gu(1) Icon { id: icon name: styledItem.iconName source: styledItem.iconSource width: height height: units.gu(2) anchors.verticalCenter: parent.verticalCenter color: foregroundColor } Label { id: label text: styledItem.text textSize: Label.Medium color: foregroundColor height: styledItem.height anchors.verticalCenter: parent.verticalCenter verticalAlignment: Text.AlignVCenter } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/TabBarStyle.qml0000644000015600001650000003642512700370701023416 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: tabBarStyle // used to detect when the user is interacting with the tab bar by pressing it // or dragging the tab bar buttons. readonly property bool pressed: mouseArea.interacting // styling properties, public API property color headerTextColor: theme.palette.normal.backgroundText property color headerTextSelectedColor: theme.palette.selected.backgroundText // Don't start transitions because of updates to selectionMode before styledItem is completed. // This fixes bug #1246792: "Disable tabs scrolling animations at startup" property bool animate: false Binding { target: tabBarStyle property: "animate" when: styledItem.width > 0 value: styledItem.animate } property int headerTextFadeDuration: animate ? 350 : 0 property url indicatorImageSource: Qt.resolvedUrl("../artwork/chevron.png") property string headerAdaptiveLabelSize: Label.XLarge property int headerTextStyle: Text.Normal property color headerTextStyleColor: theme.palette.normal.backgroundText property int headerFontWeight: Font.Light property real headerTextLeftMargin: units.gu(2) property real headerTextRightMargin: units.gu(2) property real headerTextBottomMargin: units.gu(2) property real buttonPositioningVelocity: animate ? 1.0 : -1 // The time of inactivity before leaving selection mode automatically property int deactivateTime: 5000 /* The function assures the visuals stay on the selected tab. This can be called by the stack components holding the tabs (i.e. Tabs, ListView, etc) and only when the changes happen on the list element values, which is not reported automaytically through ListModel changes. */ function sync() { buttonView.selectButton(styledItem.model.selectedIndex); } property var tabsModel : styledItem ? styledItem.model : null Connections { target: styledItem onSelectionModeChanged: { if (!styledItem.selectionMode) { buttonView.selectButton(styledItem.model.selectedIndex); } } } Connections { target: styledItem.model onSelectedIndexChanged: buttonView.selectButton(styledItem.model.selectedIndex) } /* Prevent events that are not accepted by tab buttons or mouseArea below from passing through the TabBar. */ MouseArea { anchors.fill: parent onReleased: { mouseArea.enteringSelectionMode = false; } } Component { id: tabButtonRow Row { id: theRow anchors { top: parent.top bottom: parent.bottom } width: childrenRect.width property int rowNumber: modelData Component.onCompleted: { if (rowNumber === 0) { buttonView.buttonRow1 = theRow; } else { buttonView.buttonRow2 = theRow; } } Repeater { id: repeater model: tabsModel AbstractButton { id: button anchors { top: parent ? parent.top : undefined bottom: parent ? parent.bottom : undefined } width: text.paintedWidth + text.anchors.leftMargin + text.anchors.rightMargin // When the tab bar is in selection mode, show both buttons corresponing to // the tab index as selected, but when it is not in selection mode only one // to avoid seeing fading animations of the unselected button when switching // tabs from outside the tab bar. property bool selected: (styledItem.selectionMode && buttonView.needsScrolling) ? styledItem.model.selectedIndex === index : buttonView.selectedButtonIndex === button.buttonIndex property real offset: theRow.rowNumber + 1 - button.x / theRow.width; property int buttonIndex: index + theRow.rowNumber*repeater.count // Use opacity 0 to hide instead of setting visibility to false in order to // make fading work well, and not to mess up width/offset computations opacity: isVisible() ? 1.0 : 0.0 function isVisible() { if (selected) return true; if (!styledItem.selectionMode) return false; if (buttonView.needsScrolling) return true; // When we don't need scrolling, we want to avoid showing a button that is fading // while sliding in from the right side when a new button was selected var numTabs = tabsModel.count; var minimum = buttonView.selectedButtonIndex; var maximum = buttonView.selectedButtonIndex + numTabs - 1; if (MathUtils.clamp(buttonIndex, minimum, maximum) === buttonIndex) return true; // working modulus numTabs: if (buttonIndex < buttonView.selectedButtonIndex - numTabs) return true; return false; } Behavior on opacity { NumberAnimation { duration: headerTextFadeDuration easing.type: Easing.InOutQuad } } Image { id: indicatorImage source: indicatorImageSource anchors { bottom: parent.bottom bottomMargin: headerTextBottomMargin } x: button.width - width // FIXME: temporary hack for the chevron's height to match the font size height: 0.82*sourceSize.height // The indicator image must be visible after the selected tab button, when the // tab bar is not in selection mode, or after the "last" button (starting with // the selected one), when the tab bar is in selection mode. property bool isLastAfterSelected: index === (styledItem.model.selectedIndex === 0 ? repeater.count-1 : styledItem.model.selectedIndex - 1) opacity: (styledItem.selectionMode ? isLastAfterSelected : selected) ? 1 : 0 Behavior on opacity { NumberAnimation { duration: headerTextFadeDuration easing.type: Easing.InOutQuad } } } Label { id: text color: selected ? headerTextSelectedColor : headerTextColor Behavior on color { ColorAnimation { duration: headerTextFadeDuration easing.type: Easing.InOutQuad } } anchors { left: parent.left leftMargin: headerTextLeftMargin rightMargin: headerTextRightMargin baseline: parent.bottom baselineOffset: -headerTextBottomMargin } text: (model.hasOwnProperty("tab") && tab.hasOwnProperty("title")) ? tab.title : title textSize: headerAdaptiveLabelSize font.weight: headerFontWeight style: headerTextStyle styleColor: headerTextStyleColor } onClicked: { if (mouseArea.enteringSelectionMode) { mouseArea.enteringSelectionMode = false; } else if (opacity > 0.0) { styledItem.model.selectedIndex = index; if (!styledItem.alwaysSelectionMode) { styledItem.selectionMode = false; } button.select(); } } onPressedChanged: { // Catch release after a press with a delay that is too // long to make it a click, but don't unset interacting when // the user starts dragging. In that case it will be unset in // buttonView.onDragEnded. if (!pressed && !buttonView.dragging) { // unset interacting which was set in mouseArea.onPressed mouseArea.interacting = false; } } // Select this button function select() { buttonView.selectedButtonIndex = button.buttonIndex; buttonView.updateOffset(button.offset); } } } } } /*! Used by autopilot tests to determine when an animation finishes moving. \internal */ readonly property alias animating: offsetAnimation.running PathView { id: buttonView anchors { top: parent.top bottom: parent.bottom left: parent.left } width: needsScrolling ? parent.width : buttonRowWidth // set to the width of one tabButtonRow in Component.onCompleted. property real buttonRowWidth: buttonRow1 ? buttonRow1.width : 0 // set by the delegate when the components are completed. property Row buttonRow1 property Row buttonRow2 // Track which button was last clicked property int selectedButtonIndex: -1 delegate: tabButtonRow model: 2 // The second buttonRow shows the buttons that disappear on the left property bool needsScrolling: buttonRowWidth > parent.width interactive: needsScrolling clip: needsScrolling highlightRangeMode: PathView.NoHighlightRange offset: 0 path: Path { startX: -buttonView.buttonRowWidth/2 PathLine { x: buttonView.buttonRowWidth*1.5 } } // x - y (mod a), for (x - y) <= a function cyclicDistance(x, y, a) { var r = x - y; return Math.min(Math.abs(r), Math.abs(r - a)); } // Select the closest of the two buttons that represent the given tab index function selectButton(tabIndex) { if (!tabsModel || tabIndex < 0 || tabIndex >= tabsModel.count) return; if (buttonView.buttonRow1 && buttonView.buttonRow2) { var b1 = buttonView.buttonRow1.children[tabIndex]; var b2 = buttonView.buttonRow2.children[tabIndex]; // find the button with the nearest offset var d1 = cyclicDistance(b1.offset, buttonView.offset, 2); var d2 = cyclicDistance(b2.offset, buttonView.offset, 2); if (d1 < d2) { b1.select(); } else { b2.select(); } } } function updateOffset(newOffset) { if (!newOffset) return; // do not update the offset when its value is NaN if (offset - newOffset < -1) newOffset = newOffset - 2; offset = newOffset; } Behavior on offset { SmoothedAnimation { id: offsetAnimation velocity: buttonPositioningVelocity easing.type: Easing.InOutQuad } } onDragEnded: { // unset interacting which was set in mouseArea.onPressed mouseArea.interacting = false; mouseArea.enteringSelectionMode = false; } Timer { id: idleTimer interval: tabBarStyle.deactivateTime running: styledItem.selectionMode && !styledItem.alwaysSelectionMode onTriggered: styledItem.selectionMode = false function conditionalRestartOrStop() { if (Qt.application.active && styledItem.selectionMode && !styledItem.alwaysSelectionMode && !mouseArea.interacting) { idleTimer.restart(); } else { idleTimer.stop(); } } } // disable the timer when the application is not active and reset // it when the application is resumed. Connections { target: Qt.application onActiveChanged: idleTimer.conditionalRestartOrStop() } Connections { target: styledItem onSelectionModeChanged: idleTimer.conditionalRestartOrStop() } } MouseArea { // a tabBar not in selection mode can be put in selection mode by pressing id: mouseArea anchors.fill: parent // set in onPressed, and unset in button.onPressedChanged or buttonView.onDragEnded // because after not accepting the mouse, the released event will go to // the buttonView or individual buttons. property bool interacting: false onInteractingChanged: idleTimer.conditionalRestartOrStop() // When pressing to enter selection mode, a release should not be interpreted // as a click on a button to select a new tab. property bool enteringSelectionMode: false // This MouseArea is always enabled, even when the tab bar is in selection mode, // so that press events are detected and tabBarStyle.pressed is updated. onPressed: { mouseArea.interacting = true; if (!styledItem.selectionMode) { mouseArea.enteringSelectionMode = true; } styledItem.selectionMode = true; mouse.accepted = false; } } Component.onCompleted: { tabBarStyle.sync(); } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/TextFieldStyle.qml0000644000015600001650000000135712700370701024147 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 TextAreaStyle { objectName: "textfield_style" frameSpacing: units.gu(0.5) } ./src/Ubuntu/Components/Themes/Ambiance/1.3/DialerHandStyle.qml0000644000015600001650000000377612700370701024261 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { // style API property alias handPointer: pointer function handPreset(index, property) { switch (property) { case "width" : return (index === 0) ? units.gu(0.8) : units.gu(0.5); case "height": return (index === 0) ? dialer.handSpace /2 : (index === 2) ? dialer.handSpace + units.gu(1.5) : dialer.handSpace - units.gu(1.5); case "z": return (index === 2) ? -1 : 0; case "visible": case "draggable": return true; case "toCenterItem": return false; default: return undefined; } } // style anchors.fill: parent transformOrigin: Item.Center Rectangle { id: pointer x: (parent.width - width) / 2 y: styledItem.dialer.handSpace - (styledItem.hand.toCenterItem ? 0 : styledItem.hand.height) width: styledItem.hand.width height: styledItem.hand.height radius: units.gu(1) color: styledItem.hand.visible ? theme.palette.normal.baseText : "#00000000" antialiasing: true } Behavior on rotation { enabled: !styledItem.hand.draggable RotationAnimation { direction: RotationAnimation.Shortest } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/PageHeadButton.qml0000644000015600001650000000411012700370701024056 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 // TODO: Remove this component when PageHeadStyle uses ActionBar AbstractButton { id: button property real iconWidth: units.gu(2.5) property real iconHeight: iconWidth width: visible ? units.gu(5) : 0 height: parent ? parent.height : undefined property alias color: icon.color Rectangle { visible: button.pressed anchors.fill: parent color: theme.palette.selected.background } Icon { id: icon anchors { centerIn: parent } // prevent trying to render the icon with an invalid source // when the button is invisible by setting width and height to 0 width: visible ? button.iconWidth : 0 height: visible ? button.iconHeight : 0 source: button.iconSource color: Qt.rgba(0, 0, 0, 0) opacity: button.enabled ? 1.0 : 0.3 } Component { id: labelComponent Label { id: label objectName: button.objectName + "_label" color: button.color opacity: button.enabled ? 1.0 : 0.3 text: button.text textSize: Label.XxSmall } } Loader { anchors { top: icon.bottom topMargin: units.gu(0.5) horizontalCenter: parent.horizontalCenter } sourceComponent: button.state === "IconAndLabel" ? labelComponent : null } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/PartialColorize.qml0000644000015600001650000000336712700370701024344 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 ShaderEffect { id: partialColorize implicitWidth: source.implicitWidth implicitHeight: source.implicitHeight visible: source != null && source.visible property Item sourceItem property var source: ShaderEffectSource { hideSource: true sourceItem: partialColorize.sourceItem visible: sourceItem != null } property color leftColor property color rightColor property real progress property bool mirror: false property string texCoord: mirror ? "1.0 - qt_TexCoord0.x" : "qt_TexCoord0.x" fragmentShader: " varying highp vec2 qt_TexCoord0; uniform sampler2D source; uniform lowp vec4 leftColor; uniform lowp vec4 rightColor; uniform lowp float progress; uniform lowp float qt_Opacity; void main() { lowp vec4 sourceColor = texture2D(source, qt_TexCoord0); lowp vec4 newColor = mix(leftColor, rightColor, step(progress, " + texCoord + ")); gl_FragColor = newColor * sourceColor.a * qt_Opacity; }" } ./src/Ubuntu/Components/Themes/Ambiance/1.3/DatePickerStyle.qml0000644000015600001650000001143212700370714024271 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 Item { id: control // style properties /*! Specifies the background color */ property color backgroundColor: "#0A000000" /*! Background color for highlight. */ property color highlightBackgroundColor: "#ffffffff" /*! Highlight color. */ property color highlightColor: theme.palette.highlighted.baseText /*! Scale of the highlight item */ property real highlightScaleFactor: 1.2 /*! Thickness of the highlight component */ property real highlightThickness: units.gu(5) /*! The content holder exposed to the Picker so tumbler list can be reparented to it. */ property alias tumblerHolder: content /*! The property holds the separator to be shown between date and time units */ property string unitSeparator: "" property Item view: Item {} property ListModel pickerModels: ListModel{} anchors.fill: parent // frame UbuntuShape { anchors.fill: parent radius: "medium" source: shapeSource } ShaderEffectSource { id: shapeSource sourceItem: background hideSource: true // FIXME: visible: false prevents rendering so make it a nearly // transparent 1x1 pixel instead opacity: 0.01 width: 1 height: 1 } Rectangle { id: background anchors.fill: parent MouseArea { anchors.fill: parent } // background color: backgroundColor Item { id: content anchors.fill: parent } // highlight Rectangle { id: highlightItem y: (content.height - control.highlightThickness) / 2 anchors { left: content.left right: content.right } height: control.highlightThickness color: highlightBackgroundColor } ThinDivider { anchors { left: content.left right: content.right bottom: highlightItem.top } } ThinDivider { anchors { left: content.left right: content.right top: highlightItem.bottom } } ShaderEffectSource { id: effectSource visible: false sourceItem: view property real sourceRectMultiplier: 2.0 // XXX: This works because the parent of magnifier is the same as sourceItem // in this case. Otherwise coordinate transformations will be needed. sourceRect: Qt.rect(highlightItem.x, highlightItem.y, highlightItem.width, highlightItem.height) textureSize: Qt.size(highlightItem.width*sourceRectMultiplier, highlightItem.height*sourceRectMultiplier) } Row { id: magnifierRow anchors { top: highlightItem.top bottom: highlightItem.bottom horizontalCenter: highlightItem.horizontalCenter } Repeater { model: pickerModels HighlightMagnifier { anchors { top: magnifierRow.top bottom: magnifierRow.bottom } width: pickerModel.pickerWidth scaleFactor: control.highlightScaleFactor outputColor: control.highlightColor source: effectSource texCoordRange: Qt.rect((x - source.sourceRect.x) / source.sourceRect.width, 0.0, width / source.sourceRect.width, 1.0); Label { text: (index < (pickerModels.count - 1)) ? unitSeparator : "" anchors { right: parent.right verticalCenter: parent.verticalCenter } } } } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/ButtonStyle.qml0000644000015600001650000001567512700370701023542 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: buttonStyle property var button: styledItem property real minimumWidth: units.gu(10) property real horizontalPadding: units.gu(1) // FIXME: Add this color to the palette property color defaultColor: "#b2b2b2" property font defaultFont: Qt.font({family: "Ubuntu", pixelSize: FontUtils.sizeToPixels("medium")}) property Gradient defaultGradient property real buttonFaceOffset: 0 property bool stroke: button.hasOwnProperty("strokeColor") && button.strokeColor != Qt.rgba(0.0, 0.0, 0.0, 0.0) /*! The property overrides the button's default background with an item. This item can be used by derived styles to reuse the ButtonStyle and override the default coloured background with an image or any other drawing. The default value is null. */ property Item backgroundSource: null width: button.width height: button.height implicitWidth: Math.max(minimumWidth, foreground.implicitWidth + 2*horizontalPadding) implicitHeight: units.gu(4) LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft LayoutMirroring.childrenInherit: true /*! \internal */ // Color properties in a JS ternary operator don't work as expected in // QML because it overwrites alpha values with 1. A workaround is to use // Qt.rgba(). For more information, see // https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1197802 and // https://bugreports.qt-project.org/browse/QTBUG-32238. function __colorHack(color) { return Qt.rgba(color.r, color.g, color.b, color.a); } /* The proxy is necessary because Gradient.stops and GradientStop.color are non-NOTIFYable properties. They cannot be written to so it is fine but the proxy avoids the warnings. */ property QtObject gradientProxy: gradientProxyObject QtObject { id: gradientProxyObject property color topColor property color bottomColor function updateGradient() { if (button.gradient) { topColor = button.gradient.stops[0].color; bottomColor = button.gradient.stops[1].color; } } Component.onCompleted: { updateGradient(); button.gradientChanged.connect(updateGradient); } } // Use the gradient if it is defined and the color has not been set manually // or the gradient has been set manually property bool isGradient: button.gradient && (button.color == defaultColor || button.gradient != defaultGradient) FocusShape { } Image { id: strokeBorder anchors.fill: parent anchors.margins: -units.gu(0.5) // FIXME: this PNG is way too big (462x108) and do not scale properly // ie. the corners are visually incorrect at most sizes source: stroke ? Qt.resolvedUrl("../artwork/stroke_button.png") : "" visible: false cache: false asynchronous: true } ShaderEffect { id: colorizedImage anchors.fill: parent visible: stroke && strokeBorder.status == Image.Ready property Item source: visible ? strokeBorder : null property color keyColorOut: stroke ? button.strokeColor : Qt.rgba(0.0, 0.0, 0.0, 0.0) property color keyColorIn: Qt.rgba(1.0, 1.0, 1.0, 1.0) property real threshold: 1.0 fragmentShader: " varying highp vec2 qt_TexCoord0; uniform sampler2D source; uniform highp vec4 keyColorOut; uniform highp vec4 keyColorIn; uniform lowp float threshold; uniform lowp float qt_Opacity; void main() { lowp vec4 sourceColor = texture2D(source, qt_TexCoord0); gl_FragColor = mix(vec4(keyColorOut.rgb, 1.0) * sourceColor.a, sourceColor, step(threshold, distance(sourceColor.rgb / sourceColor.a, keyColorIn.rgb))) * qt_Opacity; }" } UbuntuShape { id: background anchors.fill: parent borderSource: "radius_idle.sci" // Deprecated, use a dedicated shape. visible: stroke ? false : ((backgroundColor.a != 0.0) || backgroundSource) source: backgroundSource backgroundColor: backgroundSource ? "#00000000" : (isGradient ? __colorHack(gradientProxy.topColor) : __colorHack(button.color)) secondaryBackgroundColor: backgroundSource ? "#00000000" : (isGradient ? __colorHack(gradientProxy.bottomColor) : __colorHack(button.color)) backgroundMode: isGradient ? UbuntuShape.VerticalGradient : UbuntuShape.SolidColor opacity: styledItem.enabled ? 1.0 : 0.6 } UbuntuShape { id: backgroundPressed anchors.fill: parent backgroundColor: stroke ? button.strokeColor : background.backgroundColor secondaryBackgroundColor: background.secondaryBackgroundColor backgroundMode: stroke ? UbuntuShape.SolidColor : UbuntuShape.VerticalGradient borderSource: "radius_pressed.sci" // Deprecated, use a dedicated shape. opacity: button.pressed ? 1.0 : 0.0 Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration easing.type: Easing.Linear } } visible: stroke || background.visible } ButtonForeground { id: foreground width: parent.width - 2*horizontalPadding anchors { centerIn: parent horizontalCenterOffset: buttonFaceOffset } text: button.text /* Pick either a clear or dark text color depending on the luminance of the background color to maintain good contrast (works in most cases) */ textColor: ColorUtils.luminance(button.color) <= 0.85 && !(stroke && !button.pressed) ? "#FFFFFF" : "#888888" iconSource: button.iconSource iconPosition: button.iconPosition iconSize: units.gu(3) font: button.font spacing: horizontalPadding transformOrigin: Item.Top scale: button.pressed ? 0.98 : 1.0 Behavior on scale { NumberAnimation { duration: UbuntuAnimation.SnapDuration easing.type: Easing.Linear } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/AmbianceSelected.qml0000644000015600001650000000164212700370701024403 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 AmbianceNormal { background: UbuntuColors.porcelain backgroundText: UbuntuColors.blue backgroundTertiaryText: UbuntuColors.blue base: UbuntuColors.ash baseText: UbuntuColors.blue foreground: UbuntuColors.ash } ./src/Ubuntu/Components/Themes/Ambiance/1.3/FocusShape.qml0000644000015600001650000000251012700370701023266 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Private 1.3 Frame { anchors.fill: parent anchors.margins: -units.gu(0.46) color: styledItem.enabled ? theme.palette.normal.focus : theme.palette.disabled.focus thickness: units.gu(0.21) radius: units.gu(1.7) visible: styledItem.keyNavigationFocus Behavior on anchors.margins { UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration } } Binding { target: styledItem property: "activeFocusOnTab" value: true when: styledItem } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/Palette.qml0000644000015600001650000000415612700370701022634 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes 1.3 Palette { normal: AmbianceNormal {} disabled: AmbianceNormal { field: UbuntuColors.porcelain; // inactive is 30% opaque normal Component.onCompleted: { for (var p in normal) { // skip objectName and all change signals if (p == "objectName" || p == "field" || p.indexOf("Changed") > 0) continue; disabled[p] = Qt.rgba(normal[p].r, normal[p].g, normal[p].b, 0.3); } } } // selected differs from normal in background, base, foreground selected: AmbianceSelected {} // selected differs from normal in background, base, foreground selectedDisabled: AmbianceSelected { background: UbuntuColors.porcelain base: UbuntuColors.porcelain foreground: UbuntuColors.porcelain // inactive is 30% opaque normal Component.onCompleted: { for (var p in selected) { // skip objectName and all change signals if (p == "objectName" || p.indexOf("Changed") > 0 || p == "background" || p == "base" || p == "foreground" ) continue; selectedDisabled[p] = Qt.rgba(selected[p].r, selected[p].g, selected[p].b, 0.3); } } } highlighted: AmbianceNormal { background: UbuntuColors.silk base: UbuntuColors.jet foreground: UbuntuColors.silk } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/ListItemStyle.qml0000644000015600001650000004343512700370714024020 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components.Styles 1.3 as Styles import Ubuntu.Components 1.3 Styles.ListItemStyle { id: listItemStyle /* * Coloring properties */ property color leadingPanelColor: theme.palette.normal.foreground property color trailingPanelColor: theme.palette.normal.foreground property color leadingForegroundColor: theme.palette.normal.negative property color trailingForegroundColor: theme.palette.normal.foregroundText property color leadingDisabledForegroundColor: theme.palette.disabled.negative property color trailingDisabledForegroundColor: theme.palette.disabled.foregroundText // anchoring anchors { // do not anchor fill fill: undefined top: parent ? parent.top : undefined bottom: parent ? parent.bottom : undefined bottomMargin: styledItem.divider.visible ? styledItem.divider.height : 0 left: styledItem.contentItem.left leftMargin: -styledItem.contentItem.anchors.leftMargin right: styledItem.contentItem.right rightMargin: -styledItem.contentItem.anchors.rightMargin } LayoutMirroring.childrenInherit: true // leading/trailing panels Component { id: panelComponent Rectangle { id: panel objectName: "ListItemPanel" + (leading ? "Leading" : "Trailing") // add 0.5 GUs to the panel size so we get 2GU default margin on the first action readonly property real panelWidth: actionsRow.width + units.gu(0.5) color: leading ? leadingPanelColor : trailingPanelColor anchors.fill: parent readonly property ListItemActions itemActions: leading ? styledItem.leadingActions : styledItem.trailingActions Row { id: actionsRow anchors { left: leading ? undefined : parent.left right: leading ? parent.right : undefined leftMargin: leading ? 0 : units.gu(0.5) rightMargin: leading ? units.gu(0.5) : 0 top: parent.top bottom: parent.bottom } readonly property real maxItemWidth: parent.width / itemActions.actions.length readonly property real minItemWidth: units.gu(6) // 2GU icon + 2* 2GU margin Repeater { model: itemActions.actions AbstractButton { id: actionButton action: modelData enabled: action.enabled activeFocusOnTab: false width: MathUtils.clamp(delegateLoader.item ? delegateLoader.item.width : 0, actionsRow.minItemWidth, actionsRow.maxItemWidth) anchors { top: parent ? parent.top : undefined bottom: parent ? parent.bottom : undefined } function trigger() { internals.selectedAction = modelData; listItemStyle.rebound(); } Rectangle { anchors.fill: parent color: theme.palette.highlighted.background visible: pressed } Loader { id: delegateLoader height: parent.height sourceComponent: itemActions.delegate ? itemActions.delegate : defaultDelegate property Action action: modelData property int index: listItemIndex property bool pressed: actionButton.pressed onItemChanged: { // use action's objectName to identify the visualized action if (item && item.objectName === "") { item.objectName = modelData.objectName; actionButton.objectName = "actionbutton_" + modelData.objectName } } } } } } Component { id: defaultDelegate Item { width: actionsRow.minItemWidth Icon { width: units.gu(2) height: width name: action.iconName color: leading ? (action.enabled ? leadingForegroundColor : leadingDisabledForegroundColor) : (action.enabled ? trailingForegroundColor : trailingDisabledForegroundColor) anchors.centerIn: parent } } } } } // the selection/multiselection panel Component { id: selectionDelegate Item { id: selectPanel objectName: "selection_panel" + listItemIndex anchors.fill: parent ? parent : undefined CheckBox { id: checkbox opacity: 0 // for unit and autopilot tests objectName: "listitem_select" anchors.centerIn: parent // for the initial value checked: styledItem.selected onCheckedChanged: styledItem.selected = checked; Binding { target: checkbox property: "checked" value: styledItem.selected } } states: State { name: "enabled" when: loaded && styledItem.selectMode PropertyChanges { target: checkbox opacity: 1.0 } } transitions: Transition { from: "" to: "*" reversible: true enabled: listItemStyle.animatePanels OpacityAnimator { easing: UbuntuAnimation.StandardEasing duration: UbuntuAnimation.FastDuration } } } } // drag panel Component { id: dragDelegate Item { id: dragPanel objectName: "drag_panel" + listItemIndex anchors.fill: parent ? parent : undefined Icon { objectName: "icon" id: dragIcon anchors.centerIn: parent width: units.gu(3) height: width name: "view-grid-symbolic" opacity: 0.0 scale: 0.5 color: theme.palette.normal.base } Binding { target: listItemStyle property: "dragPanel" value: dragPanel } states: State { name: "enabled" when: loaded && styledItem.dragMode PropertyChanges { target: dragIcon opacity: 1.0 scale: 1.0 } } transitions: Transition { from: "" to: "*" reversible: true enabled: listItemStyle.animatePanels ParallelAnimation { OpacityAnimator { easing: UbuntuAnimation.StandardEasing duration: UbuntuAnimation.FastDuration } ScaleAnimator { easing: UbuntuAnimation.StandardEasing duration: UbuntuAnimation.FastDuration } } } } } // leading panel loader Loader { id: leadingLoader objectName: "leading_loader" anchors { top: parent.top bottom: parent.bottom right: parent.left } width: styledItem.width sourceComponent: styledItem.swiped && styledItem.leadingActions && styledItem.leadingActions.actions.length > 0 ? panelComponent : null // context properties used in delegates readonly property bool leading: true readonly property bool loaded: status == Loader.Ready // panel states states: [ State { name: "selectable" when: styledItem.selectMode PropertyChanges { target: leadingLoader sourceComponent: selectionDelegate width: units.gu(5) } PropertyChanges { target: listItemStyle anchors.leftMargin: 0 } PropertyChanges { target: styledItem.contentItem anchors.leftMargin: units.gu(5) } } ] transitions: Transition { from: "" to: "selectable" reversible: true enabled: listItemStyle.animatePanels PropertyAnimation { target: styledItem.contentItem properties: "anchors.leftMargin" easing: UbuntuAnimation.StandardEasing duration: UbuntuAnimation.FastDuration } } } // trailing panel loader Loader { id: trailingLoader objectName: "trailing_loader" anchors { top: parent.top bottom: parent.bottom left: parent.right } width: styledItem.width sourceComponent: styledItem.swiped && styledItem.trailingActions && styledItem.trailingActions.actions.length > 0 ? panelComponent : null // context properties used in delegates readonly property bool leading: false readonly property bool loaded: status == Loader.Ready // panel states states: State { name: "draggable" when: styledItem.dragMode PropertyChanges { target: trailingLoader sourceComponent: dragDelegate width: units.gu(5) } PropertyChanges { target: listItemStyle anchors.rightMargin: 0 } PropertyChanges { target: styledItem.contentItem anchors.rightMargin: units.gu(5) } } transitions: Transition { from: "" to: "*" reversible: true enabled: listItemStyle.animatePanels PropertyAnimation { target: styledItem.contentItem properties: "anchors.rightMargin" easing: UbuntuAnimation.StandardEasing duration: UbuntuAnimation.FastDuration } } } // internals QtObject { id: internals // action triggered property Action selectedAction // swipe handling readonly property Item swipedPanel: leadingPanel ? leadingLoader.item : trailingLoader.item readonly property bool leadingPanel: listItemStyle.LayoutMirroring.enabled ? (listItemStyle.x < 0) : (listItemStyle.x > 0) readonly property real swipedOffset: (leadingPanel ? listItemStyle.x : -listItemStyle.x) * (listItemStyle.LayoutMirroring.enabled ? -1 : 1) readonly property real panelWidth: swipedPanel && swipedPanel.hasOwnProperty("panelWidth") ? swipedPanel.panelWidth : 0 property real prevX: 0.0 property real snapChangerLimit: 0.0 readonly property real threshold: units.gu(1.5) property bool snapIn: false property bool completed: false // update snap direction function updateSnapDirection() { if (prevX < listItemStyle.x && (snapChangerLimit <= listItemStyle.x)) { snapIn = (listItemStyle.LayoutMirroring.enabled !== leadingPanel); snapChangerLimit = listItemStyle.x - threshold; } else if (prevX > listItemStyle.x && (listItemStyle.x < snapChangerLimit)) { snapIn = (listItemStyle.LayoutMirroring.enabled === leadingPanel); snapChangerLimit = listItemStyle.x + threshold; } prevX = listItemStyle.x; } // perform snapIn/Out function snap() { var snapPos = (swipedOffset > units.gu(2) && snapIn) ? panelWidth : 0.0; snapPos *= leadingPanel ? 1 : -1; // invert snapPos on RTL snapPos *= listItemStyle.LayoutMirroring.enabled ? -1 : 1; snapAnimation.snapTo(snapPos); } // handle elasticity on overshoot function overshoot(event) { var offset = event.content.x - styledItem.contentItem.anchors.leftMargin; offset *= leadingPanel ? 1 : -1; // invert offset on RTL offset *= listItemStyle.LayoutMirroring.enabled ? -1 : 1; if (offset > panelWidth) { // do elastic move event.content.x = styledItem.contentItem.x + (event.to.x - event.from.x) / 2; } } } snapAnimation: SmoothedAnimation { objectName: "snap_animation" target: styledItem.contentItem property: "x" // use 50GU/second velocity velocity: units.gu(60) onStopped: { // trigger action if (to == styledItem.contentItem.anchors.leftMargin && internals.selectedAction) { internals.selectedAction.trigger(listItemIndex); internals.selectedAction = null; } } // animated snapping function snapTo(pos) { if (pos == to && styledItem.contentItem.x == to) { return; } stop(); from = styledItem.contentItem.x; // add leading margin as the snapped out item's X coordinate is the leftMargin pos += styledItem.contentItem.anchors.leftMargin; to = pos; start(); } } // simple drop animation dropAnimation: SmoothedAnimation { properties: "y" velocity: units.gu(60) } onXChanged: internals.updateSnapDirection() // overriding default functions function swipeEvent(event) { if (event.status == SwipeEvent.Started) { internals.prevX = x; snapAnimation.stop(); } else if (event.status == SwipeEvent.Finished) { internals.snap(); } else if (event.status == SwipeEvent.Updated) { // handle elasticity when overshooting internals.overshoot(event) } } function rebound() { snapAnimation.snapTo(0); } // expansion Component.onCompleted: internals.completed = true state: (internals.completed && styledItem.expansion.expanded) ? (listItemStyle.flickable ? "expandedWithFlickable" : "expandedNoFlickable") : "" states: [ State { name: "expandedNoFlickable" PropertyChanges { target: styledItem height: styledItem.expansion.height } }, State { name: "expandedWithFlickable" PropertyChanges { target: styledItem height: styledItem.expansion.height } PropertyChanges { target: listItemStyle.flickable // we do not need to restore the original values restoreEntryValues: false // and we should not get any binding updates even explicit: true contentY: { var bottom = styledItem.y + styledItem.expansion.height - listItemStyle.flickable.contentY + listItemStyle.flickable.originY; var dy = bottom - listItemStyle.flickable.height; if (dy > 0) { return listItemStyle.flickable.contentY + dy - listItemStyle.flickable.originY; } else { return listItemStyle.flickable.contentY; } } } } ] transitions: [ Transition { from: "" to: "expandedWithFlickable" reversible: true enabled: listItemStyle.animatePanels ParallelAnimation { UbuntuNumberAnimation { target: listItemStyle.flickable property: "contentY" } UbuntuNumberAnimation { target: styledItem property: "height" } } }, Transition { from: "" to: "expandedNoFlickable" reversible: true enabled: listItemStyle.animatePanels UbuntuNumberAnimation { target: styledItem property: "height" } } ] } ./src/Ubuntu/Components/Themes/Ambiance/1.3/ButtonForeground.qml0000644000015600001650000000677512700370701024555 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: buttonForeground property alias text: label.text property alias textColor: label.color property alias iconSource: icon.source property string iconPosition property real iconSize property real spacing property bool hasIcon: iconSource != "" property bool hasText: text != "" property alias font: label.font opacity: enabled ? 1.0 : 0.5 implicitHeight: Math.max(icon.height, label.height) state: hasIcon && hasText ? iconPosition : "center" Image { id: icon anchors.verticalCenter: parent.verticalCenter fillMode: Image.PreserveAspectFit width: iconSize height: iconSize } Label { id: label anchors { verticalCenter: parent.verticalCenter verticalCenterOffset: units.dp(-1) } elide: Text.ElideRight } states: [ State { name: "left" AnchorChanges { target: icon anchors.left: buttonForeground.left } AnchorChanges { target: label anchors.left: icon.right } PropertyChanges { target: label anchors.leftMargin: spacing width: buttonForeground.width - icon.width - spacing } PropertyChanges { target: buttonForeground implicitWidth: icon.implicitWidth + spacing + label.implicitWidth } }, State { name: "right" AnchorChanges { target: icon anchors.right: buttonForeground.right } AnchorChanges { target: label anchors.left: buttonForeground.left } PropertyChanges { target: label width: buttonForeground.width - icon.width - spacing } PropertyChanges { target: buttonForeground implicitWidth: label.implicitWidth + spacing + icon.implicitWidth } }, State { name: "center" AnchorChanges { target: icon anchors.horizontalCenter: buttonForeground.horizontalCenter } AnchorChanges { target: label anchors.horizontalCenter: buttonForeground.horizontalCenter } PropertyChanges { target: label width: Math.min(label.implicitWidth, buttonForeground.width) } PropertyChanges { target: buttonForeground implicitWidth: hasText ? label.implicitWidth : icon.implicitWidth } } ] } ./src/Ubuntu/Components/Themes/Ambiance/1.3/ComboButtonStyle.qml0000644000015600001650000002402112700370701024503 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Styles 1.3 as Style Style.ComboButtonStyle { id: comboStyle // configurations dropDownWidth: units.gu(5) comboListMargin: units.gu(0.8) comboListHolder: comboListContent comboListPanel: panelItem defaultColor: mainButton.defaultColor defaultGradient: mainButton.defaultGradient defaultDropdownColor: mainButton.defaultColor defaultFont: mainButton.defaultFont width: styledItem.width height: styledItem.collapsedHeight implicitWidth: mainButton.implicitWidth implicitHeight: mainButton.implicitHeight LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft LayoutMirroring.childrenInherit: true Item { id: mainButton property real minimumWidth: units.gu(36) property real horizontalPadding: units.gu(4) property color defaultColor: theme.palette.normal.foreground property font defaultFont: Qt.font({family: "Ubuntu", pixelSize: FontUtils.sizeToPixels("medium")}) property Gradient defaultGradient: null property real buttonFaceOffset: -dropDownWidth/2 property bool stroke: false /*! The property overrides the button's default background with an item. This item can be used by derived styles to reuse the ButtonStyle and override the default coloured background with an image or any other drawing. The default value is null. */ property Item backgroundSource: comboFace anchors { left: parent.left top: parent.top right: parent.right } width: styledItem.width height: styledItem.collapsedHeight implicitWidth: Math.max( minimumWidth, foreground.implicitWidth + 2 * mainButton.horizontalPadding ) implicitHeight: units.gu(4) LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft LayoutMirroring.childrenInherit: true UbuntuShape { id: background anchors.fill: parent borderSource: "radius_idle.sci" // Deprecated, use a dedicated shape. visible: mainButton.stroke ? false : ((backgroundColor.a != 0.0) || mainButton.backgroundSource) source: mainButton.backgroundSource backgroundColor: defaultColor backgroundMode: UbuntuShape.SolidColor opacity: styledItem.enabled ? 1.0 : 0.6 } Item { id: foreground property string iconPosition: styledItem.iconPosition property real iconSize: units.gu(2) property real spacing: mainButton.horizontalPadding property bool hasIcon: styledItem.iconSource != "" property bool hasText: styledItem.text != "" anchors { centerIn: parent horizontalCenterOffset: mainButton.buttonFaceOffset } transformOrigin: Item.Top width: parent.width - 2*mainButton.horizontalPadding implicitHeight: Math.max(foregroundIcon.height, foregroundLabel.height) scale: styledItem.pressed ? 0.98 : 1.0 Behavior on scale { NumberAnimation { duration: UbuntuAnimation.SnapDuration easing.type: Easing.Linear } } state: foreground.hasIcon && hasText ? iconPosition : "center" Icon { id: foregroundIcon visible: foreground.hasIcon anchors.verticalCenter: parent.verticalCenter width: foreground.iconSize height: foreground.iconSize color: foregroundLabel.color source: styledItem.iconSource } Label { id: foregroundLabel anchors.verticalCenter: parent.verticalCenter elide: Text.ElideRight color: theme.palette.normal.foregroundText font: styledItem.font text: styledItem.text } states: [ State { name: "left" AnchorChanges { target: foregroundIcon anchors.left: foreground.left } AnchorChanges { target: foregroundLabel anchors.left: foregroundIcon.right } PropertyChanges { target: foregroundLabel anchors.leftMargin: spacing width: foreground.width - foregroundIcon.width - spacing } PropertyChanges { target: foreground implicitWidth: foregroundIcon.implicitWidth + spacing + foregroundLabel.implicitWidth } }, State { name: "right" AnchorChanges { target: foregroundIcon anchors.right: foreground.right } AnchorChanges { target: foregroundLabel anchors.right: foregroundIcon.left } PropertyChanges { target: foregroundLabel anchors.rightMargin: spacing width: foreground.width - foregroundIcon.width - spacing } PropertyChanges { target: foreground implicitWidth: foregroundIcon.implicitWidth + spacing + foregroundLabel.implicitWidth } }, State { name: "center" AnchorChanges { target: foregroundIcon anchors.horizontalCenter: foreground.horizontalCenter } AnchorChanges { target: foregroundLabel anchors.horizontalCenter: foreground.horizontalCenter } PropertyChanges { target: foregroundLabel width: Math.min(foregroundLabel.implicitWidth, foreground.width) } PropertyChanges { target: foreground implicitWidth: foreground.hasText ? foregroundLabel.implicitWidth : foregroundIcon.implicitWidth } } ] } ShaderEffectSource { id: comboFace sourceItem: content hideSource: true // FIXME: visible: false prevents rendering so make it a nearly // transparent 1x1 pixel instead opacity: 0.01 width: 1 height: 1 } Item { id: content width: mainButton.width height: mainButton.height // button background Rectangle { anchors { fill: parent rightMargin: comboStyle.dropDownWidth } color: defaultColor } Rectangle { id: dropDownButton objectName: "combobutton_dropdown_visuals" anchors { right: parent.right top: parent.top bottom: parent.bottom } width: comboStyle.dropDownWidth color: defaultDropdownColor Icon { anchors.centerIn: parent height: parent.height / 2 width: height name: styledItem.expanded? "up" : "down" color: foregroundLabel.color } } } } Item { id: panelItem objectName: "combobutton_combopanel" anchors { left: parent.left top: mainButton.bottom right: parent.right } opacity: styledItem.expanded && (styledItem.comboList.length > 0)? 1.0 : 0.0 ShaderEffectSource { id: listContent sourceItem: comboListContent hideSource: true // FIXME: visible: false prevents rendering so make it a nearly // transparent 1x1 pixel instead opacity: 0.01 width: 1 height: 1 } Rectangle { id: comboListContent anchors { fill: parent topMargin: comboListMargin } clip: true color: defaultDropdownColor } UbuntuShape { id: shape anchors { fill: parent topMargin: comboListMargin } source: listContent } Behavior on height { NumberAnimation { duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } } Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/ScrollbarStyle.qml0000644000015600001650000016525612700370714024217 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /* The visuals handle both active and passive modes. This behavior is driven yet by the styledItem's __interactive property, however should be detected upon runtime based on the device type. On active scrollbars, positioning is handled so that the logic updates the flickable's X/Y content positions, which is then synched with the contentPosition by the main element. Style properties used: - interactive: bool - drives the interactive behavior of the scrollbar - minimumSliderSize: real - specifies the minimum size of the slider * overlay - overlay: bool - true if the scrollbar is overlay type - overlayOpacityWhenHidden: opacity when hidden - overlayOpacityWhenShown: opacity when shown * trough - troughThicknessIndicatorStyle: real - thickness of the thumb in Indicator style - troughThicknessThumbStyle: real - thickness of the thumb in Thumb style - troughThicknessSteppersStyle: real - thickness of the thumb in Steppers style - troughColorThumbStyle: color - color of the trough in Thumb style - troughColorSteppersStyle: color - color of the trough in Steppers style * slider - sliderColor: color - color for the slider - sliderRadius: real - radius of of the slider rectangle - thumbThickness: real - thickness of the slider in Thumb style - indicatorThickness: real - thickness of the slider in Indicator style * animations - where duration and easing properties are used only - scrollbarThicknessAnimation: PropertyAnimation - animation used when changing the thickness of the slider - scrollbarFadeInAnimation: PropertyAnimation - animation used when fading in - scrollbarFadeOutAnimation: PropertyAnimation - animation used when fading out - scrollbarFadeOutPause: int - milliseconds to pause before fading out - scrollbarCollapsePause: int - milliseconds to pause at the beginning of the transition from Thumb to Indicator style * scrolling UX - the values are relative to the size of the view - shortScrollingRatio: real - how much to scroll when using arrow keys and steppers - longScrollingRatio: real - how much to scroll when using PageUp/Down * other styling properties - hintingStyle: string - the style to use for the hinting feature - thumbsExtremesMargin: real - This is the top/bottom (for the vertical scrollbar) and left/right (for horiz scrollbar) margin of the slider from the trough. It is supposed to be the same margin as the one that separates the thumb from the left/right (or top/bottom for horizontal scrollbar) edges of the screen. */ Item { id: visuals property bool initialized: false /***************************************************** * STYLING PROPERTIES * *****************************************************/ property bool interactive: isMouseConnected || veryLongContentItem property real minimumSliderSize: units.gu(3) property bool overlay: !alwaysOnScrollbars property real overlayOpacityWhenShown: 1.0 property real overlayOpacityWhenHidden: 0.0 property real troughThicknessSteppersStyle : units.dp(14) property real troughThicknessThumbStyle : units.dp(14) property real troughThicknessIndicatorStyle : units.dp(9) property color troughColorThumbStyle: theme.palette.normal.foreground property color troughColorSteppersStyle: theme.palette.normal.foreground property color sliderColor: theme.palette.normal.foregroundText property real sliderRadius: units.dp(3) property real thumbThickness: units.gu(1) property real indicatorThickness : units.dp(3) property PropertyAnimation scrollbarThicknessAnimation: UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } property PropertyAnimation scrollbarFadeInAnimation: UbuntuNumberAnimation { duration: UbuntuAnimation.SlowDuration } property PropertyAnimation scrollbarFadeOutAnimation: UbuntuNumberAnimation { duration: UbuntuAnimation.SlowDuration } property int scrollbarFadeOutPause: 3000 property int scrollbarCollapsePause: 1000 //The ratio of page to scroll when using pg_down/up //and arrow_down/up keyboard keys (and steppers) property real shortScrollingRatio: 0.1 property real longScrollingRatio: 0.9 property string hintingStyle: veryLongContentItem ? 'thumb' : 'indicator' property real thumbsExtremesMargin: units.dp(4) /***************************************************** * HELPER PROPERTIES * *****************************************************/ property alias thumb: slider property Item trough: trough //helper properties to ease code readability property bool isScrollable: styledItem.__private.scrollable && pageSize > 0.0 && contentSize > 0.0 && totalContentSize > pageSize property bool isVertical: (styledItem.align === Qt.AlignLeading) || (styledItem.align === Qt.AlignTrailing) property bool frontAligned: (styledItem.align === Qt.AlignLeading) property bool rearAligned: (styledItem.align === Qt.AlignTrailing) property bool topAligned: (styledItem.align === Qt.AlignTop) property bool bottomAligned: (styledItem.align === Qt.AlignBottom) //flickable helper properties property Flickable flickableItem: styledItem.flickableItem property real pageSize: flickableItem ? (isVertical ? flickableItem.height : flickableItem.width) : 0 property real contentSize: flickableItem ? (isVertical ? flickableItem.contentHeight : flickableItem.contentWidth) : 0 property real leadingContentMargin: flickableItem ? (isVertical ? flickableItem.topMargin : flickableItem.leftMargin) : 0 property real trailingContentMargin: flickableItem ? (isVertical ? flickableItem.bottomMargin : flickableItem.rightMargin) : 0 //this size includes content margins property real totalContentSize: contentSize + leadingContentMargin + trailingContentMargin /***************************************************** * INTERNAL PROPERTIES AND FUNCTIONS * *****************************************************/ property bool __recursionGuard: false property bool __disableStateBinding: false property alias __overshootTimer: overshootTimer property bool __hinting: false property bool draggingThumb: thumbArea.drag.active || slider.mouseDragging || slider.touchDragging //this is the condition that triggers "Thumb Style" //only show the thumb if the page AND the view is moving property bool thumbStyleFlag: veryLongContentItem && (flickableItem.moving || scrollAnimation.running) //we show thumb style instead of indicator style if the content item is very long on *any* of the 2 axes property bool veryLongContentItem: flickableItem && initialized && ((flickableItem.contentHeight > flickableItem.height * 10) || (flickableItem.contentWidth > flickableItem.width * 10)) //this will eventually come from QInputInfo property bool isMouseConnected: true //used to offset viewport and scrollbars to make space for non-overlay scrollbars property real nonOverlayScrollbarMargin: troughThicknessSteppersStyle //TODO: move to Scrollbar.qml? property bool useSteppers: true //the thumb will have a touchDragStartMargin margin on both sides //to be more easily draggable via touch property real touchDragStartMargin: units.gu(2) //NOTE: this is not used for Qt's drag.treshold, just for our logic! property real dragThreshold: units.dp(2) //this could eventually become a system setting //True --> Steppers style, non-overlay scrollbars //False --> Indicator, Trough and Steppers styles, overlaid to the content property bool alwaysOnScrollbars: styledItem.__alwaysOnScrollbars function scrollBy(amount, animate) { if (isNaN(amount)) { console.log("BUG: Invalid scrolling delta.") return } scrollTo(scrollbarUtils.scrollAndClamp( styledItem, amount, -leadingContentMargin, Math.max(contentSize + trailingContentMargin - pageSize, -leadingContentMargin)) , animate) } function scrollTo(value, animate) { if (isNaN(value)) { console.log("BUG: Invalid scrolling value.") return } //don't setup an animation with duration 0, if we just don't want the animation if (animate) { scrollAnimation.to = value scrollAnimation.restart() } else { if (scrollAnimation.running) scrollAnimation.stop() styledItem.flickableItem[scrollbarUtils.propContent] = value styledItem.flickableItem.returnToBounds() } } function scrollToBeginning(animate) { scrollTo(flickableItem[scrollbarUtils.propOrigin] - visuals.leadingContentMargin, animate) } function scrollToEnd(animate) { scrollTo((flickableItem[scrollbarUtils.propOrigin] + totalContentSize - visuals.leadingContentMargin - pageSize), animate) } function drag() { scrollbarUtils.dragAndClamp(styledItem, slider.relThumbPosition, totalContentSize, pageSize); } function resetScrollingToPreDrag() { thumbArea.resetFlickableToPreDragState() } //As per spec, we show a hint of the scrollbars in indicator style whenever the //flickable item changes its size //NOTE: THIS IS ASSUMING THAT the transition to hidden state has a PauseAnimation, //otherwise the hinting would be too quick! function flashScrollbar() { //only show the hint if the scrollbar is currently hidden or its already showing the hint //(it could happen that while it is showing the hint the size of the flickable changes enough //to trigger the transition to thumb style, and in that case we want to hint again using thumb //style) if (initialized && isScrollable && !draggingThumb && !pressHoldTimer.running && (state == '' || state === 'hidden' || (__disableStateBinding && visuals.state !== hintingStyle))) { __disableStateBinding = true __hinting = true visuals.state = hintingStyle hintingTimer.restart() } } //The definition of isScrollable includes a binding on totalContentSize: //when totalContentSizeChanged triggers flashScrollbar, isScrollable may //have not been reevaluated yet using the new totalContentSize value, and //that could make the logic ignore the hinting request. //We perform the checks inside the flashScrollbar function instead of each //time before calling flashScrollbar (though this comes at slightly higher cost) onIsScrollableChanged: flashScrollbar() onTotalContentSizeChanged: flashScrollbar() onHintingStyleChanged: flashScrollbar() anchors.fill: parent opacity: overlayOpacityWhenHidden Component.onCompleted: initialized = true //we can't use onRunningChanged in the state transitions to enable the state binding again //after hinting, because that was causing //"Can't apply a state change as part of a state definition." when the state it was transitioning //to was different from the one the binding evaluationg was returning //Instead we use a timer, tune it so that it lasts as long as needed, and then we reenable the //state binding once the transition has completed Timer { id: hintingTimer repeat: false //we assume thickness animation duration is enough to complete the //transition to the hinting style interval: scrollbarThicknessAnimation.duration onTriggered: { __hinting = false __disableStateBinding = false } } /*! \internal Object storing property names used in calculations. */ QtObject { id: scrollbarUtils objectName: "scrollbarUtils" property string propOrigin: (isVertical) ? "originY" : "originX" property string propContent: (isVertical) ? "contentY" : "contentX" property string propPosRatio: (isVertical) ? "yPosition" : "xPosition" property string propSizeRatio: (isVertical) ? "heightRatio" : "widthRatio" property string propCoordinate: (isVertical) ? "y" : "x" property string propSize: (isVertical) ? "height" : "width" /*! Calculates the slider position based on the visible area's ratios. */ function sliderPos(scrollbar, min, max) { //the margin between the trough and the thumb min and max values var margin = scrollbar.__styleInstance.thumbsExtremesMargin //The total length of the path where the thumb can be positioned, from its min to its max value var draggableLength = scrollbar.__trough[propSize] - margin*2 var maxPosRatio = 1.0 - (scrollbar.flickableItem ? scrollbar.flickableItem.visibleArea[propSizeRatio] : 1.0) //Example with x/width, same applies to y/height //xPosition is in the range [0...1 - widthRatio] //and we want the following mapping (xPosition --> thumb.x): // 0 ---> margin (margin is the min position for the thumb) // 1 - widthRatio ---> (draggableLength - scrollbar.__styleInstance.thumb[propSize]) + margin //So we scale the maximum thumb position by xPosition. But that's not enough, because that would mean //the maxPosition is reached when xPosition becomes 1, and that never happens. To compensate that, we //scale xPosition by ( 1 / ( 1 - widthRatio) ). This way, when xPosition reaches its max ( 1 - widthRatio ) //we get a multiplication factor of 1 return MathUtils.clamp(1.0 / maxPosRatio * (scrollbar.flickableItem ? scrollbar.flickableItem.visibleArea[propPosRatio] : 1.0) * (draggableLength - scrollbar.__styleInstance.thumb[propSize]) + margin, min, max); } /*! Calculates the slider size for ListViews based on the visible area's position and size ratios, clamping it between min and max. The function can be used in Scrollbar styles to calculate the size of the slider. NOTE: THIS CODE IS ASSUMING THAT "MAX" IS ALSO THE "SIZE" OF THE TROUGH THAT THE THUMB CAN MOVE INTO! (which is what you want in 99.9% of the cases, for a scrollbar) */ function sliderSize(scrollbar, min, max) { var sizeRatio = scrollbar.flickableItem ? scrollbar.flickableItem.visibleArea[propSizeRatio] : 1.0; var posRatio = scrollbar.flickableItem ? scrollbar.flickableItem.visibleArea[propPosRatio] : 0.0; //(sizeRatio * max) is the current ideal size, as recommended by Flickable visibleArea props var sizeUnderflow = (sizeRatio * max) < min ? min - (sizeRatio * max) : 0 //we multiply by (max - sizeUndeflow) because we want to simulate a shorter trough. This is because //posRatio value is [0...1-sizeRatio] so it assumes the slider will be of size sizeRatio*size_of_the_trough //(because that's the only way to make the slider fill the remaining part of the trough when posRatio is //at its maximum value), while our slider could actually be bigger due to the imposed "min" value. //We will compensate for this shift by adding sizeUnderflow to endPos. var startPos = posRatio * (max - sizeUnderflow) var endPos = (posRatio + sizeRatio) * (max - sizeUnderflow) + sizeUnderflow var overshootStart = startPos < 0 ? -startPos : 0 var overshootEnd = endPos > max ? endPos - max : 0 // overshoot adjusted start and end var adjustedStartPos = startPos + overshootStart var adjustedEndPos = endPos - overshootStart - overshootEnd // final position and size of slider var position = adjustedStartPos + min > max ? max - min : adjustedStartPos var result = (adjustedEndPos - position) < min ? min : (adjustedEndPos - position) return result; } /*! The function calculates and clamps the position to be scrolled to the minimum and maximum values. The scroll and drag functions require a slider that does not have any minimum size set (meaning the minimum is set to 0.0). Implementations should consider using an invisible cursor to drag the slider and the ListView position. */ function scrollAndClamp(scrollbar, amount, min, max) { return scrollbar.flickableItem[propOrigin] + MathUtils.clamp(scrollbar.flickableItem[propContent] - scrollbar.flickableItem[propOrigin] + amount, min, max); } /*! The function calculates the new position of the dragged slider. The amount is relative to the contentSize, which is either the flickable's contentHeight or contentWidth or other calculated value, depending on its orientation. The pageSize specifies the visibleArea, and it is usually the heigtht/width of the scrolling area. //FIXME: should we change the API and remove pageSize or just pass trough's size as pageSize par? NOTE: when flickable.topMargin is 5GU, contentY has to be -5GU (not 0!) to be at the top of the scrollable!! */ function dragAndClamp(scrollbar, relThumbPosition, contentSize, pageSize) { scrollbar.flickableItem[propContent] = scrollbar.flickableItem[propOrigin] + relThumbPosition * (contentSize - scrollbar.flickableItem[propSize]) - leadingContentMargin; //don't use pageSize, we don't know if the scrollbar is edge to edge!; } } // The thumb appears whenever the mouse gets close enough to the scrollbar // and disappears after being for a long enough time far enough of it MouseArea { id: proximityArea //like containsMouse, but unlike it this property is not true when the user //taps on the area using touchscreen property bool containsMouseDevice: false anchors.fill: parent propagateComposedEvents: true preventStealing: false enabled: isScrollable && interactive hoverEnabled: isScrollable && interactive Mouse.ignoreSynthesizedEvents: true Mouse.onEntered: { isMouseConnected = true proximityArea.containsMouseDevice = true } Mouse.onExited: { overshootTimer.restart(); proximityArea.containsMouseDevice = false } onPressed: { mouse.accepted = false } Timer { id: overshootTimer interval: scrollbarThicknessAnimation.duration * 10 } } //each scrollbar connects to both width and height because //we want to show both the scrollbar in both cases Connections { target: (flickableItem && initialized) ? flickableItem : null onHeightChanged: flashScrollbar() onWidthChanged: flashScrollbar() //Use onTotalContentSizeChanged instead of binding to contentWidth/Height changes //to trigger the scrollbar hinting when the scrollable content is resized } SmoothedAnimation { id: scrollAnimation objectName: "scrollAnimation" //duration and easing coming from UX spec duration: UbuntuAnimation.SlowDuration easing.type: Easing.InOutCubic target: styledItem.flickableItem property: scrollbarUtils.propContent //when the listview has variable size delegates the contentHeight estimation done by ListView //could make us overshoot, especially when going from top to bottom of the list or viceversa. //We call returnToBounds to mitigate that. onRunningChanged: if (!running && flickableItem) { flickableItem.returnToBounds() } } Flow { id: flowContainer property bool showSteppers: false property bool showTrough: false property bool showCornerRect: false //thickness of trough and thumb property real thickness: 0 property real thumbThickness: 0 property real proximityThickness: (isVertical) ? styledItem.width - thickness : styledItem.height - thickness anchors { fill: parent leftMargin: (!isVertical || frontAligned) ? 0.0 : flowContainer.proximityThickness rightMargin: (!isVertical || rearAligned) ? 0.0 : flowContainer.proximityThickness topMargin: (isVertical || topAligned) ? 0.0 : flowContainer.proximityThickness bottomMargin: (isVertical || bottomAligned) ? 0.0 : flowContainer.proximityThickness } clip: true flow: (isVertical) ? Flow.TopToBottom : Flow.LeftToRight Item { id: troughContainer //account for 2 steppers at the end of the scrollbar width: isVertical ? parent.width : parent.width - steppersMouseArea.width height: isVertical ? parent.height - steppersMouseArea.height : parent.height // represents the visible area of the scrollbar where //slider and thumb connector are placed Rectangle { id: trough objectName: "trough" anchors.fill: parent visible: flowContainer.showTrough } Rectangle { id: slider objectName: "interactiveScrollbarThumb" //this property is true if the user could be starting a drag (i.e. pressed inside the thumb) //but drag.active is not true yet (because that requires dragging >0 pixels) //Usecase: thumb is at the top, user drags towards the top and //goes out of window -> drag.active won't trigger because the thumb can't move by even 1px, //but we still want the logic to know that user could be trying to drag (by moving the //mouse down again afterwards, for example) // //NOTE: starting a drag while the scrollbars are in steppers mode is considered a mouse drag //(because we want the style to stay to steppers) even when started with touch! property bool mouseDragging: false property bool touchDragging: false //the proportional position of the thumb relative to the trough it can move into //It is 0 when the thumb is at its minimum value, and 1 when it is at its maximum value property real relThumbPosition : isVertical ? (slider.y - thumbsExtremesMargin) / (trough.height - 2*thumbsExtremesMargin - slider.height) : (slider.x - thumbsExtremesMargin) / (trough.width - 2*thumbsExtremesMargin - slider.width) //we just need to call this onPressed, so we shouldn't use a binding for it, which would get //reevaluated any time one of the properties changes. //+ having it as a binding has the sideeffect that when we query its value from inside onPressed //it may not be using the most up-to-date value for *all* the variables it uses, and that would //break the logic function containsTouch() { var touchX = slider.mapFromItem(thumbArea, thumbArea.mouseX, thumbArea.mouseY).x var touchY = slider.mapFromItem(thumbArea, thumbArea.mouseX, thumbArea.mouseY).y //relaxed checks on the position of the touch, to allow some error if (touchX >= -visuals.touchDragStartMargin && touchX <= slider.width + visuals.touchDragStartMargin && touchY >= -visuals.touchDragStartMargin && touchY <= slider.height + visuals.touchDragStartMargin) { return true } else { return false } } anchors { verticalCenter: (isVertical) ? undefined : trough.verticalCenter horizontalCenter: (isVertical) ? trough.horizontalCenter : undefined } x: (isVertical) ? 0 : scrollbarUtils.sliderPos(styledItem, thumbsExtremesMargin, trough.width - slider.width - thumbsExtremesMargin) y: (!isVertical) ? 0 : scrollbarUtils.sliderPos(styledItem, thumbsExtremesMargin, trough.height - slider.height - thumbsExtremesMargin) radius: visuals.sliderRadius color: Qt.rgba(sliderColor.r, sliderColor.g, sliderColor.b, sliderColor.a * (visuals.draggingThumb ? 1.0 : 0.6)) //This is to stop the scrollbar from changing size while being dragged when we have listviews //with delegates of variable size (in those cases, contentWidth/height changes as the user scrolls //because of the way ListView estimates the size of the out-of-views delegates //and that would trigger resizing of the thumb) //NOTE: otoh, we want the x/y binding to apply (even though it will cause a small flickering occasionally) //even while dragging, because that guarantees the view is at the top when the user drags to the top Binding { when: !visuals.draggingThumb target: slider property: "width" value: (isVertical) ? flowContainer.thumbThickness : scrollbarUtils.sliderSize(styledItem, visuals.minimumSliderSize, trough.width - 2 * thumbsExtremesMargin) } Binding { when: !visuals.draggingThumb target: slider property: "height" value: (!isVertical) ? flowContainer.thumbThickness : scrollbarUtils.sliderSize(styledItem, visuals.minimumSliderSize, trough.height - 2 * thumbsExtremesMargin) } } //we reuse the MouseArea for touch interactions as well, because MultiTouchPointArea //can't propagate touch events underneath, if not consumed //(it would also require implementing drag as it doesn't have it) MouseArea { id: thumbArea objectName: "thumbArea" property real originXAtDragStart: 0 property real originYAtDragStart: 0 property real contentXAtDragStart: 0 property real contentYAtDragStart: 0 //cache input device position in order to ignore mouse/touch //moves which are shorter than a threshold. This is needed due //to the low precision of some touchscreen devices, to avoid //shaking the view while slowly dragging via touch property real previousX: 0 property real previousY: 0 //following UX spec, if during a drag the mouse goes far away from the scrollbar //we want to temporarily lock the drag and reset the scrollbar to where it was when //the drag started, WITHOUT losing the drag (if the mouse gets back within the distance //threshold, the drag has to resum without the need to release and pressHold again) property bool lockDrag: false property string scrollingProp: isVertical ? "y" : "x" property string sizeProp: isVertical ? "height" : "width" function initDrag(isMouse) { __disableStateBinding = true thumbArea.saveFlickableScrollingState() if (isMouse) { slider.mouseDragging = true visuals.state = "steppers" } else { slider.touchDragging = true visuals.state = "thumb" } } function resetDrag() { if (thumbArea.lockDrag) thumbArea.lockDrag = false slider.mouseDragging = false slider.touchDragging = false __disableStateBinding = false } function handlePress(mouseX, mouseY) { if (!thumbArea.pressed) return var mouseScrollingProp = isVertical ? mouseY : mouseX if (mouseScrollingProp < slider[scrollingProp]) { scrollBy(-pageSize*visuals.longScrollingRatio, true) } else if (mouseScrollingProp > slider[scrollingProp] + slider[sizeProp]) { scrollBy(pageSize*visuals.longScrollingRatio, true) } } function saveFlickableScrollingState() { originXAtDragStart = flickableItem.originX originYAtDragStart = flickableItem.originY contentXAtDragStart = flickableItem.contentX contentYAtDragStart = flickableItem.contentY } function resetFlickableToPreDragState() { //NOTE: when dealing with ListViews which have //delegates that are highly variable in size originX/Y and contentWidth/Height //change based on "out-of-view delegates" size estimation done by ListView. //In that case, we can't do anything to bring back the view to where it was //when the drag started, so we'd better not do anything instead of doing something //which we're sure will be wrong if (originXAtDragStart != flickableItem.originX || originYAtDragStart != flickableItem.originY) { return } flickableItem.contentX = contentXAtDragStart flickableItem.contentY = contentYAtDragStart } function cacheMousePosition(mouse) { previousX = mouse.x previousY = mouse.y } anchors { fill: trough // set margins adding 2 dp for error area leftMargin: (!isVertical || frontAligned) ? 0 : units.dp(-2) rightMargin: (!isVertical || rearAligned) ? 0 : units.dp(-2) topMargin: (isVertical || topAligned) ? 0 : units.dp(-2) bottomMargin: (isVertical || bottomAligned) ? 0 : units.dp(-2) } enabled: isScrollable && interactive onPressed: { cacheMousePosition(mouse) //potentially we allow using touch to trigger mouse interactions, in case the //mouse has previously hovered over the area and activated the steppers style //checking for the value of visuals.state wouldn't be useful here, the value could be //"hidden" even if the values have only just started transitioning from "steppers" state if (trough.visible) { var mouseScrollingProp = isVertical ? mouseY : mouseX //don't start the press and hold timer to avoid conflicts with the drag if (mouseScrollingProp < slider[scrollingProp] || mouseScrollingProp > (slider[scrollingProp] + slider[sizeProp])) { handlePress(mouseX, mouseY) pressHoldTimer.startTimer(thumbArea) } else { //we can't tell whether the drag is started from mouse or touch //(unless we add an additional multipointtoucharea and reimplement drag //but MPTArea can't ignore touch events so we wouldn't be able to propagate those) //so we assume that it's a mouse drag if the mouse is within the proximity area //when the mouse is dragged initDrag(true) } } else if (visuals.veryLongContentItem && slider.containsTouch()) { initDrag(false) } else { //propagate otherwise mouse.accepted = false } } onPositionChanged: { //avoid shaking the view when the user is draggin via touch if (Math.abs(mouse.x - previousX) < visuals.dragThreshold && Math.abs(mouse.y - previousY) < visuals.dragThreshold) { return } cacheMousePosition(mouse) if (pressedButtons == Qt.LeftButton && (slider.mouseDragging || slider.touchDragging)) { if ((isVertical && Math.abs(mouse.x - thumbArea.x) >= flowContainer.thickness * 10) || (!isVertical && Math.abs(mouse.y - thumbArea.y) >= flowContainer.thickness * 10)) { //don't reset it if the user is already scrolling the view (via keyboard or similar) if (!scrollAnimation.running) { resetFlickableToPreDragState() thumbArea.lockDrag = true } } else { //don't clash with scrolling animation if (scrollAnimation.running) scrollAnimation.stop() if (thumbArea.lockDrag) thumbArea.lockDrag = false visuals.drag() } } } onCanceled: { resetDrag() pressHoldTimer.stop() } onReleased: { resetDrag() pressHoldTimer.stop() } drag { //don't start a drag while we're scrolling using press and hold target: pressHoldTimer.running ? undefined : slider axis: (isVertical) ? Drag.YAxis : Drag.XAxis minimumY: lockDrag ? slider.y : thumbsExtremesMargin maximumY: lockDrag ? slider.y : trough.height - slider.height - thumbsExtremesMargin minimumX: lockDrag ? slider.x : thumbsExtremesMargin maximumX: lockDrag ? slider.x : trough.width - slider.width - thumbsExtremesMargin onActiveChanged: { if (drag.active) { //drag.active is true only when the target has been moved by >0 pixels (if threshold == 0) //that means if the bar is at the top and user drags it upwards, drag.active won't change, //but the user will still be able to leave the app window from above, move mouse to the left (or right) //enough to trigger the drag lock logic, and then come back in the window and move downwards. //At *that* point drag.active will become true, but we don't want to actually drag the thumb //because the mouse is still outside the area where thumb is follow input device movements if (!lockDrag) { visuals.drag() } } else { resetDrag() } } //NOTE: we need threshold to be 0, otherwise it will be //impossible to drag contentItems which have a size so that //"flickableItem.height - contentItem.height < threshold"!!! threshold: 0 } Timer { id: pressHoldTimer //This var is needed to reuse the same timer to handle //both thumb and steppers press-and-hold //NOTE: the item MUST provide a handlePress method property MouseArea startedBy property bool firstTrigger: true function startTimer(item) { startedBy = item start() } interval: firstTrigger ? 500 : 250 onTriggered: { if (firstTrigger) firstTrigger = false if (startedBy !== undefined) { startedBy.handlePress(startedBy.mouseX, startedBy.mouseY) } else { console.log("Congrats, you have just found a bug! Press and hold timer is running without knowing the item that started it. Please report this.") } } repeat: true onRunningChanged: { if (!running) { firstTrigger = true } } } } } MouseArea { id: steppersMouseArea //size is handled by the states function handlePress() { var mappedCoordFirstStepper = mapToItem(firstStepper, mouseX, mouseY) var mappedCoordSecondStepper = mapToItem(secondStepper, mouseX, mouseY) if (firstStepper.contains(Qt.point(mappedCoordFirstStepper.x, mappedCoordFirstStepper.y))) { scrollBy(-pageSize * visuals.shortScrollingRatio, true) } else if (secondStepper.contains(Qt.point(mappedCoordSecondStepper.x, mappedCoordSecondStepper.y))) { scrollBy(pageSize * visuals.shortScrollingRatio, true) } } enabled: isScrollable && interactive visible: flowContainer.showSteppers //We don't change the size of the images because we let the image reader figure the size out, //though that means we have to hide the images somehow while the mousearea is visible but has //null size. We choose to enable clipping here instead of creating bindings on images' visible prop clip: true onPressed: { handlePress() pressHoldTimer.startTimer(steppersMouseArea) } onReleased: pressHoldTimer.stop() onCanceled: pressHoldTimer.stop() Rectangle { id: firstStepper objectName: "firstStepper" anchors { //it's left in both cases, otherwise using RTL //would break the layout of the arrow left: parent.left right: isVertical ? parent.right : undefined top: parent.top bottom: !isVertical ? parent.bottom : undefined } color: trough.color visible: parent.visible clip: true Binding { target: firstStepper property: "height" when: isVertical value: visible ? troughThicknessSteppersStyle : 0 } Binding { target: firstStepper property: "width" when: !isVertical value: visible ? troughThicknessSteppersStyle : 0 } Icon { anchors.centerIn: parent rotation: isVertical ? 180 : 90 source: Qt.resolvedUrl("../artwork/scrollbar_arrow.png") color: sliderColor keyColor: "#5d5d5d" } } Rectangle { id: secondStepper objectName: "secondStepper" anchors { left: isVertical ? parent.left : firstStepper.right right: isVertical ? parent.right : undefined top: !isVertical ? parent.top : firstStepper.bottom bottom: !isVertical ? parent.bottom : undefined } color: trough.color clip: true visible: parent.visible Binding { target: secondStepper property: "height" when: isVertical value: visible ? troughThicknessSteppersStyle : 0 } Binding { target: secondStepper property: "width" when: !isVertical value: visible ? troughThicknessSteppersStyle : 0 } Icon { anchors.centerIn: parent rotation: isVertical ? 0 : -90 source: Qt.resolvedUrl("../artwork/scrollbar_arrow.png") color: sliderColor keyColor: "#5d5d5d" } } } } //just a hack: a rectangle which covers the corner where scrollbars meet, when they're in steppers style Rectangle { id: cornerRect anchors.left: { if (styledItem.__buddyScrollbar && styledItem.__buddyScrollbar.__styleInstance && styledItem.__buddyScrollbar.__styleInstance.isScrollable) { if (isVertical) { return flowContainer.left } else { if (styledItem.__buddyScrollbar.align === Qt.AlignTrailing) { return flowContainer.right } else return undefined } } } anchors.right: { if (styledItem.__buddyScrollbar && styledItem.__buddyScrollbar.__styleInstance && styledItem.__buddyScrollbar.__styleInstance.isScrollable) { if (isVertical) { return flowContainer.right } else { if (styledItem.__buddyScrollbar.align === Qt.AlignLeading) { return flowContainer.left } else { return undefined } } } } anchors.top: { if (styledItem.__buddyScrollbar && styledItem.__buddyScrollbar.__styleInstance && styledItem.__buddyScrollbar.__styleInstance.isScrollable) { if (isVertical) { if (styledItem.__buddyScrollbar.align === Qt.AlignBottom) { return flowContainer.bottom } else { return undefined } } else { return undefined } } } anchors.bottom: { if (styledItem.__buddyScrollbar && styledItem.__buddyScrollbar.__styleInstance && styledItem.__buddyScrollbar.__styleInstance.isScrollable) { if (isVertical) { if (styledItem.__buddyScrollbar.align === Qt.AlignTop) { return flowContainer.top } else { return undefined } } else { return flowContainer.bottom } } } //REMEMBER: the thickness animates during state changes, //so we want to bind the right side to the thickness of the scrollbar width: isVertical ? flowContainer.thickness : troughThicknessSteppersStyle height: isVertical ? troughThicknessSteppersStyle : flowContainer.thickness color: trough.color visible: flowContainer.showCornerRect && styledItem.__buddyScrollbar && styledItem.__buddyScrollbar.__styleInstance.isScrollable } Binding { when: !__disableStateBinding target: visuals property: 'state' value: { if (!isScrollable && !alwaysOnScrollbars) { return ''; } else if (overlay) { //we use the check on running to avoid to make it so that the scrollbar completes the transition //to the steppers (or thumb) state even when the mouse exits the area prematurely (e.g. when the mouse //overshoots, without the .running check the scrollbar would stop the growing transition halfway and //go back to hidden mode) if (proximityArea.containsMouseDevice || (draggingThumb && slider.mouseDragging) || __overshootTimer.running) { return 'steppers' } else if (thumbStyleFlag || (draggingThumb && slider.touchDragging) || __overshootTimer.running) { return 'thumb' } else if (flickableItem.moving || scrollAnimation.running || transitionToIndicator.running) { return 'indicator'; } else return 'hidden'; } else { return 'steppers' } } } states: [ State { name: 'hidden' extend: '' PropertyChanges { target: visuals opacity: overlayOpacityWhenHidden } }, State { name: 'shown' PropertyChanges { target: visuals opacity: overlayOpacityWhenShown } }, State { name: 'indicator' extend: 'shown' PropertyChanges { target: flowContainer thickness: troughThicknessIndicatorStyle thumbThickness: indicatorThickness showSteppers: false showTrough: alwaysOnScrollbars showCornerRect: false } PropertyChanges { target: steppersMouseArea width: 0 height: 0 } PropertyChanges { target: trough color: Qt.rgba(troughColorThumbStyle.r, troughColorThumbStyle.g, troughColorThumbStyle.b, troughColorThumbStyle.a * 0.2) } }, State { name: 'thumb' extend: 'shown' PropertyChanges { target: flowContainer thickness: visuals.troughThicknessThumbStyle thumbThickness: visuals.thumbThickness showSteppers: false showTrough: alwaysOnScrollbars showCornerRect: false } PropertyChanges { target: steppersMouseArea width: 0 height: 0 } PropertyChanges { target: trough color: Qt.rgba(troughColorThumbStyle.r, troughColorThumbStyle.g, troughColorThumbStyle.b, troughColorThumbStyle.a * 0.2) } }, State { name: 'steppers' extend: 'shown' PropertyChanges { target: flowContainer thickness: visuals.troughThicknessSteppersStyle thumbThickness: visuals.thumbThickness showSteppers: visuals.useSteppers showTrough: true showCornerRect: true } PropertyChanges { target: steppersMouseArea width: isVertical ? flowContainer.width : (firstStepper.visible ? firstStepper.width : 0) + (secondStepper.visible ? secondStepper.width : 0) height: isVertical ? (firstStepper.visible ? firstStepper.height : 0) + (secondStepper.visible ? secondStepper.height : 0) : trough.height } PropertyChanges { target: trough color: Qt.rgba(troughColorSteppersStyle.r, troughColorSteppersStyle.g, troughColorSteppersStyle.b, troughColorSteppersStyle.a * 0.9) } } ] transitions: [ Transition { from: '' to: 'shown' NumberAnimation { target: visuals property: "opacity" duration: scrollbarFadeInAnimation.duration easing: scrollbarFadeInAnimation.easing } }, Transition { from: 'thumb,steppers' to: 'indicator' id: collapsingTransition SequentialAnimation { //don't pause the animation if we're showing the *hint* and the hintingStyle changes from //thumb/steppers to indicator PauseAnimation { id: scrollbarCollapseAnim; duration: __disableStateBinding ? 0 : scrollbarCollapsePause } PropertyAction { target: steppersMouseArea properties: isVertical ? "width" : "height" } ParallelAnimation { NumberAnimation { target: flowContainer properties: "thickness,thumbThickness" duration: scrollbarThicknessAnimation.duration easing: scrollbarThicknessAnimation.easing } NumberAnimation { target: steppersMouseArea properties: isVertical ? "height" : "width" duration: scrollbarThicknessAnimation.duration easing: scrollbarThicknessAnimation.easing } ColorAnimation { target: trough; duration: scrollbarThicknessAnimation.duration } } PropertyAction { target: flowContainer properties: "showSteppers,showTrough,showCornerRect" } } }, Transition { id: transitionToIndicator from: '*' to: 'indicator' SequentialAnimation { ParallelAnimation { NumberAnimation { target: visuals property: "opacity" duration: scrollbarThicknessAnimation.duration easing: scrollbarThicknessAnimation.easing } NumberAnimation { target: flowContainer properties: "thickness,thumbThickness" duration: scrollbarThicknessAnimation.duration easing: scrollbarThicknessAnimation.easing } ColorAnimation { target: trough; duration: scrollbarThicknessAnimation.duration } } //this covers the case when scrollbar is still transitioning from steppers style to hidden, //but the transition is not yet finished, and we flick the view. At that point the state is "hidden" //but the properties are still transitioning from steppers style to hidden. If a change to "indicator" //style is triggered while the properties are still transitioning, we have to handle those properties //as well to avoid immediate changes in the UI. PropertyAction { target: flowContainer properties: "showSteppers,showTrough,showCornerRect" } } }, Transition { id: growingTransition objectName: "indicatorToThumbSteppersTransition" from: 'indicator' to: 'thumb,steppers' reversible: true SequentialAnimation { PropertyAction { target: flowContainer properties: "showSteppers,showTrough,showCornerRect" } PropertyAction { target: steppersMouseArea properties: isVertical ? "width" : "height" } ParallelAnimation { NumberAnimation { target: visuals property: "opacity" duration: scrollbarThicknessAnimation.duration easing: scrollbarThicknessAnimation.easing } NumberAnimation { target: flowContainer properties: "thickness,thumbThickness" duration: scrollbarThicknessAnimation.duration easing: scrollbarThicknessAnimation.easing } NumberAnimation { target: steppersMouseArea properties: isVertical ? "height" : "width" duration: scrollbarThicknessAnimation.duration easing: scrollbarThicknessAnimation.easing } ColorAnimation { target: trough; duration: scrollbarThicknessAnimation.duration } } } }, Transition { id: steppersTransition objectName: "anythingToThumbSteppersTransition" from: '*' to: 'thumb,steppers' SequentialAnimation { PropertyAction { target: flowContainer properties: "showSteppers,showTrough,showCornerRect" } PropertyAction { target: steppersMouseArea properties: isVertical ? "width" : "height" } ParallelAnimation { NumberAnimation { target: visuals property: "opacity" duration: scrollbarThicknessAnimation.duration easing: scrollbarThicknessAnimation.easing } NumberAnimation { target: flowContainer properties: "thickness,thumbThickness" //the check on opacity is needed because this transition is also run when a transition to "hidden" //is still in progress! For example: transition from indicator to hidden is started, the state is set to "hidden" //immediately, but the transition still has to happen. If, in this situation, we trigger a state change from "hidden" //to another state (thumb/steppers) this transition is fired, but the fact that state is "hidden" is not //really informative, we need to know if the stuff is actually visible on screen, because we want different //animation based on whether we're animating from visible or invisible content, even if in both cases the state is "hidden"! duration: visuals.opacity > 0 ? scrollbarThicknessAnimation.duration : 0 easing: scrollbarThicknessAnimation.easing } NumberAnimation { target: steppersMouseArea properties: isVertical ? "height" : "width" duration: visuals.opacity > 0 ? scrollbarThicknessAnimation.duration : 0 easing: scrollbarThicknessAnimation.easing } ColorAnimation { target: trough; duration: visuals.opacity > 0 ? scrollbarThicknessAnimation.duration : 0 } } } }, Transition { id: hidingAnimation from: '*' to: 'hidden' SequentialAnimation { PauseAnimation { id: fadeOutPauseAnim; duration: scrollbarFadeOutPause } NumberAnimation { target: visuals property: "opacity" duration: scrollbarFadeOutAnimation.duration easing: scrollbarFadeOutAnimation.easing } PropertyAction { target: steppersMouseArea properties: "width,height" } PropertyAction { target: flowContainer properties: "thickness,thumbThickness,showSteppers,showTrough,showCornerRect" } PropertyAction { target: trough properties: "color" } PropertyAction { target: visuals properties: "state" } } } ] } ./src/Ubuntu/Components/Themes/Ambiance/1.3/OverflowPanel.qml0000644000015600001650000000754312700370701024024 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components.Popups 1.3 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem /*! \internal */ ActionSelectionPopover { id: overflow // clicks next to the overflow panel must only close the panel, // not trigger additional events. grabDismissAreaEvents: true /*! The background color of the tabs panel and the actions overflow panel. */ property color backgroundColor: theme.palette.normal.background /*! The background color of the tapped item in the panel. */ property color highlightColor: theme.palette.highlighted.background /*! The foreground color (icon and text) of actions in the panel. */ property color foregroundColor: styledItem.enabled ? theme.palette.normal.backgroundText : theme.palette.disabled.backgroundText property bool square: true callerMargin: -units.gu(1) + units.dp(4) contentWidth: units.gu(20) Binding { target: overflow.__foreground.__styleInstance property: "color" value: overflow.backgroundColor when: overflow.__foreground && overflow.__foreground.__styleInstance } delegate: AbstractButton { id: actionButton action: modelData // close after triggering the action. onClicked: overflow.hide() implicitHeight: units.gu(6) + bottomDividerLine.height width: parent ? parent.width : units.gu(31) Rectangle { visible: parent.pressed anchors { left: parent.left right: parent.right top: parent.top } height: parent.height - bottomDividerLine.height color: overflow.highlightColor } Icon { id: actionIcon visible: "" != action.iconSource source: action.iconSource color: overflow.foregroundColor anchors { verticalCenter: parent.verticalCenter verticalCenterOffset: units.dp(-1) left: parent.left leftMargin: units.gu(2) } width: units.gu(2) height: units.gu(2) } Label { anchors { verticalCenter: parent.verticalCenter verticalCenterOffset: units.dp(-1) left: actionIcon.visible ? actionIcon.right : parent.left leftMargin: units.gu(2) right: parent.right } // In the tabs overflow panel there are no icons, and the font-size // is medium as opposed to the small font-size in the actions overflow panel. textSize: actionIcon.visible ? Label.Small : Label.Medium elide: Text.ElideRight text: action.text color: overflow.foregroundColor } // The value of showDivider is automatically set by ActionSelectionPopover. property bool showDivider ListItem.ThinDivider { id: bottomDividerLine anchors.bottom: parent.bottom visible: actionButton.showDivider } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/DialerStyle.qml0000644000015600001650000001014212700370701023447 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import QtGraphicalEffects 1.0 // FIXME: Replace this once UbuntuShape support for gradients and shading has landed Rectangle { anchors.fill: parent radius: width / 2 antialiasing: true property real offset : units.gu(0.2) property color dialerColor: theme.palette.normal.base gradient: Gradient { GradientStop { position: 0.0; color: dialerColor } GradientStop { position: 0.25; color: Qt.darker(dialerColor, 1.0) } GradientStop { position: 0.5; color: Qt.darker(dialerColor, 1.1) } GradientStop { position: 0.75; color: Qt.darker(dialerColor, 1.2) } GradientStop { position: 1.0; color: Qt.darker(dialerColor, 1.3) } } // draws the outter shadow/highlight Rectangle { id: sourceOutter anchors { fill: parent; margins: -offset } radius: (width / 2) antialiasing: true gradient: Gradient { GradientStop { position: 0.0; color: "black" } GradientStop { position: 0.5; color: "transparent" } GradientStop { position: 1.0; color: "white" } } } // mask for outer 3D effect Rectangle { id: maskOutter anchors.fill: sourceOutter color: "transparent" radius: (width / 2) antialiasing: true border { width: offset; color: "black" } } // outter effect OpacityMask { anchors.fill: sourceOutter opacity: 0.65 source: ShaderEffectSource { sourceItem: sourceOutter hideSource: true } maskSource: ShaderEffectSource { sourceItem: maskOutter hideSource: true } } // center item // FIXME: Replace this once UbuntuShape support for gradients and shading has landed Rectangle { parent: styledItem.centerItem.parent anchors.fill: parent radius: width / 2; antialiasing: true; gradient: Gradient { GradientStop { position: 0.0; color: dialerColor } GradientStop { position: 0.25; color: Qt.darker(dialerColor, 1.0) } GradientStop { position: 0.5; color: Qt.darker(dialerColor, 1.1) } GradientStop { position: 0.75; color: Qt.darker(dialerColor, 1.2) } GradientStop { position: 1.0; color: Qt.darker(dialerColor, 1.3) } } // draws the inner highlight / shadow Rectangle { id: sourceInner; anchors { fill: parent; margins: -offset } radius: (width / 2) antialiasing: true gradient: Gradient { GradientStop { position: 0.0; color: "white" } GradientStop { position: 0.5; color: "transparent" } GradientStop { position: 1.0; color: "black" } } } // mask for inner 3D effect Rectangle { id: maskInner color: "transparent" anchors.fill: sourceInner radius: (width / 2) antialiasing: true border { width: offset; color: "black" } } // inner effect OpacityMask { opacity: 0.65 anchors.fill: sourceInner source: ShaderEffectSource { sourceItem: sourceInner hideSource: true } maskSource: ShaderEffectSource { sourceItem: maskInner hideSource: true } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/sliderUtils.js0000644000015600001650000000252112700370701023356 0ustar jenkinsjenkins/* * Copyright 2013-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \qmltype sliderUtils \inqmlmodule Ubuntu.Components 1.3 \ingroup ubuntu \brief Various sliding utility functions. */ .pragma library /*! \qmlmethod sliderUtils::liveValue(item) The function returns the live value of the slider. */ function liveValue(item) { return item.__internals.liveValue; } /*! \qmlmethod sliderUtils::normalizedValue(item) The function returns the normalized live value of the slider. */ function normalizedValue(item) { return item.__internals.normalizedValue; } /*! \qmlmethod sliderUtils::isPressed(item) The function returns whether the slider is being pressed or not. */ function isPressed(item) { return item.__internals.isPressed; } ./src/Ubuntu/Components/Themes/Ambiance/1.3/ToolbarStyle.qml0000644000015600001650000000246612700370701023663 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Window 2.2 import Ubuntu.Components 1.3 import Ubuntu.Components.Styles 1.3 as Style Style.ToolbarStyle { id: toolbarStyle implicitWidth: parent ? parent.width : 0 // reduce toolbar height on phone in landscape orientation: implicitHeight: Screen.height > units.gu(50) ? units.gu(4) : units.gu(3) /*! The default action delegate if the styled item does not provide a delegate. */ defaultDelegate: AbstractButton { style: IconButtonStyle { } objectName: action.objectName + "_button" height: parent ? parent.height : undefined width: units.gu(4) action: modelData } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/MainViewStyle.qml0000644000015600001650000000375512700370701024002 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { anchors.fill: parent z: -1 id: mainViewStyle /*! \deprecated Color of the header's background. \sa backgroundColor, footerColor */ property color headerColor: styledItem.headerColor /*! Color of the background. The background is usually a single color. However if \l headerColor or \l footerColor are set then a gradient of colors will be drawn. \sa footerColor, headerColor */ property color backgroundColor: styledItem.backgroundColor /*! \deprecated Color of the footer's background. \sa backgroundColor, headerColor */ property color footerColor: styledItem.footerColor Rectangle { anchors.fill: parent // Hide the gradient if the style was loaded and afterwards the header // and footer color are set to the same value as backgroundColor. visible: mainViewStyle.backgroundColor != mainViewStyle.headerColor || mainViewStyle.backgroundColor != mainViewStyle.footerColor gradient: Gradient { GradientStop { position: 0.0; color: mainViewStyle.headerColor } GradientStop { position: 0.83; color: mainViewStyle.backgroundColor } GradientStop { position: 1.0; color: mainViewStyle.footerColor } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/SectionsForPageHeadStyle.qml0000644000015600001650000001020112700370701026060 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: sectionsStyle implicitWidth: sectionsRow.width implicitHeight: units.gu(4) enabled: styledItem.enabled /*! The foreground color of unselected sections. */ property color sectionColor: enabled ? theme.palette.normal.backgroundTertiaryText : theme.palette.disabled.backgroundTertiaryText /*! The foreground color of the selected section. */ property color selectedSectionColor: enabled ? theme.palette.selected.backgroundTertiaryText : theme.palette.selectedDisabled.backgroundTertiaryText /*! The background color for the pressed section button. */ property color pressedBackgroundColor: theme.palette.highlighted.background /*! The font size for the text in the buttons. */ property int textSize: Label.Small /*! The spacing on the left and right sides of the label inside a section button. */ property real horizontalLabelSpacing: units.gu(2) /*! The height of the bar underlining the sections. */ property real underlineHeight: units.dp(2) Row { id: sectionsRow anchors { top: parent.top bottom: parent.bottom horizontalCenter: parent.horizontalCenter } width: childrenRect.width Repeater { id: sectionsRepeater model: styledItem.model objectName: "sections_repeater" AbstractButton { id: sectionButton anchors { top: parent ? parent.top : undefined bottom: parent ? parent.bottom : undefined } objectName: "section_button_" + index width: label.width + 2 * sectionsStyle.horizontalLabelSpacing height: sectionsRow.height property bool selected: index === styledItem.selectedIndex onClicked: styledItem.selectedIndex = index // Background pressed highlight Rectangle { visible: parent.pressed anchors.fill: parent color: sectionsStyle.pressedBackgroundColor } // Section title Label { id: label objectName: "section_button_label_" + index // modelData may be either a string, or an Action text: modelData.hasOwnProperty("text") ? modelData.text : modelData textSize: sectionsStyle.textSize anchors.centerIn: parent color: sectionButton.selected ? sectionsStyle.selectedSectionColor : sectionsStyle.sectionColor } // Section title underline Rectangle { anchors { bottom: parent.bottom left: parent.left right: parent.right } height: sectionsStyle.underlineHeight color: sectionButton.selected ? sectionsStyle.selectedSectionColor : sectionsStyle.sectionColor } } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/ToolbarButtonStyle.qml0000644000015600001650000000367412700370701025061 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: visuals // styling properties property int iconWidth: units.gu(2) property int iconHeight: units.gu(2) implicitWidth: label.paintedWidth anchors.fill: parent Item { anchors.centerIn: parent height: icon.height + label.height + label.anchors.topMargin // FIXME: is there a reason we are still using styledItem.iconSource instead of iconName // so we coudl use the Icon? Icon { id: icon anchors { top: parent.top horizontalCenter: parent.horizontalCenter } width: iconWidth height: iconWidth name: styledItem.iconName color: label.color } Label { id: label anchors { horizontalCenter: parent.horizontalCenter top: icon.bottom topMargin: units.gu(1) } width: paintedWidth text: styledItem.text textSize: Label.XSmall color: styledItem.enabled ? theme.palette.normal.overlayText : theme.palette.disabled.overlayText } } Component.onCompleted: styledItem.implicitWidth = implicitWidth } ./src/Ubuntu/Components/Themes/Ambiance/1.3/ListItemOptionSelectorStyle.qml0000644000015600001650000000161012700370701026673 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: ambianceStyle property url chevron: Qt.resolvedUrl("../artwork/chevron_down.png") property url tick: Qt.resolvedUrl("../artwork/tick.png") property bool colourComponent: true } ./src/Ubuntu/Components/Themes/Ambiance/1.3/TextCursorStyle.qml0000644000015600001650000000671412700370701024403 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 // FIXME : move the API into Ubuntu.Components.Style Item { id: cursorStyle /*! Property specifying the visible timeout of the cursor. It is not mandatory for styles to define values for this property if the cursor blinking is not desired. A value of 0 turns off the cursor blinking. */ property int cursorVisibleTimeout: 800 /*! Property specifying the hidden timeout of the cursor. It is not mandatory for styles to define values for this property if the cursor blinking is not desired. A value of 0 turns off the cursor blinking. */ property int cursorHiddenTimeout: 400 /*! Component defining the default cursor visuals. */ property Component cursorDelegate: delegate /*! The item pointing to the cursor handler. Styles should set to null if the cursor does not have handler at all. */ property Item caret: caretItem /*! The width of the cursor. */ property int cursorWidth: units.dp(2) // style body Component { id: delegate Rectangle { objectName: "text_cursor_style_" + styledItem.positionProperty width: cursorWidth // FIXME: check with design whether should it be activity or something else color: theme.palette.normal.activity visible: blinkTimer.timerShowCursor || !blinkTimer.running Timer { id: blinkTimer interval: cursorStyle.cursorVisibleTimeout running: (cursorStyle.cursorVisibleTimeout > 0) && (cursorStyle.cursorHiddenTimeout > 0) && styledItem.visible && shouldBlink repeat: true property bool shouldBlink: styledItem.positionProperty === "cursorPosition" && !styledItem.readOnly && !styledItem.contextMenuVisible property bool timerShowCursor: true onTriggered: { interval = (interval == cursorStyle.cursorVisibleTimeout) ? cursorStyle.cursorHiddenTimeout : cursorStyle.cursorVisibleTimeout; timerShowCursor = !timerShowCursor; } } } } // caretItem Image { id: caretItem source: Qt.resolvedUrl("../artwork/caret_noshadow.png") objectName: "text_cursor_style_caret_" + styledItem.positionProperty property bool flip: styledItem.positionProperty !== "selectionStart" rotation: flip ? 180 : 0 anchors { top: flip ? parent.bottom : undefined bottom: flip ? undefined : parent.top horizontalCenter: parent.horizontalCenter horizontalCenterOffset: cursorWidth / 2 } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/ActionBarStyle.qml0000644000015600001650000001337212700370701024121 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 import Ubuntu.Components.Styles 1.3 as Style Style.ActionBarStyle { id: actionBarStyle implicitWidth: actionsContainer.implicitWidth implicitHeight: units.gu(5) overflowIconName: "contextual-menu" // Unused with the standard action icon buttons, but may be used with a custom delegate. overflowText: "More" /*! The default action delegate if the styled item does not provide a delegate. */ defaultDelegate: AbstractButton { style: IconButtonStyle { } objectName: action.objectName + "_button" height: parent ? parent.height : undefined action: modelData } defaultNumberOfSlots: 3 Component { id: fadeInComponent SequentialAnimation { id: fadeIn property alias target: opacityAnimation.target ScriptAction { script: fadeIn.target.opacity = 0.0; } UbuntuNumberAnimation { id: opacityAnimation from: 0.0 to: 1.0 property: "opacity" alwaysRunToEnd: true duration: UbuntuAnimation.BriskDuration } ScriptAction { script: fadeIn.destroy() } } } Row { id: actionsContainer property var visibleActions: getVisibleActions(styledItem.actions) function getVisibleActions(actions) { var visibleActionList = []; for (var i in actions) { var action = actions[i]; if (action && action.hasOwnProperty("visible") && action.visible) { visibleActionList.push(action); } } return visibleActionList; } function getReversedActions(actions) { var newlist = []; for (var i=actions.length-1; i >= 0; i--) { newlist.push(actions[i]); } return newlist; } property var directActions: getReversedActions(visibleActions.slice(0, numberOfSlots.used)) property var barActions: overflowAction.visible ? directActions.concat(overflowAction) : directActions property var overflowActions: visibleActions.slice(numberOfSlots.used, numberOfSlots.requested) QtObject { id: numberOfSlots property int requested: actionsContainer.visibleActions.length property int available: styledItem.numberOfSlots property int overflow: overflowAction.visible ? 1 : 0 // when numberOfSlots < 1, show the overflow button, but set used // to 0 so that all actions will appear in the overflow panel. property int used: Math.min(Math.max(0, available - overflow), requested) } anchors { top: parent.top bottom: parent.bottom } Repeater { id: actionsRepeater objectName: "actions_repeater" model: actionsContainer.barActions delegate: styledItem.delegate property int previousCount: count onCountChanged: { // after all itemAdded signals previousCount = count; } function fadeIn(item) { var fadeObject = fadeInComponent.createObject(actionBarStyle, {"target": item}); fadeObject.target = item; fadeObject.start(); } onItemAdded: { if (count <= previousCount) return; // no items added if (index == 0) fadeIn(item); } } Action { id: overflowAction iconSource: actionBarStyle.overflowIconSource iconName: actionBarStyle.overflowIconName text: actionBarStyle.overflowText objectName: "overflow_action" visible: numberOfSlots.requested > numberOfSlots.available onTriggered: { var overflowButton = actionsRepeater.itemAt(actionsRepeater.count - 1); PopupUtils.open(actionsOverflowPopoverComponent, overflowButton); } } Component { id: actionsOverflowPopoverComponent OverflowPanel { id: actionsOverflowPopover objectName: "actions_overflow_panel" // Ensure the popover closes when actions change and // the list item below may be destroyed before its // onClicked is executed. See bug // https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1326963 Connections { target: styledItem onActionsChanged: { actionsOverflowPopover.hide(); } } actions: actionsContainer.overflowActions } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/PickerStyle.qml0000644000015600001650000000774312700370701023501 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 Item { id: control // style properties /*! Specifies the background color */ property color backgroundColor: styledItem.enabled ? theme.palette.normal.foreground : theme.palette.disabled.foreground /*! Background color for highlight. */ property color highlightBackgroundColor: "#ffffffff" /*! Highlight color. */ property color highlightColor: theme.palette.highlighted.baseText /*! Scale of the highlight item */ property real highlightScaleFactor: 1.2 /*! Thickness of the highlight component */ property real highlightThickness: styledItem.itemHeight + units.gu(1) /*! The content holder exposed to the Picker so tumbler list can be reparented to it. */ property alias tumblerHolder: content /*! \internal View instance listing the model */ property Item view: Item{} anchors.fill: parent implicitWidth: units.gu(8) implicitHeight: units.gu(20) // frame UbuntuShape { anchors.fill: parent radius: "medium" backgroundColor: theme.palette.normal.overlay source: shapeSource } ShaderEffectSource { id: shapeSource sourceItem: background hideSource: true // FIXME: visible: false prevents rendering so make it a nearly // transparent 1x1 pixel instead opacity: 0.01 width: 1 height: 1 } Rectangle { id: background anchors.fill: parent MouseArea { anchors.fill: parent } // background color: backgroundColor Item { id: content anchors.fill: parent } // highlight Rectangle { id: highlightItem y: (content.height - control.highlightThickness) / 2 anchors { left: content.left right: content.right } height: control.highlightThickness color: highlightBackgroundColor } ThinDivider { anchors { left: content.left right: content.right bottom: highlightItem.top } } ThinDivider { anchors { left: content.left right: content.right top: highlightItem.bottom } } ShaderEffectSource { id: effectSource visible: false sourceItem: view property real sourceRectMultiplier: 2.0 // XXX: This works because the parent of magnifier is the same as sourceItem // in this case. Otherwise coordinate transformations will be needed. sourceRect: Qt.rect(highlightItem.x, highlightItem.y, highlightItem.width, highlightItem.height) textureSize: Qt.size(highlightItem.width*sourceRectMultiplier, highlightItem.height*sourceRectMultiplier) } HighlightMagnifier { anchors.fill: highlightItem scaleFactor: control.highlightScaleFactor outputColor: control.highlightColor source: effectSource } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/SheetForegroundStyle.qml0000644000015600001650000000667412700370701025371 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: visuals // styling properties property color backgroundColor: "lightgray" property color headerColor: "darkgray" property real headerHeight: units.gu(8) property real buttonContainerWidth: units.gu(14) implicitWidth: MathUtils.clamp(styledItem.contentsWidth, styledItem.minWidth, styledItem.maxWidth) implicitHeight: header.height + containerItem.height property alias contentItem: containerItem Rectangle { id: header color: visuals.headerColor height: visuals.headerHeight anchors { top: parent.top left: parent.left right: parent.right } Label { id: headerText anchors { verticalCenter: parent.verticalCenter left: leftButtonContainer.right right: rightButtonContainer.left } width: headerText.implicitWidth + units.gu(4) elide: Text.ElideRight horizontalAlignment: Text.AlignHCenter text: styledItem.title } Item { id: leftButtonContainer anchors { left: parent.left top: parent.top bottom: parent.bottom } width: styledItem.leftButton ? visuals.buttonContainerWidth : 0 Component.onCompleted: header.updateButton(styledItem.leftButton, leftButtonContainer) } Item { id: rightButtonContainer anchors { right: parent.right top: parent.top bottom: parent.bottom } width: styledItem.rightButton ? visuals.buttonContainerWidth : 0 Component.onCompleted: header.updateButton(styledItem.rightButton, rightButtonContainer) } function updateButton(button, container) { if (!button) return; button.parent = container; button.anchors.left = container.left; button.anchors.right = container.right; button.anchors.verticalCenter = container.verticalCenter; button.anchors.margins = units.gu(1); } Connections { target: styledItem onLeftButtonChanged: header.updateButton(styledItem.leftButton, leftButtonContainer) onRightButtonChanged: header.updateButton(styledItem.rightButton, rightButtonContainer) } } Rectangle { id: containerItem color: visuals.backgroundColor height: MathUtils.clamp(styledItem.contentsHeight, styledItem.minHeight - header.height, styledItem.maxHeight - header.height) anchors { top: header.bottom left: parent.left right: parent.right } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/BubbleShape.qml0000644000015600001650000000766212700370701023417 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: bubbleShape /*! Do not use an UbuntuShape but a Rectangle as the background of the BubbleShape. */ property bool square: false /*! The background color of the bubble. */ property color color: square ? theme.palette.normal.background : theme.palette.normal.overlay property point target property string direction: "down" property bool clipContent: false default property alias children: content.children implicitWidth: units.gu(10) implicitHeight: units.gu(8) signal showCompleted() signal hideCompleted() opacity: 0.0 function show() { hideAnimation.stop(); showAnimation.start(); } function hide() { showAnimation.stop(); hideAnimation.start(); } ParallelAnimation { id: showAnimation NumberAnimation { target: bubbleShape property: "opacity" from: 0.0 to: 1.0 duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } NumberAnimation { target: scaleTransform property: (direction === "up" || direction === "down") ? "yScale" : "xScale" from: 0.91 to: 1.0 duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } onStopped: showCompleted() } NumberAnimation { id: hideAnimation target: bubbleShape property: "opacity" from: 1.0 to: 0.0 duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing onStopped: hideCompleted() } transform: Scale { id: scaleTransform origin.x: direction === "right" ? bubbleShape.width : direction === "left" ? 0 : bubbleShape.width/2.0 origin.y: direction === "up" ? 0 : direction === "down" ? bubbleShape.height : bubbleShape.height/2.0 } BorderImage { id: shadow anchors.fill: parent anchors.margins: square ? -units.gu(1) : -units.dp(2) anchors.topMargin: square ? 0 : anchors.margins source: !square ? Qt.resolvedUrl("../artwork/bubble_shadow.sci") : Qt.resolvedUrl("../artwork/header_overflow_dropshadow.sci") opacity: 0.8 } UbuntuShape { anchors.fill: parent aspect: UbuntuShape.Flat backgroundColor: bubbleShape.color source: bubbleShape.clipContent ? shapeSource : null visible: !square } ShaderEffectSource { id: shapeSource visible: bubbleShape.clipContent sourceItem: bubbleShape.clipContent ? content : null hideSource: !square // FIXME: visible: false prevents rendering so make it a nearly // transparent 1x1 pixel instead opacity: 0.01 width: 1 height: 1 } Item { id: content anchors.fill: parent Rectangle { id: colorRect anchors.fill: parent color: bubbleShape.color visible: bubbleShape.clipContent } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/SectionsStyle.qml0000644000015600001650000003654012700370714024054 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Window 2.2 import Ubuntu.Components 1.3 import QtGraphicalEffects 1.0 import Ubuntu.Components.Private 1.3 Item { id: sectionsStyle implicitWidth: sectionsListView.contentWidth + 2 * listViewContainer.listViewMargins implicitHeight: Screen.height > units.gu(50) ? units.gu(4) : units.gu(3) /*! The foreground color of unselected sections. */ property color sectionColor: enabled ? theme.palette.normal.backgroundTertiaryText : theme.palette.disabled.backgroundTertiaryText /*! The foreground color of underline rectangle of unselected sections. */ property color underlineColor: theme.palette.normal.base /*! The foreground color of the selected section. */ property color selectedSectionColor: enabled ? theme.palette.selected.backgroundTertiaryText : theme.palette.selectedDisabled.backgroundTertiaryText /*! The background color for the pressed section button. */ property color pressedBackgroundColor: theme.palette.highlighted.background /*! The size of text in the buttons. */ property int textSize: Label.Medium /*! The spacing on the left and right sides of the label inside a section button. */ property real horizontalLabelSpacing: units.gu(2) /*! The height of the bar underlining the sections. */ property real underlineHeight: units.dp(2) // We don't clip listview on purpose, so we have to clip here to prevent Sections element // from painting outside its area. clip: true //This item is needed for the OpacityMask feature. It is needed to make sure that when we //bring a list element into view, that element won't be covered by the opacity mask. So we //disable clipping on the list but we give it margins. This way when an item is repositioned //to be within the listview, that item will not be positioned under the opacity mask. (which is //what would have happened if the listview were filling the parent) Item { id: listViewContainer anchors.fill: parent property real listViewMargins: units.gu(2) //We need to set this to 0.0 when OpacityMask will draw this listview for us. //we don't set visible: false because we still want to get the input events! opacity: 1.0 ListView { id: sectionsListView objectName: "sections_listview" property bool animateContentX: false activeFocusOnTab: false // FIXME: Enable proper focus handling // Position the selected item correctly. // For a scrollable ListView, if the item was already fully visible, // no repositioning is needed. If the item was (partially) invisible, // position it so that it becomes fully visible. // If the ListView is not scrollable, the first item will be aligned with // the left of the ListView. function positionItem(item) { if (item !== null) { //stop the flick before doing computations if (moving) { return; } if (dragging || flicking) { cancelFlick(); } if (contentXAnim.running) { contentXAnim.stop(); } contentXAnim.from = contentX; //make sure we don't overshoot bounds if (sectionsListView.contentWidth <= sectionsListView.width) { // No scrolling, position the sections on the left. contentXAnim.to = originX; } else { // Position the selected Item so that it is fully visible. contentXAnim.to = MathUtils.clamp(contentX, originX, originX + contentWidth - width); } if (contentXAnim.from !== contentXAnim.to) { contentXAnim.start(); } } } anchors { fill: parent leftMargin: listViewContainer.listViewMargins rightMargin: listViewContainer.listViewMargins } //this is just to disable keyboard navigation to avoid messing with contentX/contentWidth while //the view is moving focus: !moving onWidthChanged: positionItem(currentItem) //make sure that the currentItem is in the middle when everything is initialized Component.onCompleted: positionItem(currentItem) orientation: ListView.Horizontal boundsBehavior: Flickable.StopAtBounds model: styledItem.model //We need this to make sure that we have delegates for the whole width, since we have //clip disabled. displayMarginBeginning: listViewContainer.listViewMargins displayMarginEnd: listViewContainer.listViewMargins currentIndex: styledItem.selectedIndex onCurrentIndexChanged: { styledItem.selectedIndex = currentIndex; } onCurrentItemChanged: { //adjust contentX so that the item is kept in the middle //don't use ListView.ApplyRange because that does an awkward animation when you select an item //*while* the current item is outside of screen positionItem(currentItem); } highlightFollowsCurrentItem: false highlight: Item { //show the highlight on top of the delegate z: 2 x: sectionsListView.currentItem ? sectionsListView.currentItem.x : -width width: sectionsListView.currentItem ? sectionsListView.currentItem.width : 0 height: sectionsListView.currentItem ? sectionsListView.currentItem.height : 0 Rectangle { anchors { bottom: parent.bottom left: parent.left right: parent.right } height: sectionsStyle.underlineHeight color: sectionsStyle.selectedSectionColor } Behavior on x { UbuntuNumberAnimation {} } } delegate: AbstractButton { id: sectionButton activeFocusOnTab: false objectName: "section_button_" + index width: label.width + 2 * sectionsStyle.horizontalLabelSpacing height: sectionsStyle.height property bool selected: index === styledItem.selectedIndex onClicked: { styledItem.selectedIndex = index; sectionsListView.forceActiveFocus(); } // Background pressed highlight Rectangle { visible: parent.pressed anchors.fill: parent color: sectionsStyle.pressedBackgroundColor } // Section title Label { id: label objectName: "section_button_label_" + index // modelData may be either a string, or an Action text: modelData.hasOwnProperty("text") ? modelData.text : modelData textSize: sectionsStyle.textSize font.weight: Font.Light anchors { baseline: underline.bottom baselineOffset: sectionsStyle.height < units.gu(4) ? -units.gu(1) : -units.gu(2) horizontalCenter: parent.horizontalCenter } color: sectionButton.selected ? sectionsStyle.selectedSectionColor : sectionsStyle.sectionColor Behavior on color { ColorAnimation { duration: UbuntuAnimation.SlowDuration } } } // Section title underline Rectangle { id: underline anchors { bottom: parent.bottom left: parent.left right: parent.right } height: sectionsStyle.underlineHeight color: sectionsStyle.underlineColor } } SmoothedAnimation { objectName: "sections_scroll_animation" id: contentXAnim target: sectionsListView property: "contentX" duration: UbuntuAnimation.FastDuration velocity: units.gu(10) } } } MouseArea { // Detect hovering over the left and right areas to show the scrolling chevrons. id: hoveringArea property real iconsDisabledOpacity: 0.3 anchors.fill: parent hoverEnabled: true property bool pressedLeft: false property bool pressedRight: false onPressed: { pressedLeft = leftIcon.contains(mouse); pressedRight = rightIcon.contains(mouse); mouse.accepted = pressedLeft || pressedRight; } onClicked: { // positionViewAtIndex() does not provide animation var scrollDirection = 0; if (pressedLeft && leftIcon.contains(mouse)) { scrollDirection = -1; } else if (pressedRight && rightIcon.contains(mouse)) { scrollDirection = 1; } else { // User pressed on the left or right icon, and then released inside of the // MouseArea but outside of the icon that was pressed. return; } if (contentXAnim.running) contentXAnim.stop(); var newContentX = sectionsListView.contentX + (sectionsListView.width * scrollDirection); contentXAnim.from = sectionsListView.contentX; // make sure we don't overshoot bounds contentXAnim.to = MathUtils.clamp( newContentX, 0.0, // estimation of originX is some times wrong when scrolling towards the beginning sectionsListView.originX + sectionsListView.contentWidth - sectionsListView.width); contentXAnim.start(); } Icon { id: leftIcon objectName: "left_scroll_icon" // return whether the pressed event was done inside the area of the icon function contains(mouse) { return (mouse.x < listViewContainer.listViewMargins && !sectionsListView.atXBeginning); } anchors { left: parent.left leftMargin: (listViewContainer.listViewMargins - width) / 2 bottom: parent.bottom bottomMargin: sectionsStyle.height < units.gu(4) ? units.gu(1) : units.gu(2) } width: units.gu(1) height: units.gu(1) visible: false rotation: 180 opacity: visible ? sectionsListView.atXBeginning ? hoveringArea.iconsDisabledOpacity : 1.0 : 0.0 name: "chevron" Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration } } } Icon { id: rightIcon objectName: "right_scroll_icon" // return whether the pressed event was done inside the area of the icon function contains(mouse) { return (mouse.x > (hoveringArea.width - listViewContainer.listViewMargins) && !sectionsListView.atXEnd); } anchors { right: parent.right rightMargin: (listViewContainer.listViewMargins - width) / 2 bottom: parent.bottom bottomMargin: sectionsStyle.height < units.gu(4) ? units.gu(1) : units.gu(2) } width: units.gu(1) height: units.gu(1) visible: false opacity: visible ? sectionsListView.atXEnd ? hoveringArea.iconsDisabledOpacity : 1.0 : 0.0 name: "chevron" Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration } } } } LinearGradient { id: gradient visible: false anchors.fill: parent start: Qt.point(0,0) end: Qt.point(width,0) property real gradientWidth: listViewContainer.listViewMargins / gradient.width //the width is gradientWidth, but we want the gradient to actually start/finish at gradientSplitPosition //just to leave some margin. property real gradientSplitPosition: 2/3 * gradientWidth gradient: Gradient { //left gradient GradientStop { position: 0.0 ; color: Qt.rgba(1,1,1,0) } GradientStop { position: gradient.gradientSplitPosition ; color: Qt.rgba(1,1,1,0) } GradientStop { position: gradient.gradientWidth; color: Qt.rgba(1,1,1,1) } //right gradient GradientStop { position: 1.0 - gradient.gradientWidth; color: Qt.rgba(1,1,1,1) } GradientStop { position: 1.0 - gradient.gradientSplitPosition; color: Qt.rgba(1,1,1,0) } GradientStop { position: 1.0; color: Qt.rgba(1,1,1,0) } } Rectangle { // full opacity for the underline at the bottom in the mask below anchors { left: parent.left right: parent.right bottom: parent.bottom } height: sectionsStyle.underlineHeight color: "white" } } OpacityMask { id: mask anchors.fill: parent visible: false source: listViewContainer maskSource: gradient } states: [ State { name: "hovering" when: hoveringArea.containsMouse PropertyChanges { target: mask; visible: true } PropertyChanges { target: listViewContainer; opacity: 0.0 } PropertyChanges { target: leftIcon; visible: true; } PropertyChanges { target: rightIcon; visible: true; } } ] } ./src/Ubuntu/Components/Themes/Ambiance/1.3/SectionsForPageHead.qml0000644000015600001650000000271212700370701025047 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /*! \internal \deprecated Older version of Sections to work around bug 1511839 (only for controlling sections via PageHeadSections). */ StyledItem { id: sections styleName: "SectionsForPageHeadStyle" property list actions property var model: actions onModelChanged: { if (model && model.length > 3) { console.warn("PageHeadSections does not support more than 3 sections. Use PageHeader and Sections instead."); } } property int selectedIndex: model ? 0 : -1 onSelectedIndexChanged: { if ((selectedIndex >= 0) && (selectedIndex < model.length)) { if (model[selectedIndex].hasOwnProperty("trigger")) { model[selectedIndex].trigger(); } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml0000644000015600001650000000657412700370701024516 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: progressBarStyle property color foregroundColor: styledItem.enabled ? theme.palette.normal.activity : theme.palette.disabled.activity property color foregroundTextColor: styledItem.enabled ? theme.palette.normal.activityText : theme.palette.disabled.activityText property color backgroundColor: styledItem.enabled ? theme.palette.normal.base : theme.palette.disabled.base property color backgroundTextColor: styledItem.enabled ? theme.palette.normal.baseText : theme.palette.disabled.baseText property var progressBar: styledItem implicitWidth: units.gu(38) implicitHeight: units.gu(4) UbuntuShapeOverlay { id: background anchors.fill: parent backgroundColor: progressBarStyle.backgroundColor overlayColor: foregroundColor overlayRect: Qt.application.layoutDirection == Qt.LeftToRight ? Qt.rect(0.0, 0.0, progressBarStyle.progress, 1.0) : Qt.rect(1.0 - progressBarStyle.progress, 0.0, 1.0, 1.0) } property real progress: progressBar.indeterminate ? 0.0 : progressBar.value / (progressBar.maximumValue - progressBar.minimumValue) Label { id: valueLabel anchors.centerIn: background color: backgroundTextColor text: progressBar.indeterminate ? i18n.dtr("ubuntu-ui-toolkit", "In Progress") : "%1%".arg(Number(progressBarStyle.progress * 100.0).toFixed(0)) visible: !progressBar.hasOwnProperty("showProgressPercentage") || progressBar.showProgressPercentage SequentialAnimation on opacity { loops: Animation.Infinite running: progressBar.indeterminate UbuntuNumberAnimation { to: 0.2; duration: UbuntuAnimation.BriskDuration } UbuntuNumberAnimation { to: 1.0; duration: UbuntuAnimation.BriskDuration } } } PartialColorize { anchors.fill: valueLabel sourceItem: progressBar.indeterminate ? null : valueLabel leftColor: foregroundTextColor rightColor: backgroundTextColor progress: (progressBarStyle.progress * background.width - valueLabel.x) / valueLabel.width mirror: Qt.application.layoutDirection == Qt.RightToLeft visible: !progressBar.hasOwnProperty("showProgressPercentage") || progressBar.showProgressPercentage } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/ProgressionVisualStyle.qml0000644000015600001650000000320612700370701025750 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: progressionVisualStyle property url progressionDividerSource: Qt.resolvedUrl("../artwork/progression_divider.png") property url progressionIconSource: Qt.resolvedUrl("../artwork/chevron.png") implicitWidth: progressIcon.width + (styledItem.showSplit ? styledItem.splitMargin + progressionDivider.width : 0) Image { id: progressIcon source: progressionIconSource anchors { verticalCenter: parent.verticalCenter right: parent.right } opacity: enabled ? 1.0 : 0.5 mirror: Qt.application.layoutDirection == Qt.RightToLeft } Image { id: progressionDivider visible: styledItem.showSplit anchors { top: parent.top bottom: parent.bottom right: progressIcon.left rightMargin: styledItem.splitMargin } source: progressionDividerSource opacity: enabled ? 1.0 : 0.5 } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/DialogForegroundStyle.qml0000644000015600001650000000154212700370701025505 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: dialogForegroundStyle UbuntuShape { id: background anchors.fill: parent backgroundColor: theme.palette.normal.overlay } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/OptionSelectorStyle.qml0000644000015600001650000000316612700370701025230 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: ambianceStyle objectName: "OptionSelector13" property url chevron: Qt.resolvedUrl("../artwork/chevron_down.png") property url tick: Qt.resolvedUrl("../artwork/tick.png") property bool colourComponent: true property alias content: backgroundFrame UbuntuShape { id: background width: styledItem.width height: styledItem.height radius: "medium" source: shapeSource } ShaderEffectSource { id: shapeSource sourceItem: backgroundFrame hideSource: true // FIXME: visible: false prevents rendering so make it a nearly // transparent 1x1 pixel instead opacity: 0.01 width: 1 height: 1 } Rectangle { id: backgroundFrame anchors.fill: parent color: styledItem.enabled ? theme.palette.normal.background : theme.palette.disabled.background } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/SliderStyle.qml0000644000015600001650000001025712700370701023500 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /* The default slider style consists of a bar and a thumb shape. This style is themed using the following properties: - thumbSpacing: spacing between the thumb and the bar */ Item { id: sliderStyle property color foregroundColor: theme.palette.normal.activity property color backgroundColor: theme.palette.normal.base property real thumbSpacing: units.gu(0) property Item bar: background property Item thumb: thumb implicitWidth: units.gu(38) implicitHeight: units.gu(5) UbuntuShapeOverlay { id: background anchors { verticalCenter: parent.verticalCenter right: parent.right left: parent.left } height: units.dp(2) backgroundColor: sliderStyle.backgroundColor aspect: UbuntuShape.Flat overlayColor: sliderStyle.foregroundColor overlayRect: Qt.application.layoutDirection == Qt.LeftToRight ? Qt.rect(0.0, 0.0, thumb.x / thumb.barMinusThumbWidth, 1.0) : Qt.rect(1.0 - (thumb.x / thumb.barMinusThumbWidth), 0.0, 1.0, 1.0) } UbuntuShape { id: thumb anchors { verticalCenter: parent.verticalCenter topMargin: thumbSpacing bottomMargin: thumbSpacing } property real barMinusThumbWidth: background.width - (thumb.width + 2.0*thumbSpacing) property real position: thumbSpacing + SliderUtils.normalizedValue(styledItem) * barMinusThumbWidth property bool pressed: SliderUtils.isPressed(styledItem) property bool positionReached: x == position x: position /* Enable the animation on x when pressing the slider. Disable it when x has reached the target position. */ onPressedChanged: if (pressed) xBehavior.enabled = true; onPositionReachedChanged: if (positionReached) xBehavior.enabled = false; Behavior on x { id: xBehavior SmoothedAnimation { duration: UbuntuAnimation.FastDuration } } width: units.gu(2) height: units.gu(2) backgroundColor: theme.palette.normal.raised FocusShape { } } BubbleShape { id: bubbleShape property real minimumWidth: units.gu(6) property real horizontalPadding: units.gu(1) width: label.implicitWidth + 2*horizontalPadding height: label.implicitHeight + 2*horizontalPadding // FIXME: very temporary implementation property real minX: 0.0 property real maxX: background.width - width property real pointerSize: units.dp(6) property real targetMargin: units.gu(1) property point globalTarget: Qt.point(thumb.x + thumb.width / 2.0, thumb.y - targetMargin) x: MathUtils.clamp(globalTarget.x - width / 2.0, minX, maxX) y: globalTarget.y - height - pointerSize target: Qt.point(globalTarget.x - x, globalTarget.y - y) property bool pressed: SliderUtils.isPressed(styledItem) property bool shouldShow: pressed && label.text != "" onShouldShowChanged: if (shouldShow) { show(); } else { hide(); } Label { id: label anchors.centerIn: parent text: styledItem.formatValue(SliderUtils.liveValue(styledItem)) textSize: Label.Medium color: theme.palette.normal.overlayText } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/PickerDelegateStyle.qml0000644000015600001650000000424412700370701025125 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { property real minFade: 0.2 property real maxFade: 0.95 property bool fadingEnabled: true property bool inListView: styledItem.parent && (QuickUtils.className(styledItem.parent) !== "QQuickPathView") property Item itemList: inListView ? styledItem.ListView.view : styledItem.PathView.view property Item picker: styledItem.picker property Item highlightItem: itemList.highlightItem implicitHeight: picker.itemHeight implicitWidth: itemList.width Binding { target: styledItem when: fadingEnabled property: "opacity" value: opacityCalc() } function opacityCalc() { if (!picker || !highlightItem || (index === itemList.currentIndex)) return 1.0; var highlightY = highlightItem.y; var delegateY = styledItem.y; if (inListView) { highlightY -= itemList.contentY; delegateY -= itemList.contentY; } var midY = delegateY + styledItem.height / 2; if (delegateY < highlightY) { return MathUtils.clamp(MathUtils.projectValue(midY, 0, highlightY, minFade, maxFade), minFade, maxFade); } var highlightH = highlightY + highlightItem.height; if (delegateY >= highlightH) { delegateY -= highlightH; midY = delegateY + styledItem.height / 2; return MathUtils.clamp(1.0 - MathUtils.projectValue(midY, 0, highlightY, minFade, maxFade), minFade, maxFade); } return 1.0; } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/BottomEdgeStyle.qml0000644000015600001650000000771012700370714024313 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Styles 1.3 BottomEdgeStyle { id: bottomEdgeStyle //setup properties property BottomEdge bottomEdge: styledItem panel: panelItem panelAnimation: panelBehavior revealThreshold: bottomEdge.hint.height + units.gu(2) //deprecated for now contentItem: bottomEdge.contentItem // own styling properties property color backgroundColor: !panelItem.collapsing ? Qt.rgba(0, 0, 0, Math.min(0.25, (height - revealThreshold - panelItem.y) / (height - revealThreshold))) : "transparent" property color panelColor: theme.palette.normal.overlay property color shadowColor: "#000000" anchors.fill: parent Rectangle { id: background anchors.fill: parent color: backgroundColor z: -1 } Rectangle { id: panelItem objectName: "bottomedge_panel" property bool collapsing: false anchors { left: parent.left right: parent.right top: parent.bottom topMargin: bottomEdge.status >= BottomEdge.Revealed ? -(bottomEdge.height * bottomEdge.dragProgress) : 0 } height: bottomEdge.contentItem ? bottomEdge.contentItem.height : 0 color: panelColor opacity: bottomEdge.status >= BottomEdge.Revealed ? 1.0 : 0.0 Behavior on anchors.topMargin { UbuntuNumberAnimation { id: panelBehavior } } Connections { target: bottomEdge onCollapseStarted: panelItem.collapsing = true onCollapseCompleted: panelItem.collapsing = false } state: bottomEdge.status > BottomEdge.Hidden ? "drop-hint" : "" states: [ State { name: "drop-hint" PropertyChanges { target: bottomEdge.hint restoreEntryValues: false status: BottomEdgeHint.Inactive } } ] // shadows Rectangle { id: topShadow anchors { bottom: parent.top left: parent.left right: parent.right } height: units.gu(1.5) gradient: Gradient { GradientStop { position: 0.0; color: Qt.rgba(shadowColor.r, shadowColor.g, shadowColor.b, 0.0) } GradientStop { position: 0.75; color: Qt.rgba(shadowColor.r, shadowColor.g, shadowColor.b, 0.05) } GradientStop { position: 1.0; color: Qt.rgba(shadowColor.r, shadowColor.g, shadowColor.b, 0.1) } } } Rectangle { id: bottomShadow anchors { top: parent.bottom left: parent.left right: parent.right } height: units.gu(1.5) rotation: 180 gradient: Gradient { GradientStop { position: 0.0; color: Qt.rgba(shadowColor.r, shadowColor.g, shadowColor.b, 0.0) } GradientStop { position: 0.75; color: Qt.rgba(shadowColor.r, shadowColor.g, shadowColor.b, 0.05) } GradientStop { position: 1.0; color: Qt.rgba(shadowColor.r, shadowColor.g, shadowColor.b, 0.1) } } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/CheckBoxStyle.qml0000644000015600001650000001274412700370701023747 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Item { id: checkBoxStyle /*! The padding between the background shape and the outside border of the checkbox. */ property real backgroundPadding: 0 /*! The background color when the checkbox is not checked. */ property color uncheckedBackgroundColor: styledItem.enabled ? theme.palette.normal.foreground : theme.palette.disabled.foreground /*! The background color when the checkbox is checked. */ property color checkedBackgroundColor: styledItem.enabled ? theme.palette.normal.positive : theme.palette.disabled.raised /*! The image to show inside the checkbox when it is checked. */ property url iconSource: "image://theme/tick" /*! The color of the icon. */ property color iconColor: styledItem.enabled ? theme.palette.normal.positiveText : theme.palette.disabled.raisedText /*! The padding between the icon and the border of the thumb. */ property real iconPadding: units.gu(0.4) implicitWidth: units.gu(2) implicitHeight: units.gu(2) FocusShape { } UbuntuShape { id: background anchors { fill: parent margins: checkBoxStyle.backgroundPadding } property real iconSize: Math.min(width, height) - 2*checkBoxStyle.iconPadding Icon { color: checkBoxStyle.iconColor width: background.iconSize height: background.iconSize id: tick anchors.centerIn: parent smooth: true source: checkBoxStyle.iconSource visible: styledItem.checked || transitionToChecked.running || transitionToUnchecked.running } state: styledItem.checked ? "checked" : "unchecked" states: [ State { name: "checked" PropertyChanges { target: tick anchors.verticalCenterOffset: 0 } PropertyChanges { target: background backgroundColor: checkBoxStyle.checkedBackgroundColor } }, State { name: "unchecked" PropertyChanges { target: tick anchors.verticalCenterOffset: checkBoxStyle.height } PropertyChanges { target: background backgroundColor: checkBoxStyle.uncheckedBackgroundColor } } ] transitions: [ Transition { id: transitionToUnchecked to: "unchecked" ColorAnimation { target: background duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasingReverse } SequentialAnimation { PropertyAction { target: background property: "clip" value: true } NumberAnimation { target: tick property: "anchors.verticalCenterOffset" duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasingReverse } PropertyAction { target: background property: "clip" value: false } } }, Transition { id: transitionToChecked to: "checked" ColorAnimation { target: background duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } SequentialAnimation { PropertyAction { target: background property: "clip" value: true } NumberAnimation { target: tick property: "anchors.verticalCenterOffset" duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } PropertyAction { target: background property: "clip" value: false } } } ] } } ./src/Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml0000644000015600001650000002236112700370701025013 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Styles 1.3 as Style Style.PullToRefreshStyle { id: style implicitHeight: refreshIndicatorItem.height + units.gu(5) defaultContent: Label { id: labelComponent visible: control.enabled text: releaseToRefresh ? i18n.tr("Release to refresh...") : i18n.tr("Pull to refresh...") horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter Behavior on text { SequentialAnimation { UbuntuNumberAnimation { target: labelComponent property: "opacity" from: 1.0 to: 0.0 } UbuntuNumberAnimation { target: labelComponent property: "opacity" from: 0.0 to: 1.0 } } } } // additional configuration properties provided by the Ambiance theme // these properties can be used by the deriving themes to configure the label // and the activity indicator property Item label: contentLoader.item property alias refreshIndicator: refreshIndicatorItem /* Local properties */ readonly property PullToRefresh control: styledItem // property to store Flickable's toipMargin at the time the pull or auto-refresh is started property real flickableTopMargin: 0.0 // store when the drag has happened at the beginning of the Flickable's content property bool wasAtYBeginning: false // initial contentY value when pull started property real initialContentY: 0.0 // drives the refreshing state property bool refreshing: false // point of release used in rebind animation between the ready-to-refresh and refreshing states property real pointOfRelease // specifies the component completion property bool ready: false // root item property Item rootItem: QuickUtils.rootItem(control) anchors.fill: parent Component.onCompleted: { /* When the model attached to the component is refreshing during initialization, this refresh will happen after the style gets completed. This refresh will cause the style to enter in refreshing state, which alters the topMargin. However in the same time the MainView Header will be also updated, so that will also alter the topMargin. But when refreshing completes, the topMargin will be restored to the default value before the animation, and the content will be pushed under the header. We need to connect to the header changes so we can reset the state and the topMargin. */ if (rootItem && rootItem.__propagated && rootItem.__propagated.header) { rootItem.__propagated.header.visibleChanged.connect(fixTopMargin); rootItem.__propagated.header.heightChanged.connect(fixTopMargin); } ready = true; } Component.onDestruction: { if (rootItem && rootItem.__propagated && rootItem.__propagated.header) { rootItem.__propagated.header.visibleChanged.disconnect(fixTopMargin); rootItem.__propagated.header.heightChanged.disconnect(fixTopMargin); } } function fixTopMargin() { if (style.state === "refreshing") { /* Fetch the topMargin, force state to disabled (idle will be turned on automatically when refreshing completes) and set the topMargin from the header change. */ var topMargin = control.target.topMargin; style.state = "disabled"; control.target.topMargin = topMargin; } } // visuals Loader { id: contentLoader sourceComponent: control.content onItemChanged: { if (item) { item.parent = style; item.anchors.fill = style; } } asynchronous: false } ActivityIndicator { id: refreshIndicatorItem running: false anchors.centerIn: parent } // state and content controlling Connections { target: control onRefreshingChanged: { if (!ready || !control.enabled) { return; } if (!style.releaseToRefresh && target.refreshing) { // not a manual refresh, update flickable's starting topMargin style.flickableTopMargin = control.target.topMargin; style.wasAtYBeginning = control.target.atYBeginning; } /* We cannot bind refreshing state activation clause with the control.refreshing property dirrectly as when the model is refreshed automatically (not manually via the component), we need to remember the flickable's topMargin in order to proceed with a proper Flickable rebinding. If we use property binding, the Connections' onRefreshingChanged will update the flickableTopMargin only after the binding is evaluated. */ style.refreshing = target.refreshing; } } Connections { target: control.target onMovementStarted: { style.wasAtYBeginning = control.target.atYBeginning; style.initialContentY = control.target.contentY; style.refreshing = false; style.releaseToRefresh = false; } onMovementEnded: style.wasAtYBeginning = control.target.atYBeginning // catch when to initiate refresh onDraggingChanged: { if (!control.parent.dragging && style.releaseToRefresh) { pointOfRelease = -(control.target.contentY - control.target.originY) style.flickableTopMargin = control.target.topMargin; style.refreshing = true; style.releaseToRefresh = false; } } onContentYChanged: { if (style.wasAtYBeginning && control.enabled && control.target.dragging) { style.releaseToRefresh = ((style.initialContentY - control.target.contentY) > style.activationThreshold); } } } onStateChanged: { /* Label might not be ready when the component enters in refreshing state, therefore the visible property will not be properly returned to true. Because of the same reason we cannot have a PropertyChanges either as the target is not yet ready at that point. */ if (label) { label.visible = (state === "idle" || state === "ready-to-refresh"); } } states: [ State { name: "disabled" when: !control.enabled }, State { name: "idle" extend: "" when: ready && control.enabled && !style.refreshing && !style.releaseToRefresh }, State { name: "ready-to-refresh" when: ready && control.enabled && style.releaseToRefresh && !style.refreshing }, State { name: "refreshing" when: ready && control.enabled && style.wasAtYBeginning && style.refreshing PropertyChanges { target: refreshIndicatorItem running: true } PropertyChanges { target: control.target topMargin: style.flickableTopMargin + control.height } } ] transitions: [ Transition { from: "ready-to-refresh" to: "refreshing" SequentialAnimation { UbuntuNumberAnimation { target: control.target property: "topMargin" from: style.pointOfRelease to: style.flickableTopMargin + control.height } ScriptAction { script: control.refresh() } } }, // transition to be applied when the model is auto-updating Transition { from: "idle" to: "refreshing" UbuntuNumberAnimation { target: control.target property: "contentY" from: -style.flickableTopMargin to: -style.flickableTopMargin - control.height } }, Transition { from: "refreshing" to: "idle" UbuntuNumberAnimation { target: control.target property: "topMargin" } } ] } ./src/Ubuntu/Components/Themes/Ambiance/1.3/AmbianceNormal.qml0000644000015600001650000000317512700370701024106 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes 1.3 PaletteValues { background: "#FFFFFF" backgroundText: UbuntuColors.jet backgroundSecondaryText: UbuntuColors.slate backgroundTertiaryText: UbuntuColors.ash base: UbuntuColors.silk baseText: UbuntuColors.ash foreground: UbuntuColors.porcelain foregroundText: UbuntuColors.jet raised: "#FFFFFF" raisedText: UbuntuColors.slate raisedSecondaryText: UbuntuColors.silk overlay: "#FFFFFF" overlayText: UbuntuColors.slate overlaySecondaryText: UbuntuColors.silk field: "#FFFFFF" fieldText: UbuntuColors.jet focus: UbuntuColors.orange focusText: "#FFFFFF" selection: Qt.rgba(UbuntuColors.blue.r, UbuntuColors.blue.g, UbuntuColors.blue.b, 0.2) selectionText: UbuntuColors.jet positive: UbuntuColors.green positiveText: "#FFFFFF" negative: UbuntuColors.red negativeText: "#FFFFFF" activity: UbuntuColors.blue activityText: "#FFFFFF" } ./src/Ubuntu/Components/Themes/Ambiance/Ambiance.pro0000644000015600001650000001165012700370701022440 0ustar jenkinsjenkinsTARGETPATH = Ubuntu/Components/Themes/Ambiance ARTWORK_FILES += artwork/background_paper@27.png \ artwork/bubble_arrow@20.png \ artwork/bubble_arrow@30.png \ artwork/bubble_arrow@8.png \ artwork/bubble_shadow@20.png \ artwork/bubble_shadow@20.sci \ artwork/bubble_shadow@30.png \ artwork/bubble_shadow@30.sci \ artwork/bubble_shadow@8.png \ artwork/bubble_shadow@8.sci \ artwork/caret_noshadow@27.png \ artwork/chevron@27.png \ artwork/chevron_down@30.png \ artwork/cross@30.png \ artwork/header_overflow_dropshadow@27.png \ artwork/header_overflow_dropshadow@27.sci \ artwork/PageHeaderBaseDividerBottom@18.png \ artwork/PageHeaderBaseDividerLight@18.png \ artwork/PageHeaderBaseDividerLight@18.sci \ artwork/progression_divider@18.png \ artwork/ScrollbarBottomIdle@8.png \ artwork/ScrollbarBottomPressed@8.png \ artwork/ScrollbarLeftIdle@8.png \ artwork/ScrollbarLeftPressed@8.png \ artwork/ScrollbarRightIdle@8.png \ artwork/ScrollbarRightPressed@8.png \ artwork/ScrollbarTopIdle@8.png \ artwork/ScrollbarTopPressed@8.png \ artwork/spinner@30.png \ artwork/spinner@8.png \ artwork/stroke_button@27.png \ artwork/tick@30.png \ artwork/toolbar_dropshadow@20.png \ artwork/scrollbar_arrow@27.png QML_FILES += 1.2/ActivityIndicatorStyle.qml \ 1.2/BubbleShape.qml \ 1.2/ButtonForeground.qml \ 1.2/ButtonStyle.qml \ 1.2/CheckBoxStyle.qml \ 1.2/ComboButtonStyle.qml \ 1.2/DatePickerStyle.qml \ 1.2/DialerHandStyle.qml \ 1.2/DialerStyle.qml \ 1.2/DialogForegroundStyle.qml \ 1.2/HeadDividerStyle.qml \ 1.2/HeaderStyle.qml \ 1.2/HighlightMagnifier.qml \ 1.2/ListItemOptionSelectorStyle.qml \ 1.2/ListItemStyle.qml \ 1.2/MainViewStyle.qml \ 1.2/OptionSelectorStyle.qml \ 1.2/OverflowPanel.qml \ 1.2/PageHeadButton.qml \ 1.2/PageHeadStyle.qml \ 1.2/Palette.qml \ 1.2/PartialColorize.qml \ 1.2/PickerDelegateStyle.qml \ 1.2/PickerStyle.qml \ 1.2/PopoverForegroundStyle.qml \ 1.2/ProgressBarStyle.qml \ 1.2/ProgressionVisualStyle.qml \ 1.2/PullToRefreshStyle.qml \ 1.2/ScrollbarStyle.qml \ 1.2/SheetForegroundStyle.qml \ 1.2/SliderStyle.qml \ 1.2/SwitchStyle.qml \ 1.2/TabBarStyle.qml \ 1.2/TextAreaStyle.qml \ 1.2/TextCursorStyle.qml \ 1.2/TextFieldStyle.qml \ 1.2/ToolbarButtonStyle.qml \ 1.2/DeprecatedToolbarStyle.qml \ 1.3/AmbianceNormal.qml \ 1.3/AmbianceSelected.qml \ 1.3/ActionBarStyle.qml \ 1.3/ActivityIndicatorStyle.qml \ 1.3/BubbleShape.qml \ 1.3/ButtonForeground.qml \ 1.3/ButtonStyle.qml \ 1.3/CheckBoxStyle.qml \ 1.3/ComboButtonStyle.qml \ 1.3/DatePickerStyle.qml \ 1.3/DialerHandStyle.qml \ 1.3/DialerStyle.qml \ 1.3/DialogForegroundStyle.qml \ 1.3/HighlightMagnifier.qml \ 1.3/ListItemOptionSelectorStyle.qml \ 1.3/ListItemStyle.qml \ 1.3/MainViewStyle.qml \ 1.3/OptionSelectorStyle.qml \ 1.3/OverflowPanel.qml \ 1.3/PageHeadButton.qml \ 1.3/PageHeadStyle.qml \ 1.3/Palette.qml \ 1.3/PartialColorize.qml \ 1.3/PickerDelegateStyle.qml \ 1.3/PickerStyle.qml \ 1.3/PopoverForegroundStyle.qml \ 1.3/ProgressBarStyle.qml \ 1.3/ProgressionVisualStyle.qml \ 1.3/PullToRefreshStyle.qml \ 1.3/ScrollbarStyle.qml \ 1.3/SectionsStyle.qml \ 1.3/SheetForegroundStyle.qml \ 1.3/SliderStyle.qml \ 1.3/SwitchStyle.qml \ 1.3/TabBarStyle.qml \ 1.3/TextAreaStyle.qml \ 1.3/TextCursorStyle.qml \ 1.3/TextFieldStyle.qml \ 1.3/ToolbarButtonStyle.qml \ 1.3/ToolbarStyle.qml \ 1.3/IconButtonStyle.qml \ 1.3/PageHeaderStyle.qml \ 1.3/BottomEdgeHintStyle.qml \ 1.3/BottomEdgeStyle.qml \ 1.3/FocusShape.qml \ 1.3/SectionsForPageHead.qml \ 1.3/SectionsForPageHeadStyle.qml \ $$ARTWORK_FILES load(ubuntu_qml_module) OTHER_FILES+=qmldir ./src/Ubuntu/Components/Themes/Ambiance/artwork/0000755000015600001650000000000012700370701021705 5ustar jenkinsjenkins./src/Ubuntu/Components/Themes/Ambiance/artwork/caret_noshadow@27.png0000644000015600001650000000071412700370701025666 0ustar jenkinsjenkinsPNG  IHDR!!WotEXtSoftwareAdobe ImageReadyqe<nIDATx옱JAEgheP6邥VP?h.~-":`K#e1faavF{) +`T@@F%=оޘyK@ ; f Z L 0ɴ^8&ASJ54`Ld=E}GpWXVoVͼX8]6", ;e*Vlp/LIY()aM@%&N"6vgB RbrtUX7H@OVmHfuohgDŽJ8ܶY sȺ ΂| [}x`|i=IENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/tick@30.png0000644000015600001650000000302312700370701023606 0ustar jenkinsjenkinsPNG  IHDRHHb3CugAMA asRGB cHRMz&u0`:pQ<PLTErtRNSMY dIcv. U6ZG 3,= KEt kbF#"u/(ȼ+JAL[R΃^V8S'N&C |:󅜺~}waXǬ!Q$mbKGDg pHYsHHFk>fIDATX[QyAS1,!ҢDIZL3J6,l176Dܫ0036Ϝ{ν9X,L2e ANU#8u+9B*5֝uH/׮s KALH-R-U5PPPE4 N\6+"[;"#ۺQvۢ]=1xzw ޤr`r@j_3:qqNh(hxu tK*rlB :~BX q29m1@49A:ďT}HU 9AT<~HEE4}ˬ&lbk6#;7^ uH~ ;V % ZbcHħ|_lQ%:q7gurdҷ49kbc/#4"~Lԗ4`ʔ)63ְ%tEXtdate:create2013-11-05T02:39:12-02:00V&%tEXtdate:modify2013-11-05T02:39:12-02:00NtEXtSoftwareAdobe ImageReadyqe<IENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/header_overflow_dropshadow@27.sci0000644000015600001650000000015312700370701030262 0ustar jenkinsjenkinsborder.left: 27 border.top: 27 border.bottom: 27 border.right: 27 source: header_overflow_dropshadow@27.png./src/Ubuntu/Components/Themes/Ambiance/artwork/spinner@30.png0000644000015600001650000002355412700370701024345 0ustar jenkinsjenkinsPNG  IHDRZZ8AtEXtSoftwareAdobe ImageReadyqe<$iTXtXML:com.adobe.xmp @ӏ##IDATx}ieuީ.o~tg2ʤ([r$P,$ N0'? H8ر 81q %RHY.!gwSUat0mթ|ԩo=:P\' F ~uF} 6@t.uaPVhȎmB} 9vsy(EU aƀi|Ak2<'ĆY'LrqSx!Lڵ*aMP~K k}"o~1p76l] 8gYTLOV ^Kk+<"\ˢI3΍DVQ3}\?]Κ/ ZCC.FbK:Z+ a ԜSGFéODh51l2 kdفJ΢`6؂)@AkUE!<͚NȺͽ4AB3dE& H)FӅ!2b'I8-M Mv*0Tr 1L) Cs~[,>5|SЯ]P)Nkh=X=3O/9>E_0!?)LZsbO-~{B\5nZ*ZU=c1jhc䄜c6|?@DNWV{Ma D$xqӔ^I0*owߞnkxOOPKICnn=-gBb3Y@c<@'8#ÞÓ8]AS C>3ƁM-+xXTD- TsmhdHa~}BS&[qgDZk0xT /)+5'A8hqXyU9g:ѫ`cUQIn(8|_W#nƕa_C_wcQWs!K6OЭ_cC ,O6e#Jrݞ3FMv~~&Y?L^Hoh:!_ [/7>“h_^`Cq&tՂE)*ڕ[sުT]uPwuD2mJ84jvs Zxg ~u'Iѵ'kּ~o::g%'Ȼf_dkÀPW+ *[&#!j0B8࿖5ěT7sxBO7O}aI>-W>g5/5ݕRt߮ztZF 9xrL֚9̀- 1zZ؇O>O˗ *;܏|"l ,}FDc3hԹ4q BE f9'PoWMׂ_ /Y_Jş3 NAyQ$FP`_uZ=r>:]01!onȂ.!-sr%vbEyd r]EajߔEfMwszt@162 YH,a%LLW ѩ_~u4`bni8˄(jgP,jyti2)k~`W U꿶-rnHl7uD~C LAwLlb:A;dٸc}kQ)Tj n)f*/ O{?-Vȿ| y8;;/HY&fh=מsoznVY?F@0r*^S5JI$~RNvpT M<74>ww}6^9J 65m`R2fXh gͯ\|ZyF|{ꗸ,-iCi Q!O꣠3{Q*w*Mܱ ʫ;3Ay/J%6ܸF1o#߼GbOg𷚾ۀcaB}d\dH3ŎoN{Xq-ECUЁaJt`SqÖ(j*()eg~_9O:7~_Biz'W[rC JDfKU6Tӻ:~ٷ#-D]v/gd(^h%LڡKv=<3Je%g.5p+C5F ˇY C Y8P3q=Ȕm2IAMsؕCWE dk1PWzxazA>[`Wg ` [XP ԁFmA) #B wT2.I< x6޾PQAFC B?h$oFύ`묀rl`s5X n|(HH A~PSjU[&:\p\h#:ְʗeZ4H%*3쏪WD. T l @eu ̈>[G̶-ˍF]OXQ%茖A7:2 ˺)"eصp-2 dޏ C`UԭԘ1y"+P1276 3!{ FEܣ $Ӭd~e0=L?BCfRC* 7VR#* !I*6U/WyS%.32-ؙOǿ2kjA2wLIfcwb^\ʎ(_:hTN $**؍ѲqS8(]LXԮVh+FjxVXȱJh~X1y#%%.ۿgmA6L;*~0flmFXvn-~$J{ Tl /Njtl"M-/oqGq#fvf+WǺy#4­on_ɞ94G*>XKD Ct4B w(mRaW=lwmQ#]GnF~A܁!_%!ׁ}4&M=1IԮNJd%2@SP?`/Ena9OUDu+&#ׇ҆͞; ˍv`܇) £Lcڕ&@H2R*b5vtr^øb amd 3ڲ*Edwu$MvVm36c&ɋJqa.LupkDp*qǁ2ДͺlRVs62[ @oWrјjjBw5z bC&mıc6j<+ο癩$ %L#TGs9_j L=ɝGtdc}ɹdj>m~KBHL _DiG!,yDĝ(#nlGd>GuY:L~B(̰s:hy$Jywq "3L*@Ōҥ#hrj Br%9}OJJji5sm'BO0+9~khY![e ڔEA@ER#iY~%5ftfEԱ}hC y) %GHhm̍>h)+ K(>ʏq5>`3Lk;ՔXnYnرt^ࡁ:DJA;fU6G6v}1R2ҐSeD4ذ)vU.޴Ѵ({!9>M%5oTLԹv@X:nҥ(n 8z +iPSfv 2lɣ`L$K{NOЈZ`qI``:\<✭`4 )Ju@'ρ V &θN+X[d4H¤Y/<DsCs;vr{D,epYWvh`'t(ߎ@t37JQWKP؁Y ٹUhRڮaBKwoZJ| ^'{-mvKmJnyY}]&W|NOdKp6]Ӣ9ܩ*6itnӸ9M:d݉ۨY}$s <|`+VZte5hYqV;igk(#fQ^PZ ܐvkZ]Cd].lhĻ%*cuXə]iI#sbCt%):igN aC]Z΅Hw- : 2QcҥbvRYl%a_wy{܇ݽr3=߼2ڶLT9fek0J 8ͼe)ZBkdYSQy(A 3Tңc1ޅth6\P^,\UEGÙ=vg\vFDw=o6m7 ˯E˺)Vy؛JH[>FEm}T[V 6uq5f ~>;oxwZnL 'V~v dB\Y?ܺQ]an:ԣrD&LW?RX?·Gl|R TW}q=^vfÚCax#_@ _/TЦ+iC 5sx#P)[|5P K>y4iNwf*q[q{ў:=Y7Hb_rg[H&G沯t>)?'}ᕧ#[\7qSCXl7L~{DfxM0=$˓jR $qS_(|@A޷qi`$VԆz(.S'PS4 @P2VC$v%3g~<|kl5l毢}crv)V҆hmѪKv5(4۪iت[eR[x*+ZVR}Oxyj0Ti5x +{̝lvQ1*Q\F,-xa s~ZR`Oz+A) h?3wUO3/׏|96CFCQ oc<ł;.͸.ЙKd:^U6K!8NUQgtnI^ܟ&n houޞ_WLLƌZԮ?Ǵ[o5œktG~k=^6u/}\!@~[E )r3Y|'ڗ=۪$U%*|n P4:ʙq=3[QS7-&`CԩTVR)c Z^l;9@ ~ObKfVZ4&^vLT (Ɓ\iqKsi Wtj]Z'iތ'7N&1F&v9+[}%rtr\ <~h..EyP2N __\@1Íg>P*qͯf" Zؙ9GC6v2*:ˬFdY.Z/6hxh{V%..e%\v#On՝VM lR[P4%n`9eTFBIkӭh`Z.iFD<H)aCzTmcbV۵X_pevZϕ͎);ۚ}5ٵBצ7ߨMIjwyx*Eˉ?V&y8UW2k3H1,͛h׳znCMlmȍx">=| iو毯b^smJ F h״sI`~]Ng0Kn Fsx?ӡUv1|; NJ?]z 6y`750:!u~}X;!\ X̸] l4!gEY2 (ZCp6SnSMvNsw?JjoXd*{7gvyR5M֗a[nRm N-A dłW;UM܌bHlĝ`>7|VPaI]c+M㏊抢eK_ˊ$ 70WDs{mJSi;xz6w=,e*k|4GqKH"#5JlZh{O% v7!cRn`y[ L }lU(8U{xmf2&۩\TPdc+1[JTxMqw}R-tޡ_ )Gt9mJq6y/pv"UX -;a4nkuDe~ȟz_{Kzi>d^9{r%HEef.˻W'QpTzWcC@Θ ijV1ZP[eᄀwbs5-o׀׍<ޯ@ént3he=HUOyZ ea  7L= !We -9Lszi_Wa{#%iuyU<3Hu8‹9DAzMb|q`q!D=Sd;mIENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/spinner@8.png0000644000015600001650000000217012700370701024261 0ustar jenkinsjenkinsPNG  IHDRw=bKGD pHYs  tIME (%IDATHǥKlTe<:hg q@M4E%AKqcLnn .Lر;(U ;1b ZLg~3S@Or9shL}&끐 ŀ*/ajБv=nAYǬ  r2x"9==Vbpxrvk@# nz,Uedr g̤bij6ܾs7ysO:,+u2!(PwB]JNi^<+u7{~j^A5,dBPּIUm>`.FH(`d5}sZ94ע豉 Q=Mnk;:18qeAUU-3iŸdYŌɑCs++mw ?vRGiäN_߈1/. _ET?p6VkW`?إKU%+O,~f x!=Ԅ*2VW½G yZSXXq#}Z\X@+`YS+0KEҪs{p,"-#M'Nq'hAdLi'.SeY;l|o6wVZ7yai0A.{ \; 6WɠU'*J/\`jtWq9Ֆ|< lŰ3V߲p3@ u;N|Vӗ v dj= k@>ܼp_)q"^jʌfo`VqSA.IENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/ScrollbarBottomPressed@8.png0000644000015600001650000000327712700370701027252 0ustar jenkinsjenkinsPNG  IHDR'?y/tEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp Pd3IDATx|UOQcHIMB? L.H iq5X0 YH=H/08I"xŵ!|Ą$"%5isj$'Mm#ř950ڀZi3S#&0$fљġTj,;hDIw)?DC0!o,"A42 8r89ZqvOE T0#S'Ue& 7%A*0c]>]b1V>r6L0U 'Ԕ \ 5z{ !ȴ P;?y1ФrxVT..YN$!dic/?ZJT^]]Z__W.v=8??<===k4tuM,$G<]]4(Sr&̯n Xm'Ǔr7"@Uz3vC5#ќ 7Rx*Zn5'@S質>O%]ױZutw{g~?<4bIj$M}%Es$~'=cw-9%])wlb$%EDDRB4B) wCfFAtN5BW լk_6_kua%P[H*f)"JRQg^Qܝ'"8;9"4[#wJo{ͨՖjմNP<w#i:䅪݇jb4ѾҶF#î[QJ%"X.>sDbKGD pHYs  tIME;fIDATh՛K0 DtedDRVٖD@:}͸#rmNuNRG :R u*!Jc"Q ܁V@8Qxa8L}ZRB 90`]x܁ND<_UBPC4=fAԐU5%G\ uY+Ѿdѭ@1F@@qBfFտ_AC%4ryn0 B`}}4#uyE[:4 7ǝ:R }83HVս^v润 m<łwYm-WcΊ]G2"Ci>*Q Ϋ .ϵnWЬwՔ7o;h%B3irK($݈+_c.Dt5sS!:']K_!_]x Xi;Ww,JD\S;co\`K=BYx%ɇKE}>6Ϲ wGD'6X wgbG|6s'6ؑM: Ƕ{RlΠ LOvEԽ+mM A IDATx[]eա'=XPUDEE#FMxeoP4A Q$E/(F/4HЄh"*mZzIwCzZ{_Y֔իW7ّs"/-W^OL9l7R#;#""떒uG:ԣȊWF<6;XsƱݾ_"DD("|9pZ\rY{:rW:t ^2h')M&D.~22X"[drzk# ZyСk"חz<򏲗?onOdO;'wwmrl>3/2=5ODGN,jzӗE~b-Λ#W j{C']>k-?^Y8tmFJqA>1\9difAQ)-ǑJ_~ϯK~8fǼgK)#p7 xÿF.,|Gi0<W^4`k#oTyf^=Ϗgtݹ;X/pUsնG"絼3Mﻛ76Kpɣ6Ki8|wI溲S3M5A֦wZ $ȯZ98?в)XMd͇/|}g+dW~eY^38&VVo]Wl?Gٗ犖7Xe萍U/{.?4t-~۸,ݓ7z]۳t8++A䮵"Ӳ8+[Qk*cyE#Ak֚7:꾖%Y + }PYDZt8gqΫ,Xg0{KIjΛ.<ݷݎ }P묲,S4/U.g??}x3DV5On>w&swo_*y.sy`y靚\:4-ΔSYyW6s ^-۾^n~3/]]۾9t5w<8 7iN"ԣ_rsV{I;A'l.)of~@mWdgn-w"5Tw_9E6IENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/bubble_shadow@30.png0000644000015600001650000000225412700370701025461 0ustar jenkinsjenkinsPNG  IHDRMEZkbKGD pHYs  tIME -7{{GvtEXtCommentCreated with GIMPWIDATxn0i jU^TB !A}ܢ^6MfJ6ğtLeF}M5_48Fm<&:y^0P~ljQPcԠqXxPxjFlʰRqX @XE gg \ nx@`oyp26;˰Ar-`p&ZKUK6Sf2ݲw9jӫ$TfZ.ZM(L,Ӭު{\SrQ4oy_{qR]➦Ph&Z4Ǭ*8sSUpqG9ckHa>K,ܻrϭzn#qi7Z -:*៲2s͏yOZ`x: 4S8IENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/bubble_shadow@20.png0000644000015600001650000000165512700370701025464 0ustar jenkinsjenkinsPNG  IHDR6/9bKGD pHYs  tIME 4*MtEXtCommentCreated with GIMPWIDATh՚n0 lgY-Kםİ{߰.ic[څ,XNGf'CE26X_Lx8MQcš~/^]7LwĹVM)eit+\ߩ{n1#6'pAl ?w0]:.0PK==DK9]`@5%@ ǀiK,g~lڒg `e+ּQW`r6فQTBA0> $QX8fRc :@j(O.IwrE[X; Cbc !WsӔLĒFREIU_B]V/ԒܰV`X#mA`󋆏Ϥ 0U:٧rE)4@5k\,(0_x 2*Y_ܟ|5{1(n44.h܈c%/%)66XL9Xe n!A 4a)PCˊ!FlĂnȢu/"Z,5C,}:Lcj_ i\+9x1TGߵ:XbֳR5"lk^ȲdǼ5h#r_ }+㹊?cUQeRPFJ1oㄥ CP m=/ WmIENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/cross@30.png0000644000015600001650000000360112700370701024007 0ustar jenkinsjenkinsPNG  IHDR00` gAMA asRGB cHRMz&u0`:pQ<dPLTE5tRNS?&:'6;"2ñ*˨,@ΥCՠ)I(5MNڊw9QS kX fB\J`^DGcAZ iUm=Ps7K4Ծ3Fӻ0+<%ќz#.|t !pld/}L xuToR8Wg]e_ 1̴bKGD˄p pHYsHHFk>IDATH}U#TQ~IF&DcK2CYF1 eIicʤ$YKEҾkWfygr{=+E hy@I/ (}n,! NZBTBtHZ 4=ц)D\kmP OHJV;'D*8IZM%;"EKM$)Z?gd:*'79`(XT=aF8lBPicuۨ+xs%"0vP]dA۶;M%Sv4"0-KWݯՄݷ+ E}]4!E}R);H"LK`I{6+G+ |Xt)vx q S)$$t)PRaAuپ~)KK<""{hbgxͣcbR* ?E0_Vd7Ĵ#ɫ~Z+IᡛS`-l`v,R 8?cu箵kǑ U=n> 3QPv@w#~¹I3>G4V R$[yO|u<{Npz^`/W=7N\j,V/̙ٷ3ء蒍tbYSh>(8>~?g1bb#|[:Jca?;1~Uf]" &@;Wic=??:?%tEXtdate:create2013-11-05T02:39:12-02:00V&%tEXtdate:modify2013-11-05T02:39:12-02:00NtEXtSoftwareAdobe ImageReadyqe<IENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/progression_divider@18.png0000644000015600001650000000022212700370701026740 0ustar jenkinsjenkinsPNG  IHDR3^bKGD pHYs  tIMER-IDATcd``Pc```;&4@,znIENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/ScrollbarLeftPressed@8.png0000644000015600001650000000151212700370701026666 0ustar jenkinsjenkinsPNG  IHDR#륱gAMA abKGD pHYs  tIME Ҁ .IDAT8ŕnEر؉ QJP8"xW Al$H&86t]X81HlJS].\iVK9+\.bQ(_=_n~ D#TIDwk OD1SN8p' RJ"i>~[;Zk)=O5͐U1' JDO^rqs$No|9JkJ1{{>O?0A@""xtԈ)Zvoxp!7oPDdֺzrrq|i sD ̌'oSRJhy]2炪sq7)筡j\@1_E$nj}VȒ^JJD :JDIyxƙO~ݻR(#"H"LÄ(HZ+81M+ u/׭w>jqq/yS@m7p_;Uα_H {C_Oq6k%DəaYNΉZ u(%SkJ-=f02 uZ:RJeGadGj)Rxq.ˍ{RxC㠾q ҰAxq^Y(IENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/bubble_shadow@20.sci0000644000015600001650000000025512700370701025451 0ustar jenkinsjenkinsborder.top: 21 border.bottom: 26 border.left: 27 border.right: 27 horizontalTileMode: BorderImage.Stretch verticalTileMode: BorderImage.Stretch source: bubble_shadow@20.png ./src/Ubuntu/Components/Themes/Ambiance/artwork/ScrollbarBottomIdle@8.png0000644000015600001650000000332112700370701026510 0ustar jenkinsjenkinsPNG  IHDR'?y/tEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp }OEIDATxڄUOOSA@ MlQPD=/~=x`BbMB4" #x]g,姏?yjw`c==<χ%(ϔ^zlee},b0FAgoP( %TWA1h}hc @\\C }.q#/,@KXb r)en(-`}th$h@+1ڌ49q >bs.xhB1hQkeQo=Zi2W3_Q3rlYJeH 0\_RȪ&NX^^06Apa̔)92fzY鉣щL(;9I&*IJєTOI&jHAK`9R;ӓu\֣wUx $ZTnYE d"dm1H6tfƑJ1H 94^9/][yxް7oAȡ `gwo[\.r9Ns|_y.upy=,XyK_>^Gr0u ҡh< x:"IDATx4$ّfy3}|A7'=2Pٞ#-ʌp7W~iuR)kty-snLw*R9^*tM:S>KR9>RtvO/EZ,&eF~6u*}4iݮg*/Cz/!S7uO_q[j*eٚ+JhE5G|YwR1"rq/霚 _-:;{BsttU[&wT~3zH+(QU:^s#À}o]ϝoy1y:=y'! (h^YM8uyh<Åx˲83tkPGX]#?CaŨx;&20-:E]};8#MX6(8mYI(qKKXἐsA9q*Ј1ouzCj DD'4DkI K/Z5۪Aj!kYpDЏciyX7;ˇ|CP uݨ Q9.֤.W-^WUar|D(\\nB(o#|lP ⡑j.@Gnh$Ql-0:ɽ@;/D-# = )Ŏ ז)XQ&.sΠZJ(= rSZ3ڃZn(ДްxkdGI="z~FБ> x &2uD ϼ7j?ق@c 0$rbwxf幑0Do/٢%ss"YuHJ5 j'ӌw^Ȕ8;IRC֙Nxۂh҃]9cJΖD~>;V8w*ؑޭ Z8 lJ7\C!ĺ̵EY8/9wˈ6R0/lF3e kh sP+`ɧ[` \s9'CC>qM>\rڼ10d&#>7JxpJaX=<009+VΥCc%](CY:eW *6a|ǰmK.gY UMXSЗ)pwQsY;Y'!3-93aG(x^v/\n!9)ω),a͹~6k -1a9B(or<| S6? O|ae%v|Q80X>e0<oA۰5BhTr=a;d!ȯ-z{Bp6l#rPxgų g3(^aeQtc8jD7BKoaلjNpj":i8,(<=y ,*3Ox aK%-;Zi{=-PqF*9gX?pi%BYAɣ1j( P#͋(ǐw@cTg$0l {i,ϙmj!5zΰ<5|ބQxV#B*ʹ1ȕfd/Ў||:fzs[@ݜC*PjMY|>K|>=w!a\w YwpR iQ@$|-mޫ"}1pFKNTǮF( (Xm2n" CzuQDۛ-B9Co5657a桪oQayTJ[ b Y A4  -g-z0(Z}~pgZql(y=s-QbH6KUYҭQӎ"JꧫfW0CZ=|"/ R̥17))Ο7ϋȻR/lpyG yчX}L P2Pqi@Pn"g"Հ1ְM|F4Vw Q)G+!ur(]eU_oW' NDX\ڣx"CE5s݂ÿf[32ZG4`]N vV藈bzW 1) ֆ7L>hqNy)9.ᕡ^iaߥVa=ш>6+g>qǧ%'Q3wýq5콢͢L 㳬b7AJcJɑ7 V;/tKva; XD$`{ JVM\ZײC(9V^޷-l'/oxxd+I讗,8FP#O(5Ji Fm9܅w04h,N~|[`--y*wcض%FXQ`ƀ&D>#UYkwWJoҸUn *9kNNș8yGSD:q3r^!j+O8K8q}at #r7(V἟hQA%Ɣ:m԰oQ[KmOT '/;S~V(nȪ xhcQ ɑϱgWBd#ޅ"ҭ$ 24=T\Lp߄l/+{U3C5EpF+)P`m-cѨo2Q~C/޶hQkm`XTt8ʩ-[PsÛIߺ\xw{"#-k97ƺ;sa<@$URVo(WFEk =BIb'"CaT39: R@Bp ⥺@L|n!N$# 9/; "Pp O2jr6 ڕMKDsӽtOp^KK`# m C,3jQڶϵ񾕕veL51FSXE$1<)ZNzx{#Ex̰TEY:qo9=Zc@SFH\U+\?ʟoZٟ,fQq4?:d<Ի*|R!<, p<4P2(DžeĖR9m//f)]-ÂVVJ0 O$㣈`jQL3#(&&%dFr쁠w<%Jd߭c$0VmC3ӮXkʫ):%ӸX#,g.WȧQuX0b劒w<:#)mi:\eLkIoe-,uE#sP)#(Aak L9|֎{h/_LMH 6 [5(/"w0*p"ҹ)Ÿݑ]z:-}ęj u/ /eSr[Ͻr_ Pv^d7]h*k'#sjݨiӂ,D,{^:@w[ rEF`+P$D8LD Ѕ9Wg>Ϻ^*n_*{wԅ K*m&". u|2zgO]@]]Cͺ Dڐ?Vk346OBcMtA<-Ƥ'HdJrOw乹`[~$:&`hƟ΃QV#!EgNaȺ(W z\ɵan_UBMORn@)PAh^D\>~!\,;q4FVx^Q8Vq;6g4QMP]oAL0ޚ=?'c;Oe,"4 5e'Ű},FHq1 g|Ά('}So $B.0\9Gcv&|_V 𐶆wy {<1+rWc$ .~/^Xȗ`gh]v p&wm(Ywg82ҘMmZdNR :Xq_y.n#z˔EbpDw==&ZAM#uyj1'-ۉ&*d#*f7x=+|'/v " ˖!<#Dhҳ!/BiJZ`boG-l{֫,(P/HD0rq=r Eod>A6D=Oi"S♖Զ|=e¸pU0I/lOx #f lE?jK?!("/K0 tד 1cڅ}g/^ELk+w'B DTQ-ƻ2,\`UhwEA\󩽝TS``; o ER~FJc!њ<䪙`Lu6gp8}AwND}nzEtFkŝX+2!N K%00m/ ҧ|~زЛTvH~ŜK.أ٫褸#FYK/]Xֶi+ܼKg4&ԃyR6=˜MY4RT0C0ֺՒjN9wY{sV73.CcX`H܆·HП*~CF r/B Ua>}{x-C1 `N킅G++x}\"&̿x^qxξu(Ӱ|df!*ȯânBPJu W/*p'a$$D@0Xph2,ݍPPg\w8x`\h[L3POՈj%Zh'D8!BIFuW{NAѻyH3ZL%yDNN wh4"74F'< em~#\/0+:J"m";q稭 n"o{p,J99? Y@n0[/J\>ocNIψHj8c1n\@]Q[)[]M'}!ɉ2ц] cd*$R[EL 8n071hjKxkvN4bm`MGR eyø0 -jN ġ9)yDjGl3 sh<Ƃ;ta;$šs[um˰1xz>RmsXbmn)S+)ȷsҬƙ[p99{yIVeMr /7#F޴\f1P/zw8y"@gb\ιOKD`QQIh4@$ZW&84|aV}>kyZY5]ў@agJ/#+6= %B{ zk_+┳h1v[]g!h&.^AL9sP.@UB,bѱ9$vX( ނPl\ T߄\pvc$PA0ŜTl?sۏEȩbז6hB-*53&:Ka wFu(%0{Z0р1NNZ;PnBxA&49XpVsn4D* ثc !-Uo 3QDH#Aǽ}*~ăB̈́IG^q!NYgv{C8;W=-48v\S"]ph-I`JVN)v.ʎ+8֔1O"$)"xs8>Dҝ +1PTiY,IGs:MP7( ڔE/,)'É 2w=UP =EuQI:EVAe&\XV; 鹶0<ttuO)`qSL]hDZ_#<%Cqg1,B9X&}X(@}{}ЄVæ eb,B8Z^C7n8Xb$^5[L{/_? ;a{õ^b4BӍoaU'sC68s;BojH݋+9)P,4V}Sʁ26'tm-P)䤘5|}2ΎZfb Y[#Yǃ+ "NF?F|Lf`,r1 Tކ^У=R^ xygo9mux̶M?C*h(CLyS,ޥg4֖&BI; 3n4^'-b7F>Ɏlk0#Cdax%ʍMԼ<@*즈? y=PbLkŨri+P\>2Xq7^m>#2639Zy IDdȠ&"YΧ_LWǀ>O/Bʣ!pƉ .Sxg'bb.(sA?hxњuC'97e-F+E| " i| 8-@}(gǃ|~O?C 1u"Fq`uA4VX_V]+޶照-' `K|ZlTxκ U"2 mz J~#e[':Mm@i<(@W8qL i' # ^*P,> zxwtU2 ܩy!jjN0 o`kBp}җh*yZGv,11Z? @j56@>GQA*)& sx_xO۵Gokw}{˛(yw0ș-@Թ>joχ6B1q5ePldYO, ?i;/0tdQ|p/?P-W7ֶg ]"[ zQ;NYsѷ:YnksPqVpT:3hLCX3_ϏeQE~;n{'T`}005 |*^=rfl)VV2 ekzgޞe!UPq!b㹅#腄~7ˁUmMG1B/,x&X; j6eVY0ͶzKDNK gtv+J8CQlخt*͍ s-Qd g)Z{[ܶrע*In Ve(e8*] Ct|:8>v(u4.0$Ȳ Y@l#Hb(Նzl 1U;1o:'SsT (%#-i`!N\߁Z8e)nhzA5z~tkE; ¨,I0S3sW5<6NT|[N[ڞ4=X^e~Ӡ$v@߉q `O?,ȎR/{測 3w4R:% "aZU >]Xbۂy[МY^Z(7t,-%yQI@jHJ[ba@ <'8?Y3/]+rVϘ[!'W-V"w0( ٰh D tÅ|LRo3Q_xq+Qmw6Su):+v/xۄGtr^XPN ÉNvHEV翥㻷 M~y?-MyMe)blqr<ϲBCx[/dԁ!cXWɃ&*dzQ$ό P6]mP[qԵ|:;NYdE{ۖٷ0Ӫ('։Jd j|zR[D;w)#\$ 1z˂ćہ%R3>Wy4ʥcc+&?%m紝 j/ZRAJC4Yqs!~aT\Q٤x@,Ho?*IQ냱/pHF7U}t ب)} Y;fߞsu,>ݹFh kO]{j1aqZΐ<5XItC`WUh'TnpPiNڈ$j]jR_?á 端8V UԺA bOteM5 7!wm,@K$cBk"rrPE::-ӑRN:.e|I~44rbΣB/{ns80 +qM , VfNe'{NVʯ:PtL3U]mpl]锤߽P_c=xڏR:<CVdkWcBv3BY,s̝Y% 4ܢЬp–jt.CT+5X(BG4hvvH iTB(7nz#)<y: Lr1:!& oYUlCtsh)4kg"$({`(Ҫɭq/HYmpsFMsiP:[S:`9##HSc(5^1Ptg1Ȉ%,kb7kJVآ6BI%uuzOط9և:&Ү;P{PQS3<Ȧl-iQBHǏFpF5̟h'P\K.QQ, S<`n6*&'5S=&k9ZHdu" pAeNl\\f6ƹ eO(PSf5EZ>S ;H^P0C{gqSl ` a *,Un(3¶ģ[\qk2`pںJu#`@(ukU^~bazG`+CwQ 1g0B&Iff1kʟ>1ZH4 { g0k(SX8dHeȞa~GYLW30]OAr*P%623UIMR?Gu'N(pD8ih{JqFByu!w#ܗ4oQ J4cHo. ɧ>{G. Xb>@~\al;FN Fw]>CdY.гb,sz>L>0)H8şmr( u<$T? %>'mm;̎J:bAn8+Qcg)cvCPrN5 ,ߑVԂdJ9>)ySzA c(rǟWLjqMPWɳ'dZ7_"ffTg-y끆\mDb$0awWTftJ@YvF[A>mU 0T 2gS->*]4mIvHc \sNIhҠ^kxrzr).b, EA\l#\thyzݹu˥rNC%6D%Ì=?ܝ& ȠBQV&^NeOm08Oؿ@Ww%k {.if7۠/ZeU29S<&1}Fw 9 jn{$ "<YEYDW-+!sr-(Yb~`+9&UX^"A$8%v\%)gjv[PN DE4J%y8*r-cs9 T'-]0њ8 .Pag|<FX,h449$1!'a+OBCX=~ODOF?+ 0EZF\Vo\Q$IKdÝ(B"ևo/UVjQuU(>dieC%\ BJDe}yKwxcWFM bГ;\8pK~fB-gy1858U7+O(5.%~̑?y'5]w2jMf((X;zs0# I A4GvM4w8f'/(Ib{o(Cgl 6ŊM]򉳒w;3r vŊ\}5h]cSu訳Xd[#R?Q&FbT(nZ09q.[sX~!DUDgX?k4{V a|FL8 u,hb] 16:]: cD8z \1K8) Ii!/`cE"|%b[2gNH"q2lT_]t߳%"#!u3kxt1K!hXZIqQl䯸OW?,^.Nk<[ǘ 1 K"EQpUve֬\f.<&$4"\ Bz3qzdz|1=$я:MJk.mM{9`x 1%X&C ?:+ő <;+Y+f/ZgXhTvm16:z!f!I|aUBc5VױM."喫YՅ[-YlNe߁w*E.h&w1hKO6g"zϺק0F/x/w9c?qVK`#>"ۖ\v5D"[i v}2ћk,ҴHz#1 xC&WM=\t׀gœ.X`BAhߍWT77sv$ xch8c긬C׷Ს-;O___c@Olڒ ٔp0GvmeJs_xˉFDTSta NBc&\'}D>.~A9$+q'"[p3Bs YXq❨7$eL))ëw:C5e\2Ǝ]kGv>gh8lރuMU:bt1YzYZ8`1H0͖0n=9)--]Ξ7hJgSM`o1U.ΞgrD +RIC9~FavF H޼Ӛd* 1ҁ*BXח rҽ}lqjb:g5gTE(b1 u q5Φ ÑHXS_ϭ9?h ɯyˠC4d"kF9/{$# aiococ`WTQ89p_Q\-N~@ 9QsSKNQgEyrр"dLxbHG3w&$[ӍK٘(c:5aeDW|n*sp|8,]Χy q)=J Rp勥vD9o7nߒ;;(_Rf!eÑ4&Z0.;Pt">(s>~_ad]m㖬{q*N8||{RI*o WYv+};pE?\Y_xW$ӰtEZo1#zvߡSqZҞfY}] !jl3 mFMZgZ1x0r#J 9.!A೼R w!"akaB,MD ܎)B7#wrlqK0q}>#GlNf4igG3x{]#&0A8yF.;,j"w3yu+Tf|ZE |?!1z=e3. P}gQoCEj"].m(W7uWL agVŮ"d_RFWY#\C)s۝TQpZUiԼI@*kQrP#;"kʐ,N~ՆҼjDU.4HŨE+s3RA}tn9KS2O943c=x)[:g][ rne-b L<#s DžvRX'n:yt4G,uPHK˅0ֺCBܣ Zrvhؽ~ h@6(>2;[b4i$H N ㌋??.zsDX/GxIu1tSJC^?RjWa @k8F]mM;_Y[B()Va݂af^!2Qጉ/r0bUms 軸]~HNE@.)ZW95wpLȒ]3M֢GJR`$9mJ4e8|p=Z |^HO~cUb*JYVdzM<.wf3<O<>\C5\nr.|!V]$ܹj#EgaTWI祡(lVvOJao1/#eA/讟cY5alpuD(uJP1sDI*tnst4l*~!tdP&6*_Ne_ew=>_@Zv?b(R|爻Qͱ^mE3u<'X'hBu+eҘ۱D)R4v%Fs3z6v~A/9?v5D5Wy,%ب4Fm_?3pVƢh(|Xd\0`j>@e|ET?g%{grŀ^=bQxRS7b< _?T az9+BJ@4fQ1$A̷dx7P*D <Yh\A-΁y;g-*E49۰wbLRHiH`jq#YA,gWjwct *˞vW)p[ݏ] >?)6q;uVޭm* 9ŧj#ҤE^Ĺ\#@$ 6*3 jWs0lPXy-%}J;2M܏G0\yΨm܂"ˆV ?'E(<6]/d\= ;%<ۤޡb$!"564S%zJȄd{_OZt=vOTB(grz5<3R|ʴo_"_92Gw5~s Pv)"~,c9D^ :agb$6!÷t"˛Y6ܱpn\Vbdy ]Υ8%-,>))}AK"^tg䟒S~Yzo!VyMXop F mb\gݛyHDmP 'hZ1 S7aYN jGOgTO0k!z??㎥:ܤ2i!f ح00i$P =A C$ɜش: X8ӤYӻ֪:7 QddiZN}eBL>6ݖ;bݶW#ѰQt|3O"Lk<1.DCRY-l"_R6;e=DߍލFqUO۱ZWp!p%h/Ck{<+$u:=aL=Xw[([rڼ,\渹E3%E|$o}MV>ֵsYF?;Mˆc"E؟K&" JC5=X{hJ\S[@f4bJ "WtL!4IP[سV0 e*V4 9*!n­RBEPVȦrcIJ-3 rfC^![dv)E^578 "X{HZshf*[$xtnDPƨ:fI>;!D֫TJl[)#vESS"pUme^JjbZb.yHƑږQS|-UeW8N&tjԬHwŗGO}oPڨ5XZbA"y\PJ?XU6=Cc><G(j, .n3L0,h:j`F,z3B>V{eaX^l8aT["K(8.??w{kSF RMZnVĨu `yz1&/ ()b Yw龘r]47^HI!˳j!>ѝi:RZhb[~Rrsg @5d7K9t`=jK",E-;thE'JY?hSUU%V(4 ːh oVsu6=GRk.fDbG/=MޓzLQ9Q(*2D$ UX3VjUAi*oqNZ}9Vf6C>|`*a XW`;n-*m6K*<5!RjFp-^oX"e~`qT0^Cd`~uzYkQaɇ/,j3e\+ Z8@zү"(j/LGXj=ZOZe()i=XL\Șq 1r9 SW*^m=aTciӓA|#^2)JFŐ!l)EYlD.²i 诱`RAl:ǢF  TL%;*e`5?Y<饌{5tfl@7FFu R/zyZj\BeXR2ws(E} ;Q&Rt֬;T& 1pt^Nȅv%6K}|me 6zv#у_a(ʸ #2? g_k;6[MMV>8E`6VxHP{(oE+ƮИ^:.#(:fCGAy* Pԥk ".خQj=uiѭdם?@HMWTkvUap+Ɔ-50mKÆGAOb-Dsg*P<PO,(Av%bi^ GY?ckOzEKBjs̢;tFr`G7Hx!EE+Аg@pIUx aRpY9<3nhdM[gZ}WU +EԊ=둆G,*=Fb$E 3K֞[g%݋-!4b=$,;1gFupz0ř5lKPӆn@)zN킠*lf,d*.IjJueu{E %իٵ7#zA{oD>?67~u!L,◀GGG wASpfA!<ǝ>pO pҮsۃ@E%PJUƙy,.W~O,2 jS6p [Xڧ &b؉'n/T.:V.n*e`!,#].*A>>fAmPֆ9bٶ 8 lŸ^= ށ P]"UT~x_EZφ٩ݘyx`sQBR&_Jυ\+7`=e'mU: ƞ;Pt7a=Z ;0;.ׇ'!/MfD ģه|! 61hXa[YƂ&J+)k2n1ݒSUQ6v39ȳ fty(=eX .EO~#`~{CQaF6]|uFi]HZalZf|ZAhjI6F`B/  $ 6 ɗ:|AanXS5w۟TpF*ӼF u(|atlHo*3V%5z55~xq/=X!>CyCvg='9.%V\Tn< K!%}~brXE/\u@u\CT ,D"Ί}#j'b ;0EX8AU [J5yOj1NT?<(4y]hԷYrًmU,bbO<xwÏO TnؠUڤ3Ь8K*4> VLII~9ݮ1]}M>8j䋑78D(7ySFHVЃjht6pu{Dq B"- ,gdo,ώ$";I#L\HG=iP!Y?G IV'=.1hzd)h0}v_}.@Vc:/Zzr`/gK֫7Wzp@+Zu^, C bXB ;)h]VYyiJRζZ}m0+pgȲqeW{ ye0:B*IX0UЧvLPBWS<|JVW@EF{AYBw=}qsUFd`؍}02x6fKP"`Kx\F3.7Of RϾ1 oW%lev_67!cpL>!ˉ3<+03pmh۳-g2Ph[> [4RQoT&\ " ԾL@)IOepl>W>KO:oIS**>+TٯV te}iCP;+*gیbLSќK([@WL?ӷ7|4CsUag2F\C1"S!QG c^u0@swWᘕt kFƎH/s!$#tXVFƴצ3(=z+e gpسvYwbOܷ.M?g*(DR<`UmOFP$ 0 Z)B.ZYE=FPcE9&\8BXE\~8Uzw#̋(O7E:=% |&=3^"(SA0%bDƅ)8o%1~v(u8$@7UlX9 w׬k1E5k;>J"C+ĈdG0{פߗB`% 揃Ejm!=32rZ3 ሙSs3nM3p1aa6{O{[hpZjdަa>coj,Dǡۢz)A%M%:5#;Byj$CBM1ۡG,\ #33G[ؗ!nay˚b(=0(0 -̮wԴo`9ŚP>۱1ɦnM4DXGhR&`y~!dxm슃)2ErAfIz=x [NPƮݰc5!4@E^\-$rPcҋ8E R%)y0Ӏ92;;Q@,I"v]f*"zX%B?|N  j-.K X Cٱ uǥt $Z0BiEE@R-޻*FgϓrèY}4v VU7c:3j=a]km*٤d3UASsw`,!q/GXC%.]'[cZ،;􈕁* nϺfנ!5NaXm 8P4nC7/zZ(S2-9ּ`I^x.Aͺc`O/LCuf/;fȓ`} uew!քK 3TuLR˾ǜ݀ngkg}10Zj ذK:m5w/H :KQX+bQoyPdo Rਲʊ#U[m$SWajс.3?`h0)8Eו?+GDO!hӥz{݆3WUcb > 9{O Z{ɗYwFj2Ŷ0jyeSgv Ap=,vmI*g?yNTnY86 +N~ܢd'C?iO\" 7*~~. Xֳ=2xy9%y1ȡK?(CآGY:g.i%kT(h%T\M^*-!S1Tp-u|7f76Q=<5> îJD-2 ~V8V'&0A/Lv}\#ܠT&5 ֏ JES)PmVYMi6.ip?>njN$zk6!R)?  [6amR+w+vo#MU(Y4$m2pdv'LXx&t#gUjiކRNTqR*0~y^7vh ZA/҈={`O,x N nN[l"!WB+ h_V8¶JkO)J<]QU?4n{52t~l{$[H0rw = |InSxOWgSTK =N PЗ~fT+{oa6@NMkt"Pe4kVL~{8]VrF^yS! E-|m_mK[SyΚ 9" e^jaK|Yv>TL뀌?6rXo}GJ\T̺tKȟpY ?K:zXP ɇJ?/\0 V>Op*9"?opsbfj(]7rd1=cq{`x9l}_UF _ՎOm`]mp[(߫[&$Rp$ϚEev!'꼈̅Ҝj~,7`zLTG_Xn&"[n@E(8$6HI)E7 c>3-Gi'Sn)Մl(8wΊG# ^7$ Sh6 @J14C1u(;-& dYɃBP\iF|HuXWR_z)p!~+k|u=^ָ}Y=KXHܠ[Ɠ4I!Wóp"WV\u.\Dsrqc| %3Iϭy(6VƀhdbFD%j߀&@QD! &Ĵ} bswϗIPfn6d@|Bѯ, ӭ>^[@1!ŕl,a3OCY1\hR"d3sKʀMV#V.UjUm<$ݎCJU&)]d,ˡ?!fmn}UZ B7a퍚OLƱ _PLFHW#(>TrL_V,epBc?*[Z<Kes.5[UwwcVgMPQ;́DQEocf! /UdiOPFUV[ A( Be$%bsP8cV)c^@?!jq]Dod=wlƺ=+ mI4Dɜkw^,"^ ,j9nUfTuڬt/˙Q`XI0RH5(`.Ɍ$g1PbhCVXh'<=PY6DhL ;zma: =@,__޵G}e|g@䡦yo|Q v^]q@«̆L*Xpȃ#)| 34[`?Z޻쭧\ף\eؾYL޸[a?v0Ф{N>M ;<@Ȟ)@4șEH@(AU4^y9B tDȊ2QƆG]U\ϟR?"`*p3SԨRtې|XlhC bBgc=zz ]pN䪐?+KoR! 0&B-B{Y+r2wAk=YQPiӐC]-ul1 p0T{8ϖNVnsKpe1Uw3 ֺg }1N1ELG ->@]"arbD~ȉ[0j;hTY|'iJw/f)-J oe.Ul;`CթَC~~T@$ѣ pSsG|\r2dB6,T$x4w2- V-0Dc_L7]ˤ$x-j[,mjCֻ;{:~Rދ D=УƑ 76:%J騨6ܰ&h? CDԨ֋³ tVײI[]<4 2Tf,Y=XW8 xɮ>獞RΊq @ ­l ajwżbEt]oT㼘 )cxSM$mY Bh~[oqbͳ`EASꇒ@x{CLf˟JL]k7kts@/;ndɶd3ZYҀkm-VЕEB0n:SmYuÓB;cDWmk3 Ņp "QDlbag[<5mӁ܍~iա7Cc c鰙FR \{x@`AwYluk6; P  U.D=)"gD5`1* hl<> )N?FⵖN0@&%JˬSr K Zt NMhP-=;yRLg#?CQIHdskmc~#u)8٨(uQ;YWuWXba(9 iE)jSg" : $-, n<!Tq4Mzm0ZggYYR`8)clPO[AeD賨g#R|yH:XTls K&1ς嫊PeN % yY s3o2 Ёe(M/&z%+ё~>zJp]Nm - qs{d?vRHCKV%:s)@*&iF 2 +e튡~MX,rJ9?g~< =5VUR`T pȰz? v䤞~2̰اg"Т(>^{d䣊_EwMX=XGĸ5=.oۻd|]oGKUf} .s#K\ΡY%4qWUYH+xuPϙU seuhhobaxeZu}IGe~=lŻ'pf7Z]  xx7v)MY% Mꟹ":j9^n~gj nL23oKn56bXn<1ŢeRci'$C0hSZ̢jad)zǙh塲 =rPi 2 ;#%*SnU(NjdLETY;kLe1aBfȩL-.KUFE2ʨ dM%ߨLLf LMUA+ 3ϝ[ ❍~7 ?у@"cFxA̋VuEY<wV2L*3#X X֘zc4۟Oa©E5Z:H_ ?wZ 0vHy2Zգsӕ˦dnd+KӼ7Ò RݶJ%bgKF@}Hr/e 3Va.lH|/第q6O`ljPuTymT5hg@L]C|8<; uыwׅMw%-`zu"UwyƨQ0}7ÌAjvUtc)]PO_2Wlő;Ca,2tmtV:ÎIM%1:x)":>ꆭˠw!g}F/Ld}TK5Y/+_lV޸g T\BDƀUF٭]`(rn8.zz@hL^2}clzU2 'H0o$uY Rz$zm/SpHcvhN&m6+NV(݈GUh$/. dD I&(" 1roed(ڎ9~9Q(>@C4Q g2 Ybfm%@X8DƺHva%<`YCJhԣЏbez$ȑwg2>6\ 7d8?dٺgu- c{n:ؾԴ{ަt#d}c5!zl;(~ >=/HFPmW0w/$W! ̽ڨqgiMdő#CG7X> >zvQniQ¦˯%R眧MTbnח~L~v|k<'yr 6 "^׿W"%F<dl洹D7^jf5˵66xSy XanI. F E&##aU TQa " ٌ߉,Tͽz]fф2E ZrkJ(edDJ"hV?y Sf^W~ps h)Y`-.+Ƌ<9F9 O4OF^HK#DJ=YC!U>qL@43fhHڍ SlV!q ~OT}k֯نPcJ 혁V}l]y0W.:;n{zS= f`J̶[[YR}x:(%¥w[ EaXBl " D"(GVvBjQ]YXtb }W X@63 YQܥ` ]蠲eMHq)X K+00Cc%8$Ur+EuWa,P_P4--[-L߿b:{psc2L PŬJ:FC42Ì3QƤ1}.30 9:WX*ԫ<_|6Xsȕ`$^Ϩ@|y3 ҎkJ1Ce71TD9A&Ҏ= Uq ɪrBC EZ ,m]L 41CkʲT ‚À8hƮ-Y=`*T ͭ,. '~@fAEIր -^M%ҀN!a`hDKesE*CY8*\R6<-]ŝϧ5Ə4+pXyjs`;P˞,PQ:0-~u4Y&"~aNZV`r1!%T ҒVqk6 Keq㧵[z;O 7j @PgXٷ9y!b3ͫ䡯m%C; 42 72{5`x1Ե}0T=lF d-* }7sHFeҳ@Yjtp»1JIYFcU{6{l(jLV!BU齏ճ[a7߈Sn&C;* hl6o(1cpAEf z#i4\A6l~@RS 2_qpW9xNҥ qa {[[| bI[06-vqPbJ3>PaͤȾ>)FN={PfPBT0vaIL黵P O7r{!Z+vzL}xEgBAl:{cuT-vZ^/pO6bt {$f33Oq* D" " |i! al8,Bڠ$/!iwo]z+ NF`! og{PڐpeK.lIm!i耎"6T t pB_S+H=LZaT| 5KswZ-^aea%_<0D'Y2{=<$XU&t%ATYQI䭞2a|1& Q ]&1h eƅ5-;+އg?-4ķA>YzG{3BJcFZ'[ٰP_OL;:t%mKζ#249ͼc=aꠗQVߔ yY/ vŤU%W>RoC20Z'ΐ;6\gK[FȫYbP@n];jg^1b &@PB{oOysծՈ|G|'FPMb}`&Hi[C9%#j 'xAB'yݷggtt&=sVdl>h~8]nܴ瓬tܓIU3>Ct0 BQ'dg;Ȑ7e{;jaEl7ňډ;%ߢy f;zO`у HQ$KʵessTz +!ugm=DTl[ޗ a}@IȈۯCCW;qo=#FEP^&YDo 2]T)ѓ&`w |ڐb)1UTJʥN%\qV"er| > UU ;h GXmkwu''h6˦Y@fV,:p;A.f 'c6 1-!$WpC'jYi Q0)y*+ҵe8\> $QK%iu b[./܅5{֭֟Ń ~ i)mDž FE}<38ʕW/(e(_BVw\-fWx簘j(~d`. =CP@oArv_pVؽ_TnhhiQQS~zN7e>ʥM=i +htѳ\Y׬*!(6Η =Q\2<%6s/Tʶ0b|3G؎**8|:j x@V>" /A! F*IVa+W"sn'ʤ@&-2wlK/]B]Z CT+ce:{'-5òѥgu`:lC.=fy) Jay+gOش_2~.<_]0*&e6Oty!q\yƖ6X/u62)ZoGsYt_M+07ӳYy϶#loA ݻUۄ* AZ;4y\wN3U_`.3Z;2,z=%W5ךZ\ C`w*8[+)h~JZqQFb= &4OmeCQYyJJ9ze9М6Y~5iaZZp̾sƠu;46kJ[Vzo&x`s`z_6mVSY .$r< hD^2G@m @B^5km%#8t(̕_:0 }VЩżF૛(^:Pz(oLƟn]MѮ, hf&fޕhE-!#]92k0x]2=2ٵ9I) .̉)ospL3c[Ee޴9O/љ˪㠫ؕ'6 )W ]*E'͗{f\A1ayKΜZTikفdm[wA7>=Yf wZU*Ue HSAF|tg\ 4z#( 7vaK>v=== )ȅo߰{'^.}ZjA?AUCz79@yDl76gN+g6auA5#e!i"DPTV;d^?: RcJP-JZJg!ʍ8 ]wA}5eN.mǾLY'>C[)ǣ }&.^sfԆT}!+"5Ve 0qd PlN֮@^{3DJ}6y*F w\=,y~Y|WYWdrkvU6Dt`?Vpшaj Bwf=񀩃z<{[`efibw%lHJz*ckˎZ$} 0, 0vmA8YҞq΋p0YyytD4mKY!Xq#*?#fJS Gi: /CiGѰDbHY US\,~CfE[ư`׎*~_ $gF)fA8s3s^FE/ <˂P)=,Ck3b[앭{ 7^ Kd>[0` P}xQIptbY[^@ezd ݓ ݺW`mQo4#ey2hC V8N q]8ʂLD Dg8#< -vquUoIu o̶d(s!th.d C1߈M> Auiˈ>rdud"Ɇ5:s/eUă[e-ct:ZemJMAΌo\ysV7wo)<&[ul&*kxp=:9ZCdloNxwL9\ȼӷ3/Ok@r|U!X1[5m`V}\rv+zh%0x*xZo,+^حWnz [c,f!3^ ~;2ZYR1TpqBD >PNA e wm "_aiTU|,Q既!idLz+=Ki\oV\}W,<[kӯM@{gƌ(Nz'Y~nMH_qWYA8AoCzx"]}6VEg0 5B ig2D@:{^6XJ>k72ZRP$!fJxWPZnšcsV ʩ .YԞdi1T <(BÌh=yfDY%U dT! ;V2u7Za(R6ݥ-6N٦=ݿ͖otm/ +vP6 ŋMF dw_MVHdEå=%' *({N\d&,&6`dDL5eaP,^uv<0A S*K[5,{ƒk]q B+tIVu,@{Lcov/j.9 z@n:` q ^z [VL oerL#7(>\(KdMߕ J۬j5W})8bR F2G §ulمxG#9@hn3 f4*ܵTь[6a.ٜ`Fqߊu50;KGulUY*2dX <^" Ky.Aۜ'B~$zpAso܁Bm7U:8e},|zT K/uĚ:lպPk8, ^kJ!Y !;βGY^|Xp(l *Vi!waK æJ\H?n;JfTOyͻ8׈ZZ sI (YpJ" AםgW̳D}g{RJ2w 84 A2D~fPyxǖ+K!NQbG:R WԣThG تǐP`^<3ǝ^+V1saV4 HV҅EQpEbMɝ z /J:^ "x h^r֫~c`ł!().WaA&Ƈ.qؽS6ڌBllIA*4"Jgq.ͮlsԦBD#Ao(-}[FJ[9N7X=2Bw,1nW$A7R o}\`P0@}'d!3ATL;r<+pqt~)ƘӐg}H6*S Ke>i]bmʠ=֥x` w ^9/tP&3y aF0Lw-XoB$]7MMd9 N2ng3Ql00Rs8jq'8#u t "+]T2BuK*z;UH>5 Xhn&{Zt9_Q;jHʘT>U_BTUeik(P[Q/VP9@Y貴H֥UYE⃁EYYoL1Lt_&\^^V։7b $8?gQ=]^\zeXk\-cF;+ 2ԛ xPk*L9dX«8Mt-xbH)OIJS.sd3 fpbRuQ NA3X1\{@h-6a0:3E70H2b@5zuiB53+gNȟ yӂ 9Z&MY{8 -8Jkv'=W#z=^ BbHffXwE>$VmA sAQo,=I lod~QܸP Ea zMm J.v5HEoWL&e5S`)`*jKy@ٟC0*$^ QxEk̍eqj wĚWWsmd1dE#SSQq УD![6WgNp!l ^&$3#K_:l$cͼmdv>*;ޔUmFX\"! LgC? 5f} EYҔIeyN>X6n`+I{UUJ-|<4;ݭWԜ++H1ZT^ S[\a!Xf!r6>j5ے4ht^ fP@'bK+.$ .L>ZoST) 8vi3f#nkDz\li$Q@|{>բŖop#$eVu~!s 5< >WJWG>8}$@xXx%m2pDYr7 `ҵy`ʊ ~d{@p=w6(3ڕSV2ruYTD%a vF@}Ie;F1C >sD!f pkZ񕟡Je x|sҥ!Cp_N }4઒-h(AW,k5*(lK=~X~bKse$h.4킩7]UrFMsPG  o#@*]n<ß/U]R)B6>:\5"N# (+䱼Gqv !j&hy:O6\6q(1E3(OA"0}63`IrK\@TW&eM0AA DG% K3"hcI &q֕0q1-_VJSqVw{MGea==ixJZS%{_\.J3טCX> l=f+⾣;M&Bko]C< 4H^miX.J 3!Vñ/[K,΢f%R-j ZblXY,oyZ%xW Vf&k ߚ3DI7K49@]zbsARn{AbYg39 {-l{H|p?M_Qb[ѣGbBJ_YA "Da30eڠÎ" I:Y~[Q.CƢ`>}=2Шں%qd>\a?/w6N?DKr;W,$Ro@nϙ9U@Ŀ vC>lР^퐝?>tسыٽ y=rYfSAyY{p1Xd7D $2l`&*+O2v4WCEd JB entS,0 ZXf HIOSR;ޠ".s(WL)9 SM#QP"9%O[yʍU- }RMI4Räy[xAFn ~WpGY| T|VA{mOh }TV>Bnި]Z'XCROfH==߅ ~Ü,jӛ:kWw atgS7 7 #j.$+{f>pyJEadt* I؛WqZ1APG %(HhA[z K'wJy=͈ "vДD|sYcLl$6E={\|VBlWft5 1 ?oʘF'^s I$rG7j7֧+" ~T6 ƕnMV5Q%\5+#qPN."Pe]D;@a?ːgI3袲#*5׸y?0 sed/i*}eSo?'6Ct Y [m+ mÎg=߆qz*OylC~Zua׭zȃw]BKm}qe9Ne=;dfl錗,d*j_0&ژ}2h;6E_};}y#N49yڳeh7D]aD2ߤI:8t`Ng犩0 -0sX2w\6eyaͻVҙ`\bbg/CڳT3$<ywʫGZ>oĵu& $j,3K&%PɃ,n @Xo SU5\@цoWCqw}mLբ0\UHT"4E,25_~S$81'Ұݚ.WY$`xoxqnմl}ɑb0lRL[GE| u]da,`(*d_vfuHX/2#LB/D,ӋC؂}t#;1dfQҮVK} zhB#ɐյ<9鿍3XMV٪.Լ heu~ ׸^uzf/2w ?\l"ӭ3)S_.deDRN 83gm4SA-Bh-A}3դ͢/쳮lG}l7K\a%Fg>Ppϐ>AuG]%fIAKg!&lԅ -@`j`<%An\R $ՕD$ɬKf*fy5<.NzW@l㍼Ω~o=nɃ Uכ~ Oe` wPa&^(F2jFؘ_'0+V_n-_͑ Wrp"Lc6 880ܮr/ PzvCA0١JphWjN@[T4dMr$ypYch,$B{ʤCrF iVvۊDQU^XM\EwUu({ui+]pϘZjp7spvݳE`nתJ|lҸ(UF*lm4#WLqzVPgsQ곡. ;7**qqT#W]~yaIڬ:* 9e?ۿY8ؤš͑:#S^{;[Y|{dd?wl!3(Vز,6H8@Q\n|-D!=۝AVEP=\ƽ ڳ2gv-0{RAqGQx(`oPTm'սE=,M9˞KP+`<`Bތ~ +B-"G yU{6c2}ҟ7q7qWJ""x&l>ŝ*ѶlVhaUmL 6Wqޠ`U{9(!IV^3%2>$1XEGwo tΣWe0a|pT1ec'= Wn??_]u.ffJKҥTP 3lʫB(DBV2d$dn86ԔL5w"b(/I0" ,6l0KuXTd)Vnú$̿>& w|7=i\((S=r]Vbc4u^ypC'/YKH./:2VY`l^tPD$!<U Af`6DE8le=0b5pb[._Nnk3bU2d!&|,AcZdҊLsfx΅׋a~1`7[ahԶ7mQ^;ŸsW&ii1Z4@GTHs C08 OPZ=UGrSУIQ=9uVI&1ڭQF'm?~5c/T*Vg{!WV+{Ti0cώLs]zx@|ofC R?x8nAKCq~YfҟUP8$m;C.0ń g.:Ug%!eƏz}YK9!z^dq,&۫Z `Q0،B׃Y}b` b2 F[{X@\yh>vԷT]q `!<^DtKcAQ]1o` e`^>x8 47 5802yf[yb3٣EX&Sهvf"`<&y2%HN2KڱKPҙT>x.O5,72.:چw0[dp2ѐ2l4_.,ɮCjYBB{~qb& +sM^,ZDƻǝVMv)W L0gwgӓsGPvfw%& [,7J:nNv(р 󧀱ѯ1qKђcgw۰TX杽qh`)!zc`bm;0Kťo'Z.+dޏWg8+Y< x=t} nzEuE3lX&PZzZUU6@(4f(c-d'VP3`pOE?Lm& `+<3_Ys 9oqbbFbԳN ո<᭤1[-ԍZ OPnP3kX`Fs'iSr*S 2\D7rlY5At:v}k4Sg#f@ V!⤛ kV;UBĦ _Qa68 i¬!4ef%E"`2ڿ<)HKJWitb;q2eIuFf2l  -1 4f ~!M䯷ޢ'-LzpXED &J ub}:0ȄsolK=Բ fT@;rΦp%8îj2IoG\}Qы()G2U\+ܷ ymtU(D0=/{>v?:-a>)c oH/^TX'Q~VA \6ꙁq` Oӝ}ﶈ*z=eԹtMyFU:x+01:Ax`-(J`{}hY/@4ɛ?Z.ݳz'X"XdRNdeuIV: p+0Ħ )TX&3нE4 \VJ^捐*%I0itӡFel>12 ˠN turջzS\lUR. S @i_LQYy$`4n|d[Bx=BQRA@cۅ~U .)sY^PuYu3'j g!uXlGgf+ {T aOJܜoXnL2d:r+"0jCƔ$W+ y,Fj̤=*,:-alԻg y٧10T9VѬ@q;\YC K;0J:[t!zU1y+q04%lh ${Qzt-Al_r،$!YȝWҟ>'4Eey襍O|ڋ,þYoOW S/mtəр PG0sJ>d+B%pe0(zv_An"OyB-~ڒ lLJzR/pH#\h>AL`] Ck8@&BYJ)K垇wybr[ro:ekMżP ym@q'Gl'QAj(9ZTYrA1Y2w g5voLH=EMbNB6!Ut)n smQ+(ewvVkuh++ӌ M}$NYj30 +k( 3LcU*IFϽaaIu+?a3 : AS3Q `T_afO%jv €AX`?tPU2, k*ܖp.8:^`rҥ=L Ɔ-; ŷlstooX x3lɑ7ƤVgve>&tA 5Mp7&iJ45' kկOƾ ꧱FjցlEGZ1k˥6TAP:6moZqE6^qKFWv6}CV;]dM ;}@r ا{z?C~|c(E^h^Pli5H>T9j*_]` ,O"`)Os(4,?^j[2M XɃ!VnnZ/e`b[)Is J2 jC %z{hWxD3 |u޷ ߻ {CҖPD YJI])eEkY`R@cTնJG["Ϳ#12UG^[&^;#\F. =}7j:HjOc_ yWZٟuPMO/ST& %С(d\L5J>S)B2Пу\t%B-iyOOUuC>ȯl?,Ly{^=A <}3PX,gVEz=3p^GX0gK5q3*‹#HWdϤ ?a {)z}@t_GI-rZ0AKdH!}`9 U0p(a|^ K@/&dRV(h*ܵ1f\\ZSC%9])&"]oelo|D-gή`O,38+v1!]rg ,@-dM%W}сEICm" eZ0_\q:CE~'s 2q/?LVQbBa(rq{5kQqAb;fU9L)w4*[mAf')*L:3zX]dldm/GF`x꽞Hן?'PL]eVNSGl )c2?yP\|j- aȪ4[rԿnlK>ްa221a AkuHdfKD WUSL[߯15yZ+pQbPIܻ7!; k}:-=Qq&:zГ^$K4]@[y /ko|-[ |ֈ8}Qe,'̗{1#`{rhdV9mLUYg,H?W0S.Y:0UL? Qgj m4d~E7X̃"Й^C7,E Kh 1a愤T!$Sp0O>`7xr )`i7D#LbRb 'AVV4e d!Q `;nRo,M[ bPh.t-&=kOZ` 4Xo| z [mtgC9$XVq{'m  dZد< 5b{:6$ QK_;~,b.G*Ec3ŮGmD Ee$tY9 it\ z\CF &] q: 6Rbp2e=D9>;V| ICSyK ƁV΢j?؀> NeCoi6-W)ϭ=_x}5:O%E_i Xe!PgS{asZ-ژYm#3d堖VuuL-9]Dߋ7rg+<b2%ҷŀ؇lRzdgf,aXљ).z7&Q.`Cܠ paQ:3#i gbݦW4xY!,ȁ8$!8Ty.xbb)Q5@ ò6&D]u1Fm79:|ܕᴰ޺=~ty7\]c{B^-^]83>2ua_PhoA/WLXkᴼbISd{g O"Q%{^uZ 0T4cs.l:d"@A qn$-Ԭnc?Rq֚Xh y؂']i3T@`;5xJT{zw^R-Ui~}`kmou+YdlLTUY]E֤8lWL H̩-@pzz>*rX3Qfp1׻8O,ԃ@TcCE)$_AWoQ !hhPiLlv0V)0@ rta{Tgq[QkF8w2)f'x#:Q29#}N--upLf쐑JيA/L#)F13Z#4g2@1@¦Ak#%#p?OxbΠ6@<bX Ǟ}:hhxZD!yx>h%deD?>zK,#ϼd`@8(`*R51>k6H<G +U !ALq#vӑ}Ya{Ia.(w}0l[AifTbx+0$d~v\hp :>̕2C + sںu|ecԂIwk{&@t@3:+TPFw9DXkLQZgs[W:03z$CevE ._ǤTi; _ȇ м1,sil;SŖ m= Xq7 K0f>숊8o!=>{bwm[i?+J^]tl0oX_6 "@S{pzPGW٬p⩤؍C3D),0dXQغUbT/He1{=]!£K}5 ~_!cfK=F! uvt!Pc(v%;d 5`14]P}9*[%q]} nEŀ*/.&WZ0z=>^Gxd(Ix㡈kSI,0ߦE[Arƫr@eK̥zœ9pHpEˑ JIB+.ͩ@.`>j={*xz\{m.?7=h< odcV,ژa4o~YNnd lYg6k0…ƪjB\+=p?]F㡠J=Pm׀zQ'p!Uyqp!C_h,7$FL՟fJ88Xv.7uٍ;,9U;q#iaOo+Sxl7q\ p`ZyYCլW:6z?3at3*Ld~9\`JVv[`W Z㫠}2d (hh|g(6} eZK!IrqR2Aw,B|2۟X7O4trؚCMt#@=SX1"@+:W% 82C4Mbqk0D8DI@W:D_UqJK<%ڱ F^tA#!*#Ԟ>oN nAJCj7^6H[G_UgKW`p OJ@g,I"jGf3xiWBW[huoϢa wFCAnw.{K3'%?]S} VDnY.~F!o*6WTEsLW& gq%`骃+-q\n1#{}5d-A}!Z>e\^vB+N@,Lzk@&林\KQ>]l>J2}{;wyV B˰EX`1 ' `c>Tq +f;2(rBޙDV i9_]q>2AC%컪yQz':n{]unl 䀢 \O1[nhL'e ݆%[.aY[KÃ# 1NQfB@!Vt^?O@QDlԪ~MKNj),;K*n*r `J6X;hχ9_72(Z!J[LD(77M#VŻX%qOpyԪ"07갏Uy}ԅƝhm["9q T]9ކsF&YYPDTWٙTUs5e*jz*JF%dʂک~5tz}&-KMXD7q>cewJMXGDT`!C~{bǤ/H}>U\Lb08e4-vzeˬWPUq(8ajY31|@Ă2)k|Y Y‰K+V0t$)W\H7X0 M̠zCÕx1:kB/B=[T;VYs >8Ѐ'ꐽ%ڝ>W?+Գ"P\NMS~8K>6Ako{*wh @dy3NhZFΜz2w7;'ʠw6[Ӧv8fᡠ46pv$ɮlVzUm.kdlV t*$JNT[>@c]¢&<&= "b_+hD|s2*A`qdE:mY-H<`U\/:dYn{#hp} s${XgVzpFH-4ڱw9d. F$=x8@Q&ٽ;s2ىFIF`c0 :}vJ80;BeZLƬZgvtͪi7ˬNʏ.>i;.^RxBPW[D]t.> Me8k ʱ-?@ݞ)qF$dA2 WgtőWV*ߗ[' B!DZ:ܳCq^V}f#],fԋF7N6;2ى-+CK?}VnEw8֯hB o,dnXt1&{4n]OPʋ&@+z6=@:ڃj]i`);lY5k+ňT0DEmϕ)ע8LJ],E~A֜GJSIr\0[a=5X{0jaFDp4M2mtWX\q pυ~[pZy Jyޣǭ`wY*bجyǬfun>ہoy΀IQv;6C!%Şꏲ쨒& TS ُ0F N؆a}d@Ge'buXRF x~25`ccb Ǭ;(4V!Xy~Ÿ. 6ZӠT~Q"ޛr׃$H|H"yeu"HWцvn.Zb:G2 OxeXLs^5;{/;&0T 㤃 3щRZZ[c llV2 (JrsQYBme Z8D,9fS*TyV%܆2/o$T_Z@UY[drm4զ̤Kأ5 وd3[|u0[G2oT8weZzVomp B6R6@$u\+LZ +[銃"e.ׇ|F7e͈ѬO3< :r~Q/<#w%oq*_v%;hG*8ȂCV^@&SӣG( ↴@#ﰣx񔈌Aʖ< Nz{:к-DSNY)CeЋl\Y:9YBYvC/CL֜\|z2d tQZ \d#Gn{uuYc;σ,F 9r\&Tf\V&0 (2gڪ;Ȃ0@GsJ֩1ohh=Ϙ<@S4NX `&`Z, b6INoFj%RpgULh30 8Ej٨ldZOVߟ]h} Z-pN'1v+4 Pe v\})TzNڄ\W);Jkcn2Rzb'\b ݕѤXbRicF82Shj `O3 r5rkP]̲"3E؀D&^B;: @\MOK$3vu0ߎ\4->$ -V,;(brLS[L|o+h-‰2 vTTQT Qn7tW}G a`Ń^^q2eW*>ÆZ&U31ŇoV,w*mGy3䃈Uw9b͕ nݬSpK.qc̦B` ]3/E#?nU5ک$~eIfQ< ,CMxDJ2<-;݁x!'F*Y7D)hTX6i{ԯe?.Xm]бhha0eƣ]S2y7*w塄+FTQl /a$|4XWm?TD`I4`14}La{c*A[,TYnXڲt5pS1wY+rp,JL}R ~6 9ri.Xf}6 K 9&`Qfuh0DC4Y@@b,6'8@U7d]bAdd9?(r( ꪾ}L$b րTf# \G(C "|@ֱARS%R|K?J&UFsXEj쳑Tg+mz(<+S@Xz.3y{,+GU9RYJ֜w ֲq`&y+Ch/< 9X܌I[L~_;p%ջbL޻Hgߍ 8pZUIVSߕ&p}T<1fL k+~(#ʡf|kv wC _=[ z'QuX2(^f,Vt!A9G(ld0ր__b' oT. 9j |E{Ω|M^Q&U`Fµh!e 6-ƛjj碔ez`="YSg6<;DViz'C[8+F=Bͷ[ؤϼƃDD6pA<iVѲ8}ݻU@{G95f] hxE5'%_'!od?O lT10]|QެC&tCu<5]EYt|*\))&4"&Af2` =U^x0W_'-z* !Uɵ#0f_1@߳lZk&TņrnInP8╵!k)wGr6#17̺SdZr * A G* 64ӏ>Z^nCAhXbUxAؽ*" m+ӟYuOVA9/ޡl3{nfC<(A$bc"}uZ W D.w-w;d붎[zirU`Ht=}hcю yuP5̃1T:Ao] $ PO8y~-WmAv󯳢6rP.@_`5:doG'n@Wxݑu7p0eOLXK" nW+f'8-i/YUoCSNPQ;rU ½HdOW7F F+Z\':+ȇdrІ,*ۮ- (n,p 8RA5/N^Tڡ96:;sqڃ5*TgIA?4:F\,go.^5cz-,k$_I64@2WB)V 6@knDzuܻQ`;YvQ( 'fdp=(WiۅV즊G=li'+/`do]j} _uAbFwj7(a eNL?9"dCHmk?=>;Rsfzw4~@d)W< # m06靖kp"gKXw=P^SeQfcK>OX6M4ARy7XZ⛪r70㩿5ڼnTˣ5ơF~AM#j^֨#Sl;Zh–J&A]5z af/~E^TUg֠[)/6EBXI>[; W KpV`,pzq V# {p((`2!7Է{*Ya1MYTu ?2ק^Kjw0+:AL.m^%^>Z[\}jgS%"+MR0zH\l`LZ+[W``7)[~ qg0eKKzPdn P.w7l_{6@@pL@`ׇE2@.ڛ ,;mi[O|&:_5'b1Y0OLY,.j3% \Ý]KlF/T+@n%}YW@ٜu G2<[!YX5Kz.Q]nc{]{Pվ`bClb gfۅ8ưRwFibfT a a)*ڂ=+ s}[`/$b:Tlyݴ8u=Eo>z[04(Yyl^gUX\85HÍ_c̺#GDJZf\X1Dof i~[iGި!lz[^1mfՅ[ c+`̇Q Ci79U."iȾa2má$j C0@ Y(})YQv{l9c>B~b+er%1g+ {8g͖js58v]!klEj8ԛh3tP 7[[Y*0[d&`AEF|{nv ss`ԨvT,TL]6~mp “mfYx 6[؍&\~b|r3=YP[v/XRN@/L6ľsM`[( f_̉ϋfLOtp|(hm33ȰY.-[,L3K1HpUET -b$;>ۜS\0}VVk3I3Z#A?u*S1ՇeD:L+#q9^8RH Vè9v*3&r}n@, fZUd Џ^P\,J ]_!D0xFZj.5Y9[oU5-(IF)C(0 Qf?(uʶrZ:IҔ|צxg-"HLȌ5CcBخ3rWzX NϿGX+ߢeхĹmJǿTՏhݪ,^vxql/'x@-"BR٭b%,;/lK5 GJWqJ ֕/">T& P{b$ VCe{Mϣ7w^A՝eCYT0TBXnxϱԇAC9X>-E: !_߅E"cxّ"pz FC&8TcJ@$հ`T_6Zg8e̾0) K0—@C|a5˩/ЏVnH#Vʺݞ* ݶ3safL T+%\mm%.KQ&1㘧AA lY=RFJwjBtR9~n.#`pj g`ڽ=Qd͹r+FtÑ,Wf=:aoZDBq@2ab] Oz EcC7?TFÀ d6 I _Y/ Ϗ[:+U]`* Ve['eNc@IxϮ&0(E,٥.$Ig!11`'p[ðx5:TY־q{c] WW_WvIS]w™BclVgz~Vbd\ꭲ~?BB| 1UEF`mGeջ2>NVoNH^:K Rodn٣,󭒫 ʋ9^ґF9(pDe݀T2!o(A'~pw| uӭtovk4ڑ L7.Bf@ 짆vP!Z^n2R[G…!,]oD٥rԡ !,22} ֝RFcw"GOVu.\2|twxh9!ңv4@[nZ_7%삛M:.-ٶ#ҩ PJ`Q%k|LT}^nmg{8 $$'EܘJr-Qa ~`Ȫw.v72;4R^Xq`C^9NQ P oXznT:h 2@ }m2/u)ԥMs:و#:K1GئWcf/hҚ,D]Pߟ`U"|ʤ &5l@ָq=5Bx=Z/2l2Kϥ"/̯:KΌRB"p=yn:=kP(De’u8sMl2O@:.ڨ^ji;Mu~@GGN}ʄqCR]; z#`S,M0&\QWdg?LTˑ'!5vCzSdoy\b=:%FzPiKv~5YkOyE ATAƸtSM0L@2Ky 툘;^%׬|5@+nR"d!|西y 8a2M_0@JJߐC` °L&M^ ބ8wK!0*KbZ}swv2#\se ,EcJ_qwgX{`*9Jm46T}tG!Lj'-xX݂*]*G#d'C_Gۢ*%]{ۊ*UkʑфKUm9{mΕm\4_`+Lf ˔j:iƤ&Z#eL2~x]@%+s5mѵ w߉ȀoAA)uDG<>壅u}*`4aj VJ+):&{XSaOj3z*/%j?A/kKg{[1髨?׻Js.,<ճ ư#v{m ǀY^2OVmXYm,sZ` .2$B =;"]'D\2^dq7b!7g_\Jl1Nha?}GF? ﰣܘV * 4\$u-Rk:0=I0t"LY1YrV!4 C;ώ5UwP:*ݺ3Ǥ7!nGZwyljWJ?S2d`׃ ( vءWJqgLLJ LX޸j̀kk1F#{<2>oab3ZP1kw~'xBA 1>EŸLx S7yєE2voPs4).g&iw9;}O C{8 uBv!:~F])Wz70ͬ.M d(rG q @[Ie(,]4d[QGɶ z톅̠Ln4,W(7ly'۸**q"{T ZpwW)kۃ/J 7Ӻg2fF&]k+}ă81Ъ(J;VFGLJ ڄ5Lƾ%Yn]8nAE ;rhXkjnԫ쵟<'(#ނsr@_Zz9qE99@GXAHAmd?Z ۔,BPl*m 5GvLwRaut؊\vVeg|PdD3ͫY1"nMJ"Wu2 9 DKГ@@qQAy gqrBtޖ`ө{1KL* UkB80؂փUc'@Qz y9 l贫a~?`FSd/ĽB3SjlyJ֬*4ē #W q0) Ԏ̫+)W6à' _Kj7;3Rn EYY N 9̽)oǐC7?vub{f@)J!{=L;JUDtz 0 pAM@VLCr#`2dh%[@2 U1f8\%+V-GCJWU|yj }?=Xn[E fw.ZD[6GU ~}Xʂ/ߢ6CvH+bd0N]WۭQ`3/yV i3؏m1c f2ǟ.Ĭ9ALAf DWdHARqmkt?zAc@DQi8LEoU8|¹ RE.TP*b }mL&M6@@ɷ:ump.?uurP"*;;8ޜlepᩣUxس1v 0 iV=&jMPAPαV5Su岞Qx^vr<@V*AV ,zzΪ\>Pd|=m&2.r,2v Z% 4#$2V=VK;>GƼCmxdA f/WG߲>zDEY.f:Tx{ j;%~$>%e3Ȁ B 8*a-T~KѪ ]jD(srK&[gK&h`r$8۝,?W"Cm+#ZQDH'$Z}ս'Yml noO5ٹ*hb;܂WKk (8, :>*l&"#*_\0xJ)mUm%Ok|z˘c@;6*S9k?3BsYC+dcG0 X{zf 8`V+Ru0؛3|>/&&p-ۙT\j BlUv 와 E4^kN,ͮ\H ɼH8.P%ƏƸWwDǡRa$B W ..$w&CD04ч1W%&ZhC% }q)ƽA̝D7Yݔ]lE-{u{pV;Mī1hTZkнieꋎ-߶b"s#gF yGaW_ p Q(+lUՂxE .mOuQoWc3/&O e[zC6la80ҽ.Vz]DPHu XgW<=v3`%L^hng"94־P%/DP ;ma݇j3?!xf2[Q* wS8Q0fv3}NgʴNS7⊛Y}DUtFǺޏ+v@r`=(뫇VԬ $~[q'3Jnu, ug=C4ʳ10>4B55߄ūݭ,9XGAxU#h B)ui鎬T~ӿ6C6Qh:I/G±^zt჆mT^GdLGEap@jzٳ.VтU1 a2ݬ`QzK b2$XKJďWi~zVK8sz~.Ga-?&?P` Kŕ2c U2ݘ\<5m6Z{ި2K6Gj }e.eAfaUQWehm^KP iH>ϰ4Ph-ӈs0gU5=T\* @<؋JEL[;X&sL; ؚA-h]Nd֒X3]R₪S8x~ۍ'2!m\U ,~ ZAƫ U[ոd? (DJ;bufYSTB_-Zwt g3T$s2ZlH;CvftT),e-2Vq@gX FF/¿68.nQc98=܃]L;NU4xׇ 7߼0Pb Ha/lKnKPُ S +#ۚ5 We 6 rX0ST$F@k.^i~c2c=>3>< Vi-Lsg3 V RO B :~qUӅ{PR}XԜ.N/mme9P2t3z<e.ND4.} ϶vn`aצ(L:U /b}>Ah0d=>s1CեMt_>/,YhC:U>VPL7*ڗ4'ݞ pϢ¥,)C+@'Ь##zq> H4BiTϘ_z6o8^24m]ZeyTkX-K\rcUnm&;^䏰aUM8Ah@lф6fUmi1)`٩7FYe؍Vh 7J:SgIwv~va‚{k``Qg i;XaꫳLjЮ?=#hMTh5~ 6 n.%6pi B#Ԩ|{o K`cDM鲘z}O[ aPb% QOxDkn'OKVbj@O\`N*@xHDQ9` `_-=, ~OK2Z",2m6K$h v\jL}<ѡa&RJ=*^ING%m)(*~=6:H]sq^Z$aZD+[l;t P?{PhPWhv`^$rT;]8Pՙ xP(S6vMR-Av4hyZaӉru3xE}TPVEVe N[LU06Z=!ҙ7 Jm""6;W&@'Ldb{gd]CjnŕvVLb[wM: ZǐnǑNydٞM:[#na]AcwkZ6u{߾1atT֙'JTFٵNkXRx"13Ov&yloŚ׍3+ôMyXVXA`n/@AY`69^2"CḮzU8fb|BicHzc2eN!Hoۄ:>5rRIlkX}R4I4ڡ4|BNjD.|fgBelB XijuΠSxDT] ?ǀP0F0'J5\L=JaVYiP|\SKPuLb[x"һBR99~nj$ [MahEtY7@MVŠ 4GEf(לϱ~{y:#fAp$w|JwF'el2)\nua'L"$ɮӽȐ_ʴ;ˣRBH)FN譣i$VԐm>^?kl+g(5FU ʚ6HPitAFLG}.&(\/a7BBwVV71ӣn^w{ɫUU ˶<3CϳgL`-6c,ݨ|ᑈf/|o`D#tYxՒL۶}- OZUa\<\F;.`1H#th Pd3Tw(Y̓9.*h{7cEȪr~7^pp)'fwa6X(_mGaiҹ]yWhbj:};r& \J:(;yPն&.2rڅIE&Xj ◷Grj Ad{t;t;do>Đhjz 7Žxx Xcoϟo\El tLըy74h"`qmëbG޳ꥃ z)lԚ]fc*Zq.3|R/# a&bc260=M,]ЁD`?/kv>DL"ڞ{X^}Ivx43yBi:*K- gū3z2C V SsAHb<ِ,75{fƌko5Πy:-;[] y1* #lʳa#ǙK:x% }AvGW`} ULCQ~JM:Gv U#u%t!lRz87;]L(טHSN0BƋR5ޞQĠu..s*[l66:e]4uۦ]BФK3(ڝR\ITJd8M#3#\álfte"\gehQR͢{DhS*1K4'8 y!>]d 9*|Q~!R]V~<}E iVVWr4XzFM/jzOYGT)4%Cʄe>7 ,ΎP!Ր]֋EZ#>/N^*Ghŋ IG[es5-(8tQ p ܃ j=MUZd2@!kyʓzT 6Z|!3kbpD~gYw\ㅸW"dQ \Je6*hTe쳇rx x :Tם+̄їf\~%^+l:ؤ1b`[٫PYYtKzX}$҆0SC}CBZ3@9x2Basx;vb؁\xD_2 깎^%^zY.'zӝmT]؊0[ ?"%R26[@&Aؔ^zfk[u0hؗӈ1:RS\U`kdEX@wmѵI`8tɰ_2T ҐM\?&rNԆ0c:`u֡KQ!!\*/X% `Eee/(1G^襋4n .}< ȕNmszz*}s}eN%5\{"P )GcR"M@/!fE Cc"Ⓥ{})%r/edQ`d 4^i]Z/,]LslME.U1vmYݩ5 1,ݢ1mtIrAņby7EԪPo"y3s KcHVz  +Tu'\H 4 ^cn;e5wRc0 DkYԞuyxЏoҪƛWVoqc32u1 :z#d \%6`l.r(rbA; }Kߞ]Z.G$#NBƫ_2= Rk(F}Tk->ڮ?9=fY{`7 ڒAcږ-pEP_Y=B[qz9} w)uMEnN컃 ЅYjAAt>!3y)oԞǾuUgAY'<59óc°#=, "x C-j~UvEi) 08/ 3VȍٜAЉ@]Dd}?s6A@~ s<]ϑ:ACQ~V~hUⳈFc̜uP9f4+)\ApY߃Rh3YȦl2cTwTɏKɀE%e8āEelU!&lC œ 񔥻Z^ _F}#Ty7sTo,m ,&Sۡ1+fɐyZ2KrTU\= _ |jKL݃;`!aVFq2j:`OHz #NڇШΔ'fmvd`n0TŰ[4Иs/܀h$@U&aww Td%ynl`<Je.d!?1 AJ&4Q'NL 8##8sުCTei ٞ}lBb¡ ݛWlC(F́+ u0Tf o-[Kg~Q)r;ЂbmZ>PnЧ4tB˖^:݇G]j,̮u(`Tvʆ8(s~j@9RثLºu'Yw2uTk;+Gz90c+5y r{-[fͧzhթ v.5%h1Z\f=F ͕J0D@.cx YՀU h3 M5nC\!_\_+׮FXlvTi&mjx1\ nE꣪e)l#f Bx֤8=FJ;VJ*gGjP^;gzъ37eZ6ifؤ @ ?Bzr&y}Åg-YCПzPd]NMygNEf:/πgam ] *UIYOxC8\%뢭Ș &Q jK`ԅabUqo> K P!4K_8B t܍GK!~zq.vI~LKK,m۞@q+cYztY=[ E43ӠW!וJkUq9bLơ?3⣞k!] @DwNvM~h57&۲8?vWN :nm"~;*eYAhJ{' 6T7j坕ڶ3kkAYKWO&xXs PSps{iRj,M@K`oR=ܕm鋘~cgkkT EgpBޱ-Rm~EPzAXKRCg9W5> VC}_ȮP~xs2x'LnA3W4eg#꘬!tgoD4^67lD;Aqh?vR=j3kPj 6Ac@{z&Гud:l^. .)1dVqʍUڠ)x%ALhثv.۹q^FSa`KҦ i_(ǣW erSp0bOOj whnHH]P/Q4+{s8<ʥ| {P/u^N$!ZߨV4g u6 XU(e-`a 8XW*5KM^ˢc[lpƊ2kanA}D]H?_#!+sy؛_F4QAFjE妿1d;Y,>,rTZRiazZю D@g=0:==9Q/Oc:X R'0 7}=X*o%:pp`1Q-k$cn~ 3؊׆[tIe!Ӽx(-6LPN;ՀRib l40`!ٲWs*ew+ =yP,DO!CN?^| )-鋩xކ F1sЬT0k+2c ,L6 m|xy5< w"Р bPk_2Di|뱏Țmާ:Sx ^ *zv;Km>rwq:2Smenw,b]` UZMl4o7._ g6Z FC b( d܀zs0W1 v%yDG\xQ:j{ͫ䫳:R36xm@qBdŒ&և?g4ʹx .ns7؎ w-Tqcu$|2zd!9+@]-ymZcAՕsbpU'g4,PEF+Xj1{±qZ .?`Ͻ63@"~Q 兿^@SXvR6tJP Tk+.]CJ~+0U 󥠥C!pC@,#TGV48Eu9}f#,U/ OL?./$̒ni1_(eqv|1=Ppv{5ͲL©!O!Er("gD-fFJDA< v6YZ{C*7cbZ6vt9_+wjۊ\8 %jΉq4V|A~©.B,= jU ڀ9śVt Kg}^9p!Ǚ% >BfZe=׌Nv8WH{#Zt߄t ^(#CIk0L"òEQ:ۻ\U\nF$ {WԮycꟖ5l=kK);Z{$ ܢP2 iDNDKJk ;XPݩ JŗhhVP¸4([2(NR L\m9y/zHGS&OC32UЊ Umpy2Vj!Q൉4氤AK`=k[a>" Fiue7D#|q1Z6#ƑU|Ty@0[0L93\>S|bfo`nOVHUwHSlڹI9th.GVZe$]FS{?,ldN:aJ=wC_.g]f )@&eŽ:1z⌈dfb^c|,TRg3R?*P; > $3mnm@%p֥YICta&Z DEażɉ%@mcFS>A.8\3Oy.;3Ǹ <wktvo AQA m =>s F~Ko$N\2[!m.cANNOiyYV*hMxV*B8h4ATc1Op5u\?m;|qfNOmw`} ȡE=폽Xrk*{6#/+5GVzT^gs].u^Szh#w:+h++A2qH㱘IᲔ"L(? FmG}D6Ov -- !e'>JI`9/]Y)\( k`x.0"w*kW-EGܘ.5Ei~WC`@;<2n䤌_Ws2K>{ez {^(g )-ŠCm>& i-JM~);z|PTcgFTeadIy{|`Ъ"Z9,f@^f,>Ql> Jڒ`h4;_P"Cs426?C*4 W e=П6[Ev$gp\Y#n GiGŠF,tfcWO`N_ɀ|Wᰒ]?@8J{C؁猧<˃K"Zz-]7mw}ohr_nr_mFj҃=V8pm]ꆘ hu`? p( |ށOe>p}kh^3.$M5.^J"QwWK%:bv2([d~F`xTV-Qir4bCi1f3 -d}fAMTl<2*1XWAl^,}f%\0hdgȆ ܀Ğ\=LV|H)S50 mNM⥲~M:/.FҼל]@{ig *x43[!΀$u>cH9`Jwt 8Vw+*>籫 ,Ze8!ZoUv&W"CK F 0fVQRez_P%0M,ՕsR%a$=76<2 m̤Erx ՘1 +=9/d9-%aź2wag=Ee^9@{z/rN 7|Xegb!8<(ҲC1}j# zk a#xpuVzBoGy͉cBO=7䊚C@]&)b:md`g e}=Yl5:}3(\Hp'_z& S;)X.q.ٖo~3bkwJ`$sT*#N|gWG<Ŋ=@ϻ/KR/K5[u5u]žQk +7}0}628&43zǶpp}!T,͑9k}-s)ukt3TEC_xM| ҈؊T q5rJ- 6ְJ01P0 J4e3;h[!e-zÞA1E_: vBJ!R1)u<.Pxs/{q osٵ_h2zk/gb^r;3J' /[#LCУ\~ M>fq(ַU}720r.@\ÎkR.Z ka)c` lʀ?h !YZ5@oPz{ʿЊ( w7C yRlfh. Fmז9Fڭ2̿A9RvoOw6]c)pT1-2k\|mF!Us_*ݘLBBOm-طZ_= Вa5,VUfO&=h<2Ha`H.4k3nj+(Tet.QRup#+d+vd0Ovllc|Ԍ0A2&K'osI_wZKe$eA< !QCaӋm"AQO!ISE9ލr4Exm[80c{~)~@vbE[o}`5(Up| s6,6YE&G>z7 MD2egF}¤RxwNB2L{Lh$@ߞwW*4 /=d HmbWt@ԝrܬ=^gyB>X2*%>zdJB8(>+zի겴nZgvl2fϾXa*&e@.ZԾqy-j8l^I Je-01[U/=RZhr3ũZY2udXk )-E}|b zH9>!t.Νz H*+UPֈ +&l8ouM( -acTZwx 6*!iM.'Þ뗲"t5֥XV7"_oX-u.3x5 $YREvKVD -F[܉@^zKqP3l@ĀK?7V<Sp*Q7h2R[N8QeoiIuܳb: 8 yΐ<GslĂqg[6@L^K#٪wCGqBUոϪBƣeP_mSYQ3,踺# F<1k ʸ(CܮU`8ҙc>#f.zHx㕜Wzڳ8)>zx0q(ׅkˡ sm%l|.e5󤹲>AAu"PS7:tz.$`")>UabRa YBRdm<3%3Tš4ٵ=>$B- ,H2csTB}thD(>J2[4^KFL@!D\;8ݖɠ*;WQ(<٬U}aVqU>QT)[/Zsϴס ;y@`w|ҸQ%b.X[UX[d 9lS6 6"37$vP!#gp'А<^Gݹ[bS4P" df %(2Chӝ'ꤓ^.ыs4?{h؃Pcݻ{y_y HzLz-Mנ Ddda@_xUMpî~H$SϬep$ E^Y}̱2~&[zUNz[e蹬_Ń..  Duq)ʊ4 ( />́Q *#zF4L{)P0w"hycXwU saWj^  w?B@P"nX "T]CG2'GNLF: m}]tr!h tPEqj{LX“(.a,DHa;-=2*36~ > ٳ>.ֈKKe~协-F%TecU0n2^נ(ݨHyNbZ3GZ*TT.@WfʢSⴞ垩jcZ>ڎAR!5"{PR0oefPfB.9iz"YA6r;ϜU:y:mEȐ~qGdyem;8cw|* pׇ?KQU_3N( &Tu\w!:q"yvFjQdXheuC^hs<@Wt2m?^3[m@uzQhNюm ! 0qZX{6 Rd0Pj!` mMehL5uK}/,٤,ѥ,(5b*n}؈3}gcؠ~%rD?k*O=]鱘bn=ȒV *n74=zd`4OG};dp(XɮȌ3kWC{nc"_0ȏ/KaQ!Pe[6 VFR Q#Jnk>$s5^\zPXHR!C$B/fsg^#TҀ`< du}9Tf\r XsQ'z2ߣԦYS(Hz݅Whk^k!bض֍^P9a%[1^ޣ YJN*iuFf;b~.ūd(x;VLnCA^vi .[ Ntm0*QêZI[rgbeNrlY1w¦A{?7`Z%qvF"i Oube3d E!\;[WTUy@O8$Y,]]=1hLK%܀#X s5AƥQB.^TELoˁ*ܛiA ݽӪPJIRy#"ҚoE?'8c|T veQ`io?a@m)&[ h.š"l"]8lXF(-чMU.J,3^ժPogƾ8h[$u8ya?jQ6m6y 02l]*=Sl2`~r~xce9m;VPEYw3{kr0XoϿT3^QT4bؠ[h?ю5XU⡒C[-\m Cj*ل} P#kȼ100_k.Fg KͶ~'g+mrq3_޾$k~<2)v}of-:,(4iw`on >O10LܠV@MIO%OͬD<h(Lx?: 3\6j!Rؖ;h(yo k#rJg?zޛ%BSa-?JCL2tW+OS0$wE6.9 6MJrb EZѭ"H?VV^WeB #.r j-d8Wer"L:'hM´v؃#P:H#ށ,3dE2#Ī >/vm1spJacw43֩b/$Jw_6:c3OBF w[kD8yl-x ((i02cJ?1T~9g%߿;#6ek!C:ʽESrnX: >wh <0 a]R=Z|5OЈEmd$Ġ[3l2`ȻmVuIuD=. `y:|C3d \ǃ/ώ{C /f lZ73hZCNo(ʳL.edX38ƭiìJ&k~7~>ü Jlկ :PC&{ r ~Ϙ$O}UԌmN@'t:gSwkI2k5s6SUVzhFi@ID[T'e%/ oY=E~g=Ր`B{FnlB/Oʊm=[%q@gYs`A9&/=Ppk] |_ stYl&#x%P$Ǫ7*ohJ`yvZ!)Leo65QQ P`A}#4٥TF!sYT*S4DF ?r끼T^~.x66"DP ƶ7<Bƨ`i4Uax߮.N0]~fX_ə4US\iSb=^ KMS)fEc#uz1-!2akШ2BBc̈́}[q#>GY㎃x䭴8clW9> pqʐOew`Y nP: }K*{{}oaZi].Q ) *>͐7/2< G\gBZtwe^g=#ɘ6 B`[t=qG1kmwT5|WØ@I!~[d F=yc\*{4(@jҏ ~ko) + pGD3A+A#($Zz#vwbgx1(D`(:Ԭ:gbDˋd =+vVOrǰMc|hqz=5F`0Y«MM}Xl_n  (>xDhDf [2m{2kjA `Ӵ 81gW+g>k(/RͪK,Ph!c"Бv#߅_pt^Pz\&2d4xj;x=ҠdcN^VqV@"`cjkzUYd΂S0^En'#::"vԦp, LJBND+~:, +aX>\ 4}5YB*Q@ìDA(gLmoz4 BvʺX=,(dZ` XDs.Xp_ l :,I}Z3k|DŽ-ßG=ѩꍪnf'x[Z'`1-6oZ^Śu'B~ӳAdUݠʈ{\̂+MՃ n㎘ړ0>o * b3>ۤ0VxmŖ4k! X"9TA?f?h@R)+"5u0F==W}(ɐ'G`ʪݑiS尽w)Sc?7{ 9_re/>/{Dۃh5@e+@l ŶtYzp$l+Std2* r4"m5RMXi`h/Deɣky:-ɑ:}ɚWIfHJ؝%X|mR*׻*jkKkT&DT0IJ\d;F_xd4GmʥV?5|4N~wg `3pLCڎlfk>v1* 3;GpUwގ`EiGnGo&pTu^geXBe<vqAՋ|Xj I1Gt]CbCː3uʤL ;CN'Y oe~{2wź7Bv ژ`YW\̚E-E|d:\5V0xp`dgg`r"W&'{k7U'S/k&.(kJ>1+t~6ZDltA!V :Z~4h\ERXTGYfYYyT U*\C垝VU,rx<\cm:g/ywl 8L!ͱf&b-ulYm8MK{(3lPPU.XRx#(LX~TO- JȢA*_!#>կLGz5t(z͑;å29 t6,T~2F*ü0Ǹnzh82 ˲:V1Gc̈́,7}@a2 D?6[00?탞FmF)UcȪrA,[^g)Kg.AY v=0Ģ ٳa-Kk?$ 9q(H `9˭`D{BbÚGӒNg @ܔ*@'`6;ʜ3LSQ~붢s _FqaT:p`=DDO@ه 1YDIop'R ²{s_^upvOqf{ȳ@:L&D*Jì70¶uhtX[g3^cP*c?`zZ0#'qM+S$?qn,ۡ ~ ;3 P@T٦j3o+}[-jG f/ngּ_7BN@3t^’5QTle@CSUN-$0<nsu-0@Sz+6 |Fu6 |6b ӣt 3`3~w!1,['XzG顔O>sk 4j(/_L0ϸ#J.7<-^Ӌ3o.ۢ.>7g~}*;׳ofӀ(VdP1bod,D/7Hj/e:])Qf7͍b_IdedTOEj+ GL@C4+MLbT "Y23Z*;x}JsOJ:gUx􂊎,8wWXC-W7:j܀WWm&&1L,˵P 7ī s8XIZY:C\+PUЗ˯6o%x}Ueu3o\ B1J=!G~DU~[Mv7|F 'f:$Иб94&м"?\rPF1݇(wߐ%:쉇hƵٖؼo &@$H+q4e.^(? CGp':"\ y@0Xu vaMCo}Qx A53Y2 Aԍ䁰..2).ʶqeJ>;δQ.ŔJ a?cɳFarUd::.N+hu|w<q3}E_Nq߂_o2BmA$IN~wck.W\L fSe7xc$%l5v7c{Ҏ H z4ź !Ò4m1?Y6A*<"j:WB8Z~lz+m;) ݜFd* hlWTheg2Uw.M:e<@C7~! V| -40L, gzY#ԺP9^`8{}|Q^)=@ѿJ3bT |@)X.="W+` :ka4\ @.BWU}ԦThqif˲_(ڬMWߛ?C ybbpVeSb'm-JŢʭn @~tH@-6) 7M|TΖ m/jz倞A%sKPC@J/j9[.cta؄r0uZǂā]дce ѝ]Uc7zm2l[V#%⨟!}^5f*U6/P`)V? Uѽ]Yf:8J "8s|@?Ř8A q=&!{h߭gQ)k ϓma˹eQP~,rK‹WV?> =g|[<E_,CՁ}E֣g9Pu; ?)ʰA@*7S?;u8w%][;<`+1ZPz¤{2?T$%f9b)i2C_cڀ̪,M>gD*qQ%3qw%16ag[|e-I{6*~ʧCum 5cSVKܤ;@8]);֌ؗ.jU1sk>/_у<=qm8Z<0 g*Q61fT! L~O,t<g׌֊&Cu6<^X!RoͼU73^5w<h~eR=u 990;cyqg˺tfd0[<Ʈp@;I߭G( piS(1Q(o6bFX ZW;{ Tj'"ŠĦc1,rRlM mK5^~tԦQ]{VaY^x LumI~=Ã?JVI.=LϡгO.W2(lceB@H0h-M)̍-u}kqiKa DLI U_+rmR=ui78gg,:pU( SM(q3, CބdieM?ǹکA VSC$ #6VʫniOs/k0cyo] 2;![I#İ-aPBXJ " ÇKCjU-g21_!v@Fd[-2Ӟ˯"O0bBpMe'Ϙܒp:c kkW4eҳշqO7Or%0ݨ"Q^{=h⬒K*|F!3cv,dKt ĺ X5ώ=Z]va3Wja4[ᚽ:_78+E$ L!r+eSaV&N )ci,3t?eN㙪Wm8!q;i$ˈdL 3ɨ0>yzO#*IeVZÊOX_G+3+ﱥA@-/_]v\eN:{10謁U&m;L |)Hlk Xo]dl~Yŋ-zTxtn)J#d4^x"T: Z*^5)f *XWo.eL?(QB ! GfL\tg]@4 AnC]?ZFY 3r Vѻ'\H8yxC`hhSxW"*%ͤڻ 񯭧" D`,أəodyjBo.z>v5f/k0L$ã ]0*@tT:UX\,*w.HeFLgW؎ ]׃Kef+DX=5hHV(,XaeX2Xȟ-y={ެCǐqÔs7dSE+A*;Gv@hL7 ,蕩e ^2 jiMikq`CX'H1+ȨpO8G6A |-mZ\A 5j)>Յ1@p= Ǵdfcg1s'(TT#7ו?(A&ܡ׿us ^Ͱfl+1#}PMh@~Cͯ=-5(sSff/`+㹩zq LP7QҞ3C}$6yOOJ+&8mÀhC=E{0=" ` ;Jp f3 m(W2jO`ٲʻ)[a3Ląxeʾeu>._jihH!l }Ri~55XN-]Si g L`uВ 9w]}.(.sg\ Bw/d^~|t_dfӊ<^Սgh&U?U%/],V )ֽaZl7 xZ]EO9uT,.Z;TZޞ *Wms=5Vbng|B4([5s[|Rлa}(*4z$:6M5MD)1!.jAomb  ']Sty"lP(.sAm9U"goAnqAB {L Hs,.z7h ?box>@šu^24 IOaHBVLQ2>T|1WpڼvE[šB|ly7Y9>ٯ".Xs$H 4! 'eybYcJB$h9NY/q+d LQa F`BG{2kVخKa~Xe}ZUً֡aUfk,1";̪@ˁt@_TUƷ4 X̡|2=Tt.R??D>ax۩"]6㛨S&:xI#K ~ؙQ hT,Vǖ`6vH &%zT6/VZy-EeQDdEv %އj?}: te-%bL]hC"}B+ Y H0/C/oҋ|:PIϞ4Z bBUq`۹gjQ |ε7J.O m ߳2z0939B%tZv%!s5dAy\MDmmλ0|:Co;}n+]],P60htt0@u?Em,nLD.5oY}̛gP=q1:}ؖh^&0`EWb *\Hl+k0 5#GQtSUZF.j/!Tq|@i.idT؋FG9kEeN<5*k#ih.NZƗ4i0ݸ\4LUKvV䩴m= #/EpaHUT;.rQlW?0@W=ʭe^l0XbZX,90aLu O2]60 sL*G%g欠KLX ] |-7o0v5Q9*\,Ҁ^ d'6,,z@czzWe]|?k5Vk0;VP!523gY!h,7 R;ڪ{tIfv[H߃"3x{I{T8bD1@11U*t1A+5R<<,|۳F MhL>: *s+"X2 ٩2HNH7׵?,P!$4s[s.&ﰝ3T[Wt$T)*G ;DNs{!o؊3ֱf m|i6f?߬H*Ab׃GcXi};N"]Dz8ԭâ.x٥D$_BuVuo-k\8(ë"2#)݁C'?/Q&zx@z`dH Q OWK1ÕfX 7ۛQͤ nfo:WP}#{Uצ'at$0_'xw64b6 }< RE%0 JDȢiWΌtkQ$gK{߮j0:`fr %ӳddM'I1ǁBT1"R6Wy~ު/u]7DfB)4ւvHܪLq.URC#\+a\)Lڦ"=]g4_i.33ٕojfa 6b2)ݚO 6$R! Q!OJ#խuZoE"KE@CE~߭s0"QeūD@UFN!E}mL9 X ,p#lCxX~ =Vfw .g'D몳əDՙ5i."5c>0{l61yVQ);6 !aelpY-PfhUyZ;x 1h*෿rҁ].5Dfy|X`o,:Chcց3|1Pz5\~fS =YBe~^BwyaO*lYn05uc+nϠpy;XvPZ}#{Spz qbњSK1,^7=Yeqzg@QVFN6Sghc]|U%BiLwwC 9nL h,k&`ׯc.RW|xB]`a/3yw{A:Ky]*~VL0( z,3΁.#؜ї؎ _#i@'o euLgȹ#\a]n[`yz*RSoˆ}s =1% x_*LahkX;˞c2Z:ϳdq;ir_Nw@ @О-+KgiΫʶ-aZ r&>9SԆx"ꃵ Ůെ^kBQu8ڢhqe~ͺB%\fG *d=DpLpMKFŧ T 2s%;LJ aa ]{wk7~~,~XhG==KEo"Jgpj2) =kRQ.1r(5隷]yڭoe RU-<<0JڬSqh6m@96nvB,H|+CWF&U7</sj107U֨ܲ!#%@A9>-́Vz~Xhz=hdHk7>zʟu]m@ȯ/HM V?Dc0P4ЩK˒};Ao֣>vc[ /'KhqqzZCZ)XP:D!x'Gd|/u Oq#/)M: f%=:j3|aYgtސ!5.,@+~DzbO1A+OYM?urgM+.Ƙ;(4d2p+5$ R?T>1CHYʇv*P/؛"Y^ DЋKդhC rrlMCU\ 6]ɆΖhLW|K/Ψeg(/2k^a60&*e缏nMǎF|ԖFo3k]f\1+?@yiU K]ãۭYpa- V0vXo*G8ڼ$k1r4i@ 8M%~m܉?.M^c-%Z2Z+pQ{11A E_rv]>ݛ~ O\w؍}1K=#VvJ0^W_>~Բu3 #*PKD[j=ԥgJEu3\{zpˊKNWi3 j;<}ಳ)2kCe-yK cԞ  |?]"| ԣ%ԧh]0 T}<} Ӫ8`1v :փbĐ( :8sc:%G;,WFo3^3+:@r njl c?4LlQBrE $h}VDH<K<8ԙD@'T0@6^F Nhs? a_6ŷ52k6BYD; 3FB8}mi[%URU_es98vn47n1~=fr\XbSĆ k9leLk0iΥD `EqnlZl >/ڎͅic\a,B.xIPn#@2e|Ui=vAv OǮPqcwId $^BHP')0.Ƭ2sWa 5Ύ2n.܎vno%Q0Q&l?MqV!}EnD+|s-Χ bQ;ٷ aB (BuXcd^?:nyCKaR3|w!VX=Maպ_b+3 dpn/tg=os`RQcZ_!p{)M&%@a &"}V0euS?YpjUHxOƨ/woq2174A_VYHLͯZ@K?úN!>X}A ZF} ֥&׶=Qٺ d4*g IQfϼf}N`Q/ڪ5opǖϗ vAVIޑCIo9;E.{FP<6+U6F!c=,j5d3UlE9*Mr~?(X: ubapmе wن`7%_l1m LTtnX}9=Q]򌡍5][kx.+q@ Ht:;d6;rKZ߷zw_wqi&<  \QW͞yթw3 X_|'U L$3RKF9bP3E,wŠ< h+"#цkwMYӤݜV蔅2. 'hVJL$MRM5Ƀ%.h58 LFmVR:x L1P/4N?;2^'hwVQ7#$\lj {aO? a\3taڴ),uL%*>3EV⁶X ={L<c2 Wj&*Ntvl EU-]vr=kL"Ir+pk\'^šdPUۀv+6 xu{dz.9_&gG @/BUd~J4'MǴCģG.zH"(ٗ?D HAt GѺk+hp;u n|[~rǮ\Y t!de(.Kb6{ 7ML_]`LZ"c A_ZH Tyg^*%֥К3eeF-0 ~gmJR7ta=dӠ>qoz7}w-zӐA0t4&#>{ Xf ` J0 ww|.VcHy1\Eÿj7K|[~o;c( cn<# 8`%xLJuY˹Mŭ-XgV35=`M3U >t1Xa6puv}5Ȋmi|AO(B8Q}梞XqЁ݂Ȥڿd!jPc̙(2>xJٻߪd`3feUfԆ $[H0!uNjw9hI0eLRiUv*yU ̤(ZQތ8Rʲe+&:AJTCG QΗh8c`sTE 33q mAO!dm:ÍPQU)>j\˦l&ۄ^V&Q`ky>PĪĒ @*nJDJmוa;ҕ:zniK!>?gR041yxȝL6m U DCBr2xiP/o,w t T־/LI ipN/c=4Ƈ>8,wx%aܨLf\6(V svi>s= F` $"Qc6$3@@Z%AF--X=>Ԭ2gGE t ++t /٥|DW8FQ e&)vӜ!lvazZahٟ,q_ww`OlDRm9Sfw6s5j+ncu~V^<x52MGBm&% ݈M ېF@<Eskkq^Wq'h<:1t^`Y +ecj ̻4 8<a^S߂(B;S6P?ɼ@H?\Ȅ4Բ&eu -"8VZ]s |aW$R@X%>]za^=~Oyz$ډdրM:ER:3+(am5d}z+UGf3 ѽҗ1}T1SQRC*{*=ǛO~o2.%⻩j`UXUâ^roXL~znc zQ +b*9m /w_2Cg[?҇g:ldVѥW[ө?HPy7IwLwKeMJ[B-o Kc6;vٝz+#w1NWLU <`7i0st<-z=U`+jINA5&-sDQ8 n*zȕJpYZ6]o~7< J-"."x|e`S\&#ϛ+5v$Bڗի~< &a('N95LQcr˛veT6zWA޼dP>j|1k T_ӗJiU+XpNj]qLS}q= -~܁63S1S@Deb 2h%Z U"Lɗp87GVe! *pQm`xNetPKΚ+*D>{@e|Y]y13$T]AM$сͬc*˼'+<~0ް=vg8@͕*un= ld#ȵfk4 ?bv 'v[;>cYYɘy]DVU*Ce U$|u` ںpLe`۳}jbzj!(^'V*| Lb? Z/xt릴 * :?E׷s9Ӗր6MH_1@%K`(1hoOF$;l[bиkAq>E_ږ_ғ@^]zU QOZ]Ȋpsڐ_ lyhAcIa= 2?T+uɶ͹lЉL ; ym@0; &NNVj TA-*^-ʙ. R1upvmc ՛ _P /}y3.YQO*)ۆ]LtHT= 'AZn> G Ӷ9X5=ޟ. CO}A{vf0 P<ᙧDi RZ8(4l뼅a!]ze]ShRqfm`7ZŐ#jCo˺ sgE Y=5W6v`=9h6Sf;vVN`?Žw^؄+]3T>.svFa>YfSvlTa`Ms1ceR*w@KQYZJf$VAr\(R 8TQ-}^V8>zp!*['d,)fOd`\uY  XԿY"2*h l lI23 di.^$- sPwl uNW@*Y=Tbaû92mi߷LI~e!$շ4[,Of;QF@mM'ks_*|plb B)kp,SWg~'\G\6,J[|*ȫ:˺cpMһ{EpB`e`S("DFg$eP1n@VbG#N+ CaA 0LJ溢峰d%u!FP9޼\VEIk}f 氼lv:`PBl(Q9*5$JMD8S3A_k/EruwKo nK@эߧւ%O`շ=PzB[oX k/Clc{9*4!" mv )CE]fQ =)hDȉ]wv嵭)Y{V%,^|bscEtl堼ޘ`";rRSb $z֧\7 t&@'MQ6k yT \H>ۺ\ev@^m,E'5'z=p )K#08O8T圾/pZjVmA!/M^wu O3V -K9ƥX '2rTr. *CoXu[`=6D(^rW_Rj%Ekls\ ѼrMQI..g:{gbaf&h32'@\6[@j n8\X%BhQ`.AN2q;Ҝz,F#1a? Yߡ_Qo z#zXpy `O$ jiXx,"u&#ko>7$fc$z brc8Ơiӊ *.RM< l>*:Il6vϙs^O.vD3,萼~,гTgВZBڎ; Sշ} *{nP89|(v*LC`d9dda93{Q { :#r'V;%}V<≙ 9Eש !blQޢuU/bY±2JN|pO7 U9B7rΞ%6=jȅ!ƁBݚs+V$_P XG׃[I;a;B4ꏪ4`zݲPp{=t]ypۃ*]^I4HMZ 5SD8C.d-A̕PF<6ya-GЉD^ >pMB@UgI&}ey&|lذUoM2B2dQ02 E6J&%,ML!Bo3'kvfa 1X& utBs ԳOk0>z6 #6cؽ?O,zE:/ ѿ-dW&-tmXvȦߍvrƮs`SB7q9 ۚ' 4(TQ=f  2q@sК"ʘ-W!z/:;j;P%y(%|ٮg]*9q0.3p#Kޏ~6+Bl(t=,Qv $*&Jt`G^1Vֹl{S_- ;i;V4OVA7I3뻡}^`,ZcU[I3WUw6s.OH _S{tܐ66`ө<Mw"^ ݴh=3獵FKXKepae (|).1N1E,32m@MWYG`$8[F?]#k9 bpbC\}̈́AС)S^W)3CRD`K9ѹDm ›^n>lJV!(E0¬m 2W u D6N@[W{ueY kȩ#~46KՈ3k:os.vh'mCy9~މ6=J[N4ۖHӅŋi@-a,678GHSPFNgSuN{7sÓY ,l I6cBZmjU=o6f$?o$VqdW X>bDNjWc/{h(k]@1&5pQV<6z 'ae3h,@pӨ0[N5{2". 9 e1F&76\~o>~F8{:!y`^cӛalM_"6%!vجan87_ "6E~DOUgw!"R ]mN(:U+vɈ1]V2bCԲ2I4d#Ǎܶ A˃m1ATǤt(KXzC7A;KfiBxV90Df=`97.R_,3VAPnW-3\8X3%W@jZGRu3rh[dd R$P ;r;-yt+LKg)F+'? Dy]Pd29JZvhv °G|0IT6YQC|竷0+I]G?|)uϐWԼ̦6d\hTFA"lj=t_|!T[*42BlbA vڌJ}iUc?(*/` G5! xٔypT* K L>l5Qee&2` .BD0{zq֨O5!:xs}x2p;ۗ=XjJ,M`ToRLz < &Zokcݾu;Se+^I]vsn'[}3)WJ-Aѻ\۟ta$>LI~F0@->Kz2ֈM `@Ղ> 0*.yx:5 10lB%t^`f5NZt˕P5׈=\^N s2k- /}q$lbDcLݿ, נj~Ӛ!XzWg EKLjR;L\J jG8}\;~i[<655݃YRQbxNx? Tf6svIEi'z[69^Κ;j NdRy/j2 eB)\gb>Z_!)NiN^ "-R8bņ*ЅiӃ AIYX׮п!Fڔ"0# l(kgo{EB 7ª==RMs_W}T2iX/vYY˱qJ7 !Y>;XSVV5JP8`-v&׼ԏefM_pb-l,uQv]E/Ȩ `5 1{cRC,zgF1`,h=Y]63E`T9 [ fylmUkLVv>u$:>CяrZQϠZ jf1o|ځo?Z@{QY(ag4;f\U xi\fk\~ Z ms g)8 w+@[?wو~5)N@?cg6iJZ.^*FW!T .=<+t{SwE7~f‰m;qꨲ" D=Ho}a/\"a0b5賚nḰb$rj8^PMƐ0< ð=.{CǬ[=> }{@D`=PwM38@2?fŨL9rJҰ>vfr&=.K^}P[admPu_WYK\d:YaXTKj2v2u6D!az(R sI a|R]7ޤ1 XVtǴYq谨#I;_YiYM0.3UUьVu%eCE e :`1m}%r3=[8g#$8.)2uk}JnĦg6du: tWpe Put~t\ h5.^f!\Ds.Ku6EyEo.P`P2ɅpSL$+%u-ɎQ)e<9]u1F;<8EpVU`qȴ؀l*rjsw]ԭeʺyPT /tӤZMrd"P&7e9z pK <uq4QR7| =3<كS`8ڵ2dZqQ݅ %g'7J2Kj )`x$ZqRoL7hA c B@7D-#pxY 5p]]VҾh*d`ۛZQUJo1DM:sЗ4`rQdU0V2E_7%f29+lb' S\w(rT,q@D@A CYC5Q u(L%BG3Џ)N@- a]ߑF3I5Xl/ =i22ښ>{Z? UDyJ?yA0 xglՃыrn+#ݮBT+`0 iqe:P]T H'tO@\ &Q)V>e]ћQ- ,pLPźUd1CBj:k#c k-|MO:g(kzE4ʍuZ;juX3wʖ C8q$;x^a:ojmUόSc\.}_&&>UFYΧo,˾@+6>WV#桙/U|(TWH{ָx @<\j.R!osl=v(O9{uH࿬K|lTM `J*":$hS(d~8⊻/j$XYfAV氰(5-;|YNdHYe&ƅd(q X.TDu! K?S%tبi\Ey3OFe)HDgCKә(r\G6=KAc68%R#}2QKDnǣG&A*3=0zp%"Rn>]UUcI+lf1w9WlNL |jaC *?:. tP Yu=d=j0id*=Ty.uj VqowKg$J51ܝNݶ@GEK' ~Vm.h<Ĵ@w@DgOo٠>!`aݯg1P JLbRZXp-fZHVE1K]t=z8?E2[oCVT.<1Iَcgj+vVX3X_)n=m֘dbQ9?"g&{"^2=uQ=SPaCz:1eryu9^({#?l\0఍BR[+/_Q!D>ԁ2p.mvxN8i?\¦7N+4.7bej<^xW |>*0\'ϳABˈX^ͫ}\NW1Ѻ'8t3pB>dcu8M:}#cB{ 6xnkMkS~M82эߏv,-L.CSvG,CTD ,--vEq[v𣣌30=S'e&x<4J˒5aJ<`#0u?/NR|>;4<h/@{x8'o^5FC{Ԝu*0^Ёt&!F| 5@D1X礶v`Xf-ػU&bu!N̠ׯo/)ܗ|vh=Y=f-E&ED8]qv(jXz7H\=@uq"&Dq ?4nD&$ k)ja-E74ouQҏzB!$I7N6-b@6|J E=s3mFdr$ٞU.ƞ1FD֢Y*SK-Ek}M {Ā#<'TcMP4eO_8Hi2aM h1F)نʨ2X@Ӑ\BIxJ ^4ҊG<AA%i"mbtGlWn!fT|]DU^Gܺ+rGk@i:\ڸz4Dvk%dIՖh`w=)jBIHѨH+b5R >BF2?0t2gLn\s-L[fFz@mډr1AA [eΰW8Zx尃Z˦5MP6KQ XDDH0mVQ:!DZX^%M!5~JEmS ?3U/CR9q*fl ]g0E rdwj)a,m^/!Vk484P( P) ''3{k7u.cpͰa(7Yrf>tpL}gJ#F$v$Zy6(Ȝ V2qʌ"A2YelvcT@wXLLt$:ϐwTZ3pAE^ЈЫk-.if(u&6@=YK*&׍҂F[ɹ/۞v݈@\ORC.k9X|[ݓ S673 gҍʴ]bcYsgE޽dE@Pl;vڌn5' 1Vs׆hNs[EcQd!6ͽeDqM8D%ƌU95'&怢gjy)cS%"%B^6́ݸg[no0aIAي ˡ(tn!\k"*7w","ӻ

V;2hB [ŶZ}nc.!>ALKu9뜮?lԫd_^U숬>?:60)Hsf%~WeNQZQxXZnZ*X}BƔ2^!j]ڨLg+]tѡ'fvӭo2+#zd\8+&KBSV/W1!!u[`B @ wxJorble+RS&fJ>G1=lRkf*ҋްB2v<^+WyZ/r{I:wns@a)ޭ#"9qh)˳ p5T[^0ß9bҨ5gqGˤ. B`n.ܞLO~]O t :Tkb͆^Rg͍lW3A5=;GӁC Aւ+ZWG peN!E6$g/ @3-X=LAj볕:=Xe^b΂>˗Zԡh ب6DzgOut5R'|>Q抙*F]EEQ+/E.,w]P@ozg~D>ܯɋm|+UgVU¤uCpnZ+9jRMӟcӍZx56@DRM!Nܦ,BKnrKo=  u&d8I{hF=\C*TBe`'"AQhTq*A2*^(ߠ( 1Qewnb -d$ln/ST<}ˡȓ'w]OZ!FIuaE{MG>kpHH;;=Xuw}].ÄikxeE"$5!;h3ld3+:TD05R&<"ɖgJe.PptɼckۺqwMs:%)JKZW" TF١ۯ_!kWa0/O}(8lES3:6!Y C3n[ߟB⵳3WаwCVn'Rס+ڗl( IQ1eqpR"&=dkm.^uwgluuҵ?>qaVfcGz@cc @-1d ᤎ;by89[a;`|3B/.:BǔV?^6 ccko[czTK0+@5qEjC"AR fTnc/n (+8m d.=XuT Ʌ^seFnw ȣNC [S{B8&r[t0Xcص&1D.gapPT՛ktc X?O=PlD)BI92Y6@ɪv+~?JWu('ZrD5e1AqOj1:|.w7VE,hE<[7[4^|nIz'CcƏWc\9_ZFR&k&~Ɲ5gY'#ȍOHKO.жg}kc =q~rp`=~ f46۹MZG 䀀Á!!mQөks #tw::!;i/S|xy?/cL݇BNLM4sWX) tؕ[FE|(1 +*[hC~L*>y&Z?g`!"3գP'=$?,\KQu]FT k18m&ڸhQ5oɭCa҅( XD :BP8n .Q0#/r'@K]WɐvPd+ڿݧq@Aʒ$pb}x9}~f93C 7ޕb6&=dNvcڛn1wGavpy~4jm)/EL\.xݫ ]Q?}H<&"*c>\xN ̥uBDB 430 Nc_<ل6\ 1F͕0`?@BK88` &gKLQ$dn&fE[ ķE%5/]Yhu>Il[RKJ6DOӬbV 1=g*\0Ĥ مnzt J@0GKEEf*p)\>:h4t#\M]~(io!рӹӖʿq҅׼J4j6 i߱IUk%<in(y4i"Ns@>&挶h`@ u>&ƴd0Ea2~y5W̎8lYvPBl8] 5:0 و"Vjx@&ݲ)v&J*U}PC? H6mh<4q_.6 (9[%}|) d4ɞtj1Ha1QJA%{ȉ/K5Fq6B聃3u: +};oG0CK "[[3AdC&~:z ӤMYnepK]&_dZp1z +|Gt HQMRK)BxfDODypp&xFۚ v<[*BI[mm(چό{lڵiCJ T䝰X#ѳ'Hψ9:@) W*L@uIHkXZLk7X7Fucזϼ)uE{١#`z$p@96r)Uֺ<n."XG9J5he3Sv0WCgbhs6;IDG~ 4`-;̯7 aONڬ cȵ5='1в)XxQV:@Ц h`0*2◞537Ϥt `![i!]@9ro.ӵVt.=SufT@ߏ-m~~.}A f3bN>B$q,Zo:AԐLaheMGP@؁02=)dHѭ8r"QPik8gmQq^C'xvNEi8b{TɌt+%HJu*]\G;%ڨR{]1 僁:c0iӅc{t}tPhN͵ 2vGTfA1.,u:d+5*^ eiVfVȦ42pV1m[Sޑ`5 #㰯SJpbPdӈ<>GM%jC(>f1^۵tAuZmȤ6laE\400PN kLqiéwAMU";Q#n^YFvA*R7\v82muCk  4sy̳G-LjfxgTޙR9 F5HP|­?yh̻5$T_Q!$¸ΊFm"iDﶳSQن+DQVqHKnؽ L3L BÊlf2j-ڭ/&-~dYsuwGTN*O4-Ķr w[(e9bw(GǬk,2*%Y3.lۓcytnwԓg%W#p{q{Ԑfe2Kk-Z/Kϗ` >C+oZ^l00ܼKη",;츸UךR'Q{˅BXrR,\iTfY7KrQ 347pd?#fZ(7m rhH[ ULٳ7>>p/eQ1jsN>B#Z~J%z>˭|:33(QQ=f'hz@h>iSG""jϼHq8u.:iWLXtUןmI&k߳++!!.ZiB :>F/ 10>J!yD"|ͦ㢛MzYMamP[72 w}.v5Px-(A82w5+R-Cj<aϹlqSpNp/NZ]R;93YtU+ ҩ}7"Z|6|'ŀs*jtpH}۵iC^{s mk1A1N;M]CnWB6 5iQXGNիI]m(>c=zm~*cxh'x6yAVΟ&dXB G֗F}u5 p^rriKgAʰA%{PDgAN ߩQx& Bsd9Rve*:u*k-6Ij8`xg|b16C @׷T?^ ʦk2'?Ԙ!UfMfp ']B.h3 ܇zVlB) :?ȳ>za>Z`δ)O`YAP~fd} @NuL;1YN>Ƈ707Vx&8wSS+;YtL8 ឌwC䨜q]k;\zӐ8ة)aa~sc8~YRҪ Jp) o[`gdfpwbpT3OlPhil~*&%`@wV*kh E P9:(+0P8LvE.V]xXRkÿq&` ݎp[U6pM.gMOx,SC('3ESBAO S#44 c# 5*UO ҀV%(nnΕLh/pㄯ0M7_^,^*nE19ZcH3曪k[=Uj,m4m$a1e_MQ\;ur6u=z{hDS+ '*NKp-o0ejk iQ?5x tE5pP;7%` eJym=هrȨ.F|=O֭CӋ:m9e}=OZ^-ra Jt]l8eKb:.!SwG>+c7[U}mO1 Yt#2~Aya 0|<$p0M:jqD@#[gc6rϫ$m<ͻ QC/]l;-+EN lE|x3R hZE}]؏+Xu"&5_w9Iw~ІtTkv)#l*fjf05*0oR翿q95:ΐ |um)܏O*\LV ĴZeMlÆ"-"V,PjoTmN) (2 ݑVÙm,xfK썡NJ|PpQ$|O*=11UWu0]j&-x&4U ߖR9f:l4sOoCKuJWڣ!DKǠ29$/캅K\y~'>mK-NG5"PK+& q fq!e;\E?{-EE!AXxW{I1xilEtC>ÐSvڕ{t>۩#ų!N-qa59Tb`Ϗ )?fl Z( !-?Vt&V`EY˝Gy-_LXLE>hڑq.B^;LD&S /]ϰ>wX_+҃r܍Qx*±b RG}!JGk4[P3|}7',wUyX]=;ƟIS Po| .Ĵ촳=6T~(J(6uNVb&j"AvtN6g*ښ;fV a=jܽ+HP0bT[PzO IX0gϦGȳM)mXˆMHgg p]/bzؿL8>2K<~nՆdw[z}کFuSa-V_=:;+cӀK/ ZhF K*lz&'mp!,-@Fn!* @Ky]x0BigV(8%Mr%|? \ͅGa#nz}\jwfv`ժMǢnTnʾ6 3E/^oҒ3g4И/^OeJJ{2rbQJqS#L#V!9rz e?2*j2VbwPw.qxbbu{ml?K w5[z، +Xl ;_ 5~| ^1QeD0+LFJ}R'o$zRou';\(BM @4 i$ND7nNB"tݸ tpQQojܺI^ yBI+'9aGj{^ٮ Tv!EǸ -34־e;7'pP6Pg *]PѼ %h$}A)'6CƁi d}je3DWA;%4r2Gg4Ü\yFJzXjcw0= )7#mSRʓsia ā+Ǒ6QeG֮.+̰ <@5).~fJosX)D@tu2 uL6)Д(z\#1&݈;fi+b8h_24Ȱ]Ϡ6ia3:<A]ۏGs)@t RY,"74kg[Vv `k㯿ČB+s8à2 XrjBLx/My"ET^/̵8& 77{OotͅZ :mD'xXu ͋B/z(`aB,z\_MQGG8 ԨWR=#5*k[X`iu,iܞ r o2ؖ'߷횻ݱr?rU L3ayBAnA0ͤۧUWМ#0f_z@F7=pȵGU@/d qFFߎE82$ư#R;1=9T6R /*&u֞*8'AJs l68CPpgTK X5Y`D9S{`qA,mQNy8ȁwf =`(95#ӊ%8%Fu dN! -A cKjre k6`nnoY)4>n; ! tIde,x'PYzPMTsT6UII`=4d?͠V#MEP9LC|Q1]e.3I?P'S9AYc`Q+!w-JP9t 1<Mܪ+cҢ,3GSeR-ޞwʩa5dAd.h7`39( [Ȝ?<O4wʉGksS~I!aFNP0DN X$0DETg6m - 7KP(Q ,)lvmD06#M祇3|;:h94sQyxD 0GyjksDޝUX6d*I: [rE<& w1N "7CoDRh~{jw -"=ԏڞGlHO̷U(LbTGȦ$M5tu:3:.$" J|ib+Ș(6 !_1F;7`\M_7B*{'~{ 7m^2=S(:⃣u6 A}4GQnQ1B۾ˇ6p'^n7r]{ ADfS` ;s}`& "$TZrTivi5xF|xCqkz'K]fD_Znh4ޝ?GR_qqV8dotWq{9.)CJ_; lP} j*8ѽ#j9g Kz$X̍ x,n`x) 5j@ICJ!"23Ů.ObJ{(e"ϊ@KxB4hZN Y)gYNB'YMP۱GȞG6?eAp F=*<.Y5E8`% n&TDec<옝F/m w2I3]+0TD';xtYm]y1YP6̑s(!dP*]SX39.^J)n=C-7PU"MY^%>Y8ccV1A 12u6ӏǶ"]YHq4wB>Nz!'Xq ɂ%@UhwTۃVauEInH.aդis=mWuNi36X4 #ӴʆК87nzm})H |\>O>`S(`a{/0;x!2^RsCIXډ6 M^^,b۝gV[]2Bn%&sx\`Oi-^$Ob:+mr'3'm_i(mxp5ք+l,(w`s^۔5av) 0:kd'loGfOe==S :Ԝ`qP3zδeYR(tcuE>AM[>謦waˊa`aen¦h)z::INWl2ĥo#[:az,=SY~gp}CR %%Fhx06F&@e@f ~D+OKCr08BHQߺ-R6?roeBj-GCyfU!]qT?aeIENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/chevron@27.png0000644000015600001650000000306012700370701024327 0ustar jenkinsjenkinsPNG  IHDRD}>0tEXtSoftwareAdobe ImageReadyqe<$iTXtXML:com.adobe.xmp ́IDATxKHQǿkWmQ.\hֺa06F^D). aٻ  PEz@4[7z\?f.wKRAw%)$`7y(RXb7 ZJyF)(C|^EJ  JzqAcu8-ԶkVϔvC %IDATxba``pf ~M F*  ewLx6IENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/bubble_shadow@8.sci0000644000015600001650000000025412700370701025376 0ustar jenkinsjenkinsborder.top: 10 border.bottom: 11 border.left: 12 border.right: 11 horizontalTileMode: BorderImage.Stretch verticalTileMode: BorderImage.Stretch source: bubble_shadow@8.png ./src/Ubuntu/Components/Themes/Ambiance/artwork/ScrollbarRightIdle@8.png0000644000015600001650000000160012700370701026317 0ustar jenkinsjenkinsPNG  IHDR'gAMA abKGD pHYs  tIME  j9IDATH͕nE{`a#bďd &"E(faS[> '`@Ga' A$Aq;]U,zm$X;#ZU=sԩ*f8'zb9st9@^YYP[۶F>p<&ɗ7o? sJTN=NbN %qQQxԘH&4inZqӵxc10ɇD!(fDQŋs? 3 @'Ry[bhR"f8yݭ?׻(yccKxWX]]%A2e4W:7'AIPYTÃ}>\hJ) Wo/z4)ЕB"'=K 4ДJ4STu`8d)gCN~oyo#&]a8l.s H.f*jwIMo?*`9R 7\_Sb0xP'7Æ!L3lhk*"H)iKXE07סj¬Rzխ_yy 3fvpttT^oD^^~c|8Z}"*.c @p "(bmI1sФ4!{s';@R"*t)E3V UaU 㽽;|}kss׾MqO>>&\Jmh4nLg`|3L5'=4IENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/ScrollbarRightPressed@8.png0000644000015600001650000000157112700370701027056 0ustar jenkinsjenkinsPNG  IHDR'gAMA abKGD pHYs  tIME 2IDATH͕Ok^EϽhU4I-A ,;7~mDX ZPixcIhwf$ܧÅ3<9#"W;fv mPacgg p ́,[?xJ. H! .J0QD3%AT*5a;nn~5`<~8;\TsajQUU5Rq;'^]iQ,_QWV}~v~ccm߿>^㽕e5P7&G6V@fHQ͈n7ų!"BDAUXZZpuu]u1scJi$ DHi;rR.`Sb)eT3]Q9٬F7Vyx:c>&r),d2x`xιA"(Ѧ* YHQp(V+M%'T 'FPQL}߳cft}@up^UUPs`-f -gf2$gMo__(zuV搨jz8UGE*pQ$d£ߟP"kf33ܛ6N0߼V}PuRPw}/-fFD͡-ͽ7?PM{=|Qk#'pJi> Ó0RJuxKW:לLH7D6IENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/toolbar_dropshadow@20.png0000644000015600001650000000542612700370701026560 0ustar jenkinsjenkinsPNG  IHDR pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FAIDATxb?57Xm սBmCYhLRl 3 dus!U  f-IENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/PageHeaderBaseDividerBottom@18.png0000644000015600001650000000164412700370701030145 0ustar jenkinsjenkinsPNG  IHDRetEXtSoftwareAdobe ImageReadyqe<$iTXtXML:com.adobe.xmp IDATxb@GX_/IENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/bubble_arrow@8.png0000644000015600001650000000053312700370701025251 0ustar jenkinsjenkinsPNG  IHDRׅ'bKGD pHYs  tIME ,2؄܏tEXtCommentCreated with GIMPWIDATӍ `?#-©%^' B'Vi9}D?"ws _Uձ)Eٶ=B\,;[e"`^qEaL`#y_T0Mӓ+`&XI8XHP`,xOnlK!]$Դ?/VIENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/chevron_down@30.png0000644000015600001650000000315512700370701025355 0ustar jenkinsjenkinsPNG  IHDR<<:rtEXtSoftwareAdobe ImageReadyqe<$iTXtXML:com.adobe.xmp CIDATx[MQ r{P. /$yq\RL:e%"/F!2QH31j/oc33pk{o}kx^.E~^ ]m&Kl6{إb1 *d{I3t6#٩z8e,Za\3Tzhh(p {綯J?p"0W%@ y0^,54XCF V`|i:Ry]A;gk3+OstsPynjM3_*r-tauPҔ wtBOW-S>]+:|>cñ򢢢?<0 麾6HBTȄ`+uPw;0+o=H"x911񦽽}$KACL&T)U@ pȶk6$&ڰMPJNa~VUU-,,niZ[[[[tyyEN ۂ:RѲ`pGڝ`0xAAA #H{ggg4V" 2V5lZ )(ʉ >UU166<==8)GBTHegC1T I0,e ~Z6#1MtD:+ }(;U}m]!iV ~!S*دr$SKFȞad.3k$W@SYR䰀9au_3N5LIENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/ScrollbarTopIdle@8.png0000644000015600001650000000320312700370701026005 0ustar jenkinsjenkinsPNG  IHDR#z;9tEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp V(IDATxڄUMo1miPXVTJ BO(79;PUڨ!dl3c{4m6[9>>tz İxgwū7LExiF=zG1 CEQy{e)0L3 2 j-nS2CFTly)P}Kw%œs2,0x!yCgZuʁCF鵲/x5w 0+J^4M7là4흝BjGNѰ?u r(vRK@ҟD 6&s,2UB$tpK Rx"[Ds2RBMj[CwR-[™ҷWJBGfCaev ip&0TU," P(tPXȊ5gPPVAU*=dyK92_4tffT4>wd>NQjtei[͚sw6ӏgآ*9UMctRsؓ\#O!( W-kRkѸ.u wkW. 0_1AvI3GPKL=uIPC! VU Tcw?[fe|N7=*IENDB`./src/Ubuntu/Components/Themes/Ambiance/artwork/ScrollbarTopPressed@8.png0000644000015600001650000000320512700370701026537 0ustar jenkinsjenkinsPNG  IHDR#z;9tEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp A| IDATxڄUN@]ېr JRVjՇh4Wq.מ*qcΠV $ޝ욄'7?lKVx>RJ5y97A_i N nq8~Ӌ"]'0y>o_Cj^AZSf6:h6lF$v7LF9vG6}ejBqՔdfWWEI (yZJF,Z$cCT:0F>W6s8!ƅ쳭*$v-nj5OM: oȋ*za6³ҩxxŋH1՛[9XʦEkl-x;_-Rr} %fW tdЀكr bM+q M$FnYqA\K 3r]C=[%}\7 OJ@tr`H`#H8 R=wVQROv䘗s=>Qʭ:ff%l+Z AH[A&Y%n^R7 = ZݶÅ`֑h3(;w\)Jkm74O. */ import QtQuick 2.4 import Ubuntu.Components 1.2 // frame // FIXME: stabilize API Item { id: visuals // style properties // FIXME: needs type checking in themes to define the proper type to be used // if color type is used, alpha value gets lost property color color: (styledItem.focus || styledItem.highlighted) ? Theme.palette.selected.fieldText : Theme.palette.normal.fieldText property color selectedTextColor: Theme.palette.selected.foregroundText property color selectionColor: Theme.palette.selected.foreground /*! Background fill color */ property color backgroundColor: (styledItem.focus || styledItem.highlighted) ? Theme.palette.selected.field : Theme.palette.normal.field property color errorColor: UbuntuColors.orange /*! Spacing between the frame and the text editor area */ property real frameSpacing: units.gu(1) // Obsolete property alias overlaySpacing: visuals.frameSpacing // style body anchors.fill: parent objectName: "textarea_style" z: -1 /*! Text input background */ property Component background: UbuntuShape { property bool error: (styledItem.hasOwnProperty("errorHighlight") && styledItem.errorHighlight && !styledItem.acceptableInput) onErrorChanged: (error) ? visuals.errorColor : visuals.backgroundColor; color: visuals.backgroundColor; anchors.fill: parent visible: !styledItem.readOnly } Loader { id: backgroundLoader sourceComponent: background anchors.fill: parent } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/PopoverForegroundStyle.qml0000644000015600001650000000216612700370701025742 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 BubbleShape { property alias contentItem: content target: styledItem.target direction: styledItem.direction clipContent: styledItem.clipContent square: styledItem.square onShowCompleted: styledItem.showCompleted() onHideCompleted: styledItem.hideCompleted() Item { id: content anchors.fill: parent Connections { target: styledItem onShow: show() onHide: hide() } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/SwitchStyle.qml0000644000015600001650000001730012700370701023512 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: switchStyle /*! The padding between the thumb and the outside border of the switch. */ property real thumbPadding: units.gu(0.33) /*! The padding between the icon and the border of the thumb. */ property real iconPadding: thumbPadding implicitWidth: units.gu(6) implicitHeight: units.gu(3) opacity: styledItem.enabled ? 1.0 : 0.5 LayoutMirroring.enabled: false LayoutMirroring.childrenInherit: true /*! The background color of the switch. */ property color backgroundColor: Theme.palette.normal.base /*! The background color of the thumb when the switch is checked. */ property color checkedThumbColor: UbuntuColors.green /*! The background color of the thumb when the switch is not checked. */ property color uncheckedThumbColor: Qt.rgba(0, 0, 0, 0.2) /*! The foreground color of the icon that is currently selected. */ property color selectedIconColor: Theme.palette.normal.foregroundText /*! The color of the icon that is not currently selected. */ property color unselectedIconColor: Theme.palette.normal.backgroundText /*! The source of the selected icon when the switch is checked. */ property url checkedIconSource: "image://theme/tick" /*! The source of the selected icon when the switch is not checked. */ property url uncheckedIconSource: "image://theme/close" UbuntuShape { id: background anchors.fill: parent color: switchStyle.backgroundColor clip: true UbuntuShape { id: thumb states: [ State { name: "checked" when: styledItem.checked PropertyChanges { target: thumb x: rightThumbPosition.x color: switchStyle.checkedThumbColor } }, State { name: "unchecked" when: !styledItem.checked PropertyChanges { target: thumb x: leftThumbPosition.x color: switchStyle.uncheckedThumbColor } } ] transitions: [ // Avoid animations on width changes (during initialization) // by explicitly setting from and to for the Transitions. Transition { from: "unchecked" to: "checked" UbuntuNumberAnimation { target: thumb properties: "x" duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } ColorAnimation { target: thumb properties: "color" duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } }, Transition { from: "checked" to: "unchecked" UbuntuNumberAnimation { target: thumb properties: "x" duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } ColorAnimation { target: thumb properties: "color" duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } } ] width: (background.width - switchStyle.thumbPadding * 3.0) / 2.0 anchors { top: parent.top bottom: parent.bottom topMargin: switchStyle.thumbPadding bottomMargin: switchStyle.thumbPadding } property real iconSize: Math.min(width, height) - 2*switchStyle.iconPadding PartialColorize { anchors { verticalCenter: parent.verticalCenter right: parent.left rightMargin: switchStyle.iconPadding + switchStyle.thumbPadding } rightColor: switchStyle.unselectedIconColor source: Image { source: switchStyle.uncheckedIconSource sourceSize { width: thumb.iconSize height: thumb.iconSize } } } PartialColorize { anchors { verticalCenter: parent.verticalCenter left: parent.right leftMargin: switchStyle.iconPadding + switchStyle.thumbPadding } rightColor: switchStyle.unselectedIconColor source: Image { source: switchStyle.checkedIconSource sourceSize { width: thumb.iconSize height: thumb.iconSize } } } } Item { id: leftThumbPosition anchors { left: parent.left top: parent.top leftMargin: switchStyle.thumbPadding topMargin: switchStyle.thumbPadding } height: thumb.height width: thumb.width PartialColorize { anchors.centerIn: parent source: Image { source: switchStyle.uncheckedIconSource sourceSize { width: thumb.iconSize height: thumb.iconSize } } progress: MathUtils.clamp((thumb.x - parent.x - x) / width, 0.0, 1.0) leftColor: "transparent" rightColor: switchStyle.selectedIconColor } } Item { id: rightThumbPosition anchors { right: parent.right top: parent.top rightMargin: switchStyle.thumbPadding topMargin: switchStyle.thumbPadding } height: thumb.height width: thumb.width PartialColorize { anchors.centerIn: parent source: Image { source: switchStyle.checkedIconSource sourceSize { width: thumb.iconSize height: thumb.iconSize } } progress: MathUtils.clamp((thumb.x + thumb.width - parent.x - x) / width, 0.0, 1.0) leftColor: switchStyle.selectedIconColor rightColor: "transparent" } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/ActivityIndicatorStyle.qml0000644000015600001650000000222112700370701025676 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Image { id: container anchors.fill: parent smooth: true visible: styledItem.running fillMode: Image.PreserveAspectFit horizontalAlignment: Image.AlignHCenter verticalAlignment: Image.AlignVCenter source: Qt.resolvedUrl("../artwork/spinner.png") RotationAnimator on rotation { running: styledItem.running from: 0 to: 360 loops: Animation.Infinite duration: UbuntuAnimation.SleepyDuration } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/HeaderStyle.qml0000644000015600001650000000742112700370701023444 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: headerStyle /*! The height of the headercontents, which is the full height of the header minus the separators shown at the bottom of it. */ property real contentHeight: units.gu(7.5) /*! The source of the image that separates the header from the contents of a \l MainView. The separator will be drawn over the contents. */ property url separatorSource: Qt.resolvedUrl("../artwork/PageHeaderBaseDividerLight.sci") /*! The source of an additional image attached to the bottom of the separator. The contents of the \l MainView will be drawn on top of the separator bottom image. */ property url separatorBottomSource: Qt.resolvedUrl("../artwork/PageHeaderBaseDividerBottom.png") property int fontWeight: Font.Light property string fontSize: "x-large" property color textColor: Theme.palette.selected.backgroundText property real textLeftMargin: units.gu(2) implicitHeight: headerStyle.contentHeight + separator.height + separatorBottom.height /*! \internal Tabs needs to call sync of the TabBar */ property TabBar __tabBar: tabBarLoader.sourceComponent ? tabBarLoader.item : null BorderImage { id: separator anchors { bottom: parent.bottom left: parent.left right: parent.right } source: headerStyle.separatorSource } Image { id: separatorBottom anchors { top: separator.bottom left: parent.left right: parent.right } source: headerStyle.separatorBottomSource } Item { id: foreground anchors { left: parent.left right: parent.right top: parent.top } height: headerStyle.contentHeight Label { LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft anchors { left: parent.left verticalCenter: parent.verticalCenter leftMargin: headerStyle.textLeftMargin } text: styledItem.title font.weight: headerStyle.fontWeight visible: !styledItem.tabsModel && !styledItem.contents fontSize: headerStyle.fontSize color: headerStyle.textColor } Binding { target: styledItem.contents property: "anchors.fill" value: foreground when: styledItem.contents } Binding { target: styledItem.contents property: "parent" value: foreground when: styledItem.contents } Loader { id: tabBarLoader sourceComponent: styledItem.tabsModel && !styledItem.contents ? tabBarComponent : null anchors.fill: parent } Component { id: tabBarComponent TabBar { id: tabBar anchors.fill: parent model: styledItem.tabsModel animate: styledItem.animate } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/HighlightMagnifier.qml0000644000015600001650000000403312700370701024760 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 ShaderEffect { id: magnifier property ShaderEffectSource source property real scaleFactor: 1.2 // Everything in the sourceItem that is not transparent will be made this color // in the output, but the transparency of the input is respected. property color outputColor: "red" // Specify the region of the sourceRect that must be enlarged as // x, y, width, height in texture coordinates. (0, 0, 1, 1) is full sourceRect. property rect texCoordRange: Qt.rect(0.0, 0.0, 1.0, 1.0); vertexShader: " uniform highp vec4 texCoordRange; attribute highp vec4 qt_Vertex; attribute highp vec2 qt_MultiTexCoord0; uniform highp mat4 qt_Matrix; uniform highp float scaleFactor; varying highp vec2 qt_TexCoord0; void main() { vec2 texCoord = vec2(0.5 - 1.0 / (2.0 * scaleFactor)) + qt_MultiTexCoord0 / vec2(scaleFactor); qt_TexCoord0 = texCoordRange.xy + texCoord*texCoordRange.zw; gl_Position = qt_Matrix * qt_Vertex; }" fragmentShader: " uniform lowp float qt_Opacity; varying highp vec2 qt_TexCoord0; uniform sampler2D source; uniform highp vec4 outputColor; void main() { lowp vec4 tex = texture2D(source, qt_TexCoord0); gl_FragColor = vec4(outputColor.rgb, outputColor.a*tex.a) * qt_Opacity; }" } ./src/Ubuntu/Components/Themes/Ambiance/1.2/PageHeadStyle.qml0000644000015600001650000006033312700370701023713 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.Popups 1.0 import Ubuntu.Components.ListItems 1.0 as ListItem import Ubuntu.Components.Styles 1.2 as Style Style.PageHeadStyle { id: headerStyle objectName: "PageHeadStyle" // used in unit tests contentHeight: units.gu(7) fontWeight: Font.Light fontSize: "x-large" textLeftMargin: units.gu(2) maximumNumberOfActions: 3 /*! The color of the buttons in the header. */ property color buttonColor: styledItem.config.foregroundColor /*! The color of the title text. */ property color titleColor: styledItem.config.foregroundColor /*! The background color of the tabs panel and the actions overflow panel. */ property color panelBackgroundColor: styledItem.panelColor /*! The background color of the tapped item in the panel. */ property color panelHighlightColor: Theme.palette.selected.background /*! The foreground color (icon and text) of actions in the panel. */ property color panelForegroundColor: Theme.palette.selected.backgroundText /*! The text color of unselected sections and the section divider. */ property color sectionColor: Theme.palette.selected.backgroundText /*! The text color of the selected section. */ property color selectedSectionColor: UbuntuColors.orange /*! The background color of the pressed section. */ property color sectionHighlightColor: Theme.palette.selected.background implicitHeight: headerStyle.contentHeight + divider.height // FIXME: Workaround to get sectionsRepeater.count in autopilot tests, // see also FIXME in AppHeader where this property is used. property alias __sections_repeater_for_autopilot: sectionsRepeater // Used by unit tests and autopilot tests to wait for animations to finish readonly property bool animating: headerStyle.state == "OUT" || leftAnchor.anchors.leftMargin < 0 // for Unity8 // FIXME: Remove this property when we introduce a header preset that does not // have a separator. property alias __separator_visible: divider.visible StyledItem { id: divider anchors { bottom: parent.bottom left: parent.left right: parent.right } height: sectionsRow.visible ? units.gu(3) : units.gu(2) // separatorSource and separatorBottomSource are needed for the deprecated // HeadSeparatorImageStyle. property url separatorSource: headerStyle.separatorSource property url separatorBottomSource: headerStyle.separatorBottomSource // backgroundColor is used in the new HeadDividerStyle property color backgroundColor: styledItem.dividerColor style: Theme.createStyleComponent("HeadDividerStyle.qml", divider) property PageHeadSections sections: styledItem.config.sections Row { id: sectionsRow anchors.centerIn: parent width: childrenRect.width height: parent.height enabled: divider.sections.enabled visible: divider.sections.model !== undefined opacity: enabled ? 1.0 : 0.5 Repeater { id: sectionsRepeater model: divider.sections.model objectName: "page_head_sections_repeater" AbstractButton { id: sectionButton anchors.verticalCenter: parent ? parent.verticalCenter : undefined objectName: "section_button_" + index enabled: sectionsRow.enabled width: label.width + units.gu(4) height: sectionsRow.height + units.gu(2) property bool selected: index === divider.sections.selectedIndex onClicked: divider.sections.selectedIndex = index; Rectangle { visible: parent.pressed anchors { verticalCenter: parent.verticalCenter left: parent.left right: parent.right rightMargin: verticalDividerLine.width } height: sectionsRow.height color: headerStyle.sectionHighlightColor } Label { id: label text: modelData fontSize: "small" anchors.centerIn: sectionButton horizontalAlignment: Text.AlignHCenter color: sectionButton.selected ? headerStyle.selectedSectionColor : headerStyle.sectionColor } // vertical divider line Rectangle { id: verticalDividerLine anchors { verticalCenter: parent.verticalCenter right: parent.right } height: units.dp(10) width: units.dp(1) visible: index < sectionsRepeater.model.length - 1 color: headerStyle.sectionColor opacity: 0.2 } } } } } states: [ State { name: "IN" PropertyChanges { target: allContents opacity: 1.0 } }, State { name: "OUT" PropertyChanges { target: allContents opacity: 0.0 } } ] function animateOut() { state = "OUT"; } function animateIn() { state = "IN"; } signal animateOutFinished() signal animateInFinished() transitions: [ Transition { id: transitionOut from: "IN" to: "OUT" SequentialAnimation { ParallelAnimation { UbuntuNumberAnimation { target: allContents property: "opacity" from: 1.0 to: 0.0 } UbuntuNumberAnimation { target: leftAnchor properties: "anchors.leftMargin" from: 0.0 to: -units.gu(5) } UbuntuNumberAnimation { target: rightAnchor properties: "anchors.rightMargin" from: 0 to: -units.gu(5) } } ScriptAction { script: headerStyle.animateOutFinished() } } }, Transition { id: transitionIn from: "OUT" to: "IN" SequentialAnimation { ParallelAnimation { UbuntuNumberAnimation { target: allContents property: "opacity" from: 0.0 to: 1.0 } UbuntuNumberAnimation { target: leftAnchor properties: "anchors.leftMargin" from: -units.gu(5) to: 0 } UbuntuNumberAnimation { target: rightAnchor properties: "anchors.rightMargin" from: -units.gu(5) to: 0 } } ScriptAction { script: headerStyle.animateInFinished() } } } ] Item { id: allContents anchors.fill: parent Item { id: leftAnchor anchors { top: parent.top bottom: parent.bottom left: parent.left leftMargin: 0 } width: 0 } Item { id: rightAnchor anchors { top: parent.top bottom: parent.bottom right: parent.right rightMargin: 0 } width: 0 } Item { id: leftButtonContainer anchors { left: leftAnchor.right top: parent.top leftMargin: width > 0 ? units.gu(1) : 0 } width: childrenRect.width height: headerStyle.contentHeight PageHeadButton { id: customBackButton objectName: "customBackButton" action: styledItem.config.backAction visible: null !== styledItem.config.backAction && styledItem.config.backAction.visible color: styledItem.config.foregroundColor } PageHeadButton { id: backButton objectName: "backButton" iconName: "back" visible: styledItem.pageStack !== null && styledItem.pageStack !== undefined && styledItem.pageStack.depth > 1 && !styledItem.config.backAction text: "back" color: styledItem.config.foregroundColor onTriggered: { styledItem.pageStack.pop(); } } PageHeadButton { id: tabsButton objectName: "tabsButton" iconName: "navigation-menu" visible: styledItem.tabsModel !== null && styledItem.tabsModel !== undefined && !backButton.visible && !customBackButton.visible text: visible ? styledItem.tabsModel.count + " tabs" : "" color: headerStyle.buttonColor onTriggered: PopupUtils.open(tabsPopoverComponent, tabsButton) Component { id: tabsPopoverComponent OverflowPanel { id: tabsPopover objectName: "tabsPopover" callerMargin: -units.gu(1) + units.dp(4) contentWidth: units.gu(20) Binding { target: tabsPopover.__foreground.__styleInstance property: "color" value: headerStyle.panelBackgroundColor when: tabsPopover.__foreground && tabsPopover.__foreground.__styleInstance } Column { anchors { left: parent.left top: parent.top right: parent.right } Repeater { model: styledItem.tabsModel AbstractButton { objectName: "tabButton" + index onClicked: { styledItem.tabsModel.selectedIndex = index; tabsPopover.hide(); } implicitHeight: units.gu(6) + bottomDividerLine.height width: parent ? parent.width : units.gu(31) Rectangle { visible: parent.pressed anchors { left: parent.left right: parent.right top: parent.top } height: parent.height - bottomDividerLine.height color: headerStyle.panelHighlightColor } Label { anchors { verticalCenter: parent.verticalCenter verticalCenterOffset: units.dp(-1) left: parent.left leftMargin: units.gu(2) right: parent.right } fontSize: "medium" elide: Text.ElideRight text: tab.title // FIXME: only "title" doesn't work with i18n.tr(). Why not? color: headerStyle.panelForegroundColor } ListItem.ThinDivider { id: bottomDividerLine anchors.bottom: parent.bottom visible: index < styledItem.tabsModel.count - 1 } } } } } } } } Item { id: foreground anchors { left: leftButtonContainer.right top: parent.top // don't keep a margin if there is already a button with spacing leftMargin: leftButtonContainer.width > 0 ? 0 : headerStyle.textLeftMargin } width: parent.width - anchors.leftMargin - leftButtonContainer.anchors.leftMargin - leftButtonContainer.width - actionsContainer.anchors.rightMargin - actionsContainer.width height: headerStyle.contentHeight Label { objectName: "header_title_label" LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft visible: !contentsContainer.visible && styledItem.config.preset === "" anchors { left: parent.left right: parent.right verticalCenter: parent.verticalCenter } text: styledItem.title font.weight: headerStyle.fontWeight fontSize: headerStyle.fontSize color: headerStyle.titleColor elide: Text.ElideRight } Item { // This Item is used to make the custom header item invisible // when styledItem.contents is unset and its parent is not updated // when the bindings below is no longer active id: contentsContainer anchors.fill: parent visible: styledItem.contents || styledItem.config.contents } Binding { target: styledItem.contents property: "anchors.fill" value: contentsContainer when: styledItem.contents } Binding { target: styledItem.contents property: "parent" value: contentsContainer when: styledItem.contents } Binding { target: styledItem.config.contents property: "parent" value: contentsContainer when: styledItem.config.contents && !styledItem.contents } } Row { id: actionsContainer property var visibleActions: getVisibleActions(styledItem.config.actions) function getVisibleActions(actions) { var visibleActionList = []; for (var i in actions) { var action = actions[i]; if (action && action.hasOwnProperty("visible") && action.visible) { visibleActionList.push(action); } } return visibleActionList; } QtObject { id: numberOfSlots property int requested: actionsContainer.visibleActions.length property int left: tabsButton.visible || backButton.visible || customBackButton.visible ? 1 : 0 property int right: headerStyle.maximumNumberOfActions - left property int overflow: actionsOverflowButton.visible ? 1 : 0 property int used: Math.min(right - overflow, requested) } anchors { top: parent.top right: rightAnchor.left rightMargin: actionsContainer.width > 0 ? units.gu(1) : 0 } width: childrenRect.width height: headerStyle.contentHeight Repeater { model: numberOfSlots.used PageHeadButton { id: actionButton objectName: action.objectName + "_header_button" action: actionsContainer.visibleActions[index] color: headerStyle.buttonColor state: styledItem.config.preset === "select" ? "IconAndLabel" : "" } } PageHeadButton { id: actionsOverflowButton objectName: "actions_overflow_button" visible: numberOfSlots.requested > numberOfSlots.right // Ensure resetting of X when this button is not visible to avoid // miscalculation of actionsContainer.width. Fixes bug #1408481. onVisibleChanged: if (!visible) x = 0 iconName: "contextual-menu" color: headerStyle.buttonColor height: actionsContainer.height onTriggered: PopupUtils.open(actionsOverflowPopoverComponent, actionsOverflowButton) Component { id: actionsOverflowPopoverComponent OverflowPanel { id: actionsOverflowPopover objectName: "actions_overflow_popover" callerMargin: -units.gu(1) + units.dp(4) contentWidth: units.gu(20) Binding { target: actionsOverflowPopover.__foreground.__styleInstance property: "color" value: headerStyle.panelBackgroundColor when: actionsOverflowPopover.__foreground && actionsOverflowPopover.__foreground.__styleInstance } // Ensure the popover closes when actions change and // the list item below may be destroyed before its // onClicked is executed. See bug // https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1326963 Connections { target: styledItem.config onActionsChanged: { actionsOverflowPopover.hide(); } } Connections { target: styledItem onConfigChanged: { actionsOverflowPopover.hide(); } } Column { anchors { left: parent.left top: parent.top right: parent.right } Repeater { id: overflowRepeater model: numberOfSlots.requested - numberOfSlots.used AbstractButton { action: actionsContainer.visibleActions[numberOfSlots.used + index] objectName: action.objectName + "_header_overflow_button" onClicked: actionsOverflowPopover.hide() implicitHeight: units.gu(6) + bottomDividerLine.height width: parent ? parent.width : units.gu(31) Rectangle { visible: parent.pressed anchors { left: parent.left right: parent.right top: parent.top } height: parent.height - bottomDividerLine.height color: headerStyle.panelHighlightColor } Icon { id: actionIcon source: action.iconSource color: headerStyle.panelForegroundColor anchors { verticalCenter: parent.verticalCenter verticalCenterOffset: units.dp(-1) left: parent.left leftMargin: units.gu(2) } width: units.gu(2) height: units.gu(2) opacity: action.enabled ? 1.0 : 0.5 } Label { anchors { verticalCenter: parent.verticalCenter verticalCenterOffset: units.dp(-1) left: actionIcon.right leftMargin: units.gu(2) right: parent.right } fontSize: "small" elide: Text.ElideRight text: action.text color: headerStyle.panelForegroundColor opacity: action.enabled ? 1.0 : 0.5 } ListItem.ThinDivider { id: bottomDividerLine anchors.bottom: parent.bottom visible: index !== overflowRepeater.count - 1 } } } } } } } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/TabBarStyle.qml0000644000015600001650000003640012700370701023406 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: tabBarStyle // used to detect when the user is interacting with the tab bar by pressing it // or dragging the tab bar buttons. readonly property bool pressed: mouseArea.interacting // styling properties, public API property color headerTextColor: Theme.palette.normal.backgroundText property color headerTextSelectedColor: Theme.palette.selected.backgroundText // Don't start transitions because of updates to selectionMode before styledItem is completed. // This fixes bug #1246792: "Disable tabs scrolling animations at startup" property bool animate: false Binding { target: tabBarStyle property: "animate" when: styledItem.width > 0 value: styledItem.animate } property int headerTextFadeDuration: animate ? 350 : 0 property url indicatorImageSource: Qt.resolvedUrl("../artwork/chevron.png") property string headerFontSize: "x-large" property int headerTextStyle: Text.Normal property color headerTextStyleColor: Theme.palette.normal.backgroundText property int headerFontWeight: Font.Light property real headerTextLeftMargin: units.gu(2) property real headerTextRightMargin: units.gu(2) property real headerTextBottomMargin: units.gu(2) property real buttonPositioningVelocity: animate ? 1.0 : -1 // The time of inactivity before leaving selection mode automatically property int deactivateTime: 5000 /* The function assures the visuals stay on the selected tab. This can be called by the stack components holding the tabs (i.e. Tabs, ListView, etc) and only when the changes happen on the list element values, which is not reported automaytically through ListModel changes. */ function sync() { buttonView.selectButton(styledItem.model.selectedIndex); } property var tabsModel : styledItem ? styledItem.model : null Connections { target: styledItem onSelectionModeChanged: { if (!styledItem.selectionMode) { buttonView.selectButton(styledItem.model.selectedIndex); } } } Connections { target: styledItem.model onSelectedIndexChanged: buttonView.selectButton(styledItem.model.selectedIndex) } /* Prevent events that are not accepted by tab buttons or mouseArea below from passing through the TabBar. */ MouseArea { anchors.fill: parent onReleased: { mouseArea.enteringSelectionMode = false; } } Component { id: tabButtonRow Row { id: theRow anchors { top: parent.top bottom: parent.bottom } width: childrenRect.width property int rowNumber: modelData Component.onCompleted: { if (rowNumber === 0) { buttonView.buttonRow1 = theRow; } else { buttonView.buttonRow2 = theRow; } } Repeater { id: repeater model: tabsModel AbstractButton { id: button anchors { top: parent ? parent.top : undefined bottom: parent ? parent.bottom : undefined } width: text.paintedWidth + text.anchors.leftMargin + text.anchors.rightMargin // When the tab bar is in selection mode, show both buttons corresponing to // the tab index as selected, but when it is not in selection mode only one // to avoid seeing fading animations of the unselected button when switching // tabs from outside the tab bar. property bool selected: (styledItem.selectionMode && buttonView.needsScrolling) ? styledItem.model.selectedIndex === index : buttonView.selectedButtonIndex === button.buttonIndex property real offset: theRow.rowNumber + 1 - button.x / theRow.width; property int buttonIndex: index + theRow.rowNumber*repeater.count // Use opacity 0 to hide instead of setting visibility to false in order to // make fading work well, and not to mess up width/offset computations opacity: isVisible() ? 1.0 : 0.0 function isVisible() { if (selected) return true; if (!styledItem.selectionMode) return false; if (buttonView.needsScrolling) return true; // When we don't need scrolling, we want to avoid showing a button that is fading // while sliding in from the right side when a new button was selected var numTabs = tabsModel.count; var minimum = buttonView.selectedButtonIndex; var maximum = buttonView.selectedButtonIndex + numTabs - 1; if (MathUtils.clamp(buttonIndex, minimum, maximum) === buttonIndex) return true; // working modulus numTabs: if (buttonIndex < buttonView.selectedButtonIndex - numTabs) return true; return false; } Behavior on opacity { NumberAnimation { duration: headerTextFadeDuration easing.type: Easing.InOutQuad } } Image { id: indicatorImage source: indicatorImageSource anchors { bottom: parent.bottom bottomMargin: headerTextBottomMargin } x: button.width - width // FIXME: temporary hack for the chevron's height to match the font size height: 0.82*sourceSize.height // The indicator image must be visible after the selected tab button, when the // tab bar is not in selection mode, or after the "last" button (starting with // the selected one), when the tab bar is in selection mode. property bool isLastAfterSelected: index === (styledItem.model.selectedIndex === 0 ? repeater.count-1 : styledItem.model.selectedIndex - 1) opacity: (styledItem.selectionMode ? isLastAfterSelected : selected) ? 1 : 0 Behavior on opacity { NumberAnimation { duration: headerTextFadeDuration easing.type: Easing.InOutQuad } } } Label { id: text color: selected ? headerTextSelectedColor : headerTextColor Behavior on color { ColorAnimation { duration: headerTextFadeDuration easing.type: Easing.InOutQuad } } anchors { left: parent.left leftMargin: headerTextLeftMargin rightMargin: headerTextRightMargin baseline: parent.bottom baselineOffset: -headerTextBottomMargin } text: (model.hasOwnProperty("tab") && tab.hasOwnProperty("title")) ? tab.title : title fontSize: headerFontSize font.weight: headerFontWeight style: headerTextStyle styleColor: headerTextStyleColor } onClicked: { if (mouseArea.enteringSelectionMode) { mouseArea.enteringSelectionMode = false; } else if (opacity > 0.0) { styledItem.model.selectedIndex = index; if (!styledItem.alwaysSelectionMode) { styledItem.selectionMode = false; } button.select(); } } onPressedChanged: { // Catch release after a press with a delay that is too // long to make it a click, but don't unset interacting when // the user starts dragging. In that case it will be unset in // buttonView.onDragEnded. if (!pressed && !buttonView.dragging) { // unset interacting which was set in mouseArea.onPressed mouseArea.interacting = false; } } // Select this button function select() { buttonView.selectedButtonIndex = button.buttonIndex; buttonView.updateOffset(button.offset); } } } } } /*! Used by autopilot tests to determine when an animation finishes moving. \internal */ readonly property alias animating: offsetAnimation.running PathView { id: buttonView anchors { top: parent.top bottom: parent.bottom left: parent.left } width: needsScrolling ? parent.width : buttonRowWidth // set to the width of one tabButtonRow in Component.onCompleted. property real buttonRowWidth: buttonRow1 ? buttonRow1.width : 0 // set by the delegate when the components are completed. property Row buttonRow1 property Row buttonRow2 // Track which button was last clicked property int selectedButtonIndex: -1 delegate: tabButtonRow model: 2 // The second buttonRow shows the buttons that disappear on the left property bool needsScrolling: buttonRowWidth > parent.width interactive: needsScrolling clip: needsScrolling highlightRangeMode: PathView.NoHighlightRange offset: 0 path: Path { startX: -buttonView.buttonRowWidth/2 PathLine { x: buttonView.buttonRowWidth*1.5 } } // x - y (mod a), for (x - y) <= a function cyclicDistance(x, y, a) { var r = x - y; return Math.min(Math.abs(r), Math.abs(r - a)); } // Select the closest of the two buttons that represent the given tab index function selectButton(tabIndex) { if (!tabsModel || tabIndex < 0 || tabIndex >= tabsModel.count) return; if (buttonView.buttonRow1 && buttonView.buttonRow2) { var b1 = buttonView.buttonRow1.children[tabIndex]; var b2 = buttonView.buttonRow2.children[tabIndex]; // find the button with the nearest offset var d1 = cyclicDistance(b1.offset, buttonView.offset, 2); var d2 = cyclicDistance(b2.offset, buttonView.offset, 2); if (d1 < d2) { b1.select(); } else { b2.select(); } } } function updateOffset(newOffset) { if (!newOffset) return; // do not update the offset when its value is NaN if (offset - newOffset < -1) newOffset = newOffset - 2; offset = newOffset; } Behavior on offset { SmoothedAnimation { id: offsetAnimation velocity: buttonPositioningVelocity easing.type: Easing.InOutQuad } } onDragEnded: { // unset interacting which was set in mouseArea.onPressed mouseArea.interacting = false; mouseArea.enteringSelectionMode = false; } Timer { id: idleTimer interval: tabBarStyle.deactivateTime running: styledItem.selectionMode && !styledItem.alwaysSelectionMode onTriggered: styledItem.selectionMode = false function conditionalRestartOrStop() { if (Qt.application.active && styledItem.selectionMode && !styledItem.alwaysSelectionMode && !mouseArea.interacting) { idleTimer.restart(); } else { idleTimer.stop(); } } } // disable the timer when the application is not active and reset // it when the application is resumed. Connections { target: Qt.application onActiveChanged: idleTimer.conditionalRestartOrStop() } Connections { target: styledItem onSelectionModeChanged: idleTimer.conditionalRestartOrStop() } } MouseArea { // a tabBar not in selection mode can be put in selection mode by pressing id: mouseArea anchors.fill: parent // set in onPressed, and unset in button.onPressedChanged or buttonView.onDragEnded // because after not accepting the mouse, the released event will go to // the buttonView or individual buttons. property bool interacting: false onInteractingChanged: idleTimer.conditionalRestartOrStop() // When pressing to enter selection mode, a release should not be interpreted // as a click on a button to select a new tab. property bool enteringSelectionMode: false // This MouseArea is always enabled, even when the tab bar is in selection mode, // so that press events are detected and tabBarStyle.pressed is updated. onPressed: { mouseArea.interacting = true; if (!styledItem.selectionMode) { mouseArea.enteringSelectionMode = true; } styledItem.selectionMode = true; mouse.accepted = false; } } Component.onCompleted: { tabBarStyle.sync(); } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/TextFieldStyle.qml0000644000015600001650000000135712700370701024146 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 TextAreaStyle { objectName: "textfield_style" frameSpacing: units.gu(0.5) } ./src/Ubuntu/Components/Themes/Ambiance/1.2/DialerHandStyle.qml0000644000015600001650000000377612700370701024260 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { // style API property alias handPointer: pointer function handPreset(index, property) { switch (property) { case "width" : return (index === 0) ? units.gu(0.8) : units.gu(0.5); case "height": return (index === 0) ? dialer.handSpace /2 : (index === 2) ? dialer.handSpace + units.gu(1.5) : dialer.handSpace - units.gu(1.5); case "z": return (index === 2) ? -1 : 0; case "visible": case "draggable": return true; case "toCenterItem": return false; default: return undefined; } } // style anchors.fill: parent transformOrigin: Item.Center Rectangle { id: pointer x: (parent.width - width) / 2 y: styledItem.dialer.handSpace - (styledItem.hand.toCenterItem ? 0 : styledItem.hand.height) width: styledItem.hand.width height: styledItem.hand.height radius: units.gu(1) color: styledItem.hand.visible ? Theme.palette.normal.baseText : "#00000000" antialiasing: true } Behavior on rotation { enabled: !styledItem.hand.draggable RotationAnimation { direction: RotationAnimation.Shortest } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/PageHeadButton.qml0000644000015600001650000000400412700370701024057 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 AbstractButton { id: button property real iconWidth: units.gu(2.5) property real iconHeight: iconWidth width: visible ? units.gu(5) : 0 height: parent ? parent.height : undefined property alias color: icon.color Rectangle { visible: button.pressed anchors.fill: parent color: Theme.palette.selected.background } Icon { id: icon anchors { centerIn: parent } // prevent trying to render the icon with an invalid source // when the button is invisible by setting width and height to 0 width: visible ? button.iconWidth : 0 height: visible ? button.iconHeight : 0 source: button.iconSource color: Qt.rgba(0, 0, 0, 0) opacity: button.enabled ? 1.0 : 0.3 } Component { id: labelComponent Label { id: label objectName: button.objectName + "_label" color: button.color opacity: button.enabled ? 1.0 : 0.3 text: button.text fontSize: "xx-small" } } Loader { anchors { top: icon.bottom topMargin: units.gu(0.5) horizontalCenter: parent.horizontalCenter } sourceComponent: button.state === "IconAndLabel" ? labelComponent : null } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/PartialColorize.qml0000644000015600001650000000336712700370701024343 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 ShaderEffect { id: partialColorize implicitWidth: source.implicitWidth implicitHeight: source.implicitHeight visible: source != null && source.visible property Item sourceItem property var source: ShaderEffectSource { hideSource: true sourceItem: partialColorize.sourceItem visible: sourceItem != null } property color leftColor property color rightColor property real progress property bool mirror: false property string texCoord: mirror ? "1.0 - qt_TexCoord0.x" : "qt_TexCoord0.x" fragmentShader: " varying highp vec2 qt_TexCoord0; uniform sampler2D source; uniform lowp vec4 leftColor; uniform lowp vec4 rightColor; uniform lowp float progress; uniform lowp float qt_Opacity; void main() { lowp vec4 sourceColor = texture2D(source, qt_TexCoord0); lowp vec4 newColor = mix(leftColor, rightColor, step(progress, " + texCoord + ")); gl_FragColor = newColor * sourceColor.a * qt_Opacity; }" } ./src/Ubuntu/Components/Themes/Ambiance/1.2/HeadDividerStyle.qml0000644000015600001650000000314712700370701024425 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 Item { id: dividerStyle property color color: styledItem.backgroundColor // Do not make the following two colors part of the style API as they may be deprecated soon. property color topColor: Qt.darker(color, 1.1) property color bottomColor: Qt.lighter(color, 1.2) Rectangle { anchors.fill: parent color: dividerStyle.color gradient: Gradient { // top shadow GradientStop { position: 0.02 color: dividerStyle.topColor } // middle (background) GradientStop { position: 0.05 color: dividerStyle.color } GradientStop { position: 0.95 color: dividerStyle.color } // bottom highlight GradientStop { position: 0.98 color: dividerStyle.bottomColor } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/DatePickerStyle.qml0000644000015600001650000001141212700370701024262 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 Item { id: control // style properties /*! Specifies the background color */ property color backgroundColor: "#0A000000" /*! Background color for highlight. */ property color highlightBackgroundColor: "#ffffffff" /*! Highlight color. */ property color highlightColor: UbuntuColors.orange /*! Scale of the highlight item */ property real highlightScaleFactor: 1.2 /*! Thickness of the highlight component */ property real highlightThickness: units.gu(5) /*! The content holder exposed to the Picker so tumbler list can be reparented to it. */ property alias tumblerHolder: content /*! The property holds the separator to be shown between date and time units */ property string unitSeparator: "" property Item view: Item {} property ListModel pickerModels: ListModel{} anchors.fill: parent // frame UbuntuShape { anchors.fill: parent radius: "medium" image: shapeSource } ShaderEffectSource { id: shapeSource sourceItem: background hideSource: true // FIXME: visible: false prevents rendering so make it a nearly // transparent 1x1 pixel instead opacity: 0.01 width: 1 height: 1 } Rectangle { id: background anchors.fill: parent MouseArea { anchors.fill: parent } // background color: backgroundColor Item { id: content anchors.fill: parent } // highlight Rectangle { id: highlightItem y: (content.height - control.highlightThickness) / 2 anchors { left: content.left right: content.right } height: control.highlightThickness color: highlightBackgroundColor } ThinDivider { anchors { left: content.left right: content.right bottom: highlightItem.top } } ThinDivider { anchors { left: content.left right: content.right top: highlightItem.bottom } } ShaderEffectSource { id: effectSource visible: false sourceItem: view property real sourceRectMultiplier: 2.0 // XXX: This works because the parent of magnifier is the same as sourceItem // in this case. Otherwise coordinate transformations will be needed. sourceRect: Qt.rect(highlightItem.x, highlightItem.y, highlightItem.width, highlightItem.height) textureSize: Qt.size(highlightItem.width*sourceRectMultiplier, highlightItem.height*sourceRectMultiplier) } Row { id: magnifierRow anchors { top: highlightItem.top bottom: highlightItem.bottom horizontalCenter: highlightItem.horizontalCenter } Repeater { model: pickerModels HighlightMagnifier { anchors { top: magnifierRow.top bottom: magnifierRow.bottom } width: pickerModel.pickerWidth scaleFactor: control.highlightScaleFactor outputColor: control.highlightColor source: effectSource texCoordRange: Qt.rect((x - source.sourceRect.x) / source.sourceRect.width, 0.0, width / source.sourceRect.width, 1.0); Label { text: (index < (pickerModels.count - 1)) ? unitSeparator : "" anchors { right: parent.right verticalCenter: parent.verticalCenter } } } } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/ButtonStyle.qml0000644000015600001650000001517512700370701023534 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: buttonStyle property var button: styledItem property real minimumWidth: units.gu(10) property real horizontalPadding: units.gu(1) // FIXME: Add this color to the palette property color defaultColor: "#b2b2b2" property font defaultFont: Qt.font({family: "Ubuntu", pixelSize: FontUtils.sizeToPixels("medium")}) property Gradient defaultGradient property real buttonFaceOffset: 0 property bool stroke: button.hasOwnProperty("strokeColor") && button.strokeColor != Qt.rgba(0.0, 0.0, 0.0, 0.0) /*! The property overrides the button's default background with an item. This item can be used by derived styles to reuse the ButtonStyle and override the default coloured background with an image or any other drawing. The default value is null. */ property Item backgroundSource: null width: button.width height: button.height implicitWidth: Math.max(minimumWidth, foreground.implicitWidth + 2*horizontalPadding) implicitHeight: units.gu(4) LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft LayoutMirroring.childrenInherit: true /*! \internal */ // Color properties in a JS ternary operator don't work as expected in // QML because it overwrites alpha values with 1. A workaround is to use // Qt.rgba(). For more information, see // https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1197802 and // https://bugreports.qt-project.org/browse/QTBUG-32238. function __colorHack(color) { return Qt.rgba(color.r, color.g, color.b, color.a); } /* The proxy is necessary because Gradient.stops and GradientStop.color are non-NOTIFYable properties. They cannot be written to so it is fine but the proxy avoids the warnings. */ property QtObject gradientProxy: gradientProxyObject QtObject { id: gradientProxyObject property color topColor property color bottomColor function updateGradient() { if (button.gradient) { topColor = button.gradient.stops[0].color; bottomColor = button.gradient.stops[1].color; } } Component.onCompleted: { updateGradient(); button.gradientChanged.connect(updateGradient); } } // Use the gradient if it is defined and the color has not been set manually // or the gradient has been set manually property bool isGradient: button.gradient && (button.color == defaultColor || button.gradient != defaultGradient) Image { id: strokeBorder anchors.fill: parent anchors.margins: -units.gu(0.5) // FIXME: this PNG is way too big (462x108) and do not scale properly // ie. the corners are visually incorrect at most sizes source: stroke ? Qt.resolvedUrl("../artwork/stroke_button.png") : "" visible: false cache: false asynchronous: true } ShaderEffect { id: colorizedImage anchors.fill: parent visible: stroke && strokeBorder.status == Image.Ready property Item source: visible ? strokeBorder : null property color keyColorOut: stroke ? strokeColor : Qt.rgba(0.0, 0.0, 0.0, 0.0) property color keyColorIn: Qt.rgba(1.0, 1.0, 1.0, 1.0) property real threshold: 1.0 fragmentShader: " varying highp vec2 qt_TexCoord0; uniform sampler2D source; uniform highp vec4 keyColorOut; uniform highp vec4 keyColorIn; uniform lowp float threshold; uniform lowp float qt_Opacity; void main() { lowp vec4 sourceColor = texture2D(source, qt_TexCoord0); gl_FragColor = mix(vec4(keyColorOut.rgb, 1.0) * sourceColor.a, sourceColor, step(threshold, distance(sourceColor.rgb / sourceColor.a, keyColorIn.rgb))) * qt_Opacity; }" } UbuntuShape { id: background anchors.fill: parent borderSource: "radius_idle.sci" visible: stroke ? false : ((color.a != 0.0) || backgroundSource) image: backgroundSource color: stroke ? "" : (backgroundSource ? "#00000000" : (isGradient ? __colorHack(gradientProxy.topColor) : __colorHack(button.color))) opacity: styledItem.enabled ? 1.0 : 0.6 gradientColor: stroke ? "" : (backgroundSource ? "#00000000" : (isGradient ? __colorHack(gradientProxy.bottomColor) : __colorHack(button.color))) } UbuntuShape { id: backgroundPressed anchors.fill: parent color: stroke ? strokeColor : background.color gradientColor: stroke ? strokeColor : background.gradientColor borderSource: "radius_pressed.sci" opacity: button.pressed ? 1.0 : 0.0 Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration easing.type: Easing.Linear } } visible: stroke || background.visible } ButtonForeground { id: foreground width: parent.width - 2*horizontalPadding anchors { centerIn: parent horizontalCenterOffset: buttonFaceOffset } text: button.text /* Pick either a clear or dark text color depending on the luminance of the background color to maintain good contrast (works in most cases) */ textColor: ColorUtils.luminance(button.color) <= 0.85 && !(stroke && !pressed) ? "#FFFFFF" : "#888888" iconSource: button.iconSource iconPosition: button.iconPosition iconSize: units.gu(3) font: button.font spacing: horizontalPadding transformOrigin: Item.Top scale: button.pressed ? 0.98 : 1.0 Behavior on scale { NumberAnimation { duration: UbuntuAnimation.SnapDuration easing.type: Easing.Linear } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/DeprecatedToolbarStyle.qml0000644000015600001650000000251212700370701025633 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: visuals // styling properties property color color: Theme.palette.normal.overlay anchors.fill: parent Rectangle { id: background anchors.fill: parent color: visuals.color } Image { id: dropshadow anchors { left: parent.left right: parent.right bottom: background.top } source: Qt.resolvedUrl("../artwork/toolbar_dropshadow.png") opacity: styledItem.opened || styledItem.animating ? 0.5 : 0.0 Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/Palette.qml0000644000015600001650000000274412700370701022634 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.Themes 0.1 Palette { normal: PaletteValues { background: "#EDEDED" backgroundText: "#81888888" base: Qt.rgba(0, 0, 0, 0.1) baseText: UbuntuColors.lightGrey foreground: UbuntuColors.lightGrey foregroundText: "#FFFFFF" overlay: "#FDFDFD" overlayText: UbuntuColors.lightGrey field: "#FAFAFA" fieldText: UbuntuColors.darkGrey } selected: PaletteValues { background: Qt.rgba(0, 0, 0, 0.05) backgroundText: UbuntuColors.darkGrey selection: foreground // unused foreground: Qt.rgba(UbuntuColors.blue.r, UbuntuColors.blue.g, UbuntuColors.blue.b, 0.2) foregroundText: UbuntuColors.darkGrey field: "#FFFFFF" fieldText: UbuntuColors.darkGrey } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/ListItemStyle.qml0000644000015600001650000003757012700370701024016 0ustar jenkinsjenkins/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components.Styles 1.2 as Styles import Ubuntu.Components 1.2 Styles.ListItemStyle { id: listItemStyle /* * Take over the ListItem's index context property as repeater used in panel * overrides the property. */ readonly property int listItemIndex: (typeof index !== "undefined") ? index : internals.childIndex() /* * Coloring properties */ property color leadingPanelColor: UbuntuColors.red property color trailingPanelColor: "white" property color leadingForegroundColor: "white" property color trailingForegroundColor: theme.palette.normal.foreground // anchoring anchors { // do not anchor fill fill: undefined top: parent ? parent.top : undefined bottom: parent ? parent.bottom : undefined bottomMargin: styledItem.divider.visible ? styledItem.divider.height : 0 left: styledItem.contentItem.left leftMargin: -styledItem.contentItem.anchors.leftMargin right: styledItem.contentItem.right rightMargin: -styledItem.contentItem.anchors.rightMargin } LayoutMirroring.childrenInherit: true // leading/trailing panels Component { id: panelComponent Rectangle { id: panel objectName: "ListItemPanel" + (leading ? "Leading" : "Trailing") // add 0.5 GUs to the panel size so we get 2GU default margin on the first action readonly property real panelWidth: actionsRow.width + units.gu(0.5) color: leading ? leadingPanelColor : trailingPanelColor anchors.fill: parent readonly property ListItemActions itemActions: leading ? styledItem.leadingActions : styledItem.trailingActions Row { id: actionsRow anchors { left: leading ? undefined : parent.left right: leading ? parent.right : undefined leftMargin: leading ? 0 : units.gu(0.5) rightMargin: leading ? units.gu(0.5) : 0 top: parent.top bottom: parent.bottom } readonly property real maxItemWidth: parent.width / itemActions.actions.length readonly property real minItemWidth: units.gu(5) // 2GU icon + 2* 1.5GU margin Repeater { model: itemActions.actions AbstractButton { id: actionButton action: modelData enabled: action.enabled opacity: action.enabled ? 1.0 : 0.5 width: MathUtils.clamp(delegateLoader.item ? delegateLoader.item.width : 0, actionsRow.minItemWidth, actionsRow.maxItemWidth) anchors { top: parent ? parent.top : undefined bottom: parent ? parent.bottom : undefined } function trigger() { internals.selectedAction = modelData; listItemStyle.rebound(); } Rectangle { anchors.fill: parent color: Theme.palette.selected.background visible: pressed } Loader { id: delegateLoader height: parent.height sourceComponent: itemActions.delegate ? itemActions.delegate : defaultDelegate property Action action: modelData property int index: index property bool pressed: actionButton.pressed onItemChanged: { // use action's objectName to identify the visualized action if (item && item.objectName === "") { item.objectName = modelData.objectName; actionButton.objectName = "actionbutton_" + modelData.objectName } } } } } } Component { id: defaultDelegate Item { width: actionsRow.minItemWidth Icon { width: units.gu(2) height: width name: action.iconName color: leading ? leadingForegroundColor : trailingForegroundColor anchors.centerIn: parent } } } } } // the selection/multiselection panel Component { id: selectionDelegate Item { id: selectPanel objectName: "selection_panel" + listItemIndex anchors.fill: parent ? parent : undefined CheckBox { id: checkbox opacity: 0 // for unit and autopilot tests objectName: "listitem_select" anchors.centerIn: parent // for the initial value checked: styledItem.selected onCheckedChanged: styledItem.selected = checked; Binding { target: checkbox property: "checked" value: styledItem.selected } } states: State { name: "enabled" when: loaded && styledItem.selectMode PropertyChanges { target: checkbox opacity: 1.0 } } transitions: Transition { from: "" to: "*" reversible: true enabled: listItemStyle.animatePanels OpacityAnimator { easing: UbuntuAnimation.StandardEasing duration: UbuntuAnimation.FastDuration } } } } // drag panel Component { id: dragDelegate Item { id: dragPanel objectName: "drag_panel" + index anchors.fill: parent ? parent : undefined Icon { objectName: "icon" id: dragIcon anchors.centerIn: parent width: units.gu(3) height: width name: "view-grid-symbolic" opacity: 0.0 scale: 0.5 } Binding { target: listItemStyle property: "dragPanel" value: dragPanel } states: State { name: "enabled" when: loaded && styledItem.dragMode PropertyChanges { target: dragIcon opacity: 1.0 scale: 1.0 } } transitions: Transition { from: "" to: "*" reversible: true enabled: listItemStyle.animatePanels ParallelAnimation { OpacityAnimator { easing: UbuntuAnimation.StandardEasing duration: UbuntuAnimation.FastDuration } ScaleAnimator { easing: UbuntuAnimation.StandardEasing duration: UbuntuAnimation.FastDuration } } } } } // leading panel loader Loader { id: leadingLoader objectName: "leading_loader" anchors { top: parent.top bottom: parent.bottom right: parent.left } width: styledItem.width sourceComponent: internals.swiped && styledItem.leadingActions && styledItem.leadingActions.actions.length > 0 ? panelComponent : null // context properties used in delegates readonly property bool leading: true readonly property bool loaded: status == Loader.Ready // panel states states: [ State { name: "selectable" when: styledItem.selectMode PropertyChanges { target: leadingLoader sourceComponent: selectionDelegate width: units.gu(5) } PropertyChanges { target: listItemStyle anchors.leftMargin: 0 } PropertyChanges { target: styledItem.contentItem anchors.leftMargin: units.gu(5) } } ] transitions: Transition { from: "" to: "selectable" reversible: true enabled: listItemStyle.animatePanels PropertyAnimation { target: styledItem.contentItem properties: "anchors.leftMargin" easing: UbuntuAnimation.StandardEasing duration: UbuntuAnimation.FastDuration } } } // trailing panel loader Loader { id: trailingLoader objectName: "trailing_loader" anchors { top: parent.top bottom: parent.bottom left: parent.right } width: styledItem.width sourceComponent: internals.swiped && styledItem.trailingActions && styledItem.trailingActions.actions.length > 0 ? panelComponent : null // context properties used in delegates readonly property bool leading: false readonly property bool loaded: status == Loader.Ready // panel states states: State { name: "draggable" when: styledItem.dragMode PropertyChanges { target: trailingLoader sourceComponent: dragDelegate width: units.gu(5) } PropertyChanges { target: listItemStyle anchors.rightMargin: 0 } PropertyChanges { target: styledItem.contentItem anchors.rightMargin: units.gu(5) } } transitions: Transition { from: "" to: "*" reversible: true enabled: listItemStyle.animatePanels PropertyAnimation { target: styledItem.contentItem properties: "anchors.rightMargin" easing: UbuntuAnimation.StandardEasing duration: UbuntuAnimation.FastDuration } } } // internals QtObject { id: internals // action triggered property Action selectedAction // swipe handling readonly property bool swiped: listItemStyle.x != styledItem.x && !styledItem.selectMode && !styledItem.dragMode readonly property Item swipedPanel: leadingPanel ? leadingLoader.item : trailingLoader.item readonly property bool leadingPanel: listItemStyle.LayoutMirroring.enabled ? (listItemStyle.x < 0) : (listItemStyle.x > 0) readonly property real swipedOffset: (leadingPanel ? listItemStyle.x : -listItemStyle.x) * (listItemStyle.LayoutMirroring.enabled ? -1 : 1) readonly property real panelWidth: swipedPanel && swipedPanel.hasOwnProperty("panelWidth") ? swipedPanel.panelWidth : 0 property real prevX: 0.0 property real snapChangerLimit: 0.0 readonly property real threshold: units.gu(1.5) property bool snapIn: false // returns the child index of the ListItem when not used in model driven view function childIndex() { if (styledItem.parent) { for (var i = 0; i < styledItem.parent.children.length; i++) { if (styledItem.parent.children[i] == styledItem) { return i; } } } else { return -1; } } // update snap direction function updateSnapDirection() { if (prevX < listItemStyle.x && (snapChangerLimit <= listItemStyle.x)) { snapIn = (listItemStyle.LayoutMirroring.enabled !== leadingPanel); snapChangerLimit = listItemStyle.x - threshold; } else if (prevX > listItemStyle.x && (listItemStyle.x < snapChangerLimit)) { snapIn = (listItemStyle.LayoutMirroring.enabled === leadingPanel); snapChangerLimit = listItemStyle.x + threshold; } prevX = listItemStyle.x; } // perform snapIn/Out function snap() { var snapPos = (swipedOffset > units.gu(2) && snapIn) ? panelWidth : 0.0; snapPos *= leadingPanel ? 1 : -1; // invert snapPos on RTL snapPos *= listItemStyle.LayoutMirroring.enabled ? -1 : 1; snapAnimation.snapTo(snapPos); } // handle elasticity on overshoot function overshoot(event) { var offset = event.content.x - styledItem.contentItem.anchors.leftMargin; offset *= leadingPanel ? 1 : -1; // invert offset on RTL offset *= listItemStyle.LayoutMirroring.enabled ? -1 : 1; if (offset > panelWidth) { // do elastic move event.content.x = styledItem.contentItem.x + (event.to.x - event.from.x) / 2; } } } snapAnimation: SmoothedAnimation { objectName: "snap_animation" target: styledItem.contentItem property: "x" // use 50GU/second velocity velocity: units.gu(60) onStopped: { // trigger action if (to == styledItem.contentItem.anchors.leftMargin && internals.selectedAction) { internals.selectedAction.trigger(listItemIndex); internals.selectedAction = null; } } // animated snapping function snapTo(pos) { if (pos == to && styledItem.contentItem.x == to) { return; } stop(); from = styledItem.contentItem.x; // add leading margin as the snapped out item's X coordinate is the leftMargin pos += styledItem.contentItem.anchors.leftMargin; to = pos; start(); } } // simple drop animation dropAnimation: SmoothedAnimation { properties: "y" velocity: units.gu(60) } onXChanged: internals.updateSnapDirection() // overriding default functions function swipeEvent(event) { if (event.status == SwipeEvent.Started) { internals.prevX = x; snapAnimation.stop(); } else if (event.status == SwipeEvent.Finished) { internals.snap(); } else if (event.status == SwipeEvent.Updated) { // handle elasticity when overshooting internals.overshoot(event) } } function rebound() { snapAnimation.snapTo(0); } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/ButtonForeground.qml0000644000015600001650000000703012700370701024535 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: buttonForeground property alias text: label.text property alias textColor: label.color property alias iconSource: icon.source property string iconPosition property real iconSize property real spacing property bool hasIcon: iconSource != "" property bool hasText: text != "" property alias font: label.font opacity: enabled ? 1.0 : 0.5 implicitHeight: Math.max(icon.height, label.height) state: hasIcon && hasText ? iconPosition : "center" Image { id: icon anchors.verticalCenter: parent.verticalCenter fillMode: Image.PreserveAspectFit width: iconSize height: iconSize } Label { id: label anchors { verticalCenter: parent.verticalCenter verticalCenterOffset: units.dp(-1) } fontSize: "medium" elide: Text.ElideRight } states: [ State { name: "left" AnchorChanges { target: icon anchors.left: buttonForeground.left } AnchorChanges { target: label anchors.left: icon.right } PropertyChanges { target: label anchors.leftMargin: spacing width: buttonForeground.width - icon.width - spacing } PropertyChanges { target: buttonForeground implicitWidth: icon.implicitWidth + spacing + label.implicitWidth } }, State { name: "right" AnchorChanges { target: icon anchors.right: buttonForeground.right } AnchorChanges { target: label anchors.left: buttonForeground.left } PropertyChanges { target: label width: buttonForeground.width - icon.width - spacing } PropertyChanges { target: buttonForeground implicitWidth: label.implicitWidth + spacing + icon.implicitWidth } }, State { name: "center" AnchorChanges { target: icon anchors.horizontalCenter: buttonForeground.horizontalCenter } AnchorChanges { target: label anchors.horizontalCenter: buttonForeground.horizontalCenter } PropertyChanges { target: label width: Math.min(label.implicitWidth, buttonForeground.width) } PropertyChanges { target: buttonForeground implicitWidth: hasText ? label.implicitWidth : icon.implicitWidth } } ] } ./src/Ubuntu/Components/Themes/Ambiance/1.2/ComboButtonStyle.qml0000644000015600001650000001354512700370701024513 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.Styles 1.2 as Style Style.ComboButtonStyle { id: comboStyle // configurations dropDownWidth: units.gu(5) dropDownSeparatorWidth: units.dp(2) comboListMargin: units.gu(0.8) comboListHolder: comboListContent comboListPanel: panelItem defaultColor: mainButton.defaultColor defaultGradient: mainButton.defaultGradient defaultDropdownColor: combo.expanded ? Qt.rgba(0, 0, 0, 0.05) : defaultColor defaultFont: mainButton.defaultFont width: combo.width height: combo.collapsedHeight property ComboButton combo: styledItem implicitWidth: mainButton.implicitWidth implicitHeight: mainButton.implicitHeight LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft LayoutMirroring.childrenInherit: true ButtonStyle { id: mainButton anchors { left: parent.left top: parent.top right: parent.right } height: combo.collapsedHeight // overrides backgroundSource: comboFace buttonFaceOffset: -dropDownWidth/2 - dropDownSeparatorWidth horizontalPadding: units.gu(4) - dropDownSeparatorWidth minimumWidth: units.gu(36) // FIXME: use hardcoded color while we get the theme palette updated defaultColor: "#b2b2b2" defaultGradient: null // button face ShaderEffectSource { id: comboFace sourceItem: content hideSource: true // FIXME: visible: false prevents rendering so make it a nearly // transparent 1x1 pixel instead opacity: 0.01 width: 1 height: 1 } Item { id: content width: mainButton.width height: mainButton.height Rectangle { anchors { fill: parent rightMargin: comboStyle.dropDownSeparatorWidth + comboStyle.dropDownWidth } color: combo.color gradient: mainButton.isGradient ? combo.gradient : null } // distancer Item { anchors { right: dropDownButton.right top: parent.top bottom: parent.bottom } width: comboStyle.dropDownSeparatorWidth } Rectangle { id: dropDownButton objectName: "combobutton_dropdown_visuals" anchors { right: parent.right top: parent.top bottom: parent.bottom } width: comboStyle.dropDownWidth color: mainButton.__colorHack(combo.dropdownColor) Image { source: Qt.resolvedUrl("../artwork/chevron.png") anchors.centerIn: parent rotation: combo.expanded ? -90 : 90 } } } } Item { id: panelItem objectName: "combobutton_combopanel" anchors { left: parent.left top: mainButton.bottom right: parent.right } opacity: combo.expanded && (combo.comboList.length > 0)? 1.0 : 0.0 ShaderEffectSource { id: listContent sourceItem: comboListContent hideSource: true // FIXME: visible: false prevents rendering so make it a nearly // transparent 1x1 pixel instead opacity: 0.01 width: 1 height: 1 } Rectangle { id: comboListContent anchors { fill: parent topMargin: comboListMargin } clip: true color: mainButton.__colorHack(combo.dropdownColor) } BorderImage { id: shadow anchors { fill: parent leftMargin: -units.gu(0.5) topMargin: comboListMargin - units.gu(0.5) rightMargin: -units.gu(0.5) bottomMargin: -units.gu(0.5) } source: Qt.resolvedUrl("../artwork/bubble_shadow.sci") } UbuntuShape { id: shape anchors { fill: parent topMargin: comboListMargin } visible: true borderSource: "radius_idle.sci" image: listContent } Image { source: Qt.resolvedUrl("../artwork/bubble_arrow.png") rotation: 180 anchors { bottom: shape.top bottomMargin: -1 right: parent.right rightMargin: dropDownWidth / 2 - units.gu(0.5) } } Behavior on height { NumberAnimation { duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } } Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/ScrollbarStyle.qml0000644000015600001650000005624012700370701024202 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /* The visuals handle both active and passive modes. This behavior is driven yet by the styledItem's __inactive property, however should be detected upon runtime based on the device type. On active scrollbars, positioning is handled so that the logic updates the flickable's X/Y content positions, which is then synched with the contentPosition by the main element. Style properties used: - interactive: bool - drives the interactive behavior of the scrollbar - minimumSliderSize: real - specifies the minimum size of the slider * overlay - overlay: bool - true if the scrollbar is overlay type - overlayOpacityWhenHidden: opacity when hidden - overlayOpacityWhenShown: opacity when shown * animations - where duration and easing properties are used only - scrollbarFadeInAnimation: PropertyAnimation - animation used when fade in - scrollbarFadeOutAnimation: PropertyAnimation - animation used when fade out - scrollbarFadeOutPause: int - miliseconds to pause before fade out * behaviors - animations are used as declared - sliderAnimation: PropertyAnimation - animation for the slider size - thumbConnectorFading: PropertyAnimation - animation for the thumb connector - thumbFading: PropertyAnimation - animation for the thumb fading * other styling properties - color sliderColor: color for the slider - color thumbConnectorColor: thumb connector color - url forwardThumbReleased: forward thumb image when released - url forwardThumbPressed: forward thumb image when pressed - url backwardThumbReleased: backward thumb image when released - url backwardThumbPressed: backward thumb image when pressed - real scrollAreaThickness: scrollbar area thickness, the area where the slider, thumb and thumb-connector appear - real thumbConnectorMargin: margin of the thumb connector aligned to the thumb visuals */ Item { id: visuals // styling properties property bool interactive: false property real minimumSliderSize: units.gu(2) property bool overlay: !interactive property real overlayOpacityWhenShown: 0.6 property real overlayOpacityWhenHidden: 0.0 property PropertyAnimation scrollbarFadeInAnimation: UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } property PropertyAnimation scrollbarFadeOutAnimation: UbuntuNumberAnimation { duration: UbuntuAnimation.SlowDuration } property int scrollbarFadeOutPause: 300 property PropertyAnimation sliderAnimation: UbuntuNumberAnimation {} property PropertyAnimation thumbConnectorFading: UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } property PropertyAnimation thumbFading: UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } property color sliderColor: Theme.palette.normal.base property real sliderRadius: units.gu(0.5) property color thumbConnectorColor: "white" property url forwardThumbReleased: (styledItem.align === Qt.AlignLeading || styledItem.align === Qt.AlignTrailing) ? Qt.resolvedUrl("../artwork/ScrollbarBottomIdle.png") : Qt.resolvedUrl("../artwork/ScrollbarRightIdle.png") property url forwardThumbPressed: (styledItem.align === Qt.AlignLeading || styledItem.align === Qt.AlignTrailing) ? Qt.resolvedUrl("../artwork/ScrollbarBottomPressed.png") : Qt.resolvedUrl("../artwork/ScrollbarRightPressed.png") property url backwardThumbReleased: (styledItem.align === Qt.AlignLeading || styledItem.align === Qt.AlignTrailing) ? Qt.resolvedUrl("../artwork/ScrollbarTopIdle.png") : Qt.resolvedUrl("../artwork/ScrollbarLeftIdle.png") property url backwardThumbPressed: (styledItem.align === Qt.AlignLeading || styledItem.align === Qt.AlignTrailing) ? Qt.resolvedUrl("../artwork/ScrollbarTopPressed.png") : Qt.resolvedUrl("../artwork/ScrollbarLeftPressed.png") property real scrollAreaThickness: units.gu(0.5) property real thumbConnectorMargin: units.dp(3) // helper properties to ease code readability property Flickable flickableItem: styledItem.flickableItem property bool isScrollable: styledItem.__private.scrollable && pageSize > 0.0 && contentSize > 0.0 && contentSize > pageSize property bool isVertical: (styledItem.align === Qt.AlignLeading) || (styledItem.align === Qt.AlignTrailing) property bool frontAligned: (styledItem.align === Qt.AlignLeading) property bool rearAligned: (styledItem.align === Qt.AlignTrailing) property bool topAligned: (styledItem.align === Qt.AlignTop) property bool bottomAligned: (styledItem.align === Qt.AlignBottom) property real pageSize: (isVertical) ? styledItem.height : styledItem.width property real contentSize: (isVertical) ? styledItem.flickableItem.contentHeight : styledItem.flickableItem.contentWidth /*! \internal Object storing property names used in calculations. */ QtObject { id: scrollbarUtils property string propOrigin: (isVertical) ? "originY" : "originX" property string propContent: (isVertical) ? "contentY" : "contentX" property string propPosRatio: (isVertical) ? "yPosition" : "xPosition" property string propSizeRatio: (isVertical) ? "heightRatio" : "widthRatio" property string propCoordinate: (isVertical) ? "y" : "x" property string propSize: (isVertical) ? "height" : "width" /*! \internal Calculates the slider position based on the visible area's ratios. */ function sliderPos(min, max) { return MathUtils.clamp(styledItem.flickableItem.visibleArea[propPosRatio] * styledItem.flickableItem[propSize], min, max); } /*! \internal Calculates the slider size for ListViews based on the visible area's position and size ratios, clamping it between min and max. The function can be used in Scrollbar styles to calculate the size of the slider. */ function sliderSize(min, max) { var sizeRatio = styledItem.flickableItem.visibleArea[propSizeRatio]; var posRatio = styledItem.flickableItem.visibleArea[propPosRatio]; var sizeUnderflow = (sizeRatio * max) < min ? min - (sizeRatio * max) : 0 var startPos = posRatio * (max - sizeUnderflow) var endPos = (posRatio + sizeRatio) * (max - sizeUnderflow) + sizeUnderflow var overshootStart = startPos < 0 ? -startPos : 0 var overshootEnd = endPos > max ? endPos - max : 0 // overshoot adjusted start and end var adjustedStartPos = startPos + overshootStart var adjustedEndPos = endPos - overshootStart - overshootEnd // final position and size of thumb var position = adjustedStartPos + min > max ? max - min : adjustedStartPos var result = (adjustedEndPos - position) < min ? min : (adjustedEndPos - position) return result; } /*! \internal The function calculates and clamps the position to be scrolled to the minimum and maximum values. The scroll and drag functions require a slider that does not have any minimum size set (meaning the minimum is set to 0.0). Implementations should consider using an invisible cursor to drag the slider and the ListView position. */ function scrollAndClamp(amount, min, max) { return styledItem.flickableItem[propOrigin] + MathUtils.clamp(styledItem.flickableItem[propContent] - styledItem.flickableItem[propOrigin] + amount, min, max); } /*! \internal The function calculates the new position of the dragged slider. The amount is relative to the contentSize, which is either the flickable's contentHeight or contentWidth or other calculated value, depending on its orientation. The pageSize specifies the visibleArea, and it is usually the heigtht/width of the scrolling area. */ function dragAndClamp(cursor, contentSize, pageSize) { styledItem.flickableItem[propContent] = styledItem.flickableItem[propOrigin] + cursor[propCoordinate] * contentSize / pageSize; } } /***************************************** Visuals *****************************************/ anchors.fill: parent opacity: overlayOpacityWhenHidden state: { if (!isScrollable) return ''; else if (overlay) { if (flickableItem.moving) return 'overlay'; else return 'stopped'; } else return 'shown'; } states: [ State { name: 'stopped' extend: '' PropertyChanges { target: visuals opacity: overlayOpacityWhenHidden } }, State { name: "shown" PropertyChanges { target: visuals opacity: overlayOpacityWhenShown } }, State { name: 'overlay' PropertyChanges { target: visuals opacity: overlayOpacityWhenShown } } ] transitions: [ Transition { from: '' to: 'shown' NumberAnimation { target: visuals property: "opacity" duration: scrollbarFadeInAnimation.duration easing: scrollbarFadeInAnimation.easing } }, Transition { from: '*' to: 'overlay' NumberAnimation { target: visuals property: "opacity" duration: scrollbarFadeInAnimation.duration easing: scrollbarFadeInAnimation.easing } }, Transition { from: "overlay" to: "stopped" SequentialAnimation { PauseAnimation { duration: scrollbarFadeOutPause } NumberAnimation { target: visuals property: "opacity" duration: scrollbarFadeOutAnimation.duration easing: scrollbarFadeOutAnimation.easing } } } ] function mapToPoint(map) { return Qt.point(map.x, map.y) } SmoothedAnimation { id: scrollAnimation duration: 200 easing.type: Easing.InOutQuad target: styledItem.flickableItem property: (isVertical) ? "contentY" : "contentX" } // represents the visible area of the scrollbar where slider and thumb connector are placed Item { id: scrollbarArea property real thickness: scrollAreaThickness property real proximityThickness: (isVertical) ? styledItem.width - thickness : styledItem.height - thickness anchors { fill: parent leftMargin: (!isVertical || frontAligned) ? 0 : proximityThickness rightMargin: (!isVertical || rearAligned) ? 0 : proximityThickness topMargin: (isVertical || topAligned) ? 0 : proximityThickness bottomMargin: (isVertical || bottomAligned) ? 0 : proximityThickness } } // The thumb appears whenever the mouse gets close enough to the scrollbar // and disappears after being for a long enough time far enough of it MouseArea { id: proximityArea anchors { fill: parent leftMargin: (!isVertical) ? 0 : (frontAligned ? scrollbarArea.thickness : 0) rightMargin: (!isVertical) ? 0 : (rearAligned ? scrollbarArea.thickness : 0) topMargin: (isVertical) ? 0 : (topAligned ? scrollbarArea.thickness : 0) bottomMargin: (isVertical) ? 0 : (bottomAligned ? scrollbarArea.thickness : 0) } propagateComposedEvents: true enabled: isScrollable && interactive hoverEnabled: true onEntered: thumb.show(); onPressed: mouse.accepted = false onClicked: mouse.accepted = false onReleased: mouse.accepted = false } // The presence of a mouse enables the interactive thumb // FIXME: Should use form factor hints InverseMouse.onEntered: interactive = true // The slider's position represents which part of the flickable is visible. // The slider's size represents the size the visible part relative to the // total size of the flickable. Item { id: scrollCursor x: (isVertical) ? 0 : scrollbarUtils.sliderPos(styledItem, 0.0, styledItem.width - scrollCursor.width) y: (!isVertical) ? 0 : scrollbarUtils.sliderPos(styledItem, 0.0, styledItem.height - scrollCursor.height) width: (isVertical) ? scrollbarArea.thickness : scrollbarUtils.sliderSize(styledItem, 0.0, flickableItem.width) height: (!isVertical) ? scrollbarArea.thickness : scrollbarUtils.sliderSize(styledItem, 0.0, flickableItem.height) function drag() { scrollbarUtils.dragAndClamp(styledItem, scrollCursor, contentSize, pageSize); } } Rectangle { id: slider color: visuals.sliderColor anchors { left: (isVertical) ? scrollbarArea.left : undefined right: (isVertical) ? scrollbarArea.right : undefined top: (!isVertical) ? scrollbarArea.top : undefined bottom: (!isVertical) ? scrollbarArea.bottom : undefined } x: (isVertical) ? 0 : scrollbarUtils.sliderPos(styledItem, 0.0, styledItem.width - slider.width) y: (!isVertical) ? 0 : scrollbarUtils.sliderPos(styledItem, 0.0, styledItem.height - slider.height) width: (isVertical) ? scrollbarArea.thickness : scrollbarUtils.sliderSize(styledItem, minimumSliderSize, flickableItem.width) height: (!isVertical) ? scrollbarArea.thickness : scrollbarUtils.sliderSize(styledItem, minimumSliderSize, flickableItem.height) radius: visuals.sliderRadius Behavior on width { enabled: (!isVertical) NumberAnimation { duration: visuals.sliderAnimation.duration easing: visuals.sliderAnimation.easing } } Behavior on height { enabled: (isVertical) NumberAnimation { duration: visuals.sliderAnimation.duration easing: visuals.sliderAnimation.easing } } function scroll(amount) { scrollAnimation.to = scrollbarUtils.scrollAndClamp(styledItem, amount, 0.0, contentSize - pageSize); scrollAnimation.restart(); } } // The sliderThumbConnector ensures a visual connection between the slider and the thumb Rectangle { id: sliderThumbConnector property real thumbConnectorMargin: visuals.thumbConnectorMargin property bool isThumbAboveSlider: (isVertical) ? thumb.y < slider.y : thumb.x < slider.x anchors { left: (isVertical) ? scrollbarArea.left : (isThumbAboveSlider ? thumb.left : slider.right) right: (isVertical) ? scrollbarArea.right : (isThumbAboveSlider ? slider.left : thumb.right) top: (!isVertical) ? scrollbarArea.top : (isThumbAboveSlider ? thumb.top : slider.bottom) bottom: (!isVertical) ? scrollbarArea.bottom : (isThumbAboveSlider ? slider.top : thumb.bottom) leftMargin : (isVertical) ? 0 : (isThumbAboveSlider ? thumbConnectorMargin : 0) rightMargin : (isVertical) ? 0 : (isThumbAboveSlider ? 0 : thumbConnectorMargin) topMargin : (!isVertical) ? 0 : (isThumbAboveSlider ? thumbConnectorMargin : 0) bottomMargin : (!isVertical) ? 0 : (isThumbAboveSlider ? 0 : thumbConnectorMargin) } color: visuals.thumbConnectorColor opacity: thumb.shown ? 1.0 : 0.0 Behavior on opacity { NumberAnimation { duration: visuals.thumbConnectorFading.duration easing: visuals.thumbConnectorFading.easing } } } MouseArea { id: thumbArea property point thumbPoint: mapToPoint(thumb.mapFromItem(thumbArea, mouseX, mouseY)) property point thumbTopPoint: mapToPoint(thumbTop.mapFromItem(thumb, thumbPoint.x, thumbPoint.y)) property point thumbBottomPoint: mapToPoint(thumbBottom.mapFromItem(thumb, thumbPoint.x, thumbPoint.y)) property bool inThumbTop: thumbTop.contains(thumbTopPoint) property bool inThumbBottom: thumbBottom.contains(thumbBottomPoint) anchors { fill: scrollbarArea // set margins adding 2 dp for error area leftMargin: (!isVertical || frontAligned) ? 0 : units.dp(-2) - thumb.width rightMargin: (!isVertical || rearAligned) ? 0 : units.dp(-2) - thumb.width topMargin: (isVertical || topAligned) ? 0 : units.dp(-2) - thumb.height bottomMargin: (isVertical || bottomAligned) ? 0 : units.dp(-2) - thumb.height } enabled: isScrollable && interactive hoverEnabled: true onEntered: thumb.show() onPressed: { if (isVertical) { if (mouseY < thumb.y) { thumb.placeThumbForeUnderMouse(mouse) } else if (mouseY > (thumb.y + thumb.height)) { thumb.placeThumbRearUnderMouse(mouse) } } else { if (mouseX < thumb.x) { thumb.placeThumbForeUnderMouse(mouse) } else if (mouseX > (thumb.x + thumb.width)) { thumb.placeThumbRearUnderMouse(mouse) } } } onClicked: { if (inThumbBottom) slider.scroll(pageSize) else if (inThumbTop) slider.scroll(-pageSize) } // Dragging behaviour function resetDrag() { thumbYStart = thumb.y thumbXStart = thumb.x dragYStart = drag.target.y dragXStart = drag.target.x } property int thumbYStart property int dragYStart property int dragYAmount: thumbArea.drag.target.y - thumbArea.dragYStart property int thumbXStart property int dragXStart property int dragXAmount: thumbArea.drag.target.x - thumbArea.dragXStart drag { target: scrollCursor axis: (isVertical) ? Drag.YAxis : Drag.XAxis minimumY: 0 maximumY: flickableItem.height - scrollCursor.height minimumX: 0 maximumX: flickableItem.width - scrollCursor.width onActiveChanged: { if (drag.active) resetDrag() } } // update thumb position onDragYAmountChanged: { if (drag.active) { thumb.y = MathUtils.clamp(thumbArea.thumbYStart + thumbArea.dragYAmount, 0, thumb.maximumPos); } } onDragXAmountChanged: { if (drag.active) { thumb.x = MathUtils.clamp(thumbArea.thumbXStart + thumbArea.dragXAmount, 0, thumb.maximumPos); } } // drag slider and content to the proper position onPositionChanged: { if (pressedButtons == Qt.LeftButton) { scrollCursor.drag() } } } Timer { id: autohideTimer interval: 1000 repeat: true onTriggered: if (!proximityArea.containsMouse && !thumbArea.containsMouse && !thumbArea.pressed) thumb.hide() } Item { id: thumb objectName: "interactiveScrollbarThumb" enabled: interactive anchors { left: frontAligned ? slider.left : undefined right: rearAligned ? slider.right : undefined top: topAligned ? slider.top : undefined bottom: bottomAligned ? slider.bottom : undefined } width: childrenRect.width height: childrenRect.height property bool shown property int maximumPos: (isVertical) ? styledItem.height - thumb.height : styledItem.width - thumb.width /* Show the thumb as close as possible to the mouse pointer */ onShownChanged: { if (shown) { if (isVertical) { var mouseY = proximityArea.containsMouse ? proximityArea.mouseY : thumbArea.mouseY; y = MathUtils.clamp(mouseY - thumb.height / 2, 0, thumb.maximumPos); } else { var mouseX = proximityArea.containsMouse ? proximityArea.mouseX : thumbArea.mouseX; x = MathUtils.clamp(mouseX - thumb.width / 2, 0, thumb.maximumPos); } } } function show() { autohideTimer.restart(); shown = true; } function hide() { autohideTimer.stop(); shown = false; } function placeThumbForeUnderMouse(mouse) { var diff = (isVertical) ? mouse.y - height / 4 : mouse.x - width / 4; positionAnimation.to = MathUtils.clamp(diff, 0, maximumPos); positionAnimation.restart(); } function placeThumbRearUnderMouse(mouse) { var diff = (isVertical) ? mouse.y - height * 3 / 4 : mouse.x - width * 3 / 4; positionAnimation.to = MathUtils.clamp(diff, 0, maximumPos); positionAnimation.restart(); } NumberAnimation { id: positionAnimation duration: 100 easing.type: Easing.InOutQuad target: thumb property: (isVertical) ? "y" : "x" } opacity: shown ? (thumbArea.containsMouse || thumbArea.drag.active ? 1.0 : 0.5) : 0.0 Behavior on opacity { NumberAnimation { duration: visuals.thumbFading.duration easing: visuals.thumbFading.easing } } Flow { // disable mirroring as thumbs are placed in the same way no matter of RTL or LTR LayoutMirroring.enabled: false flow: (isVertical) ? Flow.TopToBottom : Flow.LeftToRight Image { id: thumbTop source: thumbArea.inThumbTop && thumbArea.pressed ? visuals.backwardThumbPressed : visuals.backwardThumbReleased } Image { id: thumbBottom source: thumbArea.inThumbBottom && thumbArea.pressed ? visuals.forwardThumbPressed : visuals.forwardThumbReleased } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/OverflowPanel.qml0000644000015600001650000000135212700370701024013 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components.Popups 1.0 Popover { property bool square: true } ./src/Ubuntu/Components/Themes/Ambiance/1.2/DialerStyle.qml0000644000015600001650000000762312700370701023460 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 import QtGraphicalEffects 1.0 // FIXME: Replace this once UbuntuShape support for gradients and shading has landed Rectangle { anchors.fill: parent radius: width / 2 antialiasing: true property real offset : units.gu(0.2) gradient: Gradient { GradientStop { position: 0.0; color: "#512F48" } GradientStop { position: 0.25; color: "#583048" } GradientStop { position: 0.5; color: "#653449" } GradientStop { position: 0.75; color: "#6D384A" } GradientStop { position: 1.0; color: "#753B4A" } } // draws the outter shadow/highlight Rectangle { id: sourceOutter anchors { fill: parent; margins: -offset } radius: (width / 2) antialiasing: true gradient: Gradient { GradientStop { position: 0.0; color: "black" } GradientStop { position: 0.5; color: "transparent" } GradientStop { position: 1.0; color: "white" } } } // mask for outer 3D effect Rectangle { id: maskOutter anchors.fill: sourceOutter color: "transparent" radius: (width / 2) antialiasing: true border { width: offset; color: "black" } } // outter effect OpacityMask { anchors.fill: sourceOutter opacity: 0.65 source: ShaderEffectSource { sourceItem: sourceOutter hideSource: true } maskSource: ShaderEffectSource { sourceItem: maskOutter hideSource: true } } // center item // FIXME: Replace this once UbuntuShape support for gradients and shading has landed Rectangle { parent: styledItem.centerItem.parent anchors.fill: parent radius: width / 2; antialiasing: true; gradient: Gradient { GradientStop { position: 0.0; color: "#7A4C68" } GradientStop { position: 0.25; color: "#804563" } GradientStop { position: 0.5; color: "#864660" } GradientStop { position: 0.75; color: "#86465E" } GradientStop { position: 1.0; color: "#964E66" } } // draws the inner highlight / shadow Rectangle { id: sourceInner; anchors { fill: parent; margins: -offset } radius: (width / 2) antialiasing: true gradient: Gradient { GradientStop { position: 0.0; color: "white" } GradientStop { position: 0.5; color: "transparent" } GradientStop { position: 1.0; color: "black" } } } // mask for inner 3D effect Rectangle { id: maskInner color: "transparent" anchors.fill: sourceInner radius: (width / 2) antialiasing: true border { width: offset; color: "black" } } // inner effect OpacityMask { opacity: 0.65 anchors.fill: sourceInner source: ShaderEffectSource { sourceItem: sourceInner hideSource: true } maskSource: ShaderEffectSource { sourceItem: maskInner hideSource: true } } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/MainViewStyle.qml0000644000015600001650000000415312700370701023772 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { // styling properties anchors.fill: parent z: -1 id: mainViewStyle /*! The background texture of the main view. The image will be drawn over the background color, so if it has (semi-)transparent pixels, in those pixels the background color will be visible. */ property url backgroundSource: Qt.resolvedUrl("../artwork/background_paper.png") Gradient { id: backgroundGradient GradientStop { position: 0.0; color: styledItem.headerColor } GradientStop { position: 0.83; color: styledItem.backgroundColor } GradientStop { position: 1.0; color: styledItem.footerColor } } Rectangle { id: backgroundColor anchors.fill: parent color: styledItem.backgroundColor gradient: internals.isGradient ? backgroundGradient : null visible: internals.isGradient } Binding { target: typeof window != 'undefined' ? window : null property: "color" value: styledItem.backgroundColor } Image { id: backgroundTexture anchors.fill: parent source: mainViewStyle.backgroundSource fillMode: Image.Tile asynchronous: true cache: false } QtObject { id: internals property bool isGradient: styledItem.backgroundColor != styledItem.headerColor || styledItem.backgroundColor != styledItem.footerColor } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/ToolbarButtonStyle.qml0000644000015600001650000000334412700370701025052 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: visuals // styling properties property int iconWidth: units.gu(2) property int iconHeight: units.gu(2) implicitWidth: label.paintedWidth anchors.fill: parent Item { anchors.centerIn: parent height: icon.height + label.height + label.anchors.topMargin opacity: styledItem.enabled ? 1.0 : 0.3 Image { id: icon anchors { top: parent.top horizontalCenter: parent.horizontalCenter } sourceSize.width: iconWidth sourceSize.height: iconWidth source: styledItem.iconSource smooth: true } Label { id: label anchors { horizontalCenter: parent.horizontalCenter top: icon.bottom topMargin: units.gu(1) } width: paintedWidth text: styledItem.text fontSize: "x-small" } } Component.onCompleted: styledItem.implicitWidth = implicitWidth } ./src/Ubuntu/Components/Themes/Ambiance/1.2/ListItemOptionSelectorStyle.qml0000644000015600001650000000161012700370701026672 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: ambianceStyle property url chevron: Qt.resolvedUrl("../artwork/chevron_down.png") property url tick: Qt.resolvedUrl("../artwork/tick.png") property bool colourComponent: true } ./src/Ubuntu/Components/Themes/Ambiance/1.2/TextCursorStyle.qml0000644000015600001650000000665512700370701024406 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 // FIXME : move the API into Ubuntu.Components.Style Item { id: cursorStyle /*! Property specifying the visible timeout of the cursor. It is not mandatory for styles to define values for this property if the cursor blinking is not desired. A value of 0 turns off the cursor blinking. */ property int cursorVisibleTimeout: 800 /*! Property specifying the hidden timeout of the cursor. It is not mandatory for styles to define values for this property if the cursor blinking is not desired. A value of 0 turns off the cursor blinking. */ property int cursorHiddenTimeout: 400 /*! Component defining the default cursor visuals. */ property Component cursorDelegate: delegate /*! The item pointing to the cursor handler. Styles should set to null if the cursor does not have handler at all. */ property Item caret: caretItem /*! The width of the cursor. */ property int cursorWidth: units.dp(2) // style body Component { id: delegate Rectangle { objectName: "text_cursor_style_" + styledItem.positionProperty width: cursorWidth // FIXME: Extend the palette and use palette values here color: UbuntuColors.blue visible: blinkTimer.timerShowCursor || !blinkTimer.running Timer { id: blinkTimer interval: cursorStyle.cursorVisibleTimeout running: (cursorStyle.cursorVisibleTimeout > 0) && (cursorStyle.cursorHiddenTimeout > 0) && styledItem.visible && shouldBlink repeat: true property bool shouldBlink: styledItem.positionProperty === "cursorPosition" && !styledItem.readOnly && !styledItem.contextMenuVisible property bool timerShowCursor: true onTriggered: { interval = (interval == cursorStyle.cursorVisibleTimeout) ? cursorStyle.cursorHiddenTimeout : cursorStyle.cursorVisibleTimeout; timerShowCursor = !timerShowCursor; } } } } // caretItem Image { id: caretItem source: Qt.resolvedUrl("../artwork/caret_noshadow.png") objectName: "text_cursor_style_caret_" + styledItem.positionProperty property bool flip: styledItem.positionProperty !== "selectionStart" rotation: flip ? 180 : 0 anchors { top: flip ? parent.bottom : undefined bottom: flip ? undefined : parent.top horizontalCenter: parent.horizontalCenter horizontalCenterOffset: cursorWidth / 2 } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/PickerStyle.qml0000644000015600001650000000745612700370701023501 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.ListItems 1.0 Item { id: control // style properties /*! Specifies the background color */ property color backgroundColor: "#0A000000" /*! Background color for highlight. */ property color highlightBackgroundColor: "#ffffffff" /*! Highlight color. */ property color highlightColor: UbuntuColors.orange /*! Scale of the highlight item */ property real highlightScaleFactor: 1.2 /*! Thickness of the highlight component */ property real highlightThickness: styledItem.__itemHeight + units.gu(1) /*! The content holder exposed to the Picker so tumbler list can be reparented to it. */ property alias tumblerHolder: content /*! \internal View instance listing the model */ property Item view: Item{} anchors.fill: parent implicitWidth: units.gu(8) implicitHeight: units.gu(20) // frame UbuntuShape { anchors.fill: parent radius: "medium" color: Theme.palette.normal.overlay image: shapeSource } ShaderEffectSource { id: shapeSource sourceItem: background hideSource: true // FIXME: visible: false prevents rendering so make it a nearly // transparent 1x1 pixel instead opacity: 0.01 width: 1 height: 1 } Rectangle { id: background anchors.fill: parent MouseArea { anchors.fill: parent } // background color: backgroundColor Item { id: content anchors.fill: parent } // highlight Rectangle { id: highlightItem y: (content.height - control.highlightThickness) / 2 anchors { left: content.left right: content.right } height: control.highlightThickness color: highlightBackgroundColor } ThinDivider { anchors { left: content.left right: content.right bottom: highlightItem.top } } ThinDivider { anchors { left: content.left right: content.right top: highlightItem.bottom } } ShaderEffectSource { id: effectSource visible: false sourceItem: view property real sourceRectMultiplier: 2.0 // XXX: This works because the parent of magnifier is the same as sourceItem // in this case. Otherwise coordinate transformations will be needed. sourceRect: Qt.rect(highlightItem.x, highlightItem.y, highlightItem.width, highlightItem.height) textureSize: Qt.size(highlightItem.width*sourceRectMultiplier, highlightItem.height*sourceRectMultiplier) } HighlightMagnifier { anchors.fill: highlightItem scaleFactor: control.highlightScaleFactor outputColor: control.highlightColor source: effectSource } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/SheetForegroundStyle.qml0000644000015600001650000000667412700370701025370 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: visuals // styling properties property color backgroundColor: "lightgray" property color headerColor: "darkgray" property real headerHeight: units.gu(8) property real buttonContainerWidth: units.gu(14) implicitWidth: MathUtils.clamp(styledItem.contentsWidth, styledItem.minWidth, styledItem.maxWidth) implicitHeight: header.height + containerItem.height property alias contentItem: containerItem Rectangle { id: header color: visuals.headerColor height: visuals.headerHeight anchors { top: parent.top left: parent.left right: parent.right } Label { id: headerText anchors { verticalCenter: parent.verticalCenter left: leftButtonContainer.right right: rightButtonContainer.left } width: headerText.implicitWidth + units.gu(4) elide: Text.ElideRight horizontalAlignment: Text.AlignHCenter text: styledItem.title } Item { id: leftButtonContainer anchors { left: parent.left top: parent.top bottom: parent.bottom } width: styledItem.leftButton ? visuals.buttonContainerWidth : 0 Component.onCompleted: header.updateButton(styledItem.leftButton, leftButtonContainer) } Item { id: rightButtonContainer anchors { right: parent.right top: parent.top bottom: parent.bottom } width: styledItem.rightButton ? visuals.buttonContainerWidth : 0 Component.onCompleted: header.updateButton(styledItem.rightButton, rightButtonContainer) } function updateButton(button, container) { if (!button) return; button.parent = container; button.anchors.left = container.left; button.anchors.right = container.right; button.anchors.verticalCenter = container.verticalCenter; button.anchors.margins = units.gu(1); } Connections { target: styledItem onLeftButtonChanged: header.updateButton(styledItem.leftButton, leftButtonContainer) onRightButtonChanged: header.updateButton(styledItem.rightButton, rightButtonContainer) } } Rectangle { id: containerItem color: visuals.backgroundColor height: MathUtils.clamp(styledItem.contentsHeight, styledItem.minHeight - header.height, styledItem.maxHeight - header.height) anchors { top: header.bottom left: parent.left right: parent.right } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/BubbleShape.qml0000644000015600001650000001144112700370701023404 0ustar jenkinsjenkins/* * Copyright 2013-2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: bubbleShape /*! Do not use an UbuntuShape but a Rectangle as the background of the BubbleShape. */ property bool square: false /*! The background color of the bubble. */ property color color: square ? Theme.palette.normal.background : Theme.palette.normal.overlay property point target property string direction: "down" property bool clipContent: false default property alias children: content.children // FIXME: This should not be necessary. See // https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1214978 property alias arrowSource: arrow.source implicitWidth: units.gu(10) implicitHeight: units.gu(8) signal showCompleted() signal hideCompleted() opacity: 0.0 function show() { hideAnimation.stop(); showAnimation.start(); } function hide() { showAnimation.stop(); hideAnimation.start(); } ParallelAnimation { id: showAnimation NumberAnimation { target: bubbleShape property: "opacity" from: 0.0 to: 1.0 duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } NumberAnimation { target: scaleTransform property: (direction === "up" || direction === "down") ? "yScale" : "xScale" from: 0.91 to: 1.0 duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } onStopped: showCompleted() } NumberAnimation { id: hideAnimation target: bubbleShape property: "opacity" from: 1.0 to: 0.0 duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing onStopped: hideCompleted() } transform: Scale { id: scaleTransform origin.x: direction === "right" ? bubbleShape.width : direction === "left" ? 0 : bubbleShape.width/2.0 origin.y: direction === "up" ? 0 : direction === "down" ? bubbleShape.height : bubbleShape.height/2.0 } BorderImage { id: shadow anchors.fill: parent anchors.margins: square ? -units.gu(1) : -units.dp(2) anchors.topMargin: square ? 0 : anchors.margins source: !square ? Qt.resolvedUrl("../artwork/bubble_shadow.sci") : Qt.resolvedUrl("../artwork/header_overflow_dropshadow.sci") opacity: 0.8 } UbuntuShape { anchors.fill: parent borderSource: "none" color: Theme.palette.normal.overlay image: bubbleShape.clipContent ? shapeSource : null visible: !square } ShaderEffectSource { id: shapeSource visible: bubbleShape.clipContent sourceItem: bubbleShape.clipContent ? content : null hideSource: !square // FIXME: visible: false prevents rendering so make it a nearly // transparent 1x1 pixel instead opacity: 0.01 width: 1 height: 1 } Item { id: content anchors.fill: parent Rectangle { id: colorRect anchors.fill: parent color: bubbleShape.color visible: bubbleShape.clipContent } } Item { x: target.x y: target.y Image { id: arrow visible: !square && bubbleShape.direction != "none" function directionToRotation(direction) { switch (direction) { case "up": return 180; case "left": return 90; case "right": return -90; default: // "down" or "none" return 0; } } x: -width / 2.0 y: -height transformOrigin: Item.Bottom rotation: directionToRotation(bubbleShape.direction) source: Qt.resolvedUrl("../artwork/bubble_arrow.png") } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml0000644000015600001650000000551112700370701024503 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: progressBarStyle property color foregroundColor: UbuntuColors.orange property color foregroundTextColor: '#FFFFFF' property color backgroundColor: Theme.palette.normal.base property color backgroundTextColor: Theme.palette.normal.baseText property var progressBar: styledItem implicitWidth: units.gu(38) implicitHeight: units.gu(4) UbuntuShapeOverlay { id: background anchors.fill: parent backgroundColor: progressBarStyle.backgroundColor overlayColor: foregroundColor overlayRect: Qt.application.layoutDirection == Qt.LeftToRight ? Qt.rect(0.0, 0.0, progressBarStyle.progress, 1.0) : Qt.rect(1.0 - progressBarStyle.progress, 0.0, 1.0, 1.0) } property real progress: progressBar.indeterminate ? 0.0 : progressBar.value / (progressBar.maximumValue - progressBar.minimumValue) Label { id: valueLabel anchors.centerIn: background fontSize: "medium" color: backgroundTextColor text: progressBar.indeterminate ? i18n.dtr("ubuntu-ui-toolkit", "In Progress") : "%1%".arg(Number(progressBarStyle.progress * 100.0).toFixed(0)) visible: !progressBar.hasOwnProperty("showProgressPercentage") || progressBar.showProgressPercentage SequentialAnimation on opacity { loops: Animation.Infinite running: progressBar.indeterminate UbuntuNumberAnimation { to: 0.2; duration: UbuntuAnimation.BriskDuration } UbuntuNumberAnimation { to: 1.0; duration: UbuntuAnimation.BriskDuration } } } PartialColorize { anchors.fill: valueLabel sourceItem: progressBar.indeterminate ? null : valueLabel leftColor: foregroundTextColor rightColor: backgroundTextColor progress: (progressBarStyle.progress * background.width - valueLabel.x) / valueLabel.width mirror: Qt.application.layoutDirection == Qt.RightToLeft visible: !progressBar.hasOwnProperty("showProgressPercentage") || progressBar.showProgressPercentage } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/ProgressionVisualStyle.qml0000644000015600001650000000320612700370701025747 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: progressionVisualStyle property url progressionDividerSource: Qt.resolvedUrl("../artwork/progression_divider.png") property url progressionIconSource: Qt.resolvedUrl("../artwork/chevron.png") implicitWidth: progressIcon.width + (styledItem.showSplit ? styledItem.splitMargin + progressionDivider.width : 0) Image { id: progressIcon source: progressionIconSource anchors { verticalCenter: parent.verticalCenter right: parent.right } opacity: enabled ? 1.0 : 0.5 mirror: Qt.application.layoutDirection == Qt.RightToLeft } Image { id: progressionDivider visible: styledItem.showSplit anchors { top: parent.top bottom: parent.bottom right: progressIcon.left rightMargin: styledItem.splitMargin } source: progressionDividerSource opacity: enabled ? 1.0 : 0.5 } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/DialogForegroundStyle.qml0000644000015600001650000000150312700370701025501 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: dialogForegroundStyle UbuntuShape { id: background anchors.fill: parent color: "white" } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/OptionSelectorStyle.qml0000644000015600001650000000213612700370701025223 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: ambianceStyle objectName: "OptionSelector12" property url chevron: Qt.resolvedUrl("../artwork/chevron_down.png") property url tick: Qt.resolvedUrl("../artwork/tick.png") property bool colourComponent: true UbuntuShape { id: background width: styledItem.width height: styledItem.height radius: "medium" color: Qt.rgba(0, 0, 0, 0.05) } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/SliderStyle.qml0000644000015600001650000001014512700370701023473 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 /* The default slider style consists of a bar and a thumb shape. This style is themed using the following properties: - thumbSpacing: spacing between the thumb and the bar */ Item { id: sliderStyle property color foregroundColor: UbuntuColors.orange property color backgroundColor: Theme.palette.normal.base property real thumbSpacing: units.gu(0) property Item bar: background property Item thumb: thumb implicitWidth: units.gu(38) implicitHeight: units.gu(5) UbuntuShapeOverlay { id: background anchors { verticalCenter: parent.verticalCenter right: parent.right left: parent.left } height: units.dp(4) backgroundColor: sliderStyle.backgroundColor overlayColor: sliderStyle.foregroundColor overlayRect: Qt.application.layoutDirection == Qt.LeftToRight ? Qt.rect(0.0, 0.0, thumb.x / thumb.barMinusThumbWidth, 1.0) : Qt.rect(1.0 - (thumb.x / thumb.barMinusThumbWidth), 0.0, 1.0, 1.0) } UbuntuShape { id: thumb anchors { verticalCenter: parent.verticalCenter topMargin: thumbSpacing bottomMargin: thumbSpacing } property real barMinusThumbWidth: background.width - (thumb.width + 2.0*thumbSpacing) property real position: thumbSpacing + SliderUtils.normalizedValue(styledItem) * barMinusThumbWidth property bool pressed: SliderUtils.isPressed(styledItem) property bool positionReached: x == position x: position /* Enable the animation on x when pressing the slider. Disable it when x has reached the target position. */ onPressedChanged: if (pressed) xBehavior.enabled = true; onPositionReachedChanged: if (positionReached) xBehavior.enabled = false; Behavior on x { id: xBehavior SmoothedAnimation { duration: UbuntuAnimation.FastDuration } } width: units.gu(2) height: units.gu(2) opacity: 0.97 color: Theme.palette.normal.overlay } BubbleShape { id: bubbleShape property real minimumWidth: units.gu(8) property real horizontalPadding: units.gu(1) width: Math.max(minimumWidth, label.implicitWidth + 2*horizontalPadding) height: units.gu(6) // FIXME: very temporary implementation property real minX: 0.0 property real maxX: background.width - width property real pointerSize: units.dp(6) property real targetMargin: units.gu(1) property point globalTarget: Qt.point(thumb.x + thumb.width / 2.0, thumb.y - targetMargin) x: MathUtils.clamp(globalTarget.x - width / 2.0, minX, maxX) y: globalTarget.y - height - pointerSize target: Qt.point(globalTarget.x - x, globalTarget.y - y) property bool pressed: SliderUtils.isPressed(styledItem) property bool shouldShow: pressed && label.text != "" onShouldShowChanged: if (shouldShow) { show(); } else { hide(); } Label { id: label anchors.centerIn: parent text: styledItem.formatValue(SliderUtils.liveValue(styledItem)) fontSize: "large" color: Theme.palette.normal.overlayText } } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/PickerDelegateStyle.qml0000644000015600001650000000424612700370701025126 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { property real minFade: 0.2 property real maxFade: 0.95 property bool fadingEnabled: true property bool inListView: styledItem.parent && (QuickUtils.className(styledItem.parent) !== "QQuickPathView") property Item itemList: inListView ? styledItem.ListView.view : styledItem.PathView.view property Item picker: styledItem.picker property Item highlightItem: itemList.highlightItem implicitHeight: picker.__itemHeight implicitWidth: itemList.width Binding { target: styledItem when: fadingEnabled property: "opacity" value: opacityCalc() } function opacityCalc() { if (!picker || !highlightItem || (index === itemList.currentIndex)) return 1.0; var highlightY = highlightItem.y; var delegateY = styledItem.y; if (inListView) { highlightY -= itemList.contentY; delegateY -= itemList.contentY; } var midY = delegateY + styledItem.height / 2; if (delegateY < highlightY) { return MathUtils.clamp(MathUtils.projectValue(midY, 0, highlightY, minFade, maxFade), minFade, maxFade); } var highlightH = highlightY + highlightItem.height; if (delegateY >= highlightH) { delegateY -= highlightH; midY = delegateY + styledItem.height / 2; return MathUtils.clamp(1.0 - MathUtils.projectValue(midY, 0, highlightY, minFade, maxFade), minFade, maxFade); } return 1.0; } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/CheckBoxStyle.qml0000644000015600001650000001240312700370701023736 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 Item { id: checkBoxStyle /*! The padding between the background shape and the outside border of the checkbox. */ property real backgroundPadding: units.gu(0.33) /*! The background color when the checkbox is not checked. */ property color uncheckedBackgroundColor: Qt.rgba(Theme.palette.normal.foreground.r, Theme.palette.normal.foreground.g, Theme.palette.normal.foreground.b, 0.2) /*! The background color when the checkbox is checked. */ property color checkedBackgroundColor: UbuntuColors.green /*! The image to show inside the checkbox when it is checked. */ property url iconSource: "image://theme/tick" /*! The color of the icon. */ property color iconColor: Theme.palette.normal.foregroundText /*! The padding between the icon and the border of the thumb. */ property real iconPadding: backgroundPadding opacity: enabled ? 1.0 : 0.5 implicitWidth: units.gu(3) implicitHeight: units.gu(3) UbuntuShape { id: background anchors { fill: parent margins: checkBoxStyle.backgroundPadding } property real iconSize: Math.min(width, height) - 2*checkBoxStyle.iconPadding Icon { color: checkBoxStyle.iconColor width: background.iconSize height: background.iconSize id: tick anchors.centerIn: parent smooth: true source: checkBoxStyle.iconSource visible: styledItem.checked || transitionToChecked.running || transitionToUnchecked.running } state: styledItem.checked ? "checked" : "unchecked" states: [ State { name: "checked" PropertyChanges { target: tick anchors.verticalCenterOffset: 0 } PropertyChanges { target: background color: checkBoxStyle.checkedBackgroundColor } }, State { name: "unchecked" PropertyChanges { target: tick anchors.verticalCenterOffset: checkBoxStyle.height } PropertyChanges { target: background color: checkBoxStyle.uncheckedBackgroundColor } } ] transitions: [ Transition { id: transitionToUnchecked to: "unchecked" ColorAnimation { target: background duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasingReverse } SequentialAnimation { PropertyAction { target: background property: "clip" value: true } NumberAnimation { target: tick property: "anchors.verticalCenterOffset" duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasingReverse } PropertyAction { target: background property: "clip" value: false } } }, Transition { id: transitionToChecked to: "checked" ColorAnimation { target: background duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } SequentialAnimation { PropertyAction { target: background property: "clip" value: true } NumberAnimation { target: tick property: "anchors.verticalCenterOffset" duration: UbuntuAnimation.FastDuration easing: UbuntuAnimation.StandardEasing } PropertyAction { target: background property: "clip" value: false } } } ] } } ./src/Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml0000644000015600001650000002171612700370701025015 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.Styles 1.2 as Style Style.PullToRefreshStyle { id: style implicitHeight: refreshIndicatorItem.height + units.gu(5) defaultContent: Label { id: labelComponent visible: control.enabled text: releaseToRefresh ? i18n.tr("Release to refresh...") : i18n.tr("Pull to refresh...") horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter Behavior on text { SequentialAnimation { UbuntuNumberAnimation { target: labelComponent property: "opacity" from: 1.0 to: 0.0 } UbuntuNumberAnimation { target: labelComponent property: "opacity" from: 0.0 to: 1.0 } } } } // additional configuration properties provided by the Ambiance theme // these properties can be used by the deriving themes to configure the label // and the activity indicator property Item label: contentLoader.item property alias refreshIndicator: refreshIndicatorItem /* Local properties */ readonly property PullToRefresh control: styledItem // property to store Flickable's toipMargin at the time the pull or auto-refresh is started property real flickableTopMargin: 0.0 // store when the drag has happened at the beginning of the Flickable's content property bool wasAtYBeginning: false // initial contentY value when pull started property real initialContentY: 0.0 // drives the refreshing state property bool refreshing: false // point of release used in rebind animation between the ready-to-refresh and refreshing states property real pointOfRelease // specifies the component completion property bool ready: false // root item property Item rootItem: QuickUtils.rootItem(control) anchors.fill: parent Component.onCompleted: { /* When the model attached to the component is refreshing during initialization, this refresh will happen after the style gets completed. This refresh will cause the style to enter in refreshing state, which alters the topMargin. However in the same time the MainView Header will be also updated, so that will also alter the topMargin. But when refreshing completes, the topMargin will be restored to the default value before the animation, and the content will be pushed under the header. We need to connect to the header changes so we can reset the state and the topMargin. */ if (rootItem && rootItem.__propagated && rootItem.__propagated.header) { rootItem.__propagated.header.visibleChanged.connect(fixTopMargin); rootItem.__propagated.header.heightChanged.connect(fixTopMargin); } ready = true; } function fixTopMargin() { if (style.state === "refreshing") { /* Fetch the topMargin, force state to disabled (idle will be turned on automatically when refreshing completes) and set the topMargin from the header change. */ var topMargin = control.target.topMargin; style.state = "disabled"; control.target.topMargin = topMargin; } } // visuals Loader { id: contentLoader sourceComponent: control.content onItemChanged: { if (item) { item.parent = style; item.anchors.fill = style; } } asynchronous: false } ActivityIndicator { id: refreshIndicatorItem running: false anchors.centerIn: parent } // state and content controlling Connections { target: control onRefreshingChanged: { if (!ready || !control.enabled) { return; } if (!style.releaseToRefresh && target.refreshing) { // not a manual refresh, update flickable's starting topMargin style.flickableTopMargin = control.target.topMargin; style.wasAtYBeginning = control.target.atYBeginning; } /* We cannot bind refreshing state activation clause with the control.refreshing property dirrectly as when the model is refreshed automatically (not manually via the component), we need to remember the flickable's topMargin in order to proceed with a proper Flickable rebinding. If we use property binding, the Connections' onRefreshingChanged will update the flickableTopMargin only after the binding is evaluated. */ style.refreshing = target.refreshing; } } Connections { target: control.target onMovementStarted: { style.wasAtYBeginning = control.target.atYBeginning; style.initialContentY = control.target.contentY; style.refreshing = false; style.releaseToRefresh = false; } onMovementEnded: style.wasAtYBeginning = control.target.atYBeginning // catch when to initiate refresh onDraggingChanged: { if (!control.parent.dragging && style.releaseToRefresh) { pointOfRelease = -(control.target.contentY - control.target.originY) style.flickableTopMargin = control.target.topMargin; style.refreshing = true; style.releaseToRefresh = false; } } onContentYChanged: { if (style.wasAtYBeginning && control.enabled && control.target.dragging) { style.releaseToRefresh = ((style.initialContentY - control.target.contentY) > style.activationThreshold); } } } onStateChanged: { /* Label might not be ready when the component enters in refreshing state, therefore the visible property will not be properly returned to true. Because of the same reason we cannot have a PropertyChanges either as the target is not yet ready at that point. */ if (label) { label.visible = (state === "idle" || state === "ready-to-refresh"); } } states: [ State { name: "disabled" when: !control.enabled }, State { name: "idle" extend: "" when: ready && control.enabled && !style.refreshing && !style.releaseToRefresh }, State { name: "ready-to-refresh" when: ready && control.enabled && style.releaseToRefresh && !style.refreshing }, State { name: "refreshing" when: ready && control.enabled && style.wasAtYBeginning && style.refreshing PropertyChanges { target: refreshIndicatorItem running: true } PropertyChanges { target: control.target topMargin: style.flickableTopMargin + control.height } } ] transitions: [ Transition { from: "ready-to-refresh" to: "refreshing" SequentialAnimation { UbuntuNumberAnimation { target: control.target property: "topMargin" from: style.pointOfRelease to: style.flickableTopMargin + control.height } ScriptAction { script: control.refresh() } } }, // transition to be applied when the model is auto-updating Transition { from: "idle" to: "refreshing" UbuntuNumberAnimation { target: control.target property: "contentY" from: -style.flickableTopMargin to: -style.flickableTopMargin - control.height } }, Transition { from: "refreshing" to: "idle" UbuntuNumberAnimation { target: control.target property: "topMargin" } } ] } ./src/Ubuntu/Components/Themes/Ambiance/qmldir0000644000015600001650000000740512700370701021435 0ustar jenkinsjenkinsmodule Ubuntu.Components.Themes.Ambiance internal ActivityIndicatorStyle ./1.2/ActivityIndicatorStyle.qml internal ButtonStyle ./1.2/ButtonStyle.qml internal DialogForegroundStyle ./1.2/DialogForegroundStyle.qml internal HeaderStyle ./1.2/HeaderStyle.qml internal PageHeadButton ./1.2/PageHeadButton.qml MainViewStyle 0.1 ./1.2/MainViewStyle.qml ListItemOptionSelector 0.1 ./1.2/ListItemOptionSelector.qml OptionSelectorStyle 0.1 ./1.2/OptionSelectorStyle.qml PopoverForegroundStyle 0.1 ./1.2/PopoverForegroundStyle.qml internal ScrollbarStyle ./1.2/ScrollbarStyle.qml internal SheetForegroundStyle ./1.2/SheetForegroundStyle.qml internal SliderStyle ./1.2/SliderStyle.qml TabBarStyle 0.1 ./1.2/TabBarStyle.qml TextAreaStyle 0.1 ./1.2/TextAreaStyle.qml internal TextCursorStyle ./1.2/TextCursorStyle.qml TextFieldStyle 0.1 ./1.2/TextFieldStyle.qml internal ToolbarButtonStyle ./1.2/ToolbarButtonStyle.qml internal DeprecatedToolbarStyle ./1.2/DeprecatedToolbarStyle.qml internal BubbleShape ./1.2/BubbleShape.qml PickerStyle 0.1 ./1.2/PickerStyle.qml DatePickerStyle 0.1 ./1.2/DatePickerStyle.qml PickerDelegateStyle 0.1 ./1.2/PickerDelegateStyle.qml DialerStyle 0.1 ./1.2/DialerStyle.qml DialerHandStyle 0.1 ./1.2/DialerHandStyle.qml internal HighlightMagnifier ./1.2/HighlightMagnifier.qml #version 1.0 MainViewStyle 1.0 ./1.2/MainViewStyle.qml ListItemOptionSelector 1.0 ./1.2/ListItemOptionSelector.qml OptionSelectorStyle 1.0 ./1.2/OptionSelectorStyle.qml PopoverForegroundStyle 1.0 ./1.2/PopoverForegroundStyle.qml TabBarStyle 1.0 ./1.2/TabBarStyle.qml TextAreaStyle 1.0 ./1.2/TextAreaStyle.qml TextFieldStyle 1.0 ./1.2/TextFieldStyle.qml PickerStyle 1.0 ./1.2/PickerStyle.qml DatePickerStyle 1.0 ./1.2/DatePickerStyle.qml PickerDelegateStyle 1.0 ./1.2/PickerDelegateStyle.qml DialerStyle 1.0 ./1.2/DialerStyle.qml DialerHandStyle 1.0 ./1.2/DialerHandStyle.qml #version 1.1 ComboButtonStyle 1.1 ./1.2/ComboButtonStyle.qml PullToRefreshStyle 1.1 ./1.2/PullToRefreshStyle.qml PageHeadStyle 1.1 ./1.2/PageHeadStyle.qml Palette 1.1 ./1.2/Palette.qml ButtonStyle 1.1 ./1.2/ButtonStyle.qml SliderStyle 1.1 ./1.2/SliderStyle.qml SwitchStyle 1.1 ./1.2/SwitchStyle.qml CheckBoxStyle 1.1 ./1.2/CheckBoxStyle.qml internal OverflowPanel ./1.2/OverflowPanel.qml internal HeadDividerStyle ./1.2/HeadDividerStyle.qml #version 1.2 ListItemStyle 1.2 ./1.2/ListItemStyle.qml ################################################# #version 1.3 AmbianceNormal 1.3 ./1.3/AmbianceNormal.qml ActionBarStyle 1.3 ./1.3/ActionBarStyle.qml MainViewStyle 1.3 ./1.3/MainViewStyle.qml ListItemOptionSelector 1.3 ./1.3/ListItemOptionSelector.qml OptionSelectorStyle 1.3 ./1.3/OptionSelectorStyle.qml PopoverForegroundStyle 1.3 ./1.3/PopoverForegroundStyle.qml TabBarStyle 1.3 ./1.3/TabBarStyle.qml TextAreaStyle 1.3 ./1.3/TextAreaStyle.qml TextFieldStyle 1.3 ./1.3/TextFieldStyle.qml PickerStyle 1.3 ./1.3/PickerStyle.qml DatePickerStyle 1.3 ./1.3/DatePickerStyle.qml PickerDelegateStyle 1.3 ./1.3/PickerDelegateStyle.qml DialerStyle 1.3 ./1.3/DialerStyle.qml DialerHandStyle 1.3 ./1.3/DialerHandStyle.qml ComboButtonStyle 1.3 ./1.3/ComboButtonStyle.qml PullToRefreshStyle 1.3 ./1.3/PullToRefreshStyle.qml PageHeadStyle 1.3 ./1.3/PageHeadStyle.qml Palette 1.3 ./1.3/Palette.qml ButtonStyle 1.3 ./1.3/ButtonStyle.qml SliderStyle 1.3 ./1.3/SliderStyle.qml SwitchStyle 1.3 ./1.3/SwitchStyle.qml CheckBoxStyle 1.3 ./1.3/CheckBoxStyle.qml ListItemStyle 1.3 ./1.3/ListItemStyle.qml internal SliderUtils 1.3/sliderUtils.js internal ColorUtils 1.3/colorUtils.js PageHeaderStyle 1.3 ./1.3/PageHeaderStyle.qml BottomEdgeHintStyle 1.3 ./1.3/BottomEdgeHintStyle.qml BottomEdgeStyle 1.3 ./1.3/BottomEdgeStyle.qml ToolbarStyle 1.3 ./1.3/ToolbarStyle.qml internal SectionsForPageHead ./1.3/SectionsForPageHead.qml internal SectionsForPageHeadStyle ./1.3/SectionsForPageHeadStyle.qml ./src/Ubuntu/Components/Themes/SuruDark/0000755000015600001650000000000012700370701020255 5ustar jenkinsjenkins./src/Ubuntu/Components/Themes/SuruDark/1.3/0000755000015600001650000000000012700370701020556 5ustar jenkinsjenkins./src/Ubuntu/Components/Themes/SuruDark/1.3/SuruDarkNormal.qml0000644000015600001650000000316512700370701024207 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes 1.3 PaletteValues { background: UbuntuColors.jet backgroundText: "#FFFFFF" backgroundSecondaryText: UbuntuColors.silk backgroundTertiaryText: UbuntuColors.ash base: UbuntuColors.graphite baseText: UbuntuColors.ash foreground: UbuntuColors.inkstone foregroundText: "#FFFFFF" raised: "#FFFFFF" raisedText: UbuntuColors.slate raisedSecondaryText: UbuntuColors.silk overlay: UbuntuColors.inkstone overlayText: "#FFFFFF" overlaySecondaryText: UbuntuColors.slate field: UbuntuColors.jet fieldText: "#FFFFFF" focus: UbuntuColors.orange focusText: "#FFFFFF" selection: Qt.rgba(UbuntuColors.blue.r, UbuntuColors.blue.g, UbuntuColors.blue.b, 0.4) selectionText: "#FFFFFF" positive: UbuntuColors.green positiveText: "#FFFFFF" negative: UbuntuColors.red negativeText: "#FFFFFF" activity: UbuntuColors.blue activityText: "#FFFFFF" } ./src/Ubuntu/Components/Themes/SuruDark/1.3/TabBarStyle.qml0000644000015600001650000000146012700370701023446 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components.Themes.Ambiance 1.3 as Ambiance Ambiance.TabBarStyle { indicatorImageSource: Qt.resolvedUrl("../artwork/chevron.png") } ./src/Ubuntu/Components/Themes/SuruDark/1.3/SuruDarkSelected.qml0000644000015600001650000000170712700370701024507 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes 1.3 SuruDarkNormal { background: UbuntuColors.inkstone backgroundText: UbuntuColors.blue backgroundTertiaryText: UbuntuColors.blue base: UbuntuColors.ash baseText:UbuntuColors.blue foreground: UbuntuColors.slate } ./src/Ubuntu/Components/Themes/SuruDark/1.3/Palette.qml0000644000015600001650000000424412700370701022673 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ //![0] import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes 1.3 Palette { normal: SuruDarkNormal {} disabled: SuruDarkNormal { field: UbuntuColors.inkstone // inactive is 30% transparent normal Component.onCompleted: { for (var p in normal) { // skip objectName and all change signals if (p == "objectName"|| p.indexOf("Changed") > 0 || p == "field" || p == "foreground" ) continue; disabled[p] = Qt.rgba(normal[p].r, normal[p].g, normal[p].b, 0.3); } } } // selected differs from normal in background, base, foreground selected: SuruDarkSelected {} // selected differs from normal in background, base, foreground selectedDisabled: SuruDarkSelected { background: UbuntuColors.inkstone base: UbuntuColors.inkstone foreground: UbuntuColors.inkstone // inactive is 30% transparent normal Component.onCompleted: { for (var p in selected) { // skip objectName and all change signals if (p == "objectName"|| p.indexOf("Changed") > 0 || p == "field" || p == "foreground" ) continue; selectedDisabled[p] = Qt.rgba(selected[p].r, selected[p].g, selected[p].b, 0.3); } } } highlighted: SuruDarkNormal { background: UbuntuColors.slate base: UbuntuColors.graphite foreground: UbuntuColors.slate } } //![0] ./src/Ubuntu/Components/Themes/SuruDark/1.3/OptionSelectorStyle.qml0000644000015600001650000000137112700370701025265 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components.Themes.Ambiance 1.3 OptionSelectorStyle { id: suruDarkStyle } ./src/Ubuntu/Components/Themes/SuruDark/artwork/0000755000015600001650000000000012700370701021746 5ustar jenkinsjenkins./src/Ubuntu/Components/Themes/SuruDark/artwork/chevron@27.png0000644000015600001650000000306512700370701024375 0ustar jenkinsjenkinsPNG  IHDRD}>0tEXtSoftwareAdobe ImageReadyqe<$iTXtXML:com.adobe.xmp 1IDATxKHQgI[-ZkZ(-ʍJ=D 1ZG"QEH0"AC4]" $3%h!.|?p=W?ύ~ =`4 aeD"IBk{qwIHSJASJq-hE~K5/AR׋H) @ ~dkI/Paǃ>sťӠmZϔ>o\ ѻSzkHj`r@֑Ϙ-uNYmjHi1R"!&ԐL\b;ZR*L?SCәҒRMnfrtjH))&`#Siclq ՐR=!zAbL0zK4Zw,P%}1ZRW%"Pf')x֤AG 69=ު4l -&/^{/9.&eIqQ0qp]sHs̨ݎ=&i7ƬI΋8>[|/4:vhY_W:";*&wh[2wSV̶HK+y&>I@E}2yW %.kHsuG4MU@hH'yFގڒxhϱEwI鎼h/e3Mp8UQmڍB]=T$r's,e/IENDB`./src/Ubuntu/Components/Themes/SuruDark/SuruDark.pro0000644000015600001650000000104112700370701022533 0ustar jenkinsjenkinsTARGETPATH = Ubuntu/Components/Themes/SuruDark PARENT_THEME_FILE = parent_theme ARTWORK_FILES += artwork/chevron@27.png QML_FILES += 1.2/MainViewStyle.qml \ 1.2/OptionSelectorStyle.qml \ 1.2/Palette.qml \ 1.2/TabBarStyle.qml \ 1.3/OptionSelectorStyle.qml \ 1.3/SuruDarkNormal.qml \ 1.3/SuruDarkSelected.qml \ 1.3/Palette.qml \ 1.3/TabBarStyle.qml \ $$ARTWORK_FILES \ $$PARENT_THEME_FILE load(ubuntu_qml_module) ./src/Ubuntu/Components/Themes/SuruDark/1.2/0000755000015600001650000000000012700370701020555 5ustar jenkinsjenkins./src/Ubuntu/Components/Themes/SuruDark/1.2/TabBarStyle.qml0000644000015600001650000000146012700370701023445 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components.Themes.Ambiance 0.1 as Ambiance Ambiance.TabBarStyle { indicatorImageSource: Qt.resolvedUrl("../artwork/chevron.png") } ./src/Ubuntu/Components/Themes/SuruDark/1.2/Palette.qml0000644000015600001650000000264112700370701022671 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Components.Themes 0.1 Palette { normal: PaletteValues { background: "#221E1C" backgroundText: "#5D5D5D78" base: "#19000000" baseText: "#FFFFFF" foreground: "#888888" foregroundText: "#FFFFFF" overlay: "#F2F2F2" overlayText: "#888888" field: "#19000000" fieldText: "#7F7F7F7F" } selected: PaletteValues { background: "#88D6D6D6" // FIXME: not from design backgroundText: "#FFFFFF" selection: Qt.rgba(UbuntuColors.blue.r, UbuntuColors.blue.g, UbuntuColors.blue.b, 0.2) foreground: UbuntuColors.orange foregroundText: UbuntuColors.darkGrey field: "#FFFFFF" fieldText: "#888888" } } ./src/Ubuntu/Components/Themes/SuruDark/1.2/MainViewStyle.qml0000644000015600001650000000136312700370701024033 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components.Themes.Ambiance 0.1 MainViewStyle { backgroundSource: "" } ./src/Ubuntu/Components/Themes/SuruDark/1.2/OptionSelectorStyle.qml0000644000015600001650000000137112700370701025264 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components.Themes.Ambiance 0.1 OptionSelectorStyle { id: suruDarkStyle } ./src/Ubuntu/Components/Themes/SuruDark/qmldir0000644000015600001650000000025512700370701021472 0ustar jenkinsjenkinsmodule Ubuntu.Components.Themes.SuruDark #version 1.1 Palette 1.1 ./1.2/Palette.qml #version 1.3 Palette 1.3 ./1.3/Palette.qml SuruDarkNormal 1.3 ./1.3/SuruDarkNormal.qml ./src/Ubuntu/Components/Themes/SuruDark/parent_theme0000644000015600001650000000004212700370701022647 0ustar jenkinsjenkinsUbuntu.Components.Themes.Ambiance ./src/Ubuntu/Components/Themes/1.2/0000755000015600001650000000000012700370701017015 5ustar jenkinsjenkins./src/Ubuntu/Components/Themes/1.2/Palette.qml0000644000015600001650000000356212700370701021134 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype Palette \inqmlmodule Ubuntu.Components.Themes 0.1 \ingroup theming \brief Palette of colors from the theme that widgets use to draw themselves. Palette provides access to colors defined by the current theme. The actual color palette to use depends on the state of the widget being drawn. A color palette (\l PaletteValues) has various roles to choose from depending on what part of the widget is being drawn (the base of the widget, the foreground, etc.). For each color there is a corresponding 'text' color that is guaranteed to provide good legibility for text or icons placed on top of a background of the corresponding color. Example of a Text on top of a background Rectangle: \qml Item { Rectangle { color: Theme.palette.normal.base } Text { color: Theme.palette.normal.baseText } } \endqml */ QtObject { /*! Color palette to use when the widget is not in any particular state. */ property PaletteValues normal /*! Color palette to use when the widget is selected, for example when a tab is the current one. */ property PaletteValues selected } ./src/Ubuntu/Components/Themes/1.2/PaletteValues.qml0000644000015600001650000000442012700370701022306 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 /*! \qmltype PaletteValues \inqmlmodule Ubuntu.Components.Themes 0.1 \ingroup theming \brief Color values used for a given widget state. */ QtObject { /*! Color applied to the background of the application. */ property color background /*! Color applied to elements placed on top of the \l background color. Typically used for labels and images. */ property color backgroundText /*! Color applied to the background of widgets. */ property color base /*! Color applied to elements placed on top of the \l base color. Typically used for labels and images. */ property color baseText /*! Color applied to widgets on top of the base colour. */ property color foreground /*! Color applied to elements placed on top of the \l foreground color. Typically used for labels and images. */ property color foregroundText /*! Color applied to the background of widgets floating over other widgets. For example: popovers, Toolbar. */ property color overlay /*! Color applied to elements placed on top of the \l overlay color. Typically used for labels and images. */ property color overlayText /*! Colour applied to the backgrouhnd of text input fields. */ property color field /*! Color applied to elements placed on top of the \l field color. Typically used for labels and images. */ property color fieldText /*! Color applied to selected text in editable components. */ property color selection } ./src/Ubuntu/Components/Themes/qmldir0000644000015600001650000000027612700370701017735 0ustar jenkinsjenkinsmodule Ubuntu.Components.Themes Palette 0.1 ./1.2/Palette.qml PaletteValues 0.1 ./1.2/PaletteValues.qml #version 1.3 Palette 1.3 ./1.3/Palette.qml PaletteValues 1.3 ./1.3/PaletteValues.qml ./src/Ubuntu/Components/Themes/ThemesModule.pro0000644000015600001650000000042612700370701021634 0ustar jenkinsjenkinsTARGETPATH = Ubuntu/Components/Themes ARTWORK_FILES = $$system(find artwork -type f) QML_FILES += 1.2/Palette.qml \ 1.2/PaletteValues.qml \ 1.3/Palette.qml \ 1.3/PaletteValues.qml \ $$ARTWORK_FILES load(ubuntu_qml_module) ./src/Ubuntu/Components/Themes/SuruGradient/0000755000015600001650000000000012700370701021131 5ustar jenkinsjenkins./src/Ubuntu/Components/Themes/SuruGradient/deprecated0000644000015600001650000000000012700370701023142 0ustar jenkinsjenkins./src/Ubuntu/Components/Themes/SuruGradient/SuruGradient.pro0000644000015600001650000000071512700370701024272 0ustar jenkinsjenkinsTARGETPATH = Ubuntu/Components/Themes/SuruGradient PARENT_THEME_FILE = parent_theme DEPRECATED_FILE = deprecated ARTWORK_FILES += artwork/chevron@27.png \ artwork/chevron_down@30.png \ artwork/tick@30.png \ QML_FILES += MainViewStyle.qml \ OptionSelectorStyle.qml \ Palette.qml \ TabBarStyle.qml \ $$ARTWORK_FILES \ $$PARENT_THEME_FILE \ $$DEPRECATED_FILE load(ubuntu_qml_module) ./src/Ubuntu/Components/Themes/SuruGradient/TabBarStyle.qml0000644000015600001650000000143512700370701024023 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components.Themes.Ambiance 0.1 as Ambiance Ambiance.TabBarStyle { indicatorImageSource: "artwork/chevron.png" } ./src/Ubuntu/Components/Themes/SuruGradient/artwork/0000755000015600001650000000000012700370701022622 5ustar jenkinsjenkins./src/Ubuntu/Components/Themes/SuruGradient/artwork/tick@30.png0000644000015600001650000000743512700370701024536 0ustar jenkinsjenkinsPNG  IHDRZZ8AtEXtSoftwareAdobe ImageReadyqe<$iTXtXML:com.adobe.xmp IDATx PWǧgP7xDE+Phh\1 ⁂JEMJ*nX-+n$@4uA(V*7.^Ȍ0}My333گU=~_? IR"@-Z-Z-Z-Z"hZ"h8x?g zPhox,C8hO5 0%p` ld0ܻwG QptYFmh6~K c-50`ZG"F-d) >J0Uii+C~4pu2h/Gn!F4>HQ,SQ\\4>"bD_WD} L47dzZq& 3rR b[__ՇX #!h N6t.lXRx $QlMxu.^]-A2DE{$<l"/@DL̻`'٩{Q"8[3[5u+ kwb OpFEKAmMYӦŕ6 kä(D:l*+Z@WUT\3%ܝR04Y&2Hr[|CI^o0aQLI6bɐtEz(3烿1#MK[+Vb2C Q0s&nUŀ񟵴sX m YB*2d' Gߝ=;몪5f7B"Zѣw^obMXؠ0Bxzjj.(rccƼ 8c\* PкJG;Ǐۄ|8e-eho(e+-䂯^(5 HXXϷs;h`o~WFA2|8vFBB|pu6lٹs/ "zؓM"lD"ss7-Yb?e^\ddD"(_dqB rڵɄ!lr! mlQ{۰ģymhcѢ+'O~wN Bڛgfe(BplMK:$X[R%#NѼݻ'EE/Tx&%<{yh-Kҳ0Sƿq!H"[#!!HoIL= =G(vFK0,Ě_ox;'ӖG:AN-!!%AcH,<& ؂aWW_ 499y',7_%vgё[!\-,ƦCl ;/j֧}|q&g-r=-%8KK>}f hԻf)=yy4@fK|dgre\)(9r.:tpϞ*>. ; g~⢘ѣGz_Y>q &snl}ItCT*7oV-ٳ|q^Ç%Zgk2{Ɏmp!Po/_3ZݳeGh߂d_hGq֡>$Or]h0oZnq7zȈuS]ݕaa9Ҳs_p[дp:t[$vCH_rf$"_⫀4D Xa0tEXtSoftwareAdobe ImageReadyqe<$iTXtXML:com.adobe.xmp hVmIDATxڬYkLTG޽.oP "`ҠH)1ZF*5#`%b!ŷ шAmAIJ Vy캻ά30̲L0s}sΙ3gŢWM,{3QEh? ==t4I,rR; "uuUljn!X 䛩YLTJwʤ/臐;K^ *llR*%`kk:b…夦 &/^*$< lr#JO2||#ϟ^d<[;ygΌJھ7̒ .Rn0bX:;4t ((2~x?'OMpwwV]])#C A iijk{p7)<<ݻ+3`z)%%F pd/_NYtM);w([9X,_ lt|oܺ?m79*MST^ #Wiitjv2kצe*rW4l  [jF2T4*gAb)j5x/3'~ży HɇL`FD.wڵ{}: Śq*Ea6o Gf6> egd4j4J23SWr "`<2tt<^hMx;l;"NzYznɇ;:fO<)x4[MWxxLZbS4q1d.2~|²;(X-Z[E{|}}ڃ#u5dNP辫'i6 E´vΝ#y,q;w]"k*!GL =1E$ݡ]UDh{|7[]Kd+:ۅH@JoD[mĀ1azAwCqC9sԃvme>--Qe@(u܍N:l`<.CY<@>Z `k^$=mo- j+(ًYP` >}J>F9(G6;΀5ZQ<7ͦ_OP ,de";:#cCȭa Y YZd=uxkjj/i..4 C̡k$WGâdmr&]~9\Vt=ռ /^>MJJh>9:e+XIC WS=<:5kk׮_ڶJĦOb&?LL\QlYZKGRW^G՚5Yg㕕W#ZFCI2߬ja,:/^\YTT:[MGH^KK2*n[?HI@˅ȉ>O^ȈCRP*aJFg0BX61fgA}6s9qO໎ؒkoIENDB`./src/Ubuntu/Components/Themes/SuruGradient/artwork/chevron_down@30.png0000644000015600001650000000505712700370701026275 0ustar jenkinsjenkinsPNG  IHDR<<:rtEXtSoftwareAdobe ImageReadyqe<$iTXtXML:com.adobe.xmp IDATx[ LG=P jE 퉩5j JUX1mF%5JJJm#[AmԚ^[QmPTۻ,!OLIvg7͛o'~]jz]?k` Xk5` XGZ7Fk tR]z,B%pZ0H"xuNXؐ2Gi:y-[ܡ6XLÇ>=#8JET=_~&^L? nنvyY19 |>_{myKJs0O6J8P߯kHHfn#3reh>bUʏ93uȉ FEΗrΝ{>YkDtʚ;„"ĬiܸFFf,;{5&Ј0gly~ҋ_]Xt{%G!_{HrHM,r6[YʴiSSl$mlUQxSw 1.EEJA?3XEyΜ9{Q% c,-))drL<1`0p~n’% QG/^b|AAދw[64Ii]./<W^n4#X_ EzI|RHRGrs:uV6tS`c2&%b-@㽥Ī,a;ZRݓ v;U 90hpV_VVZrY$Ah/HKS4f"lNXqp1 ?Vgd,>$Y`;; A5]eˆAajmmmG߷bŚp~Ha{bfH}/44$A;>/Z9I̒k$-bIӌA2NÇJKN$Ǩ\s*//8?0elXzEubU_\r @Yc[[LHsAT'BF3`" yʕ__q󆔗5{ |IɔvC99k^B.ʚu "16׵RD|IISԒDƍ[g"_V{^n.^tnUȠ2MaգT0"M4Kl⑛7fxxXdOY--NŲVXX#%`(S԰F\]lr-*R9h  x\ǎUU/][>XDUrbО''z49S!vYǏfj)]zϞm**>IIG牵RbtZȵ?aaۍ] ]OI'R "$C7J<” *Fp@0+(R]5FH@q=+IjnFe FիQς (_L']Y+Jc1`ZWڿh5` XS[IENDB`./src/Ubuntu/Components/Themes/SuruGradient/Palette.qml0000644000015600001650000000241712700370701023246 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components.Themes 0.1 Palette { normal: PaletteValues { background: "#5E2750" backgroundText: "#33F3F3E7" base: "#19000000" baseText: "#FFFFFF" foreground: "#888888" foregroundText: "#FFFFFF" overlay: "#F5F5F5" overlayText: "#888888" field: "#19000000" fieldText: "#7F7F7F7F" } selected: PaletteValues { background: "#88D6D6D6" // FIXME: not from design backgroundText: "#FFFFFF" foreground: "#DD4814" foregroundText: "#FFFFFF" field: "#FFFFFF" fieldText: "#888888" } } ./src/Ubuntu/Components/Themes/SuruGradient/MainViewStyle.qml0000644000015600001650000000136312700370701024407 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components.Themes.Ambiance 0.1 MainViewStyle { backgroundSource: "" } ./src/Ubuntu/Components/Themes/SuruGradient/qmldir0000644000015600001650000000012312700370701022340 0ustar jenkinsjenkinsmodule Ubuntu.Components.Themes.SuruGradient #version 1.1 Palette 1.1 Palette.qml ./src/Ubuntu/Components/Themes/SuruGradient/OptionSelectorStyle.qml0000644000015600001650000000153612700370701025643 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components.Themes.Ambiance 0.1 OptionSelectorStyle { id: suruGradientStyle chevron: "artwork/chevron_down.png" tick: "artwork/tick.png" colourComponent: false } ./src/Ubuntu/Components/Themes/SuruGradient/parent_theme0000644000015600001650000000004212700370701023523 0ustar jenkinsjenkinsUbuntu.Components.Themes.Ambiance ./src/Ubuntu/Components/Themes/Themes.pro0000644000015600001650000000025312700370701020464 0ustar jenkinsjenkinsTEMPLATE = subdirs SUBDIRS += ThemesModule.pro \ Ambiance \ SuruDark \ #deprecated, but we keep for compatibility SuruGradient ./src/Ubuntu/Layouts/0000755000015600001650000000000012700370701014603 5ustar jenkinsjenkins./src/Ubuntu/Layouts/LayoutsModule.pro0000644000015600001650000000133412700370701020134 0ustar jenkinsjenkinsTEMPLATE=aux CONFIG+=ubuntu_qml_module uri = Ubuntu.Layouts installPath = $$[QT_INSTALL_QML]/$$replace(uri, \\., /) # qmldir QMLDIR_FILE = qmldir # define deployment for found deployables qmldir_file.installPath = $$installPath qmldir_file.files = $$QMLDIR_FILE plugins_qmltypes.path = $$installPath plugins_qmltypes.files = plugins.qmltypes # Silence spam on stderr due to fonts # https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1256999 # https://bugreports.qt-project.org/browse/QTBUG-36243 plugins_qmltypes.extra = $$[QT_INSTALL_BINS]/qmlplugindump -notrelocatable Ubuntu.Layouts 0.1 ../../ 2>/dev/null > $(INSTALL_ROOT)/$$installPath/plugins.qmltypes UBUNTU_QML_MODULE_FILES += qmldir_file INSTALLS += plugins_qmltypes ./src/Ubuntu/Layouts/plugin/0000755000015600001650000000000012700370716016107 5ustar jenkinsjenkins./src/Ubuntu/Layouts/plugin/ulplugin.h0000644000015600001650000000207112700370701020111 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef PLUGIN_PLUGIN_H #define PLUGIN_PLUGIN_H #include class PluginPlugin : public QQmlExtensionPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") public: void registerTypes(const char *uri); private: void registerTypeVersions(const char *uri, int major, int minor); }; #endif // PLUGIN_PLUGIN_H ./src/Ubuntu/Layouts/plugin/ulconditionallayout.cpp0000644000015600001650000001252012700370701022707 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #define foreach Q_FOREACH #include #undef foreach #include "ulconditionallayout.h" #include "ulconditionallayout_p.h" #include "ullayouts.h" #include "ullayouts_p.h" ULConditionalLayoutPrivate::ULConditionalLayoutPrivate(ULConditionalLayout *qq) : q_ptr(qq), when(0), component(0) { } ULLayouts *ULConditionalLayoutPrivate::layouts() { Q_Q(ULConditionalLayout); return qobject_cast(q->parent()); } /*! * \qmltype ConditionalLayout * \instantiates ULConditionalLayout * \inqmlmodule Ubuntu.Layouts 1.0 * \ingroup ubuntu-layouts * \brief ConditionalLayout defines the layout of a given form factor. * * ConditionalLayout is a non-visual element defining the actual layout to be applied * when a given condition evaluates to true. The condition can be any valid boolean * JavaScript expression. * * As Layouts can be nested, it is recommended to choose properties of the Layouts item, * often width and height, when defining the condition. Other elements like Screen * orientation can also be used to define the layout activation condition. * * There must be only a single component defined in the ConditionalLayout which will be * instantiated upon activation. * * Each conditional layout must be named with a string, which identifies the layout * when activated. * * \qml * Layouts { * id: layouts * width: units.gu(40) * height: units.gu(40) * layouts: [ * ConditionalLayout { * name: "flow" * when: layouts.width > units.gu(60) * Flow { * anchors.fill: parent * spacing: units.dp(3) * flow: Flow.LeftToRight * ItemLayout { * item: "item1" * width: units.gu(30) * height: units.gu(20) * } * ItemLayout { * item: "item2" * width: units.gu(30) * height: units.gu(20) * } * ItemLayout { * item: "item3" * width: units.gu(30) * height: units.gu(20) * } * } * } * ] * * Column { * spacing: units.dp(2) * Button { * text: "Button #1" * Layouts.item: "item1" * } * Button { * text: "Button #2" * Layouts.item: "item2" * } * Button { * text: "Button #3" * Layouts.item: "item3" * } * } * } * \endqml * * All Items to be managed by the Layouts engine must identify themselves by setting * the Layouts.item attached property to a unique name (string). These unique names * are then used by the ItemLayout component, so can apply the new layout to the * correct Item. * * \sa {ItemLayout} */ ULConditionalLayout::ULConditionalLayout(QObject *parent) : QObject(parent), d_ptr(new ULConditionalLayoutPrivate(this)) { } ULConditionalLayout::~ULConditionalLayout() { } /*! * \qmlproperty string ConditionalLayout::name * This property defines the name of the layout. Within the definition of Layouts, * these names should be unique for each layout. * \sa Layouts */ QString ULConditionalLayout::layoutName() const { Q_D(const ULConditionalLayout); return d->name; } void ULConditionalLayout::setLayoutName(const QString &name) { Q_D(ULConditionalLayout); if (name == d->name) { return; } d->name = name; } /*! * \qmlproperty bool ConditionalLayout::when * This property defines the condition that when evaluating to true, chooses this * ConditionalLayout to become the active layout. * When two ConditionalLayouts \b when condition is evaluated to true, the first * one declared in the layouts list is chosen. */ QQmlBinding *ULConditionalLayout::when() const { Q_D(const ULConditionalLayout); return d->when; } void ULConditionalLayout::setWhen(QQmlBinding *when) { Q_D(ULConditionalLayout); d->when = when; // re-layout ULLayouts *layouts = qobject_cast(parent()); if (layouts) { layouts->d_ptr->updateLayout(); } } /*! * \qmlproperty Component ConditionalLayout::layout * \default * Default property holding the definition component of the layout. The component * will be instantiated once the condition evaluates to true. */ QQmlComponent *ULConditionalLayout::layout() const { Q_D(const ULConditionalLayout); return d->component; } void ULConditionalLayout::setLayout(QQmlComponent *component) { Q_D(ULConditionalLayout); d->component = component; } ./src/Ubuntu/Layouts/plugin/ulitemlayout.h0000644000015600001650000000224412700370701021011 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef ULITEMLAYOUT_H #define ULITEMLAYOUT_H #include class ULItemLayout : public QQuickItem { Q_OBJECT Q_DISABLE_COPY(ULItemLayout) Q_PROPERTY(QString item READ item WRITE setItem NOTIFY itemChanged) public: explicit ULItemLayout(QQuickItem *parent = 0); ~ULItemLayout(); QString item() const; void setItem(const QString &value); Q_SIGNALS: void itemChanged(); private: QString m_itemName; }; #endif // ULITEMLAYOUT_H ./src/Ubuntu/Layouts/plugin/propertychanges_p.h0000644000015600001650000001166712700370714022025 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef LAYOUTACTION_P_H #define LAYOUTACTION_P_H #include #include #define foreach Q_FOREACH //workaround to fix private includes #include // for QmlBinding #undef foreach #include #include class PropertyAction { public: enum Type {Binding, Value}; PropertyAction(const PropertyAction &other); PropertyAction(); PropertyAction(QObject *item, const QString &name, Type type = Binding); PropertyAction(QObject *item, const QString &name, QQmlContext *context, const QVariant &value, Type type = Value); void setValue(const QVariant &value); void setTargetBinding(QQmlAbstractBinding *binding, bool deletable); void apply(); void reset(); void revert(bool reset = false); // members Type type; QQmlProperty property; #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) QQmlAbstractBinding::Ptr fromBinding; QQmlAbstractBinding::Ptr toBinding; #else QQmlAbstractBinding *fromBinding; QWeakPointer toBinding; #endif QVariant fromValue; QVariant toValue; bool toValueSet:1; bool deleteFromBinding:1; bool deleteToBinding:1; }; class QQuickItem; class PropertyChange { public: enum Priority { High, Normal, Low, MaxPriority }; PropertyChange(Priority priority); PropertyChange(QQuickItem *target, const QString &property, const QVariant &value, Priority priority = Low); PropertyChange(QQuickItem *target, const QString &property, const QQmlScriptString &script, QQmlContext *scriptContext, Priority priority = Low); virtual ~PropertyChange() {} virtual void saveState(); virtual void apply(); virtual void revert(); inline Priority priority() { return actionPriority; } inline QQmlProperty property() const { return action.property; } inline PropertyAction &actionObject() { return action; } inline void resetWhenReverted(bool doReset) { resetOnRevert = doReset; } protected: Priority actionPriority; bool resetOnRevert; PropertyAction action; }; class PropertyBackup: public PropertyChange { public: PropertyBackup(QQuickItem *target, const QString &property); }; class ParentChange : public PropertyChange { public: ParentChange(QQuickItem *item, QQuickItem *targetParent, bool topmostChild); void apply(); private: QQuickItem *newParent; bool topmostChild; }; class AnchorChange : public PropertyChange { public: AnchorChange(QQuickItem *item, const QString &anchor, QQuickItem *target, const QString &targetAnchor = QString()); void apply(); void revert(); private: bool active; }; class ItemStackBackup : public PropertyChange { public: ItemStackBackup(QQuickItem *item); void apply() {} void revert(); protected: virtual void saveState(); QQuickItem *target; QQuickItem *prevItem; private: friend class ULLayouts; }; class QQuickAnchors; class AnchorBackup : public PropertyChange { public: AnchorBackup(QQuickItem *item); void apply(); void revert(); protected: virtual void saveState(); enum Anchor{ Left = 0, Right, Top, Bottom, HCenter, VCenter, Baseline, MaxAnchor }; enum Margins{ Margins = 0, LeftMargin, RightMargin, TopMargin, BottomMargin, HCenterOffset, VCenterOffset, BaselineOffset, MaxMargins }; inline QQuickAnchors::Anchor anchor(Anchor id) { return (QQuickAnchors::Anchor)(1 << (int)id); } QQuickAnchors *anchorsObject; QQuickAnchors::Anchors used; QList actions; }; class ULConditionalLayoutAttached; class ChangeList { public: ChangeList(){} ~ChangeList(); void apply(); void revert(); void clear(); ChangeList &addChange(PropertyChange *change); ChangeList &addParentChange(QQuickItem *item, QQuickItem *newParent, bool topmostItem); private: QList changes[PropertyChange::MaxPriority]; QList unifiedChanges(); }; #endif // LAYOUTACTION_P_H ./src/Ubuntu/Layouts/plugin/ullayouts.h0000644000015600001650000000500412700370701020312 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef ULLAYOUTS_H #define ULLAYOUTS_H #include #include "ulconditionallayout.h" class ULLayoutsAttached : public QObject { Q_OBJECT Q_PROPERTY(QString item READ item WRITE setItem NOTIFY itemChanged) public: explicit ULLayoutsAttached(QObject *parent = 0); //getter/setter QString item() const; void setItem(const QString &name); bool isValid(); Q_SIGNALS: void itemChanged(); private Q_SLOTS: void validateAttachedProperties(); private: QString m_name; bool m_valid; }; class ULLayoutsPrivate; class ULLayouts : public QQuickItem { Q_OBJECT Q_DISABLE_COPY(ULLayouts) Q_PROPERTY(QString currentLayout READ currentLayout NOTIFY currentLayoutChanged DESIGNABLE false) Q_PROPERTY(QQmlListProperty layouts READ layouts DESIGNABLE false) Q_PROPERTY(QQmlListProperty data READ data DESIGNABLE false) Q_PROPERTY(QQmlListProperty children READ children DESIGNABLE false) Q_CLASSINFO("DefaultProperty", "data") public: explicit ULLayouts(QQuickItem *parent = 0); ~ULLayouts(); static ULLayoutsAttached * qmlAttachedProperties(QObject *owner); QString currentLayout() const; QList layoutList(); QQuickItem *contentItem() const; Q_SIGNALS: void currentLayoutChanged(); protected: void componentComplete(); void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); private: QQmlListProperty layouts(); QQmlListProperty data(); QQmlListProperty children(); friend class ULConditionalLayout; Q_DECLARE_PRIVATE(ULLayouts) QScopedPointer d_ptr; }; QML_DECLARE_TYPE(ULLayouts) QML_DECLARE_TYPEINFO(ULLayouts, QML_HAS_ATTACHED_PROPERTIES) #endif // ULLAYOUTS_H ./src/Ubuntu/Layouts/plugin/propertychanges.cpp0000644000015600001650000003512512700370714022034 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "propertychanges_p.h" #include "ullayouts_p.h" #include "ullayouts.h" #include #include #include #include /****************************************************************************** * PropertyAction * Saves property state, applies target values or bindings and restores property * saved values. Distinguishes Binding and Value types, which is relevant when * the property is restored to its defaults. */ PropertyAction::PropertyAction() : type(Value) , fromBinding(0) , toValueSet(false) , deleteFromBinding(false) , deleteToBinding(false) { } PropertyAction::PropertyAction(const PropertyAction &other) : type(other.type) , property(other.property) , fromBinding(other.fromBinding) , toBinding(other.toBinding) , fromValue(other.fromValue) , toValue(other.toValue) , toValueSet(other.toValueSet) , deleteFromBinding(other.deleteFromBinding) , deleteToBinding(other.deleteToBinding) { } PropertyAction::PropertyAction(QObject *item, const QString &name, Type type) : type(type) , property(item, name, qmlContext(item)) , fromBinding(QQmlPropertyPrivate::binding(property)) , fromValue(property.read()) , toValueSet(false) , deleteFromBinding(false) , deleteToBinding(false) { } PropertyAction::PropertyAction(QObject *item, const QString &name, QQmlContext *context, const QVariant &value, Type type) : type(type) , property(item, name, context) , fromBinding(QQmlPropertyPrivate::binding(property)) , fromValue(property.read()) , toValue(value) , toValueSet(value.isValid()) , deleteFromBinding(false) , deleteToBinding(false) { } /* * Set target value. */ void PropertyAction::setValue(const QVariant &value) { toValue = value; toValueSet = true; } /* * Set target binding and whether it can be deleted upon reset. */ void PropertyAction::setTargetBinding(QQmlAbstractBinding *binding, bool deletable) { #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) toBinding = binding; #else toBinding = QQmlAbstractBinding::getPointer(binding); #endif deleteToBinding = deletable; } /* * Apply property action by setting the target binding (toBinding) or by setting the * target value if the value is set. */ void PropertyAction::apply() { if (toBinding) { #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) QQmlAbstractBinding::Ptr binding(QQmlPropertyPrivate::binding(property)); QQmlPropertyPrivate::setBinding(property, toBinding.data()); #else QQmlAbstractBinding *binding = QQmlPropertyPrivate::setBinding(property, toBinding.data()); #endif if (binding != fromBinding || (binding == fromBinding && deleteFromBinding)) { #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) if (binding == fromBinding) { fromBinding.reset(); fromBinding=0; } binding->removeFromObject(); #else binding->destroy(); if (binding == fromBinding) { fromBinding = 0; } #endif } } else if (toValueSet) { if (!property.object()->setProperty(property.name().toLocal8Bit(), toValue)) { qmlInfo(property.object()) << "Layouts: updating property \"" << property.name() << "\" failed."; } } } /* * Resets the hosted property and removes its bindings. */ void PropertyAction::reset() { property.reset(); if (fromBinding) { QQmlPropertyPrivate::setBinding(property, 0); if (deleteFromBinding) { #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) fromBinding->removeFromObject(); fromBinding.reset(); #else fromBinding->destroy(); fromBinding = 0; #endif deleteFromBinding = false; } } } /* * Reverts the property to its defaults. Restores original bindings and in case * of Value types restores their original values. */ void PropertyAction::revert(bool reset) { if (reset) { property.reset(); } if (fromBinding) { #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) QQmlAbstractBinding::Ptr revertedBinding(QQmlPropertyPrivate::binding(property)); QQmlPropertyPrivate::setBinding(property, fromBinding.data()); #else QQmlAbstractBinding *revertedBinding = QQmlPropertyPrivate::setBinding(property, fromBinding); #endif if (revertedBinding && (revertedBinding != fromBinding) && ((revertedBinding != toBinding.data()) || (revertedBinding == toBinding.data() && deleteToBinding))) { #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) revertedBinding->removeFromObject(); revertedBinding.reset(); #else revertedBinding->destroy(); #endif } } else if (toBinding && QQmlPropertyPrivate::binding(property) == toBinding.data()) { QQmlPropertyPrivate::setBinding(property, 0); if (deleteToBinding) { #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) toBinding->removeFromObject(); toBinding.reset(); #else toBinding.data()->destroy(); toBinding.clear(); #endif deleteToBinding = false; } } else if (property.isValid() && fromValue.isValid() && (type == Value)) { property.write(fromValue); } } /****************************************************************************** * PropertyChange * Default low priority change. */ PropertyChange::PropertyChange(Priority priority) : actionPriority(priority) , resetOnRevert(true) { } PropertyChange::PropertyChange(QQuickItem *target, const QString &property, const QVariant &value, Priority priority) : actionPriority(priority) , resetOnRevert(true) , action(target, property, PropertyAction::Value) { if (value.isValid()) { action.setValue(value); } } PropertyChange::PropertyChange(QQuickItem *target, const QString &property, const QQmlScriptString &script, QQmlContext *scriptContext, Priority priority) : actionPriority(priority) , resetOnRevert(true) , action(target, property, PropertyAction::Value) { if (!script.isEmpty()) { bool ok = false; qreal value = script.numberLiteral(&ok); if (ok) { action.setValue(value); } else { QQmlBinding *binding = new QQmlBinding(script, target, scriptContext); binding->setTarget(action.property); #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) action.toBinding = binding; #else action.toBinding = QQmlAbstractBinding::getPointer(binding); #endif action.deleteToBinding = true; } } } void PropertyChange::saveState() { } void PropertyChange::apply() { action.apply(); } void PropertyChange::revert() { action.revert(resetOnRevert); } /****************************************************************************** * PropertyBackup */ PropertyBackup::PropertyBackup(QQuickItem *target, const QString &property) : PropertyChange(target, property, QVariant(), High) { } /****************************************************************************** * ParentChange * Normal priority change, a PropertyChange reparenting an item to the target. */ ParentChange::ParentChange(QQuickItem *item, QQuickItem *targetParent, bool topmostChild) : PropertyChange(item, "parent", qVariantFromValue(targetParent), Normal) , newParent(targetParent) , topmostChild(topmostChild) { } void ParentChange::apply() { // get child items before reparenting QList items = newParent->childItems(); PropertyChange::apply(); if (topmostChild && (items.count() > 0)) { // move the hosted item as topmost child QQuickItem *item = static_cast(action.property.object()); item->stackBefore(items[0]); } } /****************************************************************************** * AnchorChange * Low priority change for anchoring */ AnchorChange::AnchorChange(QQuickItem *item, const QString &anchor, QQuickItem *target, const QString &targetAnchor) : PropertyChange(item, "anchors." + anchor, QVariant()) , active(false) { QQuickAnchors *anchors = item->property("anchors").value(); // check the special cases, like fill, centerIn if (anchor != "fill" || (anchor == "fill" && !anchors->fill())) { active = true; if (targetAnchor.isEmpty()) { action.setValue(qVariantFromValue(target)); } else { action.setValue(target->property(QString("anchors." + targetAnchor).toLocal8Bit())); } } } void AnchorChange::apply() { if (!active) return; PropertyChange::apply(); } void AnchorChange::revert() { if (!active) return; PropertyChange::revert(); } /****************************************************************************** * ItemStackBackup * High priority change backing up the item's stack position. */ ItemStackBackup::ItemStackBackup(QQuickItem *item) : PropertyChange(High) , target(item) , prevItem(0) { } void ItemStackBackup::saveState() { QQuickItem *rewindParent = target->parentItem(); if (!rewindParent) { return; } // save original stack position, but detect layout objects! QList children = rewindParent->childItems(); int index = children.indexOf(target); if (index > 0) { prevItem = children.at(index - 1); } } void ItemStackBackup::revert() { if (prevItem) { target->stackAfter(prevItem); } } /****************************************************************************** * AnchorBackup * High priority change backing up item anchors and margins. */ AnchorBackup::AnchorBackup(QQuickItem *item) : PropertyChange(item, "anchors", QVariant(), High) , anchorsObject(action.fromValue.value()) , used(anchorsObject->usedAnchors()) { if ((used & QQuickAnchors::LeftAnchor) == QQuickAnchors::LeftAnchor) { actions << PropertyAction(item, "anchors.left") << PropertyAction(item, "anchors.leftMargin", PropertyAction::Value); } if ((used & QQuickAnchors::RightAnchor) == QQuickAnchors::RightAnchor) { actions << PropertyAction(item, "anchors.right") << PropertyAction(item, "anchors.rightMargin", PropertyAction::Value); } if ((used & QQuickAnchors::TopAnchor) == QQuickAnchors::TopAnchor) { actions << PropertyAction(item, "anchors.top") << PropertyAction(item, "anchors.topMargin", PropertyAction::Value); } if ((used & QQuickAnchors::BottomAnchor) == QQuickAnchors::BottomAnchor) { actions << PropertyAction(item, "anchors.bottom") << PropertyAction(item, "anchors.bottomMargin", PropertyAction::Value); } if ((used & QQuickAnchors::HCenterAnchor) == QQuickAnchors::HCenterAnchor) { actions << PropertyAction(item, "anchors.horizontalCenter") << PropertyAction(item, "anchors.horizontalCenterOffset", PropertyAction::Value); } if ((used & QQuickAnchors::VCenterAnchor) == QQuickAnchors::VCenterAnchor) { actions << PropertyAction(item, "anchors.verticalCenter") << PropertyAction(item, "anchors.verticalCenterOffset", PropertyAction::Value); } if ((used & QQuickAnchors::BaselineAnchor) == QQuickAnchors::BaselineAnchor) { actions << PropertyAction(item, "anchors.baseline") << PropertyAction(item, "anchors.baselineOffset", PropertyAction::Value); } if (anchorsObject->fill()) { actions << PropertyAction(item, "anchors.fill") << PropertyAction(item, "anchors.margins", PropertyAction::Value); } if (anchorsObject->centerIn()) { actions << PropertyAction(item, "anchors.centerIn") << PropertyAction(item, "anchors.alignWhenCentered", PropertyAction::Value); } } void AnchorBackup::saveState() { // no need to call superclass' saveState() as we don't touch the anchor property // only its properties } void AnchorBackup::apply() { // reset all anchors if (!used) { return; } for (int i = 0; i < actions.count(); i++) { actions[i].reset(); } } void AnchorBackup::revert() { // revert all anchors if (!used) { return; } for (int i = 0; i < actions.count(); i++) { actions[i].revert(true); } } /****************************************************************************** * ChangeList */ ChangeList::~ChangeList() { clear(); } void ChangeList::apply() { QList list = unifiedChanges(); for (int i = 0; i < list.count(); i++) { list[i]->apply(); } } void ChangeList::revert() { // reverse order of apply() QList list = unifiedChanges(); for (int i = list.count() - 1; i >= 0; i--) { list[i]->revert(); } } void ChangeList::clear() { for (int priority = PropertyChange::High; priority < PropertyChange::MaxPriority; priority++) { for (int change = 0; change < changes[priority].count(); change++) { delete changes[priority][change]; } changes[priority].clear(); } } ChangeList &ChangeList::addChange(PropertyChange *change) { if (change && (change->priority() < PropertyChange::MaxPriority)) { change->saveState(); changes[change->priority()] << change; } return *this; } // creates two changes, one for reparenting and one for itemstack backup ChangeList &ChangeList::addParentChange(QQuickItem *item, QQuickItem *newParent, bool topmostItem) { return addChange(new ParentChange(item, newParent, topmostItem)) .addChange(new ItemStackBackup(item)); } QList ChangeList::unifiedChanges() { QList list; for (int priority = PropertyChange::High; priority < PropertyChange::MaxPriority; priority++) { list << changes[priority]; } return list; } ./src/Ubuntu/Layouts/plugin/ulplugin.cpp0000644000015600001650000000237612700370701020454 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "ulplugin.h" #include "ullayouts.h" #include "ulconditionallayout.h" #include "ulitemlayout.h" #include void PluginPlugin::registerTypeVersions(const char *uri, int major, int minor) { qmlRegisterType(uri, major, minor, "Layouts"); qmlRegisterType(uri, major, minor, "ConditionalLayout"); qmlRegisterType(uri, major, minor, "ItemLayout"); } void PluginPlugin::registerTypes(const char *uri) { // @uri Ubuntu.Layouts registerTypeVersions(uri, 0, 1); registerTypeVersions(uri, 1, 0); } ./src/Ubuntu/Layouts/plugin/ullayoutsattached.cpp0000644000015600001650000000466112700370701022353 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "ullayouts.h" #include "ullayouts_p.h" #include #include ULLayoutsAttached::ULLayoutsAttached(QObject *parent) : QObject(parent) , m_valid(false) { // workaround to get notified about attachee completion to check // whether the attachee belongs to a Layouts component or not // connect to one of the attached components to receive completion QQmlComponentAttached *component = QQmlComponent::qmlAttachedProperties(parent); if (component) { QObject::connect(component, SIGNAL(completed()), this, SLOT(validateAttachedProperties())); } } /*! * \internal * Validates the attachee by checking whether its ascendant is a Layouts component or not. */ void ULLayoutsAttached::validateAttachedProperties() { QQuickItem *pl = qobject_cast(parent()); while (pl) { if (qobject_cast(pl)) { m_valid = !m_name.isEmpty(); return; } pl = pl->parentItem(); } ULLayoutsPrivate::error(parent(), "Item that is not a child of a Layouts component will not be laid out."); m_valid = false; } /*! * \qmlattachedproperty string Layouts::item * This attached property identifies a component to be laid out. It is the unique * identifier of the component within a layout block. The property can be attached * to components to be laid out and has no effect when applied on layout containers. * \sa ItemLayout */ QString ULLayoutsAttached::item() const { return m_name; } void ULLayoutsAttached::setItem(const QString &name) { if (name == m_name) { return; } m_name = name; Q_EMIT itemChanged(); } bool ULLayoutsAttached::isValid() { return m_valid; } ./src/Ubuntu/Layouts/plugin/ulconditionallayout_p.h0000644000015600001650000000215212700370701022673 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef ULCONDITIONALLAYOUT_P_H #define ULCONDITIONALLAYOUT_P_H #include "ulconditionallayout.h" class ULLayouts; class ULConditionalLayoutPrivate { Q_DECLARE_PUBLIC(ULConditionalLayout) public: ULConditionalLayoutPrivate(ULConditionalLayout *qq); ULConditionalLayout *q_ptr; QQmlBinding *when; QQmlComponent *component; QString name; ULLayouts *layouts(); }; #endif // ULCONDITIONALLAYOUT_P_H ./src/Ubuntu/Layouts/plugin/ullayouts.cpp0000644000015600001650000004717712700370701020666 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "ullayouts.h" #include "ullayouts_p.h" #include "ulitemlayout.h" #include "ulconditionallayout.h" #include "propertychanges_p.h" #include #include ULLayoutsPrivate::ULLayoutsPrivate(ULLayouts *qq) : QQmlIncubator(Asynchronous) , q_ptr(qq) , currentLayoutItem(0) , previousLayoutItem(0) , contentItem(new QQuickItem) , currentLayoutIndex(-1) , ready(false) { // hidden container for the components that are not laid out // any component not subject of layout is reparented into this component contentItem->setParent(qq); contentItem->setParentItem(qq); } /****************************************************************************** * QQmlListProperty functions */ void ULLayoutsPrivate::append_layout(QQmlListProperty *list, ULConditionalLayout *layout) { ULLayouts *_this = static_cast(list->object); if (layout) { layout->setParent(_this); _this->d_ptr->layouts.append(layout); } } int ULLayoutsPrivate::count_layouts(QQmlListProperty *list) { ULLayouts *_this = static_cast(list->object); return _this->d_ptr->layouts.count(); } ULConditionalLayout *ULLayoutsPrivate::at_layout(QQmlListProperty *list, int index) { ULLayouts *_this = static_cast(list->object); return _this->d_ptr->layouts.at(index); } void ULLayoutsPrivate::clear_layouts(QQmlListProperty *list) { ULLayouts *_this = static_cast(list->object); _this->d_ptr->layouts.clear(); } /****************************************************************************** * ULLayoutsPrivate also acts as QQmlIncubator for the dynamically created layouts. * QQmlIncubator stuff */ void ULLayoutsPrivate::setInitialState(QObject *object) { Q_Q(ULLayouts); // object context's parent is the creation context; link it to the object so we // delete them together qmlContext(object)->parentContext()->setParent(object); // set parent object->setParent(q); QQuickItem *item = static_cast(object); // set disabled and invisible, and set its parent as last action item->setVisible(false); } /* * Called upon QQmlComponent::create() to notify the status of the component * creation. */ void ULLayoutsPrivate::statusChanged(Status status) { Q_Q(ULLayouts); if (status == Ready) { // complete layouting previousLayoutItem = currentLayoutItem; // reset the layout currentLayoutItem = qobject_cast(object()); Q_ASSERT(currentLayoutItem); //reparent components to be laid out reparentItems(); // set parent item, then enable and show layout changes.addChange(new ParentChange(currentLayoutItem, q, false)); // hide default layout, then show the new one // there's no need to queue these property changes as we do not need // to back up their previosus states contentItem->setVisible(false); currentLayoutItem->setVisible(true); // apply changes changes.apply(); // clear previous layout delete previousLayoutItem; previousLayoutItem = 0; Q_EMIT q->currentLayoutChanged(); } else if (status == Error) { error(q, errors()); } } /* * Re-parent items to the new layout. */ void ULLayoutsPrivate::reparentItems() { // create copy of items list, to keep track of which ones we change LaidOutItemsMap unusedItems = itemsToLayout; // iterate through the Layout definition to find containers - ItemLayout items QList containers = collectContainers(currentLayoutItem); Q_FOREACH(ULItemLayout *container, containers) { reparentToItemLayout(unusedItems, container); } } QList ULLayoutsPrivate::collectContainers(QQuickItem *fromItem) { QList result; // check first if the fromItem is also a container ULItemLayout *container = qobject_cast(fromItem); if (container) { result.append(container); } // loop through children but exclude nested Layouts QList children = fromItem->childItems(); Q_FOREACH(QQuickItem *child, children) { if (qobject_cast(child)) { continue; } result.append(collectContainers(child)); } return result; } /* * Re-parent to ItemLayout. */ void ULLayoutsPrivate::reparentToItemLayout(LaidOutItemsMap &map, ULItemLayout *fragment) { QString itemName = fragment->item(); if (itemName.isEmpty()) { warning(fragment, "item not specified for ItemLayout"); return; } QQuickItem *item = map.value(itemName); if (!item) { warning(fragment, "item \"" + itemName + "\" not specified or has been specified for layout by" " more than one active ItemLayout"); return; } // the component fills the parent changes.addParentChange(item, fragment, true); changes.addChange(new AnchorChange(item, "fill", fragment)); changes.addChange(new PropertyChange(item, "anchors.margins", 0)); changes.addChange(new PropertyChange(item, "anchors.leftMargin", 0)); changes.addChange(new PropertyChange(item, "anchors.topMargin", 0)); changes.addChange(new PropertyChange(item, "anchors.rightMargin", 0)); changes.addChange(new PropertyChange(item, "anchors.bottomMargin", 0)); // backup size changes.addChange(new PropertyBackup(item, "width")); changes.addChange(new PropertyBackup(item, "height")); // break and backup anchors changes.addChange(new AnchorBackup(item)); // remove from unused ones map.remove(itemName); } /* * Validates the declared conditional layouts by checking whether they have name * property set and whether the value set is unique, and whether the conditional * layout has container defined. */ void ULLayoutsPrivate::validateConditionalLayouts() { Q_Q(ULLayouts); QStringList names; for (int i = 0; i < layouts.count(); i++) { ULConditionalLayout *layout = layouts[i]; if (!layout) { error(q, "Error in layout definitions!"); continue; } if (layout->layoutName().isEmpty()) { warning(layout, "No name specified for layout. ConditionalLayout cannot be activated without name."); continue; } if (names.contains(layout->layoutName())) { warning(layout, "layout name \"" + layout->layoutName() + "\" not unique. Layout may not behave as expected."); } if (!layout->layout()) { error(layout, "no container specified for layout \"" + layout->layoutName() + "\". ConditionalLayout cannot be activated without a container."); continue; } } } /* * Collect items to be laid out. */ void ULLayoutsPrivate::getLaidOutItems(QQuickItem *container) { Q_FOREACH(QQuickItem *child, container->childItems()) { // skip nested layouts if (qobject_cast(child)) { continue; } ULLayoutsAttached *marker = qobject_cast( qmlAttachedPropertiesObject(child, false)); if (marker && !marker->item().isEmpty()) { itemsToLayout.insert(marker->item(), child); } else { // continue to search in between the child's children getLaidOutItems(child); } } } /* * Apply layout change. The new layout creation will be completed in statusChange(). */ void ULLayoutsPrivate::reLayout() { if (!ready || (currentLayoutIndex < 0)) { return; } if (!layouts[currentLayoutIndex]->layout()) { return; } // redo changes changes.revert(); changes.clear(); // clear the incubator before using it clear(); QQmlComponent *component = layouts[currentLayoutIndex]->layout(); // create using incubation as it may be created asynchronously, // case when the attached properties are not yet enumerated Q_Q(ULLayouts); QQmlContext *context = new QQmlContext(qmlContext(q), q); component->create(*this, context); } /* * Updates the current layout. */ void ULLayoutsPrivate::updateLayout() { if (!ready) { return; } // go through conditions and re-parent for the first valid one for (int i = 0; i < layouts.count(); i++) { ULConditionalLayout *layout = layouts[i]; if (!layout->layout()) { warning(layout, "Cannot activate layout \"" + layout->layoutName() + "\" with no container specified. Falling back to default layout."); break; } if (!layout->layoutName().isEmpty() && layout->when() && layout->when()->evaluate().toBool()) { if (currentLayoutIndex == i) { return; } currentLayoutIndex = i; // update layout reLayout(); return; } } // check if we need to switch back to default layout if (currentLayoutIndex >= 0) { // revert and clear changes changes.revert(); changes.clear(); // make contentItem visible contentItem->setVisible(true); delete currentLayoutItem; currentLayoutItem = 0; currentLayoutIndex = -1; Q_Q(ULLayouts); Q_EMIT q->currentLayoutChanged(); } } void ULLayoutsPrivate::error(QObject *item, const QString &message) { qmlInfo(item) << "ERROR: " << message; QQmlEngine *engine = qmlEngine(item); if (engine) { engine->quit(); } } void ULLayoutsPrivate::error(QObject *item, const QList &errors) { qmlInfo(item, errors); QQmlEngine *engine = qmlEngine(item); if (engine) { engine->quit(); } } void ULLayoutsPrivate::warning(QObject *item, const QString &message) { qmlInfo(item) << "WARNING: " << message; } /*! * \qmltype Layouts * \instantiates ULLayouts * \inqmlmodule Ubuntu.Layouts 1.0 * \ingroup ubuntu-layouts * \brief The Layouts component allows one to specify multiple different layouts for a * fixed set of Items, and applies the desired layout to those Items. * * Layouts is a layout block component incorporating layout definitions and * components to lay out. The layouts are defined in the \l layouts property, which * is a list of ConditionalLayout components, each declaring the sizes and positions * of the components specified to be laid out. * * \qml * Layouts { * id: layouts * layouts: [ * ConditionalLayout { * name: "flow" * when: layouts.width > units.gu(60) && layouts.width <= units.gu(100) * Flow { * anchors.fill: parent * //[...] * } * }, * ConditionalLayout { * name: "column" * when: layouts.width > units.gu(100) * Flickable { * anchors.fill: parent * contentHeight: column.childrenRect.height * Column { * id: column * //[...] * } * } * } * ] * } * \endqml * * The components to be laid out must be declared as children of the Layouts component, * each set an attached property "Layouts.item" to be a unique string. * * \qml * Layouts { * id: layouts * layouts: [ * ConditionalLayout { * name: "flow" * when: layouts.width > units.gu(60) && layouts.width <= units.gu(100) * Flow { * anchors.fill: parent * //[...] * } * }, * ConditionalLayout { * name: "column" * when: layouts.width > units.gu(100) * Flickable { * anchors.fill: parent * contentHeight: column.childrenRect.height * Column { * id: column * //[...] * } * } * } * ] * * Row { * anchors.fill: parent * Button { * text: "Press me" * Layouts.item: "item1" * } * Button { * text: "Cancel" * Layouts.item: "item2" * } * } * } * \endqml * * The layout of the children of Layouts is considered the default layout, i.e. * currentLayout is an empty string. So in the above example, the buttons arranged * in a row is the default layout. * * The layouts defined by ConditionalLayout components are created and activated * when at least one of the layout's condition is evaluated to true. In which * case components marked for layout are re-parented to the components defined * to lay out those defined in the ConditionalLayout. In case multiple conditions * are evaluated to true, the first one in the list will be activated. The deactivated * layout is destroyed, exception being the default layout, which is kept in memory for * the entire lifetime of the Layouts component. * * Upon activation, the created component fills in the entire layout block. * * \qml * Layouts { * id: layouts * layouts: [ * ConditionalLayout { * name: "flow" * when: layouts.width > units.gu(60) && layouts.width <= units.gu(100) * Flow { * anchors.fill: parent * ItemLayout { * item: "item1" * } * ItemLayout { * item: "item2" * } * } * }, * ConditionalLayout { * name: "column" * when: layouts.width > units.gu(100) * Flickable { * anchors.fill: parent * contentHeight: column.childrenRect.height * Column { * id: column * ItemLayout { * item: "item1" * } * ItemLayout { * item: "item2" * } * } * } * } * ] * * Row { * anchors.fill: parent * Button { * text: "Press me" * Layouts.item: "item1" * } * Button { * text: "Cancel" * Layouts.item: "item2" * } * } * } * \endqml * * Conditional layouts must be named in order to be activatable. These names (strings) * should be unique within a Layouts item and can be used to identify changes in * between layouts in scripts, so additional layout specific customization on laid * out items can be done. The current layout is presented by the currentLayout * property. * * Extending the previous example by changing the button color to green when the * current layout is "column", the code would look as follows: * \qml * Layouts { * id: layouts * layouts: [ * ConditionalLayout { * name: "flow" * when: layouts.width > units.gu(60) && layouts.width <= units.gu(100) * Flow { * anchors.fill: parent * ItemLayout { * item: "item1" * } * ItemLayout { * item: "item2" * } * } * }, * ConditionalLayout { * name: "column" * when: layouts.width > units.gu(100) * Flickable { * anchors.fill: parent * contentHeight: column.childrenRect.height * Column { * id: column * ItemLayout { * item: "item1" * } * ItemLayout { * item: "item2" * } * } * } * } * ] * * Row { * anchors.fill: parent * Button { * text: "Press me" * Layouts.item: "item1" * color: (layouts.currentLayout === "column") ? "green" : "gray" * } * Button { * text: "Cancel" * Layouts.item: "item2" * color: (layouts.currentLayout === "column") ? "green" : "gray" * } * } * } * \endqml */ ULLayouts::ULLayouts(QQuickItem *parent): QQuickItem(parent), d_ptr(new ULLayoutsPrivate(this)) { } ULLayouts::~ULLayouts() { } ULLayoutsAttached * ULLayouts::qmlAttachedProperties(QObject *owner) { return new ULLayoutsAttached(owner); } void ULLayouts::componentComplete() { QQuickItem::componentComplete(); Q_D(ULLayouts); d->ready = true; d->validateConditionalLayouts(); d->getLaidOutItems(d->contentItem); d->updateLayout(); } void ULLayouts::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { Q_D(ULLayouts); QQuickItem::geometryChanged(newGeometry, oldGeometry); // simply update the container's width/height to the new width/height d->contentItem->setSize(newGeometry.size()); } /*! * \qmlproperty string Layouts::currentLayout * The property holds the active layout name. The default layout is identified * by an empty string. This property can be used for additional customization * of the components which are not supported by the layouting. */ QString ULLayouts::currentLayout() const { Q_D(const ULLayouts); return d->currentLayoutIndex >= 0 ? d->layouts[d->currentLayoutIndex]->layoutName() : QString(); } /*! * \internal * Provides a list of layouts for internal use. */ QList ULLayouts::layoutList() { Q_D(ULLayouts); return d->layouts; } /*! * \internal * Returns the contentItem for internal use. */ QQuickItem *ULLayouts::contentItem() const { Q_D(const ULLayouts); return d->contentItem; } /*! * \qmlproperty list Layouts::layouts * The property holds the list of different ConditionalLayout elements. */ QQmlListProperty ULLayouts::layouts() { Q_D(ULLayouts); return QQmlListProperty(this, &(d->layouts), &ULLayoutsPrivate::append_layout, &ULLayoutsPrivate::count_layouts, &ULLayoutsPrivate::at_layout, &ULLayoutsPrivate::clear_layouts); } /*! * \internal * Overrides the default data property. */ QQmlListProperty ULLayouts::data() { Q_D(ULLayouts); return QQuickItemPrivate::get(d->contentItem)->data(); } /*! * \internal * Overrides the default children property. */ QQmlListProperty ULLayouts::children() { Q_D(ULLayouts); return QQuickItemPrivate::get(d->contentItem)->children(); } #include "moc_ullayouts.cpp" ./src/Ubuntu/Layouts/plugin/ulitemlayout.cpp0000644000015600001650000000507112700370701021345 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "ulitemlayout.h" /*! * \qmltype ItemLayout * \instantiates ULItemLayout * \inqmlmodule Ubuntu.Layouts 1.0 * \ingroup ubuntu-layouts * \brief ItemLayout defines a new size & position of a single Item, for the purposes * of specifying layouts. This is to be used within a ConditionalLayout definition. * * Use ItemLayout to define the size and position of a single item within a layout. * The item name to be positioned should be specified in item property, * which should correspond to the string specified in \b Layouts.item attached to * an Item in the default layout. The Item with Layouts.item attached is reparented * into ItemLayout and it is anchor filled to it. * * Example: * \qml * import QtQuick 2.4 * import Ubuntu.Layouts 0.1 * * Layouts { * id: layouts * width: units.gu(50) * height: units.gu(50) * layouts: [ * ConditionalLayout { * when: layouts.width > units.gu(40) * Row { * width: parent.width * ItemLayout { * item: "input" * width: units.gu(30) * height: units.gu(20) * } * TextArea { * text: "extra component" * } * } * } * ] * // default layout * TextInput { * anchors.fill: parent * text: "input" * Layouts.item: "input" * } * } * \endqml */ ULItemLayout::ULItemLayout(QQuickItem *parent) : QQuickItem(parent) { } ULItemLayout::~ULItemLayout() { } /*! * \qmlproperty string ItemLayout::item * The property holds the item name to be positioned in the fragment. */ QString ULItemLayout::item() const { return m_itemName; } void ULItemLayout::setItem(const QString &value) { if (value == m_itemName) { return; } m_itemName = value; } ./src/Ubuntu/Layouts/plugin/ullayouts_p.h0000644000015600001650000000454412700370701020641 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef ULLAYOUTS_P_H #define ULLAYOUTS_P_H #include "ullayouts.h" #include #include "propertychanges_p.h" typedef QHash LaidOutItemsMap; typedef QHashIterator LaidOutItemsMapIterator; class ULItemLayout; class ULLayoutsPrivate : QQmlIncubator { Q_DECLARE_PUBLIC(ULLayouts) public: ULLayoutsPrivate(ULLayouts *qq); void validateConditionalLayouts(); void getLaidOutItems(QQuickItem *item); void updateLayout(); static void error(QObject *item, const QString &message); static void error(QObject *item, const QList &errors); static void warning(QObject *item, const QString &message); protected: // QQmlIncubator stuff void setInitialState(QObject *object); void statusChanged(Status status); private: ULLayouts *q_ptr; QList layouts; ChangeList changes; LaidOutItemsMap itemsToLayout; QQuickItem* currentLayoutItem; QQuickItem* previousLayoutItem; QQuickItem* contentItem; int currentLayoutIndex; bool ready:1; // callbacks for the "layouts" QQmlListProperty of ULLayouts static void append_layout(QQmlListProperty*, ULConditionalLayout*); static int count_layouts(QQmlListProperty*); static ULConditionalLayout *at_layout(QQmlListProperty*, int); static void clear_layouts(QQmlListProperty*); void reLayout(); void reparentItems(); QList collectContainers(QQuickItem *fromItem); void reparentToItemLayout(LaidOutItemsMap &map, ULItemLayout *fragment); }; #endif // ULLAYOUTS_P_H ./src/Ubuntu/Layouts/plugin/ulconditionallayout.h0000644000015600001650000000327412700370701022362 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef ULCONDITIONALLAYOUT_H #define ULCONDITIONALLAYOUT_H #include #include #include class QQmlBinding; class ULConditionalLayoutPrivate; class ULConditionalLayout : public QObject { Q_OBJECT Q_DISABLE_COPY(ULConditionalLayout) Q_PROPERTY(QString name READ layoutName WRITE setLayoutName) Q_PROPERTY(QQmlBinding* when READ when WRITE setWhen) Q_PROPERTY(QQmlComponent *layout READ layout WRITE setLayout) Q_CLASSINFO("DefaultProperty", "layout") public: explicit ULConditionalLayout(QObject *parent = 0); ~ULConditionalLayout(); // getter/setter QString layoutName() const; void setLayoutName(const QString &name); QQmlBinding *when() const; void setWhen(QQmlBinding *when); QQmlComponent *layout() const; void setLayout(QQmlComponent *component); private: Q_DECLARE_PRIVATE(ULConditionalLayout) QScopedPointer d_ptr; }; #endif // ULCONDITIONALLAYOUT_H ./src/Ubuntu/Layouts/plugin/plugin.pri0000644000015600001650000000122712700370701020115 0ustar jenkinsjenkinsQT *= qml quick CONFIG += no_keywords QMAKE_CXXFLAGS += -Werror QT *= quick-private gui-private QT *= qml-private core-private DEFINES += QT_USE_QSTRINGBUILDER equals(QT_MAJOR_VERSION, 5):lessThan(QT_MINOR_VERSION, 2) { QT += v8-private } # Input SOURCES += \ $$PWD/ullayouts.cpp \ $$PWD/ulconditionallayout.cpp \ $$PWD/ulplugin.cpp \ $$PWD/ulitemlayout.cpp \ $$PWD/ullayoutsattached.cpp \ $$PWD/propertychanges.cpp HEADERS += \ $$PWD/ullayouts.h \ $$PWD/ullayouts_p.h \ $$PWD/ulconditionallayout.h \ $$PWD/ulconditionallayout_p.h \ $$PWD/ulplugin.h \ $$PWD/ulitemlayout.h \ $$PWD/propertychanges_p.h ./src/Ubuntu/Layouts/Layouts.pro0000644000015600001650000000030012700370701016756 0ustar jenkinsjenkinsCXX_MODULE = qml TARGET = UbuntuLayouts TARGETPATH = Ubuntu/Layouts IMPORT_VERSION = 0.1 #QMAKE_DOCS = $$PWD/doc/qtquicklayouts.qdocconf include(plugin/plugin.pri) load(ubuntu_qml_plugin) ./src/Ubuntu/Layouts/qmldir0000644000015600001650000000005412700370701016015 0ustar jenkinsjenkinsmodule Ubuntu.Layouts plugin UbuntuLayouts ./src/Ubuntu/PerformanceMetrics/0000755000015600001650000000000012700370701016733 5ustar jenkinsjenkins./src/Ubuntu/PerformanceMetrics/PerformanceMetrics.pro0000644000015600001650000000043212700370701023244 0ustar jenkinsjenkinsCXX_MODULE = qml TARGET = UbuntuPerformanceMetrics TARGETPATH = Ubuntu/PerformanceMetrics IMPORT_VERSION = 0.1 #QMAKE_DOCS = $$PWD/doc/qtquicklayouts.qdocconf include(plugin/plugin.pri) QML_FILES += BarGraph.qml \ PerformanceOverlay.qml \ load(ubuntu_qml_plugin) ./src/Ubuntu/PerformanceMetrics/BarGraph.qml0000644000015600001650000001021512700370701021133 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.PerformanceMetrics 1.0 as PerformanceMetrics Item { id: graph property var model property real maximumValue property alias labels: labelsRepeater.model property alias backgroundColor: background.color property color color: Qt.rgba(0.4, 0.73, 0.4, 1.0) property real threshold: 16.0 property color aboveThresholdColor: "#ff4e00" property string labelFormat: "%1" implicitWidth: units.gu(38) implicitHeight: units.gu(8) Rectangle { id: background anchors.fill: parent color: Qt.rgba(0.0, 0.0, 0.0, 0.8) } PerformanceMetrics.TextureFromImage { id: texture image: graph.model.image } ShaderEffect { anchors.fill: parent property var texture: texture property real shift: graph.model.shift / graph.model.samples property real maximumValue: graph.maximumValue property color color: graph.color property real threshold: graph.threshold property color aboveThresholdColor: graph.aboveThresholdColor vertexShader: " uniform mediump mat4 qt_Matrix; uniform mediump float shift; attribute mediump vec4 qt_Vertex; attribute mediump vec2 qt_MultiTexCoord0; varying mediump vec2 coord; void main() { coord = qt_MultiTexCoord0 + vec2(shift, 0.0); gl_Position = qt_Matrix * qt_Vertex; }" fragmentShader: " varying mediump vec2 coord; uniform sampler2D texture; uniform lowp float qt_Opacity; uniform lowp float maximumValue; uniform lowp vec4 color; uniform lowp float threshold; uniform lowp vec4 aboveThresholdColor; void main() { lowp vec4 tex = texture2D(texture, vec2(coord.x, coord.y)); lowp float value = tex.r * 255.0; lowp float isOn = 1.0 - step(value / maximumValue, 1.0 - coord.y); lowp float isAboveThreshold = step(threshold, value); gl_FragColor = mix(vec4(0.0), mix(color, aboveThresholdColor, isAboveThreshold), isOn) * qt_Opacity; }" } Repeater { id: labelsRepeater Item { anchors { left: parent.left right: parent.right bottom: parent.bottom bottomMargin: modelData.value / graph.maximumValue * parent.height } Label { id: label anchors { left: parent.left leftMargin: units.gu(0.5) verticalCenter: parent.verticalCenter } text: modelData.label color: modelData.color fontSize: "x-small" } Rectangle { anchors { left: label.right leftMargin: units.gu(0.5) right: parent.right } height: 1 color: modelData.color } } } Label { anchors { top: parent.top topMargin: units.gu(1) right: parent.right rightMargin: units.gu(1) } text: graph.labelFormat.arg(graph.model.currentValue) color: "white" } } ./src/Ubuntu/PerformanceMetrics/plugin/0000755000015600001650000000000012700370701020231 5ustar jenkinsjenkins./src/Ubuntu/PerformanceMetrics/plugin/upmgraphmodel.h0000644000015600001650000000316512700370701023253 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #ifndef UPMGRAPHMODEL_H #define UPMGRAPHMODEL_H #include #include class UPMGraphModel : public QObject { Q_OBJECT Q_PROPERTY(QImage image READ image NOTIFY imageChanged) Q_PROPERTY(int shift READ shift NOTIFY shiftChanged) Q_PROPERTY(int samples READ samples WRITE setSamples NOTIFY samplesChanged) Q_PROPERTY(int currentValue READ currentValue NOTIFY currentValueChanged) public: explicit UPMGraphModel(QObject *parent = 0); void appendValue(int width, int value); // getters QImage image() const; int shift() const; int samples() const; int currentValue() const; // setters void setSamples(int samples); Q_SIGNALS: void imageChanged(); void shiftChanged(); void samplesChanged(); void currentValueChanged(); private: QImage m_image; int m_shift; int m_samples; int m_currentValue; }; #endif // UPMGRAPHMODEL_H ./src/Ubuntu/PerformanceMetrics/plugin/upmgraphmodel.cpp0000644000015600001650000000445412700370701023610 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include "upmgraphmodel.h" #include UPMGraphModel::UPMGraphModel(QObject *parent) : QObject(parent), m_shift(0), m_samples(100), m_currentValue(0) { m_image = QImage(m_samples, 1, QImage::Format_RGB32); m_image.fill(0); } void UPMGraphModel::appendValue(int width, int value) { /* FIXME: modifying m_image here implicitly triggers a deep copy of its data because UCTextureFromImage usually holds a reference to that image */ width = qMax(1, width); QRgb* line = (QRgb*)m_image.scanLine(0); if (width >= m_image.width()) { memset(&line[0], value, m_image.width() * 4); } else if (m_shift + width > m_image.width()) { int after = m_image.width() - m_shift; int before = width - after; memset(&line[m_shift], value, after * 4); memset(&line[0], value, before * 4); } else { memset(&line[m_shift], value, width * 4); } m_shift = (m_shift + width) % m_samples; m_currentValue = value; Q_EMIT imageChanged(); Q_EMIT shiftChanged(); Q_EMIT currentValueChanged(); } QImage UPMGraphModel::image() const { return m_image; } int UPMGraphModel::shift() const { return m_shift; } int UPMGraphModel::samples() const { return m_samples; } void UPMGraphModel::setSamples(int samples) { if (samples != m_samples) { m_samples = samples; m_image = QImage(m_samples, 1, QImage::Format_RGB32); m_image.fill(0); Q_EMIT samplesChanged(); Q_EMIT imageChanged(); } } int UPMGraphModel::currentValue() const { return m_currentValue; } ./src/Ubuntu/PerformanceMetrics/plugin/rendertimer.cpp0000644000015600001650000003027312700370701023262 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include #include #include "rendertimer.h" #if defined(QT_OPENGL_ES) #include #include #endif #if !defined(GL_TIME_ELAPSED) #define GL_TIME_ELAPSED 0x88BF #endif class RenderTimerPrivate { public: RenderTimerPrivate() : m_type(RenderTimer::Trivial) { } RenderTimer::TimerType m_type; QElapsedTimer m_trivialTimer; #if defined(QT_OPENGL_ES) struct { void (QOPENGLF_APIENTRYP genFencesNV)(GLsizei n, GLuint* fences); void (QOPENGLF_APIENTRYP deleteFencesNV)(GLsizei n, const GLuint* fences); void (QOPENGLF_APIENTRYP setFenceNV)(GLuint fence, GLenum condition); void (QOPENGLF_APIENTRYP finishFenceNV)(GLuint fence); } m_fenceNV; GLuint m_fence[2]; struct { EGLSyncKHR (QOPENGLF_APIENTRYP createSyncKHR)(EGLDisplay dpy, EGLenum type, const EGLint* attrib_list); EGLBoolean (QOPENGLF_APIENTRYP destroySyncKHR)(EGLDisplay dpy, EGLSyncKHR sync); EGLint (QOPENGLF_APIENTRYP clientWaitSyncKHR)(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); } m_fenceSyncKHR; EGLSyncKHR m_beforeSync; #else struct { void (QOPENGLF_APIENTRYP genQueries)(GLsizei n, GLuint* ids); void (QOPENGLF_APIENTRYP deleteQueries)(GLsizei n, const GLuint* ids); void (QOPENGLF_APIENTRYP beginQuery)(GLenum target, GLuint id); void (QOPENGLF_APIENTRYP endQuery)(GLenum target); void (QOPENGLF_APIENTRYP getQueryObjectui64v)(GLuint id, GLenum pname, GLuint64* params); void (QOPENGLF_APIENTRYP getQueryObjectui64vExt)(GLuint id, GLenum pname, GLuint64EXT* params); void (QOPENGLF_APIENTRYP queryCounter)(GLuint id, GLenum target); } m_timerQuery; enum { TimerQueryUnavailable, TimerQueryCore, TimerQueryExt } m_timerQueryVersion; GLuint m_timer[2]; #endif }; RenderTimer::RenderTimer(QObject* parent) : QObject(parent) { d_ptr = new RenderTimerPrivate; } RenderTimer::~RenderTimer() { delete d_ptr; } bool RenderTimer::isAvailable(TimerType type) { if (type == RenderTimer::Trivial) { return true; #if defined(QT_OPENGL_ES) } else if (type == RenderTimer::KHRFence) { QList eglExtensions = QByteArray( static_cast(eglQueryString(eglGetCurrentDisplay(), EGL_EXTENSIONS))).split(' '); QList glExtensions = QByteArray( reinterpret_cast(glGetString(GL_EXTENSIONS))).split(' '); // Note the workaround for PowerVR that declares 'GL_OES_egl_sync'. return eglExtensions.contains("EGL_KHR_fence_sync") && (glExtensions.contains("GL_OES_EGL_sync") || glExtensions.contains("GL_OES_egl_sync")); } else if (type == RenderTimer::NVFence) { QList glExtensions = QByteArray( reinterpret_cast(glGetString(GL_EXTENSIONS))).split(' '); return glExtensions.contains("GL_NV_fence"); #else } else if (type == RenderTimer::ARBTimerQuery) { // We could use the thin QOpenGLTimerQuery wrapper from Qt 5.1, but the lack of a method to check // the presence of glQueryCounter() would force us to inspect OpenGL version and extensions, which // is basically as annoying as doing the whole thing here. // TODO(loicm) Add an hasQuerycounter() method to QOpenGLTimerQuery. QOpenGLContext* context = QOpenGLContext::currentContext(); QSurfaceFormat format = context->format(); return qMakePair(format.majorVersion(), format.minorVersion()) >= qMakePair(3, 2) && context->hasExtension(QByteArrayLiteral("GL_ARB_timer_query")); } else if (type == RenderTimer::EXTTimerQuery) { QOpenGLContext* context = QOpenGLContext::currentContext(); return context->hasExtension(QByteArrayLiteral("GL_EXT_timer_query")); #endif } return false; } RenderTimer::TimerType RenderTimer::optimalTimerType() { QList types; #if defined(QT_OPENGL_ES) types << RenderTimer::KHRFence << RenderTimer::NVFence; #else types << RenderTimer::ARBTimerQuery << RenderTimer::EXTTimerQuery; #endif Q_FOREACH(TimerType type, types) { if (RenderTimer::isAvailable(type)) { return type; } } return RenderTimer::Trivial; } void RenderTimer::setup(TimerType type) { Q_D(RenderTimer); if (type == RenderTimer::Automatic) { type = RenderTimer::optimalTimerType(); } d->m_type = type; if (d->m_type == RenderTimer::Trivial) { #if defined(QT_OPENGL_ES) } else if (d->m_type == RenderTimer::KHRFence) { d->m_fenceSyncKHR.createSyncKHR = reinterpret_cast< EGLSyncKHR (QOPENGLF_APIENTRYP)(EGLDisplay, EGLenum, const EGLint*)>( eglGetProcAddress("eglCreateSyncKHR")); d->m_fenceSyncKHR.destroySyncKHR = reinterpret_cast< EGLBoolean (QOPENGLF_APIENTRYP)(EGLDisplay, EGLSyncKHR)>( eglGetProcAddress("eglDestroySyncKHR")); d->m_fenceSyncKHR.clientWaitSyncKHR = reinterpret_cast< EGLint (QOPENGLF_APIENTRYP)(EGLDisplay, EGLSyncKHR, EGLint, EGLTimeKHR)>( eglGetProcAddress("eglClientWaitSyncKHR")); } else if (d->m_type == RenderTimer::NVFence) { d->m_fenceNV.genFencesNV = reinterpret_cast( eglGetProcAddress("glGenFencesNV")); d->m_fenceNV.deleteFencesNV = reinterpret_cast( eglGetProcAddress("glDeleteFencesNV")); d->m_fenceNV.setFenceNV = reinterpret_cast( eglGetProcAddress("glSetFenceNV")); d->m_fenceNV.finishFenceNV = reinterpret_cast( eglGetProcAddress("glFinishFenceNV")); d->m_fenceNV.genFencesNV(2, d->m_fence); #else } else if (d->m_type == RenderTimer::ARBTimerQuery) { QOpenGLContext* context = QOpenGLContext::currentContext(); d->m_timerQuery.genQueries = reinterpret_cast( context->getProcAddress("glGenQueries")); d->m_timerQuery.deleteQueries = reinterpret_cast( context->getProcAddress("glDeleteQueries")); d->m_timerQuery.getQueryObjectui64v = reinterpret_cast( context->getProcAddress("glGetQueryObjectui64v")); d->m_timerQuery.queryCounter = reinterpret_cast( context->getProcAddress("glQueryCounter")); d->m_timerQueryVersion = RenderTimerPrivate::TimerQueryCore; d->m_timerQuery.genQueries(2, d->m_timer); } else if (d->m_type == RenderTimer::EXTTimerQuery) { QOpenGLContext* context = QOpenGLContext::currentContext(); d->m_timerQuery.genQueries = reinterpret_cast( context->getProcAddress("glGenQueries")); d->m_timerQuery.deleteQueries = reinterpret_cast( context->getProcAddress("glDeleteQueries")); d->m_timerQuery.beginQuery = reinterpret_cast( context->getProcAddress("glBeginQuery")); d->m_timerQuery.endQuery = reinterpret_cast( context->getProcAddress("glEndQuery")); d->m_timerQuery.getQueryObjectui64vExt = reinterpret_cast( context->getProcAddress("glGetQueryObjectui64vEXT")); d->m_timerQueryVersion = RenderTimerPrivate::TimerQueryExt; d->m_timerQuery.genQueries(1, d->m_timer); #endif } } void RenderTimer::teardown() { teardown(d_ptr->m_type); } void RenderTimer::teardown(TimerType type) { Q_D(RenderTimer); if (type == RenderTimer::Trivial) { #if defined(QT_OPENGL_ES) } else if (type == RenderTimer::KHRFence) { if (d->m_beforeSync != EGL_NO_SYNC_KHR) { d->m_fenceSyncKHR.destroySyncKHR(eglGetCurrentDisplay(), d->m_beforeSync); } } else if (type == RenderTimer::NVFence) { d->m_fenceNV.deleteFencesNV(2, d->m_fence); #else } else if (type == RenderTimer::ARBTimerQuery) { d->m_timerQuery.deleteQueries(2, d->m_timer); } else if (type == RenderTimer::EXTTimerQuery) { d->m_timerQuery.deleteQueries(1, d->m_timer); #endif } } void RenderTimer::start() { Q_D(RenderTimer); if (d->m_type == RenderTimer::Trivial) { d-> m_trivialTimer.start(); #if defined(QT_OPENGL_ES) } else if (d->m_type == RenderTimer::KHRFence) { d->m_beforeSync = d->m_fenceSyncKHR.createSyncKHR(eglGetCurrentDisplay(), EGL_SYNC_FENCE_KHR, NULL); } else if (d->m_type == RenderTimer::NVFence) { d->m_fenceNV.setFenceNV(d->m_fence[0], GL_ALL_COMPLETED_NV); #else } else if (d->m_type == RenderTimer::ARBTimerQuery) { d->m_timerQuery.queryCounter(d->m_timer[0], GL_TIMESTAMP); } else if (d->m_type == RenderTimer::EXTTimerQuery) { d->m_timerQuery.beginQuery(GL_TIME_ELAPSED, d->m_timer[0]); #endif } } qint64 RenderTimer::stop() { Q_D(RenderTimer); if (d->m_type == RenderTimer::Trivial) { glFinish(); return d-> m_trivialTimer.nsecsElapsed(); #if defined(QT_OPENGL_ES) } else if (d->m_type == RenderTimer::KHRFence) { QElapsedTimer timer; EGLDisplay dpy = eglGetCurrentDisplay(); EGLSyncKHR afterSync = d->m_fenceSyncKHR.createSyncKHR(dpy, EGL_SYNC_FENCE_KHR, NULL); EGLint beforeSyncValue = d->m_fenceSyncKHR.clientWaitSyncKHR(dpy, d->m_beforeSync, 0, EGL_FOREVER_KHR); qint64 beforeTime = timer.nsecsElapsed(); EGLint afterSyncValue = d->m_fenceSyncKHR.clientWaitSyncKHR(dpy, afterSync, 0, EGL_FOREVER_KHR); qint64 afterTime = timer.nsecsElapsed(); d->m_fenceSyncKHR.destroySyncKHR(dpy, afterSync); d->m_fenceSyncKHR.destroySyncKHR(dpy, d->m_beforeSync); d->m_beforeSync = EGL_NO_SYNC_KHR; if (beforeSyncValue == EGL_CONDITION_SATISFIED_KHR && afterSyncValue == EGL_CONDITION_SATISFIED_KHR) { return afterTime - beforeTime; } else { return -1; } } else if (d->m_type == RenderTimer::NVFence) { QElapsedTimer timer; d->m_fenceNV.setFenceNV(d->m_fence[1], GL_ALL_COMPLETED_NV); d->m_fenceNV.finishFenceNV(d->m_fence[0]); qint64 beforeTime = timer.nsecsElapsed(); d->m_fenceNV.finishFenceNV(d->m_fence[1]); qint64 afterTime = timer.nsecsElapsed(); return afterTime - beforeTime; #else } else if (d->m_type == RenderTimer::ARBTimerQuery) { GLuint64 time[2] = { 0, 0 }; d->m_timerQuery.queryCounter(d->m_timer[1], GL_TIMESTAMP); d->m_timerQuery.getQueryObjectui64v(d->m_timer[0], GL_QUERY_RESULT, &time[0]); d->m_timerQuery.getQueryObjectui64v(d->m_timer[1], GL_QUERY_RESULT, &time[1]); if (time[0] != 0 && time[1] != 0) { return time[1] - time[0]; } else { return -1; } } else if (d->m_type == RenderTimer::EXTTimerQuery) { GLuint64EXT time; d->m_timerQuery.endQuery(GL_TIME_ELAPSED); d->m_timerQuery.getQueryObjectui64vExt(d->m_timer[0], GL_QUERY_RESULT, &time); return static_cast(time); #endif } return 0; } ./src/Ubuntu/PerformanceMetrics/plugin/rendertimer.h0000644000015600001650000000304712700370701022726 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #ifndef RENDERTIMER_H #define RENDERTIMER_H #include #include #include #include class RenderTimerPrivate; class RenderTimer : public QObject { Q_OBJECT Q_ENUMS(TimerType) public: enum TimerType { Automatic, Trivial, #if defined(QT_OPENGL_ES) KHRFence, NVFence, #else ARBTimerQuery, EXTTimerQuery #endif }; explicit RenderTimer(QObject* parent = 0); virtual ~RenderTimer(); static bool isAvailable(TimerType type); static TimerType optimalTimerType(); void setup(TimerType type); void teardown(); void start(); qint64 stop(); protected: void teardown(TimerType type); private: Q_DECLARE_PRIVATE(RenderTimer) RenderTimerPrivate *d_ptr; }; #endif // RENDERTIMER_H ./src/Ubuntu/PerformanceMetrics/plugin/upmcpuusage.h0000644000015600001650000000407212700370701022743 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #ifndef UPMCPUUSAGE_H #define UPMCPUUSAGE_H #include #include #include #include #include #include "upmgraphmodel.h" class UPMCpuUsage : public QQuickItem { Q_OBJECT Q_PROPERTY(UPMGraphModel* graphModel READ graphModel NOTIFY graphModelChanged) Q_PROPERTY(int period READ period WRITE setPeriod NOTIFY periodChanged) Q_PROPERTY(int samplingInterval READ samplingInterval WRITE setSamplingInterval NOTIFY samplingIntervalChanged) public: explicit UPMCpuUsage(QQuickItem* parent = 0); // getters UPMGraphModel* graphModel() const; int period() const; int samplingInterval() const; // setters void setPeriod(int period); void setSamplingInterval(int samplingInterval); Q_SIGNALS: void graphModelChanged(); void periodChanged(); void samplingIntervalChanged(); protected: void itemChange(ItemChange change, const ItemChangeData & value); private Q_SLOTS: void connectToWindow(QQuickWindow* window); void onFrameRendered(); void appendCpuTime(); private: QQuickWindow* m_window; UPMGraphModel* m_graphModel; int m_period; int m_samplingInterval; QTimer m_timer; float m_timingFactor; struct tms m_previousTimes; clock_t m_previousClock; int m_timeAtLastFrame; }; #endif // UPMCPUUSAGE_H ./src/Ubuntu/PerformanceMetrics/plugin/upmrenderingtimes.cpp0000644000015600001650000001300412700370701024474 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include "upmrenderingtimes.h" #include UPMRenderingTimes::UPMRenderingTimes(QQuickItem* parent) : QQuickItem(parent), m_period(1000), m_graphModel(new UPMGraphModel(this)), m_timerType(RenderTimer::Automatic), m_needsNewTimer(true), m_window(NULL), m_oddFrame(false), m_oddFrameRenderTime(0) { /* Forward samplesChanged signal from graphModel */ QObject::connect(m_graphModel, &UPMGraphModel::samplesChanged, this, &UPMRenderingTimes::samplesChanged); /* Periodically append render time of the most costly frame rendered. The period is period / samples */ QObject::connect(this, &UPMRenderingTimes::frameRendered, this, &UPMRenderingTimes::onFrameRendered); } int UPMRenderingTimes::period() const { return m_period; } void UPMRenderingTimes::setPeriod(int period) { if (period != m_period) { m_period = period; Q_EMIT periodChanged(); } } int UPMRenderingTimes::samples() const { return m_graphModel->samples(); } void UPMRenderingTimes::setSamples(int samples) { m_graphModel->setSamples(samples); } UPMGraphModel* UPMRenderingTimes::graphModel() const { return m_graphModel; } RenderTimer::TimerType UPMRenderingTimes::timerType() const { return m_timerType; } void UPMRenderingTimes::setTimerType(RenderTimer::TimerType timerType) { if (timerType != m_timerType) { m_timerType = timerType; // setup/teardown of RenderTimers need to happen in the rendering thread m_needsNewTimer = true; Q_EMIT timerTypeChanged(); } } // FIXME: can be replaced with connecting to windowChanged() signal introduced in Qt5.2 void UPMRenderingTimes::itemChange(ItemChange change, const ItemChangeData & value) { if (change == QQuickItem::ItemSceneChange) { connectToWindow(value.window); } QQuickItem::itemChange(change, value); } void UPMRenderingTimes::connectToWindow(QQuickWindow* window) { if (window != m_window) { if (m_window != NULL) { QObject::disconnect(m_window, &QQuickWindow::sceneGraphInitialized, this, &UPMRenderingTimes::onSceneGraphInitialized); QObject::disconnect(m_window, &QQuickWindow::sceneGraphInvalidated, this, &UPMRenderingTimes::onSceneGraphInvalidated); QObject::disconnect(m_window, &QQuickWindow::beforeRendering, this, &UPMRenderingTimes::onBeforeRendering); QObject::disconnect(m_window, &QQuickWindow::afterRendering, this, &UPMRenderingTimes::onAfterRendering); QObject::disconnect(m_window, &QQuickWindow::frameSwapped, this, &UPMRenderingTimes::onFrameSwapped); } m_window = window; if (m_window != NULL) { QObject::connect(m_window, &QQuickWindow::sceneGraphInitialized, this, &UPMRenderingTimes::onSceneGraphInitialized, Qt::DirectConnection); QObject::connect(m_window, &QQuickWindow::sceneGraphInvalidated, this, &UPMRenderingTimes::onSceneGraphInvalidated, Qt::DirectConnection); QObject::connect(m_window, &QQuickWindow::beforeRendering, this, &UPMRenderingTimes::onBeforeRendering, Qt::DirectConnection); QObject::connect(m_window, &QQuickWindow::afterRendering, this, &UPMRenderingTimes::onAfterRendering, Qt::DirectConnection); QObject::connect(m_window, &QQuickWindow::frameSwapped, this, &UPMRenderingTimes::onFrameSwapped, Qt::DirectConnection); } } } void UPMRenderingTimes::onSceneGraphInitialized() { m_renderingTimer.setup(m_timerType); } void UPMRenderingTimes::onSceneGraphInvalidated() { m_renderingTimer.teardown(); } void UPMRenderingTimes::onBeforeRendering() { if (m_needsNewTimer) { m_renderingTimer.teardown(); m_renderingTimer.setup(m_timerType); m_needsNewTimer = false; } m_renderingTimer.start(); } void UPMRenderingTimes::onAfterRendering() { Q_EMIT frameRendered(m_renderingTimer.stop()); } void UPMRenderingTimes::onFrameSwapped() { } void UPMRenderingTimes::onFrameRendered(qint64 renderTime) { if (!m_oddFrame) { appendRenderTime(m_oddFrameRenderTime); appendRenderTime(renderTime); } else { m_oddFrameRenderTime = renderTime; } m_oddFrame = !m_oddFrame; } void UPMRenderingTimes::appendRenderTime(qint64 renderTime) { int renderTimeInMs = qCeil((qreal)renderTime / 1000000); int width = ((qreal)samples() / m_period) * renderTimeInMs; m_graphModel->appendValue(width, renderTimeInMs); } ./src/Ubuntu/PerformanceMetrics/plugin/upmcpuusage.cpp0000644000015600001650000000741112700370701023276 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include "upmcpuusage.h" #include UPMCpuUsage::UPMCpuUsage(QQuickItem *parent) : QQuickItem(parent), m_window(NULL), m_graphModel(new UPMGraphModel(this)), m_period(5000), m_samplingInterval(500), m_timeAtLastFrame(0) { m_timingFactor = 100.0f / sysconf(_SC_NPROCESSORS_ONLN); m_previousClock = times(&m_previousTimes); QObject::connect(&m_timer, &QTimer::timeout, this, &UPMCpuUsage::appendCpuTime); m_timer.setSingleShot(false); m_timer.setInterval(m_samplingInterval); m_timer.start(); } UPMGraphModel* UPMCpuUsage::graphModel() const { return m_graphModel; } int UPMCpuUsage::period() const { return m_period; } void UPMCpuUsage::setPeriod(int period) { if (period != m_period) { m_period = period; m_graphModel->setSamples(m_period / m_samplingInterval); Q_EMIT periodChanged(); } } int UPMCpuUsage::samplingInterval() const { return m_samplingInterval; } void UPMCpuUsage::setSamplingInterval(int samplingInterval) { if (samplingInterval != m_samplingInterval) { m_samplingInterval = samplingInterval; m_graphModel->setSamples(m_period / m_samplingInterval); m_timer.setInterval(m_samplingInterval); Q_EMIT samplingIntervalChanged(); } } // FIXME: can be replaced with connecting to windowChanged() signal introduced in Qt5.2 void UPMCpuUsage::itemChange(ItemChange change, const ItemChangeData & value) { if (change == QQuickItem::ItemSceneChange) { connectToWindow(value.window); } QQuickItem::itemChange(change, value); } void UPMCpuUsage::connectToWindow(QQuickWindow* window) { if (window != m_window) { if (m_window != NULL) { QObject::disconnect(m_window, &QQuickWindow::beforeSynchronizing, this, &UPMCpuUsage::onFrameRendered); } if (window != NULL) { QObject::connect(window, &QQuickWindow::beforeSynchronizing, this, &UPMCpuUsage::onFrameRendered); } m_window = window; } } void UPMCpuUsage::onFrameRendered() { /* A frame has been rendered: - if measuring CPU usage is diabled then restart it - otherwise store the time of the rendering */ if (!m_timer.isActive()) { m_timer.start(); } else { m_timeAtLastFrame = m_timer.remainingTime(); } } void UPMCpuUsage::appendCpuTime() { // if last frame was over 80% of the timer's interval ago, then stop measuring CPU usage if (m_timeAtLastFrame >= 0.8 * m_timer.interval()) { m_timer.stop(); return; } struct tms newTimes; clock_t newClock = times(&newTimes); float elapsed = (newTimes.tms_utime + newTimes.tms_stime - m_previousTimes.tms_utime - m_previousTimes.tms_stime) / (float)(newClock - m_previousClock); memcpy(&m_previousTimes, &newTimes, sizeof(tms)); m_previousClock = newClock; int width = ((qreal)m_graphModel->samples() / m_period) * m_samplingInterval; m_graphModel->appendValue(width, elapsed * m_timingFactor); } ./src/Ubuntu/PerformanceMetrics/plugin/upmplugin.h0000644000015600001650000000231612700370701022424 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #ifndef UBUNTU_PERFORMANCE_METRICS_PLUGIN_H #define UBUNTU_PERFORMANCE_METRICS_PLUGIN_H #include class UbuntuPerformanceMetricsPlugin : public QQmlExtensionPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") public: void registerTypes(const char *uri); void initializeEngine(QQmlEngine *engine, const char *uri); private: void registerTypeVersion(const char *uri, int major, int minor); }; #endif // UBUNTU_PERFORMANCE_METRICS_PLUGIN_H ./src/Ubuntu/PerformanceMetrics/plugin/upmplugin.cpp0000644000015600001650000000351712700370701022763 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include "upmplugin.h" #include "upmcpuusage.h" #include "upmtexturefromimage.h" #include "upmgraphmodel.h" #include #include #include #include "upmrenderingtimes.h" void UbuntuPerformanceMetricsPlugin::registerTypeVersion(const char *uri, int major, int minor) { qmlRegisterType(uri, major, minor, "RenderingTimes"); qmlRegisterType(uri, major, minor, "CpuUsage"); qmlRegisterType(uri, major, minor, "TextureFromImage"); qmlRegisterType(); } void UbuntuPerformanceMetricsPlugin::registerTypes(const char *uri) { Q_ASSERT(uri == QLatin1String("Ubuntu.PerformanceMetrics")); registerTypeVersion(uri, 0, 1); registerTypeVersion(uri, 1, 0); } void UbuntuPerformanceMetricsPlugin::initializeEngine(QQmlEngine *engine, const char *uri) { QQmlExtensionPlugin::initializeEngine(engine, uri); QQmlContext* context = engine->rootContext(); QByteArray performanceOverlay = qgetenv("PERFORMANCE_OVERLAY"); context->setContextProperty("performanceOverlayEnabled", QVariant(!performanceOverlay.isEmpty())); } ./src/Ubuntu/PerformanceMetrics/plugin/upmrenderingtimes.h0000644000015600001650000000502212700370701024142 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #ifndef UPMPERFORMANCE_METRICS_H #define UPMPERFORMANCE_METRICS_H #include #include #include #include "upmgraphmodel.h" #include "rendertimer.h" class UPMRenderingTimes : public QQuickItem { Q_OBJECT Q_PROPERTY(int period READ period WRITE setPeriod NOTIFY periodChanged) Q_PROPERTY(int samples READ samples WRITE setSamples NOTIFY samplesChanged) Q_PROPERTY(UPMGraphModel* graphModel READ graphModel NOTIFY graphModelChanged) Q_PROPERTY(RenderTimer::TimerType timerType READ timerType WRITE setTimerType NOTIFY timerTypeChanged) Q_ENUMS(RenderTimer::TimerType) public: explicit UPMRenderingTimes(QQuickItem* parent = 0); // getters int period() const; int samples() const; UPMGraphModel* graphModel() const; RenderTimer::TimerType timerType() const; // setters void setPeriod(int period); void setSamples(int samples); void setTimerType(RenderTimer::TimerType timerType); Q_SIGNALS: void periodChanged(); void samplesChanged(); void graphModelChanged(); void timerTypeChanged(); void frameRendered(qint64 renderTime); protected: void itemChange(ItemChange change, const ItemChangeData & value); private Q_SLOTS: void connectToWindow(QQuickWindow* window); void onSceneGraphInitialized(); void onSceneGraphInvalidated(); void onBeforeRendering(); void onAfterRendering(); void onFrameSwapped(); void onFrameRendered(qint64 renderTime); private: void appendRenderTime(qint64 renderTime); private: int m_period; UPMGraphModel* m_graphModel; RenderTimer::TimerType m_timerType; bool m_needsNewTimer; RenderTimer m_renderingTimer; QQuickWindow* m_window; bool m_oddFrame; qint64 m_oddFrameRenderTime; }; #endif // UPMPERFORMANCE_METRICS_H ./src/Ubuntu/PerformanceMetrics/plugin/upmtexturefromimage.cpp0000644000015600001650000000535712700370701025060 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #include #include "upmtexturefromimage.h" UPMTextureFromImageTextureProvider::UPMTextureFromImageTextureProvider() : QSGTextureProvider(), m_texture(NULL) { } UPMTextureFromImageTextureProvider::~UPMTextureFromImageTextureProvider() { if (m_texture != NULL) { delete m_texture; } } QSGTexture* UPMTextureFromImageTextureProvider::texture() const { return m_texture; } void UPMTextureFromImageTextureProvider::setTexture(QSGTexture* texture) { if (m_texture != NULL) { delete m_texture; } m_texture = texture; // FIXME: hardcoded flag if (m_texture != NULL) { m_texture->setHorizontalWrapMode(QSGTexture::Repeat); } } UPMTextureFromImage::UPMTextureFromImage(QQuickItem* parent) : QQuickItem(parent), m_textureProvider(NULL), m_textureNeedsUpdate(true) { setFlag(QQuickItem::ItemHasContents); } UPMTextureFromImage::~UPMTextureFromImage() { if (m_textureProvider != NULL) { m_textureProvider->deleteLater(); } } bool UPMTextureFromImage::isTextureProvider() const { return true; } QSGTextureProvider* UPMTextureFromImage::textureProvider() const { if (m_textureProvider == NULL) { const_cast(this)->m_textureProvider = new UPMTextureFromImageTextureProvider; m_textureProvider->setTexture(window()->createTextureFromImage(m_image)); } return m_textureProvider; } QSGNode* UPMTextureFromImage::updatePaintNode(QSGNode* oldNode, UpdatePaintNodeData* updatePaintNodeData) { Q_UNUSED(oldNode) Q_UNUSED(updatePaintNodeData) if (m_textureNeedsUpdate && m_textureProvider != NULL) { m_textureProvider->setTexture(window()->createTextureFromImage(m_image)); m_textureNeedsUpdate = false; } return NULL; } QImage UPMTextureFromImage::image() const { return m_image; } void UPMTextureFromImage::setImage(QImage image) { if (image != m_image) { m_image = image; Q_EMIT imageChanged(); m_textureNeedsUpdate = true; update(); } } ./src/Ubuntu/PerformanceMetrics/plugin/plugin.pri0000644000015600001650000000077612700370701022255 0ustar jenkinsjenkinsQT *= qml quick CONFIG += no_keywords DEFINES += QT_USE_QSTRINGBUILDER # Input SOURCES += \ $$PWD/upmplugin.cpp \ $$PWD/upmgraphmodel.cpp \ $$PWD/upmtexturefromimage.cpp \ $$PWD/upmrenderingtimes.cpp \ $$PWD/upmcpuusage.cpp \ $$PWD/rendertimer.cpp HEADERS += \ $$PWD/upmplugin.h \ $$PWD/upmgraphmodel.h \ $$PWD/upmtexturefromimage.h \ $$PWD/upmrenderingtimes.h \ $$PWD/upmcpuusage.h \ $$PWD/rendertimer.h contains(QT_CONFIG, opengles2) { CONFIG += egl } ./src/Ubuntu/PerformanceMetrics/plugin/upmtexturefromimage.h0000644000015600001650000000347412700370701024523 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Florian Boucault */ #ifndef UPMTEXTUREFROMIMAGE_H #define UPMTEXTUREFROMIMAGE_H #include #include class UPMTextureFromImageTextureProvider : public QSGTextureProvider { Q_OBJECT public: explicit UPMTextureFromImageTextureProvider(); virtual ~UPMTextureFromImageTextureProvider(); QSGTexture* texture() const; void setTexture(QSGTexture* texture); private: QSGTexture* m_texture; }; class UPMTextureFromImage : public QQuickItem { Q_OBJECT Q_PROPERTY(QImage image READ image WRITE setImage NOTIFY imageChanged) public: explicit UPMTextureFromImage(QQuickItem* parent = 0); virtual ~UPMTextureFromImage(); bool isTextureProvider() const; QSGTextureProvider* textureProvider() const; QSGNode* updatePaintNode(QSGNode* oldNode, UpdatePaintNodeData* updatePaintNodeData); // getter QImage image() const; // setters void setImage(QImage image); Q_SIGNALS: void imageChanged(); private: UPMTextureFromImageTextureProvider* m_textureProvider; QImage m_image; bool m_textureNeedsUpdate; }; #endif // UPMTEXTUREFROMIMAGE_H ./src/Ubuntu/PerformanceMetrics/qmldir0000644000015600001650000000031312700370701020143 0ustar jenkinsjenkinsmodule Ubuntu.PerformanceMetrics plugin UbuntuPerformanceMetrics PerformanceOverlay 0.1 PerformanceOverlay.qml internal BarGraph BarGraph.qml #version 1.0 PerformanceOverlay 1.0 PerformanceOverlay.qml ./src/Ubuntu/PerformanceMetrics/PerformanceOverlay.qml0000644000015600001650000001060012700370701023246 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.PerformanceMetrics 1.0 as PerformanceMetrics /*! \qmltype PerformanceOverlay \inqmlmodule Ubuntu.PerformanceMetrics 0.1 \ingroup ubuntu-performance-metrics \brief Overlay displaying performance related metrics (rendering time, CPU usage, etc.) PerformanceOverlay displays various performance related indicators to help developers detect issues in their application. Examples: \qml PerformanceOverlay { active: true } \endqml */ Item { id: overlay anchors.fill: parent Component { id: overlayContent Item { MouseArea { anchors.fill: content drag.target: content onClicked: overlay.active = false } Item { id: content x: parent.width - width - units.gu(2) y: units.gu(10) width: units.gu(38) height: childrenRect.height PerformanceMetrics.RenderingTimes { id: renderingTimes period: 2000 samples: renderingTimeGraph.width timerType: PerformanceMetrics.RenderingTimes.Trivial } PerformanceMetrics.CpuUsage { id: cpuUsage period: 5000 samplingInterval: 200 } Column { anchors.left: parent.left anchors.right: parent.right spacing: units.gu(1) BarGraph { id: renderingTimeGraph anchors.left: parent.left anchors.right: parent.right model: renderingTimes.graphModel maximumValue: 20 threshold: 16 labels: [{"color": "darkorange", "value": 10, "label": "10 ms"}, {"color": "red", "value": 16, "label": "16 ms"}] labelFormat: "%1 ms" } BarGraph { id: cpuUsageGraph anchors.left: parent.left anchors.right: parent.right model: cpuUsage.graphModel maximumValue: 100 threshold: 75 labels: [{"color": "green", "value": 25, "label": "25%"}, {"color": "darkorange", "value": 50, "label": "50%"}, {"color": "red", "value": 75, "label": "75%"}] labelFormat: "%1 %" } } } } } /*! Whether or not the PerformanceOverlay is displayed. */ property bool active: true MouseArea { property var timeLastPress property int delayBetweenPresses: 500 property int pressCount: 0 property int pressCountToActivate: 4 anchors.fill: parent enabled: performanceOverlayEnabled onPressed: { mouse.accepted = false; var timePress = new Date().getTime(); if (timeLastPress && timePress - timeLastPress > delayBetweenPresses) { pressCount = 0; } pressCount += 1; if (pressCount >= pressCountToActivate) { overlay.active = true; pressCount = 0; } timeLastPress = timePress; } } Loader { id: loader anchors.fill: parent active: overlay.active asynchronous: true sourceComponent: overlayContent } } ./src/Ubuntu/Test/0000755000015600001650000000000012700370716014070 5ustar jenkinsjenkins./src/Ubuntu/Test/Test.pro0000644000015600001650000000037712700370714015536 0ustar jenkinsjenkinsCXX_MODULE = qml TARGET = UbuntuTest TARGETPATH = Ubuntu/Test IMPORT_VERSION = 0.1 #QMAKE_DOCS = $$PWD/doc/qtquicklayouts.qdocconf include(plugin/plugin.pri) QML_FILES += \ UbuntuTestCase.qml \ UbuntuTestCase13.qml \ load(ubuntu_qml_plugin) ./src/Ubuntu/Test/TestModule.pro0000644000015600001650000000173712700370701016701 0ustar jenkinsjenkinsTEMPLATE=aux CONFIG += ubuntu_qml_module uri = Ubuntu.Test installPath = $$[QT_INSTALL_QML]/$$replace(uri, \\., /) # qmldir QMLDIR_FILE = qmldir # make found deployables visible in Qt Creator OTHER_FILES += $$QMLDIR_FILE QML_FILES = *.qml JS_FILES = *.js # define deployment for found deployables qmldir_file.installPath = $$installPath qmldir_file.files = $$QMLDIR_FILE qml_files.installPath = $$installPath qml_files.files = $$QML_FILES js_files.installPath = $$installPath js_files.files = $$JS_FILES UBUNTU_QML_MODULE_FILES += qmldir_file qml_files js_files plugins_qmltypes.path = $$installPath plugins_qmltypes.files = plugins.qmltypes # Silence spam on stderr due to fonts # https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1256999 # https://bugreports.qt-project.org/browse/QTBUG-36243 plugins_qmltypes.extra = $$[QT_INSTALL_BINS]/qmlplugindump -notrelocatable Ubuntu.Test 0.1 ../../ 2>/dev/null > $(INSTALL_ROOT)/$$installPath/plugins.qmltypes INSTALLS += plugins_qmltypes ./src/Ubuntu/Test/UbuntuTestCase13.qml0000644000015600001650000002220512700370714017664 0ustar jenkinsjenkins/* * Copyright 2012, 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Components 1.3 /*! \qmltype UbuntuTestCase \inqmlmodule Ubuntu.Test 1.3 \ingroup ubuntu-test \brief The UbuntuTestCase class expands the default TestCase class. \b{This component is under heavy development.} This class extends the default QML TestCase class which is available in QtTest 1.0. */ TestCase { TestUtil { id:util } /*! This property holds the inner TestUtil instance. */ property alias testUtil: util /*! Find a child from the item based on the objectName. */ function findChild(obj,objectName) { var childs = new Array(0); childs.push(obj) while (childs.length > 0) { if (childs[0].objectName == objectName) { return childs[0] } for (var i in childs[0].children) { childs.push(childs[0].children[i]) } childs.splice(0, 1); } return null; } /*! Find a non-visual child such as QtObject based on objectName. */ function findInvisibleChild(obj,objectName) { var childs = new Array(0); childs.push(obj) while (childs.length > 0) { if (childs[0].objectName == objectName) { return childs[0] } for (var i in childs[0].data) { childs.push(childs[0].data[i]) } childs.splice(0, 1); } return null; } /*! Finds a visible child of an \a item having a given \a property with a given \a value. */ function findChildWithProperty(item, property, value) { var childs = new Array(0); childs.push(item) while (childs.length > 0) { var child = childs[0]; if (child.hasOwnProperty(property) && (child[property] === value)) { return child; } for (var i in childs[0].children) { childs.push(childs[0].children[i]) } childs.splice(0, 1); } return null; } /*! Returns the center point of the \a item. */ function centerOf(item) { if (!item) { return undefined; } var center = Qt.point(item.width / 2, item.height / 2); return center; } /*! Move Mouse from x,y to distance of dx, dy divided to steps with a stepdelay (ms) and buttons. */ function mouseMoveSlowly(item,x,y,dx,dy,steps,stepdelay,buttons) { mouseMove(item, x, y, buttons); var abs_dx = Math.abs(dx) var abs_dy = Math.abs(dy) var step_dx = dx / steps; var step_dy = dy /steps; var ix = 0; var iy = 0; for (var step=0; step < steps; step++) { if (Math.abs(ix) < abs_dx) { ix += step_dx; } if (Math.abs(iy) < abs_dy) { iy += step_dy; } mouseMove(item, x + ix, y + iy, stepdelay, buttons); } } /*! \qmlmethod UbuntuTestCase::flick(item, x, y, dx, dy, pressTimeout = -1, steps = -1, button = Qt.LeftButton, modifiers = Qt.NoModifiers, delay = -1) The function produces a flick event when executed on Flickables. When used on other components it provides the same functionality as \c mouseDrag() function. The optional \a pressTimeout parameter can be used to introduce a small delay between the mouse press and the first mouse move. Setting a negative or zero value will disable the timeout. The default flick velocity is built up using 5 move points. This can be altered by setting a positive value to \a steps parameter. The bigger the number the longer the flick will be. When a negative or zero value is given, the default of 5 move points will be used. \note The function can be used to select a text in a TextField or TextArea by specifying at least 400 millisecods to \a pressTimeout. */ function flick(item, x, y, dx, dy, pressTimeout, steps, button, modifiers, delay) { if (item === undefined || item.x === undefined || item.y === undefined) return if (button === undefined) button = Qt.LeftButton if (modifiers === undefined) modifiers = Qt.NoModifier if (steps === undefined || steps <= 0) steps = 4; //See bug#1549256 //--> delay === 0 it not guaranteed to trigger the flicking logic in QQuickFlickable if (delay === undefined) delay = 1; // make sure we have at least two move steps so the flick will be sensed steps += 1; var ddx = dx / steps; var ddy = dy / steps; mousePress(item, x, y, button, modifiers, delay); if (pressTimeout !== undefined && pressTimeout > 0) { wait(pressTimeout); } // mouse moves are all processed immediately, without delay in between events mouseMoveSlowly(item, x, y, dx, dy, steps, delay, button); mouseRelease(item, x + dx, y + dy, button, modifiers); // empty event buffer wait(200); } /*! \qmlmethod UbuntuTestCase::mouseLongPress(item, x, y, button = Qt.LeftButton, modifiers = Qt.NoModifiers, delay = -1) Simulates a long press on a mouse \a button with an optional \a modifier on an \a item. The position is defined by \a x and \a y. If \a delay is specified, the test will wait the specified amount of milliseconds before the press. The position given by \a x and \a y is transformed from the co-ordinate system of \a item into window co-ordinates and then delivered. If \a item is obscured by another item, or a child of \a item occupies that position, then the event will be delivered to the other item instead. */ function mouseLongPress(item, x, y, button, modifiers, delay) { mousePress(item, x, y, button, modifiers, delay); // the delay is taken from QQuickMouseArea, add few miliseconds to it to make sure we have // the long press triggered wait(900); } /*! Keeps executing a given parameter-less function until it returns the given expected result or the timemout is reached (in which case a test failure is generated) */ function tryCompareFunction(func, expectedResult, timeout) { var timeSpent = 0 var success = false var actualResult if (timeout == undefined) { timeout = 5000; } while (timeSpent < timeout && !success) { actualResult = func() success = qtest_compareInternal(actualResult, expectedResult) if (success === false) { wait(50) timeSpent += 50 } } var act = qtest_results.stringify(actualResult) var exp = qtest_results.stringify(expectedResult) if (!qtest_results.compare(success, "function returned unexpected result", act, exp, util.callerFile(), util.callerLine())) { throw new Error("QtQuickTest::fail") } } /*! Convenience function to allow typing a full string instead of single characters */ function typeString(string) { for (var i = 0; i < string.length; i++) { keyClick(string[i]); } } /*! Warning message formatter, uses file name, line and column numbers to build up the message. */ function warningFormat(line, column, message) { return util.callerFile() + ":" + line + ":" + column + ": " + message; } /*! Wait for animations of the header and the style inside the header to finish. The MainView that has the header that may animate must be passed as an argument. */ function waitForHeaderAnimation(mainView) { var header = findChild(mainView, "MainView_Header"); verify(header !== null, "Could not find header."); var headerStyle = findChild(header, "PageHeadStyle"); verify(headerStyle !== null, "Could not find header style."); // Wait for the header to start to move: wait(50); // Wait for animation of the style inside the header (when pushing/popping): tryCompareFunction(function(){ return headerStyle.animating }, false); // Wait for the header to finish showing/hiding: tryCompareFunction(function(){ return header.moving }, false); } } ./src/Ubuntu/Test/UbuntuTestCase.qml0000644000015600001650000002220512700370714017520 0ustar jenkinsjenkins/* * Copyright 2012, 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Components 1.2 /*! \qmltype UbuntuTestCase \inqmlmodule Ubuntu.Test 1.0 \ingroup ubuntu-test \brief The UbuntuTestCase class expands the default TestCase class. \b{This component is under heavy development.} This class extends the default QML TestCase class which is available in QtTest 1.0. */ TestCase { TestUtil { id:util } /*! This property holds the inner TestUtil instance. */ property alias testUtil: util /*! Find a child from the item based on the objectName. */ function findChild(obj,objectName) { var childs = new Array(0); childs.push(obj) while (childs.length > 0) { if (childs[0].objectName == objectName) { return childs[0] } for (var i in childs[0].children) { childs.push(childs[0].children[i]) } childs.splice(0, 1); } return null; } /*! Find a non-visual child such as QtObject based on objectName. */ function findInvisibleChild(obj,objectName) { var childs = new Array(0); childs.push(obj) while (childs.length > 0) { if (childs[0].objectName == objectName) { return childs[0] } for (var i in childs[0].data) { childs.push(childs[0].data[i]) } childs.splice(0, 1); } return null; } /*! Finds a visible child of an \a item having a given \a property with a given \a value. */ function findChildWithProperty(item, property, value) { var childs = new Array(0); childs.push(item) while (childs.length > 0) { var child = childs[0]; if (child.hasOwnProperty(property) && (child[property] === value)) { return child; } for (var i in childs[0].children) { childs.push(childs[0].children[i]) } childs.splice(0, 1); } return null; } /*! Returns the center point of the \a item. */ function centerOf(item) { if (!item) { return undefined; } var center = Qt.point(item.width / 2, item.height / 2); return center; } /*! Move Mouse from x,y to distance of dx, dy divided to steps with a stepdelay (ms) and buttons. */ function mouseMoveSlowly(item,x,y,dx,dy,steps,stepdelay,buttons) { mouseMove(item, x, y, buttons); var abs_dx = Math.abs(dx) var abs_dy = Math.abs(dy) var step_dx = dx / steps; var step_dy = dy /steps; var ix = 0; var iy = 0; for (var step=0; step < steps; step++) { if (Math.abs(ix) < abs_dx) { ix += step_dx; } if (Math.abs(iy) < abs_dy) { iy += step_dy; } mouseMove(item, x + ix, y + iy, stepdelay, buttons); } } /*! \qmlmethod UbuntuTestCase::flick(item, x, y, dx, dy, pressTimeout = -1, steps = -1, button = Qt.LeftButton, modifiers = Qt.NoModifiers, delay = -1) The function produces a flick event when executed on Flickables. When used on other components it provides the same functionality as \c mouseDrag() function. The optional \a pressTimeout parameter can be used to introduce a small delay between the mouse press and the first mouse move. Setting a negative or zero value will disable the timeout. The default flick velocity is built up using 5 move points. This can be altered by setting a positive value to \a steps parameter. The bigger the number the longer the flick will be. When a negative or zero value is given, the default of 5 move points will be used. \note The function can be used to select a text in a TextField or TextArea by specifying at least 400 millisecods to \a pressTimeout. */ function flick(item, x, y, dx, dy, pressTimeout, steps, button, modifiers, delay) { if (item === undefined || item.x === undefined || item.y === undefined) return if (button === undefined) button = Qt.LeftButton if (modifiers === undefined) modifiers = Qt.NoModifier if (steps === undefined || steps <= 0) steps = 4; //See bug#1549256 //--> delay === 0 it not guaranteed to trigger the flicking logic in QQuickFlickable if (delay === undefined) delay = 1; // make sure we have at least two move steps so the flick will be sensed steps += 1; var ddx = dx / steps; var ddy = dy / steps; mousePress(item, x, y, button, modifiers, delay); if (pressTimeout !== undefined && pressTimeout > 0) { wait(pressTimeout); } // mouse moves are all processed immediately, without delay in between events mouseMoveSlowly(item, x, y, dx, dy, steps, delay, button); mouseRelease(item, x + dx, y + dy, button, modifiers); // empty event buffer wait(200); } /*! \qmlmethod UbuntuTestCase::mouseLongPress(item, x, y, button = Qt.LeftButton, modifiers = Qt.NoModifiers, delay = -1) Simulates a long press on a mouse \a button with an optional \a modifier on an \a item. The position is defined by \a x and \a y. If \a delay is specified, the test will wait the specified amount of milliseconds before the press. The position given by \a x and \a y is transformed from the co-ordinate system of \a item into window co-ordinates and then delivered. If \a item is obscured by another item, or a child of \a item occupies that position, then the event will be delivered to the other item instead. */ function mouseLongPress(item, x, y, button, modifiers, delay) { mousePress(item, x, y, button, modifiers, delay); // the delay is taken from QQuickMouseArea, add few miliseconds to it to make sure we have // the long press triggered wait(900); } /*! Keeps executing a given parameter-less function until it returns the given expected result or the timemout is reached (in which case a test failure is generated) */ function tryCompareFunction(func, expectedResult, timeout) { var timeSpent = 0 var success = false var actualResult if (timeout == undefined) { timeout = 5000; } while (timeSpent < timeout && !success) { actualResult = func() success = qtest_compareInternal(actualResult, expectedResult) if (success === false) { wait(50) timeSpent += 50 } } var act = qtest_results.stringify(actualResult) var exp = qtest_results.stringify(expectedResult) if (!qtest_results.compare(success, "function returned unexpected result", act, exp, util.callerFile(), util.callerLine())) { throw new Error("QtQuickTest::fail") } } /*! Convenience function to allow typing a full string instead of single characters */ function typeString(string) { for (var i = 0; i < string.length; i++) { keyClick(string[i]); } } /*! Warning message formatter, uses file name, line and column numbers to build up the message. */ function warningFormat(line, column, message) { return util.callerFile() + ":" + line + ":" + column + ": " + message; } /*! Wait for animations of the header and the style inside the header to finish. The MainView that has the header that may animate must be passed as an argument. */ function waitForHeaderAnimation(mainView) { var header = findChild(mainView, "MainView_Header"); verify(header !== null, "Could not find header."); var headerStyle = findChild(header, "PageHeadStyle"); verify(headerStyle !== null, "Could not find header style."); // Wait for the header to start to move: wait(50); // Wait for animation of the style inside the header (when pushing/popping): tryCompareFunction(function(){ return headerStyle.animating }, false); // Wait for the header to finish showing/hiding: tryCompareFunction(function(){ return header.moving }, false); } } ./src/Ubuntu/Test/plugin/0000755000015600001650000000000012700370716015366 5ustar jenkinsjenkins./src/Ubuntu/Test/plugin/ucmousetouchadaptor.h0000644000015600001650000000343612700370701021635 0ustar jenkinsjenkins/* * Copyright (C) 2013,2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authored by: Daniel d'Andrada */ #ifndef MOUSE_TOUCH_ADAPTOR_H #define MOUSE_TOUCH_ADAPTOR_H #include #include #include class QMouseEvent; class QTouchDevice; // Transforms QMouseEvents into single-finger QTouchEvents. class UCMouseTouchAdaptor : public QObject, public QAbstractNativeEventFilter { Q_OBJECT public: UCMouseTouchAdaptor(); // Filters mouse events and posts the equivalent QTouchEvents. bool nativeEventFilter(const QByteArray & eventType, void *message, long *result) override; Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged) bool enabled() const; void setEnabled(bool value); Q_SIGNALS: void enabledChanged(bool value); private: bool handleButtonPress(xcb_button_press_event_t *pressEvent); bool handleButtonRelease(xcb_button_release_event_t *releaseEvent); bool handleMotionNotify(xcb_motion_notify_event_t *event); QWindow *findQWindowWithXWindowID(WId windowId); QTouchDevice *m_touchDevice; bool m_leftButtonIsPressed; bool m_enabled; }; #endif // MOUSE_TOUCH_ADAPTOR_H ./src/Ubuntu/Test/plugin/uctestextras.cpp0000644000015600001650000003256112700370701020631 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "uctestextras.h" #include "uctestcase.h" #include "ucswipearea_p.h" #include "ucswipearea_p_p.h" #include #include #include const char *DEVICE_MISSING_MSG = "No touch device registered. Register one using registerTouchDevice() before using %1"; #define CHECK_TOUCH_DEVICE(touchId, item) \ if (!touchDevicePresent()) { \ qWarning() << QString(DEVICE_MISSING_MSG).arg(__FUNCTION__); \ return; \ } \ if (touchId < 0) { \ qWarning() << "Invalid touchId specified."; \ return; \ } \ if (!item) { \ qWarning() << "Invalid item specified."; \ return; \ } QTouchDevice *UCTestExtras::m_touchDevice = 0; UCTestExtras *UCTestExtras::m_testExtras = 0; /*! * \qmltype TestExtras * \instantiates UCTestExtras * \inqmlmodule Ubuntu.Test 1.0 * \ingroup ubuntu-test * \brief Singleton type providing additional test functions. * * The component provides additional test functions like touch handling, registering * touch device on non-touch screen enabled environment. */ UCTestExtras::UCTestExtras(QObject *parent) : QObject(parent) { m_testExtras = this; } /*! * \qmlmethod TestExtras::openGLflavor() * Returns "opengl" or "opengles2". */ QString UCTestExtras::openGLflavor() { #if defined(QT_OPENGL_ES) return QString("opengles2"); #else return QString("opengl"); #endif } /*! * \qmlmethod TestExtras::cpuArchitecture() * Returns the build architecure, including but not limited to * "arm", "arm64", "i386" and "x86_64". */ QString UCTestExtras::cpuArchitecture() { #if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0) return QSysInfo::buildCpuArchitecture(); #elif defined(Q_PROCESSOR_X86_64) return "x86_64"; #elif defined(Q_PROCESSOR_X86_32) return "i386"; #elif defined(Q_PROCESSOR_ARM_64) return "arm64"; #elif defined(Q_PROCESSOR_ARM) return "arm"; #else return "unknown"; #endif } /*! * \qmlmethod TestExtras::touchDevicePresent() * Returns true if the system has a touch device registered. */ bool UCTestExtras::touchDevicePresent() { QList touchDevices = QTouchDevice::devices(); Q_FOREACH(const QTouchDevice *device, touchDevices) { if (device->type() == QTouchDevice::TouchScreen) { return true; } } return false; } /*! * \qmlmethod TestExtras::registerTouchDevice() * Registers a touch device if there's none registered. Calling the function in * touch enabled environment has no effect. The function must be called in initTestCase() * in order to perform touch related tests. */ void UCTestExtras::registerTouchDevice() { // check if there is any touch device registered in the system if (!m_touchDevice) { QList touchDevices = QTouchDevice::devices(); Q_FOREACH(const QTouchDevice *device, touchDevices) { if (device->type() == QTouchDevice::TouchScreen) { m_touchDevice = const_cast(device); break; } } } // if none, register one if (!m_touchDevice) { m_touchDevice = new QTouchDevice; m_touchDevice->setType(QTouchDevice::TouchScreen); QWindowSystemInterface::registerTouchDevice(m_touchDevice); if (m_testExtras) { Q_EMIT m_testExtras->touchDevicePresentChanged(); } } } /*! * \qmlmethod TestExtras::touchPress(touchId, item, point) * The function triggers a touch press event for a given \a touchId on a specific * \a item. The \a point contains the (x,y) coordinates of the event in \a item * coordinates. */ void UCTestExtras::touchPress(int touchId, QQuickItem *item, const QPoint &point) { CHECK_TOUCH_DEVICE(touchId, item); QTest::touchEvent(item->window(), m_touchDevice).press(touchId, item->mapToScene(point).toPoint(), item->window()); } /*! * \qmlmethod TestExtras::touchRelease(touchId, item, point) * The function produces a touch release event on a given \a touchId performed on * \a item at a \a point. */ void UCTestExtras::touchRelease(int touchId, QQuickItem *item, const QPoint &point) { CHECK_TOUCH_DEVICE(touchId, item); QTest::touchEvent(item->window(), m_touchDevice).release(touchId, item->mapToScene(point).toPoint(), item->window()); } /*! * \qmlmethod TestExtras::touchClick(touchId, item, point) * The function performs a pair of \l touchPress and \l touchRelease calls on the same * point resulting in a click like event. */ void UCTestExtras::touchClick(int touchId, QQuickItem *item, const QPoint &point) { CHECK_TOUCH_DEVICE(touchId, item); touchPress(touchId, item, point); QTest::qWait(100); touchRelease(touchId, item, point); } /*! * \qmlmethod TestExtras::touchLongPress(touchId, item, point) * The function produces a \l touchPress event with a timeout equivalent to the * mouse \c pressAndHold timeout, after which the function returns. */ void UCTestExtras::touchLongPress(int touchId, QQuickItem *item, const QPoint &point) { CHECK_TOUCH_DEVICE(touchId, item); touchPress(touchId, item, point); // 800 miliseconds + 200 to let events processed QTest::qWait(1000); } /*! * \qmlmethod TestExtras::touchDoubleClick(touchId, item, point) * The function performs two consecutive \l touchClick events with a slight delay * in between each click event. */ void UCTestExtras::touchDoubleClick(int touchId, QQuickItem *item, const QPoint &point) { CHECK_TOUCH_DEVICE(touchId, item); touchClick(touchId, item, point); QTest::qWait(100); touchClick(touchId, item, point); } /*! * \qmlmethod TestExtras::touchMove(touchId, item, point) * The function moves the touch point identified by the \a touchId to the destination * \a point. The point is in \a item coordinates. The touch point identified by the * \a touchId must be pressed before calling this function in order to produce the * desired functionality. The event can be captured in a \c MultiPointTouchArea through * \c updated() signal. */ void UCTestExtras::touchMove(int touchId, QQuickItem *item, const QPoint &point) { CHECK_TOUCH_DEVICE(touchId, item); QTest::touchEvent(item->window(), m_touchDevice).move(touchId, item->mapToScene(point).toPoint(), item->window()); } /*! * \qmlmethod TestExtras::touchDrag(touchId, item, from, delta, steps = 5) * The function performs a drag gesture on a touch point identified by \a touchId * over an \a item from the starting point \a from with a \a delta. The gesture * is realized with a touch press, \a step moves and a release event. * * By default the function uses 5 steps to produce the gesture. This value can be any * positive number, driving the gesture appliance to be faster (less than 5 moves) or * slower (more than 5 moves). If a negative or 0 value is given, the function will * use the default 5 steps to produce the gesture. */ void UCTestExtras::touchDrag(int touchId, QQuickItem *item, const QPoint &from, const QPoint &delta, int steps) { CHECK_TOUCH_DEVICE(touchId, item); if (delta.isNull()) { qWarning() << "delta point is invalid"; return; } if (steps <= 0) { steps = 5; } touchPress(touchId, item, from); QTest::qWait(20); touchMove(touchId, item, from); QPoint movePoint(from); qreal stepDx = delta.x() / steps; qreal stepDy = delta.y() / steps; if (!delta.isNull()) { for (int i = 0; i < steps - 1; i++) { QTest::qWait(20); movePoint += QPoint(stepDx, stepDy); touchMove(touchId, item, movePoint); } } QTest::qWait(20); touchRelease(touchId, item, from + delta); } /*! * \qmlmethod void TestExtras::mouseDrag(touchId, item, from, delta, button, stateKey, steps = 5, delay = 20) * The function performs a drag with a mouse over an \a item from the starting * point \a from with a \a delta. The gesture is realized with a mouse press, * \a step moves and a release event, with a \e delay in between each mouse event. * * By default the function uses 5 steps to produce the drag. This value can be any * positive number, driving the gesture appliance to be faster (less than 5 moves) or * slower (more than 5 moves). If a negative or 0 value is given, the function will * use the default 5 steps to produce the gesture. */ void UCTestExtras::mouseDrag(QQuickItem *item, const QPoint &from, const QPoint &delta, Qt::MouseButton button, Qt::KeyboardModifiers stateKey, int steps, int delay) { if (delta.isNull()) { qWarning() << "delta point is invalid"; return; } if (steps <= 0) { steps = 5; } if (delay < 20) { delay = 20; } QTest::mousePress(item->window(), button, stateKey, from, delay); QPoint movePoint(from); qreal stepDx = delta.x() / steps; qreal stepDy = delta.y() / steps; if (!delta.isNull()) { for (int i = 0; i < steps; i++) { QTest::mouseMove(item->window(), movePoint, delay); movePoint += QPoint(stepDx, stepDy); } } QTest::mouseRelease(item->window(), button, stateKey, movePoint, delay); } /* * void TestExtras::touchDragWithPoints(touchId, item, list ponts, delay = 20) * Similar to \l touchDrag function, but here the points must be specified in \e points property. * The first point is expected to be the starting position, after which each point is a relative * point defining the move. A minimum of 5 points are needed to properly produce a drag. * \qml * import Qt.Test 1.0 * import Ubuntu.Test 1.0 * Item { * id: testItem * UbuntuTestCase { * * function test_vertical_drag_upwards() { * var points = []; * points.push(centerOf(testItem)); * points.push(Qt.point(0, -1)); * points.push(Qt.point(0, -3)); * points.push(Qt.point(0, -6)); * points.push(Qt.point(0, -5)); * points.push(Qt.point(0, -2)); * TestExtras.touchDragWithPoints(0, testItem, points); * } * } * } * \endqml * The delay must be a minimum of 20 milliseconds. */ void UCTestExtras::touchDragWithPoints(int touchId, QQuickItem *item, QList points, int delay) { if (points.size() < 5) { qWarning() << "minimum 5 points are needed."; return; } if (delay < 20) { delay = 20; } QPoint movePoint(points[0]); touchPress(touchId, item, movePoint); QTest::qWait(delay); touchMove(touchId, item, movePoint); for (int i = 1; i < points.size(); ++i) { QTest::qWait(delay); movePoint += points[i]; touchMove(touchId, item, movePoint); } QTest::qWait(delay); touchRelease(touchId, item, movePoint); } /* * void TestExtras::mouseDragWithPoints(item, button, list ponts, stateKey = 0, delay = 20) * Similar to \l mouseDrag function, but here the points must be specified in \e points property. * The first point is expected to be the starting position, after which each point is a relative * point defining the move. A minimum of 5 points are needed to properly produce a drag. * \qml * import Qt.Test 1.0 * import Ubuntu.Test 1.0 * Item { * id: testItem * UbuntuTestCase { * * function test_vertical_drag_upwards() { * var points = []; * points.push(centerOf(testItem)); * points.push(Qt.point(0, -1)); * points.push(Qt.point(0, -3)); * points.push(Qt.point(0, -6)); * points.push(Qt.point(0, -5)); * points.push(Qt.point(0, -2)); * TestExtras.mouseDragWithPoints(testItem, Qt.LeftButton, points); * } * } * } * \endqml * The delay must be a minimum of 20 milliseconds. */ void UCTestExtras::mouseDragWithPoints(QQuickItem *item, QList points, Qt::MouseButton button, Qt::KeyboardModifiers stateKey, int delay) { if (points.size() < 5) { qWarning() << "minimum 5 points are needed."; return; } if (delay < 20) { delay = 20; } QTest::mousePress(item->window(), button, stateKey, item->mapToScene(points[0]).toPoint(), delay); QPoint movePoint(item->mapToScene(points[0]).toPoint()); QTest::mouseMove(item->window(), movePoint, delay); for (int i = 1; i < points.size(); ++i) { movePoint += points[i]; QTest::mouseMove(item->window(), movePoint, delay); } QTest::mouseRelease(item->window(), button, stateKey, movePoint, delay); } void UCTestExtras::removeTimeConstraintsFromSwipeArea(QQuickItem *item) { UCSwipeArea *swipeArea = dynamic_cast(item); if (!swipeArea) { qWarning() << item << "is not a SwipeArea"; return; } UCSwipeAreaPrivate *priv = static_cast(QObjectPrivate::get(swipeArea)); priv->setMaxTime(60 * 60 * 1000); priv->setCompositionTime(0); } ./src/Ubuntu/Test/plugin/testplugin.cpp0000644000015600001650000000243712700370701020270 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "testplugin.h" #include #include "uctestextras.h" #include "ucmousetouchadaptor.h" static QObject *registerExtras(QQmlEngine *engine, QJSEngine *scriptEngine) { Q_UNUSED(engine) Q_UNUSED(scriptEngine) return new UCTestExtras; } static QObject *registerAdaptor(QQmlEngine *engine, QJSEngine *scriptEngine) { Q_UNUSED(engine) Q_UNUSED(scriptEngine) return new UCMouseTouchAdaptor; } void TestPlugin::registerTypes(const char *uri) { qmlRegisterSingletonType(uri, 1, 0, "TestExtras", registerExtras); qmlRegisterSingletonType(uri, 1, 0, "MouseTouchAdaptor", registerAdaptor); } ./src/Ubuntu/Test/plugin/uctestcase.cpp0000644000015600001650000000554212700370714020241 0ustar jenkinsjenkins/* * Copyright 2013-2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #include "uctestcase.h" #include #include #include #include #include #include Q_DECLARE_METATYPE(QList) /*! * \ingroup ubuntu * \brief UbuntuTestCase is the C++ pendant to the QML UbuntuTestCase. */ UbuntuTestCase::UbuntuTestCase(const QString& file, ResizeMode resize, bool assertOnFailure, QWindow* parent) : QQuickView(parent) { QString modules(UBUNTU_QML_IMPORT_PATH); Q_ASSERT(QDir(modules).exists()); QString modulePath(QDir(modules).absolutePath()); engine()->addImportPath(modulePath); qRegisterMetaType >(); m_spy = new QSignalSpy(engine(), SIGNAL(warnings(QList))); m_spy->setParent(this); Q_ASSERT(!file.isEmpty()); setResizeMode(resize); setSource(QUrl::fromLocalFile(file)); if (assertOnFailure) { Q_ASSERT(status() == QQuickView::Ready); Q_ASSERT(rootObject()); } if (rootObject()) { show(); QTest::qWaitForWindowExposed(this); } } /*! * The number of all warnings from the point of loading the first line of QML code. */ int UbuntuTestCase::warnings() const { return m_spy->count(); } /*! * Ignore an expected warning message created using qmlInfo. */ void UbuntuTestCase::ignoreWarning(const QString& fileName, uint line, uint column, const QString& message, uint occurences) { for (uint i = 0; i < occurences; i++) { QString url(QUrl::fromLocalFile(QFileInfo(fileName).absoluteFilePath()).toEncoded()); QString warning(QString("%1:%2:%3: %4").arg(url).arg(line).arg(column).arg(message)); QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); } } /*! * Same as previous but without column number */ void UbuntuTestCase::ignoreWarning(const QString& fileName, uint line, const QString& message, uint occurences) { for (uint i = 0; i < occurences; i++) { QString url(QUrl::fromLocalFile(QFileInfo(fileName).absoluteFilePath()).toEncoded()); QString warning(QString("%1:%2 %3").arg(url).arg(line).arg(message)); QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); } } ./src/Ubuntu/Test/plugin/testplugin.h0000644000015600001650000000164212700370701017732 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef TESTPLUGIN_H #define TESTPLUGIN_H #include class TestPlugin : public QQmlExtensionPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") public: void registerTypes(const char *uri); }; #endif // TESTPLUGIN_H ./src/Ubuntu/Test/plugin/uctestcase.h0000644000015600001650000000453712700370714017711 0ustar jenkinsjenkins/* * Copyright 2013-2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Christian Dywan */ #ifndef UBUNTU_TEST_UBUNTUTESTCASE_H #define UBUNTU_TEST_UBUNTUTESTCASE_H #include #include #include #include class UbuntuTestCase : public QQuickView { Q_OBJECT public: UbuntuTestCase(const QString& file, ResizeMode resize = SizeViewToRootObject, bool assertOnFailure = true, QWindow* parent = 0); int warnings() const; // getter template inline T findItem(const QString& objectName) const { T item = rootObject()->findChild(objectName); if (item) return item; if (rootObject()->findChild(objectName)) qFatal("Item '%s' found with unexpected type", qPrintable(objectName)); qFatal("No item '%s' found", qPrintable(objectName)); } static inline QPointF centerOf(QQuickItem *item, bool windowPos = false) { QPointF center; if (item) { center = item->boundingRect().center(); if (windowPos) { center = item->mapToScene(center); } } return center; } static void ignoreWarning(const QString& fileName, uint line, uint column, const QString& message, uint occurences=1); static void ignoreWarning(const QString& fileName, uint line, const QString& message, uint occurences=1); static inline void waitForSignal(QSignalSpy *spy, int timeout = 5000) { QVERIFY(spy); if (!spy->count()) { QVERIFY(spy->wait(timeout)); } else { QCOMPARE(spy->count(), 1); } } private: QSignalSpy* m_spy; }; #endif // UBUNTU_TEST_UBUNTUTESTCASE_H ./src/Ubuntu/Test/plugin/plugin.pri0000644000015600001650000000120312700370701017366 0ustar jenkinsjenkinsQT *= core-private qml qml-private quick quick-private gui-private testlib UbuntuGestures equals(QT_MAJOR_VERSION, 5):lessThan(QT_MINOR_VERSION, 2) { QT *= v8-private } CONFIG += no_keywords DEFINES += UBUNTU_QML_IMPORT_PATH='\\"$${ROOT_BUILD_DIR}/qml\\"' DEFINES += QT_USE_QSTRINGBUILDER INCLUDEPATH += ../UbuntuGestures TARGET = $$qtLibraryTarget($$TARGET) uri = Ubuntu.Test HEADERS += \ $$PWD/uctestcase.h \ $$PWD/testplugin.h \ $$PWD/uctestextras.h \ $$PWD/ucmousetouchadaptor.h \ SOURCES += \ $$PWD/uctestcase.cpp \ $$PWD/testplugin.cpp \ $$PWD/uctestextras.cpp \ $$PWD/ucmousetouchadaptor.cpp \ ./src/Ubuntu/Test/plugin/ucmousetouchadaptor.cpp0000644000015600001650000001407012700370701022164 0ustar jenkinsjenkins/* * Copyright (C) 2013,2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authored by: Daniel d'Andrada */ #include "ucmousetouchadaptor.h" #include "uctestextras.h" #include #include #include #include using QTest::QTouchEventSequence; namespace { Qt::MouseButton translateMouseButton(xcb_button_t detail) { switch (detail) { case 1: return Qt::LeftButton; case 2: return Qt::MidButton; case 3: return Qt::RightButton; // Button values 4-7 are Wheel events default: return Qt::NoButton; } } } // end of anonymous namespace /*! * \qmltype MouseTouchAdaptor * \instantiates UCMouseTouchAdaptor * \inqmlmodule Ubuntu.Test 1.0 * \ingroup ubuntu-test * \brief Singleton type turning mouse events into single finger touch events. * * When enabled, mouse events will be translated into single finger touch events. * Being a singleton, the feature must be enabled explicitly either on component * completion or through a binding. * \qml * Binding { * target: MouseTouchAdaptor * property: "enabled" * value: true * } * \endqml * */ UCMouseTouchAdaptor::UCMouseTouchAdaptor() : QObject(nullptr) , m_leftButtonIsPressed(false) , m_enabled(true) { QCoreApplication::instance()->installNativeEventFilter(this); UCTestExtras::registerTouchDevice(); m_touchDevice = UCTestExtras::m_touchDevice; } bool UCMouseTouchAdaptor::nativeEventFilter(const QByteArray & eventType, void * message, long * /*result*/) { if (!m_enabled) { return false; } if (eventType != "xcb_generic_event_t") { // wrong backend. qWarning("MouseTouchAdaptor: XCB backend not in use. Adaptor inoperative!"); return false; } xcb_generic_event_t *xcbEvent = static_cast(message); switch (xcbEvent->response_type & ~0x80) { case XCB_BUTTON_PRESS: return handleButtonPress(reinterpret_cast(xcbEvent)); break; case XCB_BUTTON_RELEASE: return handleButtonRelease(reinterpret_cast(xcbEvent)); break; case XCB_MOTION_NOTIFY: return handleMotionNotify(reinterpret_cast(xcbEvent)); break; default: return false; break; }; } bool UCMouseTouchAdaptor::handleButtonPress(xcb_button_press_event_t *pressEvent) { Qt::MouseButton button = translateMouseButton(pressEvent->detail); // Just eat the event if it wasn't a left mouse press if (button != Qt::LeftButton) return true; QWindow *targetWindow = findQWindowWithXWindowID(static_cast(pressEvent->event)); QPoint windowPos(pressEvent->event_x / targetWindow->devicePixelRatio(), pressEvent->event_y / targetWindow->devicePixelRatio()); QTouchEventSequence touchEvent = QTest::touchEvent(targetWindow, m_touchDevice, false /* autoCommit */); touchEvent.press(0 /* touchId */, windowPos); touchEvent.commit(false /* processEvents */); m_leftButtonIsPressed = true; return true; } bool UCMouseTouchAdaptor::handleButtonRelease(xcb_button_release_event_t *releaseEvent) { Qt::MouseButton button = translateMouseButton(releaseEvent->detail); // Just eat the event if it wasn't a left mouse release if (button != Qt::LeftButton) return true; QWindow *targetWindow = findQWindowWithXWindowID(static_cast(releaseEvent->event)); QPoint windowPos(releaseEvent->event_x / targetWindow->devicePixelRatio(), releaseEvent->event_y / targetWindow->devicePixelRatio()); QTouchEventSequence touchEvent = QTest::touchEvent(targetWindow, m_touchDevice, false /* autoCommit */); touchEvent.release(0 /* touchId */, windowPos); touchEvent.commit(false /* processEvents */); m_leftButtonIsPressed = false; return true; } bool UCMouseTouchAdaptor::handleMotionNotify(xcb_motion_notify_event_t *event) { if (!m_leftButtonIsPressed) { return true; } QWindow *targetWindow = findQWindowWithXWindowID(static_cast(event->event)); QPoint windowPos(event->event_x / targetWindow->devicePixelRatio(), event->event_y / targetWindow->devicePixelRatio()); QTouchEventSequence touchEvent = QTest::touchEvent(targetWindow, m_touchDevice, false /* autoCommit */); touchEvent.move(0 /* touchId */, windowPos); touchEvent.commit(false /* processEvents */); return true; } QWindow *UCMouseTouchAdaptor::findQWindowWithXWindowID(WId windowId) { QWindowList windowList = QGuiApplication::topLevelWindows(); QWindow *foundWindow = nullptr; int i = 0; while (!foundWindow && i < windowList.count()) { QWindow *window = windowList[i]; if (window->winId() == windowId) { foundWindow = window; } else { ++i; } } Q_ASSERT(foundWindow); return foundWindow; } /*! * \qmlproperty bool MouseTouchAdaptor::enabled * Enables the mouse to touch conversion functionality. Defaults to true. */ bool UCMouseTouchAdaptor::enabled() const { return m_enabled; } void UCMouseTouchAdaptor::setEnabled(bool value) { if (value != m_enabled) { m_enabled = value; Q_EMIT enabledChanged(value); } } ./src/Ubuntu/Test/plugin/uctestextras.h0000644000015600001650000000464312700370701020276 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef TESTEXTRAS_H #define TESTEXTRAS_H #include class QQuickItem; class QTouchDevice; class UCTestExtras : public QObject { Q_OBJECT Q_PROPERTY(bool touchPresent READ touchDevicePresent NOTIFY touchDevicePresentChanged) public: explicit UCTestExtras(QObject *parent = 0); Q_SIGNALS: void touchDevicePresentChanged(); public Q_SLOTS: static QString openGLflavor(); static QString cpuArchitecture(); static bool touchDevicePresent(); static void registerTouchDevice(); static void touchPress(int touchId, QQuickItem *item, const QPoint &point); static void touchRelease(int touchId, QQuickItem *item, const QPoint &point); static void touchClick(int touchId, QQuickItem *item, const QPoint &point); static void touchLongPress(int touchId, QQuickItem *item, const QPoint &point); static void touchDoubleClick(int touchId, QQuickItem *item, const QPoint &point); static void touchMove(int touchId, QQuickItem *item, const QPoint &point); static void touchDrag(int touchId, QQuickItem *item, const QPoint &from, const QPoint &delta, int steps = 5); static void mouseDrag(QQuickItem *item, const QPoint &from, const QPoint &delta, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0, int steps = -1, int delay = -1); static void removeTimeConstraintsFromSwipeArea(QQuickItem *item); public: // yet for cpp use static void touchDragWithPoints(int touchId, QQuickItem *item, QList points, int delay = -1); static void mouseDragWithPoints(QQuickItem *item, QList points, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0, int delay = -1); private: static QTouchDevice *m_touchDevice; static UCTestExtras *m_testExtras; friend class UCMouseTouchAdaptor; }; #endif // TESTEXTRAS_H ./src/Ubuntu/Test/qmldir0000644000015600001650000000026512700370714015304 0ustar jenkinsjenkinsmodule Ubuntu.Test plugin UbuntuTest UbuntuTestCase 0.1 UbuntuTestCase.qml #version 1.0 UbuntuTestCase 1.0 UbuntuTestCase.qml #version 1.3 UbuntuTestCase 1.3 UbuntuTestCase13.qml ./src/Ubuntu/UbuntuToolkit/0000755000015600001650000000000012700370716016001 5ustar jenkinsjenkins./src/Ubuntu/UbuntuToolkit/tree.cpp0000644000015600001650000001532212700370701017441 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "tree.h" #include #include namespace UbuntuToolkit { class TreePrivate : public QObjectPrivate { public: // list of nodes QList m_nodes; // list of parent nodes QList m_parents; // list of stems QList m_stems; }; Tree::Tree(QObject *parent) : QObject((*new TreePrivate), parent) { } // Return the index of the given node. // Returns -1 the node was not found. int Tree::index(QObject *node) const { return d_func()->m_nodes.indexOf(node); } // Add newNode to the tree in the specified stem, with the specified parent node. // The root node should be added with parentNode null. All other nodes must be added // with a parentNode that is already in the tree. bool Tree::add(const int stem, QObject *parentNode, QObject *newNode) { Q_D(Tree); if (index(newNode) != -1) { qWarning("Cannot add the same node twice to a tree."); return false; } if (d->m_nodes.size() == 0) { // adding root node if (parentNode != nullptr) { qWarning("Root node must have parentNode null."); return false; } } else { // adding non-root node if (parentNode == nullptr) { qWarning("Only root node has parentNode null."); return false; } if (index(parentNode) == -1) { qWarning("Cannot add non-root node if parentNode is not in the tree."); return false; } } d->m_nodes.push_back(newNode); d->m_stems.push_back(stem); d->m_parents.push_back(parentNode); return true; } // Remove all nodes from the specified stem and higher stems. // // Returns the removed nodes. QList Tree::prune(const int stem) { Q_D(Tree); QList newNodes; QList newParents; QList removedNodes; QList newStems; for (int i = 0; i < d->m_nodes.length(); i++) { if (d->m_stems[i] < stem) { newNodes.push_back(d->m_nodes.at(i)); newStems.push_back(d->m_stems.at(i)); newParents.push_back(d->m_parents.at(i)); } else { removedNodes.push_back(d->m_nodes.at(i)); } } d->m_nodes = newNodes; d->m_parents = newParents; d->m_stems = newStems; return removedNodes; } // Chops all nodes with an index higher than the given node which // are in the same stem or a higher stem. // // If, and only if, (inclusive) then also chop the given node. // // Default values for node and inclusive are top() and true. // Returns a list that contains the nodes that were chopped. QList Tree::chop(const QVariant &jsNode, const QVariant &jsInclusive) { Q_D(Tree); QObject *node = nullptr; if (!jsNode.isValid()) node = top(); else node = jsNode.value(); bool inclusive = true; if (jsInclusive.isValid() && jsInclusive.canConvert()) inclusive = jsInclusive.toBool(); int nodeIndex = index(node); if (nodeIndex < 0) { // given node is not in the tree. return QList(); } int size = 0; if (inclusive) { size = nodeIndex; } else { size = nodeIndex + 1; } // Nodes with index(node) >= nodeIndex && stem >= stems[nodeIndex]; QList badNodes; // to fill below // Nodes with index(node) >= nodeIndex (any stem). // Potential bad nodes to be removed. QList uglyNodes = d->m_nodes.mid(size); QList uglyParents = d->m_parents.mid(size); QList uglyStems = d->m_stems.mid(size); // to check below int stem = d->m_stems[nodeIndex]; // Good nodes, with index(node) < nodeIndex && stem < stems[nodeIndex]: d->m_nodes = d->m_nodes.mid(0, size); d->m_stems = d->m_stems.mid(0, size); d->m_parents = d->m_parents.mid(0, size); // Add nodes with index(node) > nodeIndex && stem < stems[nodeIndex] back: for (int i = 0; i < uglyNodes.length(); i++) { if (uglyStems.at(i) < stem) { // Because the stem of the parentNode <= stem of the node, // the node that is added back has the parentNode in nodes. d->m_nodes.push_back(uglyNodes.at(i)); d->m_stems.push_back(uglyStems.at(i)); d->m_parents.push_back(uglyParents.at(i)); } else { badNodes.push_back(uglyNodes.at(i)); } } return badNodes; } // Returns the n'th node when traversing one or more stems from the // top down. When exactMatch, only the specified stem is traversed, and // when !exactMatch the specified stem and all higher stems are traversed. // // Returns null if no matching node was found. // // Default value for stem: 0 // Default value for exactMatch: false // Default value for n: 0 (first node) // // Calling top() with no parameters returns top(0, false, 0) which is the // last node that was added to the tree. QObject *Tree::top(const QVariant &jsStem, const QVariant &jsExactMatch, const QVariant &jsN) const { const Q_D(Tree); int stem = 0; bool exactMatch = false; int n = 0; //@FIXME remove this part once we do not need to export Tree to JS anymore if (jsStem.isValid() && jsStem.canConvert()) stem = jsStem.value(); if (jsExactMatch.isValid() && jsExactMatch.canConvert()) exactMatch = jsExactMatch.toBool(); if (jsN.isValid() && jsN.canConvert()) n = jsN.value(); int st; int count = n; for (int i = d->m_nodes.size() - 1; i >= 0; i--) { st = d->m_stems[i]; if ((exactMatch && st == stem) || (!exactMatch && st >= stem)) { count--; } if (count < 0) { return d->m_nodes.at(i); } } return nullptr; } // Return the parent node of the specified node in the tree QObject *Tree::parent(QObject *node) const { const Q_D(Tree); int i = index(node); if (i == -1 //Specified node not found in tree. || i == 0 ) { //Root node has no parent node. return nullptr; } return d->m_parents.at(i); } } ./src/Ubuntu/UbuntuToolkit/UbuntuToolkit.pro0000644000015600001650000000064512700370714021356 0ustar jenkinsjenkinsTEMPLATE=lib TARGET=UbuntuToolkit QT *= core-private gui-private qml qml-private quick quick-private CONFIG += dll no_keywords c++11 INCLUDEPATH+=$$PWD DEFINES += UBUNTUTOOLKIT_LIBRARY load(qt_build_config) load(ubuntu_qt_module) HEADERS += \ colorutils.h \ ubuntutoolkitglobal.h \ tree.h \ asyncloader.h \ asyncloader_p.h SOURCES += \ colorutils.cpp \ tree.cpp \ asyncloader.cpp ./src/Ubuntu/UbuntuToolkit/colorutils.cpp0000644000015600001650000000154212700370701020700 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "colorutils.h" #include namespace UbuntuToolkit { ColorUtils::ColorUtils(QObject *parent) : QObject(parent) {} qreal ColorUtils::luminance(const QColor &color) { return color.lightnessF(); } } ./src/Ubuntu/UbuntuToolkit/tree.h0000644000015600001650000000277612700370701017117 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef TREE_H #define TREE_H #include #include #include "ubuntutoolkitglobal.h" namespace UbuntuToolkit { class TreePrivate; class UBUNTUTOOLKIT_EXPORT Tree : public QObject { Q_OBJECT public: explicit Tree(QObject *parent = 0); Q_INVOKABLE int index(QObject *node) const; Q_INVOKABLE bool add(const int stem, QObject *parentNode,QObject *newNode); Q_INVOKABLE QList prune(const int stem); Q_INVOKABLE QList chop(const QVariant &jsNode, const QVariant &jsInclusive = QVariant(true)); Q_INVOKABLE QObject *top(const QVariant &jsStem = QVariant(0), const QVariant &jsExactMatch = QVariant(false), const QVariant &jsN = QVariant(0)) const; Q_INVOKABLE QObject *parent(QObject *node) const; private: Q_DECLARE_PRIVATE(Tree) }; } #endif // TREE_H ./src/Ubuntu/UbuntuToolkit/colorutils.h0000644000015600001650000000173012700370701020344 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef COLORUTILS_H #define COLORUTILS_H #include #include "ubuntutoolkitglobal.h" namespace UbuntuToolkit { class UBUNTUTOOLKIT_EXPORT ColorUtils : public QObject { Q_OBJECT public: explicit ColorUtils(QObject *parent = 0); Q_INVOKABLE static qreal luminance(const QColor &color); }; } #endif // COLORUTILS_H ./src/Ubuntu/UbuntuToolkit/asyncloader.h0000644000015600001650000000306012700370714020453 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef ASYNCLOADER_H #define ASYNCLOADER_H #include #include class QQuickItem; class QQmlContext; namespace UbuntuToolkit { class AsyncLoaderPrivate; class UBUNTUTOOLKIT_EXPORT AsyncLoader : public QObject { Q_OBJECT public: enum LoadingStatus { Null, Compiling, Loading, Initializing, Ready, Error, Reset }; explicit AsyncLoader(QObject *parent = 0); ~AsyncLoader(); bool load(const QUrl &url, QQmlContext *context); bool load(QQmlComponent *component, QQmlContext *context); bool reset(); LoadingStatus status(); void forceCompletion(); Q_SIGNALS: void loadingStatus(AsyncLoader::LoadingStatus status, QObject *object); protected: Q_DECLARE_PRIVATE(AsyncLoader) }; } // namespace UbuntuToolkit #endif // ASYNCLOADER_H ./src/Ubuntu/UbuntuToolkit/asyncloader.cpp0000644000015600001650000001365712700370714021023 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #include "asyncloader_p.h" #include #include #include namespace UbuntuToolkit { AsyncLoader::AsyncLoader(QObject *parent) : QObject(*(new AsyncLoaderPrivate), parent) { } AsyncLoader::~AsyncLoader() { reset(); } // incubator methods void AsyncLoaderPrivate::setInitialState(QObject *object) { emitStatus(AsyncLoader::Initializing, object); } AsyncLoader::LoadingStatus incubatorToLoadingStatus(QQmlIncubator::Status status) { switch (status) { case QQmlIncubator::Null: return AsyncLoader::Null; case QQmlIncubator::Ready: return AsyncLoader::Ready; case QQmlIncubator::Loading: return AsyncLoader::Loading; case QQmlIncubator::Error: return AsyncLoader::Error; } // unlikely to be reached, but must satisfy compiler return AsyncLoader::Null; } void AsyncLoaderPrivate::statusChanged(Status status) { if (status == QQmlIncubator::Error) { QList e = errors(); for (int i = 0; i < e.size(); i++) { // remove quotes and any leading/trailing whitespace qWarning().noquote() << e[0].toString().trimmed(); } } if (status != QQmlIncubator::Loading) { detachComponent(); } // we should emit the status change only after we do the cleanup emitStatus(incubatorToLoadingStatus(status)); } // procected methods void AsyncLoaderPrivate::emitStatus(AsyncLoader::LoadingStatus status, QObject *object) { if (this->status == status) { return; } this->status = status; if (!object) { object = this->object(); } Q_EMIT q_func()->loadingStatus(this->status, object); } void AsyncLoaderPrivate::detachComponent() { if (!component) { return; } if (componentHandler) { QObject::disconnect(*componentHandler); } componentHandler.reset(); if (ownComponent) { component->deleteLater(); } component = nullptr; ownComponent = false; } void AsyncLoaderPrivate::onComponentStatusChanged(QQmlComponent::Status status) { if (status == QQmlComponent::Error) { QString error = component->errorString(); // remove quotes and any leading/trailing whitespace qWarning().noquote() << error.trimmed(); detachComponent(); emitStatus(AsyncLoader::Error); return; } if (status == QQmlComponent::Ready) { component->create(*this, context); } } /*! * \brief AsyncLoader::load * \param url * \param context * \return bool * The method initiates the loading of a given \e url within a specific \e context. * Returns true on success. * \note If the loading is initiated while there is a previous loading in place, * you must make sure you delete the object from the previous loading before you * trigger the new load. */ bool AsyncLoader::load(const QUrl &url, QQmlContext *context) { if (!reset() || !context) { return false; } Q_D(AsyncLoader); if (url.isEmpty() || !url.isValid()) { d->emitStatus(Ready); return false; } d->ownComponent = true; return load(new QQmlComponent(context->engine(), url, QQmlComponent::Asynchronous), context); } /*! * \brief AsyncLoader::load * \param component * \param context * \return bool * The method initiates the loading of a \e component within the given \e context. * Returns true on success. * \note If the loading is initiated while there is a previous loading in place, * you must make sure you delete the object from the previous loading before you * trigger the new load. */ bool AsyncLoader::load(QQmlComponent *component, QQmlContext *context) { if (!reset() || !context) { return false; } Q_D(AsyncLoader); if (!component) { d->emitStatus(Ready); return false; } d->component = component; d->context = context; if (d->component->isLoading()) { d->emitStatus(Compiling); auto callback = [d] (QQmlComponent::Status status) { d->onComponentStatusChanged(status); }; d->componentHandler.reset(new QMetaObject::Connection); *(d->componentHandler) = QObject::connect(d->component, &QQmlComponent::statusChanged, callback); } else { d->onComponentStatusChanged(d->component->status()); } return true; } /*! * \brief AsyncLoader::reset * \return bool * Clears the incubator and emits loadingStatus() signal with \c Reset status. * The loader can be reset only if the status passed \c Loading. Returns true * if the reset was successful, or when the loader status is \c Ready or * \c Error. */ bool AsyncLoader::reset() { Q_D(AsyncLoader); if (d->status < Loading) { return false; } if (d->status >= Ready) { return true; } d->clear(); // make sure the listeners are getting the reset so they can delete the object d->emitStatus(Reset); return true; } /*! * \brief AsyncLoader::status * \return LoadingStatus * Returns the status of the loader. */ AsyncLoader::LoadingStatus AsyncLoader::status() { return d_func()->status; } /*! * \brief AsyncLoader::forceCompletion * Forces loading completion. */ void AsyncLoader::forceCompletion() { d_func()->forceCompletion(); } } // namespace UbuntuToolkit ./src/Ubuntu/UbuntuToolkit/ubuntutoolkitglobal.h0000644000015600001650000000161412700370701022257 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UBUNTUTOOLKITGLOBAL_H #define UBUNTUTOOLKITGLOBAL_H #include #if defined(UBUNTUTOOLKIT_LIBRARY) # define UBUNTUTOOLKIT_EXPORT Q_DECL_EXPORT #else # define UBUNTUTOOLKIT_EXPORT Q_DECL_IMPORT #endif #endif // UBUNTUTOOLKITGLOBAL_H ./src/Ubuntu/UbuntuToolkit/asyncloader_p.h0000644000015600001650000000315712700370714021001 0ustar jenkinsjenkins/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ #ifndef ASYNCLOADER_P_H #define ASYNCLOADER_P_H #include #include #include namespace UbuntuToolkit { class AsyncLoaderPrivate : public QObjectPrivate, public QQmlIncubator { Q_DECLARE_PUBLIC(AsyncLoader) public: AsyncLoaderPrivate() : QObjectPrivate() , QQmlIncubator(Asynchronous) {} QSharedPointer componentHandler; QQmlComponent *component = nullptr; QQmlContext *context = nullptr; AsyncLoader::LoadingStatus status = AsyncLoader::Ready; bool ownComponent = false; void setInitialState(QObject *object) override; void statusChanged(Status status) override; void emitStatus(AsyncLoader::LoadingStatus status, QObject *object = 0); void onComponentStatusChanged(QQmlComponent::Status status); void detachComponent(); }; } // namespace UbuntuToolkit #endif // ASYNCLOADER_P_H ./src/src.pro0000644000015600001650000000136612700370701013200 0ustar jenkinsjenkinsTEMPLATE = subdirs src_components.subdir = Ubuntu/Components src_components.target = sub-components src_components.depends = sub-gestures sub-libtoolkit # just for the module .pri file src_layouts.subdir = Ubuntu/Layouts src_layouts.target = sub-layouts src_performance_metrics.subdir = Ubuntu/PerformanceMetrics src_performance_metrics.target = sub-performance-metrics src_gestures.subdir = Ubuntu/UbuntuGestures src_gestures.target = sub-gestures src_toolkitlib.subdir = Ubuntu/UbuntuToolkit src_toolkitlib.target = sub-libtoolkit src_test.subdir = Ubuntu/Test src_test.target = sub-test src_test.depends = sub-components #order is important SUBDIRS += src_toolkitlib src_gestures src_components src_layouts src_performance_metrics src_test ./README0000644000015600001650000000360712700370714011764 0ustar jenkinsjenkins================= Ubuntu UI Toolkit ================= Introduction ------------ This project consists of a set of QML components to ease the creation of beautiful applications in QML for Ubuntu. QML alone lacks built-in components for basic widgets like Button, Slider, Scrollbar, etc, meaning a developer has to build them from scratch. This toolkit aims to stop this duplication of work, supplying beautiful components ready-made and with a clear and consistent API. These components are fully themeable so the look and feel can be easily customized. Resolution independence technology is built in so UIs are scaled to best suit the display. Other features: - localisation through gettext This project supports QML2 and above. Building & Setup ---------------- You need Qt5 installed to proceed. To build this repository, run $ qmake $ make View the components gallery by running $ ./gallery.sh To install these components, run $ make install You may need to be root for this command to succeed. To use these components in QML without installing them, you need to set the QML2_IMPORT_PATH environment variable. This is done by running $ source export_qml_dir.sh from the root directory of this repository, but is lost when you close your shell. Documentation ------------- Once built, you may view the documentation by opening documentation/html/overview-ubuntu-sdk.html in your favorite web browser. Autopilot SDK Helpers Documentation (Sphinx docs): ++++++++++++++++++++++++++++++++++++++++++++++++++ To build the Autopilot SDK Helpers documentation, you need to install sphinx. After installation, change directory to documentation/autopilot-helpers and executing make. * $ sudo apt-get install python3-sphinx * $ cd documentation/autopilot-helpers * $ make singlehtml * Once built, you may view the documentation by opening `_build/singlehtml/index.html` in your favorite web browser. ./po/0000755000015600001650000000000012700370701011510 5ustar jenkinsjenkins./po/pl.po0000644000015600001650000002401712700370701012467 0ustar jenkinsjenkins# Polish translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-01-22 18:38+0000\n" "Last-Translator: Seweryn Opyd \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Zaznacz wszystko" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Wytnij" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Skopiuj" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Wklej" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Powrót" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Usuń" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Nie określono usługi/ścieżki" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Nieprawidłowy rodzaj magistrali: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Teraz" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "Przed %1 minutą" msgstr[1] "Przed %1 minutami" msgstr[2] "%1 minut temu" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minuta" msgstr[1] "%1 minuty" msgstr[2] "%1 minut" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "H:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Wczoraj 'H:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Wczoraj 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Jutro 'H:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Jutro 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "dddd' 'H:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "dddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "dddd MMMM' 'H:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "dddd MMMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView nie ma zaimplementowanej obsługi sygnału ViewItems.dragUpdated(). " "Przeciąganie nie będzie możliwe." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "właściwość „%1” obiektu %2 ma typ %3 i nie może być ustawiona na wartość " "„%4” typu %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "właściwość „%1” nie istnieje lub nie może zostać zapisana z obiektem %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarm" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Alarm ma zaplanowaną operację" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Użycie: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opcje:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 oczekuje dodatkowego argumentu: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 oczekuje wartości argumentu: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 oczekuje dodatkowych argumentów: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "rozwać nadpisanie slotu swipeEvent()!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "rozwać nadpisanie slotu rebound()!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" "Ignorowanie priorytetu „AfterItem” dotyczącego filtrów „InverseMouse”." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Zmiana parametrów połączenia zabroniona." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "Wiązanie wykryte na własności '%1' będzie usunięte przez aktualizacje usług." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Ostrzeżenie: załącznik musi posiadać identyfikator. Stan nie zostanie " "zapisany." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Ostrzeżenie: unikatowy identyfikator uniwersalny załącznika jest już " "zarejestrowany, stan nie zostanie zapisany: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Każda macierz musi posiadać identyfikator.\n" "Zapisywanie stanu wstrzymane dla %1, klasy %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Nie odnaleziono motywu: \"%1\"" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "To nie jest komponent palety." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Tryb przeciągania wymaga ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Przeciąganie jest wspierane podczas użycia QAbstractItemModel, ListModel " "albo listy." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Anuluj" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Zatwierdź" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Zamknij" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Zakończono" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "W toku" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Puść aby odświeżyć" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Pociągnij aby odświeżyć" #~ msgid "Theme not found: " #~ msgstr "Nie znaleziono motywu: " ./po/bs.po0000644000015600001650000002225412700370701012461 0ustar jenkinsjenkins# Bosnian translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-08-28 16:45+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Izaberi sve" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Izreži" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopiraj" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Zalijepi" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Nazad" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Izbriši" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "osobina \"%1\" objekta %2 je tipa %3 i ne može biti postavljena na " "vrijednost \"%4\" tipa %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "osobina \"%1\" ne postoji ili nije moguće zapisivanje za objekt %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarm" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Alarm ima operaciju na čekanju." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Upotreba: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opcije:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 očekuje dodatni argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 očekuje vrijednost za argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 očekuje dodatni argument: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" "Ignorisanje AfterItem (poslije stavke) prioriteta za InverseMouse (obrnuti " "miš) filter." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Upozorenje: ataše mora imati identifikaciju. Stanje neće biti snimljeno." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Upozorenje: UUID atašea je već registrovan, stanje neće biti snimljeno: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Svi glavni direktoriji moraju imati identifikaciju.\n" "Snimanje stanja isključeno za %1, klasa %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Odustani" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Potvrdi" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Zatvori" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Urađeno" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "U toku" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Oslobodi za osvježenje..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Povuci za osvježenje..." #~ msgid "Theme not found: " #~ msgstr "Tema nije pronađena: " ./po/pa.po0000644000015600001650000002127612700370701012460 0ustar jenkinsjenkins# Punjabi translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-08-30 11:52+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Punjabi \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "ਸਭ ਚੁਣੋ" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "ਕੱਟੋ" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "ਕਾਪੀ ਕਰੋ" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "ਚੇਪੋ" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "ਅਲਾਰਮ" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "ਅਲਾਰਮ ਲਈ ਕਾਰਵਾਈ ਬਾਕੀ ਪਈ ਹੈ।" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "ਵਰਤੋਂ: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "ਚੋਣਾਂ:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "ਰੱਦ ਕਰੋ" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "ਪੁਸ਼ਟੀ" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "ਬੰਦ ਕਰੋ" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "ਮੁਕੰਮਲ" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "ਜਾਰੀ ਹੈ" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "...ਤਾਜ਼ਾ ਕਰਨ ਲਈ ਰੀਲਿਜ਼" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "...ਤਾਜ਼ਾ ਕਰਨ ਲਈ ਖਿੱਛੋ" #~ msgid "Theme not found: " #~ msgstr "ਥੀਮ ਨਹੀਂ ਲੱਭਿਆ " ./po/update-pot.sh0000755000015600001650000000314512700370701014134 0ustar jenkinsjenkins#!/bin/sh # # Copyright 2012 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # #~ Usage: #~ update-pot.sh [DOMAIN] [SOURCE_DIR] [PO_DIR] #~ #~ Example: #~ update-pot.sh ubuntu-ui-toolkit modules po set -e if [ -z "$3" ]; then grep -e '^#~' $0 | sed s/#~// exit 0 fi DOMAIN=$1 SOURCE_DIR=$(readlink -f $2) PO_DIR=$(readlink -f $3) PROGNAME=$(basename $0) # Create a list of files to scan GETTEXT_FILES=$(mktemp --tmpdir $DOMAIN.lst.XXXXX) trap 'rm -f "$GETTEXT_FILES"' EXIT cd $SOURCE_DIR find \( -name '*.cpp' -o -name '*.qml' -o -name '*.js' -o -name '*.desktop' \) \ -a ! \( -path './build/*' \) | sort \ > $GETTEXT_FILES # Generate pot from our list xgettext \ --output $PO_DIR/$DOMAIN.pot \ --files-from $GETTEXT_FILES \ --qt --c++ \ --add-comments=TRANSLATORS \ --keyword=tr \ --keyword=tr:1,2 \ --keyword=dtr:2 \ --keyword=dtr:2,3 \ --keyword=tag \ --keyword=tag:1,2 \ --package-name $DOMAIN \ --copyright-holder "Canonical Ltd" echo "$PROGNAME: $PO_DIR/$DOMAIN.pot updated based on $SOURCE_DIR" ./po/az.po0000644000015600001650000002047312700370701012470 0ustar jenkinsjenkins# Azerbaijani translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-08-22 08:00+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Azerbaijani \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Hamısını Seç" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Kəs" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopyala" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Əlavə et" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "İstifadə: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Seçimlər:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/gl.po0000644000015600001650000002353612700370701012463 0ustar jenkinsjenkins# Galician translation for ubuntu-ui-toolkit # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2013-07-21 20:10+0000\n" "Last-Translator: Miguel Anxo Bouzada \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Selecionar todo" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Cortar" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Copiar" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Pegar" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Atrás" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Eliminar" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Sen servizo/ruta especificada" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Tipo de bus incorrecto: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Agora" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "Hai %1 minuto" msgstr[1] "Hai %1 minutos" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minuto" msgstr[1] "%1 minutos" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Onte 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Onte 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Mañá 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Mañá 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView non ten implementado un manexador para ViewItems.dragUpdated(). Non " "será posíbel o arrastre." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "a propiedade «%1» do obxecto %2 ten o tipo %3 e non pode tomar o valor «%4» " "do tipo %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "a propiedade «%1» non existe ou non é escribíbel para o obxecto %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarma" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "A alarma ten unha operación pendente." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Uso: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opcións:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 está agardando por un argumento adicional: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 está agardando por un valor para o argumento: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 está agardando por argumentos adicionais: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "considerar anular o slot de swipeEvent()." #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "considerar a anulación do slot rebound()." #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Ignorando a prioridade AfterItem para filtros InverseMouse." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "O cambio dos parámetros da conexión está prohibido." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "A ligazón detectada na propiedade «%1» eliminarase polas actualizacións do " "servizo." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Aviso: o anexo debe ter un ID. Non se gardará o estado." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "Aviso: o UUID do anexo xa se rexistrou, non se gardará o estado: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Todos os pais deben ter un identificador.\n" "Desactivouse o gardado do estado para %1, clase %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Non se atopou o tema: «%1»" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Non é un compoñente da paleta." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "O modo arrastrar require ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "O arrastre só é posíbel cando se usa QAbstractItemModel, ListModel ou lista." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Cancelar" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Confirmar" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Pechar" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Feito" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "En proceso" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Soltar para actualizar..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Tirar para actualizar..." #~ msgid "Theme not found: " #~ msgstr "Non foi posíbel atopar o tema: " ./po/nl.po0000644000015600001650000002304412700370701012464 0ustar jenkinsjenkins# Dutch translation for ubuntu-ui-toolkit # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2013-05-31 13:18+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Alles selecteren" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Knippen" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopiëren" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Plakken" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Terug" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Verwijderen" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Geen dienst/pad opgegeven" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Ongeldig bustype: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Nu" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 minuut geleden" msgstr[1] "%1 minuten geleden" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minuut" msgstr[1] "%1 minuten" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView heeft geen ViewItems.dragUpdated() signaal-afhandeling " "geïmplementeerd. Slepen zal niet mogelijk zijn." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "eigenschap \"%1\" van object %2 is van type %3 en kan niet worden ingesteld " "op waarde \"%4\" van type %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "eigenschap \"%1\" bestaat niet of is niet beschrijfbaar voor object %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Wekker" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Wekker heeft een lopende operatie." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Gebruik: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opties:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 verwacht een extra argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 verwacht een waarde voor het argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 verwacht extra argumenten: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Afteritem-prioriteit voor InverseMouse-filters wordt genegeerd." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Wijzigen van verbindingsparameters niet toegestaan." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "De binding die gedetecteerd is voor eigenschap ‘%1’ zal worden verwijderd " "bij het bijwerken van de dienst." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Opgelet: gebruiker moet een ID hebben. Er wordt niet opgeslagen." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Opgelet: de opgegeven UUID is al in gebruik. Er wordt niet opgeslagen: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Alle ouders moeten een ID hebben.\n" "Opslaan van status uitgezet voor %1, klasse %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Thema niet gevonden: \"%1\"" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Geen onderdeel van het palet." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Sleepmodus vereist ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Annuleren" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Bevestigen" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Sluiten" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Klaar" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Bezig" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Loslaten om te verversen…" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Trekken om te verversen…" #~ msgid "Theme not found: " #~ msgstr "Thema niet gevonden: " ./po/ca.po0000644000015600001650000002224412700370701012437 0ustar jenkinsjenkins# Catalan translation for ubuntu-ui-toolkit # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-01-16 12:07+0000\n" "Last-Translator: Adolfo Jayme \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Selecciona-ho tot" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Retalla" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Copia" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Enganxa" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Enrere" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Suprimeix" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Ara" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "Fa %1 minut" msgstr[1] "Fa %1 minuts" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minut" msgstr[1] "%1 minuts" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "H.mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "la propietat \"%1\" de l'objecte %2 té tipus %3 i no es pot establir al " "valor \"%4\" de tipus %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "la propietat \"%1\" no existeix o no es pot escriure per a l'objecte %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarma" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "L'alarma té una operació pendent" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Sintaxi: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opcions:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 està esperant un argument addicional: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 està esperant un valor per a l'argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 està esperant arguments addicionals: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "S'ignorarà la prioritat Afteritem per als filtres InverseMouse." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Advertiment: l'adjunt ha de tener una ID. No es desarà l'estat." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Advertiment: l'UUID de l'adjunt ja està registrat, no es desarà l'estat: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Tots els pares han de tenir una id.\n" "S'ha desactivat el desament de l'estat per a %1, classe %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Cancel·la" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Confirma" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Tanca" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Fet" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "En curs" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Deixeu anar per actualitzar..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Estireu per actualitzar..." #~ msgid "Theme not found: " #~ msgstr "No s'ha trobat el tema: " ./po/ia.po0000644000015600001650000002252712700370701012451 0ustar jenkinsjenkins# Interlingua translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-05-04 16:57+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Interlingua \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Seliger toto" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Taliar" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Copiar" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Collar" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Retornar" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Deler" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Typo de bus non valide: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Ora" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "il ha %1 minuta" msgstr[1] "il ha %1 minutas" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minuta" msgstr[1] "%1 minutas" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "Le proprietate \"%1\" del objecto %2 es de typo %3 e non pote ser " "configurate al valor \"%4\" del typo %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "Le proprietate \"%1\" non existe o non es scribibile pro le objecto %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarma" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Alarma, il ha un operation pendente." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Uso: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Optiones:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 es expectante un argumento additional: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 es expectante un valor pro le argumento: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 es expectante le argumentos additional: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" "Ignorante le prioritate del PostElemento pro le filtros del MouseInverse." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Cambiamento del parametros de connexion prohibite." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Advertimento: le alligato debe haber un ID. Le stato non essera salvate." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Advertimento: le UUID del alligato es ja registrate, le stato non essera " "salvate: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Tote le the parentes debe haber un id.\n" "Le salvamento del stato es impedite pro le %1, classe %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Deler" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Confirmar" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Clauder" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Facite" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "In curso" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Laxar pro refrescar..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Tirar pro refrescar…" #~ msgid "Theme not found: " #~ msgstr "Thema non trovate: " ./po/zh_TW.po0000644000015600001650000002311112700370701013101 0ustar jenkinsjenkins# Chinese (Traditional) translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-08-15 02:30+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Chinese (Traditional) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "全選" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "剪下" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "複製" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "貼上" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "返回" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "刪除" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "沒有指定服務/路徑" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "無效的匯流排類型: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "立即" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 分鐘前" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 分鐘" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "ap h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'昨日 'ap h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'昨日 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'明日 'ap h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'明日 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "(ddd)' 'ap h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "(ddd)' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "(ddd) M月d日' 'ap h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "(ddd) M月d日' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "ListView 沒有實現 ViewItems.dragUpdated() 訊號處理:拖動操作不能。" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "\"%2\" 物體其中的 \"%1\" 性質是 \"%3\" 的類型, 所以不能擺定 \"%5\" 類型的 \"%4\" 值" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "財產“%1”不存在或不可寫的對象%2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "警告" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "報警器有一個掛起操作。" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "用途: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "選項:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 正預期一個附加引數:%2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 正預期一個引數值:%2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 正預期附加引數:%2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "請考慮過載 swipeEvent() 槽!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "請考慮過載 rebound() 槽!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "忽略AfterItem優先InverseMouse過濾器。" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "禁止修改連線參數。" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "在屬性'%1'上偵測到的繫結將在服務升級後被移除。" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "警告:attachee 必須有一個 ID。狀態將不被儲存。" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "警告:attachee 的 UUID 已被註冊,狀態不會被儲存:%1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "所有的家長都必須有一個ID。\n" "國家儲蓄%1已禁用,類%2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "主題沒有找到: \"%1\"" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "並非調色盤元件。" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "需要 ListView 進行拖放模式" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "拖放僅在使用 QAbstractItemModel, ListModel 或 list 時被支援。" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "取消" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "確認" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "關閉" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "完成" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "進行中" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "釋放以重新整理..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "拉刷新" #~ msgid "Theme not found: " #~ msgstr "主題未找到: " ./po/ca@valencia.po0000644000015600001650000002064112700370701014241 0ustar jenkinsjenkins# Catalan (Valencian) translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-11-07 06:47+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Catalan (Valencian) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Selecciona-ho tot" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Retalla" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Copia" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Apega" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarma" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opcions:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Cancel·la" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Confirma" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Tanca" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Fet" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "En curs" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Deixeu anar per actualitzar..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Estireu per actualitzar..." ./po/hi.po0000644000015600001650000002036312700370701012454 0ustar jenkinsjenkins# Hindi translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-01-05 14:49+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Hindi \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/nb.po0000644000015600001650000002341612700370701012455 0ustar jenkinsjenkins# Norwegian Bokmal translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-09-07 06:50+0000\n" "Last-Translator: Åka Sikrom \n" "Language-Team: Norwegian Bokmal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Velg alt" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Klipp ut" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopier" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Lim inn" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Tilbake" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Slett" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Ingen tjeneste/sti valgt" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "%1 er en ugyldig busstype." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Nå" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 minutt siden" msgstr[1] "%1 minutter siden" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minutt" msgstr[1] "%1 minutter" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'I går 'hh:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'I går 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'I morgen 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'I morgen 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd.' 'hh:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd.' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd. d. MMM.' 'hh:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd. d. MMM.' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "Ingen ViewItems.dragUpdated()-signalbehandlere er implementert for ListView. " "Dra-handlinger kan ikke utføres." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "egenskapen «%1» for objektet %2 er av typen %3, og kan ikke ha verdien «%4» " "av typen %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "egenskapen «%1» finnes ikke eller kan ikke skrives for objektet %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarm" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Alarm venter på å utføre en handling." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Bruk: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Valg:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 forventer et annet argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 forventer en verdi for argumentet: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 forventer flere argumenter: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "du bør vurdere å overstyre swipeEvent()." #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "du bør vurdere å overstyre rebound()." #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Ignorerer AfterItem-prioritering av InverseMouse-filtre." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Endring av tilkoblingsparametre er ikke tillatt." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "Oppdaget tildeling på «%1» blir fjernet under tjenesteoppdateringer." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Advarsel: vedleggsmålet må ha en ID. Tilstanden blir ikke lagret." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Advarsel: vedleggsmålets UUID er alle registrert. Tilstanden blir ikke " "lagret. %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Alle foreldre må ha en ID.\n" "Tilstanden lagres ikke for %1, klasse %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Fant ikke temaet «%1»" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Ikke en del av Palette." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Dra-modus krever ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Dra-handlinger kan bare utføres ved bruk av QAbstractItemModel, ListModel " "eller en liste." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Avbryt" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Bekreft" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Lukk" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Ferdig" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Pågår" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Slipp for å oppdatere …" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Dra for å oppdatere …" #~ msgid "Theme not found: " #~ msgstr "Fant ikke tema: " ./po/cs.po0000644000015600001650000002314212700370701012457 0ustar jenkinsjenkins# Czech translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-10-12 19:03+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Vybrat vše" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Vyjmout" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopírovat" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Vložit" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Zpět" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Odstranit" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Žádná služba ani cesta nebyla zadána." #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Neplatný typ sběrnice: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Nyní" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "Před %1 minutou" msgstr[1] "Před %1 minutami" msgstr[2] "Před %1 minutami" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minuta" msgstr[1] "%1 minuty" msgstr[2] "%1 minut" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Včera 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Včera 'HHmm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Zítra 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Zítra 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView nemá implementovanou funkci ViewItems.dragUpdated(). Přetahávání " "není dostupné." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "vlastnost \"%1\" objektu %2 je typu %3 a nelze proto nastavit jako \"%4\" " "typu %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "vlastnost \"%1\"neexistuje a nelze ji proto zapsat pro objekt %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Budík" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Máte čekající upomínku." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Použití: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Možnosti:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 očekává další parametr: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 očekává hodnotu parametru: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 očekává další parametry: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "consider overriding swipeEvent() slot!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "consider overriding rebound() slot!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Priorita AfterItem je ignorována pro InverseMouse filtry." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Změna parametrů připojení není možná." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Všechny rodiče musí mít id.\n" "Ukládání pro %1, třídy %2 zamítnuto" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Vzhled: \"%1\" se nepodařilo najít" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Není prvek palety" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Přetahávání vyžaduje ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Přetahávání je dostupné pouze při použití QAbstractItemModel, ListModel nebo " "list." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Zrušit" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Potvrdit" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Zavřít" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Hotovo" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Probíhá" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Uvolnit pro obnovení..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Přetáhnouot pro obnovení..." #~ msgid "Theme not found: " #~ msgstr "Motiv nebyl nalezen: " ./po/fa.po0000644000015600001650000002350512700370701012443 0ustar jenkinsjenkins# Persian translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-12-10 13:41+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Persian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "گزینش همه" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "برش" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "رونوشت" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "جاگذاری" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "بازگشت" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "حذف" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "هیچ خدمت/مسیری مشخّص نشده" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "گونهٔ bus نامعتبر: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "اکنون" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 دقیقه پیش" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 دقیقه" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'دیروز 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'دیروز 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'فردا 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'فردا 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "ویژگی «%1» شی %2 دارای نوع %3 است و نمی‌تواند به مقدار «%4» از نوع %5 تنظیم " "شود" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "ویژگی «%1» وجود نداشته یا برای شی %2 قابل نوشتن نیست" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "هشدار" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "هشدار یک عملیات معوّق دارد" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "استفاده: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "گزینه‌ها:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "‫%1 یک آرگومان اضافی می‌پذیرد: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "‫%1 یک مقدار برای آرگومان می‌پذیرد: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "‫%1 آرگومان‌های اضافی می‌پذیرد: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "چشم پوشی از مشخّصه‌ی AfterItem برای پالایه‌های InverseMouse." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "تغییر پارامترهای اتّصال ممنوع است." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "هشدار: آتاچی باید یک UUID داشته باشد. حالت ذخیره نخواهد شد: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "هشدار: UUID آتاجی همین الآن هم ثبت شده است، حالت ذخیره نخواهد شد: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "همه‌ی والدین باید یک شنایه داشته باشند.\n" "ذخیره‌ی حالت برای %1 از کلاس %2 غیرفعّال شد" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "زمینه پیدا نشد: «%1»" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "لغو" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "تأیید" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "بستن" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "انجام شد" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "در حال پیشرفت" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "برای تازه‌سازی رها کنید…" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "برای تازه‌سازی بکشید…" #~ msgid "Theme not found: " #~ msgstr "زمینه یافت نشد: " ./po/pt.po0000644000015600001650000002355312700370701012503 0ustar jenkinsjenkins# Portuguese translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-07-03 18:36+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Selecionar tudo" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Cortar" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Copiar" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Colar" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Retroceder" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Eliminar" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Sem serviço/caminho especificado" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Tipo de endereço inválido: %1" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Agora" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "há %1 minuto" msgstr[1] "há %1 minutos" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minuto" msgstr[1] "%1 minutos" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Ontem 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Ontem 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Amanhã 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Amanhã 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView não tem o sinal ViewItems.dragUpdated() implementado. Arrastamento " "não será possível." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "propriedade \"%1\" do objeto %2 tem o tipo %3 e não pode ser definido o " "valor \"%4\" do tipo %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "propriedade \"%1\" não existe ou não editável para o objeto %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarme" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "O alarme tem uma operação pendente." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Utilização: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opções:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 está à espera de um argumento adicional: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 está à espera de um valor para o argumento: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 está à espera de argumentos adicionais: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "considere sobrepor o solt swipeEvent()!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "considere sobrepor o slot rebound()!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Ignorando prioriedade depoisdoitem para filtros de iversãoderato." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Proibido mudar os parâmetros de ligação." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "Vínculo detetado na propriedade '%1' irá ser removido pelas atualizações de " "serviço." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Aviso: o anexo deverá ter uma Id.. O estado não será guardado." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "Aviso: UUID anexado já está registado, estado não pode ser salvo: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Todas as origens devem ter uma id.\n" "Estado de guardar desativado para %1, classe %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Tema não encontrado: \"%1\"" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Não é um componente da Paleta." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Modo de arrastamento requere ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Arrastamento é apenas suportado quando usar um QAbstractItemModel, ListModel " "ou list." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Cancelar" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Confirmar" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Fechar" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Concluído" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Em progresso" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Largar para atualizar..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Puxar para atualizar..." #~ msgid "Theme not found: " #~ msgstr "Tema não encontrado: " ./po/en_GB.po0000644000015600001650000002333212700370701013025 0ustar jenkinsjenkins# English (United Kingdom) translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-07-03 02:03+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: English (United Kingdom) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Select All" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Cut" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Copy" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Paste" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Back" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Delete" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "No service/path specified" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Invalid bus type: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Now" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 minute ago" msgstr[1] "%1 minutes ago" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minute" msgstr[1] "%1 minutes" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Yesterday 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Yesterday 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Tomorrow 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Tomorrow 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "property \"%1\" does not exist or is not writable for object %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarm" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Alarm has a pending operation." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Usage: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Options:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 is expecting an additional argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 is expecting a value for argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 is expecting additional arguments: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "consider overriding swipeEvent() slot!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "consider overriding rebound() slot!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Ignoring AfterItem priority for InverseMouse filters." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Changing connection parameters is forbidden." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "The binding detected on property '%1' will be removed by the service updates." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Warning: attachee must have an ID. State will not be saved." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Warning: attachee's UUID is already registered, state won't be saved: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "All the parents must have an ID.\n" "State saving disabled for %1, class %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Theme not found: \"%1\"" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Not a Palette component." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Dragging mode requires ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Cancel" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Confirm" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Close" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Done" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "In Progress" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Release to refresh..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Pull to refresh..." #~ msgid "Theme not found: " #~ msgstr "Theme not found: " ./po/sq.po0000644000015600001650000002053612700370701012501 0ustar jenkinsjenkins# Albanian translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-07-27 10:18+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Albanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Përzgjidh Gjithçka" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Prije" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopjo" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Ngjit" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Mbrapsht" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Fshije" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarmi" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opsionet:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Anullo" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Konfirmo" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Mbylle" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "U Bë" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Në Zhvillim" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/pt_BR.po0000644000015600001650000002160312700370701013060 0ustar jenkinsjenkins# Brazilian Portuguese translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-01-10 16:05+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Selecionar tudo" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Recortar" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Copiar" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Colar" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Voltar" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Deletar" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "propriedade \"%1\" do objeto %2 tem o tipo %3 e não pode ser ajustado para o " "valor \"%4\" do tipo %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "propriedade \"%1\" não existe ou não é gravável para o objeto %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarme" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Alarme tem uma operação pendente." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Uso: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opções:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 está esperando um argumento adicional: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 está esperando um valor para o argumento: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 está esperando argumentos adicionais: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Ignorando a prioridade AfterItem para filtros InverseMouse." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Cancelar" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Confirmar" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Fechar" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Feito" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Em andamento" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Solte para atualizar..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Puxe para atualizar..." #~ msgid "Theme not found: " #~ msgstr "Tema não encontrado: " ./po/ta.po0000644000015600001650000002036312700370701012460 0ustar jenkinsjenkins# Tamil translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-06-30 11:04+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Tamil \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/sk.po0000644000015600001650000002064512700370701012474 0ustar jenkinsjenkins# Slovak translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-04-04 20:01+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Vymazať" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Použitie: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Možnosti:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 očakáva ďalší prídavný argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 očakáva hodnotu pre argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 očakáva ďalšie argumenty: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/oc.po0000644000015600001650000002315012700370701012452 0ustar jenkinsjenkins# Occitan (post 1500) translation for ubuntu-ui-toolkit # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2013-10-15 16:29+0000\n" "Last-Translator: Cédric VALMARY (Tot en òc) \n" "Language-Team: Occitan (post 1500) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Seleccionar tot" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Talhar" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Copiar" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Pegar" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Precedent" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Suprimir" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Cap de servici/camin pas especificat" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Tipe de bus invalid : %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Ara" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "fa %1 minuta" msgstr[1] "fan %1 minutas" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minuta" msgstr[1] "%1 minutas" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Ièr 'h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Ièr 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Deman 'h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Deman 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "La proprietat « %1 » de l'objècte %2 es de tipe %3 e pòt pas èsser definit a " "la valor « %4 » del tipe %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "La proprietat « %1 » existís pas o es pas inscriptibla per l'objècte %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarma" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "L'alarma a una operacion en espèra." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Utilizacion : " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opcions :" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 espèra un argument suplementari : %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 espèra una valor coma argument : %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 espèra d'arguments suplementaris : %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Ignorar la prioritat AfterItem pels filtres InverseMouse" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "La modificacion dels paramètres de connexion es interdicha." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "L'error detectada sus la proprietat « %1 » serà suprimida pel servici de " "mesas a jorn." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Avertiment : l'estacat deu aver un ID. L'estat serà pas enregistrat." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Avertiment : l'UUID de l'estacat es ja enregistrat, l'estat serà pas " "enregistrat : %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Totes los parents devon aver un identificant.\n" "Enregistrament de l'estat desactivat per %1, classa %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Tèma introbable : « %1 »" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Abandonar" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Confirmar" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Tampar" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Acabat" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "En cors" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Daissatz anar per actualizar..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Tirar per actualizar..." #~ msgid "Theme not found: " #~ msgstr "Tèma introbable : " ./po/sv.po0000644000015600001650000002354312700370701012507 0ustar jenkinsjenkins# Swedish translation for ubuntu-ui-toolkit # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2013-07-03 11:17+0000\n" "Last-Translator: Joachim Johansson \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Markera alla" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Klipp ut" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopiera" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Klistra In" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Bakåt" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Ta bort" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Ingen tjänst/sökväg specificerad" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Ogiltig busstyp: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Nu" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 minut sedan" msgstr[1] "%1 minuter sedan" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minut" msgstr[1] "%1 minuter" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Igår 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Igår 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Imorgon 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Imorgon 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "dd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "dd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "dd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "dd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView har ingen implementerad signalhantering för " "ViewItems.dragUpdated(). Dragning är inte möjligt." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "egenskapen \"%1\" för objektet %2 har typen %3 och kan inte ha värdet \"%4\" " "av typen %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "egenskapen \"%1\" finns inte eller kan inte skrivas för objektet %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarm" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Alarm har en åtgärd som väntar." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Användning: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Alternativ:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 förväntar ett ytterligare argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 förväntar ett värde för argumentet: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 förväntar ytterligare argument: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "fundera på att åsidosätta swipeEvent()!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "fundera på att åsidosätta rebound()!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Ignorerar AfterItem-prioritet för InverseMouse-filter." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Förbjudet att ändra anslutningsparametrar." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "Bindning som hittades för egenskapen ”%1” kommer tas bort av " "tjänstuppdateringarna." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Varning: den som lägger in en bilaga måste ha ett ID. Tillståndet kommer " "inte sparas." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Varning: den som lade in en bilagas UUID finns redan registrerat, " "tillståndet kommer inte sparas: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Alla överliggande objekt måste ha ett ID.\n" "Tillstånd sparas inte för %1, klass %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Temat hittades inte: ”%1”" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Inte en palettkomponent." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Dragningsläge kräver ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Dragning stöds bara när QAbstractItemModel, ListModel eller lista används." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Avbryt" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Bekräfta" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Stäng" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Klar" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Pågår" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Släpp för att uppdatera..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Dra för att uppdatera..." #~ msgid "Theme not found: " #~ msgstr "Tema hittades inte: " ./po/lv.po0000644000015600001650000002051212700370701012471 0ustar jenkinsjenkins# Latvian translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-07-08 21:39+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Latvian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Izvēlieties visu" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Izgriezt" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopēt" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Ielīmēt" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opcijas:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/id.po0000644000015600001650000002347112700370701012453 0ustar jenkinsjenkins# Indonesian translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-08-31 05:21+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Indonesian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Pilih Semua" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Potong" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Salin" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Tempel" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Mundur" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Hapus" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Tidak ada service/path yang ditentukan" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Jenis bus tidak sah: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Saat Ini" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 menit yang lalu" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 menit" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Kemarin 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Kemarin 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Besok 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Besok 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView tidak memiliki signal handler terimplementasi pada " "ViewItems.dragUpdated(). Tidak akan memungkinkan untuk melakukan Dragging." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "properti \"%1\" dari objek %2 bertipe %3 dan tak dapat diatur ke nilai " "\"%4\" dengan tipe %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "properti \"%1\" tak ada atau tak dapat ditulisi untuk objek %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarm" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Alarm memiliki operasi yang tertunda" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Cara pakai: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opsi:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 mengharapkan sebuah argumen tambahan: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 mengharapkan suatu nilai bagi argumen: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 mengharapkan argumen-argumen tambahan: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "disarankan melakukan overriding pada slot swipeEvent()!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "disarankan melakukan overriding pada slot rebound()!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Mengabaikan prioritas AfterItem untuk penyaring InverseMouse." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Tidak diperbolehkan mengubah koneksi parameter." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "Binding terdeteksi pada properti '%1' akan dihapus dengan update service." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Peringatan: lampiran mesti punya ID. Keadaan tak akan disimpan." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Peringatan: UUID lampiran telah terdaftar, keadaan tak akan disimpan: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Semua induk mesti memiliki id.\n" "Penyimpanan keadaan dimatikan bagi %1, kelas %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Tema tidak ditemukan: \"%1\"" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Bukan komponen Palet warna." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Mode Dragging memerlukan ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Dragging hanya didukung apabila menggunakan QAbstractItemModel, ListModel " "atau list." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Batal" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Konfirmasi" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Tutup" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Selesai" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Tengah Berlangsung" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Lepaskan untuk menyegarkan..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Tarik untuk menyegarkan..." #~ msgid "Theme not found: " #~ msgstr "Tema tak ditemukan: " ./po/mr.po0000644000015600001650000002166312700370701012476 0ustar jenkinsjenkins# Marathi translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-04-04 03:43+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Marathi \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "सर्व निवडा" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "कट करा" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "प्रत करा" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "पेस्ट करा" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "मागे" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "काढून टाका" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "अलार्म" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "उपयोग: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "पर्याय:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 ला अतिरिक्त वितर्क %2 अपेक्षित आहे" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 ला वितर्क %2 चे मूल्य अपेक्षित आहे" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 ला अतिरिक्त एकापेक्षा जास्त वितर्क %2 अपेक्षित आहे" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "रद्द करा" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "पुष्टी करा" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "बंद करा" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "पूर्ण झाले" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "प्रगती मध्ये" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "रीफ्रेश करण्यासाठी सोडा ..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/ar.po0000644000015600001650000002117112700370701012454 0ustar jenkinsjenkins# Arabic translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-08-11 11:52+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= " "3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "اختيار الكل" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "قص" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "نسخ" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "لصق" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "عودة" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "حذف" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "منبه" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "الاستخدام: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "خيارات:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "إلغاء" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "تأكيد" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "إغلاق" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "تم" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "قيد التقدم" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "اترك للتحديث..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "اسحب للتحديث..." #~ msgid "Theme not found: " #~ msgstr "لم يتم العثور على السمة: " ./po/th.po0000644000015600001650000002035412700370701012467 0ustar jenkinsjenkins# Thai translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-08-14 13:41+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Thai \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/kn.po0000644000015600001650000002236312700370701012466 0ustar jenkinsjenkins# Kannada translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-10-01 13:10+0000\n" "Last-Translator: msj \n" "Language-Team: Kannada \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "ಗುಣ \"%1\" ಬಳಕೆಯಲ್ಲಿಲ್ಲ ಅಥವಾ %2 ವಸ್ತುವಿನ ಬರೆಯಲು ಆಗುತ್ತ ಇಲ್ಲ" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "ಅಲಾರಂ" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "ಅಲಾರಂನಲ್ಲಿ ಇನ್ನೂ ಒಂದು ಚಟುವಟಿಕೆ ಬಾಕಿ ಇದೆ" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "ಬಳಕೆ " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "ಆಯ್ಕೆಗಳು:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 ಇನ್ನೂ ಒಂದು ಹೆಚ್ಚುವರಿ ಅಂಶ ಕೇಳುತ್ತಿದೆ: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 ಯು %2 ಅಂಶದ ಮೊತ್ತ ಕೇಳುತ್ತುದೆ" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 ಇನ್ನೂ ಹಲವು ಹೆಚ್ಚುವರಿ ಅಂಶ ಕೇಳುತ್ತಿದೆ: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" "ಇನ್ವರ್ಸ್ ಮೌಸ್ ಶೋಧಕಗಳ ಆಫ಼್ಟರ್ ಐಟಂ ಆದ್ಯತೆಗಳನ್ನು ನಿರ್ಲಕ್ಷ್ಯ ಮಾಡಲಾಗುತ್ತಿದೆ" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "ಎಚ್ಚರಿಕೆ: ಅಟ್ಟಾಚ್ ಆಗಿರುವ ವಸ್ತುವಿಗೆ ಗುರುತಿನ ಚೀಟಿ ಇಲ್ಲ. ಸ್ಥಿತಿಯನ್ನು " "ಉಳಿಸಲಾಗುವುದಿಲ್ಲ." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/ko.po0000644000015600001650000002325712700370701012472 0ustar jenkinsjenkins# Korean translation for ubuntu-ui-toolkit # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2013-07-04 17:02+0000\n" "Last-Translator: Jinkyu Yi \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "모두 고르기" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "자르기" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "복사" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "붙이기" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "뒤로" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "삭제" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "서비스/경로 지정되지 않음" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "올바르지 않은 버스 형식: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "지금" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1분 전" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1분" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "ap h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'어제 'ap h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'어제 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'내일 'ap h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'내일 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'ap h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "MMM ddd d' 'ap h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "MMM ddd d' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "객체 %2의 프로퍼티 \"%1\"이(가) 형식 %3을 가지고 있어 형식 %5의 \"%4\" 값으로 설정할 수 없습니다." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "프로퍼티 \"%1\"이(가) 존재하지 않거나 객체 %2이(가) 기록할 수 없습니다." #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "경고" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "알람은 대기 작업을 가지고 있습니다." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "사용법: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "옵션:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1은(는) 추가 인수가 필요합니다: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1은(는) 인수 값이 필요합니다: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1은(는) 추가 인수가 필요합니다: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "역 마우스 필터 항목 우선 순위 이후 무시합니다." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "연결 파라미터를 변경할 수 없습니다" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "경고: 첨부 항목은 반드시 ID가 있어야 합니다. 상태를 저장하지 않습니다." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "경고: 첨부 항목의 UUID가 이미 등록되어 있습니다. 상태를 저장하지 않습니다: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "모든 상위 항목은 ID가 있어야 합니다.\n" "%1, 클래스 %2의 상태 저장 기능을 사용하지 않습니다." #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "\"%1\" 테마를 찾을 수 없습니다" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "팔레트 콤포넌트가 아닙니다." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "QAbstractItemModel, ListModel, 리스트를 사용할 때에만 드래그가 지원됩니다." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "취소" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "확인" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "닫기" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "완료" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "진행 중" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "떼면 새로 고침..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "누르면 새로 고침..." #~ msgid "Theme not found: " #~ msgstr "테마를 찾을 수 없음: " ./po/hu.po0000644000015600001650000002337212700370701012473 0ustar jenkinsjenkins# Hungarian translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-02-05 07:14+0000\n" "Last-Translator: Richard Somlói \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Minden kijelölése" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Kivágás" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Másolás" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Beillesztés" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Vissza" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Törlés" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Nincs szolgáltatás vagy útvonal megadva" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Érvénytelen síntípus: %1" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Most" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 perce" msgstr[1] "%1 perce" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 perc" msgstr[1] "%1 perc" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "ap h.mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH.mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Tegnap 'ap h.mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Tegnap 'HH.mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Holnap 'ap h.mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Holnap 'HH.mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'ap h.mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH.mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "MMM d., ddd' 'ap h.mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "MMM d., ddd' 'HH.mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "a(z) %2 objektum „%1” tulajdonságának %3 típusa van, és nem lehet a(z) %5 " "típus „%4” értékére beállítani" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "a(z) „%1” tulajdonság nem létezik vagy nem írható a következő objektum " "számára: %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Riasztás" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "A riasztáshoz függőben lévő művelet tartozik" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Használat: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Beállítások:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 további paramétert vár: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 egy értéket vár a következő paraméterhez: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 további paramétereket vár: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" "AfterItem prioritás figyelmen kívül hagyása az InverseMouse filtereknél." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "A kapcsolati paraméterek megváltoztatása nem engedélyezett." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "A(z) „%1” tulajdonsághoz kapcsolódó függőség eltávolításra kerül a " "frissítésekkel." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Figyelmeztetés: szükség van egy azonosítóra. Az állapot nem kerül elmentésre." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Figyelmeztetés: Ez az UUID már regisztrálva van, az állapot nem kerül " "elmentésre: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Minden szülőnek rendelkeznie kell azonosítóval.\n" "Az állapotmentés le van tiltva %1, %2 osztály esetén" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "A téma nem található: „%1”" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Nem paletta komponens." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Mégse" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Megerősítés" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Bezárás" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Kész" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Folyamatban" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Engedje le a frissítéshez…" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Húzza a frissítéshez…" #~ msgid "Theme not found: " #~ msgstr "Nem található téma: " ./po/br.po0000644000015600001650000002064012700370701012455 0ustar jenkinsjenkins# Breton translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-06-14 13:32+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Breton \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Diuz pep tra" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Troc'hañ" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Eilañ" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Pegañ" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Distro" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Dilemel" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Arfoù" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Arver : " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Dibarzhioù :" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Nullañ" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Kadarnaat" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Serriñ" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Graet eo" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "War ober" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" #~ msgid "Theme not found: " #~ msgstr "Tem ebet kavet : " ./po/ne.po0000644000015600001650000002724712700370701012466 0ustar jenkinsjenkins# Nepali translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-11-06 04:45+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Nepali \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "सबै छान्नुहोस्" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "काट्नुहोस्" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "प्रतिलिपि गर्नुहोस्" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "टाँस्नुहोस्" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "पछाडि" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "मेट्नुहोस्" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "कुनै सर्भिस/पाथ खुलाइएन" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "अमान्य बस प्रकार: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "अहिले" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 मिनेट पहिले" msgstr[1] "%1 मिनेट पहिले" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 मिनेट" msgstr[1] "%1 मिनेट" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Yesterday 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Yesterday 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Tomorrow 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "भोली 'घन्टा:मिनट" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView ले कुनै ViewItems.dragUpdated() संकेत ह्यान्डलर कार्यान्वयन गरेको " "छैन​। तान्ने सम्भव हुनेछैन।" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "अब्जेक्ट %2 को गुण \"%1\" सङ्ग टाईप %3 छ र टाईप \"%5\" को मूल्य \"%4\" मा " "सेट हुनसक्दैन" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "वस्तु %2 को गुण \"%1\" छैन वा लेख्न मिल्दैन" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "अलार्म" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "अलार्ममा केहि अपुरो काम छ।" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "उपयोग: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "विकल्पहरु:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 ले थप argument अपेक्षा गरेको छ: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 ले argument को value अपेक्षा गरेको छ: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 ले थप argumentहरू अपेक्षा गरेको छ: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "swipeEvent() सलट ओभरराईड गर्न कन्सिडर गर!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "rebound() सलट ओभरराईड गर्न कन्सिडर गर!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "इन्भर्ज माउस फिल्टर लागि आफ्टर आइटम प्राथमिकता बेवास्ता गरियो।" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "जडान मानकहरू परिवर्तन गर्न ​निषेध गरिएको छ।" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "प्रोपर्टि '%1' मा पत्ता लगाइएको बाध्यकारी सेवा अद्यावधिकद्वारा हटाइनेछ।" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "चेतावनी: संलग्न गरिएको आइडी हुनु पर्छ। स्थिती सङ्ग्रह हुने छैन।" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "चेताबनी: संलग्न UUID रजिस्टर भैसकेको छ, स्टेट: %1 बचत हुनेछैन" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "सबै प्यारेन्टस् संग आईडि हुनै पर्छ।\n" "%1, क्लास %2 का लागि ईस्टेट संग्रह असक्षम गरिएेको छ" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "थिम: \"%1\" भेटिऐन" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "पया्लेट कम्पोनेन्ट होईन।" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "ड्रयागिङ मोडलाई लिस्टभिऊ चाहिन्छ" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "किऊऐबस्ट्रयाक्टआईटममोडल, लिस्टमोडल अथवा लिस्ट प्रयोग गर्दा मात्र तान्न " "समर्थित छ।" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "रद्द गर्नुहोस्" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "पुष्टि गर्नुहोस्" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "बन्द गर्नुहोस्" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "सकियो" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "प्रगति हुँदैछ" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "रिफ्रेस गर्न छोडिदिनुहोस्..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "रिफ्रेस गर्न तान्नुहोस् ..." #~ msgid "Theme not found: " #~ msgstr "विषय भेटिएन: " ./po/my.po0000644000015600001650000002110412700370701012473 0ustar jenkinsjenkins# Burmese translation for ubuntu-ui-toolkit # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2013-09-07 10:58+0000\n" "Last-Translator: Pyae Sone \n" "Language-Team: Burmese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "အားလုံးကို ရွေးချယ်ပါ" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "ဖြတ်" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "မိတ္တူ" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "ပွားယူ" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "ပယ်ဖျက်ရန်" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "သတိပေးနှိုးဆော်ခြင်း" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "အသုံးပြုမှု့- " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Options:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "ပယ်ဖျက်သည်" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "အတည်ပြု" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "ပိတ်ရန်" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "ပြီးပါပြီ" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/sl.po0000644000015600001650000002270512700370701012474 0ustar jenkinsjenkins# Slovenian translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-03-21 19:25+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Slovenian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || " "n%100==4 ? 3 : 0);\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Izberi vse" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Izreži" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopiraj" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Prilepi" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Nazaj" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Izbriši" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Storitev/pot ni navedena" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Neveljavna vrsta vodila: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Zdaj" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "pred %1 minutami" msgstr[1] "pred %1 minuto" msgstr[2] "pred %1 minutama" msgstr[3] "pred %1 minutami" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minut" msgstr[1] "%1 minuto" msgstr[2] "%1 minuti" msgstr[3] "%1 minute" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Včeraj 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Včeraj 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Jutri 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Jutri 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "nastavitev \"%1\" predmeta %2 ima vrsto %3 in ne mora biti nastavljena na " "vrednost \"%4\" vrste %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "nastavitev \"%1\" ne obstaja ali pa ni zapisljiva za objekt %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Opomnik" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Alarm ima opravilo, ki poteka" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Poraba: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Možnosti:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "Za %1 je pričakovan dodaten argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "Za %1 je pričakovana vrednost za argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "Za %1 so pričakovani dodatni argumenti: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Spreminjanje parametrov povezave je prepovedano." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "Vezava, ki je bila zaznana na lastnosti '%1', bo odstranjena s posodobitvami " "storitve." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Vsi nadrejeni predmeti morajo imeti ID.\n" "Za %1, razred %2 je shranjevanje stanja onemogčeno" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Teme ni bilo mogoče najti: \"%1\"" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Preklic" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Potrdi" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Zapri" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Končano" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "V obdelavi" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Sprostite, da osvežite ..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Povlecite, da osvežite ..." #~ msgid "Theme not found: " #~ msgstr "Tema ni najdena: " ./po/cy.po0000644000015600001650000002044112700370701012464 0ustar jenkinsjenkins# Welsh translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-11-19 23:01+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Welsh \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : (n != 8 && n != 11) ? " "2 : 3;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/ga.po0000644000015600001650000002221112700370701012435 0ustar jenkinsjenkins# Irish translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-12-16 19:52+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Irish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Roghnaigh Uile" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Gearr" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Cóipeáil" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Greamaigh" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "Tá cineál %3 ag aire \"%1\" de réad %2,agus ní féidir é a shocrú go luach " "\"%4\"de chineál %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "Ní ann don luach \"%1\" nó níl sé inscríofa don réad %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Aláram" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Tá gníomh ar feitheamh ag an aláram" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Úsáid: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Roghanna:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "Tá %1 ag súil le hargóint bhreise: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "Tá %1 ag súil le luach d'argóint: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "Tá %1 ag súil le hargóintí bhreise: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" "Ag déanamh neamhaird ar phriaracht AfterItem do scagathóirí InverseMouse" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Aire: Tá ID ag teastáil ón gceangalaí. Ní shábháilfear an staid." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Aire: Tá UUID an cheangalaí cláraithe cheana féin. Ní shábháilfear an staid: " "%1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Tá id ag teastáil ó gach tuismitheoir.\n" "Sábháil staid díchumasaithe do %1, aicme %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Cealaigh" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Deimhnigh" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Dún" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Déanta" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Ar Bun" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Scaoil le hathnuachan a dhéanamh…" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Tarraing le hathnuachan a dhéanamh…" #~ msgid "Theme not found: " #~ msgstr "Níor aimsíodh téama: " ./po/it.po0000644000015600001650000002251012700370701012464 0ustar jenkinsjenkins# Italian translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-08-05 15:27+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Seleziona tutto" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Taglia" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Copia" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Incolla" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Indietro" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Elimina" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Nessun servizio/percorso specificato" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Tipo di bus non valido: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Ora" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 minuto fa" msgstr[1] "%1 minuti fa" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minuto" msgstr[1] "%1 minuti" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "la proprietà \"%1\" dell'oggetto %2 possiede il tipo %3 e non può essere " "impostata al valore \"%4\" del tipo %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "la proprietà \"%1\" non esiste o non è scrivibile per l'oggetto %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Sveglia" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "L'allarme ha un'operazione in attesa." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Uso: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opzioni:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 è in attesa di un argomento aggiuntivo: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 è in attesa di un valore per l'argomento: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 è in attesa di argomenti aggiuntivi: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Viene ignorata la priorità AfterItem per i filtri InverseMouse." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Modifica dei parametri di connessione non consentita." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Attenzione: è necessario disporre di un ID. Lo stato corrente non verrà " "salvato." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Attenzione: L'UUID dell'allegato è già registrato, lo stato non verrà " "salvato: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Tutti i genitori devono avere un ID.\n" "Salvataggio dello stato disattivato per %1, classe %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Tema non trovato: «%1»" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Annulla" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Conferma" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Chiudi" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Fatto" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "In corso" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Rilasciare per aggiornare..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Tirare per aggiornare..." #~ msgid "Theme not found: " #~ msgstr "Tema non trovato: " ./po/gd.po0000644000015600001650000002461112700370701012446 0ustar jenkinsjenkins# Gaelic; Scottish translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-09-30 16:22+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Gaelic; Scottish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " "(n > 2 && n < 20) ? 2 : 3;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Tagh na h-uile" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Gearr às" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Dèan lethbhreac" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Cuir ann" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Air ais" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Sguab às" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Cha deach seirbheis/slighe a shònrachadh" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Bus de sheòrsa mì-dhligheach: %1" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "An-dràsta" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 mhionaid air ais" msgstr[1] "%1 mhionaid air ais" msgstr[2] "%1 mionaidean air ais" msgstr[3] "%1 mionaid air ais" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 mhionaid" msgstr[1] "%1 mhionaid" msgstr[2] "%1 mionaidean" msgstr[3] "%1 mionaid" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'An-dè 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'An-dè 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'A-màireach 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'A-màireach 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "Cha deach làimhsichear siognail ViewItems.dragUpdated() a chur an sàs aig " "ListView. Chan urrainnear slaodadh a dhèanamh." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "tha roghainn \"%1\" an oibseict %2 dhen t-seòrsa %3 agus chan urrainn dhut " "an luach \"%4\" dhen t-seòrsa %5 a shònrachadh dha" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "chan eil an roghainn \"%1\" ann no cha ghabh a sgrìobhadh airson an oibseict " "%2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Caismeachd" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Tha gnìomh ri dhèiligeadh aig a' chaismeachd." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Cleachdadh: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Roghainnean:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "Tha dùil aig %1 ri argamaid a bharrachd: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "Tha dùil aig %1 ri luach airson na h-argamaid: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "Tha dùil aig %1 ri argamaidean a bharrachd: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "tar-àithn an slot swipeEvent() ’s dòcha!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "tar-àithne an slot rebound() ’s dòcha!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" "A' leigeil seachad prìomhachas AfterItem airson criathragan InverseMouse." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Tha atharrachadh paramadairean a’ cheangail toirmisgte." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "Thèid an nasgadh a chaidh a lorg air a’ bhuadh “%1” a thoirt air falbh leis " "an t-seirbheis ùrachaidh." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Rabhadh: Feumaidh ID a bhith aig a' cheangladair. Cha dèid an staid a " "shàbhaladh." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Rabhadh: Chaidh UUID a' cheangladair a chlàradh mu thràth, cha dèid an staid " "a shàbhaladh: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Feumaidh ID a bhith aig gach pàrant.\n" "Chaidh sàbhaladh na staid a chur à comas airson %1, clas %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Cha deach an t-ùrlar a lorg: “%1”" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Chan e co-phàirt a’ phaileid a tha ann." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Feumaidh am modh slaodadh ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Chan eil taic ri slaodadh ach nuair a chleachdar QAbstractItemModel, " "ListModel no liosta." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Sguir dheth" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Dearbhaich" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Dùin" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Dèanta" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "A' dol air adhart" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Leig às e airson ath-nuadhachadh a dhèanamh..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Tarraing airson ath-nuadhachadh a dhèanamh..." #~ msgid "Theme not found: " #~ msgstr "Cha deach an t-ùrlar a lorg: " ./po/bg.po0000644000015600001650000002073712700370701012451 0ustar jenkinsjenkins# Bulgarian translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-05-02 07:48+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Bulgarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Избери всички" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Изтрий" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Будилник" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Използване: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Параметри:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Откажи" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Потвърди" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Затвори" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Готово" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" #~ msgid "Theme not found: " #~ msgstr "Темата не е открита: " ./po/km.po0000644000015600001650000002522212700370701012462 0ustar jenkinsjenkins# Khmer translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-07-23 05:12+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Khmer \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "​ជ្រើស​ទាំងអស់" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "​កាត់" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "​ចម្លង" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "បិទភ្ជាប់" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "ថយក្រោយ" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "​លុប​" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "មិនបានបញ្ជាក់សេវាកម្ម/ផ្លូវ" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "ប្រភេទ bus មិនត្រឹមត្រូវ៖ %1។" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "ឥឡូវនេះ" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 នាទី​មុន" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 នាទី" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Yesterday 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Yesterday 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Tomorrow 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Tomorrow 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "ទ្រព្យសម្បត្ដិ \"%1\" នៃវត្ថុ %2 មានប្រភេទ %3 និងមិនអាចត្រូវបានកំណត់ទៅតម្លៃ " "\"%4\" របស់ប្រភេទ %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "ទ្រព្យសម្បត្តិ \"%1\" មិនមាននៅ ឬមិនអាចសរសេរឱ្យវត្ថុ %2 បាន" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "ជូនដំណឹង" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "ជូនដំណឹង មានការប្រតិ​ប​ត្ដិ​ការ​រង់ចាំ" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "ការ​ប្រើ៖ " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "ជម្រើស៖" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 រំពឹង​អាគុយម៉ង់​បន្ថែម៖ %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 រំពឹង​តម្លៃ​សម្រាប់​អាគុយម៉ង់៖ %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 រំពឹង​តម្លៃ​អាគុយម៉ង់​បន្ថែម៖ %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "កំពុងមិនអើពើអាទិភាព AfterItem សម្រាប់តម្រង InverseMouse ។" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "ការព្រមាន ៖ attachee ត្រូវមានលេខសម្គាល់ ។ រដ្ឋនឹងមិនត្រូវបានរក្សាទុក ។" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "ការព្រមាន ៖ UUID របស់ attachee ត្រូវបានចុះឈ្មោះរួចហើយ " "រដ្ឋនឹងមិនត្រូវបានរក្សាទុក ៖ %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "ឪពុកម្តាយទាំងអស់ត្រូវមានលេខសម្គាល់មួយ ។\n" "បានបិទការសន្សំរបស់រដ្ឋសម្រាប់ %1 ក្រុម %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "បោះបង់" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "បញ្ជាក់" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "បិទ" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "ធ្វើរួច​" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "កំពុង​ដំណើរការ" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "ដោះលែង​ក្នងការធ្វើឱ្យ​ស្រស់..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "ទាញ​ក្នុង​ការ​ធ្វើ​ឱ្យ​ស្រស់..." #~ msgid "Theme not found: " #~ msgstr "រក​មិន​ឃើញ​ប្រធានបទ​ ៖ " ./po/el.po0000644000015600001650000002415112700370701012453 0ustar jenkinsjenkins# Greek translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-04-06 19:01+0000\n" "Last-Translator: Aggelos Arnaoutis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Επιλογή όλων" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Αποκοπή" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Αντιγραφή" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Επικόλληση" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Πίσω" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Διαγραφή" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Μη έγκυρος τύπος διαύλου: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Τώρα" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 λεπτό πριν" msgstr[1] "%1 λεπτά πριν" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 λεπτό" msgstr[1] "%1 λεπτά" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Εχθές 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Αύριο 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ηηη' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "Η ιδιότητα \"%1\" του αντικειμένου %2 έχει τύπο %3 και δεν μπορεί να λάβει " "την τιμή \"%4\" του τύπου %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "Η ιδιότητα \"%1\" δεν υπάρχει ή δεν είναι εγγράψιμη για το αντικείμενο %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Προειδοποίηση" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Η προειδοποίηση έχει μια εκκρεμή εργασία" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Χρήση: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Επιλογές:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "Το %1 αναμένει και ένα πρόσθετο όρισμα: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "Το %1 αναμένει μια τιμή για το όρισμα: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "Το %1 αναμένει πρόσθετα ορίσματα: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Αγνόηση προτεραιότητας για φίλτρα InverseMouse." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Προειδοποίηση: το attachee πρέπει να έχει ένα ID. Η τρέχουσα κατάσταση δεν " "θα αποθηκευτεί." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Προειδοποίηση: Το UUID του attachee έχει ήδη καταχωρηθεί, η τρέχουσα " "κατάσταση δεν θα αποθηκευτεί: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Όλα τα γονικά στοιχεία πρέπει να έχουν ταυτότητα (ID).\n" "Η αποθήκευση κατάστασης είναι απενεργοποιημένη για %1, κλάση %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Αδυναμί εύρεσης θέματος:: \"%1\"" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Ακύρωση" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Επιβεβαίωση" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Κλείσιμο" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Ολοκληρώθηκε" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Σε εξέλιξη" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Απελευθερώστε για ανανέωση..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Τραβήξτε για ανανέωση..." #~ msgid "Theme not found: " #~ msgstr "Δεν βρέθηκε θέμα: " ./po/sr.po0000644000015600001650000002167012700370701012502 0ustar jenkinsjenkins# Serbian translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-11-09 12:21+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "својство „%1“ предмета %2 је врсте %3 и не може бити подешено на вредност " "„%4“ врсте %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "својство „%1“ не постоји или није уписиво за предмет %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Аларм" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Аларм има заказану радњу." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Употреба: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Опције:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 очекује додатни аргумент: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 очекује вредност за аргумент: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 очекује додатне аргументе: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Занемарујем својство након ставке за пропуснике окретања миша." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/ms.po0000644000015600001650000002343512700370701012476 0ustar jenkinsjenkins# Malay translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-07-06 16:21+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Malay \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Pilih Semua" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Potong" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Salin" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Tampal" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Kembali" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Hapus" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Tiada perkhidmatan/laluan dinyatakan" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Jenis bas tidak sah: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Sekarang" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 minit yang lalu" msgstr[1] "%1 minit yang lalu" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minit" msgstr[1] "%1 minit" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Semalam 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Semalam 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Esok 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Esok 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView tidak mempunyai pengendali isyarat ViewItems.dragUpdated() yang " "dilaksanakan. Tiada penyeretan boleh dilakukan." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "sifat \"%1\" bagi objek %2 mempunyai jenis %3 dan tidak boleh ditetapkan ke " "nilai \"%4\" bagi jenis %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "sifat \"%1\" tidak wujud atau tidak boleh ditulis untuk objek %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Penggera" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Penggera mempunyai operasi tertangguh." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Penggunaan: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Pilihan:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 menjangkakan argumen tambahan: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 menjangkakan nilai untuk argumen: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 menjangkakan argumen tambahan: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "anggap membatalkan slot swipeEvent()!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "anggap membatalkan slot rebound()!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Mengabai keutamaan AfterItem untuk penapis InverseMouse." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Pengubahan parameter sambungan dilarang." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "Pengikatan dikesan pada sifat '%1' akan dibuang oleh kemaskini perkhidmatan." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Amaran: lampiran mestilah mempunyai ID. Keadaan tidak akan disimpan." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "Amaran: lampiran UUID sudah berdaftar, keadaan tidak disimpan: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Semua induk mesti mempunyai id.\n" "Penyimpanan keadaan dilumpuhkan untuk %1, kelas %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Tema tidak ditemui: \"%1\"" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Tiada komponen Palet." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Mod penyeretan memerlukan ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Menyeretan hanya disokongg bila menggunakan QAbstractItemModel, ListModel " "atau senarai." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Batal" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Sahkan" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Tutup" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Selesai" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Dalam Proses" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Lepaskan untuk segar semula..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Tarik untuk segar semula..." #~ msgid "Theme not found: " #~ msgstr "Tema tidak ditemui: " ./po/da.po0000644000015600001650000002222712700370701012441 0ustar jenkinsjenkins# Danish translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-08-01 10:18+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Vælg alle" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Klip" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopiér" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Indsæt" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Tilbage" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Slet" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Ugyldig bustype: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Nu" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 minut siden" msgstr[1] "%1 minutter siden" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minut" msgstr[1] "%1 minutter" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "egenskaben \"%1\" for objektet %2 har typen %3, og kan ikke angives til " "værdien \"%4\" med typen %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "egenskaben \"%1\" findes ikke, eller også mangler objektet %2 skriveadgang" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarm" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Alarmen har en afventende handling." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Brug: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Tilvalg:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 forventer et argument yderligere: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 forventer en værdi for argumentet: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 forventer yderligere argumenter: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Ignorerer AfterItem-prioriteten for InverseMouse-filtre." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Advarsel: attachéen skal have et id. Tilstanden vil ikke blive gemt." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Advarsel: attachéens UUID er allerede registreret, tilstanden vil ikke blive " "gemt: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Alle overelementer skal have et id.\n" "Lagring af tilstand er slået fra for %1, klasse %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Annullér" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Godkend" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Luk" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Udført" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "I gang" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Slip for at opdatere..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Træk for at opdatere..." #~ msgid "Theme not found: " #~ msgstr "Temaet blev ikke fundet: " ./po/eu.po0000644000015600001650000002214212700370701012462 0ustar jenkinsjenkins# Basque translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-09-13 11:42+0000\n" "Last-Translator: Ibai Oihanguren Sala \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Hautatu dena" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Ebaki" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopiatu" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Itsatsi" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Itzuli" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Ezabatu" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "%2 objektuaren \"%1\" propietatea %3 motakoa da eta ezin zaio %5 motako " "\"%4\" balioa jarri" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "\"%1\" propietatea ez da existitzen edo ez da %2 objektuarentzat idazgarria" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarma" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Alarmak burutu gabeko operazio bat dauka." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Erabilera: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Aukerak:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1(e)k argumentu gehigarri bat espero du: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1(e)k balio bat espero du argumentu honentzat: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1(e)k argumentu gehigarriak espero ditu: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "AfterItem lehentasunari ezikusi egiten InverseMouse iragazkientzat." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Abisua: erantsitakoak IDa izan behar du. Egoera ez da gordeko." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Abisua: erantsitakoaren UUIDa dagoeneko erregistratuta dago, egoera ez da " "gordeko: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Guraso guztiek izan behar dute ID bat.\n" "Egoera gordetzea desgaituta %2 klaseko %1(r)entzat" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Utzi" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Berretsi" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Itxi" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Eginda" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Lanean" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Askatu freskatzeko..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Tiratu freskatzeko..." #~ msgid "Theme not found: " #~ msgstr "Gaia ez da aurkitu: " ./po/tr.po0000644000015600001650000002211012700370701012471 0ustar jenkinsjenkins# Turkish translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-07-10 05:41+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Tümünü Seç" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Kes" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopyala" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Yapıştır" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Geri" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Sil" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Şimdi" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 dakika önce" msgstr[1] "%1 dakika önce" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 dakika" msgstr[1] "%1 dakika" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "%2 nesnesinin %1 niteliği %3 tipindedir, %4 veya %5 olarak ayarlanamaz." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "\"%1\" özelliği \"%2\" nesnesi için yok veya yazılabilir değil" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Uyarı" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Alarm onay bekliyor." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Kullanımı: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Seçenekler:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 bir ek argüman bekliyor: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 argüman için bir değer bekliyor: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 argüman için bir değer bekliyor: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "InverseMouse filtreleri için AfterItem önceliği yoksayılıyor." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Uyarı: eklenen bir kimliğe sahip olmalı. Durum kaydedilmeyecek." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "Uyarı: ekin UUID'si zaten kayıtlı, durum kaydedilmeyecek: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Tüm üst ögeler bir kimliğe sahip olmalı.\n" "%1, sınıf %2 için durum kaydetme devre dışı" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "İptal" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Doğrula" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Kapat" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Bitti" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Devam Ediyor" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Yenilemek için bırakın..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Yenilemek için çekin..." #~ msgid "Theme not found: " #~ msgstr "Tema bulunamadı: " ./po/hr.po0000644000015600001650000002370212700370701012465 0ustar jenkinsjenkins# Croatian translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-12-07 22:47+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Croatian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Odaberi sve" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Izreži" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopiraj" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Zalijepi" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Natrag" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Obriši" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Nema određene usluge/putanje" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Neispravna vrsta sabirnice: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Sada" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "Prije %1 minute" msgstr[1] "Prije %1 minute" msgstr[2] "Prije %1 minuta" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minuta" msgstr[1] "%1 minute" msgstr[2] "%1 minuta" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Jučer 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Jučer 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Sutra 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Sutra 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "Pogled popisa nema ViewItems.dragUpdated() zaglavlje signala implementirano. " "Povlačenje neće biti moguće." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "svojstvo \"%1\" objekta %2 je vrste %3 i ne može se postaviti na vrijednost " "\"%4\" vrste %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "svojstvo \"%1\" ne postoji ili ne dopušta pisanje za objekt %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarm" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Radnja alarma je u tijeku." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Upotreba: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Mogućnosti:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 očekuje dodatan argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 očekuje vrijednost za argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 očekuje dodatne argumente: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "razmotri zaobilaženje swipeEvent() položaja!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "Razmotri zaobilaženje rebound() položaja!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Zanemarivanje naknadnog prioroteta stavki za filtre obrnutog miša." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Promjena parametra povezivanja je zabranjeno." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "Povezivanje otkriveno na '%1' svojstvu će biti uklonjeno nadopunom usluge." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Upozorenje: prilagatelj mora imati ID. Stanje neće biti spremljeno." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Upozorenje: prilagateljev UUID je već registriran. Stanje neće biti " "spremljeno: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Svi nadređeni procesi moraju imati id.\n" "Stanje spremanja je onemogućeno za%1, klasa %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Tema nije pronađena: \"%1\"" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Nije komponenta palete." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Način povlačena zahtijeva Pogled popisa" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Povlačenje je samo podržano kada se koristi QAbstractItemModel, Model popisa " "ili popis." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Odustani" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Potvrdi" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Zatvori" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Završeno" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "U tijeku" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Otpusti za osvježavanje..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Povuci za osvježavanje..." #~ msgid "Theme not found: " #~ msgstr "Tema nije pronađena: " ./po/ce.po0000644000015600001650000002036712700370701012447 0ustar jenkinsjenkins# Chechen translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-08-11 10:27+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Chechen \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/en_AU.po0000644000015600001650000002331112700370701013037 0ustar jenkinsjenkins# English (Australia) translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-08-26 10:51+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: English (Australia) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Select All" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Cut" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Copy" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Paste" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Back" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Delete" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "No service/path specified" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Invalid bus type: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Now" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 minute ago" msgstr[1] "%1 minutes ago" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minute" msgstr[1] "%1 minutes" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Yesterday 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Yesterday 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Tomorrow 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Tomorrow 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "property \"%1\" does not exist or is not writable for object %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarm" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Alarm has a pending operation." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Usage: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Options:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 is expecting an additional argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 is expecting a value for argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 is expecting additional arguments: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "consider overriding swipeEvent() slot!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "consider overriding rebound() slot!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Ignoring AfterItem priority for InverseMouse filters." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Changing connection parameters forbidden." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "Binding detected on property '%1' will be removed by the service updates." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Warning: attachee must have an ID. State will not be saved." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Warning: attachee's UUID is already registered, state won't be saved: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Theme not found: \"%1\"" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Not a Palette component." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Dragging mode requires ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Cancel" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Confirm" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Close" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Done" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "In Progress" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Release to refresh..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Pull to refresh..." #~ msgid "Theme not found: " #~ msgstr "Theme not found: " ./po/eo.po0000644000015600001650000002047612700370701012464 0ustar jenkinsjenkins# Esperanto translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-08-22 09:07+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Esperanto \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Eltondi" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopii" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Reen" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Forigi" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarmo" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Uzado: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opcioj:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Nuligi" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Konfirmi" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Fermi" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Finita" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/uk.po0000644000015600001650000002602512700370701012474 0ustar jenkinsjenkins# Ukrainian translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-01-16 21:18+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Ukrainian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Позначити все" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Вирізати" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Копіювати" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Вставити" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Назад" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Вилучити" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Не вказано служби або шляху" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Невірний тип каналу: %1" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Зараз" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 хвилину тому" msgstr[1] "%1 хвилини тому" msgstr[2] "%1 хвилин тому" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 хвилина" msgstr[1] "%1 хвилини" msgstr[2] "%1 хвилин" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "hh:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Вчора 'hh:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Вчора 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Завтра 'hh:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Завтра 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'hh:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd, d MMM' 'hh:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd, d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView не має реалізованого обробника сигналу ViewItems.dragUpdated(). " "Перетягування буде неможливим." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "властивість «%1» об’єкта %2 належить до типу %3, для неї не можна " "встановлювати значення «%4» типу %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "властивості «%1» об’єкта %2 не існує або вона є непридатною до запису" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Нагадування" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "У черзі нагадувань є дія." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Користування: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Параметри:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 потрібен додатковий аргумент: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 потрібне значення для аргумента: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 потрібні додаткові аргументи: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "варто перевизначити слот swipeEvent()!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "варто перевизначити слот rebound()!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Ігноруємо пріоритетність AfterItem для фільтрів InverseMouse." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Зміну параметрів з’єднання заборонено." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "Прив’язку, виявлену для властивості «%1», буде вилучено під час оновлень " "служби." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Попердження: автор долучення повинен мати ідентифікатор. Стан не буде " "збережено." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Попередження: UUID автора долучення вже зареєстровано, стан не буде " "збережено: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Усі батьківські об’єкти повинні мати ідентифікатори.\n" "Збереження стану для %1, клас %2 вимкнено" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Теми не знайдено: «%1»" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Не є компонентом Palette." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Режим перетягування потребує ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Підтримку перетягування передбачено при використанні a QAbstractItemModel, " "ListModel або списку." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Скасувати" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Підтвердження" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Закрити" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Виконано" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Обробка" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Відпустіть для оновлення…" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Потягніть для оновлення…" #~ msgid "Theme not found: " #~ msgstr "Теми не знайдено: " ./po/po.pro0000644000015600001650000000255612700370701012660 0ustar jenkinsjenkinsTEMPLATE = aux PROJECTNAME = ubuntu-ui-toolkit SOURCECODE = `find .. -name *.qml` message("") message(" Project Name: $$PROJECTNAME ") message(" Source Code: $$SOURCECODE ") message("") message(" run 'make pot' to generate the pot file from source code. ") message(" run 'qmake; make install' to install the mo files. ") message("") ## generate pot file 'make pot' potfile.target = pot potfile.commands = cd $$PWD; $$PWD/update-pot.sh ubuntu-ui-toolkit $$PWD/../modules .; QMAKE_EXTRA_TARGETS += potfile ## generate pot file for gallery potfile.commands += cd $$PWD; $$PWD/update-pot.sh ubuntu-ui-toolkit-gallery $$PWD/../examples/ubuntu-ui-toolkit-gallery $$PWD/../examples/ubuntu-ui-toolkit-gallery/po; ## Installation steps for mo files. 'make install' MO_FILES = $$files(*.po) message($$MO_FILES) install_mo_commands = for(po_file, MO_FILES) { mo_file = $$replace(po_file,.po,.mo) system(msgfmt $$po_file -o $$mo_file) mo_name = $$replace(mo_file,.mo,) mo_targetpath = $(INSTALL_ROOT)$$[QT_INSTALL_PREFIX]/share/locale/$${mo_name}/LC_MESSAGES mo_target = $${mo_targetpath}/ubuntu-ui-toolkit.mo !isEmpty(install_mo_commands): install_mo_commands += && install_mo_commands += test -d $$mo_targetpath || mkdir -p $$mo_targetpath install_mo_commands += && cp $${PWD}/$$mo_file $$mo_target } install.commands = $$install_mo_commands QMAKE_EXTRA_TARGETS += install ./po/fi.po0000644000015600001650000002151312700370701012450 0ustar jenkinsjenkins# Finnish translation for ubuntu-ui-toolkit # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2013-09-27 13:37+0000\n" "Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Valitse kaikki" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Leikkaa" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopioi" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Liitä" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Takaisin" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Poista" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Palvelua/polkua ei määritetty" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Virheellinen väylätyyppi: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Nyt" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 minuutti sitten" msgstr[1] "%1 minuuttia sitten" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minuutti" msgstr[1] "%1 minuuttia" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Eilen 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Eilen 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Huomenna 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Huomenna 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d. MMM' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d. MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Hälytys" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Hälytyksellä on odottava toiminto." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Käyttö: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Valinnat:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Yhteysparametrien muuttaminen on kielletty." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Teemaa ei löydy: \"%1\"" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Peru" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Vahvista" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Sulje" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Valmis" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Käynnissä" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Vapauta päivittääksesi..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Vedä päivittääksesi..." #~ msgid "Theme not found: " #~ msgstr "Teemaa ei löydy: " ./po/ru.po0000644000015600001650000002557412700370701012513 0ustar jenkinsjenkins# Russian translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-07-04 16:17+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Выбрать всё" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Вырезать" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Копировать" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Вставить" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Назад" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Удалить" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Служба или путь не указаны" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Недопустимый тип шины: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Только что" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 минуту назад" msgstr[1] "%1 минуты назад" msgstr[2] "%1 минут назад" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 минута" msgstr[1] "%1 минуты" msgstr[2] "%1 минут" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Вчера 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Вчера 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Завтра 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Завтра 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "У ListView не реализован обработчик сигнала ViewItems.dragUpdated(). " "Перетаскивание будет невозможно." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "параметр \"%1\" объекта %2 имеет тип %3 и не может иметь значение \"%4\" " "типа %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "параметр \"%1\" не существует или не доступен для записи для объекта %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Будильник" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "У будильника есть отложенная операция." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Использование: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Параметры:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 требует дополнительный аргумент: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 ожидает значение следующего параметра: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 ожидает дополнительных параметров: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" "Игнорировать приоритет AfterItem ( Следующий Элемент ) для фильтров " "InverseMouse ( Перевернуть Мышь )" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Изменение параметров подключения запрещено." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Предупреждение: у вложения должен быть ID. Изменения не будут сохранены." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Предупреждение: UUID вложения уже существует, изменения не будут сохранены: " "%1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "У всех родительских объектов должен быть id.\n" "Сохранение состояния отключено для %1, класса %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Тема не найдена: \"%1\"" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Не является компонентом палитры." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Для использования режима перетаскивания требуется ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Перетаскивание поддерживается только при использовании QAbstractItemModel, " "ListModel или списка." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Отмена" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Подтверждение" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Закрыть" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Готово" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "Выполняется" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Отпустите для обновления..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Потяните для обновления..." #~ msgid "Theme not found: " #~ msgstr "Тема не найдена: " ./po/ro.po0000644000015600001650000002222212700370701012470 0ustar jenkinsjenkins# Romanian translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-07-25 09:47+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Romanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 " "== 0) && (n != 0))) ? 2: 1));\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Selectare totală" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Decupare" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Copiere" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Lipire" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Înapoi" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Ştergeţi" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "proprietatea \"%1\" al obiectului %2 este de tipul %3 si nu poate fi " "stabilită cu valoarea \"%4\" de tipul %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "proprietatea \"%1\" nu există sau nu este inscriptibilă pentru obiectul %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarmă" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Alarma are o operație în așteptare." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Utilizare: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opțiuni:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 așteaptă un argument suplimentar: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 așteaptă o valoare pentru argumentul: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 așteaptă argumente suplimentare: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Se ignoră proprietatea AfterItem pentru filtrele InverseMouse." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "Atenţie: ataşamentul trebuie să aibe un ID. Starea nu va fi salvată." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Atenţie: atașamentul are UUID-ul deja înregistrat, starea nu va fi salvată: " "%1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Anulează" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Confirmă" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Închideți" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Finalizat" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "În desfășurare" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Eliberează pentru împrospătare..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Trage pentru împrospătare..." #~ msgid "Theme not found: " #~ msgstr "Tema nu a fost găsită: " ./po/fr_CA.po0000644000015600001650000002402212700370701013022 0ustar jenkinsjenkins# French (Canada) translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-08-25 16:04+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: French (Canada) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Tout sélectionner" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Couper" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Copier" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Coller" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Retour" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Supprimer" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Aucun service/chemin spécifié" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Type de bus invalide : %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "maintenant" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "il y a %1 minute" msgstr[1] "il y a %1 minutes" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minute" msgstr[1] "%1 minutes" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Hier 'h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Hier 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Demain 'h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Demain 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView n'a aucun gestionnaire de signal ViewItems.dragUpdated() " "d'implémenté. On ne pourra pas faire glisser." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "la propriété « %1 » de l'objet %2 est de type %3 et ne peut pas être définie " "à la valeur « %4 » de type %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "La propriété « %1 » n'existe pas ou ne peut pas être écrite pour l'objet %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarme" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "L'alarme a une opération en cours" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Utilisation : " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Options :" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 attend un argument supplémentaire : %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 attend une valeur comme argument : %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 attend des arguments supplémentaires : %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "considérez passer outre l'emplacement swipeEvent()!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "considérez passer outre l'emplacement rebound()!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Ignorant la priorité AfterItem pour les filtres InverseMouse" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Il est interdit de modifier les paramètres de connexion." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "La liaison détectée sur la propriété « %1 » sera supprimée par les mises à " "jour de service." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Avertissement : l'attaché doit avoir un ID. L'état ne sera pas enregistré." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Avertissement : l'UUID de l'attaché est déjà enregistré, l'état ne sera pas " "enregistré : %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Tous les parents doivent avoir un ID.\n" "L'enregistrement de l'état est désactivé pour %1, classe %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Thème introuvable : « %1 »" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "N'est pas un composant de palette" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "ListView est exigé par le mode glisser" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Le glisser n'est pris en charge que lors de l'utilisation de " "QAbstractItemModel, ListModel ou list." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Annuler" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Confirmer" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Fermer" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Terminé" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "En cours" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Relâcher pour rafraîchir..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Tirer pour rafraîchir..." #~ msgid "Theme not found: " #~ msgstr "Thème introuvable " ./po/ubuntu-ui-toolkit.pot0000644000015600001650000002015312700370701015655 0ustar jenkinsjenkins# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/he.po0000644000015600001650000002217712700370701012455 0ustar jenkinsjenkins# Hebrew translation for ubuntu-ui-toolkit # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2013-07-03 08:23+0000\n" "Last-Translator: Yaron \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "בחירת הכול" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "גזירה" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "העתקה" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "הדבקה" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "חזרה" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "מחיקה" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "התראה" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "להתראה יש פעולה ממתינה." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "שימוש: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "אפשרויות:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "ל־%1 נדרש ארגומנט נוסף: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 בציפייה לערך לארגומנט: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 בציפייה לארגומנטים נוספים: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "התעלמות מהעדיפות של AfterItem עבור מסנני InverseMouse." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "אזהרה: למוצמד חייב להיות מס׳ מזהה. המצב לא יישמר." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "אזהרה: המס׳ הייחודי (UUID) של המוצמד כבר רשום, המצב לא יישמר: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "לכל פריטי ההורה חייב להיות מס׳ מזהה.\n" "שמירת המצב מנוטרלת עבור %1, מחלקה %2." #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "ביטול" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "אישור" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "סגירה" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "בוצע" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "בתהליך" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "יש לשחרר כדי לרענן…" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "יש למשוך כדי לרענן…" #~ msgid "Theme not found: " #~ msgstr "ערכת העיצוב לא נמצאה: " ./po/am.po0000644000015600001650000002246112700370701012452 0ustar jenkinsjenkins# Amharic translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-09-01 23:17+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Amharic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "ሁሉንም ምረጥ" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "ቁረጥ" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "ቅዳ" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "ለጥፍ" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "ወደ ኋላ" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "አጥፋ" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "ምንም የ ግልጋሎት/መንገድ አልተገለጸም" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "አሁን" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "ከ %1 ደቂቃ በፊት" msgstr[1] "ከ %1 ደቂቆች በፊት" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 ደቂቃ" msgstr[1] "%1 ደቂቃዎች" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'ትናንትና 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'ትናንትና 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'ነገ 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'ነገ 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "ባህሪው \"%1\" የ እቃው %2 አይነት አለው %3 እና ማሰናዳት አይቻልም ወደ ዋጋ \"%4\" አይነት %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "ባህሪው \"%1\" አልተገኘም ወይንም መጻፍ አይቻልም በ %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "መቀስቀሻ" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "መቀስቀሻ በቀጠሮ ላይ ያለ ተግባር አለው" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "አጠቃቀም: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "ምርጫዎች:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 ተጨማሪ ክርክር ይፈልጋል: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 ለ ክርክር ዋጋ ይፈልጋል: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 ተጨማሪ ክርክሮች ይፈልጋል: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "መሰረዣ" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "ማረጋገጫ" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "መዝጊያ" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "ጨርሷል" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "በሂደት ላይ" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "ለማነቃቃት ይልቀቁ..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "ለማነቃቃት ይሳቡ..." #~ msgid "Theme not found: " #~ msgstr "ገጽታው አልተገኘም: " ./po/es.po0000644000015600001650000002367312700370701012472 0ustar jenkinsjenkins# Spanish translation for ubuntu-ui-toolkit # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-12-09 07:51+0000\n" "Last-Translator: Adolfo Jayme \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Seleccionar todo" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Cortar" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Copiar" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Pegar" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Atrás" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Eliminar" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "No se especificó ningún servicio o ruta" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Tipo de bus no válido: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Ahora mismo" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "Hace %1 minuto" msgstr[1] "Hace %1 minutos" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minuto" msgstr[1] "%1 minutos" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Ayer 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Ayer 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Mañana 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Mañana 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView no tiene implementada el manejador de la señal " "ViewItems.dragUpdated(). No será posible arrastrar." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "la propiedad «%1» del objeto %2 es del tipo %3 y no se puede definir el " "valor «%4» del tipo %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "la propiedad «%1» no existe o no tiene permisos de escritura para el objeto " "%2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarma" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "La alarma tiene una operación pendiente." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Uso: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opciones:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 espera un parámetro adicional: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 espera un valor para el parámetro: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 espera parámetros adicionales: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "pruebe a sobreescribir el slot swipeEvent()" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "pruebe a sobreescribir el slot rebound()" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Ignorando la prioridad de «AfterItem» para filtros «InverseMouse»." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "El cambio de los parámetros de la conexión está prohibido." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "Las actualizaciones al servicio eliminarán el vínculo detectado en la " "propiedad «%1»." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Aviso: el adjunto debe tener un identificador. No se guardará el estado." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Aviso: ya se registró el UUID del adjunto y no se guardará el estado: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Todos los padres deben tener un id.\n" "Se ha desactivado la función de guardar estado para %1, clase %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "No se encontró el tema: «%1»" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "No es un componente Palette." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "El modo de arrastrado necesita una ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Arrastrar solo está soportado si se usa un QAbstractItemModel, ListModel o " "lista." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Cancelar" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Confirmar" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Cerrar" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Hecho" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "En proceso" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Suelte para actualizar…" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Deslice para actualizar…" #~ msgid "Theme not found: " #~ msgstr "Tema gráfico no encontrado: " ./po/ug.po0000644000015600001650000002323412700370701012467 0ustar jenkinsjenkins# Uyghur translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-08-06 16:20+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Uyghur \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "ھەممىنى تاللا" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "كەس" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "كۆچۈر" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "چاپلا" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "كەينى" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "ئۆچۈر" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "نەڭ %2 نىڭ خاسلىقى \"%1\" نىڭ تىپى %3 بولغاچقا، تىپى %5 بولغان قىممەت \"%4\" " "بېرىشكە بولمايدۇ" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "نەڭ %2 نىڭ خاسلىقى \"%1\" مەۋجۇت ئەمەس ياكى يازغىلى بولمايدۇ" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "قوڭغۇراق" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "قوڭغۇراق توڭلىتىلغان ھالەتتە." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "ئىشلىتىش ئۇسۇلى: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "تاللانمىلار:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 نىڭغا قوشۇمچە پارامېتىر زۆرۈر: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 پارامېتىر ئۈچۈن بىر قىممەت تەلەپ قىلىدۇ: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 قوشۇمچە پارامېتىر تەلەپ قىلىدۇ: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "InverseMouse سۈزگۈچى ئۈچۈن AfterItem نىڭ مەرتىۋىسىگە پىسەنت قىلمايدۇ" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "ئاگاھلاندۇرۇش: قوشۇلمىنىڭ چوقۇم ID سى بولۇشى كېرەك. ھالەت ساقلانمايدۇ." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "ئاگاھلاندۇرۇش: قوشۇلمىنىڭ ID سى خەتلىنىپ بولغان. ھالەت ساقلانمايدۇ:%1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "بارلىق ئاتا-ئانىنىڭ چوقۇم ID سى بولۇشى كېرەك.\n" "ھالەت ساقلاش %1، ۋە تىپ %2 ئۈچۈن ئىناۋەتسىز قىلىنغان." #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "ئەمەلدىن قالدۇر" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "جەزملە" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "ياپ" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "تامام" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "بىر تەرەپ قىلىۋاتىدۇ" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "قويۇۋېتىپ يېڭىلاش…" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "تارتىپ يېڭىلاش…" #~ msgid "Theme not found: " #~ msgstr "باش تېما تېپىلمىدى " ./po/fr.po0000644000015600001650000002365712700370701012474 0ustar jenkinsjenkins# French translation for ubuntu-ui-toolkit # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2013-06-26 00:38+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Tout sélectionner" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Couper" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Copier" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Coller" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Précédent" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Supprimer" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Aucun service/chemin spécifié" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Type de bus non valide : %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Actuellement" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "il y a %1 minute" msgstr[1] "il y a %1 minutes" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 minute" msgstr[1] "%1 minutes" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Hier 'h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Hier 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Demain 'h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Demain 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView n'est pas implémenté pour la gestion du signal " "ViewItems.dragUpdated(). Aucun déplacement glissé ne sera possible." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "La propriété « %1 » de l'objet %2 est de type %3 et ne peut pas être défini " "à la valeur « %4 » du type %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "La propriété « %1 » n'existe pas ou n'est pas inscriptible pour l'objet %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alerte" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "L'alarme a une opération en attente." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Utilisation : " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Options :" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 attend un argument supplémentaire : %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 attend une valeur comme argument : %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 attend des arguments supplémentaires : %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Ignorer la priorité AfterItem pour les filtres InverseMouse" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "La modification des paramètres de connexion est interdite." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "L'erreur détectée sur la propriété « %1 » sera supprimée par le service de " "mises à jour." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Avertissement : l'attaché doit avoir un ID. L'état ne sera pas enregistré." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Avertissement : l'UUID de l'attaché est déjà enregistré, l'état ne sera pas " "enregistré : %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Tous les parents doivent avoir un identifiant.\n" "Enregistrement de l'état désactivé pour %1, classe %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Thème introuvable : « %1 »" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Pas un composant de Palette." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Le mode glisser nécessite ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Le glisser est uniquement pris en charge lorsque vous utilisez " "QAbstractItemModel, ListModel ou List." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Annuler" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Confirmer" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Fermer" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Terminé" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "En cours" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Relâchez pour actualiser..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Tirer pour actualiser..." #~ msgid "Theme not found: " #~ msgstr "Thème introuvable : " ./po/vi.po0000644000015600001650000002037012700370701012470 0ustar jenkinsjenkins# Vietnamese translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-10-18 13:49+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Vietnamese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" ./po/ja.po0000644000015600001650000002170712700370701012451 0ustar jenkinsjenkins# Japanese translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-07-09 05:08+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "すべて選択" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "切り取り" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "コピー" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "貼り付け" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "戻る" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "削除" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "オブジェクト %2 の プロパティ \"%1\" は %3 型のため、%5 型の値 \"%4\" を代入できません" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "オブジェクト %2 のプロパティ\"%1\" は存在しないか書き込み可能ではありません" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "アラーム" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "使い方: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "オプション:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 は追加の引数を必要とします: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 は引数の値を必要とします: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 は追加の引数を必要とします: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "警告:添付されたUUIDは既に登録されているため、状態は保存されませんでした: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "キャンセル" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "確認" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "閉じる" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "完了" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "処理中" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "離して更新..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "引いて更新..." #~ msgid "Theme not found: " #~ msgstr "テーマが見つかりません: " ./po/zh_HK.po0000644000015600001650000002122412700370701013054 0ustar jenkinsjenkins# Chinese (Hong Kong) translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-10-03 19:55+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Chinese (Hong Kong) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "全選" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "剪下" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "複製" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "貼上" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "刪除" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "鬧鐘" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "" #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "選項:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 正預期一個附加引數:%2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 正預期一個引數值:%2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 正預期附加引數:%2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "警告:attachee 必須有一個 ID。狀態將不被儲存。" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "警告:attachee 的 UUID 已被註冊,狀態不會被儲存:%1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "取消" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "確認" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "關閉" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "完成" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "進行中" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "釋放以重新整理..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "" #~ msgid "Theme not found: " #~ msgstr "未找到主題: " ./po/de.po0000644000015600001650000002376712700370701012457 0ustar jenkinsjenkins# German translation for ubuntu-ui-toolkit # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2015-11-20 22:23+0000\n" "Last-Translator: Tobias Bannert \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Alles auswählen" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Ausschneiden" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Kopieren" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Einfügen" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Zurück" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Entfernen" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Kein Dienst/Pfad angegeben" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Ungültiger Bus-Typ: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Gerade eben" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "Vor %1 Minute" msgstr[1] "Vor %1 Minuten" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 Minute" msgstr[1] "%1 Minuten" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "hh:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "hh:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Gestern 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Gestern 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Morgen 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Morgen 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "d ddd MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "d ddd MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "ListView hat keinen ViewItems.dragUpdated() signal handler. Ziehen ist nicht " "möglich." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "Die Eigenschaft »%1« des Objektes %2 hat den Typ %3 und kann nicht den Wert " "»%4« vom Typ %5 zugewiesen bekommen" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "Die Eigenschaft »%1« des Objektes %2 existiert nicht oder ist nicht " "veränderbar" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarm" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "Der Alarm hat einen bevorstehenden Einsatz." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Aufruf: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Optionen:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 erwartet ein zusätzliches Argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 erwartet einen Wert für das Argument: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 erwartet zusätzliche Argumente: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "erwäge das Überschreiben des swipeEvent() Slots!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "erwäge das Überschreiben des rebound() Slots!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "»AfterItem«-Priorität für »InverseMouse«-Filter wird ignoriert." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Ändern der Verbindungsparameter nicht erlaubt." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "Bestehende Anbindung in Eigenschaft '%1' wird bei Serviceupdates entfernt." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Achtung: Zu speicherndes Element muss eine »ID« haben. Der Zustand wird " "nicht gespeichert." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Achtung: Die »UUID« des zu speichernden Elementes ist bereits registriert, " "der Zustand wird nicht gespeichert: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Alle übergeordneten Elemente müssen eine »ID« besitzen.\n" "Speichern des Zustandes deaktiviert für %1, Klasse %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Thema nicht gefunden: »%1«" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Kein Bestandteil der Palette." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Ziehmodus erfordert »ListView«" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Ziehen ist nur unterstützt, wenn QAbstractItemModel, ListModel oder list " "verwendet wird." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Abbrechen" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Bestätigen" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Beenden" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Fertig" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "In Bearbeitung" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Zum Aktualisieren loslassen …" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Zum Aktualisieren ziehen …" #~ msgid "Theme not found: " #~ msgstr "»Theme« nicht gefunden: " ./po/be.po0000644000015600001650000002626012700370701012444 0ustar jenkinsjenkins# Belarusian translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-09-24 10:30+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Belarusian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Абраць усё" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Выразаць" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Капіяваць" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Уставіць" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Назад" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Выдаліць" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "Служба ці шлях адсутнічае" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "Недапушчальны тып шыны: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "Толькі што" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 хвіліну таму" msgstr[1] "%1 хвіліны таму" msgstr[2] "%1 хвілінаў таму" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 хвіліна" msgstr[1] "%1 хвіліны" msgstr[2] "%1 хвілінаў" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'Учора 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'Учора 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'Заўтра 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'Заўтра 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "ddd d MMM' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "ddd d MMM' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" "У ListView не рэалізаваны апрацоўнік сігналу ViewItems.dragUpdated(). " "Перацягванне будзе немагчыма." #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "уласцівасць \"%1\" аб'екта %2 мае тып %3 і да яго не можа быць прысвоена " "значэнне \"%4\" тыпу %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "" "уласцівасці \"%1\" аб'екта %2 не існуе ці яна з'яўляецца непрыдатнай да " "запісу" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Нагадванне" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "У чарзе напамінкаў ёсць дзеянне." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Выкарыстанне: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Опцыі:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 патрэбны дадатковы аргумент: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 патрэбнае значэнне длч аргументу: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 патрэбныя дадатковыя аргументы: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "разгледзець пераазначэнне swipeEvent() slot!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "разгледзець пераазначэнне rebound() slot!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Ігнаруем прыярытэтнасць AfterItem для фільтраў InverseMouse." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "Змена параметраў падлучэння забаронена." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" "Прывязка выяўленых на маёмасць \"% 1\" будуць выдалены абнаўленняў " "абслугоўвання. '%1' будзе выдалены службай абнаўлення." #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Папярэджанне: аўтар дадання павінен мець ідэнтыфікатар. Стан не захоўваецца." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Папярэджанне: UUID аўтара дадання ўжо зарэгістраваны, стан не захоўваецца: %1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Усе бацькоўскія аб'екты павінны мець ідэнтыфікатары.\n" "Захаванне стану для %1, клас %2 выключаны" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "Тэма ня знайдзена: \"%1\"" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "Не зьяўляецца кампанентам палітры." #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "Для выкарыстаньня рэжыму перацягваньня патрабуецца ListView" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" "Перацягваньне падтрымваецца толькі пры выкарыстаньні QAbstractItemModel, " "ListModel ці спіса." #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Скасаваць" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Пацвердзіць" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Закрыць" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Выканана" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "У працэсе" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Адпусціце для абнаўлення..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Пацягніце для абнаўлення..." #~ msgid "Theme not found: " #~ msgstr "Тэма не знойдзеная: " ./po/zh_CN.po0000644000015600001650000002275212700370701013061 0ustar jenkinsjenkins# Chinese (Simplified) translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-07-06 06:53+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Chinese (Simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "全选" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "剪切" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "复制" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "粘贴" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "返回" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "删除" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "没有指定服务/路径" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "无效的总线类型: %1." #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "当前" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 分钟前" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "%1 分钟" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "'昨天 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "'昨天 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "'明天 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "'明天 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "ddd' 'HH:mm" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "MMM d ddd' 'h:mm ap" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "MMM d ddd' 'HH:mm" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "ListView 没有实现 ViewItems.dragUpdated() 信号处理:拖动操作不能。" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "对象 %2 的属性 \"%1\" 类型为 %3,不能被赋值为 %5 类型的 \"%4\"" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "属性 \"%1\" 不存在或是对象 %2 的不可写属性" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "报警" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "警报器有一项待处理的操作。" #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "用法: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "选项:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 需要额外的参数: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 需要一个参数值: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 需要额外的参数: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "请考虑重载swipeEvent()槽!" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "请考虑重载rebound()槽!" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "忽略用于InverseMouse过滤器的AfterItem优先级。" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "禁止修改连接参数。" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "在属性'%1'上侦测到的绑定将在服务升级后被移除。" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "警告:附属必须有一个ID。状态不会被保存。" #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "警告:附属的UUID已经被注册过,状态将不会被保存:%1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "所有的双亲必须有一个id。\n" "状态保存禁用 %1,类 %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "主题没有找到: \"%1\"" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "并非调色板组件。" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "需要ListView进行拖放模式" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "拖放仅在使用 QAbstractItemModel, ListModel 或 list 时被支持。" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "取消" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "确认" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "关闭" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "完成" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "处理中" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "释放以刷新..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "下拉以刷新..." ./po/ast.po0000644000015600001650000002211512700370701012640 0ustar jenkinsjenkins# Asturian translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:05+0100\n" "PO-Revision-Date: 2014-10-03 23:08+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2016-03-16 06:05+0000\n" "X-Generator: Launchpad (build 17947)\n" #: Ubuntu/Components/1.2/TextInputPopover.qml:29 #: Ubuntu/Components/1.3/TextInputPopover.qml:29 msgid "Select All" msgstr "Esbillar too" #: Ubuntu/Components/1.2/TextInputPopover.qml:36 #: Ubuntu/Components/1.3/TextInputPopover.qml:36 msgid "Cut" msgstr "Cortar" #: Ubuntu/Components/1.2/TextInputPopover.qml:48 #: Ubuntu/Components/1.3/TextInputPopover.qml:48 msgid "Copy" msgstr "Copiar" #: Ubuntu/Components/1.2/TextInputPopover.qml:57 #: Ubuntu/Components/1.3/TextInputPopover.qml:57 msgid "Paste" msgstr "Apegar" #: Ubuntu/Components/1.2/ToolbarItems.qml:143 #: Ubuntu/Components/1.3/ToolbarItems.qml:143 msgid "Back" msgstr "Atrás" #: Ubuntu/Components/ListItems/1.2/Empty.qml:398 #: Ubuntu/Components/ListItems/1.3/Empty.qml:398 msgid "Delete" msgstr "Desaniciar" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:51 msgid "No service/path specified" msgstr "" #: Ubuntu/Components/plugin/adapters/dbuspropertywatcher_p.cpp:69 #, qt-format msgid "Invalid bus type: %1." msgstr "" #. TRANSLATORS: Time based "this is happening/happened now" #: Ubuntu/Components/plugin/i18n.cpp:268 msgid "Now" msgstr "" #: Ubuntu/Components/plugin/i18n.cpp:275 #, qt-format msgid "%1 minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: Ubuntu/Components/plugin/i18n.cpp:277 #, qt-format msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:284 msgid "h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:287 msgid "HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:293 msgid "'Yesterday 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:296 msgid "'Yesterday 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:302 msgid "'Tomorrow 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:305 msgid "'Tomorrow 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:312 msgid "ddd' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:315 msgid "ddd' 'HH:mm" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:322 msgid "ddd d MMM' 'h:mm ap" msgstr "" #. TRANSLATORS: Please translated these to your locale datetime format using the format specified by #. https://qt-project.org/doc/qt-5-snapshot/qdatetime.html#fromString-2 #: Ubuntu/Components/plugin/i18n.cpp:325 msgid "ddd d MMM' 'HH:mm" msgstr "" #: Ubuntu/Components/plugin/privates/listitemdragarea.cpp:122 msgid "" "ListView has no ViewItems.dragUpdated() signal handler implemented. No " "dragging will be possible." msgstr "" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:176 #, qt-format msgid "" "property \"%1\" of object %2 has type %3 and cannot be set to value \"%4\" " "of type %5" msgstr "" "la propiedá «%1» del oxetu %2 tien la triba %3 y nun pue afitase al valor " "«%4» de la triba %5" #: Ubuntu/Components/plugin/statesaverbackend_p.cpp:185 #, qt-format msgid "property \"%1\" does not exist or is not writable for object %2" msgstr "la propiedá \"%1\" nun existe o nun ye escribible pal oxetu %2" #: Ubuntu/Components/plugin/ucalarm.cpp:41 #: Ubuntu/Components/plugin/ucalarm.cpp:643 msgid "Alarm" msgstr "Alarma" #: Ubuntu/Components/plugin/ucalarm.cpp:635 #: Ubuntu/Components/plugin/ucalarm.cpp:667 msgid "Alarm has a pending operation." msgstr "La alarma tien una operación pendiente." #: Ubuntu/Components/plugin/ucarguments.cpp:188 msgid "Usage: " msgstr "Usu: " #: Ubuntu/Components/plugin/ucarguments.cpp:209 msgid "Options:" msgstr "Opciones:" #: Ubuntu/Components/plugin/ucarguments.cpp:498 #, qt-format msgid "%1 is expecting an additional argument: %2" msgstr "%1 ta esperando un argumentu más: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:503 #, qt-format msgid "%1 is expecting a value for argument: %2" msgstr "%1 ta esperando un valor pal argumentu: %2" #: Ubuntu/Components/plugin/ucarguments.cpp:520 #, qt-format msgid "%1 is expecting additional arguments: %2" msgstr "%1 ta esperando por más argumentos: %2" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:145 msgid "consider overriding swipeEvent() slot!" msgstr "" #: Ubuntu/Components/plugin/uclistitemstyle.cpp:165 msgid "consider overriding rebound() slot!" msgstr "" #: Ubuntu/Components/plugin/ucmousefilters.cpp:1065 msgid "Ignoring AfterItem priority for InverseMouse filters." msgstr "Inorando la prioridá AfterItem pa les peñeres InverseMouse." #: Ubuntu/Components/plugin/ucserviceproperties.cpp:77 msgid "Changing connection parameters forbidden." msgstr "" #: Ubuntu/Components/plugin/ucserviceproperties.cpp:160 #, qt-format msgid "" "Binding detected on property '%1' will be removed by the service updates." msgstr "" #: Ubuntu/Components/plugin/ucstatesaver.cpp:46 msgid "Warning: attachee must have an ID. State will not be saved." msgstr "" "Avisu: El preséu axuntu tien de tener una ID. Nun se guardará l'estáu." #: Ubuntu/Components/plugin/ucstatesaver.cpp:56 #, qt-format msgid "" "Warning: attachee's UUID is already registered, state won't be saved: %1" msgstr "" "Avisu: La UUID del preséu axuntu yá ta rexistrada, l'estáu nun se guardará: " "%1" #: Ubuntu/Components/plugin/ucstatesaver.cpp:107 #, qt-format msgid "" "All the parents must have an id.\n" "State saving disabled for %1, class %2" msgstr "" "Tolos padres han tener una id.\n" "Desactivóse'l guardáu d'estáu pa %1, clase %2" #: Ubuntu/Components/plugin/uctheme.cpp:208 #, qt-format msgid "Theme not found: \"%1\"" msgstr "" #: Ubuntu/Components/plugin/uctheme.cpp:539 msgid "Not a Palette component." msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:462 msgid "Dragging mode requires ListView" msgstr "" #: Ubuntu/Components/plugin/ucviewitemsattached.cpp:468 msgid "" "Dragging is only supported when using a QAbstractItemModel, ListModel or " "list." msgstr "" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:78 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:78 msgid "Cancel" msgstr "Encaboxar" #: Ubuntu/Components/Popups/1.2/ComposerSheet.qml:88 #: Ubuntu/Components/Popups/1.3/ComposerSheet.qml:88 msgid "Confirm" msgstr "Confirmar" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:85 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:85 msgid "Close" msgstr "Zarrar" #: Ubuntu/Components/Popups/1.2/DefaultSheet.qml:95 #: Ubuntu/Components/Popups/1.3/DefaultSheet.qml:95 msgid "Done" msgstr "Fecho" #: Ubuntu/Components/Themes/Ambiance/1.2/ProgressBarStyle.qml:51 #: Ubuntu/Components/Themes/Ambiance/1.3/ProgressBarStyle.qml:50 msgid "In Progress" msgstr "En procesu" #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Release to refresh..." msgstr "Soltar pa refrescar..." #: Ubuntu/Components/Themes/Ambiance/1.2/PullToRefreshStyle.qml:28 #: Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml:28 msgid "Pull to refresh..." msgstr "Tirar pa refrescar..." #~ msgid "Theme not found: " #~ msgstr "Nun s'alcontró'l tema: " ./ubuntu-sdk.qmlproject0000644000015600001650000000104712700370701015277 0ustar jenkinsjenkins/* File generated by Qt Creator, version 2.4.1 */ import QmlProject 1.1 Project { mainFile: "examples/ubuntu-ui-toolkit-gallery/ubuntu-ui-toolkit-gallery.qml" /* Include .qml, .js, and image files from current directory and subdirectories */ QmlFiles { directory: "." } JavaScriptFiles { directory: "." } ImageFiles { directory: "." } Files { directory: "." filter: "*.py" } /* List of plugin directories passed to QML runtime */ importPaths: [ "modules" ] } ./COPYING0000644000015600001650000001674312700370701012140 0ustar jenkinsjenkins GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. ./CHANGES.syntax0000644000015600001650000000556512700370701013425 0ustar jenkinsjenkinsThe CHANGES file documents all changes in the toolkit that will break applications. A strict syntax is defined below that eases the lives of developers. There are 2 types of changes, a section for each exists for each release of the toolkit: - API Changes - Compatibility Breaks Each change must be reported on a new bullet point and respect one of the following templates: * $TYPE_OF_CHANGE$ $OBJECT$ * $TYPE_OF_CHANGE$ IN $OBJECT$: $MEMBER_TYPE$ $OLD_SIGNATURE$ TO $NEW_SIGNATURE$ * $TYPE_OF_CHANGE$ IN $OBJECT$: description of the compatibility break Where $TYPE_OF_CHANGE$ is: - "DEPRECATED" - "CHANGED" - "REMOVED" Where $OBJECT$ is: - a QML class - a JavaScript module - a context property Where $MEMBER_TYPE$ is: - "property" - "signal" - "function" Original version not respecting the syntax: API Changes *********** * "clicked() and pressAndHold() signals of AbstractButton no longer take a mouse parameter as input." * ComponentUtils module is deprecated (affects componentUtils.js: hasStyle(), style(), delegateProperty() functions) * Property tools was deprecated for MainView, Tabs and PageStack. * Property page of Tab can no longer be a URL, but must be an Item (Page recommended). Use a Loader if you were using a URL first. Compatibility Breaks ******************** * Pages now automatically update MainView.toolbar.tools when they become active. * Disable swiping to switch tabs by default. * Header is now hidden when it has no title or contents * Page, PageStack and Tabs automatically determine their anchors and height inside a MainView, so there is no need to set them explicitly. * It is now recommended to always use Pages inside Tabs or PageStack. Non-Page items can still be used, but their margins will not automatically be set-up to align with the header of the MainView. Formatted version respecting the syntax: API Changes *********** * CHANGED IN AbstractButton: signal clicked(var mouse) TO clicked() * CHANGED IN AbstractButton: signal pressAndHold(var mouse) TO pressAndHold() * DEPRECATED ComponentUtils * DEPRECATED IN MainView: property ToolbarActions tools * DEPRECATED IN Tabs: property ToolbarActions tools * DEPRECATED IN PageStack: property ToolbarActions tools * CHANGED IN Tab: property var page TO Item page (where var page could be an Item or url) Compatibility Breaks ******************** * CHANGED IN Page: when it becomes active, MainView's property ToolbarActions toolbar.tools is automatically updated * CHANGED IN Tabs: swiping to switch tabs is disabled by default * CHANGED IN Header: becomes hidden when there is no title or contents * CHANGED IN Page, PageStack, Tabs: automatically determine their anchors and height inside a MainView * CHANGED IN Tabs, PageStack: it is recommended to always use Pages inside them. Non-Page items can still be used, but their margins will not automatically be set-up to align with the header of the MainView. ./documentation/0000755000015600001650000000000012700370716013751 5ustar jenkinsjenkins./documentation/ubuntu-components-pickers.qdoc0000644000015600001650000000132212700370701021754 0ustar jenkinsjenkins/* * Copyright (C) 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \qmlmodule Ubuntu.Components.Pickers 1.0 \title Pickers */ ./documentation/ubuntu-ui-toolkit-online-indexes.qdocconf0000644000015600001650000000063212700370701024021 0ustar jenkinsjenkinsinclude(ubuntu-ui-toolkit-online.qdocconf) indexes = \ /usr/share/qt5/doc/qtqml/qtqml.index \ /usr/share/qt5/doc/qtquick/qtquick.index \ /usr/share/qt5/doc/qtwebkit/qtwebkit.index \ /usr/share/qt5/doc/qtsvg/qtsvg.index \ /usr/share/qt5/doc/qtscript/qtscript.index \ /usr/share/qt5/doc/qtmultimedia/qtmultimedia.index \ /usr/share/doc/unity-action/qml/unity-action-qml-api.index \ ./documentation/autopilot-helpers/0000755000015600001650000000000012700370701017423 5ustar jenkinsjenkins./documentation/autopilot-helpers/_static/0000755000015600001650000000000012700370701021051 5ustar jenkinsjenkins./documentation/autopilot-helpers/_static/favicon.ico0000644000015600001650000000257612700370701023204 0ustar jenkinsjenkinsh( :w{?}A~@AEFGHFLEIFOPTX[\Z[]`^ddfifkmgklkpnrqx{w{UUUUU6%%6UUUUUUUU:  :UUUUU' 9"'UUU:!<@)TC:UU -(TT80 U6LQ$ASM 6%TH BT.%R>G31O5K6; % TNET,%6FP/2JRI6U #.TT=+ UU:47&TD:UUU'?*'UUUUU:  :UUUUUUUU6%%6UUUUU./documentation/autopilot-helpers/_static/nature.css0000644000015600001650000000670112700370701023065 0ustar jenkinsjenkins/* Copyright 2015 Canonical Ltd. */ @import url(basic.css); body { font-family:Ubuntu, "DejaVu Sans", "Trebuchet MS", sans-serif; font-size:100%; background-color:#2C001E; margin:0; padding:0; } div.documentwrapper { float:left; width:100%; } div.bodywrapper { margin:0 0 0 0; } hr { border:1px solid #B1B4B6; } div.body { background-color:#FFF; color:#3E4349; font-size:.9em; padding:0 30px 30px; } div.footer { color:#CCC; width:100%; text-align:center; font-size:75%; padding:13px 0; } div.footer a { color:#444; text-decoration:underline; } div.related { background-color:#DD4814; line-height:32px; color:#fff; font-size:.9em; } div.related a { color:#EEE; } div.sphinxsidebar { font-size:.75em; line-height:1.5em; } div.sphinxsidebarwrapper { padding:20px 0; } div.sphinxsidebar h3, div.sphinxsidebar h4 { font-family:Ubuntu, "DejaVu Sans", "Trebuchet MS", sans-serif; color:#222; font-size:1.2em; font-weight:400; background-color:#ddd; margin:0; padding:5px 10px; } div.sphinxsidebar p { color:#444; padding:2px 10px; } div.sphinxsidebar ul { color:#000; margin:10px 5px; padding:0; } div.sphinxsidebar input { border:1px solid #ccc; font-family:Ubuntu, "DejaVu Sans", "Trebuchet MS", sans-serif; font-size:1em; } div.sphinxsidebar input[type=text] { margin-left:5px; } a { color:#5E2750; text-decoration:none; } a:hover { color:#DD4814; text-decoration:underline; } div.body h1 { font-family:Ubuntu, "DejaVu Sans", "Trebuchet MS", sans-serif; font-weight:bold; font-size:200%; color:#444; margin:20px 0 10px; padding:5px 0 5px 10px; } div.body h2 { font-family:Ubuntu, "DejaVu Sans", "Trebuchet MS", sans-serif; font-size:130%; background-color:#CCC; margin:20px 0 10px; padding:5px 0 5px 10px; } div.body h6 { font-family:Ubuntu, "DejaVu Sans", "Trebuchet MS", sans-serif; background-color:#BED4EB; font-weight:400; color:#333; margin:30px 0 10px; padding:5px 0 5px 10px; } a.headerlink { text-decoration:none; padding:0 4px; } a.headerlink:hover { background-color:#AEA79F; color:#FFF; } div.body p,div.body dd,div.body li { line-height:1.5em; } div.highlight { background-color:#FFF; } div.note { background-color:#eee; border:1px solid #ccc; } div.seealso { background-color:#ffc; border:1px solid #ff6; } div.warning { background-color:#ffe4e4; border:1px solid #f66; } p.admonition-title:after { content:":"; } pre { background-color:#EFEFEF; color:#000; line-height:1.1em; border:1px solid #C6C9CB; font-size:1.2em; font-family:"Ubuntu Mono", Monaco, Consolas, "DejaVu Sans Mono", "Lucida Console", monospace; margin:1.5em 0; padding:6px; } tt { background-color:#EFEFEF; color:#222; font-size:1.1em; font-family:"Ubuntu Mono", Monaco, Consolas, "DejaVu Sans Mono", "Lucida Console", monospace; } .viewcode-back { font-family:Ubuntu, "DejaVu Sans", "Trebuchet MS", sans-serif; } div.viewcode-block:target { background-color:#f4debf; border-top:1px solid #ac9; border-bottom:1px solid #ac9; } div.document,div.topic { background-color:#eee; } div.sphinxsidebar h3 a,div.sphinxsidebar a { color:#444; } div.admonition p.admonition-title + p,p.admonition-title { display:inline; } ./documentation/autopilot-helpers/ubuntuuitoolkit.rst0000644000015600001650000000031712700370701023444 0ustar jenkinsjenkinsubuntuuitoolkit Package ======================= :mod:`custom proxy object` Module --------------------------------- .. automodule:: ubuntuuitoolkit :members: :undoc-members: :show-inheritance: ./documentation/autopilot-helpers/conf.py0000644000015600001650000002463412700370701020733 0ustar jenkinsjenkins# -*- coding: utf-8 -*- # # ubuntu-ui-toolkit-autopilot documentation build configuration file. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys assert sys import os assert os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.join(os.path.abspath('../..'), 'tests/autopilot/')) import ubuntuuitoolkit assert ubuntuuitoolkit # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo', 'sphinx.ext.viewcode', ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'ubuntu-ui-toolkit-autopilot' copyright = u'2015, Canonical' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '15.04' # The full version, including alpha/beta/rc tags. release = '15.04' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all # documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. # keep_warnings = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = None html_favicon = './images/favicon.ico' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. # html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} html_domain_indices = True # Additional templates that should be rendered to pages, maps page names to # template names. html_use_index = True # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True html_show_sourcelink = False # If false, no index is generated. # html_use_index = True html_show_sphinx = False # If true, the index is split into individual pages for each letter. html_show_copyright = True # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'ubuntu-ui-toolkit-autopilotdoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # 'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ('index', 'ubuntu-ui-toolkit-autopilot.tex', u'ubuntu-ui-toolkit-autopilot Documentation', u'authors', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'ubuntu-ui-toolkit-autopilot', u'ubuntu-ui-toolkit-autopilot Documentation', [u'authors'], 1) ] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'ubuntu-ui-toolkit-autopilot', u'ubuntu-ui-toolkit-autopilot Documentation', u'authors', 'ubuntu-ui-toolkit-autopilot', 'An autopilot emulator for the ubuntu sdk', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. # texinfo_no_detailmenu = False # -- Options for Epub output ---------------------------------------------- # Bibliographic Dublin Core info. epub_title = u'ubuntu-ui-toolkit-autopilot' epub_author = u'authors' epub_publisher = u'Canonical' epub_copyright = u'2015, Canonical' # The basename for the epub file. It defaults to the project name. # epub_basename = u'ubuntu-ui-toolkit-autopilot' # The HTML theme for the epub output. Since the default themes are not # optimized for small screen space, using the same theme for HTML and # epub output is usually not wise. This defaults to 'epub', a theme # designed to save visual space. # epub_theme = 'epub' # The language of the text. It defaults to the language option # or en if the language is not set. # epub_language = '' # The scheme of the identifier. Typical schemes are ISBN or URL. # epub_scheme = '' # The unique identifier of the text. This can be a ISBN number # or the project homepage. # epub_identifier = '' # A unique identification for the text. # epub_uid = '' # A tuple containing the cover image and cover page html template filenames. # epub_cover = () # A sequence of (type, uri, title) tuples for the guide element of content.opf. # epub_guide = () # HTML files that should be inserted before the pages created by sphinx. # The format is a list of tuples containing the path and title. # epub_pre_files = [] # HTML files shat should be inserted after the pages created by sphinx. # The format is a list of tuples containing the path and title. # epub_post_files = [] # A list of files that should not be packed into the epub file. epub_exclude_files = ['search.html'] # The depth of the table of contents in toc.ncx. # epub_tocdepth = 3 # Allow duplicate toc entries. # epub_tocdup = True # Choose between 'default' and 'includehidden'. # epub_tocscope = 'default' # Fix unsupported image types using the PIL. # epub_fix_images = False # Scale large images. # epub_max_image_width = 0 # How to display URL addresses: 'footnote', 'no', or 'inline'. # epub_show_urls = 'inline' # If false, no index is generated. # epub_use_index = True ./documentation/autopilot-helpers/index.rst0000644000015600001650000000063612700370701021271 0ustar jenkinsjenkins.. ubuntu-ui-toolkit-autopilot documentation master file, created by sphinx-quickstart on Thu Jan 8 12:39:43 2015. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to ubuntu-ui-toolkit-autopilot's documentation! ====================================== Contents: .. toctree:: :maxdepth: 2 ubuntuuitoolkit * :ref:`genindex` ./documentation/autopilot-helpers/_templates/0000755000015600001650000000000012700370701021560 5ustar jenkinsjenkins./documentation/autopilot-helpers/_templates/layout.html0000644000015600001650000000115712700370701023767 0ustar jenkinsjenkins {# default/layout.html ~~~~~~~~~~~~~~~~~~~ Sphinx layout template for the default theme. :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {% extends "basic/layout.html" %} {%- block content %}
{%- block document %}
{%- if render_sidebar %}
{%- endif %}
{% block body %} {% endblock %}
{%- endblock %} {%- endblock %} ./documentation/autopilot-helpers/images/0000755000015600001650000000000012700370701020670 5ustar jenkinsjenkins./documentation/autopilot-helpers/images/favicon.ico0000644000015600001650000000257612700370701023023 0ustar jenkinsjenkinsh( :w{?}A~@AEFGHFLEIFOPTX[\Z[]`^ddfifkmgklkpnrqx{w{UUUUU6%%6UUUUUUUU:  :UUUUU' 9"'UUU:!<@)TC:UU -(TT80 U6LQ$ASM 6%TH BT.%R>G31O5K6; % TNET,%6FP/2JRI6U #.TT=+ UU:47&TD:UUU'?*'UUUUU:  :UUUUUUUU6%%6UUUUU./documentation/autopilot-helpers/Makefile0000644000015600001650000001517212700370701021071 0ustar jenkinsjenkins# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/sdkhelpers.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/sdkhelpers.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/sdkhelpers" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/sdkhelpers" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." ./documentation/autopilot-helpers/_build/0000755000015600001650000000000012700370701020661 5ustar jenkinsjenkins./documentation/autopilot-helpers/_build/html/0000755000015600001650000000000012700370701021625 5ustar jenkinsjenkins./documentation/autopilot-helpers/_build/html/ubuntuuitoolkit.html0000644000015600001650000000576012700370701026011 0ustar jenkinsjenkins ubuntuuitoolkit Package — ubuntu-ui-toolkit-autopilot 15.04 documentation

ubuntuuitoolkit Package

custom proxy object Module

./documentation/autopilot-helpers/_build/html/_static/0000755000015600001650000000000012700370701023253 5ustar jenkinsjenkins./documentation/autopilot-helpers/_build/html/_static/comment-close.png0000644000015600001650000000677212700370701026542 0ustar jenkinsjenkinsPNG  IHDRa OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  tIME!,IDAT8e_Hu?}s3y˕U2MvQ֊FE.łĊbE$DDZF5b@Q":2{n.s<_ y?mwV@tR`}Z _# _=_@ w^R%6gC-έ(K>| ${} to avoid XSS via location.hash (#9521) quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, // Check if a string has a non-whitespace character in it rnotwhite = /\S/, // Used for trimming whitespace trimLeft = /^\s+/, trimRight = /\s+$/, // Match a standalone tag rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, // JSON RegExp rvalidchars = /^[\],:{}\s]*$/, rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, // Useragent RegExp rwebkit = /(webkit)[ \/]([\w.]+)/, ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, rmsie = /(msie) ([\w.]+)/, rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, // Matches dashed string for camelizing rdashAlpha = /-([a-z]|[0-9])/ig, rmsPrefix = /^-ms-/, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return ( letter + "" ).toUpperCase(); }, // Keep a UserAgent string for use with jQuery.browser userAgent = navigator.userAgent, // For matching the engine and version of the browser browserMatch, // The deferred used on DOM ready readyList, // The ready event handler DOMContentLoaded, // Save a reference to some core methods toString = Object.prototype.toString, hasOwn = Object.prototype.hasOwnProperty, push = Array.prototype.push, slice = Array.prototype.slice, trim = String.prototype.trim, indexOf = Array.prototype.indexOf, // [[Class]] -> type pairs class2type = {}; jQuery.fn = jQuery.prototype = { constructor: jQuery, init: function( selector, context, rootjQuery ) { var match, elem, ret, doc; // Handle $(""), $(null), or $(undefined) if ( !selector ) { return this; } // Handle $(DOMElement) if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; } // The body element only exists once, optimize finding it if ( selector === "body" && !context && document.body ) { this.context = document; this[0] = document.body; this.selector = selector; this.length = 1; return this; } // Handle HTML strings if ( typeof selector === "string" ) { // Are we dealing with HTML string or an ID? if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = quickExpr.exec( selector ); } // Verify a match, and that no context was specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; doc = ( context ? context.ownerDocument || context : document ); // If a single string is passed in and it's a single tag // just do a createElement and skip the rest ret = rsingleTag.exec( selector ); if ( ret ) { if ( jQuery.isPlainObject( context ) ) { selector = [ document.createElement( ret[1] ) ]; jQuery.fn.attr.call( selector, context, true ); } else { selector = [ doc.createElement( ret[1] ) ]; } } else { ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; } return jQuery.merge( this, selector ); // HANDLE: $("#id") } else { elem = document.getElementById( match[2] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[2] ) { return rootjQuery.find( selector ); } // Otherwise, we inject the element directly into the jQuery object this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || rootjQuery ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return rootjQuery.ready( selector ); } if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }, // Start with an empty selector selector: "", // The current version of jQuery being used jquery: "1.7.2", // The default length of a jQuery object is 0 length: 0, // The number of elements contained in the matched element set size: function() { return this.length; }, toArray: function() { return slice.call( this, 0 ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num == null ? // Return a 'clean' array this.toArray() : // Return just the object ( num < 0 ? this[ this.length + num ] : this[ num ] ); }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems, name, selector ) { // Build a new jQuery matched element set var ret = this.constructor(); if ( jQuery.isArray( elems ) ) { push.apply( ret, elems ); } else { jQuery.merge( ret, elems ); } // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; if ( name === "find" ) { ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; } else if ( name ) { ret.selector = this.selector + "." + name + "(" + selector + ")"; } // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. // (You can seed the arguments with an array of args, but this is // only used internally.) each: function( callback, args ) { return jQuery.each( this, callback, args ); }, ready: function( fn ) { // Attach the listeners jQuery.bindReady(); // Add the callback readyList.add( fn ); return this; }, eq: function( i ) { i = +i; return i === -1 ? this.slice( i ) : this.slice( i, i + 1 ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ), "slice", slice.call(arguments).join(",") ); }, map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, end: function() { return this.prevObject || this.constructor(null); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: [].sort, splice: [].splice }; // Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; target = arguments[1] || {}; // skip the boolean and the target i = 2; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( length === i ) { target = this; --i; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend({ noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery; }, // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } }, // Handle when the DOM is ready ready: function( wait ) { // Either a released hold or an DOMready/load event and not yet ready if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready, 1 ); } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.fireWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.trigger ) { jQuery( document ).trigger( "ready" ).off( "ready" ); } } }, bindReady: function() { if ( readyList ) { return; } readyList = jQuery.Callbacks( "once memory" ); // Catch cases where $(document).ready() is called after the // browser event has already occurred. if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready return setTimeout( jQuery.ready, 1 ); } // Mozilla, Opera and webkit nightlies currently support this event if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", jQuery.ready, false ); // If IE event model is used } else if ( document.attachEvent ) { // ensure firing before onload, // maybe late but safe also for iframes document.attachEvent( "onreadystatechange", DOMContentLoaded ); // A fallback to window.onload, that will always work window.attachEvent( "onload", jQuery.ready ); // If IE and not a frame // continually check to see if the document is ready var toplevel = false; try { toplevel = window.frameElement == null; } catch(e) {} if ( document.documentElement.doScroll && toplevel ) { doScrollCheck(); } } }, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, isArray: Array.isArray || function( obj ) { return jQuery.type(obj) === "array"; }, isWindow: function( obj ) { return obj != null && obj == obj.window; }, isNumeric: function( obj ) { return !isNaN( parseFloat(obj) ) && isFinite( obj ); }, type: function( obj ) { return obj == null ? String( obj ) : class2type[ toString.call(obj) ] || "object"; }, isPlainObject: function( obj ) { // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } try { // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } } catch ( e ) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key; for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key ); }, isEmptyObject: function( obj ) { for ( var name in obj ) { return false; } return true; }, error: function( msg ) { throw new Error( msg ); }, parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); } // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( rvalidchars.test( data.replace( rvalidescape, "@" ) .replace( rvalidtokens, "]" ) .replace( rvalidbraces, "")) ) { return ( new Function( "return " + data ) )(); } jQuery.error( "Invalid JSON: " + data ); }, // Cross-browser xml parsing parseXML: function( data ) { if ( typeof data !== "string" || !data ) { return null; } var xml, tmp; try { if ( window.DOMParser ) { // Standard tmp = new DOMParser(); xml = tmp.parseFromString( data , "text/xml" ); } else { // IE xml = new ActiveXObject( "Microsoft.XMLDOM" ); xml.async = "false"; xml.loadXML( data ); } } catch( e ) { xml = undefined; } if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }, noop: function() {}, // Evaluates a script in a global context // Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { if ( data && rnotwhite.test( data ) ) { // We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( data ); } }, // Convert dashed to camelCase; used by the css and data modules // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); }, // args is for internal usage only each: function( object, callback, args ) { var name, i = 0, length = object.length, isObj = length === undefined || jQuery.isFunction( object ); if ( args ) { if ( isObj ) { for ( name in object ) { if ( callback.apply( object[ name ], args ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.apply( object[ i++ ], args ) === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isObj ) { for ( name in object ) { if ( callback.call( object[ name ], name, object[ name ] ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { break; } } } } return object; }, // Use native String.trim function wherever possible trim: trim ? function( text ) { return text == null ? "" : trim.call( text ); } : // Otherwise use our own trimming functionality function( text ) { return text == null ? "" : text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); }, // results is for internal usage only makeArray: function( array, results ) { var ret = results || []; if ( array != null ) { // The window, strings (and functions) also have 'length' // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 var type = jQuery.type( array ); if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { push.call( ret, array ); } else { jQuery.merge( ret, array ); } } return ret; }, inArray: function( elem, array, i ) { var len; if ( array ) { if ( indexOf ) { return indexOf.call( array, elem, i ); } len = array.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; for ( ; i < len; i++ ) { // Skip accessing in sparse arrays if ( i in array && array[ i ] === elem ) { return i; } } } return -1; }, merge: function( first, second ) { var i = first.length, j = 0; if ( typeof second.length === "number" ) { for ( var l = second.length; j < l; j++ ) { first[ i++ ] = second[ j ]; } } else { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, inv ) { var ret = [], retVal; inv = !!inv; // Go through the array, only saving the items // that pass the validator function for ( var i = 0, length = elems.length; i < length; i++ ) { retVal = !!callback( elems[ i ], i ); if ( inv !== retVal ) { ret.push( elems[ i ] ); } } return ret; }, // arg is for internal usage only map: function( elems, callback, arg ) { var value, key, ret = [], i = 0, length = elems.length, // jquery objects are treated as arrays isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; // Go through the array, translating each of the items to their if ( isArray ) { for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret[ ret.length ] = value; } } // Go through every key on the object, } else { for ( key in elems ) { value = callback( elems[ key ], key, arg ); if ( value != null ) { ret[ ret.length ] = value; } } } // Flatten any nested arrays return ret.concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { if ( typeof context === "string" ) { var tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind var args = slice.call( arguments, 2 ), proxy = function() { return fn.apply( context, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; return proxy; }, // Mutifunctional method to get and set values to a collection // The value/s can optionally be executed if it's a function access: function( elems, fn, key, value, chainable, emptyGet, pass ) { var exec, bulk = key == null, i = 0, length = elems.length; // Sets many values if ( key && typeof key === "object" ) { for ( i in key ) { jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); } chainable = 1; // Sets one value } else if ( value !== undefined ) { // Optionally, function values get executed if exec is true exec = pass === undefined && jQuery.isFunction( value ); if ( bulk ) { // Bulk operations only iterate when executing function values if ( exec ) { exec = fn; fn = function( elem, key, value ) { return exec.call( jQuery( elem ), value ); }; // Otherwise they run against the entire set } else { fn.call( elems, value ); fn = null; } } if ( fn ) { for (; i < length; i++ ) { fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); } } chainable = 1; } return chainable ? elems : // Gets bulk ? fn.call( elems ) : length ? fn( elems[0], key ) : emptyGet; }, now: function() { return ( new Date() ).getTime(); }, // Use of jQuery.browser is frowned upon. // More details: http://docs.jquery.com/Utilities/jQuery.browser uaMatch: function( ua ) { ua = ua.toLowerCase(); var match = rwebkit.exec( ua ) || ropera.exec( ua ) || rmsie.exec( ua ) || ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || []; return { browser: match[1] || "", version: match[2] || "0" }; }, sub: function() { function jQuerySub( selector, context ) { return new jQuerySub.fn.init( selector, context ); } jQuery.extend( true, jQuerySub, this ); jQuerySub.superclass = this; jQuerySub.fn = jQuerySub.prototype = this(); jQuerySub.fn.constructor = jQuerySub; jQuerySub.sub = this.sub; jQuerySub.fn.init = function init( selector, context ) { if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { context = jQuerySub( context ); } return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); }; jQuerySub.fn.init.prototype = jQuerySub.fn; var rootjQuerySub = jQuerySub(document); return jQuerySub; }, browser: {} }); // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); browserMatch = jQuery.uaMatch( userAgent ); if ( browserMatch.browser ) { jQuery.browser[ browserMatch.browser ] = true; jQuery.browser.version = browserMatch.version; } // Deprecated, use jQuery.browser.webkit instead if ( jQuery.browser.webkit ) { jQuery.browser.safari = true; } // IE doesn't match non-breaking spaces with \s if ( rnotwhite.test( "\xA0" ) ) { trimLeft = /^[\s\xA0]+/; trimRight = /[\s\xA0]+$/; } // All jQuery objects should point back to these rootjQuery = jQuery(document); // Cleanup functions for the document ready method if ( document.addEventListener ) { DOMContentLoaded = function() { document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); jQuery.ready(); }; } else if ( document.attachEvent ) { DOMContentLoaded = function() { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( document.readyState === "complete" ) { document.detachEvent( "onreadystatechange", DOMContentLoaded ); jQuery.ready(); } }; } // The DOM ready check for Internet Explorer function doScrollCheck() { if ( jQuery.isReady ) { return; } try { // If IE is used, use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ document.documentElement.doScroll("left"); } catch(e) { setTimeout( doScrollCheck, 1 ); return; } // and execute any waiting functions jQuery.ready(); } return jQuery; })(); // String to Object flags format cache var flagsCache = {}; // Convert String-formatted flags into Object-formatted ones and store in cache function createFlags( flags ) { var object = flagsCache[ flags ] = {}, i, length; flags = flags.split( /\s+/ ); for ( i = 0, length = flags.length; i < length; i++ ) { object[ flags[i] ] = true; } return object; } /* * Create a callback list using the following parameters: * * flags: an optional list of space-separated flags that will change how * the callback list behaves * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible flags: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( flags ) { // Convert flags from String-formatted to Object-formatted // (we check in cache first) flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; var // Actual callback list list = [], // Stack of fire calls for repeatable lists stack = [], // Last fire value (for non-forgettable lists) memory, // Flag to know if list was already fired fired, // Flag to know if list is currently firing firing, // First callback to fire (used internally by add and fireWith) firingStart, // End of the loop when firing firingLength, // Index of currently firing callback (modified by remove if needed) firingIndex, // Add one or several callbacks to the list add = function( args ) { var i, length, elem, type, actual; for ( i = 0, length = args.length; i < length; i++ ) { elem = args[ i ]; type = jQuery.type( elem ); if ( type === "array" ) { // Inspect recursively add( elem ); } else if ( type === "function" ) { // Add if not in unique mode and callback is not in if ( !flags.unique || !self.has( elem ) ) { list.push( elem ); } } } }, // Fire callbacks fire = function( context, args ) { args = args || []; memory = !flags.memory || [ context, args ]; fired = true; firing = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; for ( ; list && firingIndex < firingLength; firingIndex++ ) { if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { memory = true; // Mark as halted break; } } firing = false; if ( list ) { if ( !flags.once ) { if ( stack && stack.length ) { memory = stack.shift(); self.fireWith( memory[ 0 ], memory[ 1 ] ); } } else if ( memory === true ) { self.disable(); } else { list = []; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { var length = list.length; add( arguments ); // Do we need to add the callbacks to the // current firing batch? if ( firing ) { firingLength = list.length; // With memory, if we're not firing then // we should call right away, unless previous // firing was halted (stopOnFalse) } else if ( memory && memory !== true ) { firingStart = length; fire( memory[ 0 ], memory[ 1 ] ); } } return this; }, // Remove a callback from the list remove: function() { if ( list ) { var args = arguments, argIndex = 0, argLength = args.length; for ( ; argIndex < argLength ; argIndex++ ) { for ( var i = 0; i < list.length; i++ ) { if ( args[ argIndex ] === list[ i ] ) { // Handle firingIndex and firingLength if ( firing ) { if ( i <= firingLength ) { firingLength--; if ( i <= firingIndex ) { firingIndex--; } } } // Remove the element list.splice( i--, 1 ); // If we have some unicity property then // we only need to do this once if ( flags.unique ) { break; } } } } } return this; }, // Control if a given callback is in the list has: function( fn ) { if ( list ) { var i = 0, length = list.length; for ( ; i < length; i++ ) { if ( fn === list[ i ] ) { return true; } } } return false; }, // Remove all callbacks from the list empty: function() { list = []; return this; }, // Have the list do nothing anymore disable: function() { list = stack = memory = undefined; return this; }, // Is it disabled? disabled: function() { return !list; }, // Lock the list in its current state lock: function() { stack = undefined; if ( !memory || memory === true ) { self.disable(); } return this; }, // Is it locked? locked: function() { return !stack; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( stack ) { if ( firing ) { if ( !flags.once ) { stack.push( [ context, args ] ); } } else if ( !( flags.once && memory ) ) { fire( context, args ); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; var // Static reference to slice sliceDeferred = [].slice; jQuery.extend({ Deferred: function( func ) { var doneList = jQuery.Callbacks( "once memory" ), failList = jQuery.Callbacks( "once memory" ), progressList = jQuery.Callbacks( "memory" ), state = "pending", lists = { resolve: doneList, reject: failList, notify: progressList }, promise = { done: doneList.add, fail: failList.add, progress: progressList.add, state: function() { return state; }, // Deprecated isResolved: doneList.fired, isRejected: failList.fired, then: function( doneCallbacks, failCallbacks, progressCallbacks ) { deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); return this; }, always: function() { deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); return this; }, pipe: function( fnDone, fnFail, fnProgress ) { return jQuery.Deferred(function( newDefer ) { jQuery.each( { done: [ fnDone, "resolve" ], fail: [ fnFail, "reject" ], progress: [ fnProgress, "notify" ] }, function( handler, data ) { var fn = data[ 0 ], action = data[ 1 ], returned; if ( jQuery.isFunction( fn ) ) { deferred[ handler ](function() { returned = fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); } else { newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); } }); } else { deferred[ handler ]( newDefer[ action ] ); } }); }).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { if ( obj == null ) { obj = promise; } else { for ( var key in promise ) { obj[ key ] = promise[ key ]; } } return obj; } }, deferred = promise.promise({}), key; for ( key in lists ) { deferred[ key ] = lists[ key ].fire; deferred[ key + "With" ] = lists[ key ].fireWith; } // Handle state deferred.done( function() { state = "resolved"; }, failList.disable, progressList.lock ).fail( function() { state = "rejected"; }, doneList.disable, progressList.lock ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( firstParam ) { var args = sliceDeferred.call( arguments, 0 ), i = 0, length = args.length, pValues = new Array( length ), count = length, pCount = length, deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? firstParam : jQuery.Deferred(), promise = deferred.promise(); function resolveFunc( i ) { return function( value ) { args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; if ( !( --count ) ) { deferred.resolveWith( deferred, args ); } }; } function progressFunc( i ) { return function( value ) { pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; deferred.notifyWith( promise, pValues ); }; } if ( length > 1 ) { for ( ; i < length; i++ ) { if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); } else { --count; } } if ( !count ) { deferred.resolveWith( deferred, args ); } } else if ( deferred !== firstParam ) { deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); } return promise; } }); jQuery.support = (function() { var support, all, a, select, opt, input, fragment, tds, events, eventName, i, isSupported, div = document.createElement( "div" ), documentElement = document.documentElement; // Preliminary tests div.setAttribute("className", "t"); div.innerHTML = "
a"; all = div.getElementsByTagName( "*" ); a = div.getElementsByTagName( "a" )[ 0 ]; // Can't get basic test support if ( !all || !all.length || !a ) { return {}; } // First batch of supports tests select = document.createElement( "select" ); opt = select.appendChild( document.createElement("option") ); input = div.getElementsByTagName( "input" )[ 0 ]; support = { // IE strips leading whitespace when .innerHTML is used leadingWhitespace: ( div.firstChild.nodeType === 3 ), // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables tbody: !div.getElementsByTagName("tbody").length, // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE htmlSerialize: !!div.getElementsByTagName("link").length, // Get the style information from getAttribute // (IE uses .cssText instead) style: /top/.test( a.getAttribute("style") ), // Make sure that URLs aren't manipulated // (IE normalizes it by default) hrefNormalized: ( a.getAttribute("href") === "/a" ), // Make sure that element opacity exists // (IE uses filter instead) // Use a regex to work around a WebKit issue. See #5145 opacity: /^0.55/.test( a.style.opacity ), // Verify style float existence // (IE uses styleFloat instead of cssFloat) cssFloat: !!a.style.cssFloat, // Make sure that if no value is specified for a checkbox // that it defaults to "on". // (WebKit defaults to "" instead) checkOn: ( input.value === "on" ), // Make sure that a selected-by-default option has a working selected property. // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) optSelected: opt.selected, // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) getSetAttribute: div.className !== "t", // Tests for enctype support on a form(#6743) enctype: !!document.createElement("form").enctype, // Makes sure cloning an html5 element does not cause problems // Where outerHTML is undefined, this still works html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", // Will be defined later submitBubbles: true, changeBubbles: true, focusinBubbles: false, deleteExpando: true, noCloneEvent: true, inlineBlockNeedsLayout: false, shrinkWrapBlocks: false, reliableMarginRight: true, pixelMargin: true }; // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat"); // Make sure checked status is properly cloned input.checked = true; support.noCloneChecked = input.cloneNode( true ).checked; // Make sure that the options inside disabled selects aren't marked as disabled // (WebKit marks them as disabled) select.disabled = true; support.optDisabled = !opt.disabled; // Test to see if it's possible to delete an expando from an element // Fails in Internet Explorer try { delete div.test; } catch( e ) { support.deleteExpando = false; } if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { div.attachEvent( "onclick", function() { // Cloning a node shouldn't copy over any // bound event handlers (IE does this) support.noCloneEvent = false; }); div.cloneNode( true ).fireEvent( "onclick" ); } // Check if a radio maintains its value // after being appended to the DOM input = document.createElement("input"); input.value = "t"; input.setAttribute("type", "radio"); support.radioValue = input.value === "t"; input.setAttribute("checked", "checked"); // #11217 - WebKit loses check when the name is after the checked attribute input.setAttribute( "name", "t" ); div.appendChild( input ); fragment = document.createDocumentFragment(); fragment.appendChild( div.lastChild ); // WebKit doesn't clone checked state correctly in fragments support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; // Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) support.appendChecked = input.checked; fragment.removeChild( input ); fragment.appendChild( div ); // Technique from Juriy Zaytsev // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ // We only care about the case where non-standard event systems // are used, namely in IE. Short-circuiting here helps us to // avoid an eval call (in setAttribute) which can cause CSP // to go haywire. See: https://developer.mozilla.org/en/Security/CSP if ( div.attachEvent ) { for ( i in { submit: 1, change: 1, focusin: 1 }) { eventName = "on" + i; isSupported = ( eventName in div ); if ( !isSupported ) { div.setAttribute( eventName, "return;" ); isSupported = ( typeof div[ eventName ] === "function" ); } support[ i + "Bubbles" ] = isSupported; } } fragment.removeChild( div ); // Null elements to avoid leaks in IE fragment = select = opt = div = input = null; // Run tests that need a body at doc ready jQuery(function() { var container, outer, inner, table, td, offsetSupport, marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight, paddingMarginBorderVisibility, paddingMarginBorder, body = document.getElementsByTagName("body")[0]; if ( !body ) { // Return for frameset docs that don't have a body return; } conMarginTop = 1; paddingMarginBorder = "padding:0;margin:0;border:"; positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;"; paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;"; style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;"; html = "
" + "" + "
"; container = document.createElement("div"); container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; body.insertBefore( container, body.firstChild ); // Construct the test element div = document.createElement("div"); container.appendChild( div ); // Check if table cells still have offsetWidth/Height when they are set // to display:none and there are still other visible table cells in a // table row; if so, offsetWidth/Height are not reliable for use when // determining if an element has been hidden directly using // display:none (it is still safe to use offsets if a parent element is // hidden; don safety goggles and see bug #4512 for more information). // (only IE 8 fails this test) div.innerHTML = "
t
"; tds = div.getElementsByTagName( "td" ); isSupported = ( tds[ 0 ].offsetHeight === 0 ); tds[ 0 ].style.display = ""; tds[ 1 ].style.display = "none"; // Check if empty table cells still have offsetWidth/Height // (IE <= 8 fail this test) support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); // Check if div with explicit width and no margin-right incorrectly // gets computed margin-right based on width of container. For more // info see bug #3333 // Fails in WebKit before Feb 2011 nightlies // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right if ( window.getComputedStyle ) { div.innerHTML = ""; marginDiv = document.createElement( "div" ); marginDiv.style.width = "0"; marginDiv.style.marginRight = "0"; div.style.width = "2px"; div.appendChild( marginDiv ); support.reliableMarginRight = ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; } if ( typeof div.style.zoom !== "undefined" ) { // Check if natively block-level elements act like inline-block // elements when setting their display to 'inline' and giving // them layout // (IE < 8 does this) div.innerHTML = ""; div.style.width = div.style.padding = "1px"; div.style.border = 0; div.style.overflow = "hidden"; div.style.display = "inline"; div.style.zoom = 1; support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); // Check if elements with layout shrink-wrap their children // (IE 6 does this) div.style.display = "block"; div.style.overflow = "visible"; div.innerHTML = "
"; support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); } div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility; div.innerHTML = html; outer = div.firstChild; inner = outer.firstChild; td = outer.nextSibling.firstChild.firstChild; offsetSupport = { doesNotAddBorder: ( inner.offsetTop !== 5 ), doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) }; inner.style.position = "fixed"; inner.style.top = "20px"; // safari subtracts parent border width here which is 5px offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); inner.style.position = inner.style.top = ""; outer.style.overflow = "hidden"; outer.style.position = "relative"; offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); if ( window.getComputedStyle ) { div.style.marginTop = "1%"; support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%"; } if ( typeof container.style.zoom !== "undefined" ) { container.style.zoom = 1; } body.removeChild( container ); marginDiv = div = container = null; jQuery.extend( support, offsetSupport ); }); return support; })(); var rbrace = /^(?:\{.*\}|\[.*\])$/, rmultiDash = /([A-Z])/g; jQuery.extend({ cache: {}, // Please use with caution uuid: 0, // Unique for each copy of jQuery on the page // Non-digits removed to match rinlinejQuery expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), // The following elements throw uncatchable exceptions if you // attempt to add expando properties to them. noData: { "embed": true, // Ban all objects except for Flash (which handle expandos) "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", "applet": true }, hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; return !!elem && !isEmptyDataObject( elem ); }, data: function( elem, name, data, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var privateCache, thisCache, ret, internalKey = jQuery.expando, getByName = typeof name === "string", // We have to handle DOM nodes and JS objects differently because IE6-7 // can't GC object references properly across the DOM-JS boundary isNode = elem.nodeType, // Only DOM nodes need the global jQuery cache; JS object data is // attached directly to the object so GC can occur automatically cache = isNode ? jQuery.cache : elem, // Only defining an ID for JS objects if its cache already exists allows // the code to shortcut on the same path as a DOM node with no cache id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, isEvents = name === "events"; // Avoid doing any more work than we need to when trying to get data on an // object that has no data at all if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { return; } if ( !id ) { // Only DOM nodes need a new unique ID for each element since their data // ends up in the global cache if ( isNode ) { elem[ internalKey ] = id = ++jQuery.uuid; } else { id = internalKey; } } if ( !cache[ id ] ) { cache[ id ] = {}; // Avoids exposing jQuery metadata on plain JS objects when the object // is serialized using JSON.stringify if ( !isNode ) { cache[ id ].toJSON = jQuery.noop; } } // An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ] = jQuery.extend( cache[ id ], name ); } else { cache[ id ].data = jQuery.extend( cache[ id ].data, name ); } } privateCache = thisCache = cache[ id ]; // jQuery data() is stored in a separate object inside the object's internal data // cache in order to avoid key collisions between internal data and user-defined // data. if ( !pvt ) { if ( !thisCache.data ) { thisCache.data = {}; } thisCache = thisCache.data; } if ( data !== undefined ) { thisCache[ jQuery.camelCase( name ) ] = data; } // Users should not attempt to inspect the internal events object using jQuery.data, // it is undocumented and subject to change. But does anyone listen? No. if ( isEvents && !thisCache[ name ] ) { return privateCache.events; } // Check for both converted-to-camel and non-converted data property names // If a data property was specified if ( getByName ) { // First Try to find as-is property data ret = thisCache[ name ]; // Test for null|undefined property data if ( ret == null ) { // Try to find the camelCased property ret = thisCache[ jQuery.camelCase( name ) ]; } } else { ret = thisCache; } return ret; }, removeData: function( elem, name, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var thisCache, i, l, // Reference to internal data cache key internalKey = jQuery.expando, isNode = elem.nodeType, // See jQuery.data for more information cache = isNode ? jQuery.cache : elem, // See jQuery.data for more information id = isNode ? elem[ internalKey ] : internalKey; // If there is already no cache entry for this object, there is no // purpose in continuing if ( !cache[ id ] ) { return; } if ( name ) { thisCache = pvt ? cache[ id ] : cache[ id ].data; if ( thisCache ) { // Support array or space separated string names for data keys if ( !jQuery.isArray( name ) ) { // try the string as a key before any manipulation if ( name in thisCache ) { name = [ name ]; } else { // split the camel cased version by spaces unless a key with the spaces exists name = jQuery.camelCase( name ); if ( name in thisCache ) { name = [ name ]; } else { name = name.split( " " ); } } } for ( i = 0, l = name.length; i < l; i++ ) { delete thisCache[ name[i] ]; } // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { return; } } } // See jQuery.data for more information if ( !pvt ) { delete cache[ id ].data; // Don't destroy the parent cache unless the internal data object // had been the only thing left in it if ( !isEmptyDataObject(cache[ id ]) ) { return; } } // Browsers that fail expando deletion also refuse to delete expandos on // the window, but it will allow it on all other JS objects; other browsers // don't care // Ensure that `cache` is not a window object #10080 if ( jQuery.support.deleteExpando || !cache.setInterval ) { delete cache[ id ]; } else { cache[ id ] = null; } // We destroyed the cache and need to eliminate the expando on the node to avoid // false lookups in the cache for entries that no longer exist if ( isNode ) { // IE does not allow us to delete expando properties from nodes, // nor does it have a removeAttribute function on Document nodes; // we must handle all of these cases if ( jQuery.support.deleteExpando ) { delete elem[ internalKey ]; } else if ( elem.removeAttribute ) { elem.removeAttribute( internalKey ); } else { elem[ internalKey ] = null; } } }, // For internal use only. _data: function( elem, name, data ) { return jQuery.data( elem, name, data, true ); }, // A method for determining if a DOM node can handle the data expando acceptData: function( elem ) { if ( elem.nodeName ) { var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; if ( match ) { return !(match === true || elem.getAttribute("classid") !== match); } } return true; } }); jQuery.fn.extend({ data: function( key, value ) { var parts, part, attr, name, l, elem = this[0], i = 0, data = null; // Gets all values if ( key === undefined ) { if ( this.length ) { data = jQuery.data( elem ); if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { attr = elem.attributes; for ( l = attr.length; i < l; i++ ) { name = attr[i].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.substring(5) ); dataAttr( elem, name, data[ name ] ); } } jQuery._data( elem, "parsedAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each(function() { jQuery.data( this, key ); }); } parts = key.split( ".", 2 ); parts[1] = parts[1] ? "." + parts[1] : ""; part = parts[1] + "!"; return jQuery.access( this, function( value ) { if ( value === undefined ) { data = this.triggerHandler( "getData" + part, [ parts[0] ] ); // Try to fetch any internally stored data first if ( data === undefined && elem ) { data = jQuery.data( elem, key ); data = dataAttr( elem, key, data ); } return data === undefined && parts[1] ? this.data( parts[0] ) : data; } parts[1] = value; this.each(function() { var self = jQuery( this ); self.triggerHandler( "setData" + part, parts ); jQuery.data( this, key, value ); self.triggerHandler( "changeData" + part, parts ); }); }, null, value, arguments.length > 1, null, false ); }, removeData: function( key ) { return this.each(function() { jQuery.removeData( this, key ); }); } }); function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : jQuery.isNumeric( data ) ? +data : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch( e ) {} // Make sure we set the data so it isn't changed later jQuery.data( elem, key, data ); } else { data = undefined; } } return data; } // checks a cache object for emptiness function isEmptyDataObject( obj ) { for ( var name in obj ) { // if the public data object is empty, the private is still empty if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { continue; } if ( name !== "toJSON" ) { return false; } } return true; } function handleQueueMarkDefer( elem, type, src ) { var deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", defer = jQuery._data( elem, deferDataKey ); if ( defer && ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { // Give room for hard-coded callbacks to fire first // and eventually mark/queue something else on the element setTimeout( function() { if ( !jQuery._data( elem, queueDataKey ) && !jQuery._data( elem, markDataKey ) ) { jQuery.removeData( elem, deferDataKey, true ); defer.fire(); } }, 0 ); } } jQuery.extend({ _mark: function( elem, type ) { if ( elem ) { type = ( type || "fx" ) + "mark"; jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); } }, _unmark: function( force, elem, type ) { if ( force !== true ) { type = elem; elem = force; force = false; } if ( elem ) { type = type || "fx"; var key = type + "mark", count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); if ( count ) { jQuery._data( elem, key, count ); } else { jQuery.removeData( elem, key, true ); handleQueueMarkDefer( elem, type, "mark" ); } } }, queue: function( elem, type, data ) { var q; if ( elem ) { type = ( type || "fx" ) + "queue"; q = jQuery._data( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !q || jQuery.isArray(data) ) { q = jQuery._data( elem, type, jQuery.makeArray(data) ); } else { q.push( data ); } } return q || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), fn = queue.shift(), hooks = {}; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } jQuery._data( elem, type + ".run", hooks ); fn.call( elem, function() { jQuery.dequeue( elem, type ); }, hooks ); } if ( !queue.length ) { jQuery.removeData( elem, type + "queue " + type + ".run", true ); handleQueueMarkDefer( elem, type, "queue" ); } } }); jQuery.fn.extend({ queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[0], type ); } return data === undefined ? this : this.each(function() { var queue = jQuery.queue( this, type, data ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type ); } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type ); }); }, // Based off of the plugin by Clint Helfers, with permission. // http://blindsignals.com/index.php/2009/07/jquery-delay/ delay: function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = setTimeout( next, time ); hooks.stop = function() { clearTimeout( timeout ); }; }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, object ) { if ( typeof type !== "string" ) { object = type; type = undefined; } type = type || "fx"; var defer = jQuery.Deferred(), elements = this, i = elements.length, count = 1, deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", tmp; function resolve() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } } while( i-- ) { if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { count++; tmp.add( resolve ); } } resolve(); return defer.promise( object ); } }); var rclass = /[\n\t\r]/g, rspace = /\s+/, rreturn = /\r/g, rtype = /^(?:button|input)$/i, rfocusable = /^(?:button|input|object|select|textarea)$/i, rclickable = /^a(?:rea)?$/i, rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, getSetAttribute = jQuery.support.getSetAttribute, nodeHook, boolHook, fixSpecified; jQuery.fn.extend({ attr: function( name, value ) { return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each(function() { jQuery.removeAttr( this, name ); }); }, prop: function( name, value ) { return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { name = jQuery.propFix[ name ] || name; return this.each(function() { // try/catch handles cases where IE balks (such as removing a property on window) try { this[ name ] = undefined; delete this[ name ]; } catch( e ) {} }); }, addClass: function( value ) { var classNames, i, l, elem, setClass, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).addClass( value.call(this, j, this.className) ); }); } if ( value && typeof value === "string" ) { classNames = value.split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 ) { if ( !elem.className && classNames.length === 1 ) { elem.className = value; } else { setClass = " " + elem.className + " "; for ( c = 0, cl = classNames.length; c < cl; c++ ) { if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { setClass += classNames[ c ] + " "; } } elem.className = jQuery.trim( setClass ); } } } } return this; }, removeClass: function( value ) { var classNames, i, l, elem, className, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).removeClass( value.call(this, j, this.className) ); }); } if ( (value && typeof value === "string") || value === undefined ) { classNames = ( value || "" ).split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 && elem.className ) { if ( value ) { className = (" " + elem.className + " ").replace( rclass, " " ); for ( c = 0, cl = classNames.length; c < cl; c++ ) { className = className.replace(" " + classNames[ c ] + " ", " "); } elem.className = jQuery.trim( className ); } else { elem.className = ""; } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isBool = typeof stateVal === "boolean"; if ( jQuery.isFunction( value ) ) { return this.each(function( i ) { jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); }); } return this.each(function() { if ( type === "string" ) { // toggle individual class names var className, i = 0, self = jQuery( this ), state = stateVal, classNames = value.split( rspace ); while ( (className = classNames[ i++ ]) ) { // check each className given, space seperated list state = isBool ? state : !self.hasClass( className ); self[ state ? "addClass" : "removeClass" ]( className ); } } else if ( type === "undefined" || type === "boolean" ) { if ( this.className ) { // store className if set jQuery._data( this, "__className__", this.className ); } // toggle whole className this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; } }); }, hasClass: function( selector ) { var className = " " + selector + " ", i = 0, l = this.length; for ( ; i < l; i++ ) { if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { return true; } } return false; }, val: function( value ) { var hooks, ret, isFunction, elem = this[0]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { return ret; } ret = elem.value; return typeof ret === "string" ? // handle most common string cases ret.replace(rreturn, "") : // handle cases where value is null/undef or number ret == null ? "" : ret; } return; } isFunction = jQuery.isFunction( value ); return this.each(function( i ) { var self = jQuery(this), val; if ( this.nodeType !== 1 ) { return; } if ( isFunction ) { val = value.call( this, i, self.val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( jQuery.isArray( val ) ) { val = jQuery.map(val, function ( value ) { return value == null ? "" : value + ""; }); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } }); } }); jQuery.extend({ valHooks: { option: { get: function( elem ) { // attributes.value is undefined in Blackberry 4.7 but // uses .value. See #6932 var val = elem.attributes.value; return !val || val.specified ? elem.value : elem.text; } }, select: { get: function( elem ) { var value, i, max, option, index = elem.selectedIndex, values = [], options = elem.options, one = elem.type === "select-one"; // Nothing was selected if ( index < 0 ) { return null; } // Loop through all the selected options i = one ? index : 0; max = one ? index + 1 : options.length; for ( ; i < max; i++ ) { option = options[ i ]; // Don't return options that are disabled or in a disabled optgroup if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } // Fixes Bug #2551 -- select.val() broken in IE after form.reset() if ( one && !values.length && options.length ) { return jQuery( options[ index ] ).val(); } return values; }, set: function( elem, value ) { var values = jQuery.makeArray( value ); jQuery(elem).find("option").each(function() { this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; }); if ( !values.length ) { elem.selectedIndex = -1; } return values; } } }, attrFn: { val: true, css: true, html: true, text: true, data: true, width: true, height: true, offset: true }, attr: function( elem, name, value, pass ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set attributes on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } if ( pass && name in jQuery.attrFn ) { return jQuery( elem )[ name ]( value ); } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); // All attributes are lowercase // Grab necessary hook if one is defined if ( notxml ) { name = name.toLowerCase(); hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { elem.setAttribute( name, "" + value ); return value; } } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { ret = elem.getAttribute( name ); // Non-existent attributes return null, we normalize to undefined return ret === null ? undefined : ret; } }, removeAttr: function( elem, value ) { var propName, attrNames, name, l, isBool, i = 0; if ( value && elem.nodeType === 1 ) { attrNames = value.toLowerCase().split( rspace ); l = attrNames.length; for ( ; i < l; i++ ) { name = attrNames[ i ]; if ( name ) { propName = jQuery.propFix[ name ] || name; isBool = rboolean.test( name ); // See #9699 for explanation of this approach (setting first, then removal) // Do not do this for boolean attributes (see #10870) if ( !isBool ) { jQuery.attr( elem, name, "" ); } elem.removeAttribute( getSetAttribute ? name : propName ); // Set corresponding property to false for boolean attributes if ( isBool && propName in elem ) { elem[ propName ] = false; } } } } }, attrHooks: { type: { set: function( elem, value ) { // We can't allow the type property to be changed (since it causes problems in IE) if ( rtype.test( elem.nodeName ) && elem.parentNode ) { jQuery.error( "type property can't be changed" ); } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { // Setting the type on a radio button after the value resets the value in IE6-9 // Reset value to it's default in case type is set after value // This is for element creation var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } }, // Use the value property for back compat // Use the nodeHook for button elements in IE6/7 (#1954) value: { get: function( elem, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.get( elem, name ); } return name in elem ? elem.value : null; }, set: function( elem, value, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.set( elem, value, name ); } // Does not return so that setAttribute is also used elem.value = value; } } }, propFix: { tabindex: "tabIndex", readonly: "readOnly", "for": "htmlFor", "class": "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder", contenteditable: "contentEditable" }, prop: function( elem, name, value ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set properties on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); if ( notxml ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { return ( elem[ name ] = value ); } } else { if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { return elem[ name ]; } } }, propHooks: { tabIndex: { get: function( elem ) { // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ var attributeNode = elem.getAttributeNode("tabindex"); return attributeNode && attributeNode.specified ? parseInt( attributeNode.value, 10 ) : rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 0 : undefined; } } } }); // Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; // Hook for boolean attributes boolHook = { get: function( elem, name ) { // Align boolean attributes with corresponding properties // Fall back to attribute presence where some booleans are not supported var attrNode, property = jQuery.prop( elem, name ); return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? name.toLowerCase() : undefined; }, set: function( elem, value, name ) { var propName; if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { // value is true since we know at this point it's type boolean and not false // Set boolean attributes to the same name and set the DOM property propName = jQuery.propFix[ name ] || name; if ( propName in elem ) { // Only set the IDL specifically if it already exists on the element elem[ propName ] = true; } elem.setAttribute( name, name.toLowerCase() ); } return name; } }; // IE6/7 do not support getting/setting some attributes with get/setAttribute if ( !getSetAttribute ) { fixSpecified = { name: true, id: true, coords: true }; // Use this for any attribute in IE6/7 // This fixes almost every IE6/7 issue nodeHook = jQuery.valHooks.button = { get: function( elem, name ) { var ret; ret = elem.getAttributeNode( name ); return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? ret.nodeValue : undefined; }, set: function( elem, value, name ) { // Set the existing or create a new attribute node var ret = elem.getAttributeNode( name ); if ( !ret ) { ret = document.createAttribute( name ); elem.setAttributeNode( ret ); } return ( ret.nodeValue = value + "" ); } }; // Apply the nodeHook to tabindex jQuery.attrHooks.tabindex.set = nodeHook.set; // Set width and height to auto instead of 0 on empty string( Bug #8150 ) // This is for removals jQuery.each([ "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { set: function( elem, value ) { if ( value === "" ) { elem.setAttribute( name, "auto" ); return value; } } }); }); // Set contenteditable to false on removals(#10429) // Setting to empty string throws an error as an invalid value jQuery.attrHooks.contenteditable = { get: nodeHook.get, set: function( elem, value, name ) { if ( value === "" ) { value = "false"; } nodeHook.set( elem, value, name ); } }; } // Some attributes require a special call on IE if ( !jQuery.support.hrefNormalized ) { jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { get: function( elem ) { var ret = elem.getAttribute( name, 2 ); return ret === null ? undefined : ret; } }); }); } if ( !jQuery.support.style ) { jQuery.attrHooks.style = { get: function( elem ) { // Return undefined in the case of empty string // Normalize to lowercase since IE uppercases css property names return elem.style.cssText.toLowerCase() || undefined; }, set: function( elem, value ) { return ( elem.style.cssText = "" + value ); } }; } // Safari mis-reports the default selected property of an option // Accessing the parent's selectedIndex property fixes it if ( !jQuery.support.optSelected ) { jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { get: function( elem ) { var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; // Make sure that it also works with optgroups, see #5701 if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } return null; } }); } // IE6/7 call enctype encoding if ( !jQuery.support.enctype ) { jQuery.propFix.enctype = "encoding"; } // Radios and checkboxes getter/setter if ( !jQuery.support.checkOn ) { jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { get: function( elem ) { // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified return elem.getAttribute("value") === null ? "on" : elem.value; } }; }); } jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { set: function( elem, value ) { if ( jQuery.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); } } }); }); var rformElems = /^(?:textarea|input|select)$/i, rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, rhoverHack = /(?:^|\s)hover(\.\S+)?\b/, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, quickParse = function( selector ) { var quick = rquickIs.exec( selector ); if ( quick ) { // 0 1 2 3 // [ _, tag, id, class ] quick[1] = ( quick[1] || "" ).toLowerCase(); quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); } return quick; }, quickIs = function( elem, m ) { var attrs = elem.attributes || {}; return ( (!m[1] || elem.nodeName.toLowerCase() === m[1]) && (!m[2] || (attrs.id || {}).value === m[2]) && (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) ); }, hoverHack = function( events ) { return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); }; /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { add: function( elem, types, handler, data, selector ) { var elemData, eventHandle, events, t, tns, type, namespaces, handleObj, handleObjIn, quick, handlers, special; // Don't attach events to noData or text/comment nodes (allow plain objects tho) if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first events = elemData.events; if ( !events ) { elemData.events = events = {}; } eventHandle = elemData.handle; if ( !eventHandle ) { elemData.handle = eventHandle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space // jQuery(...).bind("mouseover mouseout", fn); types = jQuery.trim( hoverHack(types) ).split( " " ); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = tns[1]; namespaces = ( tns[2] || "" ).split( "." ).sort(); // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend({ type: type, origType: tns[1], data: data, handler: handler, guid: handler.guid, selector: selector, quick: selector && quickParse( selector ), namespace: namespaces.join(".") }, handleObjIn ); // Init the event handler queue if we're the first handlers = events[ type ]; if ( !handlers ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, global: {}, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), t, tns, type, origType, namespaces, origCount, j, events, special, handle, eventType, handleObj; if ( !elemData || !(events = elemData.events) ) { return; } // Once for each type.namespace in types; type may be omitted types = jQuery.trim( hoverHack( types || "" ) ).split(" "); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = origType = tns[1]; namespaces = tns[2]; // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector? special.delegateType : special.bindType ) || type; eventType = events[ type ] || []; origCount = eventType.length; namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; // Remove matching events for ( j = 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !namespaces || namespaces.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { eventType.splice( j--, 1 ); if ( handleObj.selector ) { eventType.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( eventType.length === 0 && origCount !== eventType.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { handle = elemData.handle; if ( handle ) { handle.elem = null; } // removeData also checks for emptiness and clears the expando if empty // so use it instead of delete jQuery.removeData( elem, [ "events", "handle" ], true ); } }, // Events that are safe to short-circuit if no handlers are attached. // Native DOM events should not be added, they may have inline handlers. customEvent: { "getData": true, "setData": true, "changeData": true }, trigger: function( event, data, elem, onlyHandlers ) { // Don't do events on text and comment nodes if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { return; } // Event object or event type var type = event.type || event, namespaces = [], cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "!" ) >= 0 ) { // Exclusive events trigger only for the exact event (no namespaces) type = type.slice(0, -1); exclusive = true; } if ( type.indexOf( "." ) >= 0 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split("."); type = namespaces.shift(); namespaces.sort(); } if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { // No jQuery handlers for this event type, and it can't have inline handlers return; } // Caller can pass in an Event, Object, or just an event type string event = typeof event === "object" ? // jQuery.Event object event[ jQuery.expando ] ? event : // Object literal new jQuery.Event( type, event ) : // Just the event type (string) new jQuery.Event( type ); event.type = type; event.isTrigger = true; event.exclusive = exclusive; event.namespace = namespaces.join( "." ); event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; // Handle a global trigger if ( !elem ) { // TODO: Stop taunting the data cache; remove global events and always attach to document cache = jQuery.cache; for ( i in cache ) { if ( cache[ i ].events && cache[ i ].events[ type ] ) { jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); } } return; } // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data != null ? jQuery.makeArray( data ) : []; data.unshift( event ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) eventPath = [[ elem, special.bindType || type ]]; if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; old = null; for ( ; cur; cur = cur.parentNode ) { eventPath.push([ cur, bubbleType ]); old = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( old && old === elem.ownerDocument ) { eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); } } // Fire handlers on the event path for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { cur = eventPath[i][0]; event.type = eventPath[i][1]; handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Note that this is a bare JS function and not a jQuery handler handle = ontype && cur[ ontype ]; if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { event.preventDefault(); } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) // IE<9 dies on focus/blur to hidden element (#1486) if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method old = elem[ ontype ]; if ( old ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; elem[ type ](); jQuery.event.triggered = undefined; if ( old ) { elem[ ontype ] = old; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event || window.event ); var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), delegateCount = handlers.delegateCount, args = [].slice.call( arguments, 0 ), run_all = !event.exclusive && !event.namespace, special = jQuery.event.special[ event.type ] || {}, handlerQueue = [], i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[0] = event; event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers that should run if there are delegated events // Avoid non-left-click bubbling in Firefox (#3861) if ( delegateCount && !(event.button && event.type === "click") ) { // Pregenerate a single jQuery object for reuse with .is() jqcur = jQuery(this); jqcur.context = this.ownerDocument || this; for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { // Don't process events on disabled elements (#6911, #8165) if ( cur.disabled !== true ) { selMatch = {}; matches = []; jqcur[0] = cur; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; sel = handleObj.selector; if ( selMatch[ sel ] === undefined ) { selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) ); } if ( selMatch[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push({ elem: cur, matches: matches }); } } } } // Add the remaining (directly-bound) handlers if ( handlers.length > delegateCount ) { handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); } // Run delegates first; they may want to stop propagation beneath us for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { matched = handlerQueue[ i ]; event.currentTarget = matched.elem; for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { handleObj = matched.matches[ j ]; // Triggered event must either 1) be non-exclusive and have no namespace, or // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { event.data = handleObj.data; event.handleObj = handleObj; ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) .apply( matched.elem, args ); if ( ret !== undefined ) { event.result = ret; if ( ret === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, // Includes some event props shared by KeyEvent and MouseEvent // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function( event, original ) { var eventDoc, doc, body, button = original.button, fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add relatedTarget, if necessary if ( !event.relatedTarget && fromElement ) { event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, originalEvent = event, fixHook = jQuery.event.fixHooks[ event.type ] || {}, copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = jQuery.Event( originalEvent ); for ( i = copy.length; i; ) { prop = copy[ --i ]; event[ prop ] = originalEvent[ prop ]; } // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) if ( !event.target ) { event.target = originalEvent.srcElement || document; } // Target should not be a text node (#504, Safari) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) if ( event.metaKey === undefined ) { event.metaKey = event.ctrlKey; } return fixHook.filter? fixHook.filter( event, originalEvent ) : event; }, special: { ready: { // Make sure the ready event is setup setup: jQuery.bindReady }, load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { delegateType: "focusin" }, blur: { delegateType: "focusout" }, beforeunload: { setup: function( data, namespaces, eventHandle ) { // We only want to do this special case on windows if ( jQuery.isWindow( this ) ) { this.onbeforeunload = eventHandle; } }, teardown: function( namespaces, eventHandle ) { if ( this.onbeforeunload === eventHandle ) { this.onbeforeunload = null; } } } }, simulate: function( type, elem, event, bubble ) { // Piggyback on a donor event to simulate a different one. // Fake originalEvent to avoid donor's stopPropagation, but if the // simulated event prevents default then we do the same on the donor. var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true, originalEvent: {} } ); if ( bubble ) { jQuery.event.trigger( e, null, elem ); } else { jQuery.event.dispatch.call( elem, e ); } if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; // Some plugins are using, but it's undocumented/deprecated and will be removed. // The 1.7 special event interface should provide all the hooks needed now. jQuery.event.handle = jQuery.event.dispatch; jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } } : function( elem, type, handle ) { if ( elem.detachEvent ) { elem.detachEvent( "on" + type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !(this instanceof jQuery.Event) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; function returnFalse() { return false; } function returnTrue() { return true; } // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { preventDefault: function() { this.isDefaultPrevented = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if preventDefault exists run it on the original event if ( e.preventDefault ) { e.preventDefault(); // otherwise set the returnValue property of the original event to false (IE) } else { e.returnValue = false; } }, stopPropagation: function() { this.isPropagationStopped = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if stopPropagation exists run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // otherwise set the cancelBubble property of the original event to true (IE) e.cancelBubble = true; }, stopImmediatePropagation: function() { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation(); }, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse }; // Create mouseenter/leave events using mouseover/out and event-time checks jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var target = this, related = event.relatedTarget, handleObj = event.handleObj, selector = handleObj.selector, ret; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || (related !== target && !jQuery.contains( target, related )) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; }); // IE submit delegation if ( !jQuery.support.submitBubbles ) { jQuery.event.special.submit = { setup: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Lazy-add a submit handler when a descendant form may potentially be submitted jQuery.event.add( this, "click._submit keypress._submit", function( e ) { // Node name check avoids a VML-related crash in IE (#9807) var elem = e.target, form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; if ( form && !form._submit_attached ) { jQuery.event.add( form, "submit._submit", function( event ) { event._submit_bubble = true; }); form._submit_attached = true; } }); // return undefined since we don't need an event listener }, postDispatch: function( event ) { // If form was submitted by the user, bubble the event up the tree if ( event._submit_bubble ) { delete event._submit_bubble; if ( this.parentNode && !event.isTrigger ) { jQuery.event.simulate( "submit", this.parentNode, event, true ); } } }, teardown: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Remove delegated handlers; cleanData eventually reaps submit handlers attached above jQuery.event.remove( this, "._submit" ); } }; } // IE change delegation and checkbox/radio fix if ( !jQuery.support.changeBubbles ) { jQuery.event.special.change = { setup: function() { if ( rformElems.test( this.nodeName ) ) { // IE doesn't fire change on a check/radio until blur; trigger it on click // after a propertychange. Eat the blur-change in special.change.handle. // This still fires onchange a second time for check/radio after blur. if ( this.type === "checkbox" || this.type === "radio" ) { jQuery.event.add( this, "propertychange._change", function( event ) { if ( event.originalEvent.propertyName === "checked" ) { this._just_changed = true; } }); jQuery.event.add( this, "click._change", function( event ) { if ( this._just_changed && !event.isTrigger ) { this._just_changed = false; jQuery.event.simulate( "change", this, event, true ); } }); } return false; } // Delegated event; lazy-add a change handler on descendant inputs jQuery.event.add( this, "beforeactivate._change", function( e ) { var elem = e.target; if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { jQuery.event.add( elem, "change._change", function( event ) { if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { jQuery.event.simulate( "change", this.parentNode, event, true ); } }); elem._change_attached = true; } }); }, handle: function( event ) { var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { return event.handleObj.handler.apply( this, arguments ); } }, teardown: function() { jQuery.event.remove( this, "._change" ); return rformElems.test( this.nodeName ); } }; } // Create "bubbling" focus and blur events if ( !jQuery.support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler while someone wants focusin/focusout var attaches = 0, handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); }; jQuery.event.special[ fix ] = { setup: function() { if ( attaches++ === 0 ) { document.addEventListener( orig, handler, true ); } }, teardown: function() { if ( --attaches === 0 ) { document.removeEventListener( orig, handler, true ); } } }; }); } jQuery.fn.extend({ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // && selector != null // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { this.on( type, selector, data, types[ type ], one ); } return this; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return this; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return this.each( function() { jQuery.event.add( this, types, fn, data, selector ); }); }, one: function( types, selector, data, fn ) { return this.on( types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event var handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( var type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each(function() { jQuery.event.remove( this, types, fn, selector ); }); }, bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }, unbind: function( types, fn ) { return this.off( types, null, fn ); }, live: function( types, data, fn ) { jQuery( this.context ).on( types, this.selector, data, fn ); return this; }, die: function( types, fn ) { jQuery( this.context ).off( types, this.selector || "**", fn ); return this; }, delegate: function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); }, undelegate: function( selector, types, fn ) { // ( namespace ) or ( selector, types [, fn] ) return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); }, trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); }); }, triggerHandler: function( type, data ) { if ( this[0] ) { return jQuery.event.trigger( type, data, this[0], true ); } }, toggle: function( fn ) { // Save reference to arguments for access in closure var args = arguments, guid = fn.guid || jQuery.guid++, i = 0, toggler = function( event ) { // Figure out which function to execute var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); // Make sure that clicks stop event.preventDefault(); // and execute the function return args[ lastToggle ].apply( this, arguments ) || false; }; // link all the functions, so any of them can unbind this click handler toggler.guid = guid; while ( i < args.length ) { args[ i++ ].guid = guid; } return this.click( toggler ); }, hover: function( fnOver, fnOut ) { return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); } }); jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { // Handle event binding jQuery.fn[ name ] = function( data, fn ) { if ( fn == null ) { fn = data; data = null; } return arguments.length > 0 ? this.on( name, null, data, fn ) : this.trigger( name ); }; if ( jQuery.attrFn ) { jQuery.attrFn[ name ] = true; } if ( rkeyEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; } if ( rmouseEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; } }); /*! * Sizzle CSS Selector Engine * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ (function(){ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, expando = "sizcache" + (Math.random() + '').replace('.', ''), done = 0, toString = Object.prototype.toString, hasDuplicate = false, baseHasDuplicate = true, rBackslash = /\\/g, rReturn = /\r\n/g, rNonWord = /\W/; // Here we check if the JavaScript engine is using some sort of // optimization where it does not always call our comparision // function. If that is the case, discard the hasDuplicate value. // Thus far that includes Google Chrome. [0, 0].sort(function() { baseHasDuplicate = false; return 0; }); var Sizzle = function( selector, context, results, seed ) { results = results || []; context = context || document; var origContext = context; if ( context.nodeType !== 1 && context.nodeType !== 9 ) { return []; } if ( !selector || typeof selector !== "string" ) { return results; } var m, set, checkSet, extra, ret, cur, pop, i, prune = true, contextXML = Sizzle.isXML( context ), parts = [], soFar = selector; // Reset the position of the chunker regexp (start from head) do { chunker.exec( "" ); m = chunker.exec( soFar ); if ( m ) { soFar = m[3]; parts.push( m[1] ); if ( m[2] ) { extra = m[3]; break; } } } while ( m ); if ( parts.length > 1 && origPOS.exec( selector ) ) { if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { set = posProcess( parts[0] + parts[1], context, seed ); } else { set = Expr.relative[ parts[0] ] ? [ context ] : Sizzle( parts.shift(), context ); while ( parts.length ) { selector = parts.shift(); if ( Expr.relative[ selector ] ) { selector += parts.shift(); } set = posProcess( selector, set, seed ); } } } else { // Take a shortcut and set the context if the root selector is an ID // (but not if it'll be faster if the inner selector is an ID) if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { ret = Sizzle.find( parts.shift(), context, contextXML ); context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; } if ( context ) { ret = seed ? { expr: parts.pop(), set: makeArray(seed) } : Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; if ( parts.length > 0 ) { checkSet = makeArray( set ); } else { prune = false; } while ( parts.length ) { cur = parts.pop(); pop = cur; if ( !Expr.relative[ cur ] ) { cur = ""; } else { pop = parts.pop(); } if ( pop == null ) { pop = context; } Expr.relative[ cur ]( checkSet, pop, contextXML ); } } else { checkSet = parts = []; } } if ( !checkSet ) { checkSet = set; } if ( !checkSet ) { Sizzle.error( cur || selector ); } if ( toString.call(checkSet) === "[object Array]" ) { if ( !prune ) { results.push.apply( results, checkSet ); } else if ( context && context.nodeType === 1 ) { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { results.push( set[i] ); } } } else { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && checkSet[i].nodeType === 1 ) { results.push( set[i] ); } } } } else { makeArray( checkSet, results ); } if ( extra ) { Sizzle( extra, origContext, results, seed ); Sizzle.uniqueSort( results ); } return results; }; Sizzle.uniqueSort = function( results ) { if ( sortOrder ) { hasDuplicate = baseHasDuplicate; results.sort( sortOrder ); if ( hasDuplicate ) { for ( var i = 1; i < results.length; i++ ) { if ( results[i] === results[ i - 1 ] ) { results.splice( i--, 1 ); } } } } return results; }; Sizzle.matches = function( expr, set ) { return Sizzle( expr, null, null, set ); }; Sizzle.matchesSelector = function( node, expr ) { return Sizzle( expr, null, null, [node] ).length > 0; }; Sizzle.find = function( expr, context, isXML ) { var set, i, len, match, type, left; if ( !expr ) { return []; } for ( i = 0, len = Expr.order.length; i < len; i++ ) { type = Expr.order[i]; if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { left = match[1]; match.splice( 1, 1 ); if ( left.substr( left.length - 1 ) !== "\\" ) { match[1] = (match[1] || "").replace( rBackslash, "" ); set = Expr.find[ type ]( match, context, isXML ); if ( set != null ) { expr = expr.replace( Expr.match[ type ], "" ); break; } } } } if ( !set ) { set = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName( "*" ) : []; } return { set: set, expr: expr }; }; Sizzle.filter = function( expr, set, inplace, not ) { var match, anyFound, type, found, item, filter, left, i, pass, old = expr, result = [], curLoop = set, isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); while ( expr && set.length ) { for ( type in Expr.filter ) { if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { filter = Expr.filter[ type ]; left = match[1]; anyFound = false; match.splice(1,1); if ( left.substr( left.length - 1 ) === "\\" ) { continue; } if ( curLoop === result ) { result = []; } if ( Expr.preFilter[ type ] ) { match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); if ( !match ) { anyFound = found = true; } else if ( match === true ) { continue; } } if ( match ) { for ( i = 0; (item = curLoop[i]) != null; i++ ) { if ( item ) { found = filter( item, match, i, curLoop ); pass = not ^ found; if ( inplace && found != null ) { if ( pass ) { anyFound = true; } else { curLoop[i] = false; } } else if ( pass ) { result.push( item ); anyFound = true; } } } } if ( found !== undefined ) { if ( !inplace ) { curLoop = result; } expr = expr.replace( Expr.match[ type ], "" ); if ( !anyFound ) { return []; } break; } } } // Improper expression if ( expr === old ) { if ( anyFound == null ) { Sizzle.error( expr ); } else { break; } } old = expr; } return curLoop; }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Utility function for retreiving the text value of an array of DOM nodes * @param {Array|Element} elem */ var getText = Sizzle.getText = function( elem ) { var i, node, nodeType = elem.nodeType, ret = ""; if ( nodeType ) { if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent || innerText for elements if ( typeof elem.textContent === 'string' ) { return elem.textContent; } else if ( typeof elem.innerText === 'string' ) { // Replace IE's carriage returns return elem.innerText.replace( rReturn, '' ); } else { // Traverse it's children for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } } else { // If no nodeType, this is expected to be an array for ( i = 0; (node = elem[i]); i++ ) { // Do not traverse comment nodes if ( node.nodeType !== 8 ) { ret += getText( node ); } } } return ret; }; var Expr = Sizzle.selectors = { order: [ "ID", "NAME", "TAG" ], match: { ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ }, leftMatch: {}, attrMap: { "class": "className", "for": "htmlFor" }, attrHandle: { href: function( elem ) { return elem.getAttribute( "href" ); }, type: function( elem ) { return elem.getAttribute( "type" ); } }, relative: { "+": function(checkSet, part){ var isPartStr = typeof part === "string", isTag = isPartStr && !rNonWord.test( part ), isPartStrNotTag = isPartStr && !isTag; if ( isTag ) { part = part.toLowerCase(); } for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { if ( (elem = checkSet[i]) ) { while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? elem || false : elem === part; } } if ( isPartStrNotTag ) { Sizzle.filter( part, checkSet, true ); } }, ">": function( checkSet, part ) { var elem, isPartStr = typeof part === "string", i = 0, l = checkSet.length; if ( isPartStr && !rNonWord.test( part ) ) { part = part.toLowerCase(); for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { var parent = elem.parentNode; checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; } } } else { for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { checkSet[i] = isPartStr ? elem.parentNode : elem.parentNode === part; } } if ( isPartStr ) { Sizzle.filter( part, checkSet, true ); } } }, "": function(checkSet, part, isXML){ var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); }, "~": function( checkSet, part, isXML ) { var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); } }, find: { ID: function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 return m && m.parentNode ? [m] : []; } }, NAME: function( match, context ) { if ( typeof context.getElementsByName !== "undefined" ) { var ret = [], results = context.getElementsByName( match[1] ); for ( var i = 0, l = results.length; i < l; i++ ) { if ( results[i].getAttribute("name") === match[1] ) { ret.push( results[i] ); } } return ret.length === 0 ? null : ret; } }, TAG: function( match, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( match[1] ); } } }, preFilter: { CLASS: function( match, curLoop, inplace, result, not, isXML ) { match = " " + match[1].replace( rBackslash, "" ) + " "; if ( isXML ) { return match; } for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { if ( elem ) { if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { if ( !inplace ) { result.push( elem ); } } else if ( inplace ) { curLoop[i] = false; } } } return false; }, ID: function( match ) { return match[1].replace( rBackslash, "" ); }, TAG: function( match, curLoop ) { return match[1].replace( rBackslash, "" ).toLowerCase(); }, CHILD: function( match ) { if ( match[1] === "nth" ) { if ( !match[2] ) { Sizzle.error( match[0] ); } match[2] = match[2].replace(/^\+|\s*/g, ''); // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); // calculate the numbers (first)n+(last) including if they are negative match[2] = (test[1] + (test[2] || 1)) - 0; match[3] = test[3] - 0; } else if ( match[2] ) { Sizzle.error( match[0] ); } // TODO: Move to normal caching system match[0] = done++; return match; }, ATTR: function( match, curLoop, inplace, result, not, isXML ) { var name = match[1] = match[1].replace( rBackslash, "" ); if ( !isXML && Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; } // Handle if an un-quoted value was used match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); if ( match[2] === "~=" ) { match[4] = " " + match[4] + " "; } return match; }, PSEUDO: function( match, curLoop, inplace, result, not ) { if ( match[1] === "not" ) { // If we're dealing with a complex expression, or a simple one if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { match[3] = Sizzle(match[3], null, null, curLoop); } else { var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); if ( !inplace ) { result.push.apply( result, ret ); } return false; } } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { return true; } return match; }, POS: function( match ) { match.unshift( true ); return match; } }, filters: { enabled: function( elem ) { return elem.disabled === false && elem.type !== "hidden"; }, disabled: function( elem ) { return elem.disabled === true; }, checked: function( elem ) { return elem.checked === true; }, selected: function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, parent: function( elem ) { return !!elem.firstChild; }, empty: function( elem ) { return !elem.firstChild; }, has: function( elem, i, match ) { return !!Sizzle( match[3], elem ).length; }, header: function( elem ) { return (/h\d/i).test( elem.nodeName ); }, text: function( elem ) { var attr = elem.getAttribute( "type" ), type = elem.type; // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) // use getAttribute instead to test this case return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); }, radio: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; }, checkbox: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; }, file: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; }, password: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; }, submit: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "submit" === elem.type; }, image: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; }, reset: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "reset" === elem.type; }, button: function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && "button" === elem.type || name === "button"; }, input: function( elem ) { return (/input|select|textarea|button/i).test( elem.nodeName ); }, focus: function( elem ) { return elem === elem.ownerDocument.activeElement; } }, setFilters: { first: function( elem, i ) { return i === 0; }, last: function( elem, i, match, array ) { return i === array.length - 1; }, even: function( elem, i ) { return i % 2 === 0; }, odd: function( elem, i ) { return i % 2 === 1; }, lt: function( elem, i, match ) { return i < match[3] - 0; }, gt: function( elem, i, match ) { return i > match[3] - 0; }, nth: function( elem, i, match ) { return match[3] - 0 === i; }, eq: function( elem, i, match ) { return match[3] - 0 === i; } }, filter: { PSEUDO: function( elem, match, i, array ) { var name = match[1], filter = Expr.filters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } else if ( name === "contains" ) { return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; } else if ( name === "not" ) { var not = match[3]; for ( var j = 0, l = not.length; j < l; j++ ) { if ( not[j] === elem ) { return false; } } return true; } else { Sizzle.error( name ); } }, CHILD: function( elem, match ) { var first, last, doneName, parent, cache, count, diff, type = match[1], node = elem; switch ( type ) { case "only": case "first": while ( (node = node.previousSibling) ) { if ( node.nodeType === 1 ) { return false; } } if ( type === "first" ) { return true; } node = elem; /* falls through */ case "last": while ( (node = node.nextSibling) ) { if ( node.nodeType === 1 ) { return false; } } return true; case "nth": first = match[2]; last = match[3]; if ( first === 1 && last === 0 ) { return true; } doneName = match[0]; parent = elem.parentNode; if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { count = 0; for ( node = parent.firstChild; node; node = node.nextSibling ) { if ( node.nodeType === 1 ) { node.nodeIndex = ++count; } } parent[ expando ] = doneName; } diff = elem.nodeIndex - last; if ( first === 0 ) { return diff === 0; } else { return ( diff % first === 0 && diff / first >= 0 ); } } }, ID: function( elem, match ) { return elem.nodeType === 1 && elem.getAttribute("id") === match; }, TAG: function( elem, match ) { return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; }, CLASS: function( elem, match ) { return (" " + (elem.className || elem.getAttribute("class")) + " ") .indexOf( match ) > -1; }, ATTR: function( elem, match ) { var name = match[1], result = Sizzle.attr ? Sizzle.attr( elem, name ) : Expr.attrHandle[ name ] ? Expr.attrHandle[ name ]( elem ) : elem[ name ] != null ? elem[ name ] : elem.getAttribute( name ), value = result + "", type = match[2], check = match[4]; return result == null ? type === "!=" : !type && Sizzle.attr ? result != null : type === "=" ? value === check : type === "*=" ? value.indexOf(check) >= 0 : type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : !check ? value && result !== false : type === "!=" ? value !== check : type === "^=" ? value.indexOf(check) === 0 : type === "$=" ? value.substr(value.length - check.length) === check : type === "|=" ? value === check || value.substr(0, check.length + 1) === check + "-" : false; }, POS: function( elem, match, i, array ) { var name = match[2], filter = Expr.setFilters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } } } }; var origPOS = Expr.match.POS, fescape = function(all, num){ return "\\" + (num - 0 + 1); }; for ( var type in Expr.match ) { Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); } // Expose origPOS // "global" as in regardless of relation to brackets/parens Expr.match.globalPOS = origPOS; var makeArray = function( array, results ) { array = Array.prototype.slice.call( array, 0 ); if ( results ) { results.push.apply( results, array ); return results; } return array; }; // Perform a simple check to determine if the browser is capable of // converting a NodeList to an array using builtin methods. // Also verifies that the returned array holds DOM nodes // (which is not the case in the Blackberry browser) try { Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; // Provide a fallback method if it does not work } catch( e ) { makeArray = function( array, results ) { var i = 0, ret = results || []; if ( toString.call(array) === "[object Array]" ) { Array.prototype.push.apply( ret, array ); } else { if ( typeof array.length === "number" ) { for ( var l = array.length; i < l; i++ ) { ret.push( array[i] ); } } else { for ( ; array[i]; i++ ) { ret.push( array[i] ); } } } return ret; }; } var sortOrder, siblingCheck; if ( document.documentElement.compareDocumentPosition ) { sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; return 0; } if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { return a.compareDocumentPosition ? -1 : 1; } return a.compareDocumentPosition(b) & 4 ? -1 : 1; }; } else { sortOrder = function( a, b ) { // The nodes are identical, we can exit early if ( a === b ) { hasDuplicate = true; return 0; // Fallback to using sourceIndex (in IE) if it's available on both nodes } else if ( a.sourceIndex && b.sourceIndex ) { return a.sourceIndex - b.sourceIndex; } var al, bl, ap = [], bp = [], aup = a.parentNode, bup = b.parentNode, cur = aup; // If the nodes are siblings (or identical) we can do a quick check if ( aup === bup ) { return siblingCheck( a, b ); // If no parents were found then the nodes are disconnected } else if ( !aup ) { return -1; } else if ( !bup ) { return 1; } // Otherwise they're somewhere else in the tree so we need // to build up a full list of the parentNodes for comparison while ( cur ) { ap.unshift( cur ); cur = cur.parentNode; } cur = bup; while ( cur ) { bp.unshift( cur ); cur = cur.parentNode; } al = ap.length; bl = bp.length; // Start walking down the tree looking for a discrepancy for ( var i = 0; i < al && i < bl; i++ ) { if ( ap[i] !== bp[i] ) { return siblingCheck( ap[i], bp[i] ); } } // We ended someplace up the tree so do a sibling check return i === al ? siblingCheck( a, bp[i], -1 ) : siblingCheck( ap[i], b, 1 ); }; siblingCheck = function( a, b, ret ) { if ( a === b ) { return ret; } var cur = a.nextSibling; while ( cur ) { if ( cur === b ) { return -1; } cur = cur.nextSibling; } return 1; }; } // Check to see if the browser returns elements by name when // querying by getElementById (and provide a workaround) (function(){ // We're going to inject a fake input element with a specified name var form = document.createElement("div"), id = "script" + (new Date()).getTime(), root = document.documentElement; form.innerHTML = ""; // Inject it into the root element, check its status, and remove it quickly root.insertBefore( form, root.firstChild ); // The workaround has to do additional checks after a getElementById // Which slows things down for other browsers (hence the branching) if ( document.getElementById( id ) ) { Expr.find.ID = function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; } }; Expr.filter.ID = function( elem, match ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return elem.nodeType === 1 && node && node.nodeValue === match; }; } root.removeChild( form ); // release memory in IE root = form = null; })(); (function(){ // Check to see if the browser returns only elements // when doing getElementsByTagName("*") // Create a fake element var div = document.createElement("div"); div.appendChild( document.createComment("") ); // Make sure no comments are found if ( div.getElementsByTagName("*").length > 0 ) { Expr.find.TAG = function( match, context ) { var results = context.getElementsByTagName( match[1] ); // Filter out possible comments if ( match[1] === "*" ) { var tmp = []; for ( var i = 0; results[i]; i++ ) { if ( results[i].nodeType === 1 ) { tmp.push( results[i] ); } } results = tmp; } return results; }; } // Check to see if an attribute returns normalized href attributes div.innerHTML = ""; if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && div.firstChild.getAttribute("href") !== "#" ) { Expr.attrHandle.href = function( elem ) { return elem.getAttribute( "href", 2 ); }; } // release memory in IE div = null; })(); if ( document.querySelectorAll ) { (function(){ var oldSizzle = Sizzle, div = document.createElement("div"), id = "__sizzle__"; div.innerHTML = "

"; // Safari can't handle uppercase or unicode characters when // in quirks mode. if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { return; } Sizzle = function( query, context, extra, seed ) { context = context || document; // Only use querySelectorAll on non-XML documents // (ID selectors don't work in non-HTML documents) if ( !seed && !Sizzle.isXML(context) ) { // See if we find a selector to speed up var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { // Speed-up: Sizzle("TAG") if ( match[1] ) { return makeArray( context.getElementsByTagName( query ), extra ); // Speed-up: Sizzle(".CLASS") } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { return makeArray( context.getElementsByClassName( match[2] ), extra ); } } if ( context.nodeType === 9 ) { // Speed-up: Sizzle("body") // The body element only exists once, optimize finding it if ( query === "body" && context.body ) { return makeArray( [ context.body ], extra ); // Speed-up: Sizzle("#ID") } else if ( match && match[3] ) { var elem = context.getElementById( match[3] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id === match[3] ) { return makeArray( [ elem ], extra ); } } else { return makeArray( [], extra ); } } try { return makeArray( context.querySelectorAll(query), extra ); } catch(qsaError) {} // qSA works strangely on Element-rooted queries // We can work around this by specifying an extra ID on the root // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { var oldContext = context, old = context.getAttribute( "id" ), nid = old || id, hasParent = context.parentNode, relativeHierarchySelector = /^\s*[+~]/.test( query ); if ( !old ) { context.setAttribute( "id", nid ); } else { nid = nid.replace( /'/g, "\\$&" ); } if ( relativeHierarchySelector && hasParent ) { context = context.parentNode; } try { if ( !relativeHierarchySelector || hasParent ) { return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); } } catch(pseudoError) { } finally { if ( !old ) { oldContext.removeAttribute( "id" ); } } } } return oldSizzle(query, context, extra, seed); }; for ( var prop in oldSizzle ) { Sizzle[ prop ] = oldSizzle[ prop ]; } // release memory in IE div = null; })(); } (function(){ var html = document.documentElement, matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; if ( matches ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9 fails this) var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), pseudoWorks = false; try { // This should fail with an exception // Gecko does not error, returns false instead matches.call( document.documentElement, "[test!='']:sizzle" ); } catch( pseudoError ) { pseudoWorks = true; } Sizzle.matchesSelector = function( node, expr ) { // Make sure that attribute selectors are quoted expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); if ( !Sizzle.isXML( node ) ) { try { if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { var ret = matches.call( node, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || !disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9, so check for that node.document && node.document.nodeType !== 11 ) { return ret; } } } catch(e) {} } return Sizzle(expr, null, null, [node]).length > 0; }; } })(); (function(){ var div = document.createElement("div"); div.innerHTML = "
"; // Opera can't find a second classname (in 9.6) // Also, make sure that getElementsByClassName actually exists if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { return; } // Safari caches class attributes, doesn't catch changes (in 3.2) div.lastChild.className = "e"; if ( div.getElementsByClassName("e").length === 1 ) { return; } Expr.order.splice(1, 0, "CLASS"); Expr.find.CLASS = function( match, context, isXML ) { if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { return context.getElementsByClassName(match[1]); } }; // release memory in IE div = null; })(); function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 && !isXML ){ elem[ expando ] = doneName; elem.sizset = i; } if ( elem.nodeName.toLowerCase() === cur ) { match = elem; break; } elem = elem[dir]; } checkSet[i] = match; } } } function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 ) { if ( !isXML ) { elem[ expando ] = doneName; elem.sizset = i; } if ( typeof cur !== "string" ) { if ( elem === cur ) { match = true; break; } } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { match = elem; break; } } elem = elem[dir]; } checkSet[i] = match; } } } if ( document.documentElement.contains ) { Sizzle.contains = function( a, b ) { return a !== b && (a.contains ? a.contains(b) : true); }; } else if ( document.documentElement.compareDocumentPosition ) { Sizzle.contains = function( a, b ) { return !!(a.compareDocumentPosition(b) & 16); }; } else { Sizzle.contains = function() { return false; }; } Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; var posProcess = function( selector, context, seed ) { var match, tmpSet = [], later = "", root = context.nodeType ? [context] : context; // Position selectors must be done after the filter // And so must :not(positional) so we move all PSEUDOs to the end while ( (match = Expr.match.PSEUDO.exec( selector )) ) { later += match[0]; selector = selector.replace( Expr.match.PSEUDO, "" ); } selector = Expr.relative[selector] ? selector + "*" : selector; for ( var i = 0, l = root.length; i < l; i++ ) { Sizzle( selector, root[i], tmpSet, seed ); } return Sizzle.filter( later, tmpSet ); }; // EXPOSE // Override sizzle attribute retrieval Sizzle.attr = jQuery.attr; Sizzle.selectors.attrMap = {}; jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.filters; jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; })(); var runtil = /Until$/, rparentsprev = /^(?:parents|prevUntil|prevAll)/, // Note: This RegExp should be improved, or likely pulled from Sizzle rmultiselector = /,/, isSimple = /^.[^:#\[\.,]*$/, slice = Array.prototype.slice, POS = jQuery.expr.match.globalPOS, // methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend({ find: function( selector ) { var self = this, i, l; if ( typeof selector !== "string" ) { return jQuery( selector ).filter(function() { for ( i = 0, l = self.length; i < l; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } }); } var ret = this.pushStack( "", "find", selector ), length, n, r; for ( i = 0, l = this.length; i < l; i++ ) { length = ret.length; jQuery.find( selector, this[i], ret ); if ( i > 0 ) { // Make sure that the results are unique for ( n = length; n < ret.length; n++ ) { for ( r = 0; r < length; r++ ) { if ( ret[r] === ret[n] ) { ret.splice(n--, 1); break; } } } } } return ret; }, has: function( target ) { var targets = jQuery( target ); return this.filter(function() { for ( var i = 0, l = targets.length; i < l; i++ ) { if ( jQuery.contains( this, targets[i] ) ) { return true; } } }); }, not: function( selector ) { return this.pushStack( winnow(this, selector, false), "not", selector); }, filter: function( selector ) { return this.pushStack( winnow(this, selector, true), "filter", selector ); }, is: function( selector ) { return !!selector && ( typeof selector === "string" ? // If this is a positional selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". POS.test( selector ) ? jQuery( selector, this.context ).index( this[0] ) >= 0 : jQuery.filter( selector, this ).length > 0 : this.filter( selector ).length > 0 ); }, closest: function( selectors, context ) { var ret = [], i, l, cur = this[0]; // Array (deprecated as of jQuery 1.7) if ( jQuery.isArray( selectors ) ) { var level = 1; while ( cur && cur.ownerDocument && cur !== context ) { for ( i = 0; i < selectors.length; i++ ) { if ( jQuery( cur ).is( selectors[ i ] ) ) { ret.push({ selector: selectors[ i ], elem: cur, level: level }); } } cur = cur.parentNode; level++; } return ret; } // String var pos = POS.test( selectors ) || typeof selectors !== "string" ? jQuery( selectors, context || this.context ) : 0; for ( i = 0, l = this.length; i < l; i++ ) { cur = this[i]; while ( cur ) { if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { ret.push( cur ); break; } else { cur = cur.parentNode; if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { break; } } } } ret = ret.length > 1 ? jQuery.unique( ret ) : ret; return this.pushStack( ret, "closest", selectors ); }, // Determine the position of an element within // the matched set of elements index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; } // index in selector if ( typeof elem === "string" ) { return jQuery.inArray( this[0], jQuery( elem ) ); } // Locate the position of the desired element return jQuery.inArray( // If it receives a jQuery object, the first element is used elem.jquery ? elem[0] : elem, this ); }, add: function( selector, context ) { var set = typeof selector === "string" ? jQuery( selector, context ) : jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), all = jQuery.merge( this.get(), set ); return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? all : jQuery.unique( all ) ); }, andSelf: function() { return this.add( this.prevObject ); } }); // A painfully simple check to see if an element is disconnected // from a document (should be improved, where feasible). function isDisconnected( node ) { return !node || !node.parentNode || node.parentNode.nodeType === 11; } jQuery.each({ parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return jQuery.dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return jQuery.dir( elem, "parentNode", until ); }, next: function( elem ) { return jQuery.nth( elem, 2, "nextSibling" ); }, prev: function( elem ) { return jQuery.nth( elem, 2, "previousSibling" ); }, nextAll: function( elem ) { return jQuery.dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return jQuery.dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return jQuery.dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return jQuery.dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return jQuery.sibling( elem.firstChild ); }, contents: function( elem ) { return jQuery.nodeName( elem, "iframe" ) ? elem.contentDocument || elem.contentWindow.document : jQuery.makeArray( elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ); if ( !runtil.test( name ) ) { selector = until; } if ( selector && typeof selector === "string" ) { ret = jQuery.filter( selector, ret ); } ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { ret = ret.reverse(); } return this.pushStack( ret, name, slice.call( arguments ).join(",") ); }; }); jQuery.extend({ filter: function( expr, elems, not ) { if ( not ) { expr = ":not(" + expr + ")"; } return elems.length === 1 ? jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : jQuery.find.matches(expr, elems); }, dir: function( elem, dir, until ) { var matched = [], cur = elem[ dir ]; while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { if ( cur.nodeType === 1 ) { matched.push( cur ); } cur = cur[dir]; } return matched; }, nth: function( cur, result, dir, elem ) { result = result || 1; var num = 0; for ( ; cur; cur = cur[dir] ) { if ( cur.nodeType === 1 && ++num === result ) { break; } } return cur; }, sibling: function( n, elem ) { var r = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { r.push( n ); } } return r; } }); // Implement the identical functionality for filter and not function winnow( elements, qualifier, keep ) { // Can't pass null or undefined to indexOf in Firefox 4 // Set to 0 to skip string check qualifier = qualifier || 0; if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep(elements, function( elem, i ) { var retVal = !!qualifier.call( elem, i, elem ); return retVal === keep; }); } else if ( qualifier.nodeType ) { return jQuery.grep(elements, function( elem, i ) { return ( elem === qualifier ) === keep; }); } else if ( typeof qualifier === "string" ) { var filtered = jQuery.grep(elements, function( elem ) { return elem.nodeType === 1; }); if ( isSimple.test( qualifier ) ) { return jQuery.filter(qualifier, filtered, !keep); } else { qualifier = jQuery.filter( qualifier, filtered ); } } return jQuery.grep(elements, function( elem, i ) { return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; }); } function createSafeFragment( document ) { var list = nodeNames.split( "|" ), safeFrag = document.createDocumentFragment(); if ( safeFrag.createElement ) { while ( list.length ) { safeFrag.createElement( list.pop() ); } } return safeFrag; } var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, rleadingWhitespace = /^\s+/, rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, rtagName = /<([\w:]+)/, rtbody = /]", "i"), // checked="checked" or checked rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, rscriptType = /\/(java|ecma)script/i, rcleanScript = /^\s*", "" ], legend: [ 1, "
", "
" ], thead: [ 1, "", "
" ], tr: [ 2, "", "
" ], td: [ 3, "", "
" ], col: [ 2, "", "
" ], area: [ 1, "", "" ], _default: [ 0, "", "" ] }, safeFragment = createSafeFragment( document ); wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; // IE can't serialize and

Index

./documentation/autopilot-helpers/_build/html/searchindex.js0000644000015600001650000000703712700370701024467 0ustar jenkinsjenkinsSearch.setIndex({envversion:42,terms:{all:[],checkbox:[],text:[],over:[],qquickgridview:[],pull_to_refresh:[],usedeprecatedtoolbar:[],keyboard:[],touch:[],"_custom_proxy_object":[],dbu:[],find:[],paramet:[],is_flick:[],content:1,onli:[],depend:[],manual_refresh_wait:[],till:[],"true":[],except:[],desktop:[],platform:[],swipe_into_view:[],action_objectnam:[],main:[],modul:[],match:[],custom:[],move:[],"return":[],get:[],fals:[],switch_to_tab_by_index:[],mous:[],go_back:[],know:[],switch_to_tab:[],requir:[],change_st:[],elopio:[],name:[],check_autopilot_vers:[],should:[],button:[],popov:[],list:[],refresh:[],item:[],alreadi:[],mode:[],switch_to_next_tab:[],listview:[],toolkitexcept:[],page:[],wait_refresh_complet:[],view:[],get_current_label:[],set:[],optionselector:[],drag_item:[],some:[],direct:[],"_header":[],ubuntuuitoolkitcustomproxyobjectbas:[],second:[],"_common":[],doe:[],qml:[],tabbar:[],arg:[],close:[],todo:[],click:[],append:[],out:[],action_object_nam:[],index:1,deleg:[],ubuntulistview:[],lead:[],emul:[],section:[],introspect:[],label:[],current:[],state:[],version:[],listitem:[],"new":[],myoptionselectordeleg:[],attribut:[],full:[],click_el:[],get_head:[],right:[],usag:[],get_option_count:[],trigger_trailing_act:[],get_selected_section_index:[],reason:[],base:[],manual_refresh_nowait:[],releas:[],path:[],vertic:[],apphead:[],wait_for_anim:[],wait:[],search:[],where:[],click_back_button:[],timer:[],get_pointing_devic:[],instanc:[],get_toolbar:[],dialog:[],action:[],implement:[],swipe_child_into_view:[],first:[],flick:[],rang:[],get_action_selection_popov:[],point:[],ubuntuuitoolkit:[],objectnam:[],number:[],automat:[],down:[],header:[],some_text_her:[],swipe_to_show_more_below:[],"long":[],visibl:[],instal:[],get_selected_text:[],open:[],select:[],compon:[],from:[],"_flickabl":[],area:[],qquickflick:[],support:[],swipe:[],devic:[],"_qquicklistview":[],empti:[],next:[],avail:[],after:[],trigger:[],valu:[],toggle_select:[],click_custom_back_button:[],mean:[],uclistitem:[],toggl:[],textinputcontextmenu:[],"function":[],swipe_to_show_more_abov:[],option:[],actionselectionpopov:[],mainview:[],ubuntulistview11:[],enabl:[],specifi:[],back:[],toolbar:[],trail:[],child:[],open_toolbar:[],textfield:[],"_textfield":[],toolkitemulatorexcept:[],must:[],pull:[],none:[],get_selected_index:[],get_text_input_context_menu:[],keyword:[],"default":[],properti:[],swipe_to_bottom:[],horizont:[],cursor:[],below:[],switch_to_section_by_index:[],can:[],swipe_to_top:[],error:[],otherwis:[],get_keyboard:[],object_nam:[],click_action_button:[],switch_to_previous_tab:[],tap:[],trigger_leading_act:[],helper:[],deprec:[],repres:[],packag:[],kwarg:[],select_opt:[],tab:[],abov:[],need:[],get_number_of_tab:[],work:[],check:[],uncheck:[],wait_funct:[],end:[],divid:[],perform:[],make:[],when:[],write:[],field:[],proxi:[],ensure_vis:[],which:[],pull_to_refresh_en:[],test:[],get_current_tab:[],either:[],enable_select_mod:[],is_empti:[],finish:[],time_out:[],"class":[],previou:[],befor:[],rais:[],consid:[],scrollabl:[],click_button:[],flickabl:[],chang:[],customemulatorbas:[],selector:[],don:[],center:[],textarea:[],classmethod:[],close_toolbar:[],clear:[],qquicklistview:[],request:[],timeout:[],object:[],element:[],exampl:[],thi:[],get_tab:[],left:[],newli:[],validate_dbus_object:[]},objtypes:{},objnames:{},filenames:["ubuntuuitoolkit","index"],titles:["ubuntuuitoolkit Package","Welcome to ubuntu-ui-toolkit-autopilot’s documentation!"],objects:{},titleterms:{welcom:1,ubuntuuitoolkit:0,modul:0,object:0,toolkit:1,custom:0,packag:0,ubuntu:1,autopilot:1,document:1,proxi:0}})./documentation/autopilot-helpers/_build/html/search.html0000644000015600001650000000605012700370701023761 0ustar jenkinsjenkins Search — ubuntu-ui-toolkit-autopilot 15.04 documentation

Search

Please activate JavaScript to enable the search functionality.

From here you can search these documents. Enter your search words into the box below and click "search". Note that the search function will automatically search for all of the words. Pages containing fewer words won't appear in the result list.

./documentation/autopilot-helpers/_build/html/py-modindex.html0000644000015600001650000000563512700370701024761 0ustar jenkinsjenkins Python Module Index — ubuntu-ui-toolkit-autopilot 15.04 documentation

Python Module Index

u
 
u
ubuntuuitoolkit
./documentation/autopilot-helpers/_build/html/objects.inv0000644000015600001650000000213012700370701023770 0ustar jenkinsjenkins# Sphinx inventory version 2 # Project: ubuntu-ui-toolkit-autopilot # Version: 15.04 # The remainder of this file is compressed using zlib. xڽYMs8 Wx{fsni+"a Eh(˱fZ؊ {96N~~ce vY0`_P' UʏO_WH˳/OWM.d"}2f(zfZJxuyyj}iyk`tERCQn^dݯ Xݘ `[Qa1s2 ql-TvOi9!U4DbDDz]ȃ(#wDA/3,q̦LUee,[5P\y{`#;&k"`ɩƯfdDWRhHM֨'ݐ[ _:S\ȾZzRRUAnYlr]3gYu B`*켉5zcuo4h.@X%wo=q968ri<>`✟>y;qF3SYILg4\*lYY gj_ -J+sg2Qa,FAMrm3ppDynF3qLf?+ ZWN2>;)Ds/|W$|7#[| ]v(6_ggpl\b4a l,Og/ڂZX[:]<2?Op./documentation/autopilot-helpers/_build/html/_sources/0000755000015600001650000000000012700370701023447 5ustar jenkinsjenkins./documentation/autopilot-helpers/_build/html/_sources/index.txt0000644000015600001650000000063612700370701025324 0ustar jenkinsjenkins.. ubuntu-ui-toolkit-autopilot documentation master file, created by sphinx-quickstart on Thu Jan 8 12:39:43 2015. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to ubuntu-ui-toolkit-autopilot's documentation! ====================================== Contents: .. toctree:: :maxdepth: 2 ubuntuuitoolkit * :ref:`genindex` ./documentation/autopilot-helpers/_build/html/_sources/ubuntuuitoolkit.txt0000644000015600001650000000031712700370701027477 0ustar jenkinsjenkinsubuntuuitoolkit Package ======================= :mod:`custom proxy object` Module --------------------------------- .. automodule:: ubuntuuitoolkit :members: :undoc-members: :show-inheritance: ./documentation/autopilot-helpers/_build/html/index.html0000644000015600001650000013642712700370701023637 0ustar jenkinsjenkins ubuntu-ui-toolkit-autopilot 15.04 documentation

Welcome to ubuntu-ui-toolkit-autopilot’s documentation!

Contents:

ubuntuuitoolkit Package

custom proxy object Module

Ubuntu UI Toolkit Autopilot tests and helpers.

class ubuntuuitoolkit.AppHeader(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

AppHeader Autopilot custom proxy object.

click_action_button(action_object_name)

Click an action button of the header.

Parameters:object_name – The QML objectName property of the action
Raises ToolkitException:
 If there is no action button with that object name.
click_back_button()
click_custom_back_button()
ensure_visible()
get_selected_section_index()
switch_to_next_tab(instance, *args, **kwargs)

Open the next tab.

Raises ToolkitException:
 If the main view has no tabs.
switch_to_section_by_index(instance, *args, **kwargs)

Select a section in the header divider

Parameters:index – The index of the section to select
Raises ToolkitEmulatorException:
 If the selection index is out of range or useDeprecatedToolbar is set.
switch_to_tab_by_index(instance, *args, **kwargs)

Open a tab. This only supports the new tabs in the header

Parameters:index – The index of the tab to open.
Raises ToolkitException:
 If the tab index is out of range or useDeprecatedToolbar is set.
wait_for_animation()
ubuntuuitoolkit.check_autopilot_version()

Check that the Autopilot installed version matches the one required.

Raises ToolkitException:
 If the installed Autopilot version does’t match the required by the custom proxy objects.
class ubuntuuitoolkit.CheckBox(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

CheckBox Autopilot custom proxy object.

change_state(instance, *args, **kwargs)

Change the state of a CheckBox.

If it is checked, it will be unchecked. If it is unchecked, it will be checked.

Parameters:time_out – number of seconds to wait for the CheckBox state to change. Default is 10.
check(instance, *args, **kwargs)

Check a CheckBox, if its not already checked.

Parameters:timeout – number of seconds to wait for the CheckBox to be checked. Default is 10.
uncheck(instance, *args, **kwargs)

Uncheck a CheckBox, if its not already unchecked.

Parameters:timeout – number of seconds to wait for the CheckBox to be unchecked. Default is 10.
ubuntuuitoolkit.get_keyboard()

Return the keyboard device.

ubuntuuitoolkit.get_pointing_device()

Return the pointing device depending on the platform.

If the platform is Desktop, the pointing device will be a Mouse. If not, the pointing device will be Touch.

class ubuntuuitoolkit.Header(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._header.AppHeader

Autopilot helper for the deprecated Header.

class ubuntuuitoolkit.Dialog(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

Autopilot helper for the Dialog component.

class ubuntuuitoolkit.UCListItem(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

Base class to emulate swipe for leading and trailing actions.

toggle_selected(instance, *args, **kwargs)

Toggles selected state of the ListItem.

trigger_leading_action(instance, *args, **kwargs)

Swipe the item in from left to right to open leading actions and click on the button representing the requested action.

parameters: action_objectName - object name of the action to be
triggered. wait_function - a custom wait function to wait till the action is triggered
trigger_trailing_action(instance, *args, **kwargs)

Swipe the item in from right to left to open trailing actions and click on the button representing the requested action.

parameters: action_objectName - object name of the action to be
triggered. wait_function - a custom wait function to wait till the action is triggered
class ubuntuuitoolkit.MainView(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

MainView Autopilot custom proxy object.

click_action_button(instance, *args, **kwargs)

Click the specified button.

Parameters:action_object_name – the objectName of the action to trigger.
Raises ToolkitException:
 The requested button is not available.
close_toolbar(instance, *args, **kwargs)

Close the toolbar if it is opened.

Raises ToolkitException:
 If the main view has no toolbar.
get_action_selection_popover(object_name)

Return an ActionSelectionPopover custom proxy object.

Parameters:object_name – The QML objectName property of the popover.
get_header()

Return the AppHeader custom proxy object of the MainView.

get_tabs()

Return the Tabs custom proxy object of the MainView.

Raises ToolkitException:
 If the main view has no tabs.
get_text_input_context_menu(object_name)

Return a TextInputContextMenu emulator.

Parameters:object_name – The QML objectName property of the popover.
get_toolbar()

Return the Toolbar custom proxy object of the MainView.

Raises ToolkitException:
 If the main view has no toolbar.
go_back(instance, *args, **kwargs)

Go to the previous page.

open_toolbar(instance, *args, **kwargs)

Open the toolbar if it is not already opened.

Returns:The toolbar.
Raises ToolkitException:
 If the main view has no toolbar.
switch_to_next_tab(instance, *args, **kwargs)

Open the next tab.

Returns:The newly opened tab.
switch_to_previous_tab(instance, *args, **kwargs)

Open the previous tab.

Returns:The newly opened tab.
switch_to_tab(instance, *args, **kwargs)

Open a tab.

Parameters:object_name – The QML objectName property of the tab.
Returns:The newly opened tab.
Raises ToolkitException:
 If there is no tab with that object name.
switch_to_tab_by_index(instance, *args, **kwargs)

Open a tab.

Parameters:index – The index of the tab to open.
Returns:The newly opened tab.
Raises ToolkitException:
 If the tab index is out of range.
classmethod validate_dbus_object(path, state)
class ubuntuuitoolkit.OptionSelector(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

OptionSelector Autopilot custom proxy object

get_current_label()

gets the text of the currently selected item

get_option_count()

Gets the number of items in the option selector

get_selected_index()

Gets the current selected index of the QQuickListView

get_selected_text()

gets the text of the currently selected item

select_option(*args, **kwargs)

Select delegate in option selector

Example usage::
select_option(objectName=”myOptionSelectorDelegate”) select_option(‘Label’, text=”some_text_here”)
Parameters:kwargs – keywords used to find property(s) of delegate in option selector
class ubuntuuitoolkit.QQuickFlickable(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._flickable.Scrollable

margin_to_swipe_from_bottom = 16.0
margin_to_swipe_from_top = 8.0
pull_to_refresh(instance, *args, **kwargs)

Pulls the flickable down and triggers a refresh on it.

Raises ubuntuuitoolkit.ToolkitException:
 If the flickable has no pull to release functionality.
swipe_child_into_view(instance, *args, **kwargs)

Make the child visible.

Currently it works only when the object needs to be swiped vertically. TODO implement horizontal swiping. –elopio - 2014-03-21

swipe_to_bottom(instance, *args, **kwargs)
swipe_to_show_more_above(instance, *args, **kwargs)
swipe_to_show_more_below(instance, *args, **kwargs)
swipe_to_top(instance, *args, **kwargs)
class ubuntuuitoolkit.QQuickGridView(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._flickable.QQuickFlickable

Autopilot helper for the QQuickGridView component.

class ubuntuuitoolkit.QQuickListView(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._flickable.QQuickFlickable

click_element(instance, *args, **kwargs)

Click an element from the list.

It swipes the element into view if it’s center is not visible.

Parameters:
  • objectName – The objectName property of the element to click.
  • direction – The direction where the element is, it can be either ‘above’ or ‘below’. Default value is None, which means we don’t know where the object is and we will need to search the full list.
drag_item(instance, *args, **kwargs)
enable_select_mode(instance, *args, **kwargs)

Default implementation to enable select mode. Performs a long tap over the first list item in the ListView. The delegates must be the new ListItem components.

class ubuntuuitoolkit.TabBar(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

TabBar Autopilot custom proxy object.

switch_to_next_tab(instance, *args, **kwargs)

Open the next tab.

class ubuntuuitoolkit.Tabs(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

Tabs Autopilot custom proxy object.

get_current_tab()

Return the currently selected tab.

get_number_of_tabs()

Return the number of tabs.

class ubuntuuitoolkit.TextArea(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._textfield.TextField

TextArea autopilot emulator.

clear()

Clear the text area.

class ubuntuuitoolkit.TextField(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

TextField Autopilot custom proxy object.

clear(instance, *args, **kwargs)

Clear the text field.

is_empty()

Return True if the text field is empty. False otherwise.

write(instance, *args, **kwargs)

Write into the text field.

Parameters:
  • text – The text to write.
  • clear – If True, the text field will be cleared before writing the text. If False, the text will be appended at the end of the text field. Default is True.
class ubuntuuitoolkit.Toolbar(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

Toolbar Autopilot custom proxy object.

click_back_button(instance, *args, **kwargs)

Click the back button of the toolbar.

click_button(instance, *args, **kwargs)

Click a button of the toolbar.

The toolbar should be opened before clicking the button, or an exception will be raised. If the toolbar is closed for some reason (e.g., timer finishes) after moving the mouse cursor and before clicking the button, it is re-opened automatically by this function.

Parameters:object_name – The QML objectName property of the button.
Raises ToolkitException:
 If there is no button with that object name.
close(instance, *args, **kwargs)

Close the toolbar if it’s opened.

open(instance, *args, **kwargs)

Open the toolbar if it’s not already opened.

Returns:The toolbar.
exception ubuntuuitoolkit.ToolkitException

Bases: exceptions.Exception

Exception raised when there is an error with the custom proxy object.

class ubuntuuitoolkit.UbuntuListView11(*args)

Bases: ubuntuuitoolkit._custom_proxy_objects._qquicklistview.QQuickListView

Autopilot helper for the UbuntuListView 1.1.

manual_refresh_nowait()
manual_refresh_wait()
pull_to_refresh_enabled()
wait_refresh_completed()
class ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase(*args)

Bases: autopilot.introspection.dbus.CustomEmulatorBase

A base class for all the Ubuntu UI Toolkit custom proxy objects.

is_flickable()

Check if the object is flickable.

If the object has a flicking attribute, we consider it as a flickable.

Returns:True if the object is flickable. False otherwise.
swipe_into_view(instance, *args, **kwargs)

Make the object visible.

Currently it works only when the object needs to be swiped vertically. TODO implement horizontal swiping. –elopio - 2014-03-21

./documentation/autopilot-helpers/_build/html/_modules/0000755000015600001650000000000012700370701023434 5ustar jenkinsjenkins./documentation/autopilot-helpers/_build/html/_modules/ubuntuuitoolkit.html0000644000015600001650000002005012700370701027605 0ustar jenkinsjenkins ubuntuuitoolkit — ubuntu-ui-toolkit-autopilot 15.04 documentation

Source code for ubuntuuitoolkit

# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
#
# Copyright (C) 2012, 2013, 2014 Canonical Ltd.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

"""Ubuntu UI Toolkit Autopilot tests and helpers."""


__all__ = [
    'AppHeader',
    'base',
    'check_autopilot_version',
    'CheckBox',
    'environment',
    'fixture_setup',
    'get_keyboard',
    'get_pointing_device',
    'Header',
    'Dialog',
    'listitems',
    'UCListItem',
    'MainView',
    'OptionSelector',
    'pickers',
    'popups',
    'QQuickFlickable',
    'QQuickGridView',
    'QQuickListView',
    'TabBar',
    'Tabs',
    'tests',
    'TextArea',
    'TextField',
    'Toolbar',
    'ToolkitException',
    'ubuntu_scenarios',
    'UbuntuListView11',
    'UbuntuUIToolkitCustomProxyObjectBase',
]


from ubuntuuitoolkit import (
    base,
    environment,
    fixture_setup,
    tests,
    ubuntu_scenarios
)
from ubuntuuitoolkit._custom_proxy_objects import (
    AppHeader,
    check_autopilot_version,
    CheckBox,
    get_keyboard,
    get_pointing_device,
    Header,
    Dialog,
    listitems,
    UCListItem,
    MainView,
    OptionSelector,
    pickers,
    popups,
    QQuickFlickable,
    QQuickGridView,
    QQuickListView,
    TabBar,
    Tabs,
    TextArea,
    TextField,
    Toolbar,
    ToolkitException,
    UbuntuUIToolkitCustomProxyObjectBase,
    UbuntuListView11,
)
./documentation/autopilot-helpers/_build/html/_modules/index.html0000644000015600001650000000473012700370701025435 0ustar jenkinsjenkins Overview: module code — ubuntu-ui-toolkit-autopilot 15.04 documentation

All modules for which code is available

./documentation/autopilot-helpers/_build/json/0000755000015600001650000000000012700370701021632 5ustar jenkinsjenkins./documentation/autopilot-helpers/_build/json/ubuntuuitoolkit.fjson0000644000015600001650000014141012700370701026162 0ustar jenkinsjenkins{"body": "
\n

ubuntuuitoolkit Package\u00b6

\n
\n

custom proxy object Module\u00b6

\n

Ubuntu UI Toolkit Autopilot tests and helpers.

\n
\n
\nclass ubuntuuitoolkit.AppHeader(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

\n

AppHeader Autopilot custom proxy object.

\n
\n
\nclick_action_button(action_object_name)\u00b6
\n

Click an action button of the header.

\n\n\n\n\n\n\n\n\n\n\n
Parameters:object_name – The QML objectName property of the action
Raises ToolkitException:
 If there is no action button with that object\nname.
\n
\n\n
\n
\nclick_back_button()\u00b6
\n
\n\n
\n
\nclick_custom_back_button()\u00b6
\n
\n\n
\n
\nensure_visible()\u00b6
\n
\n\n
\n
\nget_selected_section_index()\u00b6
\n
\n\n
\n
\nswitch_to_next_tab(instance, *args, **kwargs)\u00b6
\n

Open the next tab.

\n\n\n\n\n\n\n\n\n
Raises ToolkitException:
 If the main view has no tabs.
\n
\n\n
\n
\nswitch_to_section_by_index(instance, *args, **kwargs)\u00b6
\n

Select a section in the header divider

\n\n\n\n\n\n\n\n\n\n\n
Parameters:index – The index of the section to select
Raises ToolkitEmulatorException:
 If the selection index is out of\nrange or useDeprecatedToolbar is set.
\n
\n\n
\n
\nswitch_to_tab_by_index(instance, *args, **kwargs)\u00b6
\n

Open a tab. This only supports the new tabs in the header

\n\n\n\n\n\n\n\n\n\n\n
Parameters:index – The index of the tab to open.
Raises ToolkitException:
 If the tab index is out\nof range or useDeprecatedToolbar is set.
\n
\n\n
\n
\nwait_for_animation()\u00b6
\n
\n\n
\n\n
\n
\nubuntuuitoolkit.check_autopilot_version()\u00b6
\n

Check that the Autopilot installed version matches the one required.

\n\n\n\n\n\n\n\n\n
Raises ToolkitException:
 If the installed Autopilot version does’t\nmatch the required by the custom proxy objects.
\n
\n\n
\n
\nclass ubuntuuitoolkit.CheckBox(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

\n

CheckBox Autopilot custom proxy object.

\n
\n
\nchange_state(instance, *args, **kwargs)\u00b6
\n

Change the state of a CheckBox.

\n

If it is checked, it will be unchecked. If it is unchecked, it will be\nchecked.

\n\n\n\n\n\n\n\n
Parameters:time_out – number of seconds to wait for the CheckBox state\nto change. Default is 10.
\n
\n\n
\n
\ncheck(instance, *args, **kwargs)\u00b6
\n

Check a CheckBox, if its not already checked.

\n\n\n\n\n\n\n\n
Parameters:timeout – number of seconds to wait for the CheckBox to be\nchecked. Default is 10.
\n
\n\n
\n
\nuncheck(instance, *args, **kwargs)\u00b6
\n

Uncheck a CheckBox, if its not already unchecked.

\n\n\n\n\n\n\n\n
Parameters:timeout – number of seconds to wait for the CheckBox to be\nunchecked. Default is 10.
\n
\n\n
\n\n
\n
\nubuntuuitoolkit.get_keyboard()\u00b6
\n

Return the keyboard device.

\n
\n\n
\n
\nubuntuuitoolkit.get_pointing_device()\u00b6
\n

Return the pointing device depending on the platform.

\n

If the platform is Desktop, the pointing device will be a Mouse.\nIf not, the pointing device will be Touch.

\n
\n\n
\n
\nclass ubuntuuitoolkit.Header(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._header.AppHeader

\n

Autopilot helper for the deprecated Header.

\n
\n\n
\n
\nclass ubuntuuitoolkit.Dialog(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

\n

Autopilot helper for the Dialog component.

\n
\n\n
\n
\nclass ubuntuuitoolkit.UCListItem(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

\n

Base class to emulate swipe for leading and trailing actions.

\n
\n
\ntoggle_selected(instance, *args, **kwargs)\u00b6
\n

Toggles selected state of the ListItem.

\n
\n\n
\n
\ntrigger_leading_action(instance, *args, **kwargs)\u00b6
\n

Swipe the item in from left to right to open leading actions\nand click on the button representing the requested action.

\n
\n
parameters: action_objectName - object name of the action to be
\n
triggered.\nwait_function - a custom wait function to wait till the\naction is triggered
\n
\n
\n\n
\n
\ntrigger_trailing_action(instance, *args, **kwargs)\u00b6
\n

Swipe the item in from right to left to open trailing actions\nand click on the button representing the requested action.

\n
\n
parameters: action_objectName - object name of the action to be
\n
triggered.\nwait_function - a custom wait function to wait till the\naction is triggered
\n
\n
\n\n
\n\n
\n
\nclass ubuntuuitoolkit.MainView(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

\n

MainView Autopilot custom proxy object.

\n
\n
\nclick_action_button(instance, *args, **kwargs)\u00b6
\n

Click the specified button.

\n\n\n\n\n\n\n\n\n\n\n
Parameters:action_object_name – the objectName of the action to trigger.
Raises ToolkitException:
 The requested button is not available.
\n
\n\n
\n
\nclose_toolbar(instance, *args, **kwargs)\u00b6
\n

Close the toolbar if it is opened.

\n\n\n\n\n\n\n\n\n
Raises ToolkitException:
 If the main view has no toolbar.
\n
\n\n
\n
\nget_action_selection_popover(object_name)\u00b6
\n

Return an ActionSelectionPopover custom proxy object.

\n\n\n\n\n\n\n\n
Parameters:object_name – The QML objectName property of the popover.
\n
\n\n
\n
\nget_header()\u00b6
\n

Return the AppHeader custom proxy object of the MainView.

\n
\n\n
\n
\nget_tabs()\u00b6
\n

Return the Tabs custom proxy object of the MainView.

\n\n\n\n\n\n\n\n\n
Raises ToolkitException:
 If the main view has no tabs.
\n
\n\n
\n
\nget_text_input_context_menu(object_name)\u00b6
\n

Return a TextInputContextMenu emulator.

\n\n\n\n\n\n\n\n
Parameters:object_name – The QML objectName property of the popover.
\n
\n\n
\n
\nget_toolbar()\u00b6
\n

Return the Toolbar custom proxy object of the MainView.

\n\n\n\n\n\n\n\n\n
Raises ToolkitException:
 If the main view has no toolbar.
\n
\n\n
\n
\ngo_back(instance, *args, **kwargs)\u00b6
\n

Go to the previous page.

\n
\n\n
\n
\nopen_toolbar(instance, *args, **kwargs)\u00b6
\n

Open the toolbar if it is not already opened.

\n\n\n\n\n\n\n\n\n\n\n
Returns:The toolbar.
Raises ToolkitException:
 If the main view has no toolbar.
\n
\n\n
\n
\nswitch_to_next_tab(instance, *args, **kwargs)\u00b6
\n

Open the next tab.

\n\n\n\n\n\n\n\n
Returns:The newly opened tab.
\n
\n\n
\n
\nswitch_to_previous_tab(instance, *args, **kwargs)\u00b6
\n

Open the previous tab.

\n\n\n\n\n\n\n\n
Returns:The newly opened tab.
\n
\n\n
\n
\nswitch_to_tab(instance, *args, **kwargs)\u00b6
\n

Open a tab.

\n\n\n\n\n\n\n\n\n\n\n\n\n
Parameters:object_name – The QML objectName property of the tab.
Returns:The newly opened tab.
Raises ToolkitException:
 If there is no tab with that object\nname.
\n
\n\n
\n
\nswitch_to_tab_by_index(instance, *args, **kwargs)\u00b6
\n

Open a tab.

\n\n\n\n\n\n\n\n\n\n\n\n\n
Parameters:index – The index of the tab to open.
Returns:The newly opened tab.
Raises ToolkitException:
 If the tab index\nis out of range.
\n
\n\n
\n
\nclassmethod validate_dbus_object(path, state)\u00b6
\n
\n\n
\n\n
\n
\nclass ubuntuuitoolkit.OptionSelector(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

\n

OptionSelector Autopilot custom proxy object

\n
\n
\nget_current_label()\u00b6
\n

gets the text of the currently selected item

\n
\n\n
\n
\nget_option_count()\u00b6
\n

Gets the number of items in the option selector

\n
\n\n
\n
\nget_selected_index()\u00b6
\n

Gets the current selected index of the QQuickListView

\n
\n\n
\n
\nget_selected_text()\u00b6
\n

gets the text of the currently selected item

\n
\n\n
\n
\nselect_option(*args, **kwargs)\u00b6
\n

Select delegate in option selector

\n
\n
Example usage::
\n
select_option(objectName=”myOptionSelectorDelegate”)\nselect_option(‘Label’, text=”some_text_here”)
\n
\n\n\n\n\n\n\n\n
Parameters:kwargs – keywords used to find property(s) of delegate in\noption selector
\n
\n\n
\n\n
\n
\nclass ubuntuuitoolkit.QQuickFlickable(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._flickable.Scrollable

\n
\n
\nmargin_to_swipe_from_bottom = 16.0\u00b6
\n
\n\n
\n
\nmargin_to_swipe_from_top = 8.0\u00b6
\n
\n\n
\n
\npull_to_refresh(instance, *args, **kwargs)\u00b6
\n

Pulls the flickable down and triggers a refresh on it.

\n\n\n\n\n\n\n\n\n
Raises ubuntuuitoolkit.ToolkitException:
 If the flickable has no pull\nto release functionality.
\n
\n\n
\n
\nswipe_child_into_view(instance, *args, **kwargs)\u00b6
\n

Make the child visible.

\n

Currently it works only when the object needs to be swiped vertically.\nTODO implement horizontal swiping. –elopio - 2014-03-21

\n
\n\n
\n
\nswipe_to_bottom(instance, *args, **kwargs)\u00b6
\n
\n\n
\n
\nswipe_to_show_more_above(instance, *args, **kwargs)\u00b6
\n
\n\n
\n
\nswipe_to_show_more_below(instance, *args, **kwargs)\u00b6
\n
\n\n
\n
\nswipe_to_top(instance, *args, **kwargs)\u00b6
\n
\n\n
\n\n
\n
\nclass ubuntuuitoolkit.QQuickGridView(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._flickable.QQuickFlickable

\n

Autopilot helper for the QQuickGridView component.

\n
\n\n
\n
\nclass ubuntuuitoolkit.QQuickListView(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._flickable.QQuickFlickable

\n
\n
\nclick_element(instance, *args, **kwargs)\u00b6
\n

Click an element from the list.

\n

It swipes the element into view if it’s center is not visible.

\n\n\n\n\n\n\n\n
Parameters:
    \n
  • objectName – The objectName property of the element to click.
  • \n
  • direction – The direction where the element is, it can be\neither ‘above’ or ‘below’. Default value is None, which means we\ndon’t know where the object is and we will need to search the full\nlist.
  • \n
\n
\n
\n\n
\n
\ndrag_item(instance, *args, **kwargs)\u00b6
\n
\n\n
\n
\nenable_select_mode(instance, *args, **kwargs)\u00b6
\n

Default implementation to enable select mode. Performs a long tap\nover the first list item in the ListView. The delegates must be\nthe new ListItem components.

\n
\n\n
\n\n
\n
\nclass ubuntuuitoolkit.TabBar(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

\n

TabBar Autopilot custom proxy object.

\n
\n
\nswitch_to_next_tab(instance, *args, **kwargs)\u00b6
\n

Open the next tab.

\n
\n\n
\n\n
\n
\nclass ubuntuuitoolkit.Tabs(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

\n

Tabs Autopilot custom proxy object.

\n
\n
\nget_current_tab()\u00b6
\n

Return the currently selected tab.

\n
\n\n
\n
\nget_number_of_tabs()\u00b6
\n

Return the number of tabs.

\n
\n\n
\n\n
\n
\nclass ubuntuuitoolkit.TextArea(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._textfield.TextField

\n

TextArea autopilot emulator.

\n
\n
\nclear()\u00b6
\n

Clear the text area.

\n
\n\n
\n\n
\n
\nclass ubuntuuitoolkit.TextField(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

\n

TextField Autopilot custom proxy object.

\n
\n
\nclear(instance, *args, **kwargs)\u00b6
\n

Clear the text field.

\n
\n\n
\n
\nis_empty()\u00b6
\n

Return True if the text field is empty. False otherwise.

\n
\n\n
\n
\nwrite(instance, *args, **kwargs)\u00b6
\n

Write into the text field.

\n\n\n\n\n\n\n\n
Parameters:
    \n
  • text – The text to write.
  • \n
  • clear – If True, the text field will be cleared before\nwriting the text. If False, the text will be appended at the end\nof the text field. Default is True.
  • \n
\n
\n
\n\n
\n\n
\n
\nclass ubuntuuitoolkit.Toolbar(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._common.UbuntuUIToolkitCustomProxyObjectBase

\n

Toolbar Autopilot custom proxy object.

\n
\n
\nclick_back_button(instance, *args, **kwargs)\u00b6
\n

Click the back button of the toolbar.

\n
\n\n
\n
\nclick_button(instance, *args, **kwargs)\u00b6
\n

Click a button of the toolbar.

\n

The toolbar should be opened before clicking the button, or an\nexception will be raised. If the toolbar is closed for some reason\n(e.g., timer finishes) after moving the mouse cursor and before\nclicking the button, it is re-opened automatically by this function.

\n\n\n\n\n\n\n\n\n\n\n
Parameters:object_name – The QML objectName property of the button.
Raises ToolkitException:
 If there is no button with that object\nname.
\n
\n\n
\n
\nclose(instance, *args, **kwargs)\u00b6
\n

Close the toolbar if it’s opened.

\n
\n\n
\n
\nopen(instance, *args, **kwargs)\u00b6
\n

Open the toolbar if it’s not already opened.

\n\n\n\n\n\n\n\n
Returns:The toolbar.
\n
\n\n
\n\n
\n
\nexception ubuntuuitoolkit.ToolkitException\u00b6
\n

Bases: exceptions.Exception

\n

Exception raised when there is an error with the custom proxy object.

\n
\n\n
\n
\nclass ubuntuuitoolkit.UbuntuListView11(*args)\u00b6
\n

Bases: ubuntuuitoolkit._custom_proxy_objects._qquicklistview.QQuickListView

\n

Autopilot helper for the UbuntuListView 1.1.

\n
\n
\nmanual_refresh_nowait()\u00b6
\n
\n\n
\n
\nmanual_refresh_wait()\u00b6
\n
\n\n
\n
\npull_to_refresh_enabled()\u00b6
\n
\n\n
\n
\nwait_refresh_completed()\u00b6
\n
\n\n
\n\n
\n
\nclass ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase(*args)\u00b6
\n

Bases: autopilot.introspection.dbus.CustomEmulatorBase

\n

A base class for all the Ubuntu UI Toolkit custom proxy objects.

\n
\n
\nis_flickable()\u00b6
\n

Check if the object is flickable.

\n

If the object has a flicking attribute, we consider it as a flickable.

\n\n\n\n\n\n\n\n
Returns:True if the object is flickable. False otherwise.
\n
\n\n
\n
\nswipe_into_view(instance, *args, **kwargs)\u00b6
\n

Make the object visible.

\n

Currently it works only when the object needs to be swiped vertically.\nTODO implement horizontal swiping. –elopio - 2014-03-21

\n
\n\n
\n\n
\n
\n", "display_toc": true, "title": "ubuntuuitoolkit Package", "sourcename": "ubuntuuitoolkit.txt", "customsidebar": null, "current_page_name": "ubuntuuitoolkit", "next": null, "rellinks": [["genindex", "General Index", "I", "index"], ["py-modindex", "Python Module Index", "", "modules"], ["index", "Welcome to ubuntu-ui-toolkit-autopilot’s documentation!", "P", "previous"]], "meta": {}, "parents": [], "sidebars": null, "toc": "\n", "prev": {"link": "../", "title": "Welcome to ubuntu-ui-toolkit-autopilot’s documentation!"}, "metatags": ""}./documentation/autopilot-helpers/_build/json/_static/0000755000015600001650000000000012700370701023260 5ustar jenkinsjenkins./documentation/autopilot-helpers/_build/json/_static/favicon.ico0000644000015600001650000000257612700370701025413 0ustar jenkinsjenkinsh( :w{?}A~@AEFGHFLEIFOPTX[\Z[]`^ddfifkmgklkpnrqx{w{UUUUU6%%6UUUUUUUU:  :UUUUU' 9"'UUU:!<@)TC:UU -(TT80 U6LQ$ASM 6%TH BT.%R>G31O5K6; % TNET,%6FP/2JRI6U #.TT=+ UU:47&TD:UUU'?*'UUUUU:  :UUUUUUUU6%%6UUUUU./documentation/autopilot-helpers/_build/json/_static/nature.css0000644000015600001650000000670112700370701025274 0ustar jenkinsjenkins/* Copyright 2015 Canonical Ltd. */ @import url(basic.css); body { font-family:Ubuntu, "DejaVu Sans", "Trebuchet MS", sans-serif; font-size:100%; background-color:#2C001E; margin:0; padding:0; } div.documentwrapper { float:left; width:100%; } div.bodywrapper { margin:0 0 0 0; } hr { border:1px solid #B1B4B6; } div.body { background-color:#FFF; color:#3E4349; font-size:.9em; padding:0 30px 30px; } div.footer { color:#CCC; width:100%; text-align:center; font-size:75%; padding:13px 0; } div.footer a { color:#444; text-decoration:underline; } div.related { background-color:#DD4814; line-height:32px; color:#fff; font-size:.9em; } div.related a { color:#EEE; } div.sphinxsidebar { font-size:.75em; line-height:1.5em; } div.sphinxsidebarwrapper { padding:20px 0; } div.sphinxsidebar h3, div.sphinxsidebar h4 { font-family:Ubuntu, "DejaVu Sans", "Trebuchet MS", sans-serif; color:#222; font-size:1.2em; font-weight:400; background-color:#ddd; margin:0; padding:5px 10px; } div.sphinxsidebar p { color:#444; padding:2px 10px; } div.sphinxsidebar ul { color:#000; margin:10px 5px; padding:0; } div.sphinxsidebar input { border:1px solid #ccc; font-family:Ubuntu, "DejaVu Sans", "Trebuchet MS", sans-serif; font-size:1em; } div.sphinxsidebar input[type=text] { margin-left:5px; } a { color:#5E2750; text-decoration:none; } a:hover { color:#DD4814; text-decoration:underline; } div.body h1 { font-family:Ubuntu, "DejaVu Sans", "Trebuchet MS", sans-serif; font-weight:bold; font-size:200%; color:#444; margin:20px 0 10px; padding:5px 0 5px 10px; } div.body h2 { font-family:Ubuntu, "DejaVu Sans", "Trebuchet MS", sans-serif; font-size:130%; background-color:#CCC; margin:20px 0 10px; padding:5px 0 5px 10px; } div.body h6 { font-family:Ubuntu, "DejaVu Sans", "Trebuchet MS", sans-serif; background-color:#BED4EB; font-weight:400; color:#333; margin:30px 0 10px; padding:5px 0 5px 10px; } a.headerlink { text-decoration:none; padding:0 4px; } a.headerlink:hover { background-color:#AEA79F; color:#FFF; } div.body p,div.body dd,div.body li { line-height:1.5em; } div.highlight { background-color:#FFF; } div.note { background-color:#eee; border:1px solid #ccc; } div.seealso { background-color:#ffc; border:1px solid #ff6; } div.warning { background-color:#ffe4e4; border:1px solid #f66; } p.admonition-title:after { content:":"; } pre { background-color:#EFEFEF; color:#000; line-height:1.1em; border:1px solid #C6C9CB; font-size:1.2em; font-family:"Ubuntu Mono", Monaco, Consolas, "DejaVu Sans Mono", "Lucida Console", monospace; margin:1.5em 0; padding:6px; } tt { background-color:#EFEFEF; color:#222; font-size:1.1em; font-family:"Ubuntu Mono", Monaco, Consolas, "DejaVu Sans Mono", "Lucida Console", monospace; } .viewcode-back { font-family:Ubuntu, "DejaVu Sans", "Trebuchet MS", sans-serif; } div.viewcode-block:target { background-color:#f4debf; border-top:1px solid #ac9; border-bottom:1px solid #ac9; } div.document,div.topic { background-color:#eee; } div.sphinxsidebar h3 a,div.sphinxsidebar a { color:#444; } div.admonition p.admonition-title + p,p.admonition-title { display:inline; } ./documentation/autopilot-helpers/_build/json/_static/pygments.css0000644000015600001650000000762712700370701025654 0ustar jenkinsjenkins.highlight .hll { background-color: #ffffcc } .highlight { background: #eeffcc; } .highlight .c { color: #408090; font-style: italic } /* Comment */ .highlight .err { border: 1px solid #FF0000 } /* Error */ .highlight .k { color: #007020; font-weight: bold } /* Keyword */ .highlight .o { color: #666666 } /* Operator */ .highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ .highlight .cp { color: #007020 } /* Comment.Preproc */ .highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ .highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #FF0000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #00A000 } /* Generic.Inserted */ .highlight .go { color: #333333 } /* Generic.Output */ .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ .highlight .gt { color: #0044DD } /* Generic.Traceback */ .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #007020 } /* Keyword.Pseudo */ .highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #902000 } /* Keyword.Type */ .highlight .m { color: #208050 } /* Literal.Number */ .highlight .s { color: #4070a0 } /* Literal.String */ .highlight .na { color: #4070a0 } /* Name.Attribute */ .highlight .nb { color: #007020 } /* Name.Builtin */ .highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ .highlight .no { color: #60add5 } /* Name.Constant */ .highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ .highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ .highlight .ne { color: #007020 } /* Name.Exception */ .highlight .nf { color: #06287e } /* Name.Function */ .highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ .highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ .highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #bb60d5 } /* Name.Variable */ .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #208050 } /* Literal.Number.Bin */ .highlight .mf { color: #208050 } /* Literal.Number.Float */ .highlight .mh { color: #208050 } /* Literal.Number.Hex */ .highlight .mi { color: #208050 } /* Literal.Number.Integer */ .highlight .mo { color: #208050 } /* Literal.Number.Oct */ .highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ .highlight .sc { color: #4070a0 } /* Literal.String.Char */ .highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ .highlight .s2 { color: #4070a0 } /* Literal.String.Double */ .highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ .highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ .highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ .highlight .sx { color: #c65d09 } /* Literal.String.Other */ .highlight .sr { color: #235388 } /* Literal.String.Regex */ .highlight .s1 { color: #4070a0 } /* Literal.String.Single */ .highlight .ss { color: #517918 } /* Literal.String.Symbol */ .highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ .highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ .highlight .il { color: #208050 } /* Literal.Number.Integer.Long */./documentation/autopilot-helpers/_build/json/globalcontext.json0000644000015600001650000000141712700370701025375 0ustar jenkinsjenkins{"file_suffix": ".fjson", "has_source": true, "show_sphinx": false, "last_updated": null, "shorttitle": "ubuntu-ui-toolkit-autopilot 15.04 documentation", "rellinks": [["genindex", "General Index", "I", "index"], ["py-modindex", "Python Module Index", "", "modules"]], "docstitle": "ubuntu-ui-toolkit-autopilot 15.04 documentation", "favicon": "favicon.ico", "css_files": [], "logo": "", "script_files": ["_static/jquery.js", "_static/underscore.js", "_static/doctools.js"], "master_doc": "index", "style": "default.css", "embedded": false, "copyright": "2015, Canonical", "show_copyright": true, "builder": "json", "project": "ubuntu-ui-toolkit-autopilot", "use_opensearch": "", "version": "15.04", "parents": [], "release": "15.04", "sphinx_version": "1.2.3", "show_source": false}./documentation/autopilot-helpers/_build/json/last_build0000644000015600001650000000000012700370701023665 0ustar jenkinsjenkins./documentation/autopilot-helpers/_build/json/searchindex.json0000644000015600001650000002017312700370701025025 0ustar jenkinsjenkins{"envversion": 42, "terms": {"all": 0, "checkbox": 0, "text": 0, "over": 0, "qquickgridview": 0, "pull_to_refresh": 0, "usedeprecatedtoolbar": 0, "keyboard": 0, "touch": 0, "_custom_proxy_object": 0, "dbu": 0, "find": 0, "paramet": 0, "is_flick": 0, "content": 1, "onli": 0, "depend": 0, "manual_refresh_wait": 0, "till": 0, "true": 0, "except": 0, "desktop": 0, "platform": 0, "swipe_into_view": 0, "action_objectnam": 0, "main": 0, "modul": [], "match": 0, "custom": [], "move": 0, "return": 0, "get": 0, "fals": 0, "switch_to_tab_by_index": 0, "mous": 0, "go_back": 0, "know": 0, "switch_to_tab": 0, "requir": 0, "change_st": 0, "elopio": 0, "name": 0, "check_autopilot_vers": 0, "should": 0, "button": 0, "popov": 0, "list": 0, "refresh": 0, "item": 0, "alreadi": 0, "mode": 0, "switch_to_next_tab": 0, "listview": 0, "toolkitexcept": 0, "page": 0, "wait_refresh_complet": 0, "view": 0, "get_current_label": 0, "set": 0, "optionselector": 0, "drag_item": 0, "some": 0, "direct": 0, "_header": 0, "ubuntuuitoolkitcustomproxyobjectbas": 0, "second": 0, "_common": 0, "doe": 0, "qml": 0, "tabbar": 0, "arg": 0, "close": 0, "todo": 0, "click": 0, "append": 0, "out": 0, "action_object_nam": 0, "index": [0, 1], "deleg": 0, "ubuntulistview": 0, "lead": 0, "emul": 0, "section": 0, "introspect": 0, "label": 0, "current": 0, "state": 0, "version": 0, "listitem": 0, "new": 0, "myoptionselectordeleg": 0, "either": 0, "full": 0, "click_el": 0, "get_head": 0, "right": 0, "usag": 0, "get_option_count": 0, "trigger_trailing_act": 0, "get_selected_section_index": 0, "reason": 0, "base": 0, "manual_refresh_nowait": 0, "releas": 0, "path": 0, "vertic": 0, "apphead": 0, "wait_for_anim": 0, "wait": 0, "search": 0, "where": 0, "click_back_button": 0, "timer": 0, "get_pointing_devic": 0, "instanc": 0, "get_toolbar": 0, "dialog": 0, "action": 0, "implement": 0, "swipe_child_into_view": 0, "first": 0, "flick": 0, "rang": 0, "get_action_selection_popov": 0, "point": 0, "ubuntuuitoolkit": [], "objectnam": 0, "number": 0, "automat": 0, "down": 0, "header": 0, "some_text_her": 0, "swipe_to_show_more_below": 0, "long": 0, "visibl": 0, "instal": 0, "get_selected_text": 0, "open": 0, "select": 0, "compon": 0, "from": 0, "_flickabl": 0, "area": 0, "qquickflick": 0, "support": 0, "swipe": 0, "devic": 0, "_qquicklistview": 0, "empti": 0, "next": 0, "avail": 0, "after": 0, "trigger": 0, "valu": 0, "toggle_select": 0, "click_custom_back_button": 0, "mean": 0, "uclistitem": 0, "toggl": 0, "textinputcontextmenu": 0, "function": 0, "swipe_to_show_more_abov": 0, "option": 0, "actionselectionpopov": 0, "mainview": 0, "ubuntulistview11": 0, "specifi": 0, "back": 0, "toolbar": 0, "trail": 0, "margin_to_swipe_from_top": 0, "child": 0, "open_toolbar": 0, "textfield": 0, "_textfield": 0, "toolkitemulatorexcept": 0, "must": 0, "pull": 0, "none": 0, "get_selected_index": 0, "get_text_input_context_menu": 0, "keyword": 0, "default": 0, "properti": 0, "kwarg": 0, "swipe_to_bottom": 0, "horizont": 0, "cursor": 0, "below": 0, "switch_to_section_by_index": 0, "can": 0, "swipe_to_top": 0, "error": 0, "otherwis": 0, "get_keyboard": 0, "object_nam": 0, "click_action_button": 0, "margin_to_swipe_from_bottom": 0, "switch_to_previous_tab": 0, "tap": 0, "trigger_leading_act": 0, "helper": 0, "deprec": 0, "repres": 0, "packag": [], "attribut": 0, "select_opt": 0, "tab": 0, "abov": 0, "need": 0, "get_number_of_tab": 0, "work": 0, "check": 0, "uncheck": 0, "wait_funct": 0, "end": 0, "divid": 0, "perform": 0, "make": 0, "when": 0, "write": 0, "field": 0, "proxi": [], "ensure_vis": 0, "which": 0, "pull_to_refresh_en": 0, "test": 0, "get_current_tab": 0, "enabl": 0, "enable_select_mod": 0, "is_empti": 0, "finish": 0, "thi": 0, "time_out": 0, "class": 0, "previou": 0, "befor": 0, "rais": 0, "consid": 0, "click_button": 0, "flickabl": 0, "chang": 0, "customemulatorbas": 0, "selector": 0, "don": 0, "center": 0, "textarea": 0, "classmethod": 0, "close_toolbar": 0, "clear": 0, "qquicklistview": 0, "request": 0, "timeout": 0, "object": [], "element": 0, "exampl": 0, "scrollabl": 0, "get_tab": 0, "left": 0, "newli": 0, "validate_dbus_object": 0}, "objtypes": {"0": "py:module", "1": "py:method", "2": "py:class", "3": "py:exception", "4": "py:classmethod", "5": "py:attribute", "6": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "method", "Python method"], "2": ["py", "class", "Python class"], "3": ["py", "exception", "Python exception"], "4": ["py", "classmethod", "Python class method"], "5": ["py", "attribute", "Python attribute"], "6": ["py", "function", "Python function"]}, "filenames": ["ubuntuuitoolkit", "index"], "titles": ["ubuntuuitoolkit Package", "Welcome to ubuntu-ui-toolkit-autopilot’s documentation!"], "objects": {"": {"ubuntuuitoolkit": [0, 0, 0, "-"]}, "ubuntuuitoolkit.QQuickListView": {"click_element": [0, 1, 1, ""], "drag_item": [0, 1, 1, ""], "enable_select_mode": [0, 1, 1, ""]}, "ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase": {"swipe_into_view": [0, 1, 1, ""], "is_flickable": [0, 1, 1, ""]}, "ubuntuuitoolkit.MainView": {"switch_to_previous_tab": [0, 1, 1, ""], "get_action_selection_popover": [0, 1, 1, ""], "get_toolbar": [0, 1, 1, ""], "close_toolbar": [0, 1, 1, ""], "get_tabs": [0, 1, 1, ""], "switch_to_tab_by_index": [0, 1, 1, ""], "go_back": [0, 1, 1, ""], "get_text_input_context_menu": [0, 1, 1, ""], "switch_to_next_tab": [0, 1, 1, ""], "switch_to_tab": [0, 1, 1, ""], "open_toolbar": [0, 1, 1, ""], "click_action_button": [0, 1, 1, ""], "get_header": [0, 1, 1, ""], "validate_dbus_object": [0, 4, 1, ""]}, "ubuntuuitoolkit": {"UbuntuUIToolkitCustomProxyObjectBase": [0, 2, 1, ""], "get_pointing_device": [0, 6, 1, ""], "CheckBox": [0, 2, 1, ""], "Dialog": [0, 2, 1, ""], "OptionSelector": [0, 2, 1, ""], "QQuickListView": [0, 2, 1, ""], "MainView": [0, 2, 1, ""], "Tabs": [0, 2, 1, ""], "AppHeader": [0, 2, 1, ""], "UbuntuListView11": [0, 2, 1, ""], "check_autopilot_version": [0, 6, 1, ""], "TextArea": [0, 2, 1, ""], "Header": [0, 2, 1, ""], "QQuickGridView": [0, 2, 1, ""], "TabBar": [0, 2, 1, ""], "QQuickFlickable": [0, 2, 1, ""], "TextField": [0, 2, 1, ""], "UCListItem": [0, 2, 1, ""], "get_keyboard": [0, 6, 1, ""], "ToolkitException": [0, 3, 1, ""], "Toolbar": [0, 2, 1, ""]}, "ubuntuuitoolkit.OptionSelector": {"get_current_label": [0, 1, 1, ""], "select_option": [0, 1, 1, ""], "get_selected_index": [0, 1, 1, ""], "get_selected_text": [0, 1, 1, ""], "get_option_count": [0, 1, 1, ""]}, "ubuntuuitoolkit.UCListItem": {"trigger_leading_action": [0, 1, 1, ""], "toggle_selected": [0, 1, 1, ""], "trigger_trailing_action": [0, 1, 1, ""]}, "ubuntuuitoolkit.UbuntuListView11": {"pull_to_refresh_enabled": [0, 1, 1, ""], "wait_refresh_completed": [0, 1, 1, ""], "manual_refresh_wait": [0, 1, 1, ""], "manual_refresh_nowait": [0, 1, 1, ""]}, "ubuntuuitoolkit.Toolbar": {"close": [0, 1, 1, ""], "open": [0, 1, 1, ""], "click_back_button": [0, 1, 1, ""], "click_button": [0, 1, 1, ""]}, "ubuntuuitoolkit.CheckBox": {"uncheck": [0, 1, 1, ""], "check": [0, 1, 1, ""], "change_state": [0, 1, 1, ""]}, "ubuntuuitoolkit.TextArea": {"clear": [0, 1, 1, ""]}, "ubuntuuitoolkit.TabBar": {"switch_to_next_tab": [0, 1, 1, ""]}, "ubuntuuitoolkit.TextField": {"write": [0, 1, 1, ""], "is_empty": [0, 1, 1, ""], "clear": [0, 1, 1, ""]}, "ubuntuuitoolkit.QQuickFlickable": {"margin_to_swipe_from_bottom": [0, 5, 1, ""], "pull_to_refresh": [0, 1, 1, ""], "swipe_to_show_more_above": [0, 1, 1, ""], "swipe_to_bottom": [0, 1, 1, ""], "swipe_to_show_more_below": [0, 1, 1, ""], "swipe_to_top": [0, 1, 1, ""], "margin_to_swipe_from_top": [0, 5, 1, ""], "swipe_child_into_view": [0, 1, 1, ""]}, "ubuntuuitoolkit.AppHeader": {"ensure_visible": [0, 1, 1, ""], "click_back_button": [0, 1, 1, ""], "switch_to_tab_by_index": [0, 1, 1, ""], "wait_for_animation": [0, 1, 1, ""], "switch_to_section_by_index": [0, 1, 1, ""], "switch_to_next_tab": [0, 1, 1, ""], "click_custom_back_button": [0, 1, 1, ""], "get_selected_section_index": [0, 1, 1, ""], "click_action_button": [0, 1, 1, ""]}, "ubuntuuitoolkit.Tabs": {"get_current_tab": [0, 1, 1, ""], "get_number_of_tabs": [0, 1, 1, ""]}}, "titleterms": {"welcom": 1, "ubuntuuitoolkit": 0, "modul": 0, "object": 0, "toolkit": 1, "custom": 0, "packag": 0, "ubuntu": 1, "autopilot": 1, "document": 1, "proxi": 0}}./documentation/autopilot-helpers/_build/json/search.fjson0000644000015600001650000000011012700370701024130 0ustar jenkinsjenkins{"customsidebar": null, "current_page_name": "search", "sidebars": null}./documentation/autopilot-helpers/_build/json/genindex.fjson0000644000015600001650000002636412700370701024507 0ustar jenkinsjenkins{"genindexcounts": [1, 15, 2, 2, 15, 1, 2, 5, 3, 2, 3, 15, 9, 5, 1, 3], "genindexentries": [["A", [["AppHeader (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.AppHeader"]], []]]]], ["C", [["change_state() (ubuntuuitoolkit.CheckBox method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.CheckBox.change_state"]], []]], ["check() (ubuntuuitoolkit.CheckBox method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.CheckBox.check"]], []]], ["check_autopilot_version() (in module ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.check_autopilot_version"]], []]], ["CheckBox (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.CheckBox"]], []]], ["clear() (ubuntuuitoolkit.TextArea method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.TextArea.clear"]], [["(ubuntuuitoolkit.TextField method)", [["", "../ubuntuuitoolkit/#ubuntuuitoolkit.TextField.clear"]]]]]], ["click_action_button() (ubuntuuitoolkit.AppHeader method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.AppHeader.click_action_button"]], [["(ubuntuuitoolkit.MainView method)", [["", "../ubuntuuitoolkit/#ubuntuuitoolkit.MainView.click_action_button"]]]]]], ["click_back_button() (ubuntuuitoolkit.AppHeader method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.AppHeader.click_back_button"]], [["(ubuntuuitoolkit.Toolbar method)", [["", "../ubuntuuitoolkit/#ubuntuuitoolkit.Toolbar.click_back_button"]]]]]], ["click_button() (ubuntuuitoolkit.Toolbar method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.Toolbar.click_button"]], []]], ["click_custom_back_button() (ubuntuuitoolkit.AppHeader method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.AppHeader.click_custom_back_button"]], []]], ["click_element() (ubuntuuitoolkit.QQuickListView method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.QQuickListView.click_element"]], []]], ["close() (ubuntuuitoolkit.Toolbar method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.Toolbar.close"]], []]], ["close_toolbar() (ubuntuuitoolkit.MainView method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.MainView.close_toolbar"]], []]]]], ["D", [["Dialog (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.Dialog"]], []]], ["drag_item() (ubuntuuitoolkit.QQuickListView method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.QQuickListView.drag_item"]], []]]]], ["E", [["enable_select_mode() (ubuntuuitoolkit.QQuickListView method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.QQuickListView.enable_select_mode"]], []]], ["ensure_visible() (ubuntuuitoolkit.AppHeader method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.AppHeader.ensure_visible"]], []]]]], ["G", [["get_action_selection_popover() (ubuntuuitoolkit.MainView method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.MainView.get_action_selection_popover"]], []]], ["get_current_label() (ubuntuuitoolkit.OptionSelector method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.OptionSelector.get_current_label"]], []]], ["get_current_tab() (ubuntuuitoolkit.Tabs method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.Tabs.get_current_tab"]], []]], ["get_header() (ubuntuuitoolkit.MainView method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.MainView.get_header"]], []]], ["get_keyboard() (in module ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.get_keyboard"]], []]], ["get_number_of_tabs() (ubuntuuitoolkit.Tabs method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.Tabs.get_number_of_tabs"]], []]], ["get_option_count() (ubuntuuitoolkit.OptionSelector method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.OptionSelector.get_option_count"]], []]], ["get_pointing_device() (in module ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.get_pointing_device"]], []]], ["get_selected_index() (ubuntuuitoolkit.OptionSelector method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.OptionSelector.get_selected_index"]], []]], ["get_selected_section_index() (ubuntuuitoolkit.AppHeader method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.AppHeader.get_selected_section_index"]], []]], ["get_selected_text() (ubuntuuitoolkit.OptionSelector method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.OptionSelector.get_selected_text"]], []]], ["get_tabs() (ubuntuuitoolkit.MainView method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.MainView.get_tabs"]], []]], ["get_text_input_context_menu() (ubuntuuitoolkit.MainView method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.MainView.get_text_input_context_menu"]], []]], ["get_toolbar() (ubuntuuitoolkit.MainView method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.MainView.get_toolbar"]], []]], ["go_back() (ubuntuuitoolkit.MainView method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.MainView.go_back"]], []]]]], ["H", [["Header (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.Header"]], []]]]], ["I", [["is_empty() (ubuntuuitoolkit.TextField method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.TextField.is_empty"]], []]], ["is_flickable() (ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase.is_flickable"]], []]]]], ["M", [["MainView (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.MainView"]], []]], ["manual_refresh_nowait() (ubuntuuitoolkit.UbuntuListView11 method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.UbuntuListView11.manual_refresh_nowait"]], []]], ["manual_refresh_wait() (ubuntuuitoolkit.UbuntuListView11 method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.UbuntuListView11.manual_refresh_wait"]], []]], ["margin_to_swipe_from_bottom (ubuntuuitoolkit.QQuickFlickable attribute)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.QQuickFlickable.margin_to_swipe_from_bottom"]], []]], ["margin_to_swipe_from_top (ubuntuuitoolkit.QQuickFlickable attribute)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.QQuickFlickable.margin_to_swipe_from_top"]], []]]]], ["O", [["open() (ubuntuuitoolkit.Toolbar method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.Toolbar.open"]], []]], ["open_toolbar() (ubuntuuitoolkit.MainView method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.MainView.open_toolbar"]], []]], ["OptionSelector (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.OptionSelector"]], []]]]], ["P", [["pull_to_refresh() (ubuntuuitoolkit.QQuickFlickable method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.QQuickFlickable.pull_to_refresh"]], []]], ["pull_to_refresh_enabled() (ubuntuuitoolkit.UbuntuListView11 method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.UbuntuListView11.pull_to_refresh_enabled"]], []]]]], ["Q", [["QQuickFlickable (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.QQuickFlickable"]], []]], ["QQuickGridView (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.QQuickGridView"]], []]], ["QQuickListView (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.QQuickListView"]], []]]]], ["S", [["select_option() (ubuntuuitoolkit.OptionSelector method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.OptionSelector.select_option"]], []]], ["swipe_child_into_view() (ubuntuuitoolkit.QQuickFlickable method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.QQuickFlickable.swipe_child_into_view"]], []]], ["swipe_into_view() (ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase.swipe_into_view"]], []]], ["swipe_to_bottom() (ubuntuuitoolkit.QQuickFlickable method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.QQuickFlickable.swipe_to_bottom"]], []]], ["swipe_to_show_more_above() (ubuntuuitoolkit.QQuickFlickable method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.QQuickFlickable.swipe_to_show_more_above"]], []]], ["swipe_to_show_more_below() (ubuntuuitoolkit.QQuickFlickable method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.QQuickFlickable.swipe_to_show_more_below"]], []]], ["swipe_to_top() (ubuntuuitoolkit.QQuickFlickable method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.QQuickFlickable.swipe_to_top"]], []]], ["switch_to_next_tab() (ubuntuuitoolkit.AppHeader method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.AppHeader.switch_to_next_tab"]], [["(ubuntuuitoolkit.MainView method)", [["", "../ubuntuuitoolkit/#ubuntuuitoolkit.MainView.switch_to_next_tab"]]], ["(ubuntuuitoolkit.TabBar method)", [["", "../ubuntuuitoolkit/#ubuntuuitoolkit.TabBar.switch_to_next_tab"]]]]]], ["switch_to_previous_tab() (ubuntuuitoolkit.MainView method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.MainView.switch_to_previous_tab"]], []]], ["switch_to_section_by_index() (ubuntuuitoolkit.AppHeader method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.AppHeader.switch_to_section_by_index"]], []]], ["switch_to_tab() (ubuntuuitoolkit.MainView method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.MainView.switch_to_tab"]], []]], ["switch_to_tab_by_index() (ubuntuuitoolkit.AppHeader method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.AppHeader.switch_to_tab_by_index"]], [["(ubuntuuitoolkit.MainView method)", [["", "../ubuntuuitoolkit/#ubuntuuitoolkit.MainView.switch_to_tab_by_index"]]]]]]]], ["T", [["TabBar (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.TabBar"]], []]], ["Tabs (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.Tabs"]], []]], ["TextArea (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.TextArea"]], []]], ["TextField (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.TextField"]], []]], ["toggle_selected() (ubuntuuitoolkit.UCListItem method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.UCListItem.toggle_selected"]], []]], ["Toolbar (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.Toolbar"]], []]], ["ToolkitException", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.ToolkitException"]], []]], ["trigger_leading_action() (ubuntuuitoolkit.UCListItem method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.UCListItem.trigger_leading_action"]], []]], ["trigger_trailing_action() (ubuntuuitoolkit.UCListItem method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.UCListItem.trigger_trailing_action"]], []]]]], ["U", [["UbuntuListView11 (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.UbuntuListView11"]], []]], ["ubuntuuitoolkit (module)", [[["", "../ubuntuuitoolkit/#module-ubuntuuitoolkit"]], []]], ["UbuntuUIToolkitCustomProxyObjectBase (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase"]], []]], ["UCListItem (class in ubuntuuitoolkit)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.UCListItem"]], []]], ["uncheck() (ubuntuuitoolkit.CheckBox method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.CheckBox.uncheck"]], []]]]], ["V", [["validate_dbus_object() (ubuntuuitoolkit.MainView class method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.MainView.validate_dbus_object"]], []]]]], ["W", [["wait_for_animation() (ubuntuuitoolkit.AppHeader method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.AppHeader.wait_for_animation"]], []]], ["wait_refresh_completed() (ubuntuuitoolkit.UbuntuListView11 method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.UbuntuListView11.wait_refresh_completed"]], []]], ["write() (ubuntuuitoolkit.TextField method)", [[["", "../ubuntuuitoolkit/#ubuntuuitoolkit.TextField.write"]], []]]]]], "customsidebar": null, "current_page_name": "genindex", "sidebars": null, "split_index": false}./documentation/autopilot-helpers/_build/json/objects.inv0000644000015600001650000000210212700370701023774 0ustar jenkinsjenkins# Sphinx inventory version 2 # Project: ubuntu-ui-toolkit-autopilot # Version: 15.04 # The remainder of this file is compressed using zlib. xڭXɒ0ʍbj`dc.-Y8$`$ozR حoAW^~Gu7MwQ|F|/^ktI:}7w_7WVW{.O ۪:h \buKF~}D%-~p< Qfo߼lHp@Zq& 1#fq5svî 748?Mnu5?Կ(n!`tɳܖEuEېaF!tkrF- JvtX !OLV3՜s zcca)sJ L27XL_8>.9` 9Ėސ3F}\n

Welcome to ubuntu-ui-toolkit-autopilot’s documentation!\u00b6

\n

Contents:

\n\n\n
\n", "display_toc": false, "title": "Welcome to ubuntu-ui-toolkit-autopilot’s documentation!", "sourcename": "index.txt", "customsidebar": null, "current_page_name": "index", "next": {"link": "ubuntuuitoolkit/", "title": "ubuntuuitoolkit Package"}, "rellinks": [["genindex", "General Index", "I", "index"], ["py-modindex", "Python Module Index", "", "modules"], ["ubuntuuitoolkit", "ubuntuuitoolkit Package", "N", "next"]], "meta": {}, "parents": [], "sidebars": null, "toc": "\n", "prev": null, "metatags": ""}./documentation/autopilot-helpers/_build/json/_sources/0000755000015600001650000000000012700370701023454 5ustar jenkinsjenkins./documentation/autopilot-helpers/_build/json/_sources/index.txt0000644000015600001650000000063612700370701025331 0ustar jenkinsjenkins.. ubuntu-ui-toolkit-autopilot documentation master file, created by sphinx-quickstart on Thu Jan 8 12:39:43 2015. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to ubuntu-ui-toolkit-autopilot's documentation! ====================================== Contents: .. toctree:: :maxdepth: 2 ubuntuuitoolkit * :ref:`genindex` ./documentation/autopilot-helpers/_build/json/_sources/ubuntuuitoolkit.txt0000644000015600001650000000031712700370701027504 0ustar jenkinsjenkinsubuntuuitoolkit Package ======================= :mod:`custom proxy object` Module --------------------------------- .. automodule:: ubuntuuitoolkit :members: :undoc-members: :show-inheritance: ./documentation/autopilot-helpers/_build/json/py-modindex.fjson0000644000015600001650000000036112700370701025130 0ustar jenkinsjenkins{"customsidebar": null, "current_page_name": "py-modindex", "sidebars": null, "content": [["u", [["ubuntuuitoolkit", 0, "ubuntuuitoolkit", "module-ubuntuuitoolkit", "", "", ""]]]], "collapse_index": true, "indextitle": "Python Module Index"}./documentation/autopilot-helpers/_build/json/_modules/0000755000015600001650000000000012700370701023441 5ustar jenkinsjenkins./documentation/autopilot-helpers/_build/json/_modules/ubuntuuitoolkit.fjson0000644000015600001650000001406312700370701027774 0ustar jenkinsjenkins{"body": "

Source code for ubuntuuitoolkit

\n# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-\n#\n# Copyright (C) 2012, 2013, 2014 Canonical Ltd.\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published by\n# the Free Software Foundation; version 3.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n#\n# You should have received a copy of the GNU Lesser General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n"""Ubuntu UI Toolkit Autopilot tests and helpers."""\n\n\n__all__ = [\n    'AppHeader',\n    'base',\n    'check_autopilot_version',\n    'CheckBox',\n    'environment',\n    'fixture_setup',\n    'get_keyboard',\n    'get_pointing_device',\n    'Header',\n    'Dialog',\n    'listitems',\n    'UCListItem',\n    'MainView',\n    'OptionSelector',\n    'pickers',\n    'popups',\n    'QQuickFlickable',\n    'QQuickGridView',\n    'QQuickListView',\n    'TabBar',\n    'Tabs',\n    'tests',\n    'TextArea',\n    'TextField',\n    'Toolbar',\n    'ToolkitException',\n    'ubuntu_scenarios',\n    'UbuntuListView11',\n    'UbuntuUIToolkitCustomProxyObjectBase',\n]\n\n\nfrom ubuntuuitoolkit import (\n    base,\n    environment,\n    fixture_setup,\n    tests,\n    ubuntu_scenarios\n)\nfrom ubuntuuitoolkit._custom_proxy_objects import (\n    AppHeader,\n    check_autopilot_version,\n    CheckBox,\n    get_keyboard,\n    get_pointing_device,\n    Header,\n    Dialog,\n    listitems,\n    UCListItem,\n    MainView,\n    OptionSelector,\n    pickers,\n    popups,\n    QQuickFlickable,\n    QQuickGridView,\n    QQuickListView,\n    TabBar,\n    Tabs,\n    TextArea,\n    TextField,\n    Toolbar,\n    ToolkitException,\n    UbuntuUIToolkitCustomProxyObjectBase,\n    UbuntuListView11,\n)\n
", "title": "ubuntuuitoolkit", "customsidebar": null, "current_page_name": "_modules/ubuntuuitoolkit", "sidebars": null, "parents": [{"link": "../", "title": "Module code"}]}./documentation/autopilot-helpers/_build/json/_modules/index.fjson0000644000015600001650000000036412700370701025614 0ustar jenkinsjenkins{"body": "

All modules for which code is available

\n", "customsidebar": null, "sidebars": null, "current_page_name": "_modules/index", "title": "Overview: module code"}./documentation/ubuntu-components-listitems.qdoc0000644000015600001650000000132712700370701022336 0ustar jenkinsjenkins/* * Copyright (C) 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \qmlmodule Ubuntu.Components.ListItems 1.0 \title List Items */ ./documentation/ubuntu-whatsnew.qdoc0000644000015600001650000000426212700370701017777 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! * \page ubuntu-whatsnew.html ubuntu-whatsnew * \title What's new in the version 1.2? * * Beside the pile of bug fixes we have two major changes in the UI Toolkit version 1.2, * as follows: * * \section3 MainView.useDeprecatedToolbar * MainView.useDeprecatedToolbar property \b {got removed} and the new header is always * enabled. If you need to use the old toolbar you can still do that by importing \b * Ubuntu.Components 1.1. * * \section3 A new performant ListItem component * As of 1.2, a new ListItem component and its attached components were added to the toolkit, * which gives more flexibility and performance when used with scrollable views like ListView * or Flickable. Its layout is free, meaning developers can, and have to implement their layout * themselves. The only helper the toolkit provides is the Captions component, which fulfills * the two typical use cases, for the two label column title captioning and for the summary * captions. * * \section3 Ubuntu.Components.ListItems module deprecated * The new ListItem also made the old list items module to be redundant, therefore we marked them * for deprecation. Which means that your application should migrate to the new ListItem as soon as * possible. There are few components which were not marked as deprecated, like ThinDivider, Header, * Expandable and ExpandableColumn were not deprecated. * * \section3 UbuntuShape facelift * There were few properties added and marked to be deprecated as well in UbuntuShape. Some most * wanted features were added, and optimized. */ ./documentation/ubuntu-appdev-site-footer.qdocconf0000644000015600001650000000750612700370701022526 0ustar jenkinsjenkinsHTML.footer = \ "
\n" \ "
\n" \ "\n" \ "\n" \ "\n" ./documentation/ubuntu-ui-toolkit-qtcreator.qdocconf0000644000015600001650000000051112700370701023100 0ustar jenkinsjenkinsinclude(ubuntu-ui-toolkit-offline.qdocconf) outputdir = $BLD/offline qhp.projects = UbuntuUserInterfaceToolkit qhp.UbuntuUserInterfaceToolkit.namespace = com.canonical.ubuntuuitoolkit.0.1 qhp.UbuntuUserInterfaceToolkit.virtualFolder = UbuntuUserInterfaceToolkit qhp.UbuntuUserInterfaceToolkit.extraFiles = style/*.css style/*.js./documentation/resolution-independence.qdoc0000644000015600001650000001320112700370701021432 0ustar jenkinsjenkins/* * Copyright (C) 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \page resolution-independence.html resolution-independence \title Resolution Independence \nextpage {Ubuntu User Interface Toolkit} The objective of resolution independence is to make it easy for graphical user interfaces in Ubuntu to scale to all the form factors that Ubuntu targets: phones, tablets, laptops and desktops. The approach taken combines simplicity for the designers and developers with visual fidelity, quality and usability. \part Measurement Units A new measurement unit is defined called the grid unit, abbreviated \b{\e gu}. 1 grid unit translates to a given number of pixels depending on the type of screen that the user interface is displayed on. For example, on a laptop computer 1 grid unit will typically translate to 8 pixels. The number of pixels per grid unit is chosen in order to preserve the perceived visual size of UI elements and therefore depends on the density of the display and the distance the user is to the screen. We also ensure that 1 grid unit is always an integer number of pixel. Examples: \table \header \li Device \li Conversion \row \li Most laptops \li 1 gu = 8 px \row \li Retina laptops \li 1 gu = 16 px \row \li Phone with 4 inch screen at HD resolution (around 720x1,280 pixels) \li 1 gu = 18 px \row \li Tablet with 10 inch screen at HD resolution (around 720x1,280 pixels) \li 1 gu = 10 px \endtable The grid unit defines a visual rhythm in Ubuntu and should be used for all measurements. Sizes of elements, spacing, margins, etc. should all use multiples of 1 gu. It is available from QML as a method of the global object \b units, instance of \l Units. Example Usage: \code import Ubuntu.Components 1.2 Item { width: units.gu(2) height: units.gu(5) } \endcode Exceptionally, in order to accommodate for the rare cases where measurements of less than 1 gu are needed another unit is available: the density independent pixel, abbreviated \b{\e dp}. 1 dp typically translates to 1 pixel on laptops and low density mobile phones and tablets. Example Usage: \code import Ubuntu.Components 1.2 Rectangle { height: units.dp(1) } \endcode \part Bitmaps Vector graphics, fonts and programmatically drawn elements will usually scale well to the different devices. On the other hand, bitmaps will typically require a bit more care. The size of a bitmap needs to be adequate to render well on a given device. The toolkit allows to design multiple versions of a bitmap and choose the appropriate one dynamically depending on the device the application is being run on. In order to know for what target device a given version of a bitmap was produced, we define a file naming convention based on the number of pixel per grid unit of the device. Example: If the target device the bitmap is produced for has 10 pixels per grid unit, then the file name of the bitmap should be suffixed with @10: \e my_bitmap.png should be renamed to \e my_bitmap@10.png. In order to support the highest possible resolution devices on the market, we recommend to always design bitmaps for a device that would have 30 pixels per grid unit (@30 suffix). The system will perform a high quality downscaling of the bitmap when needed on lower resolution screens. Example: If the destination size of the bitmap is 10 gu * 10 gu and the developer targets a device that has 18 pixels per grid unit (1 gu = 18 px), the bitmap should still be created as if 1 gu = 30 px which results in a 300 px * 300 px bitmap. When testing on the device the bitmap will be downscaled by a factor of 30 / 18 = 1.66667. \part Fonts It is critical for the font sizes to be consistent across Ubuntu and to have a rhythm defining them. Instead of setting the font size in pixels or points, it is imperative to define the font size in terms of literals: \table \row \li \b x-large \row \li \b large \row \li \b medium \row \li \b small \row \li \b x-small \endtable Example Usage: \code import Ubuntu.Components 1.2 Label { fontSize: "small" } \endcode For reference when designing, these sizes correspond to the following pixel measurements: \table \header \li Font Size \li Desktop \li Smart Phone with 4" HD screen \li Tablet with 10" HD screen \row \li \b{\e x-large} \li 34 px \li 76 px \li 42 px \row \li \b{\e large} \li 20 px \li 45 px \li 25 px \row \li \b{\e medium} \li 14 px \li 31 px \li 18 px \row \li \b{\e small} \li 12 px \li 27 px \li 15 px \row \li \b{\e x-small} \li 10 px \li 22 px \li 12 px \endtable */ ./documentation/html/0000755000015600001650000000000012700370701014707 5ustar jenkinsjenkins./documentation/documentation.pro0000644000015600001650000000225712700370701017344 0ustar jenkinsjenkinsTEMPLATE=aux TARGET=documentation load(qt_build_config) load(qt_functions) #find the path to qdoc and qhelpgenerator qtPrepareTool(QDOC, qdoc) qtPrepareTool(QHELPGENERATOR, qhelpgenerator) DOC_SRC = $$ROOT_SOURCE_DIR equals(QT_MAJOR_VERSION, 5):lessThan(QT_MINOR_VERSION, 2) { DOC_SRC = $$ROOT_SOURCE_DIR/documentation } DOC_PATH=$$shadowed($$ROOT_SOURCE_DIR)/documentation generate_docs.commands = cd $$ROOT_SOURCE_DIR; SRC=$$ROOT_SOURCE_DIR/documentation BLD=$$ROOT_BUILD_DIR/documentation $$ROOT_SOURCE_DIR/documentation/docs.sh \'$$QDOC\' \'$$QHELPGENERATOR\' $$DOC_PATH #install the online docs only when building outside of Qt !build_with_qt{ install_docs.files = $$shadowed($$ROOT_SOURCE_DIR)/documentation/html install_docs.path = /usr/share/ubuntu-ui-toolkit/doc install_docs.CONFIG += no_check_exist directory no_build install_docs.depends = docs INSTALLS += install_docs } install_qch.files = $$shadowed($$ROOT_SOURCE_DIR)/documentation/ubuntuuserinterfacetoolkit.qch install_qch.path = $$[QT_INSTALL_DOCS] install_qch.CONFIG += no_check_exist no_build install_qch.depends = docs INSTALLS += install_qch OTHER_FILES += *.qdocconf \ docs.sh ./documentation/docs.sh0000755000015600001650000000447012700370701015237 0ustar jenkinsjenkins#!/bin/bash # # Copyright 2012 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # QDOC=$1 QHELPGENERATOR=$2 DOC_PATH=$3 if [ ! $SRC -o ! $DOC_PATH ]; then echo "Error - SRC and DOC_PATH must be defined" exit 1 fi mkdir -p $DOC_PATH # Offline docs for QtCreator eval "$QDOC $SRC/ubuntu-ui-toolkit-qtcreator.qdocconf 2> $DOC_PATH/qdoc.log" # FIXME: With Qt 5.2 this warning shows up, forcibly omit it from errors grep -v "error: HTML file already exists; overwriting" $DOC_PATH/qdoc.log | grep -v "qdoc: warning: No documentation for 'global'" > $DOC_PATH/qdoc.err cat $DOC_PATH/qdoc.err test ! -s $DOC_PATH/qdoc.err || exit 1 echo docs: Offline done. eval "$QHELPGENERATOR -o '$DOC_PATH/ubuntuuserinterfacetoolkit.qch' '$DOC_PATH/offline/ubuntuuserinterfacetoolkit.qhp' | grep -v ' does not exist! Skipping it'" echo docs: qch done: $DOC_PATH # Online docs. Run qdoc twice: the second run with indexes for cross-referencing # other APIs but discard errors because qdoc inherits all doc bugs otherwise eval "$QDOC $SRC/ubuntu-ui-toolkit-online.qdocconf 2> $DOC_PATH/qdoc.log" grep -v "error: HTML file already exists; overwriting" $DOC_PATH/qdoc.log | grep -v "qdoc: warning: No documentation for 'global'" > $DOC_PATH/qdoc.err cat $DOC_PATH/qdoc.err test ! -s $DOC_PATH/qdoc.err || exit 1 echo docs: Online done. eval "$QDOC $SRC/ubuntu-ui-toolkit-online-indexes.qdocconf 2> /dev/null" echo docs: Cross-referenced done. sed -r -i 's@(

)

@\1@g' $DOC_PATH/html/*.html sed -r -i 's@()(.+)()@

  • \1\3\4
  • @g' $DOC_PATH/html/*.html sed -r -i 's@(href="qmlmodule-ubuntu-components0-ubuntu-components-0-1.html">Basic QML Types)@href="overview-ubuntu-sdk.html">Ubuntu User Interface Toolkit@g' $DOC_PATH/html/*.html echo docs: HTML fixes done. ./documentation/ubuntu-ui-toolkit-online.qdocconf0000644000015600001650000000162612700370701022370 0ustar jenkinsjenkinsinclude(ubuntu-ui-toolkit-offline.qdocconf) include(ubuntu-appdev-site-header.qdocconf) include(ubuntu-appdev-site-footer.qdocconf) HTML.nobreadcrumbs = "false" HTML.headerstyles = \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" ./documentation/overview.qdoc0000644000015600001650000000775412700370701016476 0ustar jenkinsjenkins/* * Copyright (C) 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \page overview-ubuntu-sdk.html overview \title Ubuntu User Interface Toolkit \part General Topics \list \li \l{ubuntu-whatsnew.html}{What's new in version 1.2?} \li \l{ubuntu-theming.html}{Styling} components \li \l{ubuntu-layouts.html}{Layouts} describes a flexible layouting engine to ease the development of responsive user interfaces. \li \l {Resolution Independence} describes the facilities that should be used when setting the size of UI elements (widgets, fonts, etc.) in order for them to behave well on a variety of devices. \li \l{Automatic State Saving} provides automatic property saving for components. \endlist \part Basic QML Types Available through: \code import Ubuntu.Components 1.2 \endcode \annotatedlist ubuntu \part Gestures Available through: \code import Ubuntu.Components 1.3 \endcode \annotatedlist ubuntu-gestures \part List views, list items Components with standardized view items, with conditional actions, multiselect and reordering support on scrollable views. Replaces the Ubuntu.Components.ListItems module components. Available through: \code import Ubuntu.Components 1.2 \endcode \annotatedlist ubuntu-listitem \part List Items module - deprecated This module contains the old set of list items. Available through: \code import Ubuntu.Components.ListItems 1.0 \endcode \annotatedlist ubuntu-listitems \part Pickers Available through: \code import Ubuntu.Components.Pickers 1.0 \endcode \annotatedlist ubuntu-pickers \part Popovers, Sheets and Dialogs Available through: \code import Ubuntu.Components.Popups 1.0 \endcode \annotatedlist ubuntu-popups \part Layouting Available through: \code import Ubuntu.Layouts 1.0 \endcode \annotatedlist ubuntu-layouts \part Theming Elements Available through: \code import Ubuntu.Components 1.2 \endcode \annotatedlist theming \part Theme module Available through: \code import Ubuntu.Components.Themes 1.0 \endcode \annotatedlist theme-module \part Style API The Style API defines the interface components use to style the visuals. Themes must make sure that these interfaces are all implemented. Available through: \code import Ubuntu.Components.Styles 1.2 \endcode \annotatedlist style-api \part Resolution Independence Items Available through: \code import Ubuntu.Components 1.2 \endcode \annotatedlist resolution-independence \part Parsing Command-Line Arguments Available through: \code import Ubuntu.Components 1.2 \endcode \annotatedlist ubuntu-commandline \part Services Available through: \code import Ubuntu.Components 1.2 \endcode \annotatedlist ubuntu-services \part Performance Metrics Available through: \code import Ubuntu.PerformanceMetrics 1.0 \endcode \annotatedlist ubuntu-performance-metrics \part Test extensions Available through: \code import Ubuntu Test 1.0 \endcode \annotatedlist ubuntu-test */ ./documentation/snippets/0000755000015600001650000000000012700370701015610 5ustar jenkinsjenkins./documentation/snippets/statesaver/0000755000015600001650000000000012700370701017771 5ustar jenkinsjenkins./documentation/snippets/statesaver/PropertyGroupSaver.qml0000644000015600001650000000300312700370701024342 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ //![property-group-saver] import QtQuick 2.4 import Ubuntu.Components 1.2 Rectangle { id: root width: units.gu(40) height: units.gu(71) color: "green" StateSaver.properties: "border.color, border.width, innerRect.color" property Rectangle innerRect: Rectangle { width: units.gu(20) height: units.gu(40) parent: root z: 0 anchors.centerIn: root } Button { text: "Change" anchors.centerIn: parent z: 1 onClicked: { root.color = Qt.rgba(Math.random(1), Math.random(1), Math.random(1), 1); root.border.width = units.gu(2) * Math.random(1) root.border.color = Qt.rgba(Math.random(1), Math.random(1), Math.random(1), 1); innerRect.color = Qt.rgba(Math.random(1), Math.random(1), Math.random(1), 1); } } } //![property-group-saver] ./documentation/snippets/statesaver/ColorChanger.qml0000644000015600001650000000204212700370701023050 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ //![color-saver] import QtQuick 2.4 import Ubuntu.Components 1.2 Rectangle { id: root width: units.gu(40) height: units.gu(71) color: "green" StateSaver.properties: "color" Button { text: "Change color" anchors.centerIn: parent onClicked: { root.color = Qt.rgba(Math.random(1), Math.random(1), Math.random(1), 1); } } } //![color-saver] ./documentation/snippets/statesaver/PropertyGroupSaver2.qml0000644000015600001650000000313512700370701024432 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ //![property-group-saver] import QtQuick 2.4 import Ubuntu.Components 1.2 Rectangle { id: root width: units.gu(40) height: units.gu(71) color: "green" StateSaver.properties: "border.color, border.width" //![alt-group-saver] property Rectangle innerRect: Rectangle { id: inner width: units.gu(20) height: units.gu(40) parent: root z: 0 anchors.centerIn: root StateSaver.properties: "color" } //![alt-group-saver] Button { text: "Change" anchors.centerIn: parent z: 1 onClicked: { root.color = Qt.rgba(Math.random(1), Math.random(1), Math.random(1), 1); root.border.width = units.gu(2) * Math.random(1) root.border.color = Qt.rgba(Math.random(1), Math.random(1), Math.random(1), 1); innerRect.color = Qt.rgba(Math.random(1), Math.random(1), Math.random(1), 1); } } } //![property-group-saver] ./documentation/snippets/statesaver/MultiplePropertySaver.qml0000644000015600001650000000232212700370701025044 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ //![group-saver] import QtQuick 2.4 import Ubuntu.Components 1.2 Rectangle { id: root width: units.gu(40) height: units.gu(71) color: "green" StateSaver.properties: "color, border.color, border.width" Button { text: "Change" anchors.centerIn: parent onClicked: { root.color = Qt.rgba(Math.random(1), Math.random(1), Math.random(1), 1); root.border.width = units.gu(2) * Math.random(1) root.border.color = Qt.rgba(Math.random(1), Math.random(1), Math.random(1), 1); } } } //![group-saver] ./documentation/snippets/layouts/0000755000015600001650000000000012700370701017310 5ustar jenkinsjenkins./documentation/snippets/layouts/layout1.qml0000644000015600001650000000601712700370701021425 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ //![0] import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Layouts 1.0 Item { id: root width: units.gu(30) height: units.gu(30) Layouts { objectName: "layouts" id: layouts anchors.fill: parent layouts: [ //![row layout] ConditionalLayout { name: "row" when: layouts.width > units.gu(50) Row { anchors.fill: parent ItemLayout { item: "red" width: parent.width / 3 anchors { top: parent.top bottom: parent.bottom } } ItemLayout { item: "green" width: parent.width / 3 anchors { top: parent.top bottom: parent.bottom } } ItemLayout { item: "blue" width: parent.width / 3 anchors { top: parent.top bottom: parent.bottom } } } } //![row layout] ] //![default layout] Button { id: redButton text: "Item #1" color: "red" Layouts.item: "red" anchors { left: parent.left top: parent.top bottom: parent.bottom } width: units.gu(15) } Button { id: greenButton text: "Item #2" color: "green" Layouts.item: "green" anchors { top: parent.top left: redButton.right right: parent.right } height: units.gu(10) } Button { id: blueButton text: "Item #3" color: "blue" Layouts.item: "blue" anchors{ left: redButton.right right: parent.right bottom: parent.bottom } height: units.gu(10) } //![default layout] } } //![0] ./documentation/snippets/layouts/layout6.qml0000644000015600001650000000677412700370701021444 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ //![0] import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Layouts 1.0 Item { id: root width: units.gu(30) height: units.gu(30) Layouts { objectName: "layouts" id: layouts anchors.fill: parent layouts: [ //![flow layout] ConditionalLayout { name: "flow" when: layouts.width > units.gu(70) Flow { anchors.fill: parent ItemLayout { item: "red" width: units.gu(20) height: units.gu(20) } ItemLayout { item: "green" width: units.gu(20) height: units.gu(20) } ItemLayout { item: "blue" width: units.gu(20) height: units.gu(20) } Button { text: "Flow item" width: units.gu(20) height: units.gu(20) } } } //![flow layout] , //![row layout] ConditionalLayout { name: "row" when: layouts.width > units.gu(50) Row { anchors.fill: parent ItemLayout { item: "red" width: parent.width / 2 height: units.gu(20) } ItemLayout { item: "green" width: parent.width / 2 height: units.gu(20) } } } //![row layout] ] //![default layout] Button { id: redButton text: "Item #1" color: "red" Layouts.item: "red" anchors { left: parent.left top: parent.top bottom: parent.bottom } width: units.gu(15) } Button { id: greenButton text: "Item #2" color: "green" Layouts.item: "green" anchors { top: parent.top left: redButton.right right: parent.right } height: units.gu(10) } Button { id: blueButton text: "Item #3" color: "blue" Layouts.item: "blue" anchors{ left: redButton.right right: parent.right bottom: parent.bottom } height: units.gu(10) } //![default layout] } } //![0] ./documentation/snippets/layouts/layout3.qml0000644000015600001650000000565612700370701021437 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ //![0] import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Layouts 1.0 Item { id: root width: units.gu(30) height: units.gu(30) Layouts { objectName: "layouts" id: layouts anchors.fill: parent layouts: [ //![row layout] ConditionalLayout { name: "row" when: layouts.width > units.gu(50) Row { anchors.fill: parent ItemLayout { item: "blue" width: units.gu(10) height: parent.height - units.gu(10) } ItemLayout { item: "red" width: parent.width / 3 anchors { top: parent.top bottom: parent.bottom } } ItemLayout { item: "green" width: parent.width / 3 anchors { top: parent.top bottom: parent.bottom } } } } //![row layout] ] //![default layout] Button { id: redButton text: "Item #1" color: "red" Layouts.item: "red" anchors { left: parent.left top: parent.top bottom: parent.bottom } width: units.gu(15) } Button { id: greenButton text: "Item #2" color: "green" Layouts.item: "green" anchors { top: parent.top left: redButton.right right: parent.right } height: units.gu(10) } Button { id: blueButton text: "Item #3" color: "blue" Layouts.item: "blue" anchors{ left: redButton.right right: parent.right bottom: parent.bottom } height: units.gu(10) } //![default layout] } } //![0] ./documentation/snippets/layouts/layout2.qml0000644000015600001650000000601712700370701021426 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ //![0] import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Layouts 1.0 Item { id: root width: units.gu(30) height: units.gu(30) Layouts { objectName: "layouts" id: layouts anchors.fill: parent layouts: [ //![row layout] ConditionalLayout { name: "row" when: layouts.width > units.gu(50) Row { anchors.fill: parent ItemLayout { item: "blue" width: parent.width / 3 anchors { top: parent.top bottom: parent.bottom } } ItemLayout { item: "red" width: parent.width / 3 anchors { top: parent.top bottom: parent.bottom } } ItemLayout { item: "green" width: parent.width / 3 anchors { top: parent.top bottom: parent.bottom } } } } //![row layout] ] //![default layout] Button { id: redButton text: "Item #1" color: "red" Layouts.item: "red" anchors { left: parent.left top: parent.top bottom: parent.bottom } width: units.gu(15) } Button { id: greenButton text: "Item #2" color: "green" Layouts.item: "green" anchors { top: parent.top left: redButton.right right: parent.right } height: units.gu(10) } Button { id: blueButton text: "Item #3" color: "blue" Layouts.item: "blue" anchors{ left: redButton.right right: parent.right bottom: parent.bottom } height: units.gu(10) } //![default layout] } } //![0] ./documentation/snippets/layouts/SimpleLayout.qml0000644000015600001650000001416312700370701022457 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Layouts 1.0 Item { id: root width: units.gu(30) height: units.gu(30) //! [0] Layouts { id: layouts anchors.fill: parent layouts: [ //![column] ConditionalLayout { name: "column" when: layouts.width > units.gu(50) && layouts.width <= units.gu(70) Column { anchors.fill: parent ItemLayout { item: "red" height: parent.height / 3 anchors { left: parent.left right: parent.right } } ItemLayout { item: "green" height: parent.height / 3 anchors { left: parent.left right: parent.right } } ItemLayout { item: "blue" height: parent.height / 3 anchors { left: parent.left right: parent.right } } } }, //![column] //![row] ConditionalLayout { name: "row" when: layouts.width > units.gu(70) && layouts.width <= units.gu(90) Row { anchors.fill: parent ItemLayout { item: "blue" width: parent.width / 3 anchors { top: parent.top bottom: parent.bottom } } ItemLayout { item: "red" width: parent.width / 3 anchors { top: parent.top bottom: parent.bottom } } ItemLayout { item: "green" width: parent.width / 3 anchors { top: parent.top bottom: parent.bottom } } } }, //![row] //![hiding-element] ConditionalLayout { name: "hiding-element" when: layouts.width > units.gu(90) && layouts.width < units.gu(100) Row { anchors.fill: parent ItemLayout { item: "red" width: parent.width / 2 height: units.gu(20) } ItemLayout { item: "green" width: parent.width / 2 height: units.gu(20) } } }, //![hiding-element] //![showing-more] ConditionalLayout { name: "showing-more" when: layouts.width >= units.gu(100) Flow { anchors.fill: parent ItemLayout { item: "red" width: units.gu(50) height: units.gu(20) } ItemLayout { item: "green" width: units.gu(50) height: units.gu(20) } ItemLayout { item: "blue" width: units.gu(50) height: units.gu(20) } Button { text: "Flow item" width: units.gu(50) height: units.gu(20) } } } //![showing-more] ] //![default layout] Button { id: redButton text: "Item #1" color: "red" Layouts.item: "red" anchors { left: parent.left top: parent.top bottom: parent.bottom } width: units.gu(15) } Button { id: greenButton text: "Item #2" color: "green" Layouts.item: "green" anchors { top: parent.top left: redButton.right right: parent.right } height: units.gu(10) } Button { id: nolayout text: "Non-laid out" color: "brown" anchors { top: greenButton.bottom left: redButton.right right: parent.right bottom: blueButton.top } } Button { id: blueButton text: "Item #3" color: "blue" Layouts.item: "blue" anchors{ left: redButton.right right: parent.right bottom: parent.bottom } height: units.gu(10) } //![default layout] } //! [0] } ./documentation/snippets/layouts/layout7.qml0000644000015600001650000001022612700370701021430 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ //![0] import QtQuick 2.4 import Ubuntu.Components 1.2 import Ubuntu.Layouts 1.0 Item { id: root width: units.gu(30) height: units.gu(30) Layouts { objectName: "layouts" id: layouts anchors.fill: parent layouts: [ //![flow layout] ConditionalLayout { name: "flow" when: layouts.width > units.gu(70) Flow { anchors.fill: parent ItemLayout { item: "red" width: units.gu(20) height: units.gu(20) } ItemLayout { item: "green" width: units.gu(20) height: units.gu(20) } ItemLayout { item: "blue" width: units.gu(20) height: units.gu(20) } Button { text: "Flow item" width: units.gu(20) height: units.gu(20) } } } //![flow layout] , //![overlay layout] ConditionalLayout { name: "row" when: layouts.width > units.gu(50) Row { anchors.fill: parent ItemLayout { item: "red" width: parent.width / 2 height: units.gu(20) Rectangle { anchors{ left: parent.left right: parent.right bottom: parent.bottom margins: units.dp(3) } radius: units.dp(1) height: units.gu(8) color: "#bbbbbb88" Label { anchors.centerIn: parent text: "Overlay item" } } } ItemLayout { item: "green" width: parent.width / 2 height: units.gu(20) } } } //![overlay layout] ] //![default layout] Button { id: redButton text: "Item #1" color: "red" Layouts.item: "red" anchors { left: parent.left top: parent.top bottom: parent.bottom } width: units.gu(15) } Button { id: greenButton text: "Item #2" color: "green" Layouts.item: "green" anchors { top: parent.top left: redButton.right right: parent.right } height: units.gu(10) } Button { id: blueButton text: "Item #3" color: "blue" Layouts.item: "blue" anchors{ left: redButton.right right: parent.right bottom: parent.bottom } height: units.gu(10) } //![default layout] } } //![0] ./documentation/statesaving.qdoc0000644000015600001650000001423612700370701017151 0ustar jenkinsjenkins/* * Copyright (C) 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \page statesaving.html \title Automatic State Saving \nextpage Application name, IDs During application development it is often required to start an application from a view which depends on the previous application runs. Like a web browser should remember the number of opened tabs, their content or the browsing history, or a news reader application should continue from the last news the application was opened on, preferably from the same position. Ubuntu UI toolkit provides a simple way to save the state of any component within an application, by using the attached component \l StateSaver. By simply attaching this component to any QtQuick component and specifying the \l{StateSaver::properties}{properties} to be saved, applications can be restored to any previous state they were before being closed. Consider the following simple QtQuick application, which on button press randomly changes its background. \snippet statesaver/ColorChanger.qml color-saver But let's see what else is neded to properly save an application's components proeprties. */ /*! \page statesaving1.html \title Application name, IDs \section1 Application name First of all, the application must have a proper application name set. If you use Qt Creator's Ubuntu project wizards, you will have the application name set by default, name which is in sync with the name from the application's desktop file. The application name plays an essential role in storing the state archive. By specifying different application names, different state archives can be serialized for the application. However runtime application name change would require application restart. Having these preconditions, we can deduct that \l MainView::applicationName property is one of the properties which cannot be serialized. \section1 IDs Components for which property saving is wanted should define an ID, even though it is otherwise not justified. For example the following code snippet would give runtime error: \qml Rectangle { color: "green" StateSaver.properties: "color" } \endqml but giving an ID would make it serializable: \qml Rectangle { id: rectangle color: "green" StateSaver.properties: "color" } \endqml This rule must also be applied on component parents in the object hierarchy. \qml Item { id: root Rectangle { id: rectangle color: "green" StateSaver.properties: "color" } } \endqml \nextpage Saving multiple properties */ /*! \page statesaving2.html \title Saving multiple properties \section1 Specifying more properties So far we have saved one single property, but as the \{StateSaver::properties} property name suggests, there can be more properties serialized at the same time. For example, to serialize both color and opacity of a Rectangle, the code would look as follows: \qml Rectangle { id: rectangle color: "green" opacity: 0.9 StateSaver.properties: "color, opacity" } \endqml \b Note that not all types of properties can be saved. Object types or list models for example are excluded from the types that can be saved, but all properties listed as \l{http://qt-project.org/doc/qt-5.0/qtqml/qtqml-typesystem-basictypes.html}{QML base types} can be serialized. \section1 Grouped properties Grouped properties, which have serializable types can also be saved. It simply needs to be specified together with the group identifier. \snippet statesaver/MultiplePropertySaver.qml group-saver \section1 Property groups Using the same logic, custom property groups can also be saved. \snippet statesaver/PropertyGroupSaver.qml property-group-saver Alternatively, individual properties of the property group can be saved in the following way: \snippet statesaver/PropertyGroupSaver2.qml alt-group-saver \nextpage Recap on state saving */ /*! \page statesaving3.html \title Recap on state saving The following issues must be considered when deciding on state saving: \list \li - don't try to save MainView.applicationName, as its change will take effect next time the application is launched \li - specify IDs for all components as well as for parents even if their presence is not justified in the document \li types other than the ones listed in \l{http://qt-project.org/doc/qt-5.0/qtqml/qtqml-typesystem-basictypes.html}{QML base types} will not be serialized \li - grouped properties can be saved by specifying the complete path to the property i.e. \a border.width, \a border.color, etc. \endlist \raw HTML
    \endraw When chosing the IDs, try to use as unique identifiers as possible. In most of the cases applications load content (document) dynamically using Loaders. Usually elements in these documents use different IDs for their elements, but there can be cases when the same IDs will be used with the same hierarchy (i.e. root->item can occur in several documents). UID computation takes into account the file name and line number the property's owner (attachee) is declared, therefore the property saving will be successful in these cases too. See documentation on \l StateSaver properties under \l{Services} section. \nextpage {Ubuntu User Interface Toolkit} */ ./documentation/ubuntu-layouts.qdoc0000644000015600001650000003374212700370701017644 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \qmlmodule Ubuntu.Layouts 1.0 \title Layouts */ /*! \page ubuntu-layouts.html \title Layouts - Introduction \nextpage Layouts - Terminology QML has the following basic layout primitives: \list \li \l {https://qt-project.org/doc/qt-5.0/qtquick/qml-qtquick2-column.html}{Column} - arrange children in a column \li \l {https://qt-project.org/doc/qt-5.0/qtquick/qml-qtquick2-row.html}{Row} - arrange children in a row \li \l {https://qt-project.org/doc/qt-5.0/qtquick/qml-qtquick2-grid.html}{Grid} - arrange children in a grid of x columns and y rows \li \l {https://qt-project.org/doc/qt-5.0/qtquick/qml-qtquick2-flow.html}{Flow} - arrange children side-by-side with wrapping \endlist \raw HTML
    \endraw Unfortunately in a design that needs to work in many different form factors these aren't very flexible on their own as: \list 1 \li not designed to alter size of children - so no form of stretching supported by default. \li as a result no way to have contents fill the container (without calculating the width/height of the children manually). \endlist \raw HTML
    \endraw As a result, most applications need to do calculations to size the children correctly in these primitives to fill the whole container. Qt offers advice to developers on multi-layouts in QML. In summary they recommend: \e {Application top level page definitions, and reusable component definitions, should use one QML layout definition for the layout structure. This single definition should include the layout design for separate Device Orientations and container Aspect Ratios.} UIs layouts should be constructed to share as many components as possible. Then on display mode change these shared components can be reparented, reducing number of components to unload/reload and also helping to save state. Using a Loader to switch the QML for different display modes is slower, and will involve loss of state. Instead the above advice is to use AnchorChanges & PropertyChanges to specify all layouts in one QML document, so switching display mode is dynamic - but admittedly is a painful for all display modes and states that an application may want to support. \l {http://doc-snapshot.qt-project.org/qt5-stable/qtquicklayouts/qmlmodule-qtquick-layouts1-qtquick-layouts-1-0.html} {QtQuick Controls} introduces the \l {http://doc-snapshot.qt-project.org/qt5-stable/qtquicklayouts/qml-qtquick-layouts1-columnlayout.html} {ColumnLayout}, \l {http://doc-snapshot.qt-project.org/qt5-stable/qtquicklayouts/qml-qtquick-layouts1-rowlayout.html}{RowLayout} and \l {http://doc-snapshot.qt-project.org/qt5-stable/qtquicklayouts/qml-qtquick-layouts1-gridlayout.html}{GridLayout} components as well as the \l{http://doc-snapshot.qt-project.org/qt5-stable/qtquicklayouts/qml-qtquick-layouts1-layout.html}{Layout} attached properties, which brings additional layouting possibilities to Qt Quick. In addition to these, UI toolkit had introduced the Ubuntu.Layouts module to help developers define different layouts for different orientations and form factors, all being possible to be done within the same code base. This tutorial gives an introduction to layout factoring abilities offered by Ubuntu UI toolkit. It tries to cover few possible layout scenarios, however will not cover advanced scenarios application developers may need. Tutorial chapters: \list 1 \li \l {Layouts - Terminology}{Terminology} \li \l {Layouts - The first conditional layout}{The first conditional layout} \li \l {Layouts - Changing the order}{Changing the order} \li \l {Layouts - Lay out a single item differently from others}{Lay out a single item differently from others} \li \l {Layouts - Hiding elements, showing more}{Hiding elements, showing more} \li \l {Layouts - Overlay items in an item host}{Overlay items in an item host} \li \l {Layouts - Defining more layouts for different form factors}{Defining more layouts for different form factors} \endlist So, let's take them step-by-step... */ /*! \page ubuntu-layouts1.html \title Layouts - Terminology \nextpage Layouts - The first conditional layout First let's introduce the terminology we are going to use across this tutorial. \section3 Layout Block, Container and Item holder A layout block is a component embedding several layout definitions and items to be laid out. It is typically defined by the \l Layouts component. Each layout defined in the block is compound of containers, which can host laid out items hosted by item holders. An item holder is a pseudo-item which can host only one item, where the item is anchored to the item holder's edges, therefore the item holder has control over the componet's size, scale and rotation. To understand this let's take the following layout structure: \image sample-layout.png In this layout all three buttons are laid out in the same container, but green button was required to take the height of the window, whereas the red and blue buttons were required to have the same width and height. Illustrating the layout on the image with code: \qml Layouts { // <-- layout block id: layouts layouts: [ // [...] ConditionalLayout { // <-- layout name: "composit" Row { // <-- layout container // [...] ItemLayout { // <-- item holder item: "item2" // [...] } ItemLayout { // <-- item holder item: "item1" // [...] } ItemLayout { // <-- item holder item: "item3" // [...] } } } ] // the items to lay outitem3 Button { Layouts.item: "item1" // [...] } Button { Layouts.item: "item2" // [...] } Button { Layouts.item: "item3" // [...] } } \endqml A container can be any item, however it is preferable to use positioners or QtQuick layout elements whenever possible. As next step let's create some layouts. */ /*! \page ubuntu-layouts2.html \title Layouts - The first conditional layout \nextpage Layouts - Changing the order As first let's create the following default layout, with anchored buttons to each other. \image default-layout.png Defined by the following code: \snippet layouts/layout1.qml default layout \section1 Walkthrough \section2 Import First of all, in order to use the layouting abilities, you need to import Ubuntu.Layouts. \code import Ubuntu.Layouts 1.0 \endcode This layout will have the red button anchored to the parent's left, top and bottom, having a width of 15 grid units. The green and blue buttons are anchored left to the red button, righ to their parent, top and bottom to the parent top respectively to the parent bottom and both having a height of 10 grid units. This layout looks good in small form factors, however as the width, height and grid unit changes, this layout will start to look cumbersome. Every component we wan to lay out must be marked. This "marking" is done by attaching the Layouts.item property to erach item participating in the layouting. Therefore we mark each button with a unique name, "red", "green" and "blue". \section2 Define the conditional layout Let's define a column layout for the case when the layout block width passes 50 GU, and move the items into a \l{http://qt-project.org/doc/qt-5.0/qtquick/qml-qtquick2-row.html}{Row} container in the following order: "red", "green" and "blue". We also need to specify the size these components will have, so let's set the width to one third of the container's width and top and bottom anchored to the row's top and bottom. \snippet layouts/layout1.qml row layout Note the way the container is defined. Items are laid out using ItemLayout host items. The items will be laid out in the order the ItemLayout hosts are declared. Beside this ItemLayout also drives the size, scale, rotation, availability (enabled) visibility and opacity of the hosted item. The conditional layout is given a name so it can be identified when the layout is set through Layouts.curentLayout property. This, beside debugging abilities, gives additional possibilities to configure properties that are not directly updated by the layouting. Combining this with the default layout we will see the following layout when width exceeds 50 GU: \image layout1.png \snippet layouts/layout1.qml 0 */ /*! \page ubuntu-layouts3.html \title Layouts - Changing the order \nextpage Layouts - Lay out a single item differently from others So far we have seen how to define the default layout, a conditional layout and how to place items into those. As mentioned in the ConditionalLayout documentation, items hosted by the container are laid out based on the order they are hosted by the ItemLayout. So let's change the order the buttons are laid out so that we have blue, red and green order. \snippet layouts/layout2.qml row layout The layout after resizing the window width to exceed 50 GU will look as follows: \image layout2.png Note that when resizing the window width to < 50 GU, you will get all your components back to their original (default) positions and anchors. */ /*! \page ubuntu-layouts4.html \title Layouts - Lay out a single item differently from others \nextpage Layouts - Hiding elements, showing more As mentioned, ItemLayout has control over the size, anchors and visibility of the hosted element. Therefore we can have the blue button with a different size than the other two. Let's have the blue button's width set to 10 GUs and its height to 10 GUs less than the positioner's height. The code will look as follows: \snippet layouts/layout3.qml row layout \image layout3.png */ /*! \page ubuntu-layouts5.html \title Layouts - Hiding elements, showing more \nextpage Layouts - Overlay items in an item host Till this point we know how to define a layout block, what is the default layout, how to create layout, how to define the container and how to define the hosted elements and how to define item hosts to lay out individual items. There can be situations when for certain layouts we don't want to transfer all the components of a default layout. More, there can be situations when we want to show more components when we have more space to our disposal. Perhaps we want to provide more functionality when the phone is turned from portrait to landscape (typical use case is a Calculator application which on portrait is a simple calculator but on landscape provides scientific calculator functions). In the following we will define two layouts where we cover both use cases. \section1 Hiding components Let's create a layout where we only show the red and green buttons. This can be achieved by specifying only those components to be hosted by the container. \snippet layouts/layout6.qml row layout The layout when the block width exceeds 50 GU will look like this: \image layout6.png \section1 Showing more content Another use case is to show extra content in a different layout/form factor. These components can simply be declared inside the layout itself, assuming that those are not going to be used in any other layout. If yes, those must also be declared in the default layout in order to preserve their state, or other modalities to transfer the component state must be used. Let's create a layout which will be activated when the layout block width exceeds 70 GU. \snippet layouts/layout6.qml flow layout \image layout6-2.png */ /*! \page ubuntu-layouts6.html \title Layouts - Overlay items in an item host \nextpage Layouts - Defining more layouts for different form factors There is one more thing you can do with ItemLayout container, which is to define overlay items for certain hosted items on certain layouts. If an ItemLayout has child elements defined, the hosted item will be stacked as topmost element, so all the child elements declared in ItemLayout will be rendered as overlay on top of the hosted item. \image layout7.png \snippet layouts/layout7.qml overlay layout */ /*! \page ubuntu-layouts7.html \title Layouts - Defining more layouts for different form factors As mentioned, with Layouts we can achieve to have a single code base supporting different form factors. The following example illustrates how to support different layouts with the same code base. \section1 Default layout \image simple-layout1.png \snippet layouts/SimpleLayout.qml default layout \section1 Conditional layouts \section2 Column layout \image simple-layout2.png \snippet layouts/SimpleLayout.qml column \section2 Row layout \image simple-layout3.png \snippet layouts/SimpleLayout.qml row \section2 Layout hiding element \image simple-layout4.png \snippet layouts/SimpleLayout.qml hiding-element \section2 Layout showing more \image simple-layout5.png \snippet layouts/SimpleLayout.qml showing-more \section1 The entire code \snippet layouts/SimpleLayout.qml 0 \section1 That's it You're ready to go. You can find the layouting components under \l Layouting. For further questions please visit \b #ubuntu-app-devel irc channel on freenode. */ ./documentation/ubuntu-ui-toolkit-common.qdocconf0000644000015600001650000000273712700370701022400 0ustar jenkinsjenkinsproject = UbuntuUserInterfaceToolkit url = http://developer.ubuntu.com/api/ubuntu-15.04/qml/mobile/ description = Ubuntu User Interface Toolkit Documentation sourcedirs = ./ sourcedirs += ../src/Ubuntu/Components headerdirs = ../src/Ubuntu/Components/plugin sourcedirs += ../src/Ubuntu/Layouts headerdirs += ../src/Ubuntu/Layouts/plugin sourcedirs += ../src/Ubuntu/PerformanceMetrics headerdirs += ../src/Ubuntu/PerformanceMetrics/plugin sourcedirs += ../src/Ubuntu/Test headerdirs += ../src/Ubuntu/Test/plugin exampledirs += snippets exampledirs += ../examples exampledirs += ../src/Ubuntu/Components excludedirs += ../src/Ubuntu/Components/1.0 excludedirs += ../src/Ubuntu/Components/1.1 excludedirs += ../src/Ubuntu/Components/1.2 excludedirs += ../src/Ubuntu/Components/ListItems/1.2 excludedirs += ../src/Ubuntu/Components/Pickers/1.2 excludedirs += ../src/Ubuntu/Components/Popups/1.2 excludedirs += ../src/Ubuntu/Components/Themes/Ambiance excludedirs += ../src/Ubuntu/Components/Themes/SuruDark excludedirs += ../documentation/autopilot-helpers/_build/html/_static imagedirs = images sources.fileextensions = "*.qml *.qdoc *.cpp *.js" headers.fileextensions = "*.h" # exclude qml files that have the component documented in a separate qdoc file excludefiles += $BLD/../src/Ubuntu/Components/1.3/PageWrapperUtils.js outputdir = $BLD/html outputformats = HTML version = 1.3 syntaxhighlighting = true sourceencoding = UTF-8 outputencoding = UTF-8 HTML.templatedir = . HTML.endheader = "\n" ./documentation/ubuntu-theming.qdoc0000644000015600001650000005643012700370714017602 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! * \page ubuntu-theming.html * \title Introduction * \nextpage Styles * * Table of contents: * \list * \li \l Introduction * \li \l Styles * \li \l Themes * \li \l Sub-theming * \endlist * * \section2 Introduction * The \l{Styles}{style} defines the visuals, the implicit size of the component and may provide * additional logic for a given component. Some components have fixed style API the * component relies on, and yet some others do not have any restriction on what the * style contains or does. Components relying on a well defined API provide these * interfaces through Ubuntu.Components.Styles module, and styles must implement these * interfaces. * * The implicit size of a component is driven by the style as well, but it is not * mandatory for a style to provide those values, and components can override these * values at any time. However each style component is anchor filled to the styled * component and positioned to be under child components declared within the component * itself. * * Styles can be declared as Components (like delegates), in a separate document * loaded dynamically using a Loader or Qt.createComponent(), or can be grouped * in \l{Themes}{themes}. When declared in themes, with some exceptions, each component's style * document name is compound of the component name having the \e Style word as postfix, * followed by the typical QML file name extension. In this way the Button component's * style is ButtonStyle. In addition to styles, themes can also provide custom palette * values. There are two themes in Ubuntu, Ambiance and SuruDark themes, Ambiance * being the default theme. Both themes are declared in separate modules, in \c * Ubuntu.Components.Themes.Ambiance as well as \c Ubuntu.Components.Themes.SuruDark. * Application should define the theme name using this dotted name format. * * Applications can decide which theme they want to use or they can provide their * own themes. Also, applications can use multiple themes or set custom palette values. * * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * * MainView { * width: units,gu(40) * height: units.gu(71) * * theme.name: "Ubuntu.Components.Themes.SuruDark" * } * \endqml */ /*! * \page ubuntu-theming-styles.html * \title Styles * \previouspage Introduction * \nextpage Themes * \contentspage {Introduction} {Contents} * * \section2 Naming conventions * With few exception, each toolkit component is having StyledItem as its base * component. The component is aimed to be the base component for all styled * elements in the toolkit. Modules providing additional components to UI Toolkit * can also use this component as base, especially if they want to provide styling * capabilities. * * As mentioned, each styled component is having a style pair in a theme which is * implemented in a document named using the component name adding the \e Style word. * The \l {Button}'s style is implemented by \c ButtonStyle.qml document in the theme, and * \l Button is loading this style from the theme: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * * AbstractButton { * id: button * // [...] * styleName: "ButtonStyle" * } * \endqml * Developers can override the style in two ways, depending on how they want to style * the component: * \list * \li 1. by overriding the style using an other style component from the theme, or * \li 2. by overriding the style with a custom style component. * \endlist * But let's see first how the styles are implemented. * * \section2 Creating styles * As mentioned before, styles are not restricted to only provide visuals to a component or * set of components, but can have also logic which drives the component functionality. * These kind of styles must implement the given component's style API, listed in * \c Ubuntu.Components.Styles module. * * A good example of such a style is the ListItemStyle. The ListItem drives the style * animation through the \l ListItemStyle::animatePanels property, value being false when * the style is loaded during component creation, i.e. when the component requires some * visuals to be present at creation time. Also, ListItem informs the style when to * execute leading or trailing panel \l {ListItemStyle::rebound}{rebound}s and provides * the style the ability to overrule the \l {ListItemStyle::swipeEvent}{swipe} coordinates * calculated by the ListItem. On the other hand, the style must inform the component * about the position of the \l {ListItemStyle::dragPanel}{drag panel} so the dragging * (reordering of list items in a ListView) hot spot can be detected. A style implementation * must use the API provided by ListItemStyle, otherwise ListItem will fail to function * properly. * * Other styles are requested to provide additional \e content elements, which are then * positioned by the styled component separately from the main visuals given by the style. * A typical example of such a style API is the PullToRefresh component's style: * \snippet Styles/1.2/PullToRefreshStyle.qml 0 * The default style implementation can be found under Ubuntu.Components.Themes.Ambiance * theme \l {http://bazaar.launchpad.net/~ubuntu-sdk-team/ubuntu-ui-toolkit/trunk/view/head:/src/Ubuntu/Components/Themes/Ambiance/1.3/PullToRefreshStyle.qml} * {PullToRefreshStyle.qml}. * * Beside these, component styles may provide default values for colors, fonts, widths, * margins, thicknesses. * * Each style component has a \c styledItem context property defined by the StyledItem, * which points to the StyledItem instance that uses the style. Style implementations can * access the actual styled item through this property. * * \section2 Overriding the default component style * * \section3 Override with a different style from the theme * Returning back to the ways to override a component's style, overriding by using a different * style from the theme can simply be done by assigning the document name to the \l {StyledItem::styleName} * {StyledItem.styleName} property as follows: * \qml * Button { * id: button * styleName: "SquaryButtonStyle" * } * \endqml * \note The document extension doesn't have to be specified, the style creation will automatically * append the .qml extension to it. This kind of style override assumes that the \c SquaryButtonStyle.qml * document is present in the theme. * This type of component styling makes sure the style will always have theme specific implementation * or coloring, however it also requires the style document to be present in all the themes * used by the application. * * \section3 Override with a custom component * The other way is to override the style with a local component not present in any theme. * The style component can be in-source (Component) or declared in a separate document, * loaded dynamically with Loader or Qt.createComponent(). This kind of override will make * sure the component will use the custom style no matter of the theme used. These styles * however can still use the theme palette to be in sync with the theme coloring. * \qml * Button { * id: button * style: Rectangle { * implicitWidth: units.gu(12) * implicitHeight: units.gu(5) * color: styledItem.color * border { * width: units.dp(1) * color: styledItem.strokeColor * } * Label { * text: styledItem.text * font: styledItem.font * } * } * } * \endqml * \note Specifying a component for the \l {StyledItem::style}{StyledItem.style} has precedence * over the \l {StyledItem::styleName}{StyledItem::styleName}. When both set, the stlke specified * \c style property will be used. When this property is set to undefined or null, the style specified * in \c styleName will be used. Obviously, when both properties are invalid, no style will be used. */ /*! * \page ubuntu-theming-themes.html * \title Themes * \previouspage Styles * \nextpage Sub-theming * \contentspage {Introduction} {Contents} * * A theme is a collection of style implementations. The style component names are * typically built using the component name and the Style word, exceptions being * documented per component. * * In addition to the styles the theme can provide palette values used by the style * and components. The palette values are defined in \c Palette.qml file, which must * either be derived from \l Palette component or from a parent theme's Palette. * * There are two types of themes, shared themes and application themes. These themes * do not differ in structure but in the way they are exposed. Shared themes are * located either under \b QML2_IMPORT_PATH or \b XDG_DATA_DIR. Application themes * are located under the application's private folder, therefore they are typically * serving the application styling needs, and cannot be shared. Shared themes are also * presented as QML extension modules, giving the possibility for application themes * to extend them. * * \note Yet there is no possibility to install shared themes into the system through * app store, only by providing them as part of the system image. * * The system provides two shared themes, \b Ambiance and \b SuruDark, the latest derived * from Ambiance theme. Both themes can be used as base theme in application themes, * by importing the modules defining them. If you decide to create a shared theme * that can be used also as base for custom or application themes, it is recommended * to do the same approach as the system themes do. * * \section2 Theme structure * \image surudark-theme.png * The theme structure is similar to a QML extension module structure, and this applies * to both shared and application themes. Contains component style documents, palette * description document, \c qmldir file and a special file called \c parent_theme. All * these files are optional in a theme depending on context. * * \c parent_theme is a special file which defines the theme the current one is derifed from. * The parent theme must be a shared theme and its name must be specified in dotted format. * For example SuruDark theme is located under \c{$QML2_IMPORT_PATH/Ubuntu/Components/Themes/SuruDark} * folder. This means that the theme name is identified by the \b Ubuntu.Components.Themes.SuruDark * dotted format. * * In addition to the files mentioned, themes can provide components supporting the styling * (i.e. components providing common visuals in the style implementations). Style implementations * can also provide additional APIs alongside the standard style API. These additional APIs are * typically there to configure the style itself, or to turn on/off features provided by styles * in derived themes. * * Starting with Ubuntu Components version 1.3, themes must provide versioned styles. This means * that themes must store the styles in subfolders, meaning that toolkit version 1.3 must have * the version specific styles under the theme's 1.3/ subfolder. The styling engine will look * for the styles based on the theme version used by the component. If the style is not found * with the requested version, it will fall back to the previous version of that style. * \image surudark-theme-13.png * * \section3 Standalone theme * A standalone theme is a theme which defines all style documents and theme palette, * and it is not derived from any theme. The only standalone theme UI Toolkit provides is * the Ambiance theme. Both shared and application themes can be standalone themes, however * Applications should make sure they implement all the styles used by the toolkit components * used in the application. \c qmldir file presence is mandatory only if the theme is * shared. * * \section3 Derived themes * As the name suggests derived themes are themes which use other themes (standalone or derived ones) * as base theme. These themes must have the \c parent_theme file which contains the * name of the theme they are derived from. These themes do not have to provide palette configuration * as long as they use the derived theme's palette values. * * Derived themes should only list those style components which overrule the derived style or * extend the derived style. The only requirement is to use the same document name as the parent theme * is having. * * Let's take SuruDark theme as en example. The theme is derived from Ambiance theme, and only * extends few style components. When theming engine loads the style components, it looks * after the styles starting from the current theme. If the style is not found there, it * tries to look after the style in the parent themes until it finds one. * * The extended (or even overridden) style component documents must follow the naming * convention, and must have the names implied by the components styled. * * The style imports the Ambiance theme module, and extends the Ambiance ListItemStyle * component. The same is done in the other style components. However, Palette defines * own values, and does not re-use Ambiance palette values. * \snippet Themes/SuruDark/1.3/Palette.qml 0 * * \note If a theme derived from SuruDark wants to override style components not present * in SuruDark, they must import the SuruDark's parent theme in the style component. * As example, if FancyTheme would want to override the SwitchStyle, it would need to * import Ambiance module in the component as SuruDark doesn't have that style component * defined. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * import Ubuntu.Components.Themes.Ambiance 1.3 as Ambiance * Ambiance.SwitchStyle { * // [...] * } * \endqml * * \section2 Application themes * Application themes can also be standalone or derived themes. Usually applications * need slight differences on certain component styles, colors. These can be configured * in multiple ways, depending on the needs of the application. Applications can decide * to have their own theme, and override the palette value in the theme, or to use the * system themes and override few color values from the theme palette. * * Let's take an example of an application which changes some palette values of SuruDark * theme. * * First, the application has to define the theme, preferably in a separate folder (e.g. * theme). The folder should contain a \c parent_theme file with the content * \code * Ubuntu.Components.Themes.SuruDark * \endcode * This will make sure theme engine will look after the style components that are not * defined by the application theme inside the parent theme. Remember, the parent themes * can have parent themes (SuruDark is derived from Ambiance) in which case the style components * will be looked up in all these themes. * * As shown next, the application can define the palette. * \snippet customtheme/theme/Palette.qml 0 * Note that the palette uses the SuruDark palette as base, and changes few colors from it. * * The application can use its own theme in the following way: * \snippet customtheme/main.qml 0 * * \note An application, which overrides multiple shared theme versions must provide separate * style versions in its theme so the styling engine can identify the proper styles for the * components. Note however that this is not mandatory, and it is up to the application developer * to decide whether the application should support multiple style versions or not. */ /*! * \page ubuntu-theming-subtheming.html * \title Sub-theming * \previouspage Themes * \contentspage {Introduction} {Contents} * * There can be situations when an application has a design which combines styles from different * themes, which would not be possible or would be hard to be combined in a single theme. In these * situations developers can use different themes in the components and its child components. * This is called sub-theming, which was introduced in Ubuntu.Components 1.3. * The only thing the application has to do is to define a ThemeSettings instance for the * component which is desired to use a different theme. * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * import Ubuntu.Components.Popups 1.3 * MainView { * width: units.gu(40) * height: units.gu(71) * * applicationName: "subthemed" * * // make sure the main theme is Ambiance * theme.name: "Ubuntu.Components.Themes.Ambiance" * * Component { * id: dialogComponent * Dialog { * id: dialog * title: "Input dialog" * // the dialog and its children will use SuruDark * theme: ThemeSettings { * name: "Ubuntu.Components.Themes.SuruDark" * } * TextField { * placeholderText: "enter text" * } * Button { * text: "Close" * onClicked: PopupUtils.close(dialog) * } * } * } * * Button { * text: "Open dialog" * onClicked: PopupUtils.open(dialogComponent) * } * } * \endqml * * Another use-case is when a different palette set is needed in the application. * One way to achieve that is to define a custom theme for the application, however * that theme must be derived from one particular theme, so the application will be * restricted to one given theme. If we want to have the same palette values to be used * no matter where the component is used, we can override the palette values we want to * change, by setting the theme palette to a \l Palette instance where only the desired * palette values are changed. This can be combined with sub-theming, which will make * sure that the palette values are applied only on a certain component sub-tree. * * The following example makes sure the Dialog and its child components will use a given * palette value: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * import Ubuntu.Components.Themes 1.3 * * MainView { * width: units.gu(40) * height: units.gu(71) * * applicationName: "subthemed" * * Component { * id: dialogComponent * Dialog { * id: dialog * title: "Input dialog" * // make sure the dialog and its children will use the same * // theme as the rest of the application * theme: ThemeSettings { * name: parentTheme.name * palette: Palette { * id: config * normal { * foregroundText: UbuntuColors.blue * overlayText: "#BAFEDC" * } * selected { * fieldText: "brown" * foregroundText: Qt.rgba(0, 0, 1, 1) * overlayText: config.normal.overlayText * foreground: UbuntuColors.green * } * } * } * TextField { * placeholderText: "enter text" * } * Button { * text: "Close" * onClicked: PopupUtils.close(dialog) * } * } * } * * Column { * spacing: units.gu(1) * Button { * text: "Set Ambiance theme" * onClicked: theme.name = "Ubuntu.Components.Themes.Ambiance" * } * Button { * text: "Set SuruDark theme" * onClicked: theme.name = "Ubuntu.Components.Themes.SuruDark" * } * Button { * text: "Open dialog" * onClicked: PopupUtils.open(dialogComponent) * } * } * } * \endqml * \note Note the way the theme is changed! The first two buttons actually change the * name of the theme they inherit, which is the application's theme. This means that * the theme will actually be changed on the entire application, not only on the Button * itself. * * The Dialog uses the \l {ThemeSettings::parentTheme}{parentTheme} property to load * the same theme as its parent styled item is using, meaning that the Dialog will * also load the same theme as the application does, and will change the loaded palette * values with the ones defined in the \c config Palette instance, namely the \c * foregroundText and \c overlayText of \c normal, as well as \c fieldText, \c foregroundText, * \c overlayText and \c foreground on \c selected groups. * * There may be cases when a subset of components wants to use different style versions * than the one provided by the module version. Remember, using earlier minor versions * of the theme is perfectly fine while using newer versions may not work, as component * styles may use newer APIs of the component which is not present in the component, thus * the style will fail. * * Let's take the example above, and assume that we want to show the Dialog with the same * theme as the application but with an earlier version. We can do this by specifying the * theme version with \l {Ubuntu::version}{Ubuntu.version()} as follows: * \qml * import QtQuick 2.4 * import Ubuntu.Components 1.3 * import Ubuntu.Components.Themes 1.3 * * MainView { * width: units.gu(40) * height: units.gu(71) * * applicationName: "subthemed" * * Component { * id: dialogComponent * Dialog { * id: dialog * title: "Input dialog" * // make sure the dialog and its children will use the same * // theme as the rest of the application * theme: ThemeSettings { * name: parentTheme.name * // use version 1.2 of the theme * version: Ubuntu.version(1, 2) * } * TextField { * placeholderText: "enter text" * } * Button { * text: "Close" * onClicked: PopupUtils.close(dialog) * } * } * } * * Column { * spacing: units.gu(1) * Button { * text: "Set Ambiance theme" * onClicked: theme.name = "Ubuntu.Components.Themes.Ambiance" * } * Button { * text: "Set SuruDark theme" * onClicked: theme.name = "Ubuntu.Components.Themes.SuruDark" * } * Button { * text: "Open dialog" * onClicked: PopupUtils.open(dialogComponent) * } * } * } * \endqml * * \section1 That's it * By now you should have learned what the styling means, what are the themes, what * kind of themes the toolkit has, how can you create shared or application themes, where should * you store them, how to extend styles, how to use multiple themes in an application * and how to set custom palette values runtime. If you have questions or need guidance, * you can contact us on \b{#ubuntu-app-devel} IRC channel on freenode. */ ./documentation/images/0000755000015600001650000000000012700370701015210 5ustar jenkinsjenkins./documentation/images/simple-layout1.png0000644000015600001650000003075212700370701020612 0ustar jenkinsjenkinsPNG  IHDR 58sBIT|dtEXtSoftwaregnome-screenshot> IDATxy|UsKVE (ZpZV+Zm]lc.vjk7c[.ZjݚUDQQPIl7Y?MIDH8< 9{~=G M^?,bxZZR(EB)z"`~.c*oTGߒ%T X幺 \oQ,W T5Ⱥ= /Nu@Y>Ru.׃:pΗko?۫;p 6l@;o-]˺_-Ww{YY(**$SkkcF.G͟Kaᨡb/ac#Ơ!A4 cԨz]Zi{[Tv]9Gϯ9Qs i0#fԨizض㺸 i*,$`YPZ{ضx5F>tiMjca&a v&xas#&ns5cIg8mrs3x:yq6Np˲AulL6˄ 3R imme+65~zB VʵloQ!RUUɓ(,* 'Lλƍ  ` 0{ؙ 3R;-=+] cjtAA|VZy٬MYcQ=<y(@& W>[2.`Y&pܢEyaa.mm<ضM0"kl4 >z!ٺg}m1-sxY۴uM+?V_sw4) a3w]kO{ضØ%mΝ_ sӸiv,+עzq]B'xH&l.YP(b't>kcY #ߢ;.ir' Jr qNm(W*ag5'_ v Dt,3O䷯Ō#'3t[)Nus_U޵k ˖2ULs6Biq=|i(dM68s_'xɡ,j2Wsӊ47HU/Hx"οp%?[5|vJ|swB.c yL]W?x3'rvc::[ؕ\j7^؜5w?.4oNǶ*Eس{[\/?mVJQWNw`mCaO.9AmϧsvP(_^4q0'Lg,@f˟L0l@ap8wֶ"£d M/8d"_Y~üИƜ0 *WjXiljSO-h fێ;#yVXD$麰r<jymbZY DdTj[ZTPWN:P:ӝ ׭@˲غu XuQ09waG?˲hnn&`Z[Ǡql\9q&<#h пMטD "׊@4Bw0a r5,"Q[& b{\a?F_ǝi`1 Mm&sIERLl N]'ө/q0@7W\kk(+Ȳq&8p H$;J P`(mgٰa#F%cB! &ҕ좽`(H0v8hzobQ -kG]aX8mxi Ca&@@Tk_AYƵ9q5&f"hPz.Y|w:7me\s]ЎM2a͵B|ݻu_vA)ӴD"}Loj(2!tO#`}f}=dRB# &B pz'MMVbMM4un$= .ه,rǶn-?2[WCZt#ׯzm!f.bfrL?Y7\wr#A-'Ӆ\]9Ҿn-?nsA$Ⱦsme d!|@,H > A$BY d!|@,H > A$BY d!|@,H > AQxw~v9O,,.{*S] 9OĄkxk9)PDqړh- KXq5 S^2b#5/⛵3z"d1(/9z최m==|˞YNwgPu,<B@B=2e͹; sX:y&^z!iB qØtqarc,g|4aFxvř( Znhlw /)G15p }yv4M zf|h'77Syy3 1{%\f3$>3Oi cJw J`5?y,gjSӏþ:_]̣Ocˢ?9/'sMc_%⿦b?hd&W&&ۛXtNwI4RPlt67/D, IPfΐʧY!"ʥuV&yn[NPuwЫ4+92%0mv_Qaѵ+tXFHۤeh\7Mմ3os/Cz NjN5 4M9G`g&# qpLC8> B# Bk-lI8# q˟#<3Ӕyd!z2%<> BL? %-=S8%]BdKyd!|@,.'3;p駑2df¯,Ò駑"d +M? uEC][ Ň b?98R cC P276NTvt-U*] HGE,b؅PWE|HfcEyD^5etRPWGD0҉KY6{ӫ #eX,x7.M/qew ub2fWf̯Omym>"l=f6K&siMvҴHf4p=w*01A8&S)$l) Q/'ޱg%AA2$G;i߸V]]8 낖yaA) $ UTĨj)SOLhdBHGxV?0Vd)E0ZOOkZx=KvVU!+wMp6eB<_W&a /PD[[ 2Qq03"VxSsˇ^h\l}=!%g)E+ jlLG`Ӥ mi! "HG7Ĕ n2 HG7*JG϶ b?9sK9@K}KKG~ڿV,H > A$BY d!|@,H > A$BY d!|@,H > A$Sv-wR"{*˨ ʚy#;q O<ɜTsO;O/ǒkH=z-naՌr~Ott&s︎fD=RDշ߾ ʈ=ZwobϾ˜ F qs|H 0zD~="2Jd<aF@63f%E'^„'cbCFU/o-}~+-~Ƹr!|ѹ*[x2`˛+r˫/ЄCr ap? ]70ÈN'|c J#P<hfSo\ ެ ԛ,I#u9ԝcZlKӚي rN#7:ZӽZeU;BL+ϳem{eS([C4n~OBWw.~y:70߹k q34駾׾բƢ׊Eac=[vؕ> wVQt1l:H6B=#‡'Ɔ2GgDAe˟+}<3vqO^˂+l@Lir^ZPsH'x9.W_o"|j*"T',y_nB /`)R"~ڷXp).MqnHbV iCOgü~kX@䰆ou 2+p= Փ.A^;a܋D27|~z6o秏yxݘ?_hBt!H] K0'bQF#pIDATR_Nj+$uo|vsHgL|jTف{x3/#nWq"c__Bmoo/߬AA%LE?`Ic*j'$<#FdCbs%OݼVXG^q7OO_¡^O7ڨ5׿{/y\M{=|1nw*q>EP5~&^Q|f ̍! 㵭 j xZ;;Xs_ be_Ƹj isRdNͪbv %|i5xфbgsqW^ #Ldь= T #)*XǦ?$.5zX2.acIl"2o<9#.1 (r]<:th4< }{ ̅GDBw\%fS7/Oe#O^و0[tYl:H(>TՅa*췞b叓mʑ8lr7oՓ5)(St RE1$ٮ=;I L֎>{$:ߣ OA5lBYk$Tr6aɍqiƨ{#mZƫm>c޿7Tyƴ+X_ܸ'6x ;%Klr}~珛Ӗ2w/of 8鿻QUlPQhdu5e"[s(q%m: )hꬍ6 eþkPUsq/A'FՌ7ZU+pjJ(|2^o=ױn*)D=q'~D׻xWpzC{ PVnJ*ʣ46ObgPT*/N96te1J*D:U1"c0 wl|˾@B`+B}>>6@8J=G~gɌ;g>X33O4Q6wHIɰoՃ?!w}|%Y-yﺎ3~w%h3<5蹋BO (7WR~{XrHc.>|e޸'W>p!Z)tSo\S4Ȟ{vr? nlKes;8Y4Fewͮe׾G˘ur2o 4Z|5e\=^ݺ /gZC>^k;W.yV~6NKBIc_a dB6Mɉ +Ԗ1oTՖ^F؂L*ʝ{G5Å3V02 aM>e#-<4iA/aaL3c 6PA Nwsۨ`eoXA} F4\Wbn #vrfp;~ReAV2];DJ"xI'y ց鷯QB6v= ðElH6i +ҀφehȤw\8g.uCg><%۴q9T{nz'e#MO\;H7rk3p`Z5ӵ۩)utN4nvFo9b$BY d!|@,H > A$BY d!|@,H > A$BY d!|@,HGFMGc+A5\|8zy0Pzy0OzybC][ L$f>[ ъ <O)yD(4PiPWC|BNHGʹs)=#ꪈ Q:{6s~C93}X2uгb1F}4q[6uaYTy$bΟO˪U&MpS&HȘ1R2cfQ8iF aB֒7 vvf2d::q2<< 0 0 P@4J( .-%ﰾytXaV٬_غ$LN{Fr<<"6MJKLbƌ5555+A!6lHq[VV@0>\"TC̿@ kb,*3;6HGV_z3EC.D.6֯LGhO?. :3 Khh|ffldiD˰fM7ZX AM(b?Q$QM@<"45@x!>t 2GVJGtZѯzyfb9qb9ub9@c+A$BY d!|@,H > A$BY d!|@,H > A$BY d!|@,(cb;mr_X6'%_N35xkqέ۸ XÏvrRaEV54V5Ō؁㞓 JkMTb+wgȊ6Gd6de=Qx1<~'KWsOɝĐc,e[,\k_U6KO21`C!YMa62T4[n=6K;=%L=YSJo'L(c7VerTOwZR 9m5|!ιWh=0/^ a'vxcJLҳӜ}vzxڢ~)jp ^{ \{h&պYC{ZZ$od)?OyIZ ;&DZ>Y\dWLA0-"խP#hvq%P%6EIon0#>ȝ(?y_$9p~xH,Q&اo`R<{M>l&~IWL::WPzM+_UmжͲWa %Z!`YrG<1%FVy$xģDì>Gչ"(w-5?DDoqs'e9D hmν,͡!ikz0/+"2Ƙ1n A$BY d!|@,H > A$BY d!|@,H > A$B@p ɳo|ZXOt-e[,,mNľܱ94-PٷB>A&պ` "G׿zkPEGf<^8^E,Z`BM8< o+>pcB͢E ˖a/]N$bD{ReNA-3Y&C]= ҥ6˖L;] $hnY+0׭Cuu,0rjl;s|!hQ2ŋ]^|VЬ[gե@042{b\?ߤc͞<}ڊJq$:CˀذL qBpP~=pX1{ɚOԴB:hksI&5uLSa+ Ma"(/W$;~{KֺSIENDB`./documentation/images/layout6-2.png0000644000015600001650000003206112700370701017462 0ustar jenkinsjenkinsPNG  IHDR  sBIT|dtEXtSoftwaregnome-screenshot> IDATxy\U]jN'Ngl6CA>*n㣣2>8EbD k4 dtw魺kQ՝t!7[7׫S*{uZjgy""""2v,²p,"gTcsskVd{5 `->˽FVWKDp0xUn?=Z=x@e#chwmKryO~?'=fn5_+cvqk?Ja&V{y6Rٽc٥gj0Ve]7uy~ʈF/;tnhxrF[n#eak[`8ӨP\DDDDƊ.֭߈mەxRWW;סn6mފ}'DDDDdp3N6ُ9 1&Ą[1˲U~*3*-k`5}z 8]=?oSmm8x dc:1tcL%1!a] y9`ٕ>cMqpl{׏QCT3bf7sq̨1-_`}W/Oo/׶L&p]w:O\fƌLLCx좣c;[~z8ṋ,sRJe=(ftuu+yf8c8N%>cW3i̟Vö'O}1Gy]uFC6_9{& 1ae`XCKħ{mX<>X8gƍ#B $ }lq*wbyXlGy8Yg-q"a8|=۷wOP<8>'qNr{xOqK{m""""@oo~NU&|&'ջI}>ȋ>[1 C$ .|"WIm)cl.x?p] 'W3vSrpP=▅9z2f9T \wlܾJ.C,'N߽[==L,9{jP30Ѳ,|#s晧qʜ0 )J7`P/X,ƢEs`1\(WAײx\6m /$>o1q Q X6Tk (+e\ `E=r?Pq)+xҾD:E6TFvHRdS. %3"8qqS 2 2ۮ'sh& 4exRtq/PhO7ߺLjfeywMI0%6DڦXy|KMfRm vʊm#v)z2£R 6%R}=@[1?n&1\]IhJVz8gB ضKLjDP *mG -ɅaHs$l%f(+ =٣1<ò*5er3[[`9;b r܉I9vصwl&)Yqj˧W8FN|_?_<[xr/fAw;/&dʕ̗\= buz=O|'m8 ga-Ǿa68qXkZ>wօ$ɍ 7?) XOr8 N+]AmL];y'E.N彗4e^7Q`UO?0q?ͫgsқNG mw^M_ 䳧bUJQqt񷈈(i >ksj<<8n~b%:s! =;v,78V8lY+V<ח>&|<CʨdD986Ig)l68e$21k:av=4NhX?tυ ?-w>Zęq3J;~68K81 f]뭟Lm1ň[/0LC'`["""cBSն6-HŶyc ww_>2326>e igRO1Ԗes9gk00߱P((cRmUp[f' C°rwRTՌaXNb; r0^ :uOƆ/ҥ27/?yJ;LXiU|9:x?ж˔ϰw 0w m"8E_ȧ '$ *|k{}}u/^z*&̹ v ,ss1l++vj۶좦&S9%kc; ˲SpZ0  }?c nmv6)=$y>r=Y[i_АP&HȆx_硟`Nj⌓'pB$MO[ ڪϑ%$w<"OX>lz\\DDd̈~Uux*mҩ4Y:yvmUS'.yf y~ϸĬ2O_Q}M1ظQڐ"""cES~`c9)MiN281QAǎch!,׍cG' Ǔ*8Xi1 0ae4qGg]Y 'p;l7uhuLe9cG LAг?F ȷ5tq(1EC߫,1NS!֢N3xl[!u^/_h#geyc1znU^' ^LuԌ]mW^Yc l'4Yfbٕ]멼^XYҶXꫀX6Aτ eJ~"iիOEGܦ["Ir "DEP*/p2չO$I_e$y=J倠6XL<OX< !Ⱦ 8n$lꨯ'fq/:[شmwA\I@p`p+Dؽ@5>꯼ W\AjT6ulggog֕W|.Ng9V:Ր}&']o wl;Y2/~ɴr 6W^YWL`Mz{{Yn6lxokPk r@ HvwcOqo7>u#k5Ѡ>|DnȚ51ætw2}!`˖-r9jjjm}köm$X^bUM?^e\b5W1Fl9, c 5WSZWw5&;22L̰w5+֯`ŊW`L}k˜ WװbENl&JvdܴŦʻƍy2eXTF8u̖cUލ!O(#"OqcqacYx|%8<ٷ$JkR&#υ־Vhu@{@qIZ[ 晉D"AxDnw2\*}Cȳn}s]wFF8MxH$))hA+E(jnb[`Tp\>m\v#d*Z"\֝dh߫ )r|_QFݟ?Qup#2J@_e&Cd+*Qxd!Є‰z寑eHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$Gvg """"s(8Ⱦ)8H$` """"FEDDD$ʩjvq}GDsEDDD$-#""""(8H$(""""ZGDDDDr<""""8H$(""""hGDEDDD$JptEDDD98H9ZQDDDD^hG@LjH$ZQDDDD":""""HW#""""xDDDD$ quq.HD(""""Tr<""""(D8.h7BDDDD:(8H$ """rج{|9̯W#?8z7ta=+>v)a|҄)~daKvnĿ>wH7PʬJt%9R5iM» q۾ʳ|GX5|h%+.RGHg*p| 'NJ_۾>U^{ IKkievv2#F9`}/sM7q7O`=tތo{򚽛yB_w9 &; V:Cޱ#5Yi3`cBhmeK(Sopp0$ilE]M>Ŀ_@r;̢Գ26 0̚bK}Wg J7S-c s}>Ig69y,5=> tmΥ=_Fr LLf͚5smł /7W]xj l t,=%Vs0 ^YZydK$8*rc f|_ YN+ϼk|sL'Ìt%~u-y,f'zYAw{LO0ɓ9.5pbc7C: yn`)I:-937v;-:sD1VȜEe&lsydee q%efuY3L9f7.:NKcklV=`ZkW2}9VÌi>' [lQ-D?:c'GJjI}|MmMiWekac\ ?ń8@Gv4\߾BY'mܰ .lEJ2nJ3u1Ӳ/li>WNkVuYi&<6ʦ% 39ff1GfpJ>0X8/lx ۚA_?7eL}#ބa0Ӧb܉I)_ Ugې2⭗`4& &7(L"e?z?I7Mh_yrro}yIG;rj_b3ٟ_kVAqli TtKSm?>~s׬2͟K/49g[X$9WEGb\*EJ:Ǚ^.c8. }6L-p^vue١&`Wl~~8gIyHe,޶bHd n&g,5S پʥ]m=?rPK]:go{)dζg2Ky-N"`y|dOgwVG:M7Wm 9jn^*P =?cs.=ͧƂﺙZ֤]t>2q#zG羅e^fp\33IWb=H&ת)`( \{6[Zw}.!/e=t-~^ L7cOz=PٰЂ& "쾙r=+gy gqcOg_ 7nk<V~|lSnU,{К=g=  O%?ٷw=E\[,f#6_s>S,+%>"rOs7,ܙbEIDAT ,!t>pw}w {qlS ?݋,ys͓ q\agn?|ɳJ˳\#!ꁿ/sv Ci)_v ]Ca݃1ӹlL&I4-h+S[Y2qI4V-'\?Y:%6+~x2-;pn1PRh1s?>1wo?!/_ɚy8FRs#0ǟGаg$e/[WcM_Hz,fjCc&4jOzn3s!a{m2cqj5s/g%\ɝgco۷L5~hu Ucoݔ7/#5ם%78~mˊ,[VfCy]g-1J l&9ao2 Gx.FLy˟[Cw?%4\q-aaKefw2K0ޭKM?E6iэ>-)S}6rG$ZKൽrGO6gCc+2޵/K/Gcm&wlj&5 }^r@#?HܕYkalBr=76g5 0'\ 0v.-OԒ~spW_E~H܍WgQv5S7_Z@}˗~K{⽏V_f'W\Sw+7!E],'MY-ĞWԝ׮vn;Qwn.ݘ佟H1έ7Ɓ4ߺskÛE\9\ę9 $vK%9jv>W=&o룬m' '2&ލ+ymug-ܸ OPv,?QX %jقpef7c0`q;簋欅X~vhTg,c''b緰.cWэ{?k%CP̋ۦpv,c3l/y_#_.IyJ&foqZ<~]=]:_wx񅀣;<"?ˣcUY69t W!tx;03nw6 sx酐tΟ9 仿h \nv`[7|= 7U? x̐qNj{#B<#뢧l(NefeWsO7}~U09bܩV=KI̟]˾z&WZJmJG ̝@ߋv=ǎNc8bGo[(?ʯ9}-GS|05C֞Cݷ"f\9z_n{#M0Lʈh}[|[WrmŶ2'k^Ks{OXOY1C;DH0K ϥA\s8>ۇt'N!]-b1Ώ<I#Eiw]|m\[Wf|^;Gz~Br[|)ݦsfln.i/ls@-7g; ޣ\L|w׾d^t9wɃ?Xƿeqs5X=a߽s'WF-(%Zʜi'7rn?Yz/z+o}wg-pN=).ؖ5z vcqۏ̒~[G-"kX1LcЃ{8HXڱ Bu[21,W`Pf˫R; J%Xj]>uLq[#Y1C)sen;SLL(Z,W#~Z$jz)+?سYv0&JCm'H{ !>Lr&^`ֆnaC2a!RM6.s kæ.mH%!(IEze3lҞM\C²(z;,]d&Lhm6l LmL:!.^NRУTdr`n醴eI:q5'k8RޒE2&|xKnl6S& um\׮RuٽmYx~g?#mZ7 q-ػO =ߵa] =x͋M%ʑxW4}[ -q(xC_t#vYqaiiQM(B٢Yv\A3mX$΄ 쳆u,tՖC&c93ओ,N=8a||]]x|>O?}}})eYK&!NfI|Aum?2ow >`zz0mmىU,tuayLa$^rmd+ũ$P_؈ [C[b'EHW|9O+ T}sl۲IƒdYRu$$z{=6Cg']]X4!ocaېLZduuɤ-rؾy,A@c$%˪ܑȶm!cYSY=Gi+rPrDnKzP9rʡ=uP KDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$GDQDDDD"QpHEDDD$Οx!""""s?^8IENDB`./documentation/images/default-layout.png0000644000015600001650000002451212700370701020661 0ustar jenkinsjenkinsPNG  IHDR 58sBIT|dtEXtSoftwaregnome-screenshot> IDATxyu׷d̑ ! @B `B BW?((."?ڕuAkA.G@`$L&3gzLHBHfR<Iuշ5~RBS…#ֽJQP/\xlMUVJ?z \RǞ쭖uY֯&:HjudAA^=ԫ\Ueu@Ӄ,d)z|A l˵\5jzM{ (xu"C=KwY{lyƛFdeJk4 Oyyـ'!ZZZٸi3aA>a|F u-[c B6L:aF~2:@aZ. OŸDqrϡ( L@)a{,G͈i,m0p]}TXmYPşZOA@5F1tib&(#Bc::؇r, 4Ѿ#͹3 nu} \rJ)-[?@sq4}ܠs{bZ<'LE>} :۱%|ر\7YP`ɋ#p{>UJy.p|~Q,#ϩ=ÀlWv/xض͢E'Pzx7eXNt>L7,._2p JK,ު~!Gn°lR1@rtvAxbǓH( ]9:.+I1uTI, 0\Krİ-y.˫]4vhʺLHmRg;J:60M ;x>ʄrlM dw~ɏy,?Wz6W|TfWAi}i~_η 5| |쌹/U7ݷsۓ;#Y鏳tXGP ~Kn}lN" qxIZa}[|Nux.;r>7>T3md [\zeQTuvNY kfOXۚmVT~;" ;?q\Ep_ck^}? &~*>qQyxz]f7 ʡt{8g|]?m7u}Ll>Wa9Sm4Е u@yʷ>PV{v#. >zZiIU%| LX|9]o ?#Hbsf"}Ag:1/}`1(N(Mm|}'1St>́O*Pȇ{nɒpP ЁO2P(VF6ݭnٯ bI\pZP`_õ[}ܗ'w׾-`^m"=-nP6+{z^mcq@ŠSNُ&Y{ȯe;p^ fM^xmC L*'>329m>+&riOws0Az)F*MPc(ju?}-KٵpT{ L,'Y}k9 ƐFysa7#'_t{us=wGw} G0u2 2\M.~Z#ەC[)s^ܭ|9vP\7ˣTq `JAc|5ppwz@ۆ_<$am_w<,Z: ǿ?}2TX|GheG!c W*׷Nj1E={ ]k0L6tn~ \t>3b&sN1%m`(3y⨵aRZ AWWWG2(ŐAP슗~z_,Gɴ v28/I>eX??(atE ~}(Ēk}N%>t S ;9/~ƍh+tSc```YMM;I&R\7e؈mZ-SO=;s< =XFC.4%W.NJ{y}ٰk1sf;d{3M]&c|3;oy_¼O]˯.v cOORf}Ugn``5}Z{vlnK25 {Ή&}p.vx.y,cJkW Fs찕4o|.^>:[]-PR5̙34a+ݕb(EgWM$%?=S8VFJ>ΜWMI£`TEoQ6pf_2Sgpˮvbkcc*N߾g-?}D] 䨴lkVĭ.kÜd6mlٱ$t?W+g[=VjщkDZ&`PvpMe'iLC ưlڕ bIl;OhB?8 }Fy0- ǎa@k&N<e= ¹iCV0;l%/Z7e_ZMc(pqЙ#SS!,kٜC,'KW~Qcӵ- >~iC2ab.>);-ڧs:2h[9b #{8좄/6\ng^̇AɳYwĊoa0rl|_**%wcW0Mqr <6FMMD8I֭۶h$8o5&%k]7NӳAX["QbѻMIr7ٞoQX txrpc,b1\erC|;Dc,R##0xݳy,7EI"N̶{r[[C֭HRJq2: ˑ褳3C̉c;vUOR8[`˖&J@+PB@gvc۸%Zۯ8xԢזma.APm>W易ps]/<'\abe z>sbw:6 2\2 ^yur JE"3ozZTCÄ>o&1$f=-b8[2mRݗBoBܽI !} D1lb8bxx)2֑]ڵ7mmjdr9~7 e8f*=j H͜IbTRSbIGuX}keS&2Mdrrn? Pa)FF1b3djTL4ߓU?-[عj-wIf NF1)gxCv!Ę3c7-[XUپN:ÃkT2o6 n3I2z=ss.*k--:oiߓ+\uvZWǎM{%d[r-=3褮Mn=%K/An}1ի__OdZgմΚşu7ю M}V3vP r%֔_Oa}z-! mkwnSP y3%8BPoi!#Qcc3CZ+q0ā:y7Þ @qjkAmsdp+ cK\nH#ˑFU Ba("B/SA-VDx9M r#-=~ 6^2  A"$BDY d!"@,DH  A"$BDY d!"@,DH  A"$BDY C(>&0<>;,&U=p􄫹k8xXzW?Ϭϲ(1|2|k&"Ib"#k\&~MNPe5ɷoAeqLU[PY'_ QOt^/}C\}e!+b7Z1y)V~a0I h6㭝h#Mn&uoQoO夣äX6=ȣ-véd|I6L1!]U4mte h'NCid1駡4h]Èzs~*f䷰9)K[~ ]v zZ&z% .ްs}%k.瞳ΤҦǬ>ȧQĜ4=+b# MY$bXn_\˚3d_?M,?An=Bf~=/_a)҉U/#'bm=ȧVgNQ1{p+/ ÛeI0yS@0i ~v)^< L 6^ll">r{(e47b*Mke_ ׏ M0KZd19$YX-1s rdrY72cV-w)ϙQ%>JL9KY{HV$ڋ8ɧ8(]kz#h#zuer̀mTߟ_K;k9f\#/n{FAgZb(v4- R1LK~=8']I)qq'?Q_ȍ2߼7g|]|9T55*7c+b5#~v/k,܎0?{/k x޺5hl6:ӃMN+*GMA^NJSnSK,5_|ܞeį:l^l4QxQ}PGglI($&v,7)IT2&fSm!W煕M²l iptl1ʈP>]7 F. (}l1b[^Y)/-.qi -X٧+[Ϧ3B%-C9|y~yrg:A'; c# q3MCΑ8Y!OBdIsd!"@ΑKZd!ҵ" [d!g%B2,4eYÞ v 2,D< OBDiI,aϔ'!i`;"dY !2y~wG CX2td *˰dHޕPDC̊OC]q93UI RPWA$V| c 6]eP3jLmR$GicQjwXUic#h"f|"!q3΢qX|b@|DQ3sW|rNz#PI|rV]Ɍ$2,ѩ,ٺg=۟gcF:ΡI;#fn\揝ςLs;IXv2Zr-V2 97G 4L e㤜e2Vx9J{V#L:G r,DH  A"$BDY d!"@,DH  A"$BDY d!"@,DH  A"$BDY d!"@,DH  A"$BDY d!"@,D Oɟ^w"puEn= j\_o5ߐj=_u=e" #1ĉe+`G3v1 /WP^PW`2E-v!\^3̅v3\n?Q%20SO}Aib>p_0rA6̆QsPl)h̠O6ٻ·нBwxytQ%kgA2@W`|?q!Um[P}8[PZ*%J ~vOmgU xN=cAr~@|al{EC~]l̹$̣ˏAR J-'1Dw KoRJ_Hr՘8e'NAy̭1q@=0^lB/J FC>zAkS>1!ަ2ȤG4~; ^ۈ l:@u!6pe}/>F^LL#ލ?ۼU%5wm(+y f/cm-Iu/`LPB;j:…889o@ǟ]N!:^k(_7]RD0iā;n!(C=| ?wY AGدL:7>G?>58^O*>H[iM[\WAb>佁ub\pb} w#S0\]ME}PWCDwϯ9rB}vQ [YهzA[|nuy,p-u#]k!I  A"$BDY d!"@,DH  A"$BDY d!"@,DH  A"$BDY d!"@,DH  A"$BDY d!"@,DHk+ u2[e 6ijrd|rPR"7HLF0!̙)NM0d7IDATujJ[dYj'wš5I`Lz;gj(şyd9s ;s͸q @|Dhiq|s'cѺ 9*:;=Zٴi\2yDxVVI=Yh]A}}իw0kV+ ]G<חJ#CuK#&L (Qd2%ll#BC ć/[ BC*[ !{_IP( u }l%GJ?5K >d!"@,DH  A"$BDY d!"@,DH  A"$BDY d!"@,DH  A"$2&f;=r|98&ߴ;>@V/懚XHM6PvϷmЕ䶚tL{vt&Opm9ʔ&m+fݱO4VƦ"{hZg8 C ҵ@)3G1e(}ف<_N3cHN[G|=&DŴ%y [\/WCifT}7Kq}B)uXQLbsJ?̫[p} rh^&ANrv*L9V(P٤0cZyz~myn+ԌӘ/G^9I}_i;cj`MŮ{Z]ߖ7ZĖfϫ <8OIZ ;NZ Otql,n| dbˤv)TlZɝ\Qj]*\3&Y\tU`m7;@ ?f#Y )7ж77e)KUQKk}9:r0Du6k^P]кŤr9RÆJҵC [tv@*0yOw X gO Hhҕs&Uq~EoqMIn^xCo O§R]֔q 9babY {KmvrȭI2vI/LSs{>E* r-Nx࡫Q6gQW^1v;?>_[hT ?iVx_wZuz_b8Zoꪄ 4AAQQte@;>S<%>cF@aACkq^${0c'Pdb&a(\,ML)rno}F 9gfV0tuu3EXlR+LYdSs2ٮyEo*y[@CWi ܟ# d!"@,DH  A"$BDY d!"@,DH  A"$BDY d!"@,DH  A"¯5$ϑenaѵ%_oUʲ9βc96-DX9b>Aqj]q8sFWwt-3ʺLHJ6lG$@&9=#-#Ã[ rm-i[l$7iBm-izt4=jk c48*iӘ6͠Jޤgڴe؋-"LJbE/fbE40x[E4@1Ό+W._Ntwr̕+qf` +M/wIPWOtZ|ʕ&3fK=8d < 17nDuv,0L}4j\?siӊG,Y3M:;4ɤ}U̟ Lf~ADZEO^ ZZP~k+:ArhiaqT*YVCy9կg+ε4Ilr9EkO&4A/-p` [*(+3MˡRNVq9!sb?C)IENDB`./documentation/images/layout6.png0000644000015600001650000002211712700370701017324 0ustar jenkinsjenkinsPNG  IHDR vWsBIT|dtEXtSoftwaregnome-screenshot> IDATxy\U]zI:[wlHHMDtu^qyeyǕQ_Qu^eQ gFP@ ;NbB6uNҝcy~sOUWկro9K#""r4\qp|Y>6rzee/ [frjRf?{o==hۚ! ueb{sFPf0_w^Rfe;geK>aej)s2X ̾ S~Hot. uGr 0& OPn}DظejW^~ |Tf= Yn#::`Xd1F jd׮.oxuk!t֒E4nDtuMqG9bL}ؤ#<<X#%*GT/#nȋ? 1!#* ΢BzxllAG1jiӦ1qb;c5]رc;/ Ȅ!~z< pjqLR3Oe( "]]Yv-6m"x^]#RJH۩=mzs46FTCTcCϝ;B&4q]p]ףXCm ]" =$II4q]ϫ ŽGEAOOEr?~i:|=۷Ed0BDt|? n,@DD^$==CKMJLxyəgLJY9\ҙ~'8IȄ."<ߡX,Tq\|!.In''x_D Ճ_46⋹㎟S#B#}pȎ9pI!|쬙;TJޠ 'L䊇ׇHSj.ØR_\音q8Kq⻵94MV*'P+ X쬁z/R2 I(K~dCQM 8.a.GcρZT{mppBS `ez"6d4=R}ezK/ӐshC\B̓#"rF28 yƙ>.:l/En]B^ȐzPhҶwy>Q3qb;lW֥i:?[_DE1\ٶ I &P=Gއ.(7:-R*py%sbkof?_[8.pIdq1l|~ŴsJ[yp{;7$*W7i`*tm|o~fV&iCyo-X̬g6GMGl-'|6fn`uW/<,„lLycsܾ$qJ[{R$I! i$}rM/Os=ESפl|C^f|R! 2Lfނn5;f9>`DNH3x&I^n< sWq3$Y)8c萾RJbR&X21IBsG5r9/jb W3r5>Y&M{ m!3Xt|ODo>@=OBŐz7i09aZ|?5ZɆݼ0&@&LH-M(TI}vIoh-LV{Q*_ z`ݴJrQ+P3wuanzcnU|c˩W <}.\13dY\KJ8cRIsq>/:cr4=`o{ooyn0>t lLw;gi~>vz{Z>g9ɸQi> <@5 ">9\#_P_`Hqrck[>͛ʜt'qml ta3qXzf/LE{[]dBW1޴L?L;YR,kCknR_cjCqry*J)^\8I{w0[z)iZ;+CRF`8^m!A`T I5b?*9=?կexӹ?-SkINkpj+oc["K{s&&gx^?""pu=㥤IlO̗W 17S- ='8)u+qkWڰׇd5-Zؽ^iZ~^C=P~\t:1 8,M/MHڗ modsyӵi3&j6s*쬱\{B(+nFzSi -D#׹E|u\e@CfU;>xYd:c^=c پ}|$IpMg:Ogg'[O!կ>qDz|?8S>mf3\U)E`GjYu5̉>is]U|>q:;D⇏-jw}Hwr?<6r[?MoOTy3k!0Rϳ)y_cq"rF<' M4ҞKc`( IaJ!O = ڛܹ1cȄAw:x7{~i&ٹ]hh(381̟ևjeiZJCo_; o M!CkD;+No!}˘СǐK&U,;YbθVښ cw}\oucJSgJ!ׯ3]p3FNBqz>_ľ}>P=&PgًM/ xOD=\3& ,t;H9'jISCT)'0m3d2.ibXY<' 23POj 3fLqk==/{:`֭[8sx&RRk $:\u;BrO0%eJ ,RX14s+IL%gWsq Bl>/e Q5RMHw B9C\(q㺄ِIݫ &VaVC;N(c0d' |pMݜI M\J>nԃ*IkioP[2]?V_{ؼy a`=J5k}\hb;U'6mz4M >x8o.a.K¾})GCcnqr 4Z| h<~!}ooӦ#"r LcQPdy ~Dғ+x4*А˒ Lpr\ǩVٴ ncjG a9@~6]=}=wOڜN(:n[yjXApA8@1Tn}[0Fc"#`լذs4z ٺkVlUE<B[*O1<LF+D[zwRG_.g-0ok+vx9,iW70S&.dTi#; `֯7?}'Ms7,9-{1s$'zP] 'SH^21C?yp)H!</yQ$K:%y.71$2-LF:2ft%s0OxN*_GV6R*s˦y8^ ujI4U7ljNc~TƇ.vmX3j N:d=ߖ⡻M=84&WILiVug/}1q\!xn&aϲ>8|B//~(1^ g[(Iܵ>1x ?D?Nz`4OuTNJ:@#+|!_|!4pP;L~@/Ȝ]lK0~{J{xpٶm{IJ_7{)$Ϥ.2Aʖn>{d]oxTn|kp,ХrVϸTF(eqP g_čډ?au&7|r.%އ0o{z87Ӱx9 ']F~v ϥa侼uo ig_?"{)4; ;/#|sԱ)!1l]񍅜yǪ-4L|/_Z0[Ӿs)Knx=וӗnX|\κ 3F>݅s{o''V\./wJglQE }8^B/$LB'Iį{%i,;`9SOFwI*~fl)'cwIqb;cfsOS^NĶ;aJm}ufS !i3< A0 =OcN" k~Zk3ŏloNN㎅l&^vU =lAo2Yp\J} MxϾt4pΠz7!h'Vp;>"9Wc&=7q*_$}dBoxᐲN"WM;ӲU>0jQrlvj ƭ˦_m׀Q:ʜj 1az.g._}Iu L@3xOMQIR|/ml+?K~R:o}kMq+_iqg)~c(屻_ ] KqG[ 8f'c1sNTǿk^4ӐôΛ|+o&5k~F~{Gcdk1m9=_)7-M_w{ 4#_ vqG_#;_K[O&k\~#Ɵ.~#c7|elBmVz=b  & m-fʟO&eo$dF}$88}+o5@ZeWi:~)p\RYu%`"驣q|vZ)9>'Ɋ$ q'?}E\6[/o{Z~~ cٹ@C >Wеkm8mC{)ޗޗ*=(!|%۞}ĕ.r*C!M{3gSC^Vi>T=+5$Iy?aaH/*!S⤬yF4EDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5rE"#M9.N=~߷UnqwkS ^H"#m7A Cm9'IDATn5l7AqBjcDW&nqN'4z4ֈbı'!20:7I=fD;}a94 ;{6 +…64]h)"Ǖ 7P|9f2ljDQk++w}\r%VM9.d,&/c@=¹svK/4iȁ3g4\~9Ͻ/~?3[fZnKg\svj|9ر$\>yIqz{q6[.cfœy&d-mn9̻9ȦGx1Vn_־il"v<ӛm!&.bɤ%?{`ՁS%8,…31_ v$]]bS.Cbڝ9&p ')`8ce5e'_ƢIX-[M_(Hc;%rlxd,@KeTv i=6|=NSCr:O[cmm"rЙKEDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5 !F!$""(DDXkB""bBHDDQ5 !ny Μ8{^/IENDB`./documentation/images/simple-layout4.png0000644000015600001650000002332612700370701020614 0ustar jenkinsjenkinsPNG  IHDR sBIT|dtEXtSoftwaregnome-screenshot> IDATxyw}wU9=,˷-˗|ȇl1%.g8/e!N` Y`cBnbs8cƇS1?g$Ki$9眥H$I : c1!{`^l/Ӯtk}}aᅲ }m0lɍ?㧓&'14z7ɿ= כ?Wgz@m8+{e'ĵqT[c=͟,Pe8{z/Nj}T {zv e:z;/f~1zO/f?k~ǿ}zWI^k q$OV=Fa@P,#쳗2} E$Ild#a;luL7$Ik/$I$.B g^h(˲4Kv/Ȳ kh7-?Xoj0d5Eaw&$ILPHN,IV$xBQ,&+˲v2,%$!MS,#0(#}C,OS "0CcZMx$Itw,HӨ7xQ9o 0ʺQϟR)S(vAg&h4,\y?ӧe 6m'W#P.( lvtZ-&uԑL>n?O}{Zr2{J$ijWIB+n򡳎0Fct; oXOǕ?YIӺA7,?Ybt ;TA@S,83S=il4x0ё}iQ,Y:SuG[:9ˆBLow0Ke4NI:"R@L2BJ*=]6YghއPJ9ȈuGbݚSE4G ƴ]U+Q}1aDZ\}ԑ$I҄&=ej\6Ƭlxp#M6,ꯍoeesѦ&QT NZ̛7@Radd:+i:>;˰s3cV7u)E%8aΜ9tj:pͷj.B8~z 87KObhV=~P0 \t|NѻYx9:qyؚԛ1}8yNܗIG.x5}RYxW|ۏU}xpXO@sӃoo@+ޘ:.:~s@y%+5|:J]RFJ3QZ-I=VUZH[1 qu\Q>yj`T۴q*7% $s%IcHg옕ni\֬^C1V000z]gl׋/չ[ hk֬^;'A\,}ȡxaTl8񌣘W&qPya]lN{w$Ibgw^q$[׳Y%FFS,ebNgh-4qѯ~жMgz\:iӏ`3FZ<]W_:w.%I&ҙw HC+Yx4sr>~KN;lm/8m۷ kU$i"&tj4wI E}#& ZfO3&IZ ]:PI<^{q?kc?ZMw;6v?$o2/#YgVk?1~QZDx&ɯ>~2]M_jޫфYϾ(\~}wci\' G8C _I}ԹfH$oܐؕ! =1/;D|=朓8!Lk4N;K{AwLxsY:ofvtuv}?;ޞn].wvj-\̡{m(U}hQ~XZ(CnS"J6AkMsi\wwsw-y^sfl~([oөw% N4#tr[$i&Ff햎 I2cl5߾+:$c}W=CF햐]gtN[H 3ֿ=::JgGGul[7̓Ꮀ%4%MOl4ɟ,}Ccvll84oLQ-<pmi\ =,m kldN-;h<`u`}IFn#!È9!JIlC[yEg'oXێ"aPag50 ٲeZ]" ! w2>  d:'n֩vl;V+ 6!馕l`1sc*߆->FeZ6I*UU+Wo,0i>m&k8\ Q["Yyn~u4{Ӳ !A7;:9$Ie&IR*m0'lTtUËz 8g,WF;G%nآT"$P(qj*I)aEnapB)F=i ?ٝ{|VLfu =>,]]FcJgjv.l pƼsC/^^; Xr%F5g)&VFj$/zwT oo"TP2uFzIP#Do(*m@R,;}YF܌i4%jՈV#kAR2F8&UG$I{lvբX*.޽6mVN yMF9Zzh;P*4< i/Yk{X`Κ5kRԞfGf>j͝TN'<ēiJX촰H` )U+`׹񌈮ꎯbW*wh6,P*c"]=Ghl{ Ҟ^J%j{1N0}֑$ID&_GѠ\.WFYbyu# 1=a4V[F<Z\,g߀u:a'xn{jT* $R:Cۇ\P,  c|; J2qǟZwr YAFdxh[Q*(I=,M(InsfQ(8&c4!M30 #"bq™㱀e֏f+&[NKIFDB +ufܢ:#L0P(IJjὴb)w$Is\_f Hju'g|f: ȂrX&+Щ5v}Iӈr)\,,WKIR;{ڒ$Ih#Y{&>l$I~L6$IH$IڻF"I$ibn>Fﻏ{#7 dI3PyYO 05xT/9o|#> H҄>SZnz&zAzlq(!4 xj?qSxْ_ʡx}K  [iY#Kun?k[5P[߬ ܶ6Z z[aVl]#?~mmy[n!w9lj ڒtP*px2[ykku})t1!dՌj{w[ƾ +yjYf$d` h\w[GrݽבdIA(+f<V<-I8d:VmI:؅5:)dGoyxTC4 V;_Wam6r,I>C$MB3ivnr,Ij$$iZI;_vLX$I46S"I:%Y;_vNX$I4v$Ҭ)$Ieؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$Irbؖ$IrFQ4c$Is(2lK$Iy0lK$I9`ؖ$Iqg%I|H $I lK$Iyg[$Iʉ=ے$IRN\O$Iʉa[$Iʉ=ے$IRN .'I$å$Iس-I$ĞmI$)'-I$6I$)']0lK$Iϴ`϶$IN϶lK$Iϴ(rmI$) )I$u%Iζ$I$Irٖ$Ir$I(*x$Io$Ir:ے$IRN ے$IRNq?I$Wp?I$).'I$$ S=I$ʰ-I$İ-I$İ)?Si/OZl IEF}5i̺M@.I_F$i9j5ɫz_/>KzRO[\uXP3 }[տѷ>;9t4+s؉p.KȞAq*UT#G WؤZk^A2P{'IS/ 9zz?%Sv<㈺O`錀'lfpܼ%L}MEWrغ&oY|_sGkJ.EGt>W j H^|y-Ÿ@5;vYp"':OGD<|%{~DO[/O#;,KzbdNz dIìSH6\O=4SI|$F O"3/ 7s= ,Y'sJa.l|+ E?Ym̯F[:ry'sh~V2=sJʕ +E ۥZ RǞ`a?N`]Y=9m<*'3IO~ '8$Äk?!_x-F߾On I?2H샡~W~T?30}GId=%x3G8vP~Ƿ~&HA$f6>3/姃/Xr(6dvxx7~kysoI}6)SnF{?6)[|S#jK})AP8|;\x}4[;3}&F#i:<FөE"h}}$+?Juշux':^Cts9ktx?$˱1$|#Sv" AQַgƟI:HAƺӿc\xZ潝O:w'2ξ|nq9;vlwYr?|.'|򺣏xw>w|r+9ss c7yqG7gkOtH{e%Iw|Jwm#/&Gݽcݳ ' ꄿvwdK3=!{$9gpw<^zKxٰi39n[glX Vfs8@:r/wm{>@pNǩ2c(m΄tq_[g7_ޚ챜lDJ/YDzh.)]va gGG 9ϧ.\4E(To },7'I-=Qt^u1;"py,a8(EqbTmOYx$'Wl\Iz\F|sٲꓼWE=o~~pKxʍRRSΰBl%XJ&].>z3{t_c"+X0{~kȼF&HR Q)!bݶ Xg_3qG߆`Y>_pƬsytpWk勹~$j)=l#a$KGv±d_Pa5WѼ*ٴ' g3Lt牶O3OҟC pV릷z8jwEt)?qrW7]fX_xGz6Y>U+kV= ?.}3S032=~jM!g5uQPF~By٫(7o$?0]KiL]3 ˂Ť(摞4&^76M &%IiO} ­"+|?KBʪ_?oy|?B/A,k:;cgv"dmM qrW?u|%I4Eo7k{kT@Ҁ؅5iIc ;]g&Dnێs i7e[@nWEZޱЩfMS?r aMPAjD5f֦śP3~e LfFud=+a0ъ;(HL1kPOw QT5iY{ԯ&.fu IDATx{]U}{ۜ3LL!{K*R4>xCEEx)V*JQy4rJAHeL2ۙ9}Yd2!WfY{I曵`)bŊS+߂1c(n0ZqZ) yehC^4GخͰm{m7#s?'f@W8av=B[3һfȷx}_R#iWjsfП{0y+9l#)`_GtJlߚ=L3l_Whibvw_j$Jmо^hen]#lv++wb#|sS5߬0=ÇmWK/cc sXN;jZDDd wuv)֩-vX%""2DGG';v9ḈXr]Na„MLZKd#lT=>c+n)](n ۙa ۏwu08Έ3aB &6} Ck\xAZ[%k6C0$""kq. )]6֖/~p\qW~ާDIw_ZKZ/p&Oj2)fsl] -$ <QEfΜɴiMOkW ۶m#żH#.L (4551{Qɐf_dΝ$qpR"Њ q.^؃'<[]9Z(Xwҙ h$QQ"`lk !xߋO,U80È( p-M86>Xl>p+ihB m͏>[TAm""@ww#.p|R}Cm74en3ڊLD27Q,H~@*UEӴ&m% F2t7p~?xh/E'?=oԏߒ5S8\yәZS{!7=kLe*6wʯ[ј, z8krp04\.GjGE}Jc(hj,aHSS#|M=-C})k&v>i7 ;|R I3Xt  ,zly-8ǿK/m8l87> }\55vZL1ib\Dh#_W|mhـ0Vw%>vd9uOqyh 4r(Nb,VL˵|ckD·W"KDFGyxqCH^lpJ-*r\:lCtLQw;Q2=" ($NS,J{輸va*-lN)OCՍQ|\qn=P؛?|dN_6~[,_oN (ǹfYptܧ_$"gtn5i \ _y'AMغ[޵s!SVo6Kߺ Ol{hx~Kfٙ3p„3ϣqQDFÑ/(/r~DSsEF޵b1 ]nk AE}Swq+Vҿm"c'r uiV>(sC,32,K<& ne~|$1\ [av UX}׳r-r~( S^ ᖫGQDQ(ʣ#?Y--}'rnÀbp\%,}/p%m|E\z!3Oy+:e?1:lpg){6pI/B3%X9~\|OkuSlγҨի0Qd3̭/f 8UAuu488WƢ1~J 2:;XrDQT|tG>AXǐv?bCXHcz.8*֭ؠ*?g/榿>tW{]4d7* |*ЉlWc||>zL'o0%~^H{qSAhcj|((Ҕ UرQoTֲ!ɔ~{^ک4D6dƟ_̊>\9Lgj ];C_K*ׯڳq\M fHzsC;U#fB{'p)0CKJ@Ӂ"2jOx-ˆZz~8^.=ib~Qĉ'}ӛf=C</8OP`˖hjj$J Y}<^ 85x{?6~P,,tscDaDC>W뵰O6>̳EDAxtScB\#J XpdGHGqDK"G8a~q12}RJߧW}JI{Oks7W=%(""2^Ӕh}qn6۴Rض ~l(dž!DGd8uqILؤI$f$hy̛W] +Ovs;v﮻hNI0 H./ֳ DDon/Bt{i%K2&_z)3oog﷾E-0Zk9yfnFŴʁձaBZDDdx@$[Zػ~=噾Bs3՛7+DDd\0@Z7o ݾlVa%""YہڳXV%""2$r`yZd!""G)X6zDDDFԗQ۫űEDDdd*Ve)"""#+gT)p,KY9JxU(}TTTTTTTTTTTTTTTTTTTTT{f]Iί. #GFDKuj4=r9m WXrIYX/*}{(sQ#u<`N{3ىf*w?@/Va((2xu "c< 99܍{J7-#pQlO~z'; Zf<³DTݍq_I)n qDK1hb"/Xu]ǿÏR{ߓK/̤7{+$g:w`,/cUS=K»;dWOB;`35P*i'vH1ɉ\Q`n%h)˨[MoYKղ5N>~k]޻SV^qn"s͙O>9Iw gٕyizR%}uxݛ_K s-8{Fgy ,!Io{a*KJ/nߌp1Q݀QynӸ;3wf?PM42M8 -xrPEFP3h | 1 [aڇyE~E$6g~U 'WAU>_ͶMI~?aT5,:DVX;`ͬiم ]Jmfew<;Vgp.ŘMy  >kX"ei9Iؚ)D{v>A0[UmM4{kwE w׈ǘZOo#~?㿇y}q]GװXg:fS|h#=["O į/~9ǟg< O(oe!t a( nS#v\gq:9Du<:r6Du1zk4S{X#2:$\(_+nb؆F P@4!9Q,Zt!""AaHE}X""R]DD*i%""ղviхZt!""AaHEP`HE(88c]oYRPDD'yDbI$JǸ3p31EDDd$}UaMH4Ո #8 ]DDƙuatXcZ`ac#@9bVaW$J&Ǵ0>Q2]تU@9 [f fL 55k[G|B<(ݔ_pds΁'>4̘֭-""w4 '`.qO; w[?$xKbgƞwcyŽl6!a8V#""#-=$L7:LCfЌ!duilڻgw<˶m'ϒQHd^DD^;8K2$0)33Y4cy̋ͣ:U߾?v_ŝOK߷"Pڀ͐E%Sp˸M2~Pvط[h-:pїf=|W(ֆ7~zZl܎i""rs,-oZ^mlތ)DDd|14okʁ{;Yhd޽(֞= ^9(VߩE""28匢S ?/bXbDDDFҗQ@cZH2(""S_F9(""V_FimTTTTTTTTTTTTTTTTTTTTTs+]Ҭ:&7^_\w+ioZLy]~='K&j3B6|Y?Y9vos,Ig1щh>;I;ʅxdzt, ];)Pf晝lɗ޾Y=>=?cFLDkj3,&0?ۻdfkf`_85LUU=/5ǽىn6m{ۻˉ7p|U \Ƣ.0i߿2ЛVc^}js*scwX"[v>X,7mez :Vf36wr}lYjkfXzәy=pՖ}+ Bj Xy?D/*U9?V)&Rs{h G숌 , 꼕˿}C[N鵜dȚ S3?^GvծW|d-Df>lWkXbaoegr{~p P?\{|+ #X"HO93Ryc*k^Lqb')A<՝z\Z.~Ӻ䴆P͉&ֺV Qyl{9_JdN>epE*KdR4ps=![۷ 0ʓ "^)"0nbH+Kp\CN*aR +rorQz޳^S?.ygÅ=AhE*Ky~cqs.8}R>=;dSw}9qF+ ./mڅ͕GQsdҖ?gh{y]вv9ut!W dSS?¾{ukדUQ͒ y{䛻oq/̾T--/MO#7q,(dS4VMa1oϋ_N6xF Lʽt E<X=jSDH4%n24LKu<_s8r S,エ5w>l{]wnbZDFt]0O?!bԤNTQfOXHya+apq[ WN-$H0Z O>8a&!2 IDATۆ-7՝?4’cAא! ^in}r>,ag`3G5h@zov~ 8F%""S_F9i1"""#( %ƴecZH2$2cZH2vLʖ3r`Mk1IDDd0׺Lk4Ǵ(Ӎ̟2(֪VrJnrL tU'ʁi!떮cͬ5kƴ@x kfau,lZVəɜ$O~[{ƴh96ciNpK.e647qI/iK]?N<|; OGl1Kو0 `DDu\㐌%3ԦjIzIu4dI:w3iSgm _M6G%FxDDuqu ɤC&2iR3,Za޼yTW;v}yg;7FI@p9`w3#""[}7G@.=,Ypeu\zdfHjoַr-=LZ DDDFA#==l۶SiÆ֯ii9kh%""czZZ_ŋ;<_ss͛V""2NMys5X۷dU(DDd0dUl^ztg )""2$UN-+gT9y}O}cZȈ2,EDDdd}z[}r3A%""A%""A%""A%""A%""A%""A%""A%""A%""A%""A%""A%""A%""A%""A%""A%""A%""A%""A%""A%""A%gVmKGL^37>ڕD\~OY}ts~mݩzlmiң]c=@=|I;ʅRR3.[:Ko;BbOy&p/;Sf/.@d<&b"=ylcr&5sO<`bo9餐,AO%s>64/Ar#dչ<2󸀓D?d ]wUFň}T7NW8'GdP`>s a ?g]oy&Մ|oܽn"WЁ9n}.۠/|ѡ7mt%_19t"#}j{nSk,51;~,+vqߴ s֦-07y*)A ږE;w+?rܿԱpD^Zϟox/'_r{Y~$毨 /g,Sϵq!~bhp9j6t{|IV^n7 W\}tNȸFgԻ⅐5k][zKuۅ`WvB :7Ƀ'XNLV EVrkqm)wGbuLC4%(2x%Eę'1!xҖhLbJ3{Uǝlq{Ʒe].'ygJ;ǹ8P_\-Xr 7 ^WLJ6C1^¬o 9 4{ PX1J#,9|}\L;'Wnn}7:>`],D_ < ԆtC_]W՛,&Dž8__5ܵ|D*_||vZDFɄ%*}Kč!}U!S&@Þ}U%p7aG_2fI9ޡ 1%a y`=a <)!O/tȏCul6h%ǠA#k5L6mm0z}),r |/0_ ={]ӈJ5, , , , , , , , , , , , , , , , , , , , , ,q/3cYȈ2H$X""2>ei-"""#( qDze0q"@4刈 '*gT9O Ʋ"!\7`X$""2DccuU1V$!XҲjU (…q֭sYƧƎi"""555k|֭sYLЃMYVř<9sB|~ڲuKOt!Yi ',]jXN;e|ai2iXclyY!7ttd|Ek)O&cuI&]ꠡPSs`uJ ?o:`9IENDB`./documentation/images/layout7.png0000644000015600001650000002534312700370701017331 0ustar jenkinsjenkinsPNG  IHDR vsBIT|dtEXtSoftwaregnome-screenshot> IDATxyxGoWw[-_o9|pĉ,@X, Dz@v`02dIef #$vrBNرG-Yj߫nɲ%[r-aԦDQ̜\z[~z.^{ےϫ' _r}/lKq CTW\ $|3\/#>=4˹֟1hK ȁ0M!B>uB]joߋo35IS0d+627 Ωc8S㎻^E8T*c>+V3TK R78.^؄JB%JI;O>0ĵ0`B& 6ϧR Xj( "ECJ8PzrMJy19q 5c#"20Qd `@ȎJP5|RnjR(q3; Tq&gC=˼8I(Phsf'۷n#p(aƌF=pw.!zmۆgv2R8ys|{ĔwlGS4.sYtqmxaqZgT-]--z-}Ŝ2#Fφ_}ՉO:`譼ghj_ I wW,gn!,m'PM?y.IGkDֱgwo%h0T'쯞F؍p'Z %#V |OnbMO/=ş.Ì|LES ܲx$qJGgJ$I! +}4]-IBg z=^v;!"kN6wm>ȡBK4 I>uY{Ԉ)Yv\ 5V`C"< ^7I[i}Əpݓȑ$;O+9@{S& TR2 ]ոI6Zw|qY;SM(%8jǪi+KX@g4 7y+!LG)2mR_[3;& ,GZɗ.^?_uL/i_7i0X MYiBX$ k8vISlj4X,^uT*$qwBSy~-@K%❯<[_hi;iE]rӆi~{!˯<ևfw+zA/:jQϽANOPidH{sbsZƷ{w2K]Ľlk 4깥%ÍVzh>S]R[(i( D1=OJwLjK[S[9+f7= 'omM툰øQyW/.{N~[xhswީ3v.% k˘@'o7xz'ͤͱ{gf7< &Ql/& YOʖs'"Gqc:>WK =?{27?;ʢ`q8+S2P1]t<ݠJBj뽹@e4NphK 4%MWijq'$Е^0& $a2x~\ | { t)ξ}:7pcE-~&c[f)̴Ygd%&3z\qaD0&8.UY⦤I7\__}\ȉ8/ݲP-pgc:Cwwp0009srC?85꩟{wo4M7]2dq41˽CqHwc;KѴ Ny%)@SsB|R<}:nHgu >r^3'3|1Mȯ>tGoG7x{qwyP=6!b(n ]ts4IId>lQǸ֥Yq0pQcLz a'P1XsrX{|phד.%C=$(>xpk) ^thODD/Dc8_T.""21EDD^.~aL 룼z5ի)?$v )IUl@z0W9Fq]65ᶶtvR\I'|:;KmJWwOlxy'w˽MtkE2i?vb]K4>7}7Oܮ.t" 4e=g=)Ҵ"2؂⧫O=x7VyjR00@nɛV"-kְj*vƍ4z݉F.0eVV=vNp2Pƾ`mB~B[%rlh= K΃-[FywkN(kNHp`w{OꄶGXa]&"njj\Ϸ*0ȶSj}cFvq9R[7]yODD2Oa'""S؉H)DD$v""y ;t9MG!Kқĵs[\:>G' .gމ;i2ٮv=h!=41squ=Ef*׿x'rhN;Ojk9c9pKK8{aSw/0f.gRe;KaֿOn>.pBt^S1$bOx]8$@qɫ_A23ƹ6d2ӖΞ qnw$/$`M\ v.k|?%خ04`L{-Nf6.ɐqb(<=OKxh?{'OWO;S2=pu~-fҹ\:$ړwOTBTϦOa/]B7 \8~= ~R>n~98C\}(qYɻVGcHK=I|Nh/z_C<, =mP0gTqyS,=D Or"2Γ[׳9-{!szq^xqؾs;S4Ji`n) xG{aRq;sd˚/PapOMrƷљ--ʷw'V'1'R HpŰ|z=9o "!C'VcW~ 9oITh wa|r"G\7o9a;y{~=ukg+_#9m-0c%K泸G+E)M%fM^ڵ͘]_}yr\o:Og?R:n|Xgw8Ƨǵ7ۨ~v2ɭx Enҷx/a1?M57X _|B{]Izd}QbWQoU<-Vq~3gu#|?2q ͗g`-#_a{&IF}LĩSضm5;e`廽ў"\Nio:~5 NKwyؘ|͛.-' Á餥m&*MN-a+;qy} V!j֘v*u}jr7n55Y~8Sy"~b=&B{;EplVmr3ٍ=Q'GRFYCR\7okT} 's8¡}ʡv'|Y=êVz6RS>U};}; $bϫBo{̆XomFF{}hE+$Iu?dIڰ\HeD8jnhXDD2Oa'""S؉H)DD$v""y ;ɼvdD7A䘦dNDD2Oa'""S؉H)DD$v""y ;"h \V}RJtʼs$ xlw>.kvx"x(kEL1̝CK9m}X*겤tHϮyt6cZXsa[ B;1~1ORjGX,S1~쳹C>dƨpЧL1/T6T]{'`՞=&egӗsD=o]zS;C91NgM5ŎB v{Ӝ+Kܰǒ8Z:3?qD\;l`mx2W4f~Qch )W\Ĝ=_>6$pR< Z˜80˃1ĉXZHMSI 59؝ 9 ohO}!ʹ\ytbk]#c,^[V-X ז1<5"cUp-q-1Dawb!33ۓz[kKw2v}""G+P* p)`Y,Šʅ-U 7\j1'\%%L}xD> :1M8Bo[ve ƍ|_ k̪xhg+yMKęU˝z[ }#vX{Ǹ-"2vc<_8T,nBӨ料-krS?W a)8oWֲa m9. MRK 'fﮡg,9?8?]FESBLc;㆜QK |cmWJ:,xNJV/)f|8bG!Ga7n5o?5ƒw(u%ؽڐ:qm!-l۾!Ts4z˾u86""Ka2(q'ט&EDa |P̠6vAcS؉H)DD$v""y ;#' "nj]Ld[D)-n1#҄6FX2eD7AQ޳uD7E$fgxbvʕ+H mHE^<羗\D7I$nWrJ<`R«& CN1H.$j ^Fn͍<N$[Z.{ W/KYag<`JSI.~+c><3-yG:}:v"gb>܊8ZyYaɌ% IDATxy]uaY23w&LBVBbPK{~.'ן_[Z[T_kiUkjUPԺ@Q"Aа$$a'Yvq'{!'|}? Q{ $ImA1Axrхp2k Włq5Gfb_6zzۺ`l| ׵O_Dk|G:;<~'~II?0<{Љq_[6v 8&s0=?sPaaed\xL=$I$)kWk׭' VHyޅ=XK$I3X_n6lD J$IғE!.IȲ,H,m{hYZg&?D=|?f=Y{EH$I:v&M PH,Ii44$8(1! dY֊"YF4 i)i0("ֺ̓FqFQ9 ?RfJF9:$IxdYFd4 j/]8gOa^w'+mla]w>=K\"C`thRי7ogϢg*'wkW;vlzYnbFL7BЪlRՙ5k JtV* ׷~7R*X Z) A%Q+2Y|J'~x *T$I,2Y)ziŐ]z&*%44%KS00$#zkP(ֱzAP˙2$II4m1QԚsg\IѠX(4h4/^'gq7E8GH -|;K~n|nkB&I$='6+R&Ksbڲ#^,[k&M5$T,qWu-鞶 €J/*[h& @4(+X*04Ԫlu•W^w] ':>y>˘,mC)\7blfN*gVn22XYG#6H$)7RWLX>P?ijGw;SY7‡\z 3ʭ2͡~.Ʒ1I3e欙$ 6{G?7 kHӔYfw I¬Y3V[9+~zh4ֹ̞ŦMR>gE(L==$zBf@V^>uH@6g[Gm:+i0X:~5gzSII9_g6IRfRcz#71rEd?sLU%M'9 5ZZ4e)F~z~٤R4H$5:0;4I8 )KN]/^·q;W~ Iv s:H+WP^~PR8':.ItYA^?#I'3Yu]+z: |?{)<ϭ.>lwo%xos u 9Dw=L󠝼,%4G?-[,_4 T]M^6^фV,}yLJvFt|ktpޥ'>IQԋE܄L$IO/]ޞ5 ow6xgo_t6g;iwlPN{GJѭL U~zS_t{-#,#h4suk}4ZRfhNwlXƈ9ȣz <(u<.X8v4;$Dl\ճo~n;yA_xR)AFZ:Sū?q^gfKJuN|۫gU8@xxF8WGggGkZS2<>o}3ttI>G-?>PPJw6@5 c^8ꉈ'I$I0ݽҔb;8sZk@{[; շضS;yUϣu-YsupTۛ 턄qh#I % S(<$n1[nŇuO~vkh6i8.LhaLyyżq$.qHb[aWj_usgǜ>GK~>;>q 4/{_k5u!*uQ'g| MYL!s_=rC_x<;K$IOqOj&bGfW9AHڬ3-޽kP휚$PLI"X9Qq;w3u*b5DI4RZmʲ$M(]}E{{Ci&{QNjMJa04<̎;hh'M}~dR~䣴5輙5پ#djϾєǔbapt5$ٸu3Oaf$٭_~6L[9x߹gqJW(x_~>j^u9,\$ nY4&7i>ZrT/I$=e_KQ&)ݍn>DWػq{6wR-uP(Γz$M9y{GN7d C$"ca'2,OF|uu0,G(xb *HZݽ~wfvCu;ʴE*# 2VeATctmGdڤ@L#M{rTR(ƔKbFA^FX(Ѭ5\EqYmmbz$IPޘ}R&b!us^)tt׬ѻ0AaFb>IFi4BIƚ53k֌֖JcO`ӦDQHXlzƃ>ĬY3hkk]ԿEI 7>F ѩfOvHLȚ5Ɉhl}Pho{e{h6ikwd= EE:~=n4f=$ISk[jJ%AG"/ mSa@pʑ6lTho+S*f(Iz:7>FRA\&B,Z280 bB@@{G[ X*hٰa#&uQT*A@Qb~"BF<%[ɒ$I&.XvYO|w1FFA&iFaDPP(qbO0ʲzAh֠NˆS aȞަxo=YBѤhNj!qQ(H$m'6rki6FtDŽc"I$0dbӽר7 (ikko   5kB׭4(#Jޑ)I g&vtk($I7^kǤNc{nH$If$I4xӽ$I$hxRӽ$I$ß`pjFVf{[GcvAj,I %Iǝ0$"rR0u*yumQYCFXݻ՛Vs{Yc3Xڨ if!I'0ˆrL\aje*zqgh"ZDg[\y{֤Ȇ lFv}+wMSmuǸ$@Ԁ~`sG2d+^A'an|宯pbyĴ:ܛ]A:qOЛM $}*0j*ݾj?o]V&wL~B+InP$I=Y^ooJV>WLoKf@$FY[Foͫof+sVs:\# ,sjVj* !+$e5kXn՘echz (1@ _ `Q4gX?fVHټQo$DQ7of8GX4n1l)$Ir-%I$J;"I$)G" $I'Qp^$IR~p^$IRxI$IbH$I+9$I݂X$IR$I\X7B$IgH$I+I$IbHmq3&Jݐ4?uv+g7tT,N_d}> $'~=ЂV1m+_O~B3xU_K9"5zzu%{X}ݬzﳬͷo:S[V&;cY}[LȞv%xldKl$ؽ_˩]s9in$ie,`J?f,x LOwe7R'dzsYlj\zķ& y/ro1intsk/xne!lͭgGE6}[DkZȞu&9"[#*ŽE$im=:Nm)N~hssgܿU` ^g ^G>}/$i|OiAH2r??ʕzE,6Z]̙r&,海YEoaXnt涷c1Ta^WϞ>]7B{wW! ӟxZ_ieHщg˨} #i{+KOy=׾׶ɯzHwo ؑr2_"hsH?^׽7pyd&nA@V_32t\-s7i4FcHO2>pddl_ve+3O+—3i}er{?^uk@kkǒ֏dtw̟'.Se8y/_ Y/yݴ59efJ.v8_ PژF}d3;HtsN<>CYK8}5żv5s޵+XşGe~K9/܏=jɡwo7\΍7p?^rWp=sF7qD^'8GRtιg C3Iyyk^t6z:6hB᯶]8g$]<Մd&M$^7rt/LtTut9}3VlrI?wWuK=Ưn<ǩScjYă|o䐥s^| ? qRRtL'7~%+|R{YR-]6jםIv蹎=g nO\3}\$*&t.=<;ݵpU)Ÿ8XHFt6>|2:>7V^⓼f޸t|'_}(F^ß2pTVCN,JdMd z#kD׿탇Iop#sH.JjDvNxO?.I:4YXÃ3q^o3?I}#6SOʯ{S͎?d#GrEd?t\qMN(AfY瓜Cup7J惡lB҅ 7ɒ_(ty[SpUo`3#bzI3ڶop֩\sɻyiOB;] 9w?|O>dzkrџں}|G?N_v^Qe&F| ?:G /~ #[0r7׿*?0-T_5 ҃ff i3K>~YE6?|jByͿ{W4|_^gp-&gdفS,> :w5|:tst4R|w~o{t'쎧%r%K_Ȗlt"M\XR*{ dgv{zN*DWWG9h٠$Ac( L< q 4PqȦ],A_qj̙¦Cǡ@9H* tu̠~了T*PnbshchQTM*AX-HN?D4mOH°D)<햎/3t7AyIc!IDATa ' i#Z2ڑﹴW Tc+kPm|7C8ֽ #ic`q`$,wOk|5FnX@N$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IU$In$xcg I҉%cb?$MP=Z!T:ꍑ$XRR ԏuK$IǓR2$O 0e Sڀ p$i<26eb2g($GY@3`tAE$$ilQ1kΘBpb3z$I'd ŋY|bftHgF xr!@areH0I--ɖ-|9/g(GW,;y/l P\Ҩ)vAQo$uuѸrkd KBvԳ:=zuIҡ]\>r]z-Kf-ޛ9/'6;hZ!CJ3Td$,] OtDn,?u9*Ӹ|؝ܵ.^PcX7_t u:?i>Kg.s Y<}oK-\Hv啰kAJG68HVB^NhAA Qw7Q 'LNu@r\f,Yȕ^ɮ.*}#} 6YJH҉, # \(S)Vn\t]cW230d)WW^X &T)IOHr$ !J%b8 ,ZԤO:#GHR;TPRDdYFe$IO (r$#2qD~o/a7޸|ewߝ24LJ@ľ8KNl{D $@ 解c3WN'000ڵkyGX,RT" ý$ķC4Ml޼ܹs?>cӟ'>1DolY$Ih3jjUm?oM{{ʚ5kذaL> $I@OOI000# $iI׏z[$I'zo(I!8֮Htfs|Iq$Qo$c!I:ZB?$M}$h u$I$iI$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$I+I$IbH$IXkY{?IiW(E:qǺғ.᳟gxwCW_ COgKR^>~ku'|]ׯ}0s07o+L)5BV6z:(I@C)ۃB}2j?Qo=7{ wd.:eY3TV3CJ憴5YzqB했:0wQEAw&7D kɟՈx?gd=S'TOk+μTj3ZT姷=imt<1脓)/3-d[nj,jp,(D[%~6 (dyVsI755ohp, Y}[ 83eԌlJ&Gܱ9c)M}nʮ#րnGa_8̨H48 vR.=s\eN֭yMS>:2ƴ[7l9dfu@G<΂'Pgucc#*2g9HCţ;:fs'SVlĶ4v?y=v(Y{(8h$ ):Dsk|cu2`׺Ef|ʤGc gtZ'X;b>%"d#1b3aއB)\quk&8+>n+8#}OC~Y<VLA/M/G!=)3}9tƧn쮧œ w Dr5u:G6Yߔdt.WNΈ_*v6G;Lƭ.U6IW>GĶG:觋,i=BFI ^*Eb@2G=S9{a ? h Gqw_g, @0tΜ5Ě?Bxڙ.q'S[SⅣqN:l|x3ÍC71_pA6-AGRtBv>}mPٗww1 |'ä ƟhAw Kۙ~fE t'sJGy='#H!_?]ܸ)~$Iq0}љtϏҗxk7-7@Oo\2k-S03=;gnxr&Ђ~^aqyҏ>4p*Ń7z.o91Aȁ I%/*6m9m&.r)# 2tu[@u= 'Mΐ}= 3ʐ2iaA!- ڄ (ƾ$!'枔ytcu9s_HG$I aLt#YڠVryZnj]Qp40 =5Ix& q6@-N)xf`FQT4I}udifa+e fFd)OKM8Bu#st;X:F|(쿗J8Ⱦõ -;r"IO $:Rr[@|#ڻrŏpχ $(5ГсuaL!<qࣤkR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRR$I$!E$IRQE4AaAfH3;B8$MLI҄;Jv2)B%I4#(z[$I'b^HJHN,JDP8͐$gwSG9Gʔ)1YHYB9s GQC53iX$Ǻ9D$IY8d ;I̘xqH{{%Icr˗X,\vʗ$)˖e,_^`T*c$IqR0y1K:zn+n-Cuue\~ykXHi6l۶$I Ð6MFWWטchݐk"Ӧ%\~yw]we]14IzfȘ??aҀχ /X8{#n" 344DtA$=A@tttNR}\[]Z_.,]paƕWfj@__`F$v:t"0l J@wwD1y2LwǨ@@ cpa)R6Xl8U^=uW|˺Y%q1F}O=yf!JZyNUgeVo?&u]? wuk7*Y[R[R[R[$y՗rHIENDB`./documentation/images/surudark-theme.png0000644000015600001650000030024712700370701020664 0ustar jenkinsjenkinsPNG  IHDR*l#WMiCCPICC Profile(c``RH,(a``+) rwRR` `Ġ\\À|/­+JI-N8;1V./){ll0{]t NO@wjB@6_/cJ~R$ (I(E% JUKQ0204e`;D@px2A!BlR?1^: Sbj  $Aad2f`  $IC3w" pHYs%%IR$iTXtXML:com.adobe.xmp 810 364  ,@IDATx]|oO$ЛiRE)"곷>?}]콗SSQĮO<{G)"H"%tHBzf$M6ɽMfs;=\IU#&aQ!VGۃZUM0/@@ >0zBNi]/N^ՀED @@ $<1GHJFF*ҬV-&Zބo`P @@ h%x<QRRbYBI9&'h2`D!l @@ Z)^$Y̰$c9h$Т:z7-Up  B`[ @@ JAO$&40pp IX1&'Y!:V f[@Mcppv ;= n^A @ :0MAa~tET4YA \xGILt]SKNJ?OMJsuG @!EQCE#AlT*CIga]-Invh@@ HP[[ 7-xzT\l&VUנgCHF/2I^NTZxUvVW^@O2"3Մd+ሴPaAin]YO:fR1%A1@@ m 7.R+wNEGEJ[M-*ʫq|9m^BUNe>{!## IIf_߾⛗Vh7 %%3'O "ScXlW } /#i6ՖacD:xa,Ɓ]۱i*,i 萑OEB 9`q-@ %۔U{l8[ tg>CJhx;A $ܰOfuɌ| UJ^Ĵ╉I&jM锘 a2h,xU^ vcʍ!Jy7^a6,5%iLT= YcR?F eXKxM+HT:tR"Un\+_(r @@ h{]F8^Q RJ#I]AfZA*Ps&23-RNBr6[u]I(:8|݂RUyYRfCi۶-zZ$C%&lANp+| )nFZF&a8¦M)c:5q-@@ :BaÞ,p|eef냔rr!BHQrȮ|Xhb+$Vњ2e2% .1$`q3exn;yW &vAFǁuH6y+(ɾ 7pCKMipNLoƛnjǘaѿwWeI`/K/c MTǻtU܊jQ7gtðcgo= ]}BK`ŝlw%T2pgc1$Px76,[?:QrpP0+%q'}.x5e^yws"B @m!rCϤoZP`R4t7&5dAT\ot\큞Q)4yuB{gX$t%ai-X0$㎛, FZBR%xa!{U $ЄOu>hbUT՗P( oxWT;>p K.=k+iIz&uؼܽ?|`F㽇~L+*63M~/z$eTY (Fn^0n|ϗ&m>#@@ Zym9_6@ 7y=s9ꗆF/waJIAHxo>nNtc1p±ޅTxmu9NQdu;K{c5F|&@@ hHZ?WT =W0D3]ɈZãkLO U螘NŅ~ɾ)8lqӼ\̈́VEE'WZRJ.*%`J9-ZL('1%^VDTv$uHU{AgkGOɾĂi$$S!@3nn«O6*H4w/-VjH>K?b]vxiKon//dIGà{PJ{$uTZm%3|l~g.?Aۃ+0i?5@T@@ h+*Sן5H.wi7dWvDT-dPN” ˴ǿMSn9$eg,3 :ADtm ˤ+NR/iߚT8PCn7᭯ Љ\=0IT !ИQ#,cżOpcDνb>hk!@@ Z%Ҝ43p`ێZrC IC((f"oU+Yڕl m8vgDϮh*nm6¡C`"u%1U!;+%f ;7o>3/|RjJ^^M2G1,BfN6rR`I r߅~âQD[FVr3R.-+Gǎ9qu9@ćtKg Agn4i'h sEeĊJ _Ux%%^N ,l66KZVTTTĞ{HhDBc!;Af4ɤO"zX<e5+3JJłT+ a{hw>DQ,M6kn7RV8.j 4UOk{mO[Eb,rΖFCSD*1?^:NZeI՚ZX F.D/#} L! ZKїuZs ch'R{#Y-xNsl¶+"E%7^oV*~E񰑸o(ك8/#;4+&PFS yZ86-I {Zsb,%@w~,?َ71w 9w$ 0|a=ͶNd.f79ddz[ش;r6+7 'T"\hE%tcҷ:*Xp M1ZZ./ЀF,5$Ri/2k7QMO @@8č@" xwmZOH v'*Ͻ^SnHAq`';7y%-RI{U \DT)IIQr{RDlbȠ(:TТ+<7'yOhcz7Iv|t+Iz,t\KPմ\'AET`#8I+<%DjZa)S=Ứ0(R*@ ,8=B[p^ ⃀:҂j;B@TQ1w{ *YՉmy> WUX&'[hu$j|5' k_WU\.gȉzcJrfWh9dXϩ/ DcDN{POWS@4s VӒsWjB½M&y Tr@94Ϭ%fm:ʼnYaBnΝ-oTLh58Vm:"@@ $6-9wndsl˖ZI~uX3B>dCY b\szwGRlX6qûnɹkuۏ⤌QMh@;X$]SKIjVDudwʀEsUăC(ultLk{/pPKn%xNt3Rp^cr4T+Sc=:ɨd 9%f}!?qGU䅽v?{. Ht^>ݸ'rO*XUAL*u?o}Ӓ VkBǷQCj~bJ;2/!WN?! hp&>.=tɶ D)+۱j;.+3'LCK~|(-mfJ?+DSW9kM3ZYx*iFHǵW_={+\ 9z(++Ÿ~#f8ŠH|ʼ*Z-(S /MmJ]>y ׮=d >;1#Ͼ6aw^ 0x( -{TTCV'bg\k;>R'r1pVg/ͻn"}͠ sD&ڳHHc/nf฻eTB n:pXp(֣ɝл >S.)ʷ")=)CZk%8i/#z@~ꊙH=)z=%w29h^ZB񭦣lX*PPဓ=WYj x)Z0gKGS꦳eCaA%$t쬲a c.fP)-݊dr+e`BV^G(^* q"Yke!ű?"#QN;QU˾'y]vTUPv8dcL6A. XfTVFxLHR{QBԴ#6FMKKFR@.Xs_UƦqcUox G.Qס`f\1jWO{$cVI@onR_\urW^~o\{|eoXhkhݔ?f};6:FM!E]ƻc V(B TG}H_'P3 /]izVK;X;hlW߹&sӀӕxPz7:¨ ǿs]g;g6托R1zzXS T܎,57^eR4ɾC'zk*mʹ)S/'Gz6ĭ(cשּׁ,\u`d[W_q30Ic6KȇQUΚ JY33yBJss3QW_2-dBX>K=Rĵ$#SUA.+>+*iiiq,b޼h̄FD.\Ǒ)'aEoJ$9=RrkѳWOl۶Q4t!0O]-u<_L遉߄kE,*{R|XtE! nsI:y/nobOIv8N:ѿ7zvA2۴`۪/E~ gߜmOay%K&TM &Ҥ76hJ⋝&0}橘>ptIc+d$+ @utJj/V~!^Otp.N:fB8Jw㵯wkSХǴc@5hqyҵ--vg*Us}|I@JS;SCG]o ,$Hq^˸JB pq/T wn¢>OrRsϥI'/yrǢGHgÐ1b5nc~B]:R+g?*6šCkQQCcg5yYJOv 0G@ 32{nG8m]* ؃pILFRVޅa^֡X|(NNdCnk^_|lk"c|*xnǎ|1ħZe{:Ĝ!i5 =FL#ƈg ]a@JHՍ/qN=a,ҥ$'jlpRh;t50̻yqVhr_%}Ֆ䝌Ny|Eɋ/wS$ZTڐcїT7JXFN9;>I?$$VcJ.O<ZLMjCy-tƜq#uqTWfNEJVo;  rE1ĨcԴIA/i24suu t&\tȃ̜>2  1ӪsKu 5hy=uH̞JOf*me.ʾjH^.?^"g!I pg#y)&qנI9}P ;ӇFw9o( -Fva:PgG9yq䌻 wU*_[2ѭW&5U')L!dX;Mlͯ7OFTϟ\jxFL "#9ƞrsc(Q'j8;|5M,-Yd$dwa%Գ)a':Æoq$ :ҢTtTڶYF( χL{qJٟP"6*iiQ%<3(/~5:FV~"aeTa%)1,p5J )sCm mD^>GE=p~;Iyu%tBg}UXw3Xe( ;)vQ78 &՜a8K11w(.>n}go/lO<.`뫣.-/ 5#wԻgF.pJ%wBJܻb7m.aYfb-/]./^hL)f-kB9ٯ6ѻĕ8lp`>Ge6ʷJY5ŰNvLE1g .Ii8cRG1e{$pӈgwF|O*Iqхum2 ;Dl~hVǓ~3ͽ\2rY@)٧dd#>p%X. xo]Cu(x:{ʰ//8\?s.ƊT;H5(n~&TsaZ]U!}B[qM?wû!op:#ȟU8ر齹xsuyjRYY) +ƍk|}<"OX$"*/;MVܼ\)d wW+f\$${/>?7=EU(RSh|!F)D雏VHp\cJS0oƴW(5^+-1ǷV>8^w1SJ8?2H%@'d%J^$)&7a'u}hSk>O4Zw鄼֧=$- I< +KyGFf$I Xʟ%MDOY|Zx +_dg%~4S3컱=RrQ甠5z+;T`䴣غr9vݭ7[ Js:(s2><\n=;/ $zE>>EOU.H~p3s% w ;}sH}|<9-,ΊPu!H;[GƂ+%xNW=r!u!ߵ?݇,E9~S|KR~R^PO}ZkvX/,rQeˉ/fIg%ΫjG9p 'i|C4WVFoCN *VYU'f]'٧/#կIi2~,X| e( ~Wpճ';yUR"əu!d 8*3ǩntuAЋ<! ˝4A͠24.NS%W (;mf|U~ish,/r"uDhQԘn37 wW­Qv`?5+2%̙>ߒ}K h @ [-O{ȃ[24/*ݩ]dM* 5w9|yĬ?"T$A~ 䶫n52*Ⱛ/Ƅ.Ĝ M V9? :#PeTm) w ;}pjexi8p:CWLaK#FEH*fulJY#Ct;y *<\\VnRkfa٘>]R5W$ S- %ϐp2KVMV"ɽ|AFIt*e$!3ѷ,vYIgªsjM<"vReu&~DCh4XB7*yuƙT|k:Q_ ]ZpoFG.gZ^_2E:Us~uϏ(_J1J {/2]~-9xEݽ;YM+J$"Zmuhƕl{,9b<7c{K8k%Uq+jZ,㦄P|l{mиkDݱ샆O:>}]FK/C`ơ q-;u42K*Rwt:](^d5RVg+X~A(NW{TSYEHaR+ Iz8 :^}bI(aDqv<3d4Ag]Fy\kwlx>WRr֪0(sV ,\J]a$>z< @s <39̺jie+s(xp[2"Q }Rn§rgbd]ں O%i/c.kVTB[Nw>,3$Ujzx!Qx3(n)P7_qՕt+rbzN %g*M:EV9vOS$6oΐynJy''șB+eE|q{N$3s!mUQ,sCA nd{O^!r(ƕT{k~G=c:UhBIR ,jJ) <p1u3XAOmjH"$z^mwxm-X>1-!;zVw%d3&0q X|M3j`u-.W׽m%vѪ>Ʒ_HcG/_wԡC`}}~J|pK7\pj}穸frYJ.'/٥BH 9Ħ(@w*zR1 |3}uu56l$]pyҥdJ]G J?+p>ۿdMxg5rQX=>}5yB[H!^嬑977 m?!ZRF+-R}9e4<74T&8]%O_BDžM[IQM}Mu~5%aem0ynޅuD֝tmp(_iNuGM>:N.د"g 7@awO>HV ]/^i=NSO}Jcw4 - :tO_i@E]Zu}`~"[2 v]޼b9/`Cz<_+Y۔#JnyM9/0a ƭ+N&AWr_SC!AƮ}4Y0!!wq}$b%[ɹB|xf異ٹ-\ty9&M*qѬGW$,&z[ҮxkާG#Е%5Z gZiES>\zi1Wg7AL$gzLk.!+e)C|B 7 eUr.(8p JwWRrx9tɩBOAjCrsxG,b^7X=@vr V`˾C(>Te% #8(:x6ud=::96Brq͞ T5E)4C[o;nmw܍6v)i?pyYHsHES'ڳ2ģߐ|ڣNEWiҔ8w #_cHۅ<=9R.G]i46NCk]Kʰ觟c+=3wN'DCxe%u)4t4=%X:aHx q?H I.ǍwJu=."ۄ].OM9Cp 7<,-WU KcJ@#q3v}z,Is~t6 ,(tϛ]ų+i"h<#Ot̋ _[boXg}~4n}*_.>y3ijn1-FNi={i%˃`K1ө҃xȗwńnŽ cZ|ǵ U' w<o/I(7\.Z=`RyլI1nm!;~{nÿ^_-ŗmH-Kw8< Kt㻏8H˚?cި&f %yF{}u]A%׻ K7єėT1*^[ohݴb,ȁ^O= 1&\-9mZXx5L./MQA xMTj/v}>cz Ad>n0dnWn=ol P8c%bba)puu)?ImDRoDyQ$zw]Qw({{6c`a/O<@IDATY#TG+\K+)Jyela [n|e"WU7$IOKûJ%j<ؿЩ>9"4Fe/*}WJפ9 `9^b'BW[A H6b$ ZVX {G+0fh O}jb&|d@2>ռ*iuX$ߠ,pK8U4d{ʟOM#xQZ!T.\6.?C/WO;:xD}Vm-DՓ+0ؙUZFUVC~!:̃Q_>!{/7?NV\C† %EnŚg~?goox=q%G+$[DRF.+RN!|YI8vvy\=J:KQg졥>hiPXTxTi ;}GZyN$V?t9xw߅t|<=ߎ+)Q ]QVh]Z-Be/j}+O|4:ܺrHzz];b_a='ɛ.h,{t964rgĻ٫oW2ֱ›sX3HmRr(i%5{\8>ɌRrWW(p$NtXL4CvB%́[|TJz>uÈ\Xk.H͐-m߱%Tg#R}<6N1sVie(ٴ0:I1&ğ%,`g_$AWvWYXN='ꍬ d@?M?:ZUR E69Z܉H͞x|̱8z -Vj;-'Ջmذz(n/?Sp^!!vtn ,v!V/*B㧓[vK)M$UҨ FԭqDDx+V`l;9z$yFشj)~XIp Ni_4 $wrVT܁%>}S5~; m$Lndvl^7@ :-П=Gc`XlhY1 Ŏ %۬h?o~ļ? *vbpUޏ!4q{ϸNu'x|=wq;:84o"fou6T`EEadH^=0JDhho9_G-Xl1%A).BGE #Ȼd ;hh'F aN6nہNIMƃau]!';C%t2Mi鋶JJt:*M #u8=Rux]'j["m˸d'Xh*omy,5Q^ Кv{ܑl; 44HˣtF1ST YcȄQԑ= +m.D@mMgjnߔ -9-[ ?ij?l(U[R7+ynIXԵ'WaSTcD[Q JVi;~2 >Gʣ9xgv[]IZ>Q;ՖRrzaZpgy:H@SR )͛YEy# *Aa >3>D\Yڣ)g@hh3/v}#fw|n׆$qSZ &n~TܕҾmW6P:~%Rh>_Qԯi‰IƆTԺ]Jvq6Mp8xӓ  ,˅Ӝ%DK(=cP)-mV_ ՖMFT+FQE¶Ϩ⤌+*"+3IXqyݺ׸Z!˳Xbɛ%G6 y /^IG%=eٖs_זO"# p#!V+$@K"9x?c=|sG2d7J \BXh;21hȲOgSj*NJ!WTXɚ]{ 5dud0c'jl{bgjE7~W.Im޽+6j])uWcU$ (@ H8t/MWI8DCMmL&#JN@@ H$xEEփW̩_v_ ƀ'@ ,BN O%J. P/*lcE+l3'exw*@@ h+xcË g!miGl+qV9i:og߅> PϸׁGoz N93jZ^ĚY^> g<:]xTHSq"J &#.7|;F9`F6͘w<Wh@E oUc_)9]zp‰qX0tp/aˍK " eÊ/C+ ep3pa_Jq|rnEx-׉]݀v5^t4qDg܍YZn)9YfK̙eV,قS]5݄MgjW_C'/imi3f@@ @Or<#@)fQ[~c \C) ݧ_Sw>a|G!(t0w@JreՑ׍Z߲1 &9 )F}_J.7* * OR )ʍfT<YH1aE3 D)w2 YcrZek`X o7BW=/95 VGd@d<:owC 69WR᯷_FtF2O>\8j,]S1(BaKE$ ٹ^{-=ðGZթt#(ކ/gBSeo|/Do>;bRYYH _cnz]kM N>uyn'ĽYB) :U:iL-5\ ˖;wf!%%{‘c`ȑЩ6k E'R|^X^ݪ`JCn^pQ+7_bOalfLG/SxpZߟ[{_!eJ9(Y>k}0jc=Kɻb-("eVcZ7 w2z4vv;@b! ͣ%!=/ޚy}ek7=.dr3\tW9wxGh4 K}-g/o\?.nMxA8UX%xxϛ}*|Xev-'cΜa!קQdgtӻO׷gk׉߽6yԙJa24; V6c?R:a)8SqT$!-?w܍=0d0$CAST =:9?y ]Ϝ]e0UX ݥD:C9 rs1ct <(+/dž 7"VY8ߝ4aſ*!#²zޛnZV$xf:$8ء!upEq^Hjj(JBF<(-(_QkO4_AҢ%!=+:{+`ǏQǟ%u{9Jv``KØ{0_]|\̔<=Jo_U;pH3TGY\ ϥ$+#w~6V :4XfGCCP =%=5!#-D/Wbrx>ʷ,f$ ڃK7ȿfYEXX5NA\<)t?oF|9ۦt)珃IYP)gJE7q}vQ#9 ge61ٸ|to8~ѓ_Z[wcYѹWn>$}Qcs5xqQY_aCJ+&fsB +ǍØѣ˯`xqD ]SZ:$u9hB-v 'TqR3zz+\{-[xar :kĸkkv7v[V:Ơ}~YE#=N.x Rrߌ{6ˎ_%? T[o2< )z>ȦU;^a|{}w rX "^ BW_}Uq:83U/ΣIPxk<4s-:l6cfk}5QθIp؉-"MõGC_t _T35 M)S9cYu3|eq`>$]fA$ޏmAi #쬾`|F,w\8h܃b n8{eb$hEEZÐ[;^,t5z&y[#xj>|=# 7xz,tv#d"z;~|*4H:;n%_`J7 jxDiW+W.i%պXHqQ޶m}q\>2v(-K9#00S^_*vW8-nu%f^q%X6ǣ;GcmU%!`ދ_ (2/w,&*i^] w[RY#jqtQ`2,T x/6.\Cq7>#ᤑ93>nmЈBZTe_0Rx;\b)4ZdGX8g6yZZyR8%+Y$Dx٥9 \)46dD?r$41$L 9,HFVD ү]c㎠~ǁ{ {֮Sq3_/Ay cJ監H`R#_ZZ_cqڻ38>< o0v:,ӅΓ,<t(Y 1otYpJMX6_JAmw23h*'i qܽ "0S ET gzĻ @}eѬ"k I ?AEשfyT҃ 's$")j\q?T9՗HQE ELݎ9{q0ˆq=3 'k{i.69hxE3f>sեWN|_f! M?FjZ`K_}9r,ޓ;X=},VJȧ F~0AԐ : E[J~%!*u"(Iū].j3;/4ы}"~QlzII `=oxOkHZb6 N;*]6_g M{] ^|rQ60 S ñsyF @|g|/G#g + khЭ <dꧢh(N __lvι5&N$Oay"՗!y8q;TZs;q9γH%ȗuiKS*Ge3~Chr_X}RE#dz= utJ߼e\f3TZV-[ gll!qr9pU 1鐖ĐOatdoΫ8ȽV 60}4n_aJ'cMJck`K| nӒAbA.Wa^h;40BX{?abמH"a_\ߓZА+b-\+ɠ﷩_~9&e3fEXM6V刻 8+ZP6Kҥk<aΓsbdkOA}C>X< /0gZFk ^m K5NghN)6T]Xk3 V3T[hwCUQ =hV+QQ3`{ cVb.*y`]ݳk!/ky혀6q/ۄ ߹F?XFwtbox #(~ `sݳ_!᭼͚6E0(fֽ#1?Z DӦM?_qb_h9Y7|G"JlM]Lۑ8[59JwՆW"A* r>,z0A/ (Kl}^Acoya^Cc x3 JDk#ʦ M\xV`:6Np'sڴAk]Svy@P>:GN;WQ\ dKNStI9>w'v_2լձ0o^]l/I[Հo#)KZ0>x+R4|vv vpu!+5CkNKyoBfl&GKTve@nOY\b -iUl1ҐLcgO! L9YquDNnI.7c}a1dwڪN@%~2bnj%OJ__̞MrlopI|lڡ>T gmQ z2KigU:m5b7HYDgf  FL]"QZp<Z$:z5aVZKrϪH3Xĕ)y,dQ?udBx* \E2 \tтH2>T KDBeUV8=a mL4*q>t AuO[p#HoMn@A Vn~317l(}(q( M#r8VEq (0]};/ZfGmKB?-s>mNjU ?W# \{y2qi`ywBE+&>VgrUФ V"\Z6IoLHFAiJt9T~3IQٙ$1(s[o* ChY #ab7Eƭ"Xl5;)hd䙬4zPa$m8zqcPKWޤU9CX_xq8G#P#rV!Ǻ%&LTD>T{X5u K޴*<33~^_OO]zIJkIq9G##Pt},~RV*+䋗/D)4^dG#(6wyrpi%딑~YGS-埒<B^_.Q۳Q)ܹ}cpJޔ V˄חՠ,x} e '*e^@uK3;G#p8@Q8|Tר8#p8G#(q8Q)qyG#p8@QDG#p8@#JC3p8G#p'*EEp8G#pJn!Wr !HGbΥR)nR98@"J =p+)^M%+ km*JFAtt4]z޾8<G#(?h&Nۄ:7ěmX02<0m !v̚U’x- JrMTT Gլ?p:ں3yARѡ9!8No WSFW"#d_uJR_8ujժ!>>L g,%`Ϯ=<<4ta,dƩc o[΂hjdF<nZz !žOȃp94默w2!샊fg안9{ arz#4A~6*.KDkz=8=#*f3w xk Ra*X6t*_MS¡,ʑ/O+E{<1QO3ǿY+C5~`OVd(yؠ⋟`MS)|*:꥖R YLT_.z%l#6-[^M[/0^}(8y2U8EFm>Uh U6 oa4rD܈U8a]腪5╩apPiL u9lY :MEMAoBy`8U!%tȿw[hyNNY^Pۼ [w$R86๋N՚B&o Q饁-'~{W;4*XDzYuHP!;P FcbW> m/W76WZ l݊G A֩߁>J'4Cv\U?U|Сed,ގo=+.NP']Xq<:O!ɪ8|Yq՝TfUtv.npNEF}\Lo5X\FZf,\zk||H~'~x04sA-g^ #PE$0GA͑7U$%4gd֦Ш(W +z+D#3#- ?p0c:n WP߷LD<-3_Q⫟b| B5=D8SOH>nARʕ%Hx ۿŅaXjZk(ccHaa%pr41F`7D׬d%?5DY<(gUz"CܻvjjKͩzyLހ񇓛3rRi,qF߂eK?0_4z_bWG prw*9wGV:ȉډk ]TǥY_f*ޚp20^ 7 xw??/b|0Ӥxxbag78q`Z۾ vàa\K}YYuZ}ͷAL>]]]1a87lj={Y3K5iWqHRA3W6a+c0u@KTs4.C|j'.".lXH&Ver~ĜmՐ@jԌ(`ӱ.6}`dyw~m DJ$E?>b讨Fm:[ga H3h*Jr{=#)vh6W,믵Z<KoE|IwiX0v58lfヌmE гva*v.IJc΄n; FbAXa~lde!W{S0 c10iVEV>S Z/"\2kIiiq5NYE ƤWQIQJxmDӭ -邻0"ARe~\ '$IaNԤb(FPC$'ZFdDPO.&ąIc*Y;#s;Q/-ϑ#0&V/#OzJUj}"'X[{ uGdWH\߶Jbʟ鉊\&A1v|< ,:Lv>"bEש |UdkEG$Dざ/.\G%F.͎khSk^)~nh Q:bC̴"Õ2q' `>Q~Md. l S٢BGDkUؚujք;a~$Q3A\2B!TĄjajJ*TP \ 4 Qz3<36,Ky;Ud\9)dWWGF)p;i%FR+iّZj%v.=5쪡U]f/bkH<fTFu25zvFK֬̿'~%"?<(V@hކ ^Hۊ>+i`w1J _dx PQNS$IRNO?&QadE+UaRӐ$1s`ً5I\$ H\؈DږU~|5s -X XeB\y0Gz发<*ձy51IfM2K힖8wxO&vw&k3 fu 7ayځV+AXSmLcLSYg Kd,H@;}Z*<$̊iZDJ+ˈ}͸C;pkt}4h05ңz49ZQPݙ>dmRbCU`]g] ·غ~qfl)k_8%,;ՠ"sPH*_bY  ;-sd׸r;C'qs‹ʼnݷp>-Ǡ l"DM\x71*(fatj$"g}b{$)L3fz18Md ѿ/jv~uK|o }Vh.ZP{ڍt|" QII*-DZP$އ"> 9¯vWCNajSCUb]LbLZD֟ȋ.FTG욁WRMqkpKk$Gp?yY ڵSAG319 C\`?jd<FahႝM0KuVUg r(blR@ҝp4zwg6[T}y$P1'e|~K[bkz5[)OM P(te[CV xpRu erI'5'DNH ]?'_A%Ն}tnSgDZ3àWkN?."sN- OEC Ib5' S튞˷bVccsXO|8a Jp";{^)SH=9Cpo?#gw'䤤kMVEgO"";h9Ĭ1l(iD̔qi Z[gO٩P*%Vfu(AZnmѧK޵)zMF^s; E/plrp#֙)ZbJcOuim kyTʫ' 㳅8~) Kz76^Rf`)1oa3N] GLZR.>X(@rIePg"R DV_:΅DT$ԋ!+"ёAH #1 "3twފӢ_'T\xٍjLRx6\:F 3s3"}=˗`+KKB[I )enh?oƁp$I/szڠi };vo{'C-,.qOf[xW=L?qKl,Vll?و=!8VB=1hPtgĹ)&-M8~#j}^1R675ǎcOx,I5Ԫ߂644Ա+:xb؞4uiy2Z ux BW*yw;.]'JZNR\:/>7WyxYfM_MS Xؕ7DY^ѺG JA DdvpZR"Ӳ2-l9YaƘg`PI8ripradȍL/vd-nŠKevq/ @ ƏȯZu9ғ?E֙Mw(_ Fu h {iء'+qaR-arH #)"AH }%4Kq8G#ȯ"Mmj'LG+VV Y,Ю;R!JdFݼE "GEr&2 G%3֣{zv֚dIa0BdE)- TYcD# Sȏ ;יViTq%p8GIo~=):<>G@j(% $*:‚:aXBdEGNtt$l.2+of9G#s8Q)ċW>AIDE)"*3"TDҢDPI?0rb@Xz'aEҦ}5Ii(O8G#<p<"!]h͒ Ti [MBkL9:v')HZD0!Y Kkp8Gpxnv( yN"JxLiy&! *WtxG#p6gN|1ӆ*/mʿNK0 \\\R75}q8G#`eVħrb!~#`#F#p8G: 'P>O#p8G#B$rp8G#pi 8Q)Kp8G#9aw­~ׁ#p8G#(7xOX{{{F/G#p8G#G~'G#p8@@@手S8zܕB!mPѦ88OW\Abb"mL/nI~MKRx{{#00\ig^^G#PB)iES D"ȚuGJ|;xv6lU9Q)ʄi{{$<0Ү]Bˮhk׮^zexG#Pn #L 1uFa7o"Ⱦ?[mX02<0m !v̚U’gߎgT9*DEr<5d*5Pn#l+ q Vr4Rυ[A#Ե:,WrS.:IePĚLB QZ5ǃIat%0ٵ.%8u ~ZC ckM;'c#8s4;o-*#(Ѐvbt·غ*W"1BrP8z"o^NHٌw.ŝ+2Z#yY LeqS~ˆŸ@+iJC8E9FfT0\N^ jV1x ¾"} Pn=G~(LZ\]]׋YBHAعzIZT,'voAP1**XöcԼլQ&HįO"I y*+p~j,RfmΓY31Ia0g(M\M3ctt"H@8s`<+0;a8>~*FB{"+),H+~·Ýb(Lz!\;A Έ`Da-w7~xP!|3JmQe]1q~W>[Í+e H-hӪpt dRQ%?cudTF瑓^V">8{L£Ij9{, &߷}ebb.ǘww,ZPeɑeK`WUϾ?ɚɛX""7|\(x4(СQfDu= dv|Zk,'Z ]q2||v.G #uöC p#9 J܍Gs[L~?=R# swiP?3cKi;2͊*JT|i*OEG~!R ~/RĚFkѧl$[Bo{;8jlݫI{}=UƟoal6HݪU8ͻxoP m^yj_òi>q, Uk6+S?ly9lY :MAoByt0Mق#cl=jY!3;9eyi$BM0BV3I 55 dRCv~a~sDFt$(?p0fmNm߭B01)rBF< G{+JT|SoA}Gx#GdCnARʕ%Hx ۿŅaXjZk'1DZy SG{9ASpfgtYHK 5w1MB7N+{faĂº;ϪEㇸw*լ.-FU2ynkt'7gStD03=/1ڵ R8;C#

     ޘ9)\ofX cvCɪFR< G~cԅ*`ӱ.6}`dyw~m DJ$hJܷϧ?+jQDY#=^HM k-&!O|lwa{N>og$Ż4, jHZ6wöYfl}@$)U{9!Й:"E2޹⦑uPi0VmGL;.D 74k^TmQ_OT;ީ襗w(c#Ca/p1kjQ0k ukp#m8?K6/KeZҋ56N!\c3;q1zpTfANk]ڈ.p[N!Pᣨ\ڒ3~#gWٓ3ߩ&'G~;"Upj>~98"),i*TzC$)љ]8VzU|h?i6(o ޘA^N(vQ{$L+rS˛ŹF"]sW< !;g~\ '$IaNԤH jajA=jT.&ąIc*Y9EIa 5&duKQj3Ф8#wDI(n(GV>?=G$en[ F^txdh9W ͪpm of0޷6IaNꄠWF9sM8Djɪ4 pXYWP "O };CqSa7fH KHǘt!?_FPk[S jF\bhHRXju~2`d8ZCR.⹾jGv5zGezu:ZԺsGz`/ŕů;"Ǟ?Y;hBFOʆm~eSBTJhGHaieTD>@J} ~i0)sci%Cs!E?#kl ۠9<ന"36S`RёHざ/.\G,$EhpYQMzqIu(LeZEd֜ &l #"tOPcFF"A)`i9G78~{N˵e;;>=IpŽmX1w  EU'ʉH!N^g8"_F)p;i%F>;fG*1-9Y%쪡U]&5__,֐x(JuMLЋPI;R?FѻB{BMcḬ+܏ >8 :u5zvF릣YLT*Žp*Mme{ 0h8ūN^DB!j){p.? >A5J.X-QbtK7!e:fL=IN%כ+RpO⊦~ûuԎ;S}D0 ȐLSYcڢbyV;d > Y{S ~dh/)܇<'Rril 򥢅66Ԣ1Af>"1U/.5DEbu)l %a]֧` E9PeٱP HV Ѳ9FƲzt-vK<7G 4@ޅz{UJW&!J)D\aӑ&ARptG jj*Mf^g=&rf` Ur}LYSyb 2~Ml+?oDzRT3WOd'Ҫ&ysVswDۍ{TL}Bo[*/F?nn5Og4KMzbd^y~^Ŧ_hƋ1h\g&?;ؾWx~2 m.HYb&TV?ģ)P5pˢI+Y{ l)N#q$Y0 5DTDTl(|0k`,&QadE+UaRӐ$1s`ًH"й( 5-KsCv&r |"dydGZ发ʾWjBNVWcS=],aH;al5hDU֟q}g~f^E/A¬0>{"OcW;j P^<"La Pq6"d,H@;}Z*<$̊iZDJ+eˈ}͸C;pkt}4οUjG? ,rdUΣ3۔*n?FHQ{b|տL J6UgATx|qVR!lQ,9HJ U#ZicgݺRYhI34r[5)>ڊCD%ϋ̤q (Ɔ!u|A3E6N.3I[oAU]|]RF@{7m i[S%Rpīac*,N >7%PfÖ1"g-LINH}5a{ #'ڃ]E%YcŴ#,Zbce+ PBʁ}W[ G#PDl!&ce] ·غ~qf\KD!:[ljWKo<nCXNjq{Wd"3k1[0c>kSf@m0U'LO&աzC2xLC$~X3$Mcէ zzM b&ln` ;#%+ttK 'cD4q͜:>/)!TG!L>ZQyV)1 —O'JKLdgfG  Î`_4?ƍ Aw3afm; -6=LڠYTlr"m[W8$2_D-C)pUG e}@NoM˜3vaUH O"=tgE$郘E޹͘}n+m-KuՖ*O|mhĘWG]8\%Ჭmn!c wƠ+iX^k* <6CԨM_pD oRdDB\LZzN" HW")`DŪ;%ڜD]9s5R,L}'oas0c~ޒq8f0/s6/{{S)CE{f}h1aFGK )Rۣ]\P@O?Ls8Vs9)QdXGۋ|e>!Aԩ={"b:Je; 75Cg  /[xwB+ǝ+?<'g7ŒҚ6mLބ7*2Fc>gP(O_6fI@SHC >\Norp=K8*LVjniOc/JuimʕR\ǚ7yjOQ2)!#CgZIJ K$2gA{]"V[}vPLҠ.E-8tܮ*||FᅛP(Kfdx {BE96(|Y{q~\? .[p@o{hS}JݦecLH˺zk8q1 u[t˯A*31dWk _}V93;x4h^AWZ8!;zVTbʬ$1DlA<ˋKϑ$jFP_zo-I MaGWs6,G YiJ-:ѳu ׭q.&"3^j~ϭnu^U#xů|t$qIH½Q[4!i0A"eZf`o}*D:eh~0#zý{Y\BoF}|t$erKsl_N]E4XWCv7ѵJ./&-LV^U mwVdOՂoִj [Y XjyuInZ]=b*:ta tΡ ^"SqɻE zg4^iR2 lbZFUȈG(b)=%1Q* 2+  |*Ա`Y=4 .4٭Ф$_ s sZ,m'i LDRH-`E;@Jhwq@ˬ`)+ix5Q]2Ⱆ]PLRjAfpe2*3}+zRY%ota2yQޔ9a>i ҳyz(}9ZI=wVCmpv$Cωp&٢ziaz ^KVQ!? #-h @Z(l _ZN+iy8G#pʈ^{OzǠ!+c&LUW\kb)q)p)M0\U y G(0xM:a ҍ8;{IRHc/|62\čm{p{vcz~~RTu(ߑEɓp4+W\C`DkmI,j{Jj[/MGz5\KPWҭ('&0TK ,?`4ӨʕowR~" -OEB(8KĚ,25G=niDZ@qn89y) *pA˞C1]d-&JjQ>'m`/r(**/|Z)CCU&_,z}Dd(X@"[4oThEKܒ9@ӎzfp-H=+"E-1uGk'^;=W7,/ +&UjbĦ\<|Ո$0Ue!GSm7'!Cba YH03GkJhT*:H݋_2P+r ɥKHM.Ӄ\<1PPXs"bS!&]Z-{bQA1ԩpp~ ny$9#IRغ7y>o07,5](= ^UĖBew3 lŨ$> C݁Y˯{I8 $Ŝ[?0Uҷи}7йuoXУ̑ q&młA^Ϝo:s#06=ѲV3 *U ?<2ay|>3`6o:䍶%MlJ+##FTYB]T3I FVhm~~s [BH\uFt$H$HDyFDDHX|俹r ($epKUac[)TA:NyIpVJD%YDȉ)kܺ6M&rFڥ_0pKm8һCk,\ڻ!o:,Mf$E8I1{kd~}!~1`3M팶%b&j/ĩ;.\)ABt$ _n-2v?m$pt4'i8K:t+G'g =1 'JKM*~>۸KD;n-6PEp"mi"205d)Tҿ13N$ xEGЪ|N>+-`@%'=pvALhT)_'۸),\@#'|i7_F{3X`tb^UB,Q YyNC=ځ$Ʉvؘ-+$ũ;6 j#MN NV7g;kkضRKRZ ǤuC]G=Yj{irX"U釹[fh$dY7ح0uH԰= ^7]Cʩ}Я::kg4iόH#|Zs"(S.cp8&c0Rޯ&Pqcˢe8wBw,fjg1k "AI9k5,s0JWrF&bB {I!bn@VI!Թ4hA?`Fh 3!aRˤ0DFA :.˺\و2/&hƞõd5|iUÙ-~UiIJӰpZԳ'ܬY6/і]<Y~r꼚48mߍn R#xRՖP@,)]EcF݆2  vߏk`۔܇cq%/`lwq6M]31sH8+N3<^(* -Ԓ~0w1); mǍíRckBZTpƯeF{ڣ^W o{6^!:K㥯B8~9?T0nyG.n\TiǻXJy?_Kq/!I;s̞ abTg֘٠*沒i%Txxf?)2# lB˥zW(SWxg H -^S`\:]wRvSt%,F]>Ě*etAgJk~[k0+م)z6G^C˺u7VAꇷp/BŰo>LNcw4A#Y 8p?&,&" Ξ%!k2K“R&'#p8儀:!'#|t(%o]-jJMJyDCFz 1#ե!XL5Vyc0&EfRgNBiXvﮨ^v<5m7Jdۺ B[;(czETDbw. fqYؿa‚S$sFmj_8k3V͛d ފG`~D\D>rr^_Zeⅅ3鬲{#(íp-߰VU=hJAlԩe3a[8XڗQ!WoHilifx@ՍN .rtTT K,`͈FA[EE;=FGV`l6W_KjyHa*_*ZnfF-#f6ERVT֐EKL ?[֩RF^9yH>-[`/,υ*ȎkuTI_/-g-WxE zWv(B3^DG9 a7zqB "rZ,!ܦ<׳v_e"Y1[Ȣv)INwIwHT `WxXu#(?md.)* $frRX;jg<vk$2زMبUfS]T%?D~r|ͭطR+8y1;ڴwXc8ڍbR!*d`S Y U͸Dmlp ; ?/ue'TRaA"J(W^qBXh_(BY[ MbԙNyIx%~8m(T ;_ZlYx КFZ@XeM4b}Χ1j6q:j^ߡz5ʳ?I&vgc甏ӷxA^ې?0?p8u?4֭-T(D&cqnL߇ !*?1iXQU)glʦB_^$b"*oя ln_GJcڀH= fD#u%f L"'`L$^¤'!I ScEM~`ً%D%4 =f=`A ϼ/3yu xHjHn``3["ZBh0Dja;T8E; o+{TҳqL 9 VL ~h5ErAMP(m HUZN=u+~#(@ Z_hj;~^q/+v%8/6N drYѾ`{ig[#5v)^wAf,g pd/nm溭J TњbrRTq0糝d Bz#`ڰ29pfѾ'~e4%!?Z/cVZY#keͻ?qV}uCޡ-J-dX`AKR ¼i?j/q8#+Ӯ ؼ˳i'tE w- `n {-;}yaqd  'aeIV 1S7+U[84 c a"_a;dydBp!g\rRrZKuG6.?^F֣0?Ϧ5n-!o,-cpvOɚ`p7w^rڹ?χp#)OUJGn1ZKf5a}3gج:K9U ؋xo'~H:1?rG) ŸQ)[FvIYk|a;*'4۱6yN0w#ffth}KgڮBT` ^s~Yiil6g & n ;.@,ucE޹͘}n+m-K񵴢*O|mj=Y`=_ٍfM`cDf5uGim`V}h3KN!V̝2kRa`8xY91n\8."ʛ13k{Y+dzŨ3s}}ª.36D<4H6G07W,fuq-MO@NRUi(ӾͬpcnC"kJj ؚ"H'7E*sH2i M$DFEXgp) $ !bH( ff0/s6/{R)CE{ r6V̻$|KΝ( IP._9x~ZMS{L; &oEu;: 75Cg  /ޠԱ >BGǝ?v[0[F @y"P̽ -8:Hh<%YoY0v<*Mg w0w 3j/170uQ_62kkxE{/۶ǀvd/M! p91U9{pY=+¾,4֦\9,:L~d/&e^} *;Wc\,2k[XЄq09ֱ:Vb[z0:u\乯o"Dځ2tɠ-gn~g5*@RtӠѲ`|# PUm4QYn`lƀP~( S:Yյ\1(hgV--8qfI2Ƭ#,2C_a+5 =ӭ|R3IG$Z.ƒfx a$Q2 [¤*/IWE8H}NKވH-İKf(hLkRT)w#'g:!uË_i IHɲ{hlCJ7^ 'nI %pn Z $}>?xGJKcxW3x'd$źu޸S;, ީI3qe8#U.Uz<G#HJԖC\~i0LARR*vhء܏=)m~^ Ha6j}^ }Ӷv[ JR7NJ&֬4C~hCCdzm1L{q1}TnZ0{QG>M\ڿ|\h$#) 1io;7*d3sK}x#,,Z|=Z͖|Iںa!t;VOh GF+IL  2+ 4c6SL4.֑iYf̜V).S,y[UPXLfq\RbBH; 3BX%yNj+,r螌j>r2Cl̬`Aآl&+,/YЦDT^r6 Kk dPd"/9͜XC:NI[O؂rYRT@X/q!TϝU}fi=*LxEc?J؃erIUtA¤(WTcafK`zwE9G#(%x?6o:ih#rJڞòVbѳu eȂ-y^o.ٴH*4O%!9c&ǜ~ ;דv_KZaBPqp8C xrEb7%| KU%;zHNFB\t|zZEޯYsC~6 NI FVd oځA!dߵKCGaXG/Xw(AE?-pbs<\Q"FGR,`CZGit=p ؉5J*Ws1HVH@ckTD3LՋOadŜ_\:= .o]ˆJ@(T#P4H==?D6 mn GҨ/w!+.cE9US$9> ;ҡ lmҠm  Yٺ TskX$-\`X5+ n *yߌ")%#碳SdBIrqo $ y5!$$/ܰa͚53<b8CL!*}_{1H4$rAN}huEPXs"bS`IϽV˞2z5tnS8ܼIr6+{s ӳ=kP aX-wG@sD n(o꬛E%c^,A~:^#7bZyY?;4 h ~''̢K]U~uR;'|ƌ\;U1S'a[3p4 ܀-JH>, @ PD\}'bg~Kӷ,$pw+pNP84,,ʣځW.D՚{v݈MWQ{kyk_rTRX@v:q*5e3s&g"*1!o Cj賐#CZ–ȍ"^X`cOLY y +w֗[MH?SKfo~%\Z\;Mn!et aH$THw-;4! 5T1=>Ÿ^CfA@47-qw ]tbzQiő{E?زR\-`@Ynoe8 X&q2 _ FCk8W4I1މv5F_|F dGC*nT!> ؊͇)K1qNDp2xzJs{ǹðihfv?WnG+ґ['6C1u÷T]L_\OR8IMY [q*q+8ˑ^\9ˀ.6$#9-g|IG^M`B7 'JK`P1-4"N?0c/dC[ Sn\ڦ},mMf#o >B~ N[r8nfHΘ3ZȿДZ31ja >.IƽW6BJGɢܖu磎c;6g=aSpf")7 wM|B[JҐQߏP5}J:rƐ8c/A %+eS:6n W^NvV0Ӱp<7W Q8p=5H J8:7*hsFR;t3X'y?mS XYWn 'YDc>Sa).I%9=>klMݱf/r.ǂimf>|y[p 4Sh*z jhJoT ؊8w*=cAQ[ŸbGe:6y} Li_P. M v<-1AUMV2 J֙fbʨlZ"W[F { h%2OP JD5wp1JHEbdUƇ:C86D*O:%m'%ʾ)oEMuRuХgfFbYِe9 *t?^ăfNMVY!BshqVXL_d  frvRN鳃QYڃV<ӎ QLK<"##~clb&'1ӛ1rwN)ź[HwvIbMz@~"b}0!p? :^"\ZX y> Of@n?cWnRY쌱jnqUosv,/gYD}[ޡRmmBTe 3G>in_XFU5MeTSYWpuΨXne] #>佷l/B 0hX1ɝi(cHjr>) I7⵨/1eq,F:i$|}CEF7zIs1s_4O{[vh1cFg٠ko0,q84C_x \O0%V\ mz'" IN["C^~""_s S:w.Gie2i!xHQmI.$)zG sFJԪRt=. 5v>?6O˗au}AU 䈀QaWX ~Z‘#:a@NSd^Rϼ8ϖG$"hԨK7vM[X$ 0hZ]@Ⱥ\C տb¯0㓏1}v>ŽXzDG.4T+gg. Ɲxa}4.hj]ƒ…{@š^[@Lj?^]x͈!RgxEbY9X?;F EeY lk jWAؾ#269WDED1ÄIS|/~9o6.,i;`B6haţYn]yׇ%}8(K>pyyfQ087KczZ{RN"aUՃfE"+5i4Ffy8#9DdFs\< \:;wK8{pQC-L:Ȑ%ٹ.R 0*-ҀȐ[:'?l~ !7:3BõqؐoxaƖo{EԱ1ZS"|bz<1:oii)Xb<20d第POݲRwDj=hR^{ '}-=bY*+/2 :aK $fN'(pW<ڸjU59PTwIjR劅֎Z=;EVng"ў GIl{嚷4oE@j7o4fGV~}v GФ;τ0ܫugBf}$Qa6nG?8ߘ&-H|"!A *]?}=w㇉ܣ%6CjOL-]D14` /`ޣ "O@ǎeޣ|~];+r5N 0c}kp^!'c#c,ǧoT.LT&~QQqjp=*^>DQ%lN[~o|RFhK"pߗypw&NWgC"`t;4Շ7S*|%,L:qvzѣzE Z4{0g!/ڙ6*Oȩk k^σdQ-&Nn`S <ݫbٕ^L/ЪvF'FnP@IDAT׋#KT(gQ(hx?O )fu^iCi?9Y/S#V,pI ckӘzu$=ipQ"{YK}|^c,g,$l r PHږA2*i .3dc/ܓɲqf~ >KumMlxvYο5g X Jw{bR6E`̳fjP8Wܭ3݋{௫wi%_cO+JQnmdIS"s L±z3:zbh\2Bq&zfpi n^E3;׺U5l4uCpSqǠ omRT)KN] *Aa"TDIELjxU 6R/;}錞WqǵիjT܆2 [Qؕ/QQ#A9{}7e&㮁w/˽uQN/W_ńqN/VӄϨp;=]Oµ<ͼ(@fs6_4&$k! ō+![き]U!vu+b F'7G ٻ Õ;,{MZݮ#0pL~+ɔX2g/l5#|~KYnME:nz'l ~ŘV>ԩd܋#lf, *%ًcyqFVɖ*|HQo\ %.OE 3TL2B̀bч`j0QCya~ LQ,9xKz/x E <Jz=sUU!^N`1/!9٣ywJmݎK࿓:W]} !e c/fKj6#GjQ9؜1&1.4qі&m^+υ̳=FLzPĻU "ׯÃ} e߅rA7CU~Ӌ +oXMiہm]QHPL;=4O 5y-P;Bv2O8ӷn5 I]\Gsp"bEWck4jLL4FM$Fc%DQcƒ%X0X* Rq!*e߱Swwv޼2/!ؐ4:_I".T־4vp2<8|$J䧓)=|ژb7#o:GCqxa#8-\$n/T \wN.1^/f!f jz.GKqt'oА  )^QabIB^+RϘȾ#):n\/WFV0Gs@aEbax&,1A7(Mꍁ] Qء :yPZyl=Fm3W-CclJ:fхD$-KP0f0#bIB~CpzLꨍoBp xbS%A$zr>4(䙈܇(yf1lyIѼfb.E~>='BH:,Y=/ _K)B o 5GEp6}dHtWC`#`8qT׆])~9XWvؒD iXq7'9~y'=t$k $\ dF]bcܬ5FWuܠ?U NZ6~ |婈zqh72 %Y,I ` 4bB89f:D룭ڋZѸ)ױ43D~_8P@6(v`]ӧN!5' ŮPg{ctͨ7S5Xn17!iŘ搪@ i7,>7cŭ2CWК6-GōѢG}l[s[gۢjxu;im.7hp:%kgƥ3Q[*:)J#~6d Sbrb,ɲ!bG؝0 OIwQY:3W,ŅtcX9:糒cD*.-=/.EVڗfxT%W0 20qzbQ >fZbA)_a`ꉁ`&UHRAφ,鱰g^ie2vŜnbWx|h >1I@hoDms.nR|޸J k pcH{RhxYN.K>ؖUM .iqg*BBUK-`> Im j FurV6g}J<1hl iSț){& {hsqgNıTعҦd&Dfoǀb"24ŐkƠjjZfģK* BtVHڋsw"ڍ & 47ZlL6Icevʤj?|=MTq|ŨWy_y>*t6:Z3<|Imise01[5Ok:E;r7ɤ2aV{ ,v+!xJL ̜Pi{Л1BȀF٢d:5nn o-*SW iLnCόh &2O'Z*`[CwbK`ba*j/͂H$aZf'NnAҥ |\dv<02cA%6j%iL)471 ujynovOkϮ޴?:jZj+~|I?&_*< IvߛxF ^|,Ǖ"{?Ʀ#+6hH% ]ҮQwIȫl['QhhUX$pjMrF ^IDNf z[ k(ݮR<O)8sZjՌbD>;[zymђ107a7##bPrE:P=RJqr*-Wk >ff@Qh S S!mv(Lc$0ej#E6mHj0SY3*+6cT?BŌ$&01ygf S2F&>~BHvB)]6g쌘'#ɄT8QDÌ֬3NA)z!5l1.t_F y:'TeϞ=hٲ%S;)Q15Մ0_RR29fy{{M35v.f̈8~'ی,ٽ@:Xy2ر@e3uԫ` D *g` svVZUŧOXX #ʽ.晦 8mi VG#Pj [[0K ˘wp&NGl!P&b mKrUuE s0N6ed?2^^^rDxRA<G#/9I%awi38{uǀ0uk[?THJJ'/dR* ;vy$I5"à˗/cРA%Y-#p8@Bب)L9&`$%Dq8G#P_eq_:Aa޹\Bfu6s8/ Ψ<7 ݅AGL'sZ+fTVVM}yRzuA{1%22RY:D K }6ZjYԞgϫ!='"{?ŚsW@j |:ue?fۜ0@A 4  ]9Ran<(G!P<=2w<߀qae#z3_{ +@9 YDW%$j %26"JTH&^L"JK5 5sQ*a匍Mwa,dɹa Q *CPừH-S>oם&rEM-CGaXw)g-'OCؑX\HT56#Մvܒ/L{Ǐ_A8A^;|1\vb0?[,Fd²iJlMoCixɦ_}Nap.GRΨȑ%bvVyU'&)vQ'mKymFESRXQXNv*]1cfX},X[[ Icu CW{{Tٱfll Ȗ{O#^Cjn YF];N pZ,VjF˿gG%lk<awOa YcMhH!h5Tgb0cTtF̶,vAZz, XjJLaB۫ky[W fB-:ڿ_I^J\mIQGbT>^hY^g='bSUљ_ùLׁ%VIp,k\D@x&1*HAжC@`RXph9 318 Fo[ @A8@YF +l/I+=G`+m/a;C5e?'l?3 7aTtILUg,>]qm\wO{ v!V 0) ᙡ1cV9s= oāC8u5Q)D<ѼP n9z/ -Qv_ 7֎R%dV:XqYUmSNzLQ @oCeCs[!0 Jm|G s/l;wcgԩ||OFj9Hy7Ŀ Lky0˸WnZv7}?N^;az'k ]1ˇ- L*uw4CGBZݤK?Ybjt$ E=2C=Z;AR)gCc񛗿zeL]_:WO_ĽxzvѬ ? }9@9d!dpI/ZqfF8qTn|ɽF}ص jE{ [m`DSL<д˛`t_x۱*(2tnE  Gj>Sfbh:+VTG ]1#! nkh^?;y±$gLinKXfgif-t|=V]ɨq}|,aNy7n#N2`&ƐL}XjU׬!1aKq9 FOӟVΎyԥo$QILTM8?^{usՊcaeߔJb:(0#3akuH'QT qg~ü`Ϩ-} h0JAtX5k5+']P?,‚RY =ڌ(Qqss+1i3*r\_7ন6bn;392MrTe݆IʓؾFs$I.#pvv6dffRl"[,Qa*}z ,hߘ}X10BN)l+9,' 1t_EvgHQEYD{#TAW0\VXP.DhWkB.'LJ@T"DIs.?Dž0׷*VCKoCF5Ȉ[lr@U(F0U ś׆: );HfG\<%k`o@cρ(l&|n\G\E^tПnoQ'0r]߀>y.[HL |$jBq{++/c D's'ߗ1ii=b)lID{8gǐ?a\k{UjiqBz-0-$ArwR9lan{hݿsѯvk(h0 dbҰ?:ZÐژTۖIE9-KE-*(RobJ%br8&Lf&;) 6ꇼxzA@Q))zOxT2)ŗ3Ax Hz=P{6X#( e#?uXv׾_aخeKL>y 5|~Q4V9 ;' )w/'ӊ% &,^7ndW?e(9UtH5VQ1<W6n--.IQύޏ,>smGyͬTZљH] ΚՃԈlc"p/0wO8ǾffU{vG+k?I ±4hVˢ/3j!:`/ƄeE8hM=,1)s?c68ocRL|z,W] o"D7Ij%>81kö`X;2/#L_mkm| aǃg G6|ux bۡZrXg(<,CoQg"]$UkyӯA91BP>"\1Sd iҘX‚tmVh٧*c(% :mk),աtJ0+ RVH@ JY0c,T># ѹ}>_ETɓK윩~yAqb:/EdLģX~dW +m}D&E@"鬋^08͕Ák]TgL K3:WlxQ˾2D؂+P2).=tת D MDbj/[K/ 7q-f+|2%ːb"c9c"Cn&Xygzt!{نCQM|LR ׶rGNrhӬ;ߌU2), G:ҽyN2%};xsp,!W:K ͨ2ab֓Nl.`CH31q)/+e'$5 OQxMkLBǟ ¶FIz`0ԕ3ap[s{oU!5#K+kl:Lv *}ADEE {@hQTvs-̬ajD/f+N~ux-Îx];.Uf,5۠dnBU6MO` v]j>B/QPUę>8_f*_cw / YQeqSk㔫"c("6}'YGض, /#v'JnۯkRLx dO1F!zu"VB!}9;)*=Of=/Ĩ4ĨHX  |w:}#Q_8QRk%A ie3AO+pa |*C Q(iH60Hqb% 5¸^2B.fly333%fnY=cu"4͡,;႓;cիT^tvJ*YZV^FHJ{0 KeyӴ+NC&p!jg@ i%7(H٥,{d vu>$;rڨDի.R=3Z&/X vowSdÉkL[ [0q.BqLT)KE#:Ϝs'0~0Wiރbh߶p/GWJڥj ~c-5iq#W2 ? ~OڢZ3 W ,D pUV!YHR2" i30r0{"Z}<z:vĉ'c.5FE3pLU0}0nmqk;Tvoq<#+ 2p1=XƊD;s8CoFkռ^V(J]-Q!ґ7*h3^W^`jժ"ՙQ,6CsкTF;j?/G">KG0H G MZM_VSٛT:{a$ԁG&.횶+'vds(sVH_V#y&yp/H)<EKqv>kxJ=;idO8y MUG㜻0Αvw\ƶyfwOnc%2?~KEC(+&݊+m:;.j'?1^b=p{NC;{q̷l~#݋;c yHR^3! I Qx"կee&Fo.Jf=9z d#rLP L<3]idjT*QrT(1I#/  1NN)DN*(@#+# Rv1a$"CAb:MHSgYX^ݵRPzAWJ<,1(rzuT*d 'X6xAdIݤI%Fp Mr$ y)Α{_c^ԞߜlA#]OYDwwg־sWa}T6HW;Y3Wb'F" UUz a)ߌ;yD{bdš[ +aO `1zĘ=#HHČ}{a1^ SwNF(#Tn -4svn{m>  e= x7 NoF#%DQsͨӗa=0q .*F Fhկ~x ܈I ~Ę GE)d!>_^ 26)l M;k][IbI$D +B1`KYɱc;Su(Jmk4 ~<'wYiSzkXg#5&oG⇩m`%J#.((wԾ4secޘ=,8sb+&&?hS<_CK'8fozV};L]< l!`b[18R\y _?{[X;}Ywäj?|=M۩dIhD'"}χY"ڂQv&d1IbHHDGs.nBҡX?s"d&D"J%06R,%l!C ^4-mUkȦ51:0O<ڼ;{prOn%ԍ2XA{qxzX[FxLTmk! 4'd99o`KSU̴ M }Yb\-7&Vړ+~W,bB\c"GF{IL͔()JaDK?BbAITˤVNpuQY%Q;xThdǚѺ[?q4[4y ӴRFO%ԭou9_4;KF1!IJz4aVR*ƪn.Dbjuى:lύa¢O!yNJ$Q&m-wV8}$R[Vuͷ4M#PAJ [!f!ÅBӢV;a^j]zJ?4kKݺ`Hdq>E3湋wDv=oSESc DvڮR~ Ʀ#+6hrAKi8w?쀿7ms7 1AOnjfFvh֣-Bh#F\9:z{Du}AMFc|<8=alz-GpӺ:Nmu\+h߉E-6I+]BS1Xİc1k(D>;[*5"1)̙_LghM>ӎFrbf2iu!5S mFΓ Yvl$01|Lm'7+J6mELZ=+%#3Q VЍ\=%ˢ4i/ Dԩ'y=زeKz`M)ILLL_R$((YG+wE?_l|y`n?_2@D@1t% \-峳WkaH.6lZ|Mݕ+W =$Qy&"Ϣ B,1#Y+:ȑ[g{r23M52@IHT)ۆKTXDG"@v&` #14LJ| x9%@)fTJ{@# MFիFD gccQ"ڦlGʾK,]ϏG#g6c`#FD"]I6,z)r8/Ψ\yk&MWbyXx͏G @cIui] ^1`8 m]+3=r8ΨI)0EihReRN%G#PbXY#`xfUxJ Q)-wQf&KTJQ^G#p8eΨi0uʕ66#p8@EF3* ]]B 1FG#p8~5E@BI:M.#Ն:82G#p3|<]޷۔QQD&΂gVEp8G"!ty_KL&LoHeAa̍~)x!PD! ZZBBNN%88XPyG#p Q)+wYjfT_.Ƽ%&&HOO$$$.RT/1+ݻwsR׊DHN(Ӛb^pcE ȌAv7(ǣ+!P> ݅AGL'IMnooo5ժUSkT^]Pb^ilV&5B`dn߾VZi/ YQlzUa}/B G"ywLމw+gT^&|/1Mh&?caf@fVMd7nϛE˼#S)bRL`+%۝L߈њ ` T FZް j+y}~+@ph& D$+TЂZqS7[`9Xڿ&\‚Éݯ <%)X|<,GKMF!61Q7_x.vRIar3gԥM.v\=;l:U(r #YaR^63A1{kvvgGfH$)5=QIDATQcu.g㽶*&0qn/j\YM0{I<,߯8:GE# G܉#1)p4bfZNur%#xchx1nf, y3Ac`%M8Lv=fsr{S_aKlؾsL #FbU4-&µTg?'lgt* Z,HR H]u rJ] mY /f"6,ݐ3Aj^3PYm8p *%P 8yyܶG^#kFH=&N$Qqzk؈ʝjZ`Zb+_gƕ[xLc :U[ٓ+8ܸxz>M\QE5YxtFxrfdfU^fpSL?Fk$xbLvhܸv-1cN؏7B4 kj)CGc5SVs+{ #F<& q'3؊VM0t_ǴX . \NƜK~ZUڰ{MZ,aR搾~1x(z~f:`E8fSaa|bk޸O=g)F0wDzc~hew?mhUаt9)҈":rr+t8 \J!Ԓ:rԱSOߣxRQJϷrzNq/,5낁BF*u,Q[ i%vB yIƙ1LGnQ5r;uM5cƮUU+3=Sغn+#8;4&>ޚvx <:k6Ĺ[*ϔZ[D4{1gy\ Ԩ3wƌ@zƣⷡ"CΚ@Yؽ7*iߔ33ot{mMOr( ]_cn-9/dۥfМjf-yEuF[o 0E;vFtt%a IL%']le%j5tB~X'5<{xw3Eod7Q0rmi3R*F,*;%Iamo S-Ra r$܎ſGQYQ>7Y-pF8o1l.dlK5 YI1 Crްx(!D&Ed*77[fb_"1Jk7\Od\9"aGH¶3rF,X|{y0B}ZK8s8y*y}JQ>׾Ƽ6vir$OD#AHcbGq\A6ƨE$&|n\G\*{9!Il*w\,i1{r:)|U S ׆!-[‰AZ8(^֠5,eP",pٱ!li$+!<{ r1}}jܶ:wsIg8eo!JXGxwX*h*)Ɠ l8 [\V1)sBظNִiSԭ[_Ϟ=_Q#T$_V6Hm+L}^Զ3줧4k /j< def-V`+ AMatd(ER\͘ is@vB~?9?a0OeG?cRh0r>uvQlHE ͨT+bz'qF׏bӄ]܅.w1l@W4t6-y6e(9UsyV:r/W'iN HQb7oKQӔ~%\(Roa0H}X6mX##<,CoQg"^-VUYm3s%RT,uZN^ߎ.o`h@$[= w} ZDѾ:]+R`pi D<%9& rF% @<}4G%j=.xԓY3^zp$|yj GlޤIgwÑ  I#Ye\aP $cGÏ񋖔W,1)>o1gp?mɋ61&ͧ~U{L; K:H{): yt ׿֔DIȀ6 W<ڣ.O,hQ+J.39긨KRS>{Mr}3'aW5 5/^{f0Cobc=є_l;XmGweܢлz<_kd|L3XӼ/"[(SݵfwfpM [_9u\@&0U"s{q6]|1yLx ټeЄKF&u!R`EE!(u3pP5bB/X0&h6o7Gu3I1< τ'Vfu19! QΙP'3ȘGN6uObh 9Ԧo^>co%+եG._*1x9:$$7 )OS4dS &YpWD5dg?gX{+V>Ӱlz'ʙWȅ?`@9t%-Ŏ:iFKt&+Bb!dxxwbVu㛱J&0qؙ}; };s;֕A'W yR u눱:JtY GzQqŲ:yE4_QL}5Hxn'E--z*m1 IM铠q?zvT3^Ӛ=Sa'㸾[GNͻ"W. t05mm+6"{ylO 4(a9S٤Ix|8n \ #ǍGrEw D! n}#QN5S3Q"MtUE x64XHMRr)H]XːUq<$̆BUJ?wwwyAqbz:u1*>V>ct^30iCيcb1+ϩQVЄƑXk̚> 3X_S,J"qp'Xz1R1enk}_ YGBӗ/}g:&r5ڔdH']c"TZcٿ'm'_])˱! ^s0% }l{'ݏ?'h]0 nn(7t+DGkG0M8sz:T[GSVk…ruzwD-Fâf`;@/i5Vccb L"V+Tgd$#*b{=wi\Ԇ =PqtZVdTv"Ipb% ĖWzhuѡ!*骏Ƞ# {b#ǔ6p46xdnG/%U"uIVX/;7(ζW7_c'9{ jYZ2$꽰ku&?J>?to3z] c Z5H' i"GG_!;q, ԩW_(,-ymZ58bTHJyb" O}l}n%4!1suR_떨2}~mcIMLiG`Gع VXN:{]>{g1 (ڜݔ'pZj{ &WGzT)K%&M3 h ;>9Uڷ-Kbg9=Ew49$NJn G**UQmk\Ew >6^#Ƥ:gpr3Kkޣ>YzS .4> ~OڢZٞ{}"O0!]u1qRHwqT~rk'r)pqfأ [Ֆ 1f2wԒvBppp CS cG*HKCN`RJI EjczZwQrG7jQGӋfaJp5cֺޙ]AC8z# 4]?/mBӫsM\PUVP]Ό:*Ak=w <i[< 4ew dRPcꬶU/+{r 5{bInh6[ M"h%\jR0B N."oE\۪h$.`jJbfu!߄<  ;pƍU B@'$rds0UwQl[ui#0p|r+ɕ3X:/ڬmVY&nU(#=k XOYf:SG F *"<ؿ3۠RoHH'X0Pm㋦K wyVUVL( B2RZuR ZTTe;+`2X /oe {w|[hߏ$\ك.#^лb}z0 Έga(KȻ5'-FG KA.΢[ٹkEjU bk!B6oKMo0U|֍@ULXdjsee4]'%*KV-}l\s/ W \BJQi<+,{ccc4cb9 YT oӦ ܷF8V甀jz^*U@ ʼz/ jD ;Ws+mWO6y/hZ͈"cJ*O֍p{TCb?j?hWT/M~zE_zX+ս *+P-r.Ѣym$aCALTa]#$lޣMޢ^ؿ"k5*Ƿ#CLKDTI)^ʖ,t۸ύpw6gBV|"9#π%^\o3 7paHpZ*n$h݆M1#k_4,obC)s ,eLVF T"cWvwEWú܆dyb*|E;:Xu(_mAe7`Æۺ/&KXT ɸX{qElxs&.x_1v(G37yeCm?|l3mҧ*!rO ǩA-| =!F|e4fD J*Er.WXbfaբ}A8mՏ̩xsːzD{sB(*d>~p[yS wze)cJ劗?nB- HwG7+哇Fhs_'*_a ۸8pf>Bm#8>4c=1SHiWUeYxrFu.({5F7R"聫0U\]6'Kw<4ӡS_JLtޚ cH< HkSE`!;Kn6-'=~#FtZwc[OcK<;3+ouG4b>2k2|VcwTw T{aҤ#xNc̐ aB#8[7U'۳CI G[3BRLS y 2wAC޳gOQ}qEֿ[TY[|b ɶ@,SѬD܈G^lpou<8uYٞM+hϪ ^ȴNÊlM č{?%—/ϞևhX̊`^pkgxl g܇|c_+7ǴA۱d=Jط 'm5TN_6_OKf sW+aԋpOpWpw!Pfdj;g¹ZrYSʇ6CSY쐋 b>[2X#/h5n:쩻5vb‡OZuF@%Ozh3b)f$ ] &fMLCYַxyP;ye0?#ψvЮR{tJ{1$'3/}3t=^W[q{?Ua]K5Ahs=DbڳS;6ntѥg/*6_{`ŭv\PB1>l {2onꌫ|/=fMٷGՉޓ#Q2Nx,{ZMCނ'-v/cÞ#HɒA?B< !_`#,.ȪDC@!tO7gǎs"h p4-@xA]&b̮Xd56=LYVT(h+;!manCc(ѫ1,U|M]^w170T=9v f cuHsG5,#A>׷A#p=]h%#;;S[-ZbpC뵀}(GrQ Ǹ=:71e90!ix/zPޗ(V+2AA_/ĺW-]}B04y1r#vmځceJ̙ܰX;v%a̙e741Fn=25n`x%z,Wi׊aMV\>>7`8q.[cЦK?v8YBi<~7l޹?%~#"9wnRU,kҨHV ɊڿRE,>BN:KDVf*O}m5y-&!E{9Vm4=°xbtMޑkT||Ƭm/k\qհf;v,Un=ztsL/~>neE&{I @ڊpK;:v?>VBe},*>mΜ9rWcu_ 9+ۈLS*<z"]ج BctDVp~Wy_I,SBp:{aƫШxjSTѨTY? T? @ذW)T&K@&Pz}i8J@ ݻkT"Mn2srrЮ]r*Yo<  L@춾=HLʐކasψ KU&o$@ׂkAm)@ +U^^/׫sO$@2tc?zl7c=ᱺv;J$PPP W}U@QӴZt֯T,0C / XaܛK0bN55PPY׃tAjwM fTjc߯9P޹vU-mUjH   (ϱW\W )AHHHH@W# PHHHHz p~Ie$@$@$@$@$@U @A XHHHHHz,V=ճV     :jTΎ%IHHHHjjIHHHHNJ vvd%'bזMw^ HHHHH:*8BL{t{u% * ~缆?[QP$5f#    N *? <$<8{\If^*Ccy0pp'@n$fTR0FT0 \s5TP @qS8bߥ RwyQtVkXZ;ڥ= =M, @-!PCWw¯Y_myy% 2 9!MݨwDD"M!]papPP`WI $@$@$@$@$@@ ը :hOn>r*MSߍgl9vJ!|M    (&4*/|G-XmԓOq IN?\?3nFM؛JM܎mHUU5폮 L9qNӯlFvmxQhRbf,] "uv._N%ª q\̗21h} >/Zy{(8-["5Z°C%0VY/Wl'DŶF0Oyc: )FgbBTdJBT3N3]A%$1\ve_?8)c5HQ9,"@D?Ix|xt r"x}*4AFi#85$$`#ĸTZҧ`ڼGEi z2K4$@$@$@$@$P7(a+AҥKxK+Պqj^\?n [NlQrt -UQy.!%fCx|Mh/='/{sWhX܃|Rnx'3ޘ>|3s/q )a=,g~26}Y-D [*6PB'NǔѮ #*8Ž; @'്.;w đW?DNmƮ *+a+yt ѵuˆͫqXU.<5" Cnb:Cvn ;\foEǝBJ߾ :D\#m 9FFWy'qOS9g=&C[őKl4 -/yj6sT.    T%̛5ac AMTSa9 CA2lS’E^ޑ}.a"T ;08ex2Gv]/҃2v#VHYIHʒީ;Okh4b`CoCgl0\;~A\TĠSs5saMbӲzFnxaw$@$@$@$@$P x5KY=NsCt%>{R6mCͣ+ތm_"x]2UWT1/#%CN~4*W>AFA'k͈ lPJi_T#8r2qYhS0L|Cx&%` , (h\}_     T6lO= %\ r{mæ3qظҁ>OD@=sDKQ(?vbߦmJ j/+6Nw CP~, ޵W#~l+p`p2e ^ *JH"^""JrT/6[l-kSIVov2e/"^VeA36 vކ iIe@NJ Bc_KQoŃ݆ctXwv>}ET92HHHH=W6*/xҲe+hU7Cx=ӑGOz ?)$@$@$@$@u@5zp_WpON{Dcyv5^Y0eeC× NQ¤IG[qnǘ!I8sƎ`L2i;LZZ> N,XPj- InDٕa]?@#[|L00rt1C+rF/m$+bV䓾HU^6RnĮ4d+V82g<,yaS4QzHmȜVY/Wlj ATlk?ÚåvMJE&Ү 7F|c$@$@$@$@$PQ~V3y\n GզrkZÇƛyT9ؽg3S_,߄SEH1#(, C|{1CA=vG!:2 ,$XgIVqa;6g)RM#/ǎ!,Ö"@8sm֟s.0J$@$@$@$@&R_6m 8PЯ_ dC ҥ9>Qy_~=ZjU"_ =o߆i3As4\\SA ?ĶE;o=oO{;`C22[*68|X~tL& 2#Ǭ5)0 5A\؍OgCXOvp). MJZ JҢE(:?qBНhӺvNi^y ̙\wɉIwG聈ZO%6L9I@T}g*cd>A6Ćվ#F;$kΏ;q]aSFq& @}&്˗a6qΖT%u>>Z]O 6ed\f\iU.NwDjU厂 ݹ '!5#KCDs"!Oț}z IDATxy\UϹU$;f#!$BLQ2ǟ228>20<3 PQA $@BNVݵNwtIz=T~,q \y"""o1T6xC<<N--Cv4d=2|9LY8–fɑeFM͈?+<ġ9ԳߨCmQFSÖ5h˃~<aqC58C~36y7l1{mu-lwmHό(+uͪA%ϡێ\Cn;~oaJowaޏ#UHoӠa,SA^zecpx駟Ƅ EDDdm8S /~%""@ggwM'^DDXs]oQ__`AD6Fϱa3_oKeԿngFku08!x^QD6†!ahNk\rrZ["k6C0$""kq. ƩLX0V'm4r<u#}Aɐvǻ>""Z>bOjan)awعJ:aeP~@\fLBc$&Lh}sg+[n%L%J=+L (ʴpI'0a|.^|EvA*d׭@<*/%x9 fֲMoBA%"̪3NQml%"eI/\ E(88qi͗WϱH&$ ^È0p0_׊R8!g? S!ryL%]ʩqyq}?$uW>z#]c`Gw͉k٘l_'T*~n=uWKx!6\fY6TOcD"ʕs*sTQQ.8Mg8P+D"U+ye!Q.-P5LQKؐB@;^t|ʡd8\ r|oKːr,~HoUP,YCDHo'j2nuoxdeAײh=)k!|.h2wvWfogAcv`M}.-a\LʸLB:ՕQ oT9~@&SC˴n'& frl/"_ùrX" y e1 bSMwšu9kOgjCKOu2̕R͌t2=pJslΗ[_Qp1r N s/|?}Rf6nGq(&giLOaKևv0DI^rJDjHnc?Y=9CM.vZ2kY૿iϖΤ9]&]q< bjT aRC4wTkDQDKTv"a!CZZ)+zoV/+|ǘʱOkaW1Y>q͹7H4E"gԳ'1l$.U% 4q;>)nx>S˹0@N{9äI ~_ŷUoaeD~euKF k|k,J冧DQ='a-:$sX0W-)r{SorIŔ=nđCH>lp>|tv?r&L7QOQ2=! ʪ($R.*G?~N]0 [SSY($R.Q(/ !5rt1sTXw&y_l%?_A;t?m?S7?_•'%Yb:/~:S K5s{nKX.l;×NIQWvªj[㮗C _$u?~whRo—,Κ(՟yrLE"r~DuB Z˖/G6ޕY'`_cHG@O).3ư~<ʕ JDrĨBsJos*U-g ])Of@Y~ni1gp /ƙ&pM/l&찐¸O;p?>K~{y|WwfJ=~`+^}K- @ 7yr'Lz03lc7 DEG)9JF=[OD*\8Z]3{n=!_(VJ9"Vq8O "[=*PݶX,aLuQs FZZEQTETFfY ! q,a9:.o ˿K.⢵'3ӖÿSnl1ϱ{݃袞8# Xu2(ud-y%F=܇8" ݈(^^ M=|trNNs̫K/K8}Imm288V h1===r**XjDQTwUoaC>=9Ѿ4קy%^W~aPet\sl]ydj3/]lb^[WL㑭K>GǸg/uh==ŎO~hd"zY82Pck1܎g'6 վUvvro@2Qyݻl6C8Thoo'z#Sv {_CD(c%ᴭNggΙd&1}yyqǒO|3Sbn>)!y=x ez=߻'t8͕_x[>ZY_w[)7GÎ?mp"Dp_ZvyKteZ2!A{91 !8$O-]rAIJ1;𭌶z1nبKIgG5590 B˒%Nu2EU_c }}ۻL(~>4C27HeS0@oj1LӋY9gw)L{O>}dS߸v֝u \[`>C7߼[;לœ &${ mK}^ĆÕc QeVqM&Gp](h{:,E%6 nʒHTE\&"N@ |[K&#=opI?G:NG,GDWuK%Rqey"L=Z''rx1HP!~LT"1J/1RSfǎr9rY48XQ,ۛ'LH&0C2l߾:,T c){&JL$ryyu̪3N7i^q<}($,cpD"A;vn!rAe{7jcC~@!ʊ@q~wݵ;`Æ,0 H. ,]^{%l%K.l^:3*og]wqD6U#3rlg&\v/̌l߷~}w>}'vmJ4DJlYL]eK/7\ʌJ::|ne77Kk4mLoolݺ~t9zoi4X#4Ao/׳{Vn}p#pc7j[I*rk=[Jw(̙ӯmnӰ]2dka,˔xLۼzkbdJ|.Y<͏f36mŖ |YxG*~ׯ/iS-fQˑͲiS-חxݴj12"dv&J׳4Գ B-94l޶m.| (9_öm!.ۨb Tm@N3rxNl!7ҴҦ#hES2:.󋈎yi&?(~lqki")|c]Arm_Si3/c/b{k;xyf58?]y6UwlfZ?}U!ei^D^>=,=#ݥ 4o\6wUv&$?iO^L167U>7һ1o3ϘwvLנm|(js+(,i0ѩ9 7PA72`sEg]:A+~D罃c\?4o+fMUe&{ņJ[|.̜˯W[L弔L)̞d =~$Y39aSJuo 矋Ųw'vﭗP[_u5w\i7Խ[9N.mg[P7/%j(җs>y3Wnf-枋.܀ocH%¯qo۱ab&Cƾ}#fxI̛7UI„~HNe9gi#>Np5I,XYˣ)˓W52Fm8}ay'_Y9aE-x|IP>nxZs\~ucȑl̢d-3vYvgOo.洕dW^J\uSϢfZRUGsWfy*S6n}a*K֭m0 j3D6i)NNn:jL<ǂ=a1Qgkh,9SpffvNynjj7Q_̂B[i3A<Փr;m^5n3'N̾g3, Nmu||?=^s}KY2D>N3[^ppR#Hm5 >I %m8^0T7 gBh[|rh[nN5|.;ߞ?l> /Z^zC& [#""Hw"L_ R7g}ҕ @{4. n܏˒''Cg-0mfKVFEADKV3qK2's%|B&۹dG|JN ~p$>8=G[K$Z]{'By .{63]~"L:g1j5[ iIDAT#lYUɇD ;֝͘{ͥU;pNxf;gp.Řy|_:)dS_]' o3K ,w{sv~ \&M_̾fC{7Pm35|1i+VBS"rus燔Kqs\)`I~hi),7~-ŞFK3xCo|^pv5Z K?Yu*Ɲimô,'<[7h4xg'\iؚlID'տ=}'Gl;Nk?46`~~-^M=mj\j sQswObݙFr'd«o3=[;s?aO֗o[i3sO$psSiiLߧTO5Pܐeښ,_}_-pc}DMM_Ln<A4r4- ݖ]@C)3 ? '~_woJ|7@$w)?rfWȮ:]z}A7H!CGm*G.v?N0hf7퇮 u\rHm/~>|]*0߾W|-]ϭQaL󏿃7߀ڡĈph34MGmrJ]7m,^7e:bKs|wu>q>v5w]΁t eRрCCq˚Ɛ)PYɱd,P^[`cYRP',',)!X.w87SYѸkxWe\(XmئfDT߅,(#APT柢F"N`x~NRJ @jAeMʢva1 ҮK) ei.dJP.XZMjM% դ2N HSj}°4I8N3t8ǏT8IEP,K6.oփj#CoCa0x mrP<\},vy^= |g}L6a_+ΰ6C2,CGD/\aJ>a}{p +2l)CLgҡ3QyGE% C9+ED5M!%""RHHl)DD$R""[ )-ĖBJDDbK!%""RHHl)DD$R""[ )-ĖBJDDbK!%""RHHl)DD$R""[ )-ĖBJDDbK!%""RHHl)DD$R""[ )-ĖBJDDbK!%""RHHl)DD$R""[ )-ĖBJDDbK!%""RHHl)DD$R""[ )-ĖBJDDbK!%""RHHl)DD$R""[ )-ĖBJDDbK!%""RHHl)DD$R""[ )-ĖBJDDbK!%""RHHl)DD$R""[ )-ĖBJDDbK!%""RHHl)DD$R""[ )-ĖBJDDbK!%""RHHl)DD$R""[ )-ĖBJDDbK!%""RHHl)DD$R""[ )-ĖBJDDbK!%""RHHl)DD$R""[151] 98rxNR )T`Hw58bR)RP"U1@29uL$$1Hzs˹Z9r..G\:2TLp9^&ȨD'21X@ r$&f&Ր>\7 5#ӧL'p]a8U \Ogz%4j3rxu^7 pȚC,pp, lnq lnYSМU#k6`RW'XʒNGZ1t:b* WcW"JǻZcQ:]լ>a5f"ȡ4fb p߹k\zKWWDkKAcry>W\bEĔz.VL4Uuu睇s$W`rSthͷR fddpW,W?wbիLfMOO[lq5h%pBҥ],p{$W&q5sYc O|w=͖-]}'DO`ԥ,ӧ΂ݾO=CwenKGΐ|R,ZЎku !344Ӗ PW7rnс) ;;RJqIENDB`./documentation/images/SlotsLayout_alignToTop.png0000644000015600001650000002003312700370701022356 0ustar jenkinsjenkinsPNG  IHDR7OY%bKGD pHYs  tIME !75jIDATx}a 2‚DD'.Lcظ~KNN<1vq&%@cBaR26C;R+RdwX:n8I gF{{:lh4PPeCr(4Ph Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@U X&&&rLLLd||<㙜LjZfffjj44#nhR鈏r|JJ>JOOOzzzݝtwwZK8ц  ,7on>|{jj*SSSW6sCσrRTё7!Ȇl(7^ gdd$###H&'' q8Qh288 fpp0K.A(<IVkdzs~OZ駟^ِF*#4ٹsgvڕ;wf||4^:VիtҔJ%ţUVn<ٵkWI?Kfʕ)[!Xq###yGm۶۷π4`|\2}k344d5IO:x=OwnhW>sޯpO6dc1rd5~@&LONNbg>YIo1JIwmJϺWGuӷ^Iot x(1 ΂+7?7\g|~J1odũ)ebn=|AǚUvِ֔SAbvҴeOm:+>~<:}-)5).1 ("+7@W4~}<.b=t^y^Nٛݕx=ِyႢ K}U4frԋ#4u\OݐK{%i?U$3wOmf3#3>;Mtg&blbVj4M2_39ʇ?ܷ 6`X$6oܔe˖Zv_Z6x1zɾGRYlڞ mLߟ~$nns=W6dє4a_ vl4vl?m}tyr踴'.-1 ,'Sw)IdvӶxֈl̏,7EXdL٘MyAQ#i) M rSAQ6@)7BSn Mr(4Ph Д@)7BSn Mr(4J%`dRSlc7 83~M6 oXL wLRT Xِc`dW6>}L,`IgglrٰrXTzzz q Z. `Q5ǡZ- @ăv٠岡٘f/_ OǮNrJ~AKfC \SlJڵꩩTj0巾/W==oYo8z{{l2q .]mȆl< })'Mo{tII_dmnŊI{qJ+dC6~VShƷK}^c3WfNy`Sl7IUo+Տӏy?f[<קJ{vUO)]~[Y ioYZ.'`\駟>u/g}vVZr,l6hfkLuoJd=+ߔ|"37g}@kCiw3”'wet^2i,jNWYҕWfFMOu79SW<'= JHjJ8vYn]jZ2>>LOOVevv6z=z=FiT*\.\.-J%HOOOz{{!ʍxWڍxYO|ڔO-~d1_l߰>moX+7CͩnO_J^çV bFi]pxeww~Liƒ}%oYK Z-Y[oO?:\`wɉxZHR.{>v-NKƞH}#/ x;'\_{k}idy:obz_2ެܯ 6 ͛ @hSߺ9olhyE]3sp̿7_nEJI{M] h؞ '\EfFxQ8@)7BSn Mr(4Ph Д@)7BSn MZWS[nX敕@)7BSn&Tt^{QJ)MiM?'YOHS_ Pdk{ gG]?ep˷}qnJm*/2훲?rS$+R>,7J,ӱ  )-T*h]NjH%I|l}>N[lvO}dj/:K'4M쎤2$3/w^U_f˯Nz&45$iM`}c@JTw/zɺۯ|8c#jRJR[S{m(.֕d&dj&IWzTRf:)OK)]J//;gIIuC{WG;e͕ԛҖ3~}Y?:omٜ>G\ b3446LS27dRy+$?ښ)/Ni3SNxƩ$$ħ2ݻ6gݫS]9|;+ޒ_*Ou_ ҖZښ=9J{.$'?Q,1J,R{໙ߧS>SINRN6=ߺ!]+>%c3ϳ͹Ҥdũ??tc_ޖK?Gm{FR{<}$ V&;X8 cOL2̓<_ڛ6{?;w-==6JRt-翛ΛJ/ MdߝiI{\2kVm M)W';N b?wy8xc?N2W2ܷT_sRu7t\~^矗O]t0ƓcIy~$T叧2t^nP*In4ߖFߕ/K;3hʕJ"'W\kOIjgyԒ%\t\~kOZQ;L홛{|ȟYZ*CKW~_ƿ=N u&/L]yaopnssO_OW ܔ?{؄ ?ya{.h4ͶS_89S)mÆ &Ѽ,+Xʞ4ƞHc{b0>%ԏ1gwpk֦'~Gcf@b P|{Rw'ilݖ~cϔ{Rhsoc4 fh ABkr) @ 5Ny5_S2 @hr"-B2Ph ABSn rdКܨVfhMYntvvrRtww@,rEZ@ӖfhVn {ִƲe.zFoofAZͼsV2@krcfhrVnZSK.MYfAgҥ`5uQ*244dYCCC)J`}94/7rJ3 r  ;yid ID~,[lsB,[,ׯ7'IKR)^x愸 ]H$*ʎY&gyg^yYf8ʭ\rI:󢯯/\r8ZܨV+RT<ǥR+HZ5'Yvxٸqlܸ1˗/7@K.a8w}wjT*ٸqwGXLjׯ`nI/Z-oyLw~k /35\XZʚj5o}[cǎ{ [ti."o F0i4ٺuklْX"{nR* 3lذ "yf+7P*r9sHyl۶-38-?ׯϫ^ [Fsڵ+;wi===YzuVZիWgҥViVna+7^@Tʲe˲lٲu###ٻwoFGG322rIuuuepp0\lMB >d2>>LLLTfff233ZۍFG^?v+))J)JG.JiooORI{{nwvv'NOOOzzzRV%ML1H+Ȕ@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@F0EePh Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@)7BSn Mr(4Ph Д@-x=IENDB`./documentation/images/surudark-theme-13.png0000644000015600001650000013736312700370701021114 0ustar jenkinsjenkinsPNG  IHDR_Y|BsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|TڀS&M ^D( {^ (~z*V{o۵bK^iMMB-iyݳg杙wy{HTP-2魜$YUdYB @ H$ibh߇/FMdYFUXUF݂jQQ F@  ј蚅łj$PmVdAetM' G@ HlV2iV5 =HDR @ XbAMvȲD0( X@ A%22!tC4@ AD6*4)*ia 2Uᴑ#Irlh@ M044MLӈS ݳ8Kɸya߼w2-,nݻѭk4v+~[ef܍,K @д1 48})ˑ^o .L=/]*f( dD㾟Q$I$';ke"3jq$%9 B iI$ BQq1 ,"K @<0 iiX/S $JT╭LՂ^tOi^(EA%{,AeŎDs bw;~Y9(TPz<|>Bn]]`@ `駞Tk&99э=[%0-n$I3flFg(E h YTq m7g*Zd ٠R,ep8tr{Ogb! Y@ ZccbU\cT[O7^e)Sš 6;Ƕq鴗С#6`x7躎nCvE?(gk >͎f586T4OU4=c!JC8\tr27 r_aƜ@ 2iF6bǴr{{;ܻ=] th徾nz%wZVO Bmۆ@aDHv Ym۲gިN9eA?sRrubq3qAU՟] duQߐIv8[b+3@ 5QXMj$.+{?yY*ոcDozj9pDIŁ5Mt iqI+IIIdPFY ;$FpC q̓X0IxIwBfV*V Ypq-@ cDXm6x + 4]Ϋ^\"IxMGUlv+lV6mBݑ%9b$a6mnD[kYb&0Y,.[ʎN cbVI%Y->Ӱ~ƷY%:@ A0M1##n;  H|\^DW5DXr$ آYy"7 ŎZ@0С=6<#D@;w"+4Xy1%6Lf#T(dmU _n H6DBHC @ aHcFG7b!4M ӬOSTOlH `ZZlXSB@e06H]bc`! `jI^c)ЩC$G0L22ZYN}A4}-aX2-j˲,S*NEdAyK < ׫AғaBQR,?k dĖ!IR( v Wr(:yԓN[yEO ?@jǶCZR UU)_G,D1յeݎ˕̾}9(HJ|Z( ,d6.UUz oUO*^ArR) {L4WeA0nwtQl MOOZFOԖ}S@$%i<_n 0h4=;lhBvArRR-[k~ eχaCU pUO=&6P(D;M aZ)0M4,&zjiS=B/u j,h$Ҷ6_IĴ-dd)< D۱)pg-)RHZZ}47DTЋ6 Hm#2fuFiTE,`KdOT1)D&KCb#z[AhqA4x.kQJJQAjy~zŤl3[oMZZ}47DTЋ6 Hm(2&e 4D]oITxmx>L wZZ}47DTЋ6 Hmcedf  bԓZI*ԢgcT{>azju,S=B/:?lR$7Yl8Bbizف$W7]'Q'M:׏i()!(;Hv:vx).ҒP5Zn;ܳRS;D Orr2EEEZZl8QEO5'(B\nw ]stS )v.8 ǟ" xiMch l:˒s2~ 0hv+1첫o=iv$7bgՋkg7s<sCiWg]uŢR{۝M7LmVwl4tCjj*cFwԏ!ۀz1ebKuP,V).Rl-|I!]g2lv뷣X?:Esj:o!]_M8c5Cƈ ) $X.R4X5 |9IQ$%9qXxm+It|},I6bco&"̶ت+ !d,'dJ6KЄឝ5WOt|dGff<~rUŗvj1kO< uĜgfn5ŖNJq==1L1ҍm rqhEvv6O=l;?,XQNq3Q|?>>_ hÚFdqg9iOΦU<^W'bywDOeƂzE9ӟ|;`/Z%Y-;Z5 09O:v T ?/QPּogrݐe YQ Q⤤:g+(*,2<-dƝﰭ&9+ǝ:@ z!ۖ}/&F]mBذ=q't:XnO~|I.˓O=u\̀8yIq]>h{y<,GYhDZy(ݩT/\.7^?vc)[Nm|?!;zT ֓fcG_$?`8{!5?|WSiߣ o j'95lFAIA>burHJ|CbON!e-]D$C?HVIvp*1m_x-vRnm0u|B h>BUB4'|vFlڐi`zMkm@<:Jqǒnj},7`fo=1BO†쏌ul')`bRp4&v?'[}O@K_P*$P]N+N;N(޹;wJHyT֍) cGrXGj %p#.CơĞ9CmL/g^l(u֭\q &ޭ3s%~;^2O/ 0VY%m$`\2rYSלؽ'D X(9lڰe2 cnqi$E]2zk!yn|W w+,7S߼.KJq~>|7ol0+8~tieJXC<%^i;믍UgF\yv9knÚ3f9KO;?` 4 / 6{ $Ihs'AkFv!##őv0m4~"ݭ}l )t<]Wo揼$|W v"/[}sa `iw2NF'/2s]rJ& 1⨭CV߂;(Z3pܙq=zÌ,sWzE/&rLwޞW{5=U*iPNчvg|apkLDZx*}M=iQtэ[o@0P{D;_CxޗNig{рev͏@4^?Y~ISvOK9:KýeQk+BOVFΛxV/^Ǫa9sRp}ܱiuO^1ˇ-J}ܕWM3Iſ/[%\-8J|uUz؆J?[Vd.4`C^.{QrE#}WsGaw_'? m{MuOߋva庰~2(#?C@>|0l>YhFcX1CV@ثѡI^ޤ֑ejC/{y|FÏbp xۜʓJ"U_5m/|*x,# e@TlB,RO~>%~ڰ7=%]|tT>Sң|U|Wo{QUU9z8srXacK,쯿#< bҕ_M6L?!4M,96Y>T ok$o'q,6:E"5i ӦēݐRl'vE?O=^s^=Ǟ 1ӠKBKJU3X*]UdA *" 0B&6d,FPY9X0:IEkdHHD >7or IS#/O׬n7^V;1'Guz)-lzxN[٣d O/<6}w'Ls攵uiRֹU3cW霩u vbݷ=v Ig?.chxdl7&N9}G`j~ n E0__qGqnV*=;$!mLF<cb ++ܳsrrxq\v |CVi _x>OzӮY=MgPlX zyrSLZڵiSybVydۀ =AzvG97F5?bsHFȰd)Ts|`v"_ ]qT/3 [P?VSQ^*TI#LIm`Br`Y(2Q_VsgX ZurP#Ye+]UX|%rm[~g3O+2C -QS}[\dk77Bяs.=ۿmmhf͖tS8e((b6smuZ@%31޳W]ˌfIcп/zZ~g.:|ڵkǍ7LYOSX[1ڰOzyj 7k J^-1ǔ&; IDATn]։=^#EEE~]76mrdf<43~AcG z젾 ʆY,\ z%l''ӾW?:gO9tL^O;woIItlzHz.;/ g%nYm E>t;;?g[} /&oA*t% |\6hfOl?˝NmX؊b  -Ct֮dHߵ&jh+kv! L.Vħ&b_aFBN +gWY[O?RW^Ï>5튟Qw: ;`]YokM7V)NXҍVp?'n];&fb־yج nwrSOѥS;J:Hhi|ƴNlMֽi< FةDYũ:o4I B/@#Ami ,fGHĺXCӔT:0AطS;DޮC.IVl9>M|M; IK-w4^HꇫRTHP[mHN[WؖLP)i@" bS$c&$c-˟V61aCa KwA4-Q?#RGZ [թ ڑ.$ҶҖ#g0Km05 bS% ԑn,$I0t$dY Rv!Ȳa4+&z-. hG:HFҎlWMXBlXqŪSdI dZ' TK/Ii+BMQ?#"U  BBmI0 d)r;VdE0[D\o1)ⶳvdz-wVi`0yGY0uQg.i#z^SbUE;ԉD6VEU"c F۱Ii@ryJu ]+l1 :EQPUBÎe6}>RS\*jz$Q?#rB av$aTl$( ( yJK؎M$55={ao HPꪧ֙*$9lڲ$INlv a"IrxAYۏ0 e«  IzPdT+ "- ݑc_ B=vm R$xӐMY00M#ӟ/(ȇfnlFz+7B/B/kZ:!0M˅SDO,@Zj !M-bNnQܞ& fYS0 CeW+E%9)|A$%%aw/π,\W[]r(n.c޴3M]g99RSݽF4ixF~բbwhv ?@n/ȧG/Ynd7ua&Vw3/*DHi!c AH %: af-THJSA 8԰X,R:) \Gimu] bǪJMt6!HrrMB\mĈ iP\4Eq":@ ASD$:@ A\HV,-N @Ќ(%UzlhjeOj6΃@Р(U`- ̉@ háCKWK.{"@ 2bhjeO+BA,$hjeO$ O@ FI|d}'a @11>ZZr0b@ x=-Y_-@@ DB&ђTʮ×x{q!0b@ @z^|?zQӦqɔ]yX8M8 .…\a,ma Ӿc$+s $XAˣ'߷my⮱!f_~O8'I:5FBgEEώep`xa-/G_ Ķy30&4*$%7ofDk+S/ ~.Y#g!`'~UThk Zj9ZGә87cqac6ju(B4$Ixbi=6kot)UHcקpϫ LoU@O>6Z;3Ƿ XՃfoː3sRx㷷/'m\uNl|'̝;P(YgVUp"S8)ӷ6i|7\cL.k!JR\yLg?4%Yic c satycc.喫ަ/s1j Ls  ~oEч3xKFjZW2(d7K~z^#f1k,y3'emG3boW#{d/eu^gxذ"KRĖ|O2FXҝw_Ra#u99Yl 97^\z!Cx ;t=66ח;,2½CP\ױ7ǻeDeҭ/j5M˖lݺN']vaС1dl (^̭O>aDW0I]dxQ)l:ZpwgqXO%sבcǎdeaf>~P%_'78pgi@ 8jꫯ쑍d&p˔xa&ҁ!cqʄQOӡs:>ֿO^̀d j?@o*۴FmevW I*#zbp8Ҕ[?8a$'Xv3H'bЙyoi|_ÚqG?ťLW)ǵB)}QEK>~_4hz-]AAQ P<_K24He7|x|`K!KN}*Y׾Nj/%Lɽ#Q\\vǏYnWfW1e$!abF5iWheiDxӭ2bM92h@&OԺTcF`G eUyn~[,~<ےҖ˄ӏ+ ɳϲci 1ڰj6W ~ky5.8!:$W[]\U~0֌>bv:Paj| HNJ-`L6lӬMLt:b͹!P%-կ=ɷ>(Ҥy8TU %܃`^>GUP8~VCxF,6퉜3]ONjnSӊB 6~ɪ0fjj~Qٟd7]ezv\{ $3t%Km6df_[LVlٺ˖qGğ;S-vq?|Zŷ?s~t')gƉq͊(w֣SxzUm/2qqSR5njly'sBR}R/_ HY+RƷy] p99ROho;/lgΣ'QhsUcI}8 n|)vjm8EL_]8pI$Xv#7g44v%ccJMInW0Mp'g1̲1]M6 on뇄>& ? .]#:_KT]ƙnChbƏjEun2zƍ \5i6ʫhHaWzr;tB,!πE8~v{@eo5de;.`Lұ/_{bՕ1\ݢX\>c ~0.ݓ߿51n< bD)5/P:kspɿje!ًa7qUrhu^J ggXlF`l)d;~5s?0NSgr]?[\v&GLJs?r9loZg0 -{tKFk2f҄{X|p͸_8Q6s=FFEjE<.*^0]sұECRxsT8Ch* ˨ail@А(i߱sa.W#W:ߨ9諜rV,]s *lƵ:- [3:DTW剩9.5|=FIP%>OlQQxf`|=zpդI˕ XWizȮ*`zK_d.哅.aJtǙ,=n3Z>n7Onlk腫#;\}Ы7ZgŽ?dw)dfnEjeؒ:j\w˨n_ NuO:׉RNϾM)u?IVzYHVJzh7UӮ>/^2bϧ-Bؐ/,,,W'6aU#`% Ko^M܍J4$N-#!~^>9nya =(Wq |0fCs=ƌiZ+vʤOw[ h}Ҹevҙ|V^1#FD zxu9~@īIWM眊#aqvW!b bA_A<4&՗7{WIVjg.znU)!JoÆ_"|WxC2{8iՆF2i ygMw'Km[wZ+ZbA[ڵhUF[=WɂC@QPY@ 8Di/\D;ڥ g/h999t֍\lXŔ :Eۣ! b4OekױjBq3[YWV[꥿hč%Tr~wֲzX4&)ğ15'%toĈ$Iߏ%K}/YjÝfx^"[n#p8bM2?ʑ(sҚuCɲ폿ۊx8rP{JGS΢{ )d"_O o 6ɴݚU? }Bmgh:,$wߗAZCt9@PȲL^nifAKWK.{"e9%c/y˖t֍ɓ$--YPv,udTⰢASU+VU> h8՜׃Y򸒌nCYI@O@7dՂ"еxДV@شq={FXOP\DP+#4M/_eVJJJHJJk. :\fz+KO.As' *"ICΐ!g~{> K4Þ@ Sk#V h,YMEd X4QUΝ;# Y@ BA-Byq1MMiE^/;v`Ϟ=͆,a@ Ċ0bZPQ1$ ߏWr2:t`޽,ZvWV ļ7x)ei蚆? 99Ln7˗/gq"<. IDATA-85Vʽi$%%zڵk"Imڴil @p XT5bWZ`ZQGJJ $QPP@JJ {UVX, @uN'aaN'.+#XT5b P~cǎԩiIAAvc&Ղ %%?C6J9@ h#V 5ybRSSzXr/tRRRx^TU%++ ]PT6lX2 @МF@P "yb#!IRRZaiINNm/==_;O涉$:?e4| F|&rɘZ)Y3瞩O=Y%W#H/b=YV2*bMXС+\1(gt&/ə(Q,L`7S'o񓹗|%r7cdX: (1Ѹ\6N_tA>fy80_{(8z2F4gO -6@f(>$bVF|Iǁ_GLbiC 8w{0cQX7mӤW_&Zsgf^u )gέEqt= oǛ.nXˠu?wC~I}pNvHwN5>ïv_>IVN Xj!+yob5 vwm@9cx.|S U 9&z %]Gѽ¹`lW0 A 7VcGX?jw`̄E4XǭYrC'7=8=+ke 0唯`1[(=#,o-qoe㎣^΃A>PU54[&uZ J.\zbaypSrelPO`C#җS"x]*OW\҃oFrvaT @Y\_TBt~^T:V|<,çϋj|mxH3ԥ\cȓHZ6sG9˾ 2%a'Eir/zWMT_LY +8~ '<5oM/Z V~\-4&:;Wnxs1_E{,% vW ԬR˙N,[~m y(r]: *C'=0=KH2jleLQ?U)Nۆ)hҖtV]Wy&cY'Yl& 2eʤIDѢEӔO9I\q`ԞN2O[N6jE6-\ @\4uƧߎD p*qU@猷3&h>߰e2oX@H)L~"YEvJ2~{M`q'hW9̹i'$\م_#\UPhk1hTkMHW'&%8R^c$pnz9B.xbYGfB}W35}oƎC٭~N@&7pc#Xkkw\;MŰ:.Fi#D@ ш`@,c4qvv޽QIVVV*U*ǂU gnYr5]2[06j[șt/څ$aLTCz-qXT@bЂi<)ߤ_m[>{DV[>YEvjhmaz?hcf,X,N!ͷ۶ #Zc˽u=1|@ŮTrIğ۝pیy$D?Ӥ!-뱣 |9x${^oJ,b_(U}AdНr3ŞR "+,Y .:_fgb3~~~ն-pdjŠhF'_˩c$5@\T\,B7s悄W2 5@%רG:6oVuq6ulC KzC#0)וBd+\<}H/ذ/U\目;T_,^~ {><:ȶ[yBcG^w6\{f2q3Λ~F/DYo#A%<`UU׽Y>r!/5w(=ZTBsh< { 6&R9+y~[r Y%ٶo7+B%lc}ĸSvpNK-mkL7ع91pP&Jq-"iHz?k\ Ң9_ٿva/\-֑2S&G@0\?oi|>_ٌ s¡BڅF3=vuǤmvcBVauU~\#K$lXbRN[FEgɲ8q_,g۶o̙3t{_;{& c;3V6O8:|:.C&ҋ$I3C&K/{qcH2r s-f{;&@s:|03%.0g3>йSG( ˤfrB?O]fpT-Ƒ RY~DEr&V|t{Yӈ:6 q9aụX΋Zm;π,޺ӹXNƜ4{wa.ΚЍrBƾ_'6mesk'5s%LɊ2.-1J/yΟۛ7nj|ŋ# gP2g{mmZOW<*UGu $!I`D~bѭԨ]`=H6Db)}{HZWCQ%|išA{1re pZP'VףjjܿoRW2, =WJ'yNPoIQ ȜHD4z= 9V*iwʤ='~69U#a`` r`c9+a|zUbQq#3 vpA<*`{f3Q>tUF%b-B ^P XX@ rG_4'{bcccOuvv&&&l @ Ȝ!bIzYRF5UHν>ڟﻘeÉSh}J%=SBM\vsb<䪩x'(_|dfW A=m(z9,ն6M{WC9ިogԂڥ\Coj*V  N Ax$۳J{h=VYc>ǀwEZ BS?mmްT|䰒uV hږ5aS "q"V fMgrUD` CsZY#8K=%+)6 HV,*0'J2:+ZK< ICc 1IdZ%2գI*L|Yq^H(Ea˖-GZhZ^um@ ِ/+&~"^X@ Ṉ$,蘯cS $zMe@ CX :t(Ϟ+hZqwwGe!d@ #B d2cTUl6c2y˗~:AAA > A"V ո\$8nܸ([,++A. uda*xёÇsm@ Dxb|~Ǯܐe$TEŒ[{I$IH"@ <7+"رc8::^G$a4qpp븸SXAQN> Oy@ <+"6444%7cPUF#W^%..EUiuXXSRi@ !b|'ɉhz}5::bbbjDGGjbhqrrJ@ (L+~8@RJdh@V~$rh_8i`w:,b&y`vIf_o痿{W/B@;U%Qֱ 5־ۖY*ĐiϚ=wo;Jc͜x?&5Y8"V  =+QQQnG[\ iR YEQ$b=M|ն#DeL3G/d+vx{b~Pĸgp+tZ OpJuI >h=0vnbSn[WMdNOZ%&z("EKꉯ/^I7%4VgުJ=v<d7 I cu2[4szgAa߭KG{kNFPr\BA>H/b=YV2yϦkK:"Q 啦3LnsO#p[;X\מz?5oCWc0eә~/>Zg%*:Eʽ8@¡xm: ec42Zi} Mp%FƱd=:@=,97|n/+hE碝wm$8*C0;putϾҕ=8]V`Vyosz,]SwM1k!'o{php-לuGɪ(; ad8z#$%BR6_lZG0|LxW΂Lao9nGO^?^lg%ZD>x[f݇7%!l%;9'yJa.xQRAq=2-ƟGa4*"%\`ywX>%͢}VnIhi NpNb3eDr_jm%gmdTkDrhL;unXȗ}Nh!Kܳͧo OL*} s;0gXsNue.)v an%(ؾkmHծY}'~Q_2Yf 5 Cy8N,ÀftIGLw{'(2;W4rb~tcr8[`C2=V2h~Oĝnzi@1rutA}(f_f4>ïv_>IVN Xj!'o=1cYiҫ/wSG3:+E1BI<], Ň}] N%jVv ^F9\:$8R(Q8BC U!A}2[+=cEǗ5=P^R">]?jw`̄E4XǭYrC'7=ǰBo+C]&4*OiZXɮi4j,'@ձ0+ru'ӧ~OsԙBA>PU54[&uZ J.\^<aXgoFaX K51P5:dCT n78U~ݖ3]:jE?bŠ?h?.NIeUfUƾT/׊e1y1_{V_ 2mw8t>_qEJ͞ v*)K`+w1y{yhgjԪPo_2Y1eIg$-#ǜe}"k IDATU>>_c8{ Ά_mIk¨# j8"\11C>߲hcޢDrg=ǞS5VI?U3yKL.k nҵebY$3X=*1>tȤEfߗ*or{jTl-wRsvnA8'ne Hr,,a"o4v2i>kEϒg_c8[ dgg!gd,8˔)'IEMS>uZ&q%ܡ>lpԮڿp͉k7PFMՊN,= u,MVwp$[f+=87lٴi ߫Q.D:ߎ08!v9krv/Kv Ye>,]Ң̧n&_UtAN'5sjBډ-y%?r?T"1ƫ`#o8f=$pnz9B.)^͝xo؂oXvm#bYGfB}CW3y}Iߠ=*enlԊ6mZR?عD[=>귃'ЁLn^< BQZ-*-|ؼe:\f6ə/{-y,+䃬6;prrh4b0h4,Fw/měJJc77\)^$+__ xrGGT6%PĪ^F%չd+O7FWֲ>V `K3^:0-a̝s*,UvߩG6Z-c(SyVE"HZ ZPGowµn3J"FxG4d큷=\ <SU$Ⱦest5IoFVOq/aB*bb<ޯ7rK%N%G^cM`n}Cyx;`ҝʺ}p~u_,v保9/kl[ےI\6{ѱocmu,'k~!UwAFN 7I{R\˭mf$?O>AxH' %xU /gb¹rlNV=_|}ӟN㫤I)>U ɾ/Y@`IM78t.ܰ+92w./]Hi4#cWyL^-fw_lUJԟa zVࢩ/fX5֣e銩LYћA(WN"dחXǖF0НW~9BS ?ƻe#M?}~9b$ NQQ}*z]TJkg*.u\.:S+2$I3C&Kd Xvl.O#oQ%ͫJYo%$0aKJ ̼ݡlgnڗŵuD@`N]Jto8mMO)Hi {גAuͤ^c27$p pu #}Ƭp,*gz^( K \gAz}({<4 ۾{;&@s:|03%r3 )/H%s)3'ML hÀ65NWO%_7/yWZj79lMxSd?fY*`g-l>gal1Y( g],Hׯ^3; q(u0JhG]C2y4~Cc +?bp:[|̯3L?Ӹtܣ//x*hLl|c%KɦtضmUTdƒOt:yjӹk ]b2@.\W88SMD,/VxxR}HL`:N.[ !/|iӧak$^v+%R~]~9EK",.b܌kѠ ݫY w[[ Ɯf#+)^T d#ǾYͺp=lӰM{:&-~CEnO8TmhX*#Gv-NfUv/ j7N>8v ;l0< B_ؽl%W); tRiʖ @ ?nF OyajhZ߿7+FChhhv ] =J,((Wz>sZ2xۯOC'K]O T׶$Lwsl&jG6*]Wit5sZ]ԯC47T7@9+%M<#19U#a`` r`c9+a\XUX,Ȁ*sDc+ %L O@ ЊXŜѢքʛR#iyuLŽf,[~h:A-RfZ~bW ؚ\IKT ~ J҂\N\N,^I1H쉍>:.ٙ+ s 5d]ҕGEg@<\c%43lUTTU.A ZV g]j7}`l8_weLzk-?HH#:uI'NE);X"^Ϋ/ c8Am'3@ pȨ˜:e9'"n8QO7$$oufRjARbr75kp0?_ ]M=eSUP󣛌d _~S-1\)姽[_q߱5CiЃO6a5}T.7=h#4MlFʵ[|Éz]ʈxBLpB@;m+iq#;;#1ICroFwY(~9dݮU|;|rbh/7?hWMӁjt oe|[qo9Psgj}53!I@! Z<l+jPiQSyaemg}[?x6% dx+($$aWX@ r&_d#G`^e*( fS$ YGUUTx3EoТtE`¬ h-&$IkJ/aä$kuhd T9IE$4ZZ,s|B]o# )0qgUI'FAov( [ll6?j2E#buG@ "_b#67UO\f()fb)6ԇxRW q XL XrڴI5K&?V+ {:}5dY1_ǦVH_ AS8 d xt8CMVwwwdYBV <"[>N2 U<L&tfLf3|2ׯ_'(( b`@ B  ٣$GÍ78pe˖Qxe@ %#䃼.,LUUb68::ran߾- O@ؕR(bXRbkO<$I)RqU[ !b|^;v GGGh4bccqpp@$F#\~t:`XAQN>XC "V ElhhhJo*F^J\\갶SNQJ'@  +B  +O,/ktt4666ĠjFŒ Fɉӧy*m0!D@f$I)Ki)lbر}7,~ɐ7=3?Y^v yr]O'>}/!b|'MߧhѢxxx 2:.6,?Yk1r=nЅ\Uʱb_m[$gS xP9w'q<<㐠"V fٲetlF IRua%IʽU"5#cNI;Sft|5a tU,M*]  Ogt/굎ox>3qO8Zy{+elw|$'*5m."OZ[ݶ:U lO3| hRnGD?icRcKy.fW~f)ܓAzOѣGquu%***h˕+!-\j!(J<FF>T;S w/e_9|50.r%4VgުJ(};@;f$x7 M\`Dz6GP>2Vvް _=Y'?5~:@cO1a2e#5^c9ֳ cV 6bʶLIs'A>H/b=YV2yI8l8J@X ^*۽QۚKonVTj!#{=t=S8Ghbٸ8=%~.?~f^>W`䯯`=kpN|X r]SDzh Ӿ?0Yz!\W¬(TI{P%ð(S) Crog^f-ƟGa4*"%\`ywX>%bzPFrMBNwXwNsX{q-&z+yWQɡU3v7g h,^ҩ!\ލn)n`{Tp6-} A>fy(hc!>ނpBgnXgc,d=8eC"fat/{D$f 1H<|f^hM9|'`|'AS'xTSDl8TunA8'ne Hr,,a"o4v2i>kEϒsaB1-Po?oYB1oQ" [x&cY'Yl& 2eʤIDѢEӔO9I\8OV ?ISYΓzQ-ϕbN^M}8ʆi #*w![{ࢱvN.E ƓDOIӕ~ǁ*-׳Of)`L&K}dNڏT5[gm)BZ@!xt{b?&?qqqnAa] %qnTgWcRn䏋{`FѢk,F!)e7XҚ-"^q,Cgk͘c9Y3s :7rb༡LZnEl7#INg{ I (!;ORQ'ap:~+ڔS.ӳ F,-Âq=֦Xn-+.ʝ-36 IDATEvaxpSv~!BJcZl6)BJԟa zVࢩ 4+ƪw}](KWLeʊ4 rDr'2b0@o/q1GC\#yN I M*=zFUUVZ hBV/DzXSWM`Huէw :w._GPQk^Ħ%IҼh4Y Ղ].SMgf GoBu7{ač\_B ?O]fpT-Ƒ RYѳ?rܩ#Ygg6)n#ّf33,& %?ꍞI;\"72tY0uQB݋7Bwi]ٮ`}6E noiʌI>0fz͟SV3 bHl8H|޼>WW&;ܠIoJt26Z{]6o B^U%{d+%ʳ&X1l%(TQ,ZAGMg,F}u?z,xa4 u(N~up塊־ GY4d:^ѯI\X|2r~&-!V%nE N%jѸ;X 6D&Kgmذ7d|+Zv4(fdwQT{?36=!=^T@*AQx /zQQ)ҭhDtD$4R<$$$!!{^ưs̙Mfa٦9m#1__󓆼Ψ R2sz>9fF0` QM6V%L&SU +Bξ/Et/jv3p 'c]9j8* nQ+[3=U:KCS@Cş6|Rx:gds(aߚy̛:kyK+ΌLg!;);As4lMDxDFhN\{.zbf3FȩS&u1 [(#'p[!H'ޣ!{X@5 TpAÅ @ A/7l_pҲ8eri(x[IfA͋yچ8ws$ǹT5,?cu jW$䒙W]=~E#q葼ǰ몎t܁qVA-+JOBQ9n}Au0*t^"j +/։,N9Jδd@VTbd]/:IGs{7S0yYQ-])* :zE0mZmMeղ||}zqyM:JnܸE=yyyX3=K *W!es8ʏ WsԐ&e?H^pRlۑ1*`#WSپX"o}}'aTf39L-` 'LIe>;~-J̨˼g1&<`;m/56L h7{ /foHLJ'hڴySVB!{ٱg>GwoxğCлk(/,y3mh(J[|p[@&.}鮞KǘAnX ZGҢu/z6>NWɊon4'%aKpNm\H2eHkFn@,t /"xW j 'B!*vXŀlZ;-xEb 4 SLyj:oWDszD#`!񎱌fꏙBK(O "{ cH_1ߜћFԵty4`,aOeJXŗ~<M Y~~[53klK<ڝS u-*(^z% !V7;8rbx`.\8f+  рLr85DhlT)F۰; fLm^X' & FYNa!**#G/иqcWV!$a$J9փ_V#{gL}k.m=J>`GnCP[SOO?y3o̯4ؠ+G~w5rv.did=n -{$c̝!V%.֥>*Ў/{p݇ gq]ﱯmM_\[{XqEP6oLPPYYYeގI&g=VTx4r!V SwZ,Sb>Ę} wu(z0id 9#ff£DZKX-[Rz}42ncb2Xp^ڂG^NKRw1YUped'y_8$Cy1RzgM}Q^܁ffEc6ẅ r$cMLxygVX2/F s̋rDЅUQn*R InAXV[`O8 ["` mG-z=ƸR?uNã% Kc֣q&jK1v39ic F3Y7}"֣?b㦧d`i{w-鋟rחyrߜ7g{wqf5ϓkfw>*~8r$}Yqyo΂5Hw6Cy`TQVg6@P h_~wH) lߕ~|r;no XvU9rSׅqOW(QN3[e3-|Cݞcz̺ (}]Uth97GMU |ݢo2]37}9!c s~9%ed:}1g{_D@E5Gh\c.f:ɯLOS+Sa ܓ+b&!=EM{^Q?ZB|nvPz@`><@~k3&ZL&iv?H}ޛ0ٌjsPA,_--Ì^qL0 @ciq0^h%g;s^9 FNVN?ċw73k &ԭ0^όbO5qq C!qĚ۲ iab|eT_SW]Kg9Ep-?=feUuEr(}]yZiul:=ϴX\l.}߿[2ѯv!'8g_qrБnhJ;GoD%?6QFͣ}O` d g[Йl ¸>+yuDi]eM*X"ԯ_DJĞOB[:$QIJ_bOQ ^ жu"a_xyg8-^w7}y],o}nhoږXϼPiMn:;I[BPswa('K<ZƏ|<棧3 TY=6%ܴw!Im|ZquXhLC_DZt+mF&~r$;I]A~3{#l&ܹM6>_abUǏ祱f n-b'yk8?mgG[ @Ɋ棜5-[85$lGxS7GLQU꓍Xox>*Vwp#||7=$r~xг~Å{ݟb2/+>`kGB99ʟJMM* EaU?V}Yq8 ޜ 'g=F~XL /A^~6 >ɫ=8T(bw+YL\ī6ǯԠ6l習&~d-;Ûtrbz(9~h#\.dtR@/ḷ&~9Z,ڞkؐw+G݈8_1ZqN kO,O9N`c^qYk`UZ1w=l7}sf;UWHyWU} 焄?=3%K?c'iY:m @v1T>I[46VOz r&vb`0/I@@%GyxxTrQ{[-tfFm,/_cEQT *2_Ct͉*U4>Ao~%+(5=HbbbܧnK[V+wF&1@\ĝknC~ s|SLP^ӝd`1b;E5- ]mYJw{$ ѵQ&V>MCፈVcakDMlXEK\^\;ϛq~aS; I9p ~.)$ò$w 2ؕtmE׈R׊E5u{Sv,-j0?N$}_#(n,6{&1CP-o_x !.BqJeUslU*ǁ/;׭'M__yRޟnuu0lHƄX5tO֭[KlfVXouyF6$h7$`Ne;әw4{^l?!T6Xtut'[:/B٫?>bb;Z6 *-s7k-昚̀X #hgdQc SPp-uxࣉ N >_}Ѵiǽ70bΓ<>Hs7.7hwf*;m_j5f 3rlreBnWl^RT) gxM$zfm~ȏ!~$pk7xpw#';0'vUxJyHyU߳gO q_Ӳ'_ <5{z=LZQ} cdw=SzE`ufzt~[ĺ "?yNn'cz'n N0iv`'E(jP;we0][^42w!]N zb6Ɉj<ػ2^ϯTűR+J"$2PĈKt-=AKQz,<<PnPkNċә4uF-q` %puJ|~q; :?E΀_x(=<ҕG_>-}08N4\J>1ٜx҉(E@:|bBR⇊>xklI ?J4Fp}I}y1SvZxW,eniw}&~^@Pb2~\ZF.+WS17[D>՚'<Ih"IL3\xùmn*kŘfH@b0B ZA;82 >;P82/#.oNsEv_ǖ/څ*F¯zpSʘS0HuF+aIh`5OH73iZKr9w ܳ&\zY[^O빶Wʼno_MV }2f@ױ/?SQ0ͨ6~!·aָ3߇5vOG'.uC.*[r*9rĕlFV>C-}b^_1A>;a+XR㔭Rט#y'aUҹ-e>qK~pR0mE⫨زª !Sifޚ޳J۫Ls:^f,$|=c?g"ofds+Cǖm hNt=V[SYl9_uŨqgV d}EMݱtƍ|_j=[|\l@@4hРzBQ*eWp{>t:RWz{6m`4GL)>o4F _qjN&waPu=SW$z6L lߞ3.q&v5m)^!BTJ= @X,t(Wv>%wq xp8 LgOX*>-;R Ec_\fXߧu0Ѭ\,B!P,όc͚5#)) Ͽ@FFFX@G44p8utEEU ؽt2o|u!ܙ`řG?|ptUPlÞ 8ޛsqcع`2o-?Ml6-)46k(e!+_B!D5U+Oѯl޲Y( ロF/{fZ;;dE_q\ƺ(d,zz+V#K ^UD1@m8RrҸ~L鸲l)<8>-|tzݗO9iV?h͉KE!JU[4`Oٳ45lXkOcpny/B(Yq/8}iN\+iZՇ.?9ws$ǹTQcSnHcuUGt@8 !BTS5՛'oт50_#.gY]JV6jNn'u%3yYQt=V[SYl9_uŨqx^B!Zw& }7۷o~xMtx(~& [ Wؾ=g鍊 O#NK\7>*oSP]W&* weu6V̴:XBiuW}ZFr@OǢ@&0~3  kD]cy4`,aOeۺʯXc[2ĘjxB!F9|@ԫ&&&#O&~Âe#^8KQPfFEqm؝:jd6aPu\Nld(Gu ́c9]Nl6'jl1b(]p85JvvkpҡB!.*X!ܙX! 3B!ۑ+B!܎X!Bv$ !B#!V!B B!HB!nGBB!p;bB!ۑ+B!܎X!Bv$ !B#!V!B B!HB!nGBB!p;bB!ۑ+B!Εb]Ylj+dmB!ryXSwW^W:.B!p7GlvlK!1mSEHd˭P !BU~櫤W'Ʈ 4HNëVbqF{PߣFmWsnLA1pIs`whU? !BVb4O|Аsʖ9gRgylf=oWѦxkz81/Ӽ?ۏ9|/N: Gb.ut6,E8ݒﺓ.u zk]lY9npx7kܔWPǾԹ\O`Y 6!BrUy8AFF:ǎ)#n\ù{~`SN m;bEEU mdf|>0j#nC/Vy;If¸G޺S>aKz>O͕m(O=9Y6u2Kop6sP?,d B!yhAV7۹[~g:ˮ[ e7_?U?gМIMGZ+ekO!iQئ|_o6v_>,O=NxxVMLtm#Uw qr7Gu?Z';\Kj]-HwR=wqGPT@d_oL#قnHcuUGt@8 !B\`睷A3&s65gьؘނ;2E ^FPTt4WEtV;c*r:5mZmMeղ||}z!K !B\05 00'APPPMlohaow&z`SpSltGye Sطώ_@ g עb I"ʘ,ym;1F%lpt0h$uejkB!T'600Q#'88Bl) JzX*T|R5W46:&cKH(Mc~Ӕ\)/9m_/zw %o޴{b C)x+:CTt G:[g޵w]!BBC쫯\ ڵ}ztn&YM {>cyo.si_#:I,\> q9,X VCTl[/>O1csWM\hNQcDV~LgA-hwbLN!BTr[U*Fhj4a2(v½hlTQ ʸl΂фh@U@56;NpՈbĠկ;.j,7B!D5Dz݅-7mR_u4] h B{^EB!B!nGBB!p;bB!ۑ+B!܎X!Bv$ !B#!V!B B!HB!nGBB!p;bB!ۑ+B!܎X!Bv$ !B#!V!B B!HB!nx>;X/ Vnooozr ]:w: !BQ >-!ْ%blKY;rk` =B!L<>PEpbɳϳ^s~ _jY$ox!Bj9uo^eOq UTP^!B\tU 7U V촆 zz PKB!U)JKIȨ#|ŗxl 7o5ioCvmiִ)_D9fF03OF溷yLN#1jg B!.*u~Sǎ^-D.]:bJ5mʵ׶'mn_!5c}44pf8ޛsqc@ů{+^u.Y/V\bMfhYG /D1pߖayD|?)^cB!j*شݻH* Ҹk%İg^t]~R;&ZRU4_8 Ktُ>÷;q4B~&9xӬ~"1((WA^qidkK͟B!*SNa4 ''//e,f3v@Nt:1/<2]Ҋݵ:I':`F ̟8]WuK|"t UPw䒙|ۅB!y(ݎhZASɓ(+rys5'ocyi E#Zt=מA\|h^Yr#QQeDB!DQiHO ::C(s8^^2؏v4#4,0%46. 3q]}ٟr*\!BTNBlDD8ׄv(+m7 cf= @dDDZY:?Ke=ݻcylw7k6}W;l` [VB!pUmԠ!?I&MhݺSߚƭ={)q&>/c`+fadyLUO(Ia^+{?N5%N tEkB!*v63+'Mhh(/>9ˏ,ǏՉW .ly4Ea貑g/9J50w54SCW-F 蚆eשx%rwrY!PX??6iM&޿ik=1/Ӽ?ǾԹ\O`Y 6O'~։pSM>B!{X݅aPEŠ1@gɼ \}PFþ57u2c[z8,G"LOΘkDO⯩m̺ h Lwe.$](ߍcƓ\uZ\x^΃_1}&{ e|@#d`Y=}1汮D]H?B!.wbz)oΌ}q駷<8}^CQ5HN}3,[Z83"XLJ}7Cy^7<JזxC~B]1xTfZ}83hMDxDFhN\:OGXp &Ʌ&dBqpݗhga@S;gb8U_pp(4He4ҝ-Ǡk\.TE(4N:]2tLR?9uxnG$ݓ|*=L5t*׍?q Hhg-=>փ>.xh%B!e3/~IENDB`./documentation/images/SlotsLayout_centerVertically.png0000644000015600001650000001454712700370701023632 0ustar jenkinsjenkinsPNG  IHDR8K'ObKGD pHYs  tIME  i"IDATx{\}&{z3HHhRe"^(;qX01Ħ b; !I0[vj*p֔/ r%!(v&Hx7QXdtͭ{owΩZV @ 8p' O(<Px@ 8p' O(<Px@ 8p' O(<Px@ՔٍgϞ=ٽ{wٓLNN}LܭljvkwJ[ZMVutt;===:44 Ζ$I^?m۶e۶my2550G,Z(-ʒ%Kttuu) @k뀣jett46m͛S׍jYreN=ԌR( @jۀc˖-Yn]q$,X>;###f.{~Wʕ+s[1D[waF8csgxxX1@\&^OOm'W'hmps=y'xٹsgկ*@hc˖-ιѦzB\Vu6i6 Pb8FGGwܹ3>BXM6e+uQ׳yfLFGG399%UN^ˤlf˖- PR8mۦc)@I 8h@y:=z].JpgjjJ3hdllL!JǞ={.@(m{nq&࠭ݻWJĄŸh 8&''.pW('38h+@96I=@(m133w1.D k4zDߟLMM^hlfff&V+VT*VVHVKWWWחtvvU 8h+fp@LMMeǎٹsg Zdff&zȒ%K5pV (yGl6ŋSVK7Gbǖ-[k.!x≴Zx≥ngiGRcٙoǎ+uKpؑ(< m۶pV (;v"= I@A[1.vܩ/RS^bbb_ҶM@a߿_^ҶM@aLMM)K 㥙)mFj(KAoedMB9qח]fS@a2p`pP(<Px@ 8p' O(<Px@ՔswMr 4m֡ x QjJ+oǶ]׈sp' ONrz/Z_.K2exjW^sW$Y޻y>/IR9t_T%8,0C~ufn@n}y=pljI_NeM@aTν0]#2}z!O0}iHk$I/?y /lYĊ ꙽j${ɭ_̮y2KSMvt,N침~~,/}=]*JpmSM2ۦJJҼco/ ^ n!4MWe7~>k=^̆b'o#|z=~},^qX?>Eeu3+2U/ǎLSt*?vnZ8bvݓ=W=两[03'M!xŕ68;[yұgU_]$3߯\ _m3v7ggoIGOҚlӻw}쳛wߔf_O;O{wr]~3O#K|dC~#sO~&:iLf{=}Yg}ori=K#̻tLnmzcanh:>Sfmt]ru:'Y}Y]tL8$=hvCm cSI}_dLmaz.]ߙZ2qw-OuxjbEmT/sӃ359w}!T> sSK$$R6e5O=2d\+k{艹'}|W }] ^VZo:.7.}m&7|/gf?f|3qwaԖ:ur;V/OG3;,mI3pㅳ-<ԴF%wt=\w4(!*egd.SIcyNf6ޓ~+st}.No9#42kWd$׮8͙KLⳙڕLL/_uRM#|_6&LSڢE7c3'8>-Ivta9GzdCOOʓ2yL/I%oNG%S~gl(~=~i^~jn#K% ۸&{>81iM&l_qQhWS 7dovv#7mH24TTx 2#4t[1㒱in7pGTVxZ[MgjshvͽΚCO~(;o=pg~?",Lm昮:(m<6>Qo$$_Gwv6x]:W)]Ժne4s7yιɷސ}%oɼ/~hPeIϥK3tVG 8~p2u>_8';gݞ}gݞʲ m{ZVd>+kيdhZޕ?W=}Lr'Si4Y}^TGGViZ26ӟQ׏B.<ҧ2}3#[/}Qߤ믿gqhQe=aۑց`Eo^ʂ$܇2 dag6X"xCpX<{/Qۮ'(_۳Cdjݑ9_N+0K RMf[WɮGڸYNضA4~elMK h|TJ=3k7Y@~lUW̾4@*^h kWz(2_A qMTU@ 8p' O(<Px@ 8p' O¨T*~G$8;Uwd5 ~zE-vgff%ԯmӽEGG" 8(Ź/]]]~G$z.mJpt@)K[ڶ 8h+["mb\@uvvfppP!^tvv}ڊqŷxbEx,YR 8(p ?G1|vh"!tǷŬZiVejjHq_Z͒%K2<E(CCCz̛7OJks$/r2b\Sitwwaj *@ UܸEa,\0JE!Jŋ0@p6*uttvveёN:I!JGgggFFF2YbX \j^8(+V 'رSN9E!JGR9眣gj%{}˗/ϩʕ+hmyP6`\p &̻.!GX`A.bWNhVj_u6mڤKSNtuu)@h-[dݺuyǍ8r9OV 6ӶGZfӦMټysQ0YreVZO>9JEQP[yᇳm۶l۶-=X(ݝ fYdI.]Nhs0>>={dٻwo399LLLdzz:FifVuحZrحZV=Օ}Pg`p~(E' O(<Px@ 8p' O(<Px@ 8p' O(<Px@ 8cIENDB`./documentation/images/layout1.png0000644000015600001650000002542712700370701017326 0ustar jenkinsjenkinsPNG  IHDR sBIT|dtEXtSoftwaregnome-screenshot> IDATxy|]e=]ҤBAAJi eGA@y!3 :tq.è#* :"220`ّ[M&w9ޤiA}^}e<7{\˱0T ~dɉaeaYTZXr`6775Zi֨Ͷ#}]Ƹ=>UuW(EqKj(ӶlnN[{^]7CG<3` '(ny1N@快-N_3F~Ќmv{xfF}h/|h3*5yt;꫼Ncx Li󃯺.eWiLg3k֬ò-lrm 't"u+ZDD䐵}{7k_Ym\|"jvDDD^{ذq3X;HDDDuc.>Djkk0c8Cd"LT[1˲+5|_ v(fc b86eanٝ\ D0}0$ P 98xIDƘr<1!Q] 9q<,<b32Dc(v|JANrv}DDd4n1D|"o=E- ̨frU-6_=e.UILBa˶l\sl-xP_Ky|9 uaDFDQm8N=]ZqK1y$hrm ymɧIs{˹#E 몍L$})w\>r߳t[n1F!C$g}k`]JXE*9ヌ q]ۮXq8H$=`׎rk8쳹뮻)> q}hk׫ȁD%X|nbwKera J(Q_*e*AeY%Xd?õcQQ*9SmPNy,[x?/8#J&Ty&$˓#JXERhITg\^a@T I ~@TڬEDi@'0%3iRNeLxd-!NSvC9""18 ySSIf>sC۾}*ϡ*I7Mⷝ%ZZIR 2#7DH344uK 'A455QVʁ F}guсkFs.ky٘r6v|ϒ&qƇ˙SRзn%}'/aas[x- aV>8)H?χрEo>։IyϿ@9=o<U`ɺ O9TslAi^`K!+7c0!KyD=nM6A/NLs<S ÐrVr,"m3 innP(3Yg>_|Dzǚ1C |?rY%pN'k)[ w CpғYKϰdomK.O-{:(А` ~/W= :jJ͑Za&͕:Ɇ,>F$}yrJ(:ERin9=,,0䰔E?"M3-k;.QǭsOfKԷ( May6lRR*G%v] 0 ɔ'!& fJ;3( אLX7JjNg5%*m ˎz}kp5$Ou9#]<̠5&®$ ` ]q5tऩ:">&ij| v e:񟟽[օL:s\#8/\ﯩ/UzfO9 5kOC9RJ$_9}rPe2NCuoj '={,`nE۵c_"C-ʨdKղ,~=%'L9D|}UZ9ig<(>ïB"!z-:'Ldñzxyv8Tm'2#ˁ'2Vf~\m "U8cіDQDNT,+ڱXSCw8ӎ`kb7iw-7|+;-y8/s?\-U>a`g>F'1 VgrE 5rr=""Řj \'" ˭RyG$v||vGxؖ\2ֶmo了:[m3`ZQ4ϲl*'V1ؕP}Una\wh1m5leMVN⹧\001IDJSWpࢫoIO䖇^b3 _,Ȋߵ%[ Ry*[ᖻYx53}\C9u,"Ϫ"ǃ̝XȤ3|̣i-uodVu>g1Ɏ`m /l۶l6MXVmGCKGGZNym' "3Tzn7hs#j9O" ^NVmZ\W?wro_:lo'&5t|\.[]. mrgTWr|Y%|sU4#_wy9"몟VD-c BMhN064vocVB""+srUUq]]i0d+m 't>iTn`F!&*&wӽ};LX# BñؕnrWj[];Ǝ^M!lj"_*FfOvmqcl(4^2ض5TNd 3ge[)/* -0k֬,lLD1_')eO̪ ̯LJX$)Ҏ_ LQrENle0 I|`[6^%_)BӰٴ!(=f6Tk ߩZ'T!T / n!D.eXip.! X䥗VT^RY9h0r}l܎$r唊EVz&te'U.'C6nDExW&s.6t`"Y 􎟍I v"EMbhrmmteǞ(ojM$p=n$dw}uMXȡ%NJE$尢acy:,קڎlV~ڇR؂I(`+~-&&erөJU3}mqG?WS 4 vh0x5(d{ͅs9Mc\v_{--mm#QEbHv:)yhC|/k%&k`V^;ܲ^ /魧es&IdP@ʟWq-8ӦM-QZZVᗽbQ~o` f),<5|/ʨU){9` `K{ M+6&?rlᇩ~%4}Evo1k;k~zkbt.g,K׾@WP'}}`s̘xne`:;\̑V-{.~M[+o"uk)3n>|t#sK4$}>|3ma;o`NnH󮗹qd'Us.s+HXL:,)؛rQs@WPߵC,K8kguHæi'2M7/`3ox|=a܈L9^ Āز G,irS"_PǥzY?83$[N9[XuGL 7SvrD!jWeDS"?܋rcI4;8h6|VM/=]MP}^ OR5'p֌"ZfOo<}3l\ 4)9l; Lm9S'5=k`s0XӨ<7MgM38Z5R)} ~UL+#J9W<ZeP;yLpYt2%b|æ, }]+Uqh:ˎ *֡Uu~dEka(v9Q ] W#/$(u'~zv4 N,aYMD|%U^ǚr!}Ibl|1L򷷐]t۰u%|BOqrk,Wm:o<ͭI643s Ddl(4^W|7t O;ONjHDWsRk8⢟33|Cuh`_',O`\ ˁVCl~ۿֺ~ߗ\r^=Ңw\ ѡm<#˽6v5tarW|M|ɝwr<7ƶX?% Ctd7hL촏sN܁|qڒA'/$z EK$yg^z"/H Zy/Of)d~' X?d.".wm|V2ރgj%;]xq/;b~^7zq̾|zW܄?Odg_I'g r?>E?|<⍼''0=x䈣 qݧo_Of˚O\!l.>}kjNiѳ'pV|662oI'/hg> FN:a.Lhq_N`;t‘-cδ^f$.Sh6lc>V_eq NO-K pv>Eo&{hÆ*}jp\)jv7= ^zyڱk<3,\zQt$j>>4x7ѓw^d 3SgJ^򫙘}LҭG2wbhuD:b1p} .O&G-H \t~@qCܝck|?kl&F8fadCk6?uYiSoHlf_7?׿CvW:%z%Da&H'.;?aB>Ȗ.x9DG7Cl7D8Q(ׄC#8%p0ßmFoH IDAT_'IO' $\$!-gcSx;nC_?Sw ۺ-Qy:"GQ}/t ? 4|0`_=RV{p,S 4rBXl^kShap]VfSf`uDst<{?'_2Ic=y>[0q~o$V\`o\CۿckN[>͜ieiOk82~"Z2MjeݓΫ}G- b5x~eR7ßEnj UShJgrul^PdtCM}H߁}u-L8ga{4j}n~P1yX,E+|W.!i2x"~De;|ףq 쟼GGvRK?{%$~=wbeaR2ﻭT {GE;9(<ަfyUX?~ޟ 5L8梳ӳ"[sI]}[v+Ϟ pӋ 10b%S% ߀Yigd֘p|kn+_/C:aɢ]CSD`e״ Փ"&d ᰵ$|y 2XU<gHbz)=C_E8| u!S a}z#Stoߺ{8 mi[{G+c.e%v;zǢQ k8.6r1a#{Ng)19P v{hQ*$E>?w]F7}[F)c``vPܷfcCUhdѽѥ{n g1N}E)""SDD$H N"""1(8EDDbPpĠA)""SDD$H N"""1(8EDDbPpĠA)""SDD$H N"""1(8EDDbPpĠA)""SDD$H N"""1(8EDDbPpĠA)""SDD$H N"""1(8EDDbPpĠA)""SDD$H N"""1(8EDDbPpĠA)""SDD$H N"""1(8EDDbPpĠA)""SDD$H N"""1(8EDDbPpĠA)""SDD$H N"""1(8EDDbPpĠA)""SDD$H N"""1(8EDDbPpĠA)""SDD$H N"""1(8EDDbPpĠA)""SDD$H N"""1(8EDDbPpĠA)""SDD$H N"""1V~~dY8sk!c;XgQiX{0"mt2%_nY98c6D`WCƹt"m)O29,8I$f]dm2U'j0*m`E;ۦ`BƹƪFWUUӬ`FƵQ?[ft%%]98N%p4Q=Y, 5 M7tYвlޡ8S9sfd2KiBgNÜ]4a~|., NB̩/,[FJԊLJ⋙\5,|ڃ]%gjg{\5/N1ujp$L*lar]pajkzzpڰŃ\My? ^H: BX߳RSǽ)5S1#Y::4${p> ^|Y\(!|9ĉg>yqk( yX p$,0.( [GYٶ:_Ehƒ\{y=p,TG7dzeK[JK] eLZ}I8#>=fӆ6וL?<,-Nr3u/n4o{vۋٲo*1P(„IeX IDATx{|UKNH@i#B76ZG9v:ՖնSK3vfSZuRTmX[q@d'.c@$PI_/$kg=k|ye9*z8V^$˲dYnɕe7Ҟuf96551:a:|V|#m Ў=!_Qv-2؎5uH-޳~t؎t#o7ދcf pb;=~m u~d  9lhm3n1Uvnu2?9?TWr~yCy7oeYmKk[3OW]]F^{{6o*۶3vH ڶ}yc=5n\81Fd" c,;QyZw{h?vz'˖ؕa3n\$ɕtL42L}a04}q,#u{71_1|?TH1+!vy#YvތCB1{6L4v\َ#Ƕ="_ N+twcF~X(YMZ6efV!\^[:̎}-Jr]w@~b3fhʔ&OP]];ֶW;vh˖-J&r=<2#Ab&͚ujT*˩c^ym߾]DBJxrrr6_LhewR<~nZ~馺:;1H [_>wI(H&dٶd۲lG-nK$#)/Uϟ6E׫r++JZqr(T܁_s`-R:k}qvymE*:OΓmKQ y/?c JJlGn"'ۄvJX J,[tZUԃTPT>FlS&-IF~_~T2qd)RJ+r*sѲ%ieN(1[c uIcFLIRkOI{gޣ)TRcVL?JrW~hʔ&R)ʊ QT>ͮ*5MiҞݭJ8 ~Fe3J;/~NA z \R* wq|)џ_ToOH ۻSnY]UsjrmJ^{VTfsNkC߸`(,ν\7:1%:^{Z!Xj:/tͥkĤw~t6QZ/}}MTjۤ'~]%lѪS4y\R$߫jure)R>ЛN%QlZ11SQKvB6]x捯ƎՒԘ*tw꼉i=;/v&7MV>W*!eu`<E&kgNyF PMM*z2_}_U>)Mٲs=wߨ.)E^R ӴJyi[gi+ɔ[ UO^>$ %'ݠC_[?[_F}t/K ք #&ԫ@Wq~J7 %uֿI+?[+(i[fbPrLxZn77GJF'6P6ACeΒ( 5-e)"I҂IW?+gG[#zZ%IQjj&( ˫DJb쇤CץDžaLUU&5I& dT*j#N0 *3TD%j5K*Yg~Zٽw@'uǮE?&q/]]pWtݬ1Us(8dc"j%InEVMQ-{/mTϷ`'US%>7ܬ{_ 5iէҒ-ոispj/ǩ;MK8JXCyrV$E{4U'g-h},"oD6,;e,57?}Su}&S"cd$E~_;^OˣJ;5A gM Zn%RQ%'~[zIR2ɱMҬ:Uɉ̀`+ˑv=_]g]/G93kUǏo;.QT*iZ$IMz痿wonjm}L kۥug儡tv"튌lm(0)O  C~Eo^Ԍ4w\oe iv|OAƔ!X;o^m|^){oPeUnHQT~YX 2Fo }}OH;ځJB2 Ka (nwU 4#/Տ?yk[~#Y!zMOoqԵI] OR}ЎTq6lѦ;x$J(*mjoPuumG}`(eY*o,ۿҎ] QU\]QAVڱu?dU5V9oNVwƗFTIFȿߪG~0CoFt}rvjmgLԭRN25 +۔UzSYj&tڲ^qx }U(RD[O,,/IU*}x-ӦSkPuLS>I{%*ٲ庮ݣL&0 eYl;mA _몵UNym[驧~=5(2}7 ۮ]o{g|]}%^wjo:lӦ=[ZGisr7+٦=&5JR֖=>ز*-[|'{/<7_OUE=|ʳJz斏7E?m=J;/GʸCÐ"NGZke+ JjJROKߜڰcN C)) d{ =3Zs͖&o_'LP2GQmKNTmOQ(Gcw]UUYN-^|ǮLK(O(nO>/۲ӣmJgCYJ$;ȭҥK'*ho Fmmm%6=OiyΚk_g ּO)ܮ_?C˯{Nz7֝/I5׎6K)Gͺ坺z婚YɳBvo֮ȕ_kuSE?R;&`5gn {JrWQ ݪ1~߲_]OvU"#TRE:}#pCl[Qh+/q]%lk'2F3g,.,o|6mIҫ*ɒX6AD*K*2WVEh}@r ]%ȤvJCNT $TU  PJfRJWO>PЛ-[^U*Ykb)TX K(vd((*fٶR%PQIGk`(cDBTOu]M&C)6PyeYyWV1VAUrbQ7[l{Ӟ\v%DZH$#:NXԦM/Qtrc[*oߡ(y^eı3[tJ I&(1_#GUK^UZ^H&w@tGz eM$&nI$9tzatvF/UQ*L&[npiE:S\_v+uJi<k[Vw(*[Q*e2&RPP[9%)y O,ɨoT׶,%I~I۶m׸q5d3J&$˨T*;׭;H&r=wuڰ! zᅜl)j^_\B!R8l[rKlф fHj¬MkܬA=g۲mͽ{~zu[J}{<`+MIRQRRW-XW-JWJM6am۴{~=֯W[T.GJg#I%)iW&#{b]u&^ym=v_;#Q3]ZUW+'jڴGݮo?mj1-2u7uySVtC* :w1j-GܻNx=Zrv6G%I s}͵mԳ=!LFzr.XR &ugΪU<ז(gMK\z"oL^̛+<2?Y\EQuGrsU7(/UTCή-nvibVjɜ%Zz5_0:qo0+%Mtp֗RM.,_nש1(huj:|_mmx4_thՑO02-s.':mqiZ-ZkhiQ]kPgx8[cwx\U[e.{ ۚomJx4]*<~d|]VJ"z/F5+uNe w]*cUx/K&[#/(GN&{>`hE}?cjSkA^s /tߚǶ4-;҂I'/;5˶~xx]wRg jN[W!ժZzKVn)U:,eκIN2%s9\U^(^U m曕>G3n۵QK+-vhKZW/9s&hR]QJA[K%Gճ￯^NygUWI___9kz_.8\]hADm5gu:jrK'hNPwhKΖ!`ǑlĈ9ur^p Vn5}~;F&w<'g{RfZ}p학p3T+?QdɜHQIyYRԢΩwC]իK4=м~;'R4#GB[25?TZ<9oXM7=~~WZ?xUrUN|cI_Kqp vjIjP(h^,d #);)JɁ;s?ueN_w/ϗɵ*[ U^ވ5FiE:}=:_6-{zKo)cJ#n}@'fd7#Yrm.ۚ{o,$ښ]w$$UWtͿ?lz.Ǭ>pu899 N9]=_&m[2_ͤcI FĊ'̱0vY-d5-SxjL$EsH_ |S TU4R4k{* /+ʪ]JJ|?UoL-MV)[iP?$u V>FV4Z<z.oRC3kI7jy4no?řw^Io7JxFU|]WQ94o{qJWg?땸zUxyuo}I/='W2RtE꠵H֡(3dT;[I_l=|'MxƠ]T__ G{?^[' =zmmyi@!g#s` }) Uou~IN=ҋ/CϼڪVzygGxQ#ϯI%?ǖE X$SIk#mdշ\MMmڹ~zgKQTTgHպRߒZU&JlꨬKkSRX<І4JD~I(m[0,(iY*-ْ2BMdv[֦q'};1cHU/ڵmCEv moHC0`H*I5:w9(ise@=[RX*K[:dK}:X$Hݻ: \Ǒr_X [sl;e' wIDAT .#" %`ls\ *slYc㰎-b c X`[} [Ār_qy c7 X@@,r_Hv)g`lv]rYI]׵F'`r_1ɑc0X&[`,vÕHtAjrƦ.&'.8n6t<`,:\l?^HD4~/Q VΒM.1%piO*9N0=p'%laS80 acy>opzX567oK[BfrEHwDVm O˗RLGƂT*F+Vxng/` fRIG9]pFʕr֬Qb,Hh͚J%_>Pg'UMʕ֬q`"la\W+NpJgd{NͲŏE`I&Qxɲ,-sr;VHhP+Wz6ovmIT402Odeˤ3t4os؇lc`Rr,5K vYŽ\NPH&dzGmYlVNmTJ ǧR,q5kхKPQ`ERtEXr]fjkR꤆K55G&8VMA?4)(`t8q֚ChR01@@,l [@@,l [@@,l [@@,l [@@,l [@@,l [@@,l [@@,l [vku׻3$I҇]9ΉI'-T3&=xͺ(UޚP7^6~pZ>^͗}Xq" QJ 3UoGƙWʜӵdL;$[ o\k6ʛ/;fv=~ZL?S &tX=V)Km~wN AN][wx5u>'P:O+uW%I;Ƕu˭]];W_hQd_~H]pt-k?~Fx@?=ڞZ߿tnڙ?wg|Z7?S: AfJި:&9WH΍*Zy)Ur ӳ]I]T]/G-uRSsj͚8Qm*)YHsI?ЩSZ}ry>iquHSZ :wt957o= QA RMT拔]k}T_]<_'5TN]oUWj:$e&B?J^]z]`t '?eցzr;._^n 8ƪ=:eZ~y=80uF[;eQJ}k¦ԪשO 0&qڥ|2jW69I맨~:A.W֫RMf׍;uG^ IDATxyuW-[Y:B:$$! !ۈ2wu2θ::uDsOA!3* E` {,ts;%.:#N=tuuO}Uu,P+!""2R{˲,*_-\,hYqq9X^d 6Z#h͐mmPc?1 SӰ 1[ Xôqkmz9vãczjq6,`%2!s6_ePϘc\idߨ gCwcF#(wq_i3?36Ga ZmÐ+u`vb倱\2/c„؅mY~RjǺ.y8=Gr,""r"]~2jkk0#dCd"LT<>1XWCy먴cw DZ, ۶GDDN^mm .!2&} Cӷv qHƘr1!Q] qH$p02)kb;mp > II9c]qO>Bmd̮fjU<;:xloL*uA}P9bٳ>ILPG{{ػ;v<܄[>R_%;wu&P]UE.0[neϞ=$=Sރ!=-^ʂ|AN(dDfZTWW1((|&{6_\((Dmmc͹"s>z|D"eW3qbaQ`.Sjk6>^"1>cr*NB ϡC<ȣ|Ω0Ƨ,>g7}oHQ8jyr'6Dte HkS_\g9n$ A\uZ"˕qZJXE*ӟ>Hnۮ!pUk `z~kꪫO~J), DZOv=?7#@DTuBCd&/qmcD*Lن["K%V_ c=AewIJ,'Xb)?/qLEE.2l=H$Xjy_?/.`"JzIj&$˓# YERhi3.Ǫ ,uʯvTդIPǏÎTڬED@w'04U)2g5FvHT#C4dbz;:8SPgA}UI| Uu\3ZK8LH*'3Т({{2!tJ?`ȟa5ρp͉NCEs.s];~W,9k k-\4iu)l ];7Я;} .h@~?O؊I6nk.缆";w&z,/{oy2&'?*n(9z+oz -J}wGYoʦLMb~66x|cpd] 0#k!' ;/m͇ϟƂtͼgLR6Aw'MNyl% "5N#!^GQ8}H r?/]A<>U^֌kwPzrJ)'TM:E"ikYt\)[ճ^f_धruv}۞>Rn5̷ <|4&z#B1 ߿r[&{(6g|jm= ?5&۞(E,|Y4Vj,Fɉgmj8_ g<P)bDdhZXDa)E,RG_//y:q_{ Nv(dF6M峿lRX^Z0 f2 dYJQ}AkH ]h(\[%n}E[/gѲn.J _onq8Ol%pƘ1v X۸[y@NCX^x`'ɀRc3-2Op;R 9Gmu_\xmX{qy硓Dd(#Lg QAΩyE|ѧxŜtֲHE~JT9w(˲,6nͰ^bYk)ȔoU~s0&pf/ 3<~sp;yv?\4uoHfp"3(`hkYW7~ˬ'2壖|O*m "Ufӏ("w (,c)Oʇ>A€Rп.pH'?׽\^]UD}785X3zq1%u=O=,CpdMqŲ_"2x `w8׉Q ]^\}1_F?5 l+\rm۴wP]-6===x N,J?c+;(*t[AX"k?bMԺ,!%Rw$Nv\_d\$Y"LngߛotZ_8naZ+O_%[n91AOŎÇDu9t l0 ێvd/,s]p!)_C AEMmrle#?yռmn-kv.xđkju.>WrKlg+z4hk VsOh' 7~Qq]Q]o K*ح-jq"Ddh#" BCKpõ5>3,((јo%8Ĝ0/" r 9u=ک4(UN}"\(F!&*wN&S~p8ve<E壚|۲P+l(g};W]8L:Pͤ/ʃoײbO[g@s3=<_!Ϸp۾7r勘Y1yZ-g5qք +$;-CO>guSE:V?& Zr[u~L}+vtZ >RM!%(/' ~DE̙3;%<1`6QhغK$m:L,|ud?Ekkl Ŷm ۱^(KeZ=BW /"J!IX W4xd+sa@̦Hӓz3вIx.deOV~ ;M;O,Ky\ LHQ52dM!J] ϣ i !D[[`;ʂ.r7߼3Pܱ!\P!frlfqf {9%K&M:5Į]3'Zv`? F+VM~3M/+]OP lyhμmVTdkCH\E  X̛u WODw~Fl7ǹ1αmσ@/) D]O/L,jCP%4X_@em ;xKf}eӦ¾/ᚑQT- #I].x?FvD@OPɏ{{q6g[ жj 8mio9ILt5&:]zl_OjX;}A3fYq^N\[u?-eKަ${:[v9kX.4kãu?SxV~vr%^]f%۝'D8ILҮ9. t?B 6-!o`;|D~+I\F$|zj;i";IepkgKdX]<4ݱyw)_049>1鷼e{-| q_9s5[W_^>ĄݼXXtwgAK];?̏{Ky[ٿ#\pJ>; yb OƖFʎf`q穈\*k*c"=<Ӊ9anŪ3lv `^;SÌgCG&Wsuf?e\bVe9|h[j&3qkdm&4e2>ϠΙI.7K"uD G$ϳ{!/(BwGO>Ps=śoUu9d"|B R7s?:/Iuxg=݁7dbCɪƳ*Dyz";xswI23q;$$HY__''4^ 9IDAT|;Б1%p0Gn m{{ ο$}(OOm\' 4E)'Bwt''`l&8Ս)|[lm5 q~?{g<#%_s#6 *4D6Y-2 /-8s`݄ L&8hԓ__Xߌ݇w]A oדx_~!9f̥LdX͆?n8ÅKex9/OD -/=v;w7Lnn{ u~yᷟ枞:X5t Q#q)ĪLԷHǟPwFo~C1~^2qf@dwEG0D$6-^EbK&qQԝ~ 6܇xS׸s}<{iHh,ƒ=`LDaoLq1inl8U YNrof=zk@Fw|`Տu-iZyE7֥\*A?r Xڱ-B4)uPw~!G"V Jr=HgzDP Rn64{4.e,;I ( '1i$=A&`9LN$CstWvU"V~_GƁRP.3(pG= Q~˨1QA[ƞ!'0-=E:Lb0qsCՃC$H,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" V̼hZw""C\:N[Zw""CI$_,;7eDDfTU9c]iKNDdh6ĉVrZ*NDDf ƺӎ̘1Ul l±`S zuU F*XʰzubK9% zp5ԘWScnpXP ŅłW{LfMcOow~!5yfȒ%K;,XBKaI,,q;pUv(,::Br9C`"q8]^/UUuuÄ 0uEMEDX܁ yj2)TDDFJ@H,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B#""PH,0"" B3lFeXW!mh8 ,Td$XW!m(`F|o(r,&Ǻ 9EmC3ƦM<m6Bq'r\x!K/e+^7z0Jp,̝*ho*;:0P(„ڡ,rL"aRPS=e Δ)Gw,fPʙ+iͷwU被EDabN9;YK::YMul"K} IDATx{]e}ϳڷ{.$$!!$@4$(Vہ^*UZjTrԢr BM0 L&̾sX{&$ ~k=;׌u֋Q>Ncj9??}7߂h>Sr{a#}h_ǎ_}w;Wgtڽn2wj(QcGf;mG_{_1r#=Gxd5~/f:18x˩¸qMUDDDduuuf:lj̢S8o؄?Î""""uz ZKd#loZ1C[oc=GՎ0@ujskhll^Ul #|'C5xKZGk6C0$""kqjq]R)/-X[[whQ. >tDejrdݱH2x(O\cX8e<3i)\,'7n/f[__Z(ZvV`E8. WyTBRPW}T*YK0~|aQ8OmC?SFf,IDlݺGyMq=3֧&Os˃|wfO}9o)0%g!g}=nߒr_0⑕(aH& b1^w q C?@x^ ǩ!ryΤ78>icp]絾oZ M\0n~0eJlԮhhDb6NmruMicNnimmځ_a 5{9?Ngg'eC1?>ohNŭXph&q2)ǻqiV[͍ ,a7b~ؚٜ['~0E4`h;}\~)̞&rz(q~dVȏnGs(WsG?SܘYʭo&]a(ӼqO=s03 dA/Qrjd振cUw?=(Z6A/gMq&S*Ðhʠ*EEMfS&R0r9ngps}˰v~_>ǚ:Ms*km)T„i=i:)`&M7qx07I8kg9LSS,O_,aO'Ƨ(E6beŗQ ho_6ސB83ynxL5r›fVc%J?% ~5^-G/6VUOt! Ce Q68aRy~C\:o; ( a|RRV+wK70 _W/4lVQ*vigPCjM*3fsrg;7qi^gcxs^_{{׸4/K]dm8Iey37GC%H-CU~+dh;nqq+!~o^q,'}O~&y9 /Si6wk yjTNcX=N7ulAZQ-?gћL~ q*G6κC o> 2]p8uf0.tu'.9o K.⢥'0㔷S㿼FCVk1\ϱ'{;-!V)'3v\v}"""ʨ0qYWx7" ѐnU_2U{||f5pLLM}}>Nq񮭓ʼn?8ډڱ8EQګ}LBv b8D^f 'Z73ޘӐz-qWh ~,VN]0]&15;/ uP#ߐ&\{͏sR h}=ŎO%""clW3ETGsx.W'bv6o_Ds 6wvjk@:Uylݺ|>G8'f<ϣN|xF| AEvKG98Nr{|F79Υv~FMX[VGÎ?mp#DDdlz)-t_gq*mڇȄ[9& ! 84O-] پ ȤShcpCf>Yk ţ.ۻꢮfx;Ah?D\שM9@Q J8?0?̐t 7Rw{pdr[9Lh1:q!_'s 7OjfrxݧeuܰYv\jHu\}Ή"eByT]_bo@SL""2Otj[M~׵`KGx)zM;)gRqWQ1wb(ҋG:qP;̜y4ƉGvn'>^߻1` /2`p\|؈JJ%"O]SOؖv(U 0Yr_R12Ŋ7MC$ (2,|J`2G6S[c-~էR k/I\,AŧsqHgd=6>2bW;"""cZ>3AJNpeC/ 2!Djw3ƀT;T92)JU^5TvAdǦMC:GnNRaikk%'vB?dÆDQD*Mq\4` X\s;T]ळ4v{x_PTd2n"Kr%|Ꝉ åOrY2P0ģ.1q;N 6R((f`mD\OL:K*`lҙ _e 466/d2` KZOOO/Lt*O]:."""Y|)j/8>QE18K*"'\lǧgSC'xLmu\ܔGKav|{R?M-W@9繤)0" z}b |>>kIDDD^?A4j1!vZp;:C#+v㨵5 xu5{j'\2iL*542_FWw^߳+7Ea𣩆gDDD`i%""""o'"""rzL""""4$"""2+WRZsQYVb\Ɔ!*v98uqYBԄ df̠0w.ٳ)̞W_.}>Vd妕<9n[V"eLDV.8K6-003;m.'fvlsqxCgKu+" 0t* K>]6K/ȴiMK׳宻N+%Ftqge1KMm7wq3wb #.pҪą X̟E6r 7̔vUKA?˗yZ^|pˣp7n۱㬂$[~,gCk-=ꨩ׶My7\f)XHH9@b>OLz7̔իiV.ҡX;}:p7_Z 5)(FEzz{8{4t VcmU^ Y+ԯZEZUV U,_S`U*lJxǦ,V|r6nKX bօXTa΄ֱn).'u@-tt@v,%reC.,0AG?Z(7:;UF qED 3r\1uDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDs\>**̈Hr)̈H)̈HBy$2>"f'7͋3w_Ly|_ci _ zo쁵Y=@[{ w$p!.Uel㲺'~ڙz2G}1{Q/?* `65ݾcT{<ZNxLXpLd6`zvfwOO`ǙAI:K晌wZo18^sԙTz7Pš6X]X={Oywv$Xw I8nq[<~"΂6 .23gHYCfLyg[zv,>b0w#G4?&Z4lUт #D,pWtď- 4T?~<Հ}';:rl³DT߇p_~ 9hF܎QD[1/l,b FU㦝D^Zp17/_wuIodF]A崧fsQoL+>C]n39E)?q/1+u'A}{Caf?+|*~"{4Ƅ_L+qC}n48 - .!3s=2MҐ2̻c;Œ)Xj/N)pܲܮ+=:d䵘N*7 X̏?M݊NG/=]Hu4ŐI7/q܏ns9HL!Zs'0k. *\2 sͼxg8qh˿}L`i<}"G/>o]8Y;w??=.:CyKpVrsO&?ku{-w?-nN>|;لԝrӮdq:IgRwR2@܈؉-{8B=ќgWXG#V-ȗ%2L~9[cݓ`%,UT1'cƵ=}:s3a":W d14lZԿw,?ᓫ/0i `qG8i++WB9w=-Ä}LY>]=Z,*T|He;պi߈*\J}^CS܀T3:q?Svì γ]ʁ>ɐT9Pv#O^f[쇰o1:gy6p0u۶Rֳ ?҇f۫?CLPjYzbD!!3\IJk\<;Pgih kί,yzySaK9n!ύĿ9-锥n..dU2'6c&͞߃k?K0[Wm9~g$X w7Ig&/n#}?U A~!K[)d&q\*[ ,;\L!UGCX{޷N1;&7>3h6n|wqw§?[L[OsJ?D#3:vpU`(3<_@mqDߎ-_Nv0ݱ ~hr|@4BN< .onMBeso:r0?}Y5|~=?~n+l.צFfm#b]NtQ8/t6} kLo^EEs?BE-Wcvw-ؑke,{ {'6] )t1>ՄH]wnSiSX@6cpфCCyC&5BuCGw1% 7cIGR^&e94a&_;M2P ˀ @°uPk;S۲m'3æP "DaPhȷD/=w˵0)ZDGI< TkҶBh!gBn |QTCVv)ed: wLv'٣ʥ݊z;\F\>J>V ;_a}nx.0 ]^HZPd}L6a[;ΰZa`6,Tʻn㏐;=׋lD)uΧR;.>%ZzTq^>*K~$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$Œ$( snju'D{;9 XwCs  #@!="8R_Qǫ`"Õ@-L ÓL 0uIXwI\Nej%4u91IENDB`./documentation/ubuntu-appdev-site-header.qdocconf0000644000015600001650000000352412700370701022454 0ustar jenkinsjenkinsHTML.postheader = \ "

    \n" \ " \n" \ "
    \n" \ "
    \n" \ " \n" \ " \"Ubuntu\n" \ "

    Developer

    \n" \ "
    \n" \ "
    \n" \ " \n" \ "
    \n" \ "
    \n" \ "
    \n" ./documentation/all-modules.qdoc0000644000015600001650000000135712700370701017037 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \page all-modules.html \title All Modules \nextpage {Ubuntu User Interface Toolkit} */ ./documentation/ubuntu-components-popups.qdoc0000644000015600001650000000134712700370701021651 0ustar jenkinsjenkins/* * Copyright (C) 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \qmlmodule Ubuntu.Components.Popups 1.0 \title Popovers, Sheets and Dialogs */ ./documentation/css/0000755000015600001650000000000012700370716014541 5ustar jenkinsjenkins./documentation/css/base.css0000644000015600001650000002707612700370701016173 0ustar jenkinsjenkins/** * Ubuntu Developer base stylesheet * * A base stylesheet containing site-wide styles * * @project Ubuntu Developer * @version 1.0 * @author Canonical Web Team: Steve Edwards * @copyright 2011 Canonical Ltd. */ /** * @section Global */ body { font-family: 'Ubuntu', 'Ubuntu Beta', UbuntuBeta, Ubuntu, 'Bitstream Vera Sans', 'DejaVu Sans', Tahoma, sans-serif; font-size: 13px; line-height: 1.4; color: #333; } a { color: #dd4814; text-decoration: none; outline: 0; } p, dl { margin-bottom: 10px; } strong { font-weight: bold; } em { font-style: italic; } code{ padding: 10px; font-family: 'Ubuntu Mono', 'Consolas', 'Monaco', 'DejaVu Sans Mono', Courier, monospace; background-color: #fdf6f2; display: inline-block; margin-bottom: 10px; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } h1 { font-size: 36px; line-height: 1.1; margin-bottom: 20px; } article h1, h2 { font-size: 24px; line-height: 1.2; margin-bottom: 14px; } h3 { font-size: 16px; line-height: 1.3; margin-bottom: 8px; } h4 { font-weight: bold; } time { color:#999; } /** * @section Structure */ .header-login, .header-navigation div, .header-content div { margin: 0 auto; width: 940px; } .header-content h1{ background-color:#ffffff; display:inline-block; } .header-content h2{ background-color:#ffffff; display:table; } .header-login ul { margin: 4px 0; float: right; } .header-login li { margin-right: 10px; float: left; } .header-login a { color: #333; } .header-navigation { border-top: 2px solid #dd4814; border-bottom: 2px solid #dd4814; background-color: #fff; height: 54px; clear: right; overflow: hidden; } .header-navigation nav ul { border-right: 1px solid #dd4814; float: right; } .header-navigation nav li { border-left: 1px solid #dd4814; float: left; height: 54px; } .header-navigation nav a { padding: 18px 14px 0; font-size: 14px; display: block; height: 36px; } .header-navigation nav a:hover { background-color: #fcece7; } .header-navigation nav .current_page_item a, .header-navigation nav .current_page_parent a, .header-navigation nav .current_page_ancestor a { background-color: #dd4814; color: #fff; } .header-navigation input { margin: 12px 10px 0 10px; padding: 5px; border-top: 1px solid #a1a1a1; border-right: 1px solid #e0e0e0; border-bottom: 1px solid #fff; border-left: 1px solid #e0e0e0; width: 90px; font-style: italic; color: #ccc; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; -moz-box-shadow: inset 0 1px 1px #e0e0e0; -webkit-box-shadow: inset 0 1px 1px #e0e0e0; box-shadow: inset 0 1px 1px #e0e0e0; } .header-navigation h2 { margin: 18px 0 0 6px; text-transform: lowercase; font-size: 22px; color: #dd4814; float: left; } .header-navigation .logo-ubuntu { margin-top: 12px; float: left; } .header-content .header-navigation-secondary { margin-bottom: 40px; padding: 0; position: relative; z-index: 2; } .header-navigation-secondary div { padding: 0; border: 2px solid #dd4814; -moz-border-radius: 0px 0px 4px 4px; -webkit-border-radius: 0px 0px 4px 4px; border-radius: 0px 0px 4px 4px; background: #fff; border-top: 0px; width: 936px; } .header-navigation-secondary nav li { float: left; } .header-navigation-secondary nav li a { color: #333; display: block; height: 25px; padding: 8px 8px 0; } .header-navigation-secondary nav li:hover, .header-navigation-secondary nav .current_page_item a { background: url("../img/sec-nav-hover.gif"); } .header-content { padding-bottom: 30px; border-bottom: 1px solid #e0e0e0; -moz-box-shadow: 0 1px 3px #e0e0e0; -webkit-box-shadow: 0 1px 3px #e0e0e0; box-shadow: 0 1px 3px #e0e0e0; margin-bottom: 3px; position: relative; overflow: hidden; } footer { padding: 10px 10px 40px 10px; position: relative; -moz-border-radius: 0 0 4px 4px; -webkit-border-radius: 0 0 4px 4px; border-radius: 0 0 4px 4px; font-size: 12px; background: url("../img/background-footer.png") repeat scroll 0 0 #f7f6f5; } footer div { margin: 0 auto; padding: 0 10px; width: 940px; } footer a { color: #000; } footer nav ul { margin: 10px 17px 30px 0; width: 172px; display: inline-block; vertical-align: top; height: auto; zoom: 1; *display: inline; } footer nav ul.last { margin-right: 0; } footer nav li { margin-bottom: 8px; } footer nav li:first-child { font-weight: bold; } footer p { margin-bottom: 0; } #content { padding-top: 35px; } .arrow-nav { display: none; position: absolute; top: -1px; z-index: 3; } .shadow { margin: 30px 0 3px 0; border-bottom: 1px solid #e0e0e0; -moz-box-shadow: 0 2px 3px #e0e0e0; -webkit-box-shadow: 0 2px 3px #e0e0e0; box-shadow: 0 2px 3px #e0e0e0; height: 3px; } /** * @section Site-wide */ #content h2{ font-size:24px; } .box-orange { padding: 10px; border: 3px solid #dd4814; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } .box-orange .link-action-small { float: right; margin: 0 0 0 20px; } .link-bug { margin-left: 10px; color: #999; } .link-action { float: left; margin-bottom: 20px; padding: 8px 12px; display: block; background-color: #dd4814; color: #fff; -moz-border-radius: 20px; -webkit-border-radius: 20px; border-radius: 20px; font-size: 16px; line-height: 1.3; border-top: 3px solid #e6633a; border-bottom: 3px solid #c03d14; } .link-action2 { float: left; display: block; color: #fff; font-size: 16px; line-height: 1.3; } .link-action2 span{ display:block; float:left; } .link-action2 .cta-left{ background:url(../img/button-cta-left.png) no-repeat; width:22px; height:48px; } .link-action2 .cta-center{ background:url(../img/button-cta-slice.png) repeat-x; line-height:45px; height:48px; } .link-action2 .cta-right{ background:url(../img/button-cta-right.png) no-repeat; width:22px; height:48px; } .link-action-small { float: left; display: block; color: #fff; font-size: 16px; } .link-action-small span{ display:block; float:left; height:42px; } .link-action-small .cta-left{ background:url(../img/button-cta-left-small.png) no-repeat; width:19px; } .link-action-small .cta-center{ background:url(../img/button-cta-slice-small.png) repeat-x; line-height:42px; } .link-action-small .cta-right{ background:url(../img/button-cta-right-small.png) no-repeat; width:19px; } .link-action:active { position: relative; top: 1px; } .link-action2:active { position: relative; top: 1px; } .link-action-small:active { position: relative; top: 1px; } .list-bullets li { margin-bottom: 10px; list-style: disc; list-style-position: inside; } .box { margin-bottom: 30px; padding: 15px; border: 1px solid #aea79f; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } .box-padded { margin-bottom: 30px; padding: 5px; border: 2px solid #aea79f; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; background: url("../img/pattern-featured.gif") repeat scroll 0 0 #ebe9e7; overflow: hidden; } .box-padded h3 { margin: 5px 0 10px 5px; } .box-padded div { padding: 10px; border: 1px solid #aea79f; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; background-color: #fff; overflow: hidden; } .box-padded li { padding: 0 10px; float: left; width: 211px; border-right: 1px dotted #aea79f; } .box-padded li.first { padding: 0; margin-bottom: 0; } .box-padded li.last { border: 0; width: 217px; } .box-padded img { margin: 0 10px 50px 0; float: left; -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } .box-clear { margin-bottom: 40px; } .box-clear .grid-4.first { margin-right: 15px; padding-right: 15px; } .box-clear .grid-4 { margin-left: 0; margin-right: 10px; padding-right: 10px; width: 298px; } .box-clear time { display: block; border-bottom: 1px dotted #aea79f; padding-bottom: 10px; margin-bottom: 10px; } .box-clear div.first { border-right: 1px dotted #aea79f; } .box-clear a { display: block; } .box-clear .rss { background: url("../img/rss.jpg") no-repeat scroll 0 center; padding-left: 20px; } .box-clear .location { display: block; margin-bottom: 1px; } .box-clear .last { margin: 0; padding-right: 0; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; width: 293px; } /* Widgets */ .ui-state-focus { outline: none; } .ui-accordion { border-bottom: 1px dotted #aea79f; } .ui-accordion a { display: block; } .ui-accordion h3 { margin-bottom: 0; border-top: 1px dotted #aea79f; position: relative; font-size: 13px; font-weight: bold; } .ui-accordion h3 a { padding: 10px 0; color: #333; } .ui-accordion h4 { margin-bottom: 5px; } .ui-accordion div fieldset { padding-bottom: 5px; } .ui-accordion div li, .ui-accordion div input { margin-bottom: 10px; } .ui-accordion .ui-icon { position: absolute; top: 15px; right: 0; display: block; width: 8px; height: 8px; background: url("../img/icon-accordion-inactive.png") 0 0 no-repeat transparent; } .ui-accordion .ui-state-active .ui-icon { background-image: url("../img/icon-accordion-active.png"); } .ui-accordion .current_page_item a { color: #333; } .container-tweet { -moz-border-radius: 4px 4px 4px 4px; -webkit-border-radius: 4px 4px 4px 4px; border-radius: 4px 4px 4px 4px; padding: 10px 10px 10px; background-color: #f7f7f7; } .container-tweet .tweet-follow { margin-top: 10px; margin-bottom: -10px; padding-left: 55px; padding-bottom: 6px; background: url("../img/tweet-follow.png") 0 5px no-repeat; display: block; } .container-tweet .tweet-follow span { font-size: 16px; font-weight: bold; line-height: 1.2; display: block; } .tweet a { display: inline; } .tweet .tweet_text { padding: 10px; background-color: #fff; -moz-border-radius: 4px 4px 4px 4px; -webkit-border-radius: 4px 4px 4px 4px; border-radius: 4px 4px 4px 4px; border: 1px solid #dd4814; font-size: 16px; display: block; clear: both; } .tweet.tweet-small .tweet_text { font-size: inherit; } .tweet .tweet_text a { color: #333; } .tweet .tweet_time, .tweet .tweet_user_and_time { padding: 15px 0 10px 0; position: relative; top: -2px; background: url("../img/tweet-arrow.png") no-repeat; display: block; } .tweet .tweet_odd .tweet_time, .tweet .tweet_odd .tweet_user_and_time { background-position: right 0; float: right; } .tweet .tweet_even .tweet_time, .tweet .tweet_even .tweet_user_and_time { background-position: left 0; float: left; } /* Search */ #content .list-search li { list-style-type:none; border:0px; margin-bottom: 15px; padding-top: 15px; } /* Blog */ .blog-article #nav-single { margin-top: 30px; margin-bottom: 30px; } .blog-article #nav-single .nav-next { float: right; } .blog-article article header .entry-meta { margin-bottom: 20px; } .blog-article article .entry-meta { color: #999; } .blog-article #respond form input[type="submit"] { float: left; cursor: pointer; margin-bottom: 20px; padding: 8px 12px; display: block; background-color: #dd4814; color: #fff; -moz-border-radius: 20px; -webkit-border-radius: 20px; border-radius: 20px; font-size: 16px; line-height: 1.3; border-top: 3px solid #e6633a; border-left: 3px solid #e6633a; border-right: 3px solid #e6633a; border-bottom: 3px solid #c03d14; } .blog-article #respond form input[type="submit"]:active { position: relative; top: 1px; } .alignnone{ float:left; margin:10px 20px 10px 0; } .alignleft{ float:left; margin:10px 20px 10px 0; } .alignright{ float:right; margin:10px 0 10px 20px; } .aligncenter{ float:left; margin:10px 20px 10px 0; } .entry-content h2, .entry-content h3{ margin-top:20px; } .entry-content ul li{ list-style-type: circle; margin-left:16px; } .entry-content hr{ border:none; border-top: 1px dotted #AEA79F; } ./documentation/css/scratch.css0000644000015600001650000000350612700370701016700 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ body { margin: 0; } div.toc ul { padding: 0; } div.toc li { margin-bottom: 3px; } h1.title { font-size: 36px; line-height: 1.1; font-weight: normal; } h0, h2 { font-size: 24px; line-height: 1.2; margin: 14px 0; font-weight: normal; display: block; } a:hover { color: #dd4814; text-decoration: underline; outline: 0; } table, pre { border-radius: 0; white-space: pre-wrap; } .annotated td { padding: 0.8em 1em 0.3em; } .wrapper { width: 940px; margin: 0 auto; } .main-content { width: 668px; position: relative; left: 270px; } .title { margin-left: -270px; margin-top: 30px; margin-bottom: 50px; } .toc { margin-left: -270px; font-size: 100%; margin-bottom: 40px; padding: 0; z-index: 2; position: absolute; top: 100px; width: 250px; } .breadcrumb { position: relative; left: -270px; top: 30px; width: auto; padding-bottom: 30px; margin-bottom: 30px; float:left; } .breadcrumb li { float: left; margin-right: 8px; } .breadcrumb a:link, .breadcrumb a:visited { color: #AEA79F; } .breadcrumb a:after { content: '\0000a0\0000a0 >'; } .title { margin-top: 50px; clear:both; } .breadcrumb + .toc { top: 170px; } .breadcrumb p { display: inline; } ./documentation/css/breadcrumbs.js0000644000015600001650000000141612700370701017364 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ $(document).ready(function(){ var ul = $("ul.breadcrumb"); var li = ul.children("li:has(a)").remove(); ul.prepend(li); }); ./documentation/css/reset.css0000644000015600001650000000153312700370701016371 0ustar jenkinsjenkins/* Copyright (c) 2010, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.com/yui/license.html version: 3.3.0 build: 3167 */ html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:text-top;}sub{vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;}input,textarea,select{*font-size:100%;}legend{color:#000;}./documentation/css/qtquick.css0000644000015600001650000003404312700370714016736 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ @media screen { /* basic elements */ html { color: #000000; background: #FFFFFF; } table { border-collapse: collapse; border-spacing: 0; } fieldset, img { border: 0; max-width:100%; } address, caption, cite, code, dfn, em, strong, th, var, optgroup { font-style: inherit; font-weight: inherit; } del, ins { text-decoration: none; } ol li { list-style: decimal; } ul li { list-style: none; } caption, th { text-align: left; } h1.title { font-weight: bold; font-size: 150%; } h0 { font-weight: bold; font-size: 130%; } h1, h2, h3, h4, h5, h6 { font-size: 100%; } q:before, q:after { content: ''; } abbr, acronym { border: 0; font-variant: normal; } sup, sub { vertical-align: baseline; } tt, .qmlreadonly span, .qmldefault span { word-spacing:0.5em; } legend { color: #000000; } strong { font-weight: bold; } em { font-style: italic; } body { margin: 0 1.5em 0 1.5em; font-family: ubuntu; line-height: normal } a { color: #00732F; text-decoration: none; } hr { background-color: #E6E6E6; border: 1px solid #E6E6E6; height: 1px; width: 100%; text-align: left; margin: 1.5em 0 1.5em 0; } pre { border: 1px solid #DDDDDD; -moz-border-radius: 0.7em 0.7em 0.7em 0.7em; -webkit-border-radius: 0.7em 0.7em 0.7em 0.7em; border-radius: 0.7em 0.7em 0.7em 0.7em; padding: 1em 1em 1em 1em; overflow-x: auto; } table, pre { -moz-border-radius: 0.7em 0.7em 0.7em 0.7em; -webkit-border-radius: 0.7em 0.7em 0.7em 0.7em; border-radius: 0.7em 0.7em 0.7em 0.7em; background-color: #F6F6F6; border: 1px solid #E6E6E6; border-collapse: separate; margin-bottom: 2.5em; } pre { font-size: 90%; display: block; overflow:hidden; } thead { margin-top: 0.5em; font-weight: bold } th { padding: 0.5em 1.5em 0.5em 1em; background-color: #E1E1E1; border-left: 1px solid #E6E6E6; } td { padding: 0.25em 1.5em 0.25em 1em; } td.rightAlign { padding: 0.25em 0.5em 0.25em 1em; } table tr.odd { border-left: 1px solid #E6E6E6; background-color: #F6F6F6; color: black; } table tr.even { border-left: 1px solid #E6E6E6; background-color: #ffffff; color: #202020; } div.float-left { float: left; margin-right: 2em } div.float-right { float: right; margin-left: 2em } span.comment { color: #008B00; } span.string, span.char { color: #000084; } span.number { color: #a46200; } span.operator { color: #202020; } span.keyword { color: #840000; } span.name { color: black } span.type { font-weight: bold } span.type a:visited { color: #0F5300; } span.preprocessor { color: #404040 } /* end basic elements */ /* font style elements */ .heading { font-weight: bold; font-size: 125%; } .subtitle { font-size: 110% } .small-subtitle { font-size: 100% } .red { color:red; } /* end font style elements */ /* global settings*/ .header, .footer { display: block; clear: both; overflow: hidden; } /* end global settings*/ /* header elements */ .header .qtref { color: #00732F; font-weight: bold; font-size: 130%; } .header .content { margin-left: 5px; margin-top: 5px; margin-bottom: 0.5em; } .header .breadcrumb { font-size: 90%; padding: 0.5em 0 0.5em 1em; margin: 0; background-color: #fafafa; height: 1.35em; border-bottom: 1px solid #d1d1d1; } .header .breadcrumb ul { margin: 0; padding: 0; } .header .content { word-wrap: break-word; } .header .breadcrumb ul li { float: left; background: url(../images/breadcrumb.png) no-repeat 0 3px; padding-left: 1.5em; margin-left: 1.5em; } .header .breadcrumb ul li.last { font-weight: normal; } .header .breadcrumb ul li a { color: #00732F; } .header .breadcrumb ul li.first { background-image: none; padding-left: 0; margin-left: 0; } .header .content ol li { background: none; margin-bottom: 1.0em; margin-left: 1.2em; padding-left: 0 } .header .content li { background: url(../images/bullet_sq.png) no-repeat 0 5px; margin-bottom: 1em; padding-left: 1.2em; } /* end header elements */ /* content elements */ .content h1 { font-weight: bold; font-size: 130% } .content h2 { font-weight: bold; font-size: 120%; width: 100%; } .content h3 { font-weight: bold; font-size: 110%; width: 100%; } .content table p { margin: 0 } .content ul { padding-left: 2.5em; } .content li { padding-top: 0.25em; padding-bottom: 0.25em; } .content ul img { vertical-align: middle; } .content a:visited { color: #4c0033; text-decoration: none; } .content a:visited:hover { color: #4c0033; text-decoration: underline; } a:hover { color: #4c0033; text-decoration: underline; } descr p a { text-decoration: underline; } .descr p a:visited { text-decoration: underline; } .alphaChar{ width:95%; background-color:#F6F6F6; border:1px solid #E6E6E6; -moz-border-radius: 7px 7px 7px 7px; border-radius: 7px 7px 7px 7px; -webkit-border-radius: 7px 7px 7px 7px; font-size:12pt; padding-left:10px; margin-top:10px; margin-bottom:10px; } .flowList{ /*vertical-align:top;*/ /*margin:20px auto;*/ column-count:3; -webkit-column-count:3; -moz-column-count:3; /* column-width:100%; -webkit-column-width:200px; -col-column-width:200px; */ column-gap:41px; -webkit-column-gap:41px; -moz-column-gap:41px; column-rule: 1px dashed #ccc; -webkit-column-rule: 1px dashed #ccc; -moz-column-rule: 1px dashed #ccc; } .flowList dl{ } .flowList dd{ /*display:inline-block;*/ margin-left:10px; min-width:250px; line-height: 1.5; min-width:100%; min-height:15px; } .flowList dd a{ } .mainContent { padding-left:5px; } .content .flowList p{ padding:0px; } .content .alignedsummary { margin: 15px; } .qmltype { text-align: center; font-size: 120%; } .qmlreadonly { padding-left: 5px; float: right; color: #254117; } .qmldefault { padding-left: 5px; float: right; color: red; } /* The `#details ~ ul` selector is used because there is no other way to * target the content without overwriting the default styles of the page. * A better solution would be to reset the list style on the parts where * this style is required instead of doing it by default. */ .qmldoc ul, #details ~ ul { margin: 0 10px 10px; } .qmldoc li, #details ~ ul li { list-style: disc inside none; } .generic .alphaChar{ margin-top:5px; } .generic .odd .alphaChar{ background-color: #F6F6F6; } .generic .even .alphaChar{ background-color: #FFFFFF; } .memItemRight{ padding: 0.25em 1.5em 0.25em 0; } .highlightedCode { margin: 1.0em; } .annotated td { padding: 0.25em 0.5em 0.25em 0.5em; } .toc { font-size: 80% } .header .content .toc ul { padding-left: 0px; } .content .toc h3 { border-bottom: 0px; margin-top: 0px; } .content .toc h3 a:hover { color: #00732F; text-decoration: none; } .content .toc .level2 { margin-left: 1.5em; } .content .toc .level3 { margin-left: 3.0em; } .content ul li { background: url(../images/bullet_sq.png) no-repeat 0 0.7em; padding-left: 1em } .content .toc li { background: url(../images/bullet_dn.png) no-repeat 0 5px; padding-left: 1em } .relpage { -moz-border-radius: 7px 7px 7px 7px; -webkit-border-radius: 7px 7px 7px 7px; border-radius: 7px 7px 7px 7px; border: 1px solid #DDDDDD; padding: 25px 25px; clear: both; } .relpage ul { float: none; padding: 1.5em; } h3.fn, span.fn { -moz-border-radius:7px 7px 7px 7px; -webkit-border-radius:7px 7px 7px 7px; border-radius:7px 7px 7px 7px; background-color: #F6F6F6; border-width: 1px; border-style: solid; border-color: #E6E6E6; font-weight: bold; word-spacing:3px; padding:3px 5px; } .functionIndex { font-size:12pt; word-spacing:10px; margin-bottom:10px; background-color: #F6F6F6; border-width: 1px; border-style: solid; border-color: #E6E6E6; -moz-border-radius: 7px 7px 7px 7px; -webkit-border-radius: 7px 7px 7px 7px; border-radius: 7px 7px 7px 7px; width:100%; } .centerAlign { text-align:center; } .rightAlign { text-align:right; } .leftAlign { text-align:left; } .topAlign{ vertical-align:top } .functionIndex a{ display:inline-block; } /* end content elements */ /* footer elements */ .footer { color: #393735; font-size: 0.75em; text-align: center; padding-top: 1.5em; padding-bottom: 1em; background-color: #E6E7E8; margin: 0; } .footer p { margin: 0.25em } .small { font-size: 0.5em; } /* end footer elements */ .item { float: left; position: relative; width: 100%; overflow: hidden; } .item .primary { margin-right: 220px; position: relative; } .item hr { margin-left: -220px; } .item .secondary { float: right; width: 200px; position: relative; } .item .cols { clear: both; display: block; } .item .cols .col { float: left; margin-left: 1.5%; } .item .cols .col.first { margin-left: 0; } .item .cols.two .col { width: 45%; } .item .box { margin: 0 0 10px 0; } .item .box h3 { margin: 0 0 10px 0; } .cols.unclear { clear:none; } } /* end of screen media */ /* start of print media */ @media print { input, textarea, .header, .footer, .toolbar, .feedback, .wrapper .hd, .wrapper .bd .sidebar, .wrapper .ft, #feedbackBox, #blurpage, .toc, .breadcrumb, .toolbar, .floatingResult { display: none; background: none; } .content { background: none; display: block; width: 100%; margin: 0; float: none; } } /* end of print media */ /* modify the TOC layouts */ div.toc ul { padding-left: 20px; } div.toc li { padding-left: 4px; } /* Remove the border around images*/ a img { border:none; } /*Add styling to the front pages*/ .threecolumn_area { padding-top: 20px; padding-bottom: 20px; } .threecolumn_piece { display: inline-block; margin-left: 78px; margin-top: 8px; padding: 0; vertical-align: top; width: 25.5%; } div.threecolumn_piece ul { list-style-type: none; padding-left: 0px; margin-top: 2px; } div.threecolumn_piece p { margin-bottom: 7px; color: #5C626E; text-decoration: none; font-weight: bold; } div.threecolumn_piece li { padding-left: 0px; margin-bottom: 5px; } div.threecolumn_piece a { font-weight: normal; } /* Add style to guide page*/ .fourcolumn_area { padding-top: 20px; padding-bottom: 20px; } .fourcolumn_piece { display: inline-block; margin-left: 35px; margin-top: 8px; padding: 0; vertical-align: top; width: 21.3%; } div.fourcolumn_piece ul { list-style-type: none; padding-left: 0px; margin-top: 2px; } div.fourcolumn_piece p { margin-bottom: 7px; color: #40444D; text-decoration: none; font-weight: bold; } div.fourcolumn_piece li { padding-left: 0px; margin-bottom: 5px; } div.fourcolumn_piece a { font-weight: normal; } ./documentation/ubuntu-components.qdoc0000644000015600001650000000137412700370701020325 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /*! \qmlmodule Ubuntu.Components 1.3 \title Basic QML Types \nextpage {Ubuntu User Interface Toolkit} */ ./documentation/ubuntu-ui-toolkit-offline.qdocconf0000644000015600001650000000172012700370701022521 0ustar jenkinsjenkinsinclude(ubuntu-ui-toolkit-common.qdocconf) HTML.nobreadcrumbs = "true" HTML.stylesheets = \ css/breadcrumbs.js \ css/reset.css \ css/qtquick.css \ css/base.css \ css/scratch.css HTML.headerstyles = \ "\n" \ "\n" \ "\n" \ "\n" HTML.postheader = \ "
    \n" \ "
    \n" HTML.footer = \ "
    \n" \ "
    \n" \ "
    \n" \ "
    \n" \ " \n" \ "

    © 2013 Canonical Ltd. Ubuntu and Canonical are registered trademarks of Canonical Ltd.

    \n" \ "
    \n" \ "
    \n" ./app-launch-profiler/0000755000015600001650000000000012700370701014742 5ustar jenkinsjenkins./app-launch-profiler/profile_appstart.sh0000755000015600001650000000577512700370701020675 0ustar jenkinsjenkins#!/bin/bash # Copyright 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 2.1. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # # Author: Benjamin Zeller # Zoltán Balogh &2 exit esac done if [ ${URL} == local ]; then echo ${PASSWORD}|sudo -S lttng create else nc -z ${URL} 5343 if [ $? -eq 0 ]; then echo "The lttng server ${URL} is listening on 5343" echo ${PASSWORD}|sudo -S bash -c "lttng create --set-url net://${URL}" else echo "The lttng server is not accesible. Check lttng-relayd or firewall policies." echo "Falling back to local" URL="local" echo ${PASSWORD}|sudo -S lttng create fi fi echo ${PASSWORD}|sudo -S bash -c 'lttng enable-event --userspace qtmir:firstFrameDrawn' echo ${PASSWORD}|sudo -S bash -c 'lttng enable-event --userspace app:*' echo ${PASSWORD}|sudo -S bash -c 'lttng start' for x in $(seq 1 ${COUNT}); do echo ${PASSWORD}|sudo -S bash -c 'echo 1 > /proc/sys/vm/drop_caches' sleep 5 echo "x - $x" if [[ $WITH_CACHE == false ]]; then # Cleaning QML cache rm -rf ~/.cache/QML/Apps/${APP_NAME} fi echo ${PASSWORD}|sudo -S /usr/bin/app-launch-tracepoints ubuntu-app-launch ${APP_NAME} sleep ${SLEEP_TIME} ubuntu-app-stop ${APP_NAME} done echo ${PASSWORD}|sudo -S bash -c 'lttng stop' ./app-launch-profiler/appstart_test0000755000015600001650000003275512700370701017601 0ustar jenkinsjenkins#!/bin/bash # Copyright 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 2.1. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program.If not, see . # # Author: Zoltán Balogh SERIALNUMBER=086e443edf51b915 SILO="025" TEST_SILO=false DISTRO="ubuntu" SERIES="vivid" CHANNEL="ubuntu-touch/rc-proposed/${DISTRO}" PASSWORD="0000" BOOTTIME=300 COMISSION=false COUNT=10 SLEEP_TIME=10 FILTER=.* LTTNG_SESSION_NAME_REGEXP='(auto-.*-.*) created.' LTTNG_SESSION_NAME="" REMOTE_LTTNG_SESSION=true VERBOSE=false CLEAR_CACHE="" VERBOSE_PARAMETER="" WIRELESS_ADAPTER="$(nmcli -t -f device,type dev | egrep "wireless|wifi" | cut -d: -f1)" IP_ADDRESS="$(ifconfig | grep -A 1 ${WIRELESS_ADAPTER} | tail -1 | cut -d ':' -f 2 | cut -d ' ' -f 1)" declare -a APPLICATIONS=( "dialer-app" "messaging-app" "ubuntu-system-settings" ) function echo(){ if [[ $VERBOSE == true ]]; then builtin echo $@; fi } sleep_indicator () { if [ -z "$1" ]; then i=1 while [$(adb get-state-s ${SERIALNUMBER}) == "unknown" ] do echo -ne "Wait for adb: $i seconds\r" sleep 1 i=$[$i+1] done echo -ne '\n' until pids=$(adb -s ${SERIALNUMBER} shell pidof unity-system-compositor|egrep -v "^$|initctl:"); do echo -ne "Wait for compositor: $i seconds\r" sleep 1; i=$[$i+1] done; echo -ne '\n' return fi SLEEP=$1 if [[ $SLEEP == 120 ]]; then echo "Remember that the phone may ask for SIM pin code" fi for (( LOOPVAR=1; LOOPVAR<= ${SLEEP}; LOOPVAR++ )) do echo -ne "Wait: $SLEEP/$LOOPVAR seconds\r" sleep 1 done echo -ne '\n' return 0 } function wait_for_shell { # Waiting for device on ADB set -e adb -s ${SERIALNUMBER} wait-for-device # Start waiting for Unity8" until PIDS=$(adb -s ${SERIALNUMBER} shell pidof unity8 2>/dev/null|egrep -v "^$"); do sleep 0.1; done; echo "Unity8 is up with PID: ${PIDS}" set +e } function unlock_screen { adb -s ${SERIALNUMBER} shell powerd-cli display on |egrep -v "Display State requested, cookie is|Press ctrl-c to exit|not fully supported." & adb -s ${SERIALNUMBER} shell powerd-cli active |egrep -v "requested, cookie is|Press ctrl-c to exit|not fully supported." & #sleep_indicator 10 adb -s ${SERIALNUMBER} shell "gdbus call --session --dest com.canonical.UnityGreeter --object-path / --method com.canonical.UnityGreeter.HideGreeter|grep -v '\(\)'" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S dbus-send --system --print-reply \ --dest=org.freedesktop.Accounts \ /org/freedesktop/Accounts/User32011 \ org.freedesktop.DBus.Properties.Set \ string:com.canonical.unity.AccountsService \ string:demo-edges variant:boolean:false 2>&1|grep -v password|egrep -v '\(\)|method return'" } function reset { adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S reboot 2>&1|grep -v password" sleep_indicator 120 wait_for_shell sleep_indicator 10 network unlock_screen } function network { # check for available wi-fi or cellular network if adb -s ${SERIALNUMBER} shell "nmcli -t -f device,type dev"|grep -q wlan; then echo "Wi-Fi is enabled" else if adb -s ${SERIALNUMBER} shell "nmcli -t -f device,type con"|grep -q "ril_1:gsm"; then echo "Cellular connection is available" else echo "Enable Wi-Fi or cellular network" # Without any network connection the profiling tools can not be installed exit fi fi if phablet-network -s ${SERIALNUMBER} 2>&1|grep -q Error; then echo "Reset and try again." reset -f phablet-network -s ${SERIALNUMBER} 2>&1 fi } function device_provisioning { # flash the latest image echo -e "Flashing \e[31m${CHANNEL}\e[0m" ubuntu-device-flash touch --serial=${SERIALNUMBER} --channel=${CHANNEL} --wipe --developer-mode --password=${PASSWORD} sleep_indicator ${BOOTTIME} echo -e "Disable the intro wizard" phablet-config -s ${SERIALNUMBER} welcome-wizard --disable sleep_indicator 10 echo -e "Disable the edge swiping lecture " phablet-config -s ${SERIALNUMBER} edges-intro --disable sleep_indicator 10 echo -e "Clone the network " network sleep_indicator 10 adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S reboot 2>&1|grep -v password" sleep_indicator 120 network sleep_indicator 10 echo "Set up with the archive image" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S touch /userdata/.writable_image 2>&1|grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S touch /userdata/.adb_onlock 2>&1|grep -v password > /dev/null" #phablet-config -s ${SERIALNUMBER} writable-image -r ${PASSWORD} 2>&1 > /dev/null echo "Sleep after phablet-config"; sleep_indicator 10 echo -e "Clone the network " network adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S reboot 2>&1|grep -v password" sleep_indicator 120 network sleep_indicator 10 } function measure_app_startups { for APPLICATION in "${APPLICATIONS[@]}" do if [[ ${APPLICATION} =~ ${FILTER} ]]; then echo -e "\e[31m${APPLICATION}\e[0m" LTTNG_SESSION_NAME="" while read -r LINE do if [[ $LINE =~ $LTTNG_SESSION_NAME_REGEXP ]]; then LTTNG_SESSION_NAME=${BASH_REMATCH[1]} fi if [[ $LINE =~ "Falling back to local" ]]; then # Falling back to local REMOTE_LTTNG_SESSION=false fi if [[ $LINE =~ "Traces will be written in" ]]; then LTTNG_TRACE_FILE=${LINE/Traces will be written in /} LTTNG_TRACE_FILE="${LTTNG_TRACE_FILE/$'\r'/}" fi done < <(adb -s ${SERIALNUMBER} shell "/usr/bin/profile_appstart.sh -a ${APPLICATION} -u ${IP_ADDRESS} -c ${COUNT} -s ${SLEEP_TIME} ${CLEAR_CACHE--q}") [ -z "${LTTNG_SESSION_NAME}" ] && echo "The lttng session is not available" || app-launch-profiler-lttng -i ~/lttng-traces/ubuntu-phablet/${LTTNG_SESSION_NAME} ${VERBOSE_PARAMETER--v} if [[ $REMOTE_LTTNG_SESSION == false ]]; then LTTNG_TRACE_PATH=${LTTNG_TRACE_FILE/$LTTNG_SESSION_NAME/} adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S chown phablet $LTTNG_TRACE_PATH -R 2>&1|grep -v password > /dev/null" adb -s ${SERIALNUMBER} pull ${LTTNG_TRACE_FILE} ${LTTNG_SESSION_NAME} > /dev/null 2>&1 app-launch-profiler-lttng -i ${LTTNG_SESSION_NAME} ${VERBOSE_PARAMETER--v} if [ -z "${LTTNG_SESSION_NAME}" ];then rm -rf ${LTTNG_SESSION_NAME} fi fi fi done } while getopts ":cqhvn:s:w:p:f:a:o:" opt; do case $opt in c) COMISSION=true ;; n) COUNT=$OPTARG ;; s) SLEEP_TIME=$OPTARG ;; p) TEST_SILO=true PPA=$OPTARG ;; f) FILTER=$OPTARG ;; a) IFS=',' read -r -a APPLICATIONS <<< "$OPTARG" ;; w) PASSWORD=$OPTARG ;; v) VERBOSE=true unset VERBOSE_PARAMETER ;; q) unset CLEAR_CACHE ;; h) VERBOSE=true echo "Usage: appstart_test -c -p 025 -n 5 -s 10" echo -e "\t-c : Provision the device from the rc-proposed channel" echo -e "\t-n : Number of times the applications are started during the test. Default $COUNT" echo -e "\t-s : Sleep time between application starts. Default $SLEEP_TIME" echo -e "\t-p : Run tests against a silo Default is ${TEST_SILO} the default silo is: ${SILO}" echo -e "\t-w : Password of the phablet user on the device. Default ${PASSWORD}" echo -e "\t-f : Filter for the test suite. Default $FILTER" echo -e "\t-v : Turn appstart_test to be verbose. Default $VERBOSE" echo -e "\t-q : Test the application startup with QML cache. Default ${CLEAR_CACHE-true} ${CLEAR_CACHE+false}" echo -e "\t-h : Show this help" exit ;; :) echo "Option -$OPTARG requires an argument." >&2 exit esac done # Use the first available device for testing echo -e "Waiting for a device" adb wait-for-device SERIALNUMBER=`adb devices -l | grep -Ev "List of devices attached" | grep -Ev "emulator-" | sed "/^$/d"|sed "s/ .*//g"` adb -s ${SERIALNUMBER} wait-for-device echo "Serial number: ${SERIALNUMBER}" echo "Test with QML cache: ${CLEAR_CACHE-true}" ${CLEAR_CACHE+false} echo "Number of start: ${COUNT}" echo "Length of sleep between restarts: ${SLEEP_TIME}" echo "Filter: ${FILTER}" echo "Commission: ${COMISSION}" echo "Test silo: ${TEST_SILO}" if [[ ${TEST_SILO} == true ]]; then echo "Silo: ${SILO}" fi echo "Password of the phablet user:${PASSWORD}" echo "Applications to test:" for APPLICATION in "${APPLICATIONS[@]}" do echo -e "\t$APPLICATION" done # Flash the device with rc-proposed if [ ${COMISSION} == true ]; then device_provisioning unlock_screen else # Check if the device is in writable mode if adb shell "echo ${PASSWORD}|sudo -S bash -c '[[ -f /userdata/.writable_image ]] &&echo && echo writable'" 2>&1 |grep -v password | grep -q writable ; then # The device is already writable unlock_screen network else adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S touch /userdata/.writable_image 2>&1|grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S touch /userdata/.adb_onlock 2>&1|grep -v password > /dev/null" reset -f sleep_indicator 120 echo -e "Clone the network " network adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S reboot 2>&1|grep -v password" sleep_indicator 120 fi fi # Install the ubuntu-app-launch-profiler on the device if needed if adb shell "dpkg -l ubuntu-app-launch-profiler" 2>&1 | grep -q "no packages found" ; then echo "Installing ubuntu-app-launch-profiler on the device" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S apt-get update 2>&1|grep -v password > /dev/null" if adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S apt-cache search ubuntu-app-launch-profiler 2>/dev/null"|grep -q ubuntu-app-launch-profiler; then adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S apt-get update 2>&1|grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S apt-get install --yes --force-yes ubuntu-app-launch-profiler 2>&1 |grep -v password > /dev/null" else echo "ubuntu-app-launch-profiler is not available from the archives." echo "Please install it manually and press enter." read fi else echo "The ubuntu-app-launch-profiler is installed on the device" fi # Start the lttng-relayd if needed pgrep lttng-relayd > /dev/null if [ $? -eq 0 ]; then echo -e "The lttng-relayd is already running." LTTNG_RELAYD_STARTED=false else LTTNG_RELAYD_STARTED=true echo -e "Starting lttng-relayd" lttng-relayd & sleep_indicator 5 fi nc -z ${IP_ADDRESS} 5343 if [ $? -eq 0 ]; then echo "The lttng server ${URL} is listening on 5343" else echo "The lttng server is not accesible. Check lttng-relayd or firewall policies." fi # Configure the silo on the device if requested if [[ ${TEST_SILO} == true ]]; then echo "Testing with ${SILO}" if adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S bash -c 'ls -l /etc/apt/sources.list.d/' 2>&1"|grep -q testing-ppa.list; then echo "Already set up" else echo -e "Set up with silo \e[31m${SILO}\e[0m" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S bash -c 'echo \"deb http://ppa.launchpad.net/ci-train-ppa-service/landing-${SILO}/${DISTRO} ${SERIES} main\" > /etc/apt/sources.list.d/silo-${SILO}.list' 2>&1|grep -v password > /dev/null " SILO=${SILO/\//-} adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S bash -c 'echo -e \"Package: *\nPin: release o=LP-PPA-ci-train-ppa-service-landing-${SILO}\nPin-Priority: 1100\" > /etc/apt/preferences.d/silo.pref' 2>&1|grep -v password > /dev/null " adb -s ${SERIALNUMBER} shell "test -e /usr/sbin/policy-rc.d && cp /usr/sbin/policy-rc.d /tmp/policy-rc.d" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S bash -c 'echo \"exit 101\" > /usr/sbin/policy-rc.d' 2>&1|grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S bash -c 'chmod +x /usr/sbin/policy-rc.d' 2>&1|grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S apt-get update 2>&1|grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S apt-get dist-upgrade --yes --force-yes 2>&1 |grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S dpkg --configure -a 2>&1 |grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S apt-get --force-yes -f install 2>&1 |grep -v password > /dev/null" adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S reboot 2>&1|grep -v password > /dev/null" sleep_indicator 120 unlock_screen network sleep_indicator 5 fi fi # Measure the application startup time measure_app_startups if [[ ${TEST_SILO} == true ]]; then echo "Cleaning up silo ${SILO}" if adb -s ${SERIALNUMBER} shell "dpkg-query -W --showformat='${Status}\n' ppa-purge 2>&1"|grep -q installed; then adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S apt-get --force-yes intsall ppa-purge 2>&1 |grep -v password > /dev/null" REMOVE_PPA_PURGE=true fi adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S ppa-purge -y -i ppa:ci-train-ppa-service/landing-${SILO} 2>&1 |grep -v password > /dev/null" if [[ ${REMOVE_PPA_PURGE} == true ]]; then adb -s ${SERIALNUMBER} shell "echo ${PASSWORD}|sudo -S apt-get --force-yes purge ppa-purge 2>&1 |grep -v password > /dev/null" fi fi # Kill the lttng-relayd if it was started here if [[ ${LTTNG_RELAYD_STARTED} == true ]]; then kill -9 `pgrep lttng-relayd` fi ./app-launch-profiler/app-launch-tracepoints.c0000644000015600001650000000211512700370701021466 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Benjamin Zeller * Zoltán Balogh . # # Author: Benjamin Zeller import babeltrace import sys import getopt class MyCounter(dict): def __missing__(self, key): return 0 if __name__ == '__main__': verbose_mode = False try: opts, args = getopt.getopt(sys.argv[1:], "hi:v", ["help", "inputdata="]) except getopt.GetoptError: print("app-launch-profiler-lttng -i ") sys.exit(2) for opt, arg in opts: if opt == '-h': print("app-launch-profiler-lttng -i ") sys.exit() elif opt in ("-i", "--idata"): inputdata = arg elif opt in ("-v", "--verbose"): verbose_mode = True else: assert False, "unhandled option" sys.exit(2) col = babeltrace.TraceCollection() if col.add_traces_recursive(inputdata, 'ctf') is None: raise RuntimeError('Cannot add trace') first_event = -1 iterations = 0 events_in_iteration = 2 numbers = MyCounter() minNumbers = MyCounter() maxNumbers = MyCounter() for event in col.events: if (event.name == "app:invokeApplauncher"): if (events_in_iteration != 2): raise RuntimeError("Wrong Nr of events: " + str(events_in_iteration)) events_in_iteration = 1 first_event = event.timestamp # print("Event "+event.name+" occurs after: "+str(0)) iterations += 1 else: events_in_iteration += 1 duration = event.timestamp-first_event numbers[event.name] += duration if minNumbers[event.name] == 0: minNumbers[event.name] = duration elif minNumbers[event.name] > duration: minNumbers[event.name] = duration if maxNumbers[event.name] < duration: maxNumbers[event.name] = duration # print("Event "+event.name+" occurs after: " + # str((event.timestamp-first_event) / 1000 / 1000 / 1000)) for event in numbers: if (verbose_mode): print("---------- Event "+event+" ----------") print("Min: " + str(round(minNumbers[event] / 1000 / 1000 / 1000, 4))) print("Max: " + str(round(maxNumbers[event] / 1000 / 1000 / 1000, 4))) print("Avg: " + str(round(numbers[event] / iterations / 1000000/1000, 4))) else: print(str(round(numbers[event]/iterations/1000000/1000, 4))) ./app-launch-profiler/app-launch-tracepoints.h0000644000015600001650000000221312700370701021472 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Benjamin Zeller * Zoltán Balogh TRACEPOINT_EVENT(app, invokeApplauncher, TP_ARGS(0), TP_FIELDS()) #endif /* TRACEPOINTS_H */ #include ./app-launch-profiler/app-launch-profiler.pro0000644000015600001650000000104612700370701021335 0ustar jenkinsjenkinsTEMPLATE = app LIBS += -llttng-ust -ldl CONFIG += -I. HEADERS += app-launch-tracepoints.h SOURCES += app-launch-tracepoints.c TARGET = app-launch-tracepoints installPath = $$[QT_INSTALL_PREFIX]/bin/ app-launch-tracepoints.path = $$installPath app-launch-tracepoints.files = app-launch-tracepoints app-launch-scripts.path = $$installPath app-launch-scripts.files = app-launch-profiler-lttng \ profile_appstart.sh \ appstart_test INSTALLS += app-launch-tracepoints INSTALLS += app-launch-scripts ./apicheck/0000755000015600001650000000000012700370716012647 5ustar jenkinsjenkins./apicheck/apicheck.pro0000644000015600001650000000045412700370701015135 0ustar jenkinsjenkinsTEMPLATE = app QT += qml quick qml-private # For setSharedOpenGLContext QT += core-private gui-private testlib quick-private CONFIG += no_keywords SOURCES += apicheck.cpp installPath = $$[QT_INSTALL_LIBS]/ubuntu-ui-toolkit apicheck.path = $$installPath apicheck.files = apicheck INSTALLS += $$TARGET ./apicheck/apicheck.cpp0000644000015600001650000014102112700370714015117 0ustar jenkinsjenkins/* * Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). * Copyright (C) 2015 Canonical * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define foreach Q_FOREACH #include #undef foreach #include #include #ifdef Q_OS_UNIX #include #endif bool verbose = false; QString currentProperty; QString inObjectInstantiation; QQmlEngine *currentEngine=0; void collectReachableMetaObjects(const QMetaObject *meta, QSet *metas, bool extended = false) { if (! meta || metas->contains(meta)) return; // dynamic meta objects can break things badly // but extended types are usually fine const QMetaObjectPrivate *mop = reinterpret_cast(meta->d.data); if (extended || !(mop->flags & DynamicMetaObject)) metas->insert(meta); collectReachableMetaObjects(meta->superClass(), metas); } void collectReachableMetaObjects(QObject *object, QSet *metas) { if (! object) return; const QMetaObject *meta = object->metaObject(); collectReachableMetaObjects(meta, metas); for (int index = 0; index < meta->propertyCount(); ++index) { QMetaProperty prop = meta->property(index); if (QQmlMetaType::isQObject(prop.userType())) { currentProperty = QString("%1::%2").arg(meta->className(), prop.name()); // if the property was not initialized during construction, // accessing a member of oo is going to cause a segmentation fault QObject *oo = QQmlMetaType::toQObject(prop.read(object)); if (oo && !metas->contains(oo->metaObject())) collectReachableMetaObjects(oo, metas); currentProperty.clear(); } } } void collectReachableMetaObjects(const QQmlType *ty, QSet *metas) { collectReachableMetaObjects(ty->metaObject(), metas, ty->isExtendedType()); #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) if (ty->attachedPropertiesType(QQmlEnginePrivate::get(currentEngine))) collectReachableMetaObjects(ty->attachedPropertiesType(QQmlEnginePrivate::get(currentEngine)), metas); #else if (ty->attachedPropertiesType()) collectReachableMetaObjects(ty->attachedPropertiesType(), metas); #endif } /* We want to add the MetaObject for 'Qt' to the list, this is a simple way to access it. */ class FriendlyQObject: public QObject { public: static const QMetaObject *qtMeta() { return &staticQtMetaObject; } }; /* When we dump a QMetaObject, we want to list all the types it is exported as. To do this, we need to find the QQmlTypes associated with this QMetaObject. */ static QHash > qmlTypesByCppName; // No different versioning possible for a composite type. static QMap qmlTypesByCompositeName; static QHash cppToId; bool typeNameSort(const QQmlType* type1, const QQmlType* type2) { return type1->qmlTypeName() > type2->qmlTypeName(); } /* Takes a C++ type name, such as Qt::LayoutDirection or QString and maps it to how it should appear in the description file. These names need to be unique globally, so we don't change the C++ symbol's name much. It is mostly used to for explicit translations such as QString->string and translations for extended QML objects. */ QByteArray convertToId(const QString &cppName) { QString qmlType(cppName); if (qmlType.contains("::")) { QStringList parts(qmlType.split("::")); return qPrintable(convertToId(parts[0]) + "." + convertToId(parts[1])); } QListtypes(qmlTypesByCppName[qPrintable(cppName)].toList()); std::sort(types.begin(), types.end(), typeNameSort); if (!types.isEmpty()) qmlType = QString(types[0]->qmlTypeName()).split("/")[1].toUtf8(); else qmlType = cppToId.value(qPrintable(qmlType), qPrintable(cppName)); // Strip internal _QMLTYPE_xy suffix qmlType = qmlType.split("_")[0]; // List type if (qmlType.startsWith("QQmlListProperty<")) { QString subType(qmlType.mid(17, qmlType.size() - 18)); qmlType = "list<" + convertToId(subType) + ">"; } else if (qmlType.startsWith("QList<")) { QString subType(qmlType.mid(6, qmlType.size() - 7)); qmlType = "list<" + convertToId(subType) + ">"; } return qPrintable(qmlType.replace("QTestRootObject", "QtObject")); } QByteArray convertToId(const QMetaObject *mo) { QByteArray className(mo->className()); if (!className.isEmpty()) return convertToId(className); // likely a metaobject generated for an extended qml object if (mo->superClass()) { className = convertToId(mo->superClass()); className.append("_extended"); return className; } static QHash generatedNames; className = generatedNames.value(mo); if (!className.isEmpty()) return className; std::cerr << "Found a QMetaObject without a className, generating a random name" << std::endl; className = QByteArray("error-unknown-name-"); className.append(QByteArray::number(generatedNames.size())); generatedNames.insert(mo, className); return className; } // Collect all metaobjects for types registered with qmlRegisterType() without parameters void collectReachableMetaObjectsWithoutQmlName( QSet& metas ) { Q_FOREACH (const QQmlType *ty, QQmlMetaType::qmlAllTypes()) { if ( ! metas.contains(ty->metaObject()) ) { if (!ty->isComposite()) { collectReachableMetaObjects(ty, &metas); } else { qmlTypesByCompositeName[ty->elementName()] = ty; } } } } QSet collectReachableMetaObjects(QQmlEngine *engine, QSet &noncreatables, QSet &singletons, const QList &skip = QList()) { QSet metas; metas.insert(FriendlyQObject::qtMeta()); QHash > extensions; Q_FOREACH (const QQmlType *ty, QQmlMetaType::qmlTypes()) { if (!ty->isCreatable()) noncreatables.insert(ty->metaObject()); if (ty->isSingleton()) singletons.insert(ty->metaObject()); if (!ty->isComposite()) { qmlTypesByCppName[ty->metaObject()->className()].insert(ty); if (ty->isExtendedType()) extensions[ty->typeName()].insert(ty->metaObject()->className()); collectReachableMetaObjects(ty, &metas); } else { qmlTypesByCompositeName[ty->elementName()] = ty; } } // Adjust exports of the base object if there are extensions. // For each export of a base object there can be a single extension object overriding it. // Example: QDeclarativeGraphicsWidget overrides the QtQuick/QGraphicsWidget export // of QGraphicsWidget. Q_FOREACH (const QByteArray &baseCpp, extensions.keys()) { QSet baseExports = qmlTypesByCppName.value(baseCpp); const QSet extensionCppNames = extensions.value(baseCpp); Q_FOREACH (const QByteArray &extensionCppName, extensionCppNames) { const QSet extensionExports = qmlTypesByCppName.value(extensionCppName); // remove extension exports from base imports // unfortunately the QQmlType pointers don't match, so can't use QSet::subtract QSet newBaseExports; Q_FOREACH (const QQmlType *baseExport, baseExports) { bool match = false; Q_FOREACH (const QQmlType *extensionExport, extensionExports) { if (baseExport->qmlTypeName() == extensionExport->qmlTypeName() && baseExport->majorVersion() == extensionExport->majorVersion() && baseExport->minorVersion() == extensionExport->minorVersion()) { match = true; break; } } if (!match) newBaseExports.insert(baseExport); } baseExports = newBaseExports; } qmlTypesByCppName[baseCpp] = baseExports; } // find even more QMetaObjects by instantiating QML types and running // over the instances Q_FOREACH (QQmlType *ty, QQmlMetaType::qmlTypes()) { if (skip.contains(ty)) continue; if (ty->isExtendedType()) continue; if (!ty->isCreatable()) continue; if (ty->typeName() == "QQmlComponent") continue; QString tyName = ty->qmlTypeName(); tyName = tyName.mid(tyName.lastIndexOf(QLatin1Char('/')) + 1); if (tyName.isEmpty()) continue; inObjectInstantiation = tyName; QObject *object = 0; if (ty->isSingleton()) { QQmlType::SingletonInstanceInfo *siinfo = ty->singletonInstanceInfo(); if (!siinfo) { std::cerr << "Internal error, " << qPrintable(tyName) << "(" << qPrintable( QString::fromUtf8(ty->typeName()) ) << ")" << " is singleton, but has no singletonInstanceInfo" << std::endl; continue; } if (siinfo->qobjectCallback) { siinfo->init(engine); collectReachableMetaObjects(object, &metas); object = siinfo->qobjectApi(engine); } else { inObjectInstantiation.clear(); continue; // we don't handle QJSValue singleton types. } } else { object = ty->create(); } inObjectInstantiation.clear(); if (object) { collectReachableMetaObjects(object, &metas); object->deleteLater(); } else { std::cerr << "Could not create" << qPrintable(tyName) << std::endl; } } collectReachableMetaObjectsWithoutQmlName(metas); return metas; } class KnownAttributes { QHash m_properties; QHash > m_methods; public: bool knownMethod(const QByteArray &name, int nArgs, int revision) { if (m_methods.contains(name)) { QHash overloads = m_methods.value(name); if (overloads.contains(nArgs) && overloads.value(nArgs) <= revision) return true; } m_methods[name][nArgs] = revision; return false; } bool knownProperty(const QByteArray &name, int revision) { if (m_properties.contains(name) && m_properties.value(name) <= revision) return true; m_properties[name] = revision; return false; } }; class Dumper { QJsonObject* json; QString relocatableModuleUri; QString importVersion; public: Dumper(QJsonObject* json): json(json) {} void setRelocatableModuleUri(const QString &uri) { relocatableModuleUri = uri; } void setImportVersion(const QString &version) { importVersion = version; } const QString getExportString(QString qmlTyName, int majorVersion, int minorVersion) { if (qmlTyName.startsWith(relocatableModuleUri + QLatin1Char('/'))) { qmlTyName.remove(0, relocatableModuleUri.size() + 1); } if (qmlTyName.startsWith("./")) { qmlTyName.remove(0, 2); } if (qmlTyName.startsWith("/")) { qmlTyName.remove(0, 1); } // Work-around for version -1, -1 if (majorVersion == -1) return QString("%1 %2").arg(qmlTyName).arg(importVersion); return QString("%1 %2.%3").arg(qmlTyName).arg(majorVersion).arg(minorVersion); } void writeMetaContent(QJsonObject* object, const QMetaObject *meta, KnownAttributes *knownAttributes = 0) { QSet internalSignals; QSet implicitSignals; for (int index = meta->propertyOffset(); index < meta->propertyCount(); ++index) { const QMetaProperty &property = meta->property(index); const QMetaObject* superClass(meta->superClass()); // FIXME: Work-around to omit properties from Qt superclasses bool isQtAPI(QString(superClass->className()) == "QQuickImageBase" && QString("autoTransform,fillMode,horizontalAlignment,mipmap,paintedWidth,paintedHeight,verticalAlignment").contains(property.name())); if (isQtAPI) internalSignals.insert(property.notifySignal().name()); else if (!(superClass && superClass->indexOfProperty(property.name()) > -1)) dump(object, property, knownAttributes); if (knownAttributes) knownAttributes->knownMethod(property.notifySignal().name(), 0, property.revision()); implicitSignals.insert(property.notifySignal().name()); } QJsonArray methods; if (meta == &QObject::staticMetaObject) { // for QObject, hide deleteLater() and onDestroyed for (int index = meta->methodOffset(); index < meta->methodCount(); ++index) { QMetaMethod method = meta->method(index); QByteArray signature = method.methodSignature(); if (signature == QByteArrayLiteral("destroyed(QObject*)") || signature == QByteArrayLiteral("destroyed()") || signature == QByteArrayLiteral("deleteLater()")) continue; dump(object, &methods, method, implicitSignals, knownAttributes); } // and add toString(), destroy() and destroy(int) if (!knownAttributes || !knownAttributes->knownMethod(QByteArray("toString"), 0, 0)) { QJsonObject method; method["type"] = "function"; method["name"] = "toString"; methods.append(method); } if (!knownAttributes || !knownAttributes->knownMethod(QByteArray("destroy"), 0, 0)) { QJsonObject method; method["type"] = "function"; method["name"] = "destroy"; methods.append(method); } if (!knownAttributes || !knownAttributes->knownMethod(QByteArray("destroy"), 1, 0)) { QJsonObject method; method["type"] = "function"; method["name"] = "destroy"; QJsonArray parameters; QJsonObject parameter; parameter["type"] = "int"; parameter["name"] = "delay"; method.insert("parameters", parameters); methods.append(method); } } else { for (int index = meta->methodOffset(); index < meta->methodCount(); ++index) { // Omit "Changed" methods of properties with no arguments QMetaMethod meth(meta->method(index)); QByteArray methName(meth.name()); if (!methName.isEmpty() && methName.endsWith("Changed") && !meth.parameterCount()) continue; if (internalSignals.contains(methName)) continue; dump(object, &methods, meta->method(index), implicitSignals, knownAttributes); } } if (!methods.empty()) object->insert("methods", methods); } void dumpQMLComponent(QObject* qtobject, const QString& qmlTyName, const QString& version, const QString& filename, bool isSingleton, const QStringList& internalTypes) { QStringList typeNameVersion(qmlTyName.split("/")); QString nameSpace(typeNameVersion[0]); QString typeName(typeNameVersion[1]); if (internalTypes.contains(typeName)) return; const QMetaObject *mainMeta = qtobject->metaObject(); QJsonObject object; QStringList exportStrings(QStringList() << QString("%1 %2").arg(typeName).arg(version)); // Merge objects to get all exported versions of the same type QString id(filename); if (json->contains(id)) { object = json->value(id).toObject(); QJsonArray exports(object["exports"].toArray()); Q_FOREACH(QJsonValue expor, exports) { exportStrings.append(QString("%1").arg(expor.toString())); } } exportStrings.removeDuplicates(); exportStrings.sort(); object.insert("exports", QJsonArray::fromStringList(exportStrings)); object.insert("prototype", mainMeta->superClass()->className()); object.insert("isComposite", true); if (isSingleton) { object.insert("isCreatable", false); object.insert("isSingleton", true); } for (int index = mainMeta->classInfoCount() - 1 ; index >= 0 ; --index) { QMetaClassInfo classInfo = mainMeta->classInfo(index); if (QLatin1String(classInfo.name()) == QLatin1String("DefaultProperty")) { object.insert("defaultProperty", classInfo.value()); break; } } KnownAttributes knownAttributes; // Strip internal _QMLTYPE_xy suffix QString prototype(QString(mainMeta->superClass()->className()).split("_")[0]); // Merge internal base class if (internalTypes.contains(prototype)) writeMetaContent(&object, mainMeta->superClass(), &knownAttributes); writeMetaContent(&object, mainMeta, &knownAttributes); object["namespace"] = nameSpace; // The QML class name derived from the filename is used by AP. QString className(QFileInfo(filename).baseName()); if (typeName != className) object["className"] = className; json->insert(id, object); } void dump(const QMetaObject *meta, bool isUncreatable, bool isSingleton) { QStringList exportStrings; QSet qmlTypes = qmlTypesByCppName.value(meta->className()); if (!qmlTypes.isEmpty()) { bool foreignNamespace = false; Q_FOREACH (const QQmlType *qmlTy, qmlTypes) { const QString exportString = getExportString(qmlTy->qmlTypeName(), qmlTy->majorVersion(), qmlTy->minorVersion()); if (exportString.contains("/")) foreignNamespace = true; exportStrings.append(exportString); } // Ignore classes from different namespaces if (foreignNamespace) return; // ensure exports are sorted and don't change order when the plugin is dumped again std::sort(exportStrings.begin(), exportStrings.end()); } QJsonObject object; for (int index = meta->classInfoCount() - 1 ; index >= 0 ; --index) { QMetaClassInfo classInfo = meta->classInfo(index); if (QLatin1String(classInfo.name()) == QLatin1String("DefaultProperty")) { object.insert("defaultProperty", classInfo.value()); break; } } if (meta->superClass()) object.insert("prototype", meta->superClass()->className()); if (!qmlTypes.isEmpty()) { object.insert("exports", QJsonArray::fromStringList(exportStrings)); object["namespace"] = qmlTypes.toList()[0]->qmlTypeName().split("/")[0]; object["#version"] = exportStrings.last().split(" ")[1]; if (isUncreatable) object.insert("isCreatable", false); if (isSingleton) object.insert("isSingleton", true); #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) if (const QMetaObject *attachedType = (*qmlTypes.begin())->attachedPropertiesType(QQmlEnginePrivate::get(currentEngine))) { #else if (const QMetaObject *attachedType = (*qmlTypes.begin())->attachedPropertiesType()) { #endif // Can happen when a type is registered that returns itself as attachedPropertiesType() // because there is no creatable type to attach to. if (attachedType != meta) { object.insert("attachedType", attachedType->className()); } } } for (int index = meta->enumeratorOffset(); index < meta->enumeratorCount(); ++index) dump(meta->enumerator(index)); writeMetaContent(&object, meta); QString id(meta->className()); // FIXME: Work-around to omit Qt types unintentionally included if (convertToId(meta).startsWith("Q")) { return; } // The C++ class is used by AP. QString className(meta->className()); if (!(isSingleton || isUncreatable || exportStrings.empty())) object["className"] = className; json->insert(id, object); } private: void writeTypeProperties(QJsonObject* object, QByteArray typeName, bool isWritable) { if (typeName.endsWith("*")) { typeName.truncate(typeName.size() - 1); object->insert("isPointer", true); } if (typeName.startsWith("QQmlListProperty<")) object->insert("isList", true); object->insert("type", QString(typeName)); if (!isWritable) object->insert("isReadonly", true); } void dump(QJsonObject* object, const QMetaProperty &prop, KnownAttributes *knownAttributes = 0) { int revision = prop.revision(); QByteArray propName = prop.name(); if (knownAttributes && knownAttributes->knownProperty(propName, revision)) return; // Two leading underscores: internal API if (QString(propName).startsWith("__")) return; QJsonObject property; if (revision) property["revision"] = QString::number(revision); if (revision && object->contains("#version")) property["version"] = object->value("#version").toString(); writeTypeProperties(&property, prop.typeName(), prop.isWritable()); object->insert(prop.name(), property); } void dump(QJsonObject* object, QJsonArray* array, const QMetaMethod &meth, const QSet &implicitSignals, KnownAttributes *knownAttributes = 0) { if (meth.methodType() == QMetaMethod::Signal) { if (meth.access() != QMetaMethod::Public) return; // nothing to do. } else if (meth.access() != QMetaMethod::Public) { return; // nothing to do. } QByteArray name = meth.name(); // Two leading underscores: internal API if (name.startsWith("__")) return; const QString typeName = meth.typeName(); if (implicitSignals.contains(name) && !meth.revision() && meth.methodType() == QMetaMethod::Signal && meth.parameterNames().isEmpty() && typeName == QLatin1String("void")) { // don't mention implicit signals return; } int revision = meth.revision(); if (knownAttributes && knownAttributes->knownMethod(name, meth.parameterNames().size(), revision)) return; QJsonObject method; if (meth.methodType() == QMetaMethod::Signal) method["type"] = "signal"; else method["type"] = "function"; if (revision) method["revision"] = QString::number(revision); if (revision && object->contains("#version")) method["version"] = object->value("#version").toString(); if (typeName != QLatin1String("void")) method["returns"] = typeName; QJsonArray parameters; for (int i = 0; i < meth.parameterTypes().size(); ++i) { QByteArray argName = meth.parameterNames().at(i); QJsonObject parameter; parameter["name"] = QString(argName); writeTypeProperties(¶meter, meth.parameterTypes().at(i), true); parameters.append(parameter); } if (!parameters.empty()) method.insert("parameters", parameters); method.insert("name", QString(name)); array->append(method); } void dump(const QMetaEnum &e) { // FIXME: Work-around to omit Qt types unintentionally included if (QString(e.scope()).startsWith("Q")) return; QJsonObject object; object["prototype"] = e.isFlag() ? "Flag" : "Enum"; object["namespace"] = relocatableModuleUri; for (int index = 0; index < e.keyCount(); ++index) { object[e.key(index)] = QString::number(e.value(index)); } json->insert(QString("%1::%2").arg(e.scope()).arg(e.name()), object); } }; enum ExitCode { EXIT_INVALIDARGUMENTS = 1, EXIT_SEGV = 2, EXIT_IMPORTERROR = 3 }; #ifdef Q_OS_UNIX void sigSegvHandler(int) { fprintf(stderr, "Error: SEGV\n"); if (!currentProperty.isEmpty()) fprintf(stderr, "While processing the property '%s', which probably has uninitialized data.\n", currentProperty.toLatin1().constData()); if (!inObjectInstantiation.isEmpty()) fprintf(stderr, "While instantiating the object '%s'.\n", inObjectInstantiation.toLatin1().constData()); exit(EXIT_SEGV); } #endif void printUsage(const QString &appName) { std::cerr << qPrintable(QString( "Usage: %1 [-v[v]] [-qml] [-json] IMPORT_URI [...IMPORT_URI]\n" "\n" "Generate an API description file of one or multiple components.\n" "Example: %1 Ubuntu.Components\n" " %1 --json Ubuntu.DownloadManager\n" "\n" "The following rules apply for inclusion of public API:\n" " - Types not declared as internal in qmldir\n" " - C++ types exported from a plugin\n" " - Properties and functions not prefixed with __ (two underscores)\n" " - Members of internal base classes become part of public components\n" "").arg( appName)) << std::endl; } inline std::wostream &operator<<(std::wostream &str, const QString &s) { str << s.toStdWString(); return str; } void printDebugMessage(QtMsgType, const QMessageLogContext &, const QString &msg) { std::wcerr << msg << std::endl; // In case of QtFatalMsg the calling code will abort() when appropriate. } static QObject *s_testRootObject = 0; static QObject *testRootObject(QQmlEngine *engine, QJSEngine *jsEngine) { Q_UNUSED(jsEngine); if (!s_testRootObject) { s_testRootObject = new QObject(engine); } return s_testRootObject; } int main(int argc, char *argv[]) { // The default message handler might not print to console on some systems. Enforce this. qInstallMessageHandler(printDebugMessage); #ifdef Q_OS_UNIX // qmldump may crash, but we don't want any crash handlers to pop up // therefore we intercept the segfault and just exit() ourselves struct sigaction sigAction; sigemptyset(&sigAction.sa_mask); sigAction.sa_handler = &sigSegvHandler; sigAction.sa_flags = 0; sigaction(SIGSEGV, &sigAction, 0); #endif // don't require a window manager even though we're a QGuiApplication qputenv("QT_QPA_PLATFORM", QByteArrayLiteral("minimal")); QGuiApplication app(argc, argv); QStringList args = app.arguments(); args.removeFirst(); const QString appName = QFileInfo(app.applicationFilePath()).baseName(); if (args.size() < 1) { printUsage(appName); return EXIT_INVALIDARGUMENTS; } QLoggingCategory::setFilterRules(QStringLiteral("*=false")); QStringList modules; bool relocatable = true; bool output_json = false, output_qml = false; Q_FOREACH (const QString &arg, args) { if (!arg.startsWith(QLatin1Char('-'))) { modules << arg; continue; } if (arg == QLatin1String("--json") || arg == QLatin1String("-json")) { output_json = true; } else if (arg == QLatin1String("--qml") || arg == QLatin1String("-qml")) { output_qml = true; } else if (arg == QLatin1String("-v")) { verbose = true; } else if (arg == QLatin1String("-vv")) { verbose = true; QLoggingCategory::setFilterRules("*"); } else { std::cerr << "Invalid argument: " << qPrintable(arg) << std::endl; return EXIT_INVALIDARGUMENTS; } } if (modules.isEmpty()) { std::cerr << "No import URI(s) provided" << std::endl; printUsage(appName); return EXIT_INVALIDARGUMENTS; } // By default output JSON if (!output_json and !output_qml) output_qml = true; // Allow import of Qt.Test qmlRegisterSingletonType("Qt.test.qtestroot", 1, 0, "QTestRootObject", testRootObject); QQmlEngine engine; currentEngine = &engine; QObject::connect(&engine, SIGNAL(quit()), QCoreApplication::instance(), SLOT(quit())); // load the QtQuick 2 plugin { QByteArray code("import QtQuick 2.0\nQtObject {}"); QQmlComponent c(&engine); c.setData(code, QString("loadqtquick2.qml")); c.create(); if (!c.errors().isEmpty()) { std::cerr << "Failed to load QtQuick2 built-in" << std::endl; Q_FOREACH (const QQmlError &error, c.errors()) std::cerr << qPrintable( error.toString() ) << std::endl; return EXIT_IMPORTERROR; } } // find all QMetaObjects reachable from the builtin module QSet uncreatableMetas; QSet singletonMetas; QSet defaultReachable = collectReachableMetaObjects(&engine, uncreatableMetas, singletonMetas); // add some otherwise unreachable QMetaObjects defaultReachable.insert(&QQuickMouseEvent::staticMetaObject); // QQuickKeyEvent, QQuickPinchEvent, QQuickDropEvent are not exported QSet defaultReachableNames; // this will hold the meta objects we want to dump information of QSet metas; // setup static rewrites of type names cppToId.insert("QString", "string"); cppToId.insert("QQuickItem", "Item"); cppToId.insert("QUrl", "url"); cppToId.insert("QVariant", "var"); cppToId.insert("QVector2D", "vector2d"); cppToId.insert("QVector3D", "vector3d"); cppToId.insert("QVector4D", "vector4d"); cppToId.insert("QPoint", "Qt.point"); cppToId.insert("QColor", "color"); cppToId.insert("QQmlEasingValueType::Type", "Type"); // find a valid QtQuick import QByteArray importCode; QQmlType *qtObjectType = QQmlMetaType::qmlType(&QObject::staticMetaObject); if (!qtObjectType) { std::cerr << "Could not find QtObject type" << std::endl; importCode = QByteArray("import QtQuick 2.0\n"); } else { QString module = qtObjectType->qmlTypeName(); module = module.mid(0, module.lastIndexOf(QLatin1Char('/'))); importCode = QString("import %1 %2.%3\n").arg(module, QString::number(qtObjectType->majorVersion()), QString::number(qtObjectType->minorVersion())).toUtf8(); } QStringList internalTypes; // create an object that will be the API description QJsonObject json; Q_FOREACH (const QString& pluginImportUri, modules) { QString pluginImportVersion; QStringList pathList((QString(getenv("QML2_IMPORT_PATH")) + ":" + QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath)) .split(':', QString::SkipEmptyParts)); QFile qmlDirFile; QString pluginModulePath; Q_FOREACH(const QString& path, pathList) { // Bacon2D.1.0 → Bacon2D 1.0 pluginModulePath = path + "/" + QString(pluginImportUri) + ".1.0"; qmlDirFile.setFileName(pluginModulePath + "/qmldir"); if (qmlDirFile.exists() && qmlDirFile.open(QIODevice::ReadOnly)) { engine.addImportPath(pluginModulePath); break; } // com.Canonical.Oxide → com/Canonical/Oxide pluginModulePath = path + "/" + QString(pluginImportUri).replace(".", "/"); qmlDirFile.setFileName(pluginModulePath + "/qmldir"); if (qmlDirFile.exists() && qmlDirFile.open(QIODevice::ReadOnly)) { engine.addImportPath(pluginModulePath); break; } } if (verbose) std::cout << "Reading " << qPrintable(qmlDirFile.fileName()) << std::endl; if (!qmlDirFile.isOpen()) { std::cerr << "Failed to read " << qPrintable(qmlDirFile.fileName()) << std::endl; return EXIT_IMPORTERROR; } QQmlDirParser p; p.parse(qmlDirFile.readAll()); if (p.hasError()) { std::cerr << "Failed to read " << qPrintable(qmlDirFile.fileName()) << std::endl; Q_FOREACH (const QQmlError &error, p.errors(qmlDirFile.fileName())) std::cerr << qPrintable( error.toString() ) << std::endl; return EXIT_IMPORTERROR; } // find all QMetaObjects reachable when the specified module is imported QStringList importVersions; if (pluginImportVersion.isEmpty()) { // Collect all the available versioned imports int highestMajor = 0, highestMinor = 1; Q_FOREACH(QQmlDirParser::Component c, p.components()) { // pluginImportVersion can be empty, pick latest if (c.majorVersion > highestMajor) { highestMajor = c.majorVersion; highestMinor = c.minorVersion; } else if (c.majorVersion == highestMajor && c.minorVersion > highestMinor) { highestMinor = c.minorVersion; } // Work-around for version -1, -1 if (c.majorVersion == -1) continue; importVersions << QString("%1.%2").arg(c.majorVersion).arg(c.minorVersion); } pluginImportVersion = QString("%1.%2").arg(highestMajor).arg(highestMinor); } importVersions << pluginImportVersion; importVersions.removeDuplicates(); // Create a component with all QML types to add them to the type system QByteArray code = importCode; Q_FOREACH(const QString& version, importVersions) { // First letter must be uppercase QString pluginAlias(QString("A%1.%2").arg(pluginImportUri).arg(version).replace(".", "_")); code += QString("import %1 %2 as %3\n").arg(pluginImportUri).arg(version).arg(pluginAlias); } code += "QtObject { }\n"; if (verbose) std::cerr << "Importing QML components:" << std::endl << qPrintable(code) << std::endl; QQmlComponent c(&engine); c.setData(code, QUrl::fromLocalFile(qmlDirFile.fileName())); std::cerr << "Creating QML component for " << qPrintable(pluginImportUri) << std::endl; c.create(); if (!c.errors().isEmpty()) { Q_FOREACH (const QQmlError &error, c.errors()) { // Despite the error we get all type information we need from singletons if (error.description().contains(QRegExp("(Composite Singleton Type .+|Element) is not creatable"))) std::cerr << qPrintable( error.toString() ) << std::endl; if (error.description().contains(QRegExp("(Composite Singleton Type .+|Element) is not creatable"))) continue; // If we guessed the version, we may have been wrong if (error.description().contains(QRegExp("version .+ is not installed"))) { // First letter must be uppercase QString pluginAlias(QString("A%1.%2").arg(pluginImportUri).replace(".", "_")); // 1.0 should work if 0.1 didn't and qmldir didn't specify code += QString("import %1 1.0 as %3\n").arg(pluginImportUri).arg(pluginAlias); c.setData(code, QUrl::fromLocalFile(qmlDirFile.fileName())); std::cerr << "Re-creating QML component for " << qPrintable(pluginImportUri) << std::endl; c.create(); // This time around it worked if (!c.errors().isEmpty()) continue; } std::cerr << "Failed to load " << qPrintable(pluginImportUri) << std::endl; std::cerr << qPrintable(code) << std::endl; std::cerr << qPrintable( error.toString() ) << std::endl; return EXIT_IMPORTERROR; } } Q_FOREACH(QQmlDirParser::Component c, p.components()) { // Map filename-based PageHeadConfiguration11 to PageHeadConfiguration QString filename(QFileInfo(c.fileName).baseName()); cppToId.insert(qPrintable(filename), qPrintable(c.typeName)); if (c.internal) { internalTypes.append(c.typeName); continue; } if (c.majorVersion == -1) { std::cerr << "Public QML type " << qPrintable(c.typeName) << " in qmldir has no version!" << std::endl; return EXIT_IMPORTERROR; } } QList defaultTypes = QQmlMetaType::qmlTypes(); QSet candidates = collectReachableMetaObjects(&engine, uncreatableMetas, singletonMetas, defaultTypes); candidates.subtract(defaultReachable); // Also eliminate meta objects with the same classname. // This is required because extended objects seem not to share // a single meta object instance. Q_FOREACH (const QMetaObject *mo, defaultReachable) defaultReachableNames.insert(QByteArray(mo->className())); Q_FOREACH (const QMetaObject *mo, candidates) { if (!defaultReachableNames.contains(mo->className())) metas.insert(mo); } QMap scripts; Q_FOREACH(QQmlDirParser::Script s, p.scripts()) { QFile sf(s.fileName[0] == 'q' ? QString(s.fileName).replace("qrc:/", ":/") : pluginModulePath + "/" + s.fileName); if (!sf.open(QIODevice::ReadOnly)) { std::cerr << "Failed to read " << qPrintable(sf.fileName()) << std::endl; return EXIT_IMPORTERROR; } scripts.insertMulti(s.nameSpace, QString("%1 %2.%3").arg(s.nameSpace).arg(s.majorVersion).arg(s.minorVersion)); } Q_FOREACH(QString nameSpace, scripts.uniqueKeys()) { QJsonObject script; script["type"] = "script"; QJsonArray exports(QJsonArray::fromStringList(scripts.values(nameSpace))); script["exports"] = exports; script["namespace"] = pluginImportUri; json[nameSpace] = script; } // put the metaobjects into a map so they are always dumped in the same order QMap nameToMeta; Q_FOREACH (const QMetaObject *meta, metas) nameToMeta.insertMulti(convertToId(meta), meta); Dumper dumper(&json); if (relocatable) dumper.setRelocatableModuleUri(pluginImportUri); dumper.setImportVersion(pluginImportVersion); Q_FOREACH (const QMetaObject *meta, nameToMeta) { dumper.dump(meta, uncreatableMetas.contains(meta), singletonMetas.contains(meta)); } Q_FOREACH(QQmlDirParser::Component c, p.components()) { if (c.internal) continue; QString version(QString("%1.%2").arg(c.majorVersion).arg(c.minorVersion)); // Work-around for version -1, -1 if (c.majorVersion == -1) version = pluginImportVersion; QQmlComponent e(&engine, c.fileName[0] == 'q' ? QUrl(c.fileName) : pluginModulePath + "/" + c.fileName); QObject* qtobject(e.create()); if (!qtobject) { std::cerr << "Failed to instantiate " << qPrintable(c.typeName) << " from " << qPrintable(e.url().toString()) << std::endl; Q_FOREACH (const QQmlError &error, e.errors()) std::cerr << qPrintable(error.toString()) << std::endl; exit(1); } dumper.dumpQMLComponent(qtobject, pluginImportUri + "/" + c.typeName, version, e.url().toString(), c.singleton, internalTypes); } Q_FOREACH(const QQmlType *compositeType, qmlTypesByCompositeName) { QQmlComponent e(&engine, compositeType->sourceUrl()); if (!e.isReady()) { std::cerr << "Failed to create " << qPrintable(compositeType->qmlTypeName()) << " from " << qPrintable(e.url().toString()) << std::endl; exit(1); } QObject* qtobject(e.create()); if (!qtobject) { std::cerr << "Failed to instantiate " << qPrintable(compositeType->qmlTypeName()) << " from " << qPrintable(e.url().toString()) << std::endl; Q_FOREACH (const QQmlError &error, e.errors()) std::cerr << qPrintable(error.toString()) << std::endl; exit(1); } QString version(QString("%1.%2").arg(compositeType->majorVersion()).arg(compositeType->minorVersion())); // Work-around for version -1, -1 if (compositeType->majorVersion() == -1) version = pluginImportVersion; QString typeName(compositeType->qmlTypeName()); if (!json.contains(e.url().toString()) && typeName.contains("/")) dumper.dumpQMLComponent(qtobject, typeName, version, e.url().toString(), compositeType->isSingleton(), internalTypes); } } if (output_json) { // write JSON representation of the API QJsonDocument jsonDoc(json); std::cout << qPrintable(jsonDoc.toJson()); } if (output_qml) { // write QML representation of the API QStringList keys(json.keys()); // Sort by exports QMapbyExports; Q_FOREACH(const QString& key, keys) { QJsonValue value(json[key]); if (value.isObject()) { QJsonObject object(value.toObject()); QStringList exports; Q_FOREACH (const QJsonValue& expor, object["exports"].toArray()) exports.append(expor.toString()); // Reverse exports: latest to oldest for(int k = 0; k < (exports.size() / 2); k++) exports.swap(k, exports.size() - (1 + k)); QStringList sortedExports; if (!exports.isEmpty()) { QString currentTypeName; Q_FOREACH(QJsonValue expor, exports) { QStringList nextType(expor.toString().split(" ")); if (nextType[0] != currentTypeName) { currentTypeName = nextType[0]; sortedExports.append(currentTypeName); } sortedExports.append(nextType[1]); } } else sortedExports.append(convertToId(key)); // Exports may not be unique across namespaces ie. Header byExports.insertMulti(sortedExports.join(" "), key); } } QMap::const_iterator i = byExports.constBegin(); while (i != byExports.constEnd()) { QString exports(i.key()); QString key(i.value()); QJsonValue value(json[key]); if (value.isObject()) { QJsonObject object(value.toObject()); QString signature(exports); if (object.contains("namespace")) signature = object.take("namespace").toString() + "." + signature; if (object.contains("className")) signature += " " + object.take("className").toString(); QString prototype(object.take("prototype").toString()); if (!prototype.isEmpty()) signature += ": " + convertToId(prototype); if (object.contains("isSingleton")) signature += " singleton"; signature += "\n"; Q_FOREACH(const QString& fieldName, object.keys()) { if (fieldName == "methods") { QJsonArray values(object[fieldName].toArray()); Q_FOREACH(const QJsonValue& value, values) { QJsonObject valu(value.toObject()); signature += " "; signature += valu["type"].toString() + " "; if (valu.contains("returns")) signature += convertToId(valu["returns"].toString()) + " "; QStringList args; if (valu.contains("parameters")) { Q_FOREACH(const QJsonValue& parameterValue, valu["parameters"].toArray()) { QJsonObject parameter(parameterValue.toObject()); args.append(convertToId(parameter["type"].toString()) + " " + parameter["name"].toString()); } } signature += valu["name"].toString() + "(" + args.join(", ") + ")"; if (valu.contains("version")) signature += " " + valu["version"].toString(); signature += "\n"; } continue; } QJsonObject field(object[fieldName].toObject()); if (!(field.contains("type") || prototype == "Enum" || prototype == "Flag")) continue; signature += " "; if (object["defaultProperty"] == fieldName) signature += "default "; // in QML semantics lists are not read-only if (field.contains("isReadonly") && !field.contains("isList")) signature += "readonly "; if (field.contains("type")) signature += "property " + QString(convertToId(field["type"].toString())) + " "; signature += fieldName; if (field.contains("version")) signature += " " + QString(field["version"].toString()); signature += "\n"; } std::cout << qPrintable(signature); } i++; } } // workaround to avoid crashes on exit QTimer timer; timer.setSingleShot(true); timer.setInterval(0); QObject::connect(&timer, SIGNAL(timeout()), &app, SLOT(quit())); timer.start(); return app.exec(); } ./ubuntu-ui-toolkit-launcher/0000755000015600001650000000000012700370701016311 5ustar jenkinsjenkins./ubuntu-ui-toolkit-launcher/MouseTouchAdaptor.cpp0000644000015600001650000001160612700370701022427 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by: Daniel d'Andrada * */ #include "MouseTouchAdaptor.h" #include #include #include using QTest::QTouchEventSequence; namespace { Qt::MouseButton translateMouseButton(xcb_button_t detail) { switch (detail) { case 1: return Qt::LeftButton; case 2: return Qt::MidButton; case 3: return Qt::RightButton; // Button values 4-7 are Wheel events default: return Qt::NoButton; } } } // end of anonymous namespace MouseTouchAdaptor::MouseTouchAdaptor() : m_leftButtonIsPressed(false) { m_touchDevice = new QTouchDevice; m_touchDevice->setType(QTouchDevice::TouchScreen); QWindowSystemInterface::registerTouchDevice(m_touchDevice); } bool MouseTouchAdaptor::nativeEventFilter(const QByteArray & eventType, void * message, long * /*result*/) { if (eventType != "xcb_generic_event_t") { // wrong backend. qWarning("MouseTouchAdaptor: XCB backend not in use. Adaptor inoperative!"); return false; } xcb_generic_event_t *xcbEvent = static_cast(message); switch (xcbEvent->response_type & ~0x80) { case XCB_BUTTON_PRESS: return handleButtonPress(reinterpret_cast(xcbEvent)); break; case XCB_BUTTON_RELEASE: return handleButtonRelease(reinterpret_cast(xcbEvent)); break; case XCB_MOTION_NOTIFY: return handleMotionNotify(reinterpret_cast(xcbEvent)); break; default: return false; break; }; } bool MouseTouchAdaptor::handleButtonPress(xcb_button_press_event_t *pressEvent) { Qt::MouseButton button = translateMouseButton(pressEvent->detail); // Skip the event if it wasn't a left mouse press if (button != Qt::LeftButton) { return false; } QPoint windowPos(pressEvent->event_x, pressEvent->event_y); QWindow *targetWindow = findQWindowWithXWindowID(static_cast(pressEvent->event)); // no autoCommit QTouchEventSequence touchEvent = QTest::touchEvent(targetWindow, m_touchDevice, false); touchEvent.press(0, windowPos); // do not process events when committed, let the events be processed with next event loop touchEvent.commit(false); m_leftButtonIsPressed = true; return true; } bool MouseTouchAdaptor::handleButtonRelease(xcb_button_release_event_t *releaseEvent) { Qt::MouseButton button = translateMouseButton(releaseEvent->detail); // Skip the event if it wasn't a left mouse release if (button != Qt::LeftButton) { return false; } QPoint windowPos(releaseEvent->event_x, releaseEvent->event_y); QWindow *targetWindow = findQWindowWithXWindowID(static_cast(releaseEvent->event)); // no autoCommit QTouchEventSequence touchEvent = QTest::touchEvent(targetWindow, m_touchDevice, false); touchEvent.release(0, windowPos); // do not process events when committed, let the events be processed with next event loop touchEvent.commit(false); m_leftButtonIsPressed = false; return true; } bool MouseTouchAdaptor::handleMotionNotify(xcb_motion_notify_event_t *event) { if (!m_leftButtonIsPressed) { return false; } QPoint windowPos(event->event_x, event->event_y); QWindow *targetWindow = findQWindowWithXWindowID(static_cast(event->event)); // no autoCommit QTouchEventSequence touchEvent = QTest::touchEvent(targetWindow, m_touchDevice, false); touchEvent.move(0, windowPos); // do not process events when committed, let the events be processed with next event loop touchEvent.commit(false); return true; } QWindow *MouseTouchAdaptor::findQWindowWithXWindowID(WId windowId) { QWindowList windowList = QGuiApplication::topLevelWindows(); QWindow *foundWindow = 0; int i = 0; while (!foundWindow && i < windowList.count()) { QWindow *window = windowList[i]; if (window->winId() == windowId) { foundWindow = window; } else { ++i; } } Q_ASSERT(foundWindow); return foundWindow; } ./ubuntu-ui-toolkit-launcher/launcher.cpp0000644000015600001650000001337312700370701020625 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * QML launcher with the ability to setup the QQuickView/ QQmlEngine differently * * Rationale: Different variants of qmlscene exist as well as C++ and Go apps * This is to write Autopilot test cases that exhibit specific behavior */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "MouseTouchAdaptor.h" #include #include bool touchDevicePresent() { Q_FOREACH(const QTouchDevice *device, QTouchDevice::devices()) { if (device->type() == QTouchDevice::TouchScreen) return true; } return false; } static QObject *s_testRootObject = 0; static QObject *testRootObject(QQmlEngine *engine, QJSEngine *jsEngine) { Q_UNUSED(jsEngine); if (!s_testRootObject) { s_testRootObject = new QObject(engine); } return s_testRootObject; } int main(int argc, const char *argv[]) { // QPlatformIntegration::ThreadedOpenGL setenv("QML_FORCE_THREADED_RENDERER", "1", 1); // QPlatformIntegration::BufferQueueingOpenGL setenv("QML_FIXED_ANIMATION_STEP", "1", 1); // Oxide and QWebEngine need a shared context QScopedPointer shareContext; shareContext.reset(new QOpenGLContext); #if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0) qt_gl_set_global_share_context(shareContext.data()); #elif QT_VERSION >= QT_VERSION_CHECK(5, 3, 0) QOpenGLContextPrivate::setGlobalShareContext(shareContext.data()); #else QSGContext::setSharedOpenGLContext(shareContext.data()); #endif QGuiApplication::setApplicationName("UITK Launcher"); QGuiApplication application(argc, (char**)argv); QCommandLineParser args; QCommandLineOption _import("I", "Add to the list of import paths", "path"); QCommandLineOption _enableTouch("touch", "Enables mouse to touch conversion on desktop"); QCommandLineOption _testability("testability", "Loads the testability driver"); QCommandLineOption _frameless("frameless", "Run without borders"); QCommandLineOption _engine("engine", "Use quick engine from quick view"); QCommandLineOption _desktop_file_hint("desktop_file_hint", "Desktop file - ignored", "desktop_file"); args.addOption(_import); args.addOption(_enableTouch); args.addOption(_testability); args.addOption(_frameless); args.addOption(_engine); args.addOption(_desktop_file_hint); args.addPositionalArgument("filename", "Document to be viewed"); args.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions); args.addHelpOption(); if (!args.parse(application.arguments())) { qWarning() << args.errorText(); args.showHelp(1); } QString filename; if (args.positionalArguments().count() > 0) { filename = args.positionalArguments()[0]; } if (filename.isEmpty()) { // show usage and exit args.showHelp(1); } // Testability is only supported out of the box by QApplication not QGuiApplication if (args.isSet(_testability) || getenv("QT_LOAD_TESTABILITY")) { QLibrary testLib(QLatin1String("qttestability")); if (testLib.load()) { typedef void (*TasInitialize)(void); TasInitialize initFunction = (TasInitialize)testLib.resolve("qt_testability_init"); if (initFunction) { initFunction(); } else { qCritical("Library qttestability resolve failed!"); return 1; } } else { qCritical("Library qttestability load failed!"); return 1; } } // Allow manual execution of unit tests using Qt.Test qmlRegisterSingletonType("Qt.test.qtestroot", 1, 0, "QTestRootObject", testRootObject); QQmlEngine* engine; // The default constructor affects the components tree (autopilot vis) QScopedPointer view; if (args.isSet(_engine)) { view.reset(new QQuickView()); engine = view->engine(); } else { engine = new QQmlEngine(); view.reset(new QQuickView(engine, NULL)); engine->setParent(view.data()); } if (args.isSet(_import)) { QStringList paths = args.values(_import); Q_FOREACH(const QString &path, paths) { engine->addImportPath(path); } } view->setResizeMode(QQuickView::SizeRootObjectToView); view->setTitle("UI Toolkit QQuickView"); if (args.isSet(_frameless)) { view->setFlags(Qt::FramelessWindowHint); } if (args.isSet(_enableTouch) && !touchDevicePresent()) { // has no effect if we have touch screen application.installNativeEventFilter(new MouseTouchAdaptor); } QUrl source(QUrl::fromLocalFile(filename)); view->setSource(source); if (view->errors().count() > 0) { args.showHelp(3); } view->show(); return application.exec(); } ./ubuntu-ui-toolkit-launcher/ubuntu-ui-toolkit-launcher.pro0000644000015600001650000000054212700370701024253 0ustar jenkinsjenkinsTEMPLATE = app QT += qml quick # For setSharedOpenGLContext QT += core-private gui-private testlib quick-private CONFIG += no_keywords HEADERS += MouseTouchAdaptor.h SOURCES += launcher.cpp \ MouseTouchAdaptor.cpp installPath = $$[QT_INSTALL_PREFIX]/bin launcher.path = $$installPath launcher.files = ubuntu-ui-toolkit-launcher INSTALLS += launcher ./ubuntu-ui-toolkit-launcher/MouseTouchAdaptor.h0000644000015600001650000000306712700370701022076 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by: Daniel d'Andrada * */ #ifndef MOUSE_TOUCH_ADAPTOR_H #define MOUSE_TOUCH_ADAPTOR_H #include #include #include class QMouseEvent; class QTouchDevice; // Transforms QMouseEvents into single-finger QTouchEvents. class MouseTouchAdaptor : public QAbstractNativeEventFilter { public: MouseTouchAdaptor(); // Filters mouse events and posts the equivalent QTouchEvents. virtual bool nativeEventFilter(const QByteArray & eventType, void *message, long *result); private: bool handleButtonPress(xcb_button_press_event_t *pressEvent); bool handleButtonRelease(xcb_button_release_event_t *releaseEvent); bool handleMotionNotify(xcb_motion_notify_event_t *event); QWindow *findQWindowWithXWindowID(WId windowId); QTouchDevice *m_touchDevice; bool m_leftButtonIsPressed; }; #endif // MOUSE_TOUCH_ADAPTOR_H ./run_tests.sh0000755000015600001650000000317412700370714013470 0ustar jenkinsjenkins#!/bin/bash # # Copyright 2012 - 2015 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # source $PWD/export_qml_dir.sh if [ ! -e $QML2_IMPORT_PATH/Ubuntu/Layouts/libUbuntuLayouts.so ]; then echo You need to build UITK before you can run Autopilot test cases! exit 1 fi MODES='run|list|vis|launch' usage(){ echo Usage: echo " " $(basename $0) "[-h] [$MODES] SUITE" exit 1 } cd tests/autopilot export UBUNTU_UI_TOOLKIT_AUTOPILOT_FROM_SOURCE=1 export UITK_BUILD_ROOT="$BUILD_DIR" export UITK_SOURCE_ROOT="$SRC_DIR" MODE="run" SUITE=ubuntuuitoolkit if [ "$1" == "" ]; then usage elif [[ $MODES == *$1* ]]; then MODE=$1 if [ "$2" == "" ]; then set "$SUITE" else shift 1 fi elif [ "$2" = "" ]; then true elif [[ $MODES == *$2* ]]; then MODE=$2 if [ "$3" == "" ]; then shift 1 set "$SUITE" else shift 2 fi fi if [ "$MODE" = "run" ]; then autopilot3 $MODE -o ../../$SUITE -f xml -r -rd ../../ $* else autopilot3 $MODE $* fi RESULT=$? if [ "$RESULT" == "2" ]; then usage fi exit $RESULT ./NEWS0000644000015600001650000000074512700370701011577 0ustar jenkinsjenkins===================== Ubuntu UI Toolkit 0.1 ===================== New Features ------------ - New AbstractButton component. - New Button component. - New Tab component. - New Tabs component. Improvements ------------ - Improvements to existing commands, especially improved performance or memory usage, or better results. Bug Fixes --------- - No bugs yet. Documentation ------------- - All classes are now documented. API Changes ----------- - This is the first version. ./push_to_phone.sh0000755000015600001650000000651712700370701014314 0ustar jenkinsjenkins#!/bin/bash # # Copyright 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # # Author: Christian Dywan # Ensure adb is running to prevent errors in output adb start-server devicename(){ NAME=$(adb -s $1 shell 'grep device: /etc/system-image/channel.ini' 2>/dev/null) && echo ${NAME:8} || echo "(Developer mode not enabled or screen locked)" } # Support for multiple devices connected at once SERIAL=$1 if [ -z "$SERIAL" ]; then COUNT=0 for DEVICE in $(adb devices | grep -v attached); do test $DEVICE != 'device' && SERIAL=$DEVICE && COUNT=$((COUNT+1)) && echo $DEVICE: $(devicename $DEVICE) done if [ $COUNT -gt 1 ]; then echo $COUNT devices plugged in - unplug one or pass the serial number to the script exit 1 fi fi adb(){ command adb -s $SERIAL $* } # Determine device architecture ARCH=$(adb shell "dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null || echo arm-linux-gnueabihf" | tr -d \\r) if [ -z "$ARCH" ]; then echo Developer mode enabled? Screen unlocked? exit 1 fi echo Ready to push Ubuntu.Components for $ARCH to device DEST=/usr/lib/$ARCH/qt5/qml/Ubuntu/Components RUN=$XDG_RUNTIME_DIR/$(basename $0) STONE=/tmp/$(basename $0) # Ask early so the script can run through smoothly echo Type your phone\'s PIN or password to continue: read -s PW # Make the image writable phablet-config -s $SERIAL writable-image || exit 1 # Prepare copy script to be run on the device rm -Rf $RUN mkdir -p $RUN echo '#!/bin/sh' > $RUN/copy.sh echo echo Updating Ubuntu.Components... >> $RUN/copy.sh echo cd $STONE >> $RUN/copy.sh echo DEST=$DEST >> $RUN/copy.sh cd modules || exit 1 # Copy selectively to avoid pushing binaries (arch conflict) and sources (unneeded) for i in $(ls Ubuntu/Components/*.qml Ubuntu/Components/*.js Ubuntu/Components/qmldir 2>/dev/null); do echo modules/$i '->' $STONE/c adb push $i $STONE/c/$i || exit 1 done cd .. echo cp -R c/Ubuntu/Components/* "\$DEST || exit 1" >> $RUN/copy.sh for i in 10 11 ListItems Pickers Popups Styles Themes artwork; do adb push modules/Ubuntu/Components/$i/ $STONE/$i || exit 1 echo cp -R $i/* "\$DEST"/$i >> $RUN/copy.sh || exit 1 done # Autopilot tests should always match the Toolkit adb push tests/autopilot/ubuntuuitoolkit/ $STONE/ap || exit 1 echo cp -R ap/* /usr/lib/python3/dist-packages/ubuntuuitoolkit >> $RUN/copy.sh || exit 1 adb push examples/ubuntu-ui-toolkit-gallery/ $STONE/ex >> $RUN/copy.sh || exit 1 echo cp -R ex/* /usr/lib/ubuntu-ui-toolkit/examples/ubuntu-ui-toolkit-gallery # For launching the gallery easily echo cp ex/*.desktop /usr/share/applications/ >> $RUN/copy.sh || exit 1 echo echo ...OK >> $RUN/copy.sh chmod +x $RUN/copy.sh adb push $RUN/copy.sh $STONE/copy.sh || exit 1 adb shell "echo $PW | sudo --stdin $STONE/copy.sh" ./.bazaar/0000755000015600001650000000000012700370701012410 5ustar jenkinsjenkins./.bazaar/plugins/0000755000015600001650000000000012700370701014071 5ustar jenkinsjenkins./.bazaar/plugins/makecheck_ubuntu_ui_toolkit.py0000755000015600001650000000310412700370701022223 0ustar jenkinsjenkins#!/usr/bin/python # Copyright 2013 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # # Author: Juhapekka Piiroinen import os import subprocess from bzrlib import branch from bzrlib import errors from bzrlib.urlutils import local_path_from_url def execute_makecheck(local_branch, master_branch, old_revision_number, old_revision_id, future_revision_number, future_revision_id, tree_delta, future_tree): if (master_branch.get_parent().find("ubuntu-ui-toolkit") == -1): return print "Set work directory to %s" % local_path_from_url(master_branch.base) os.chdir(local_path_from_url(master_branch.base)) print "Execute 'make check'.." if (subprocess.call("make check", shell=True) != 0): raise errors.BzrError("Tests failed, fix them before commit!") branch.Branch.hooks.install_named_hook('pre_commit', execute_makecheck, 'make check pre-commit') ./manual-tests/0000755000015600001650000000000012700370701013507 5ustar jenkinsjenkins./manual-tests/compile_testcaseexecutor.sh0000755000015600001650000000124412700370701021151 0ustar jenkinsjenkins#!/bin/bash # # Copyright 2012 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # cd testcaseexecutor qmake make ./manual-tests/testcaseexecutor/0000755000015600001650000000000012700370701017101 5ustar jenkinsjenkins./manual-tests/testcaseexecutor/testcaseexecutiondialog.cpp0000644000015600001650000000620212700370701024524 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Juhapekka Piiroinen */ #include "testcaseexecutiondialog.h" #include "ui_testcaseexecutiondialog.h" #include TestCaseExecutionDialog::TestCaseExecutionDialog(QString testcase, QString testdata, QUrl qmlFile, QWidget *parent) : QDialog(parent), m_declarativeView(new QDeclarativeView), m_ui(new Ui::TestCaseExecutionDialog) { m_ui->setupUi(this); m_ui->plainTextEdit->setPlainText(testdata); this->setWindowTitle(testcase); m_ui->horizontalLayout->addWidget(m_declarativeView); QFile qmldata(qmlFile.toLocalFile()); QString data; if (qmldata.open(QIODevice::ReadOnly)) { data = qmldata.readAll(); qmldata.close(); } m_ui->plainTextEdit_2->setPlainText(data); QTemporaryFile tmpQmlFile; tmpQmlFile.open(); tmpQmlFile.write(data.toAscii()); tmpQmlFile.close(); qDebug() << "using temporary file" << tmpQmlFile.fileName(); m_declarativeView->engine()->addImportPath("../qml/"); QGLFormat format = QGLFormat::defaultFormat(); format.setSampleBuffers(false); format.setSwapInterval(1); QGLWidget *glWidget = new QGLWidget(format); glWidget->setAttribute(Qt::WA_TranslucentBackground, false); m_declarativeView->setAttribute(Qt::WA_TranslucentBackground, false); m_declarativeView->setAttribute(Qt::WA_NoSystemBackground, true); m_declarativeView->setAttribute(Qt::WA_OpaquePaintEvent, true); m_declarativeView->setViewport(glWidget); m_declarativeView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate); m_declarativeView->setSource(QUrl::fromLocalFile(tmpQmlFile.fileName())); m_declarativeView->show(); m_declarativeView->viewport()->setFocusPolicy(Qt::StrongFocus); } void TestCaseExecutionDialog::on_pushButton_clicked() { QTemporaryFile tmpQmlFile; tmpQmlFile.open(); tmpQmlFile.write(m_ui->plainTextEdit_2->toPlainText().toAscii()); tmpQmlFile.close(); m_declarativeView->engine()->clearComponentCache(); m_declarativeView->setSource(QUrl::fromLocalFile(tmpQmlFile.fileName())); } TestCaseExecutionDialog::~TestCaseExecutionDialog() { delete m_ui; } void TestCaseExecutionDialog::on_pushButtonQuit_clicked() { QApplication::quit(); } ./manual-tests/testcaseexecutor/tst_manualtestcase.h0000644000015600001650000000215712700370701023162 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Juhapekka Piiroinen */ #ifndef TST_MANUALTESTCASE_H #define TST_MANUALTESTCASE_H #include #include class tst_manualtestcase : public QObject { Q_OBJECT public: explicit tst_manualtestcase(QObject *parent = 0); private slots: void list(); void run(); protected: void runTest(QString testcase, QString testdata, QString qmlFile); QStringList m_testCases; }; #endif // TST_MANUALTESTCASE_H ./manual-tests/testcaseexecutor/tst_manualtestcase.cpp0000644000015600001650000000351712700370701023516 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Juhapekka Piiroinen */ #include "tst_manualtestcase.h" #include "testcaseexecutiondialog.h" #include #include #include tst_manualtestcase::tst_manualtestcase(QObject *parent) : QObject(parent) { } void tst_manualtestcase::run() { foreach (QString testcase, m_testCases) { qDebug() << "Starting" << testcase; qDebug() << "Loading data to QDeclarativeView"; QString testfile = testcase.split("_").takeAt(1) + ".qml"; QFile test(testcase); if (test.open(QIODevice::ReadOnly)) { QString testdata = test.readAll(); test.close(); runTest(testcase,testdata,testfile); } } } void tst_manualtestcase::list() { QDir currentDirectory = QDir::currentPath(); m_testCases = currentDirectory.entryList(QStringList() << "tst*.txt"); qDebug() << m_testCases; } void tst_manualtestcase::runTest(QString testcase, QString testdata, QString qmlFile) { TestCaseExecutionDialog testcaseExecutor(testcase,testdata,QUrl::fromLocalFile(qmlFile)); int result = testcaseExecutor.exec(); QVERIFY((result==1)); } QTEST_MAIN(tst_manualtestcase) ./manual-tests/testcaseexecutor/testcaseexecutor.pro0000644000015600001650000000175012700370701023220 0ustar jenkinsjenkins# # Copyright 2012 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # # Author: Juhapekka Piiroinen # QT += declarative testlib opengl TARGET = testcase CONFIG += console CONFIG -= app_bundle TEMPLATE = app SOURCES += \ tst_manualtestcase.cpp \ testcaseexecutiondialog.cpp HEADERS += \ tst_manualtestcase.h \ testcaseexecutiondialog.h FORMS += \ testcaseexecutiondialog.ui ./manual-tests/testcaseexecutor/testcaseexecutiondialog.h0000644000015600001650000000245412700370701024176 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Juhapekka Piiroinen */ #ifndef TESTCASEEXECUTIONDIALOG_H #define TESTCASEEXECUTIONDIALOG_H #include #include namespace Ui { class TestCaseExecutionDialog; } class TestCaseExecutionDialog : public QDialog { Q_OBJECT public: explicit TestCaseExecutionDialog(QString testcase, QString testdata, QUrl qmlFile, QWidget *parent = 0); ~TestCaseExecutionDialog(); protected slots: void on_pushButton_clicked(); void on_pushButtonQuit_clicked(); private: QDeclarativeView* m_declarativeView; Ui::TestCaseExecutionDialog *m_ui; }; #endif // TESTCASEEXECUTIONDIALOG_H ./manual-tests/testcaseexecutor/testcaseexecutiondialog.ui0000644000015600001650000001024612700370701024362 0ustar jenkinsjenkins TestCaseExecutionDialog 0 0 758 517 Dialog Quit manual testing QML 0 0 Source Code 0 0 Apply 0 0 Manual Test 0 0 Was the manual test passed? Test case result Qt::Horizontal QDialogButtonBox::No|QDialogButtonBox::Yes buttonBox accepted() TestCaseExecutionDialog accept() 248 254 157 274 buttonBox rejected() TestCaseExecutionDialog reject() 316 260 286 274 ./manual-tests/run_testcases.sh0000755000015600001650000000133012700370701016725 0ustar jenkinsjenkins#!/bin/bash # # Copyright 2012 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # ./testcaseexecutor/testcase -vs -v1|egrep "QML|Declarative" |egrep -v "updateScene" ./manual-tests/README.txt0000644000015600001650000000457412700370701015217 0ustar jenkinsjenkins============== Manual Testing ============== Outline ------- Sometimes it is not possible to easily make an automated test for some use-cases. However just because something isn't easily tested automatically doesn't mean that there isn't value in creating a test for it, just that the test needs to be executed by a person until it is converted into an automated test. However please be very discriminatory about your manual tests. It's highly likely that you can automate whatever it is you're testing, and doing so will be of much more value to the quality of UI Toolkit. Manual tests are a last resort. They should not be written lightly, and should give you a feeling of shame. If you're to the point where you believe you need a manual test, then please come talk to the QA team and we will see if we can find an automatable solution. Format ------ Manual tests take the format of text files in this directory (the manual-test one). These files are formatted using `reStructured Text`_. A very comprehensive `quick reference`_ is available. .. _reStructured Text: http://en.wikipedia.org/wiki/ReStructuredText .. _quick reference: http://docutils.sourceforge.net/docs/user/rst/quickref.html Tests have a header, actions (steps to follow), and an expected result. You can use the TEST_TEMPLATE.txt file as template for new tests. There can be multiple tests in a single file, but they should all be related, and the filename should indicate the tests it contains. Example: Test Button --------- This test shows that the button emits a signal when pressed Setup: #. start examples/ubuntu-ui-toolkit-gallery/ubuntu-ui-toolkit-gallery.qml in qmlscene Actions: #. Select Buttons #. Press and hold LMB on top of the QML Button next to the Label which says "Standard" #. Release LMB Expected Result: #. Buttons page is visible #. QML Button is in pressedColor while LMB is pressed. #. QML Button emits signal clicked() when LMB is released. Directory Structure ------------------- It is expected that as we grow a number of manual tests, we will use directories to organise them. ========= Glossary ========= LMB = Left Mouse Button ========= HOW TO ========= How To See Which Testcase Tests Which Part Of The QML Component? = ---------- open .map file in text editor How To Get The Testcase Executor Binary ---------- /compile_testcaseexecutor.sh How To Execute Tests ---------- ./run_testcases.sh ./manual-tests/tst_button_lmb-on-enabled-disabled.txt0000644000015600001650000000070612700370701023061 0ustar jenkinsjenkinsQML Button Mouse Events - LMB click on Enabled/disabled ---------------------------------------------------- Disable button, click button, Enable button, click button Setup: N/A Actions: #. Disable Button #. Click button #. Enable Button #. Click button Expected Result: #. button is disabled, color is <> #. no clicked() signal is emitted #. color is color, button is enabled #. clicked() signal is emitted Glossary: MLB = Mouse Left Button ./manual-tests/TEST_TEMPLATE.txt0000644000015600001650000000133512700370701016324 0ustar jenkinsjenkins#Please use this template for adding new manual-tests to ensure a consistency. #Text to be changed is enclosed in <<>> # #Please also note that Tests should test ONE THING ONLY. If you want to test #more than one thing, write multiple tests. That helps us to automate them as #well as execute them manually. # #If you're testing purely visual changes, please make sure you link to a #reference image or add it to the bzr repository. <> ---------------------------------------------------- <> Setup: <> Actions: <> Expected Result: <> ./manual-tests/tst_button_iconPosition.txt0000644000015600001650000000051512700370701021213 0ustar jenkinsjenkinsQML Button Mouse Events - iconPosition ---------------------------------------------------- button iconPosition Setup: N/A Actions: #. Set iconSource #. Set iconPosition to left #. Set iconPosition to right Expected Result: #. iconSource is set and icon is loaded #. icon to left of text #. icon to right of text Glossary: N/A ./manual-tests/tst_button_lmb-press-out-in-release.txt0000644000015600001650000000121212700370701023264 0ustar jenkinsjenkinsQML Button Mouse Events - LMB Press, out, in, release ---------------------------------------------------- Move mouse on top of Button, then press, move out, move in, then release Setup: N/A Actions: #. Move mouse in #. Press MLB #. Move mouse out #. Move mouse in #. Release MLB Expected Result: #. mouseEnter emitted, state is hovered #. color is the pressedColor, no clicked() signal emitted, state is pressed #. color is the color, mouseLeave emitted, state is <> #. color is the pressedColor, mouseEnter emitted, state is pressed #. color is the color, clicked() signal is emitted, state is <> Glossary: MLB = Mouse Left Button ./manual-tests/button.qml0000644000015600001650000000135012700370701015534 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.1 Button { id: button text: "Hello World" } ./manual-tests/tst_button_lmb-press-out-up.txt0000644000015600001650000000072212700370701021671 0ustar jenkinsjenkinsQML Button Mouse Events - LMB press, out, release ---------------------------------------------------- Move mouse on top of the button, then press, move out, then release Setup: N/A Actions: #. Move mouse in #. Press MLB #. Move mouse out #. Release MLB Expected Result: #. mouseEnter() emitted #. color is the pressedColor, no clicked() signal emitted #. color is the color, mouseLeave emitted #. no clicked() signal emitted Glossary: MLB = Mouse Left Button ./components.api0000644000015600001650000017657012700370714013776 0ustar jenkinsjenkinsUbuntu.Components.AbstractButton 1.0 0.1: ActionItem property bool hovered signal clicked() signal pressAndHold() property bool pressed Ubuntu.Components.AbstractButton 1.3 UCAbstractButton: ActionItem readonly property bool hovered signal clicked() signal pressAndHold() readonly property bool pressed readonly property UCMargins sensingMargins Ubuntu.Components.Action 1.3 1.0 0.1 UCAction: QtObject property string description property bool enabled property string iconName property url iconSource property Component itemHint property string keywords signal triggered(var value) function trigger(var value) function trigger() property string name property Type parameterType property var shortcut 1.3 property string text property bool visible Ubuntu.Components.Action.Type: Enum Bool Integer None Object Real String Ubuntu.Components.ActionBar 1.3: StyledItem property list actions property Component delegate property int numberOfSlots Ubuntu.Components.Styles.ActionBarStyle 1.3: Item property Component defaultDelegate property int defaultNumberOfSlots property string overflowIconName property url overflowIconSource property string overflowText Ubuntu.Components.ActionContext 1.0 0.1 UCActionContext: QtObject default property list actions property bool active function addAction(Action action) function removeAction(Action action) Ubuntu.Components.ActionItem 1.0 0.1 UCActionItem: StyledItem property Action action property string iconName property url iconSource signal triggered(var value) function trigger(var value) function trigger() property string text Ubuntu.Components.ActionList 1.0 0.1: QtObject property list actions default property list children Ubuntu.Components.ActionList 1.3: QtObject property list actions default property list children Ubuntu.Components.ActionManager 1.0 0.1 UCActionManager: QtObject default property list actions readonly property ActionContext globalContext property list localContexts signal quit() function addAction(Action action) function removeAction(Action action) function addLocalContext(ActionContext context) function removeLocalContext(ActionContext context) Ubuntu.Components.Popups.ActionSelectionPopover 1.0 0.1: Popover property var actions property Component delegate property Item target Ubuntu.Components.Popups.ActionSelectionPopover 1.3: Popover property var actions property Component delegate property Item target Ubuntu.Components.ActivityIndicator 1.0 0.1: AnimatedItem property bool onScreen property bool running Ubuntu.Components.ActivityIndicator 1.3: AnimatedItem property bool onScreen property bool running Ubuntu.Components.AdaptivePageLayout 1.3: PageTreeNode property bool asynchronous readonly property int columns property list layouts function var addPageToCurrentColumn(var sourcePage, var page, var properties) function var addPageToNextColumn(var sourcePage, var page, var properties) function var removePages(var page) property Page primaryPage property var primaryPageSource Ubuntu.Components.Alarm 1.0 0.1 UCAlarm: QtObject property QDateTime date property DaysOfWeek daysOfWeek property bool enabled readonly property int error property string message signal statusChanged(Operation operation) function save() function cancel() function reset() property url sound readonly property Status status property AlarmType type Ubuntu.Components.Alarm.AlarmType: Enum OneTime Repeating Ubuntu.Components.Alarm.DayOfWeek: Enum AutoDetect Daily Friday Monday Saturday Sunday Thursday Tuesday Wednesday Ubuntu.Components.Alarm.DaysOfWeek: Flag AutoDetect Daily Friday Monday Saturday Sunday Thursday Tuesday Wednesday Ubuntu.Components.Alarm.Error: Enum AdaptationError EarlyDate InvalidDate InvalidEvent NoDaysOfWeek NoError OneTimeOnMoreDays OperationPending Ubuntu.Components.Alarm.Operation: Enum Canceling NoOperation Reseting Saving Ubuntu.Components.Alarm.Status: Enum Fail InProgress Ready Ubuntu.Components.AlarmModel 1.0 0.1 UCAlarmModel: QAbstractListModel readonly property int count function refresh() 1.0 function UCAlarm* get(int index) Ubuntu.Components.Argument 1.0 0.1 UCArgument: QtObject property string help function var at(int i) property string name property bool required property QStringList valueNames Ubuntu.Components.Arguments 1.0 0.1 UCArguments: QtObject default property list arguments property Argument defaultArgument readonly property bool error readonly property string errorMessage function printUsage() function quitWithError(string errorMessage) function quitWithError() readonly property QQmlPropertyMap values Ubuntu.Components.ListItems.Base 1.0 0.1: Empty property string fallbackIconName property url fallbackIconSource property var icon property bool iconFrame property bool progression Ubuntu.Components.ListItems.Base 1.3: Empty property string fallbackIconName property url fallbackIconSource property var icon property bool iconFrame property bool progression Ubuntu.Components.BottomEdge 1.3 UCBottomEdge: StyledItem readonly property BottomEdgeRegion activeRegion property Component contentComponent readonly property Item contentItem property url contentUrl readonly property DragDirection dragDirection readonly property double dragProgress readonly property BottomEdgeHint hint signal dragProgressChanged(double dragProgress) signal dragDirectionChanged(BottomEdge.DragDirection direction) signal statusChanged(BottomEdge.Status status) signal contentChanged(url url) signal contentComponentChanged(Component component) signal activeRegionChanged(BottomEdgeRegion activeRegion) signal commitStarted() signal commitCompleted() signal collapseStarted() signal collapseCompleted() function commit() function collapse() property bool preloadContent property list regions readonly property Status status Ubuntu.Components.BottomEdge.DragDirection: Enum Downwards Undefined Upwards Ubuntu.Components.BottomEdge.Status: Enum Committed Hidden Revealed Ubuntu.Components.BottomEdgeHint 1.3 UCBottomEdgeHint: ActionItem property int deactivateTimeout property Flickable flickable signal clicked() property Status status readonly property SwipeArea swipeArea Ubuntu.Components.BottomEdgeHint.Status: Enum Active Hidden Inactive Locked Ubuntu.Components.BottomEdgeRegion 1.3 UCBottomEdgeRegion: QtObject property Component contentComponent property url contentUrl property bool enabled property double from signal contentChanged(url url) signal contentComponentChanged(Component component) signal entered() signal exited() signal dragEnded() property double to Ubuntu.Components.Styles.BottomEdgeStyle 1.3 UCBottomEdgeStyle: Item property Item contentItem property Item panel property Animation panelAnimation property double revealThreshold Ubuntu.Components.Button 1.0 0.1: AbstractButton property color color property QFont font property Gradient gradient property string iconPosition Ubuntu.Components.Button 1.1: AbstractButton property color color property QFont font property Gradient gradient property string iconPosition property color strokeColor Ubuntu.Components.Button 1.3: AbstractButton property color color property QFont font property Gradient gradient property string iconPosition property color strokeColor Ubuntu.Components.ListItems.Caption 1.0 0.1: Item property string text Ubuntu.Components.ListItems.Caption 1.3: Item property string text Ubuntu.Components.Captions 1.2: ColumnLayout property int captionStyle readonly property Label subtitle readonly property Label title Ubuntu.Components.Captions 1.3: ColumnLayout property int captionStyle readonly property Label subtitle readonly property Label title Ubuntu.Components.CheckBox 1.0 0.1: AbstractButton property bool checked Ubuntu.Components.CheckBox 1.3: AbstractButton property bool checked Ubuntu.Components.Clipboard 1.0 0.1: QtObject singleton readonly property MimeData data function push(var data) function clear() function QQuickMimeData* newData() Ubuntu.Components.ColorUtils 1.0 0.1: QtObject singleton function double luminance(color color) Ubuntu.Components.ComboButton 1.1: Button property double collapsedHeight default property list comboList readonly property double comboListHeight property color dropdownColor property bool expanded property double expandedHeight Ubuntu.Components.ComboButton 1.3: AbstractButton property double collapsedHeight property color color default property list comboList readonly property double comboListHeight property color dropdownColor property bool expanded property double expandedHeight property QFont font property Gradient gradient property string iconPosition property color strokeColor Ubuntu.Components.Styles.ComboButtonStyle 1.1: Item property Item comboListHolder property double comboListMargin property Item comboListPanel property color defaultColor property color defaultDropdownColor property QFont defaultFont property Gradient defaultGradient property double dropDownSeparatorWidth property double dropDownWidth Ubuntu.Components.Popups.ComposerSheet 1.0 0.1: SheetBase signal cancelClicked() signal confirmClicked() Ubuntu.Components.Popups.ComposerSheet 1.3: SheetBase signal cancelClicked() signal confirmClicked() Ubuntu.Layouts.ConditionalLayout 1.0 0.1 ULConditionalLayout: QtObject default property Component layout property string name property QQmlBinding when Ubuntu.PerformanceMetrics.CpuUsage 1.0 0.1 UPMCpuUsage: Item readonly property UPMGraphModel graphModel property int period property int samplingInterval Ubuntu.Components.CrossFadeImage 1.0 0.1 CrossFadeImage10: Item property int fadeDuration property int fillMode readonly property bool running property url source property QSizeF sourceSize readonly property int status Ubuntu.Components.CrossFadeImage 1.1 CrossFadeImage11: Item property int fadeDuration property string fadeStyle property int fillMode readonly property bool running property url source property QSizeF sourceSize readonly property int status Ubuntu.Components.CrossFadeImage 1.3: Item property int fadeDuration property string fadeStyle property int fillMode readonly property bool running property url source property QSizeF sourceSize readonly property int status Ubuntu.Components.Pickers.DatePicker 1.0 0.1: StyledItem property QDateTime date readonly property int day readonly property int hours property var locale property QDateTime maximum property QDateTime minimum readonly property int minutes property string mode readonly property int month readonly property bool moving readonly property int seconds readonly property int week readonly property int year Ubuntu.Components.Pickers.DatePicker 1.3: StyledItem property QDateTime date readonly property int day readonly property int hours property var locale property QDateTime maximum property QDateTime minimum readonly property int minutes property string mode readonly property int month readonly property bool moving readonly property int seconds readonly property int week readonly property int year Ubuntu.Components.DateUtils 0.1 1.0 1.3 Ubuntu.Components.Popups.DefaultSheet 1.0 0.1: SheetBase property bool doneButton signal closeClicked() signal doneClicked() Ubuntu.Components.Popups.DefaultSheet 1.3: SheetBase property bool doneButton signal closeClicked() signal doneClicked() Ubuntu.Components.Pickers.Dialer 1.0 0.1: StyledItem property list centerContent readonly property Item centerItem property double handSpace readonly property var hands property double maximumValue signal handUpdated(var hand) property double minimumValue property double size Ubuntu.Components.Pickers.Dialer 1.3: StyledItem property list centerContent readonly property Item centerItem property double handSpace readonly property var hands property double maximumValue signal handUpdated(var hand) property double minimumValue property double size Ubuntu.Components.Pickers.DialerHand 1.0 0.1: StyledItem readonly property Dialer dialer property DialerHandGroup hand readonly property int index default property list overlay property double value Ubuntu.Components.Pickers.DialerHand 1.3: StyledItem readonly property Dialer dialer property DialerHandGroup hand readonly property int index default property list overlay property double value Ubuntu.Components.Popups.Dialog 1.0 0.1: PopupBase property Item caller property double callerMargin default property list contents property double edgeMargins property bool modal property Item pointerTarget property string text property string title Ubuntu.Components.Popups.Dialog 1.3: PopupBase property Item caller property double callerMargin property double contentHeight property double contentWidth default property list contents property double edgeMargins property bool modal property Component style property string styleName property string text property ThemeSettings theme property string title Ubuntu.Components.ListItems.Divider 1.0 0.1: QQuickImageBase Ubuntu.Components.ListItems.Divider 1.3: QQuickImageBase Ubuntu.Components.ListItems.Empty 1.0 0.1: AbstractButton property list backgroundIndicator property bool confirmRemoval readonly property ThinDivider divider property bool highlightWhenPressed signal itemRemoved() function var cancelItemRemoval() property bool removable property bool selected property bool showDivider readonly property string swipingState readonly property bool waitingConfirmationForRemoval Ubuntu.Components.ListItems.Empty 1.3: AbstractButton property list backgroundIndicator property bool confirmRemoval readonly property ThinDivider divider property bool highlightWhenPressed signal itemRemoved() function var cancelItemRemoval() property bool removable property bool selected property bool showDivider readonly property string swipingState readonly property bool waitingConfirmationForRemoval Ubuntu.Components.ListItems.Expandable 1.0 0.1: Empty property bool collapseOnClick property double collapsedHeight property bool expanded property double expandedHeight Ubuntu.Components.ListItems.Expandable 1.3: Empty property bool collapseOnClick property double collapsedHeight property bool expanded property double expandedHeight Ubuntu.Components.ListItems.ExpandablesColumn 1.0 0.1: Flickable readonly property var expandedItem function var expandItem(var item) function var collapse() Ubuntu.Components.ListItems.ExpandablesColumn 1.3: Flickable readonly property var expandedItem function var expandItem(var item) function var collapse() Ubuntu.Components.FilterBehavior 1.1: QtObject property QRegExp pattern property string property Ubuntu.Components.Haptics 1.0 0.1: QtObject singleton readonly property QtObject effect readonly property bool enabled function play(var customEffect) function play() Ubuntu.Components.ListItems.Header 1.0 0.1 ListItemHeader: Item property string text Ubuntu.Components.Header 1.0 0.1: AppHeader property string _for_autopilot property var actions property bool animate property PageHeadConfiguration config property Item contents property color dividerColor property Flickable flickable function var show() function var hide() readonly property bool moving property var pageStack property color panelColor property var tabsModel property string title property bool useDeprecatedToolbar Ubuntu.Components.ListItems.Header 1.3 ListItemHeader: Item property string text Ubuntu.Components.Header 1.3 UCHeader: StyledItem property bool exposed property Flickable flickable readonly property bool moving Ubuntu.Components.Icon 1.0 0.1: Item property color color property color keyColor property string name Ubuntu.Components.Icon 1.1: Icon property url source Ubuntu.Components.Icon 1.3: Item property bool asynchronous property color color property color keyColor property string name property url source Ubuntu.Components.InverseMouse 1.0 0.1 UCInverseMouse: Mouse Ubuntu.Components.InverseMouseArea 1.0 0.1 InverseMouseAreaType: MouseArea function bool contains(QPointF point) property Item sensingArea property bool topmostItem Ubuntu.Layouts.ItemLayout 1.0 0.1 ULItemLayout: Item property string item Ubuntu.Components.ListItems.ItemSelector 1.0 0.1: Empty property bool colourImage property double containerHeight property bool currentlyExpanded property Component delegate property bool expanded readonly property double itemHeight signal delegateClicked(int index) signal expansionCompleted() property var model property bool multiSelection property int selectedIndex Ubuntu.Components.ListItems.ItemSelector 1.3: Empty property bool colourImage property double containerHeight property bool currentlyExpanded property Component delegate property bool expanded readonly property double itemHeight signal delegateClicked(int index) signal expansionCompleted() property var model property bool multiSelection property int selectedIndex Ubuntu.Components.Label 1.0 0.1: Text property string fontSize Ubuntu.Components.Label 1.3 UCLabel: Text property string fontSize property TextSize textSize Ubuntu.Components.Label.TextSize: Enum Large Medium Small XLarge XSmall XxSmall Ubuntu.Layouts.Layouts 1.0 0.1 ULLayouts: Item readonly property string currentLayout property list layouts Ubuntu.Components.ListItem 1.3 1.2 UCListItem: StyledItem property Action action property color color readonly property Item contentItem readonly property bool contentMoving readonly property UCListItemDivider divider property bool dragMode readonly property bool dragging readonly property UCListItemExpansion expansion 1.3 property color highlightColor readonly property bool highlighted property ListItemActions leadingActions property list listItemChildren default property list listItemData signal clicked() signal pressAndHold() signal contentMovementStarted() signal contentMovementEnded() property bool selectMode property bool selected property bool swipeEnabled 1.3 readonly property bool swiped 1.3 property ListItemActions trailingActions Ubuntu.Components.ListItemActions 1.2 UCListItemActions: QtObject property list actions default property list data property Component delegate Ubuntu.Components.ListItemDrag 1.2: QtObject property bool accept readonly property int from property int maximumIndex property int minimumIndex readonly property Status status readonly property int to Ubuntu.Components.ListItemDrag.Status: Enum Dropped Moving Started Ubuntu.Components.ListItemLayout 1.3 UCListItemLayout: SlotsLayout readonly property Label subtitle readonly property Label summary readonly property Label title Ubuntu.Components.Styles.ListItemStyle 1.3 1.2 UCListItemStyle: Item readonly property bool animatePanels property Item dragPanel property PropertyAnimation dropAnimation readonly property Flickable flickable 1.3 readonly property int listItemIndex 1.3 function swipeEvent(SwipeEvent event) function rebound() property Animation snapAnimation Ubuntu.Components.LiveTimer 1.3 LiveTimer: QtObject property Frequency frequency signal trigger() property QDateTime relativeTime Ubuntu.Components.LiveTimer.Frequency: Enum Disabled Hour Minute Relative Second Ubuntu.Components.MainView 1.0 0.1: MainViewBase property bool automaticOrientation default property list contentsItem property bool useDeprecatedToolbar Ubuntu.Components.MainView 1.2 MainView12: MainViewBase property bool automaticOrientation default property list contentsItem Ubuntu.Components.MainView 1.3: MainViewBase property bool automaticOrientation default property list contentsItem Ubuntu.Components.MainViewBase 1.3 UCMainViewBase: PageTreeNode readonly property PopupContext actionContext readonly property ActionManager actionManager property list actions property bool anchorToKeyboard property string applicationName property color backgroundColor property color footerColor property color headerColor signal applicationNameChanged(string applicationName) signal anchorToKeyboardChanged(bool anchorToKeyboard) signal headerColorChanged(color headerColor) signal backgroundColorChanged(color backgroundColor) signal footerColorChanged(color footerColor) signal actionManagerChanged(ActionManager actionManager) signal actionContextChanged(PopupContext actionContext) Ubuntu.Components.MathUtils 1.0 0.1: QtObject singleton function double clamp(double x, double min, double max) function double lerp(double delta, double from, double to) function double projectValue(double x, double xmin, double xmax, double ymin, double ymax) function double clampAndProject(double x, double xmin, double xmax, double ymin, double ymax) Ubuntu.Components.MimeData 1.0 0.1 QQuickMimeData: QtObject property color color property var data readonly property QStringList formats property string html property string text property list urls Ubuntu.Components.Mouse 1.0 0.1 UCMouse: QtObject readonly property Qt.MouseButtons acceptedButtons property int clickAndHoldThreshold property bool enabled property list forwardTo readonly property bool hoverEnabled property bool ignoreSynthesizedEvents signal pressed(QQuickMouseEvent mouse, Item host) signal released(QQuickMouseEvent mouse, Item host) signal clicked(QQuickMouseEvent mouse, Item host) signal pressAndHold(QQuickMouseEvent mouse, Item host) signal doubleClicked(QQuickMouseEvent mouse, Item host) signal positionChanged(QQuickMouseEvent mouse, Item host) signal entered(QQuickMouseEvent event, Item host) signal exited(QQuickMouseEvent event, Item host) property Priority priority Ubuntu.Components.Mouse.Priority: Enum AfterItem BeforeItem Ubuntu.Test.MouseTouchAdaptor 1.0: QtObject singleton property bool enabled signal enabledChanged(bool value) Ubuntu.Components.ListItems.MultiValue 1.0 0.1: Base property var values Ubuntu.Components.ListItems.MultiValue 1.3: Base property var values Ubuntu.Components.Object 1.0 0.1: QtObject default property list children Ubuntu.Components.OptionSelector 1.0 0.1: Empty property bool colourImage property double containerHeight property bool currentlyExpanded property Component delegate property bool expanded readonly property double itemHeight signal delegateClicked(int index) signal expansionCompleted() property var model property bool multiSelection property int selectedIndex Ubuntu.Components.OptionSelector 1.3: Empty property bool colourImage property double containerHeight property bool currentlyExpanded property Component delegate property bool expanded readonly property double itemHeight signal delegateClicked(int index) signal expansionCompleted() property var model property bool multiSelection property int selectedIndex Ubuntu.Components.OptionSelectorDelegate 1.0 0.1: Empty property color assetColour property bool colourImage property bool constrainImage readonly property string fragColourShader property url icon readonly property ListView listView property string subText Ubuntu.Components.OptionSelectorDelegate 1.3: Empty property color assetColour property bool colourImage property bool constrainImage readonly property string fragColourShader property url icon readonly property ListView listView property string subText Ubuntu.Components.OrientationHelper 1.0 0.1: Item property bool anchorToKeyboard property bool automaticOrientation property int orientationAngle readonly property bool rotating property bool transitionEnabled Ubuntu.Components.OrientationHelper 1.3: Item property bool anchorToKeyboard property bool automaticOrientation property int orientationAngle readonly property bool rotating property bool transitionEnabled Ubuntu.Components.Page 1.0 0.1 Page10: PageTreeNode property list actions property Flickable flickable property string title property Item tools Ubuntu.Components.Page 1.1 Page11: Page10 readonly property PageHeadConfiguration head Ubuntu.Components.Page 1.3: PageTreeNode readonly property ActionContext actionContext property Flickable flickable readonly property PageHeadConfiguration head property Item header property string title Ubuntu.Components.PageColumn 1.3: QtObject property bool fillWidth property double maximumWidth property double minimumWidth property double preferredWidth Ubuntu.Components.PageColumnsLayout 1.3: QtObject default property list data property bool when Ubuntu.Components.PageHeadConfiguration 1.1: Object property list actions property Action backAction property Item contents property color foregroundColor property string preset readonly property PageHeadSections sections Ubuntu.Components.PageHeadConfiguration 1.3: Object property list actions property Action backAction property Item contents property Flickable flickable property color foregroundColor property bool locked property string preset readonly property PageHeadSections sections property string title property bool visible Ubuntu.Components.PageHeadSections 1.1: QtObject property bool enabled property var model property int selectedIndex Ubuntu.Components.PageHeadSections 1.3: QtObject property list actions property bool enabled property var model property int selectedIndex Ubuntu.Components.PageHeadState 1.1: State property list actions property Action backAction property Item contents property PageHeadConfiguration head Ubuntu.Components.PageHeadState 1.3: State property list actions property Action backAction property Item contents property PageHeadConfiguration head Ubuntu.Components.Styles.PageHeadStyle 1.1: Item property double contentHeight property string fontSize property int fontWeight property int maximumNumberOfActions property url separatorBottomSource property url separatorSource property color textColor property double textLeftMargin Ubuntu.Components.Styles.PageHeadStyle 1.3: Item property double contentHeight property string fontSize property int fontWeight property int maximumNumberOfActions property url separatorBottomSource property url separatorSource property color textColor property double textLeftMargin property int textSize Ubuntu.Components.PageHeader 1.3: Header property Item contents property Item extension readonly property ActionBar leadingActionBar property list navigationActions readonly property Sections sections property string title readonly property ActionBar trailingActionBar Ubuntu.Components.Styles.PageHeaderStyle 1.3: Item property color backgroundColor property double contentHeight property Component defaultActionDelegate property color dividerColor property color foregroundColor property Component titleComponent Ubuntu.Components.PageStack 1.0 0.1: PageTreeNode property Item currentPage property int depth function var push(var page, var properties) function var pop() function var clear() Ubuntu.Components.PageStack 1.3: PageTreeNode property Item currentPage property int depth function var push(var page, var properties) function var pop() function var clear() Ubuntu.Components.PageTreeNode 1.3 UCPageTreeNode: StyledItem property bool active readonly property Item activeLeafNode property bool isLeaf signal isLeafChanged(bool isLeaf) signal activeChanged(bool active) signal parentNodeChanged(PageTreeNode parentNode) signal pageStackChanged(Item pageStack) signal activeLeafNodeChanged(Item activeLeafNode) signal propagatedChanged(QtObject propagated) signal toolbarChanged(Item toolbar) signal isPageTreeNodeChanged(bool isPageTreeNode) function dumpNodeTree() property Item pageStack property PageTreeNode parentNode property Item toolbar Ubuntu.Components.Themes.Palette 0.1: QtObject property PaletteValues normal property PaletteValues selected Ubuntu.Components.Themes.Palette 1.3: QtObject property PaletteValues disabled property PaletteValues highlighted property PaletteValues normal property PaletteValues selected property PaletteValues selectedDisabled Ubuntu.Components.Themes.PaletteValues 0.1: QtObject property color background property color backgroundText property color base property color baseText property color field property color fieldText property color foreground property color foregroundText property color overlay property color overlayText property color selection Ubuntu.Components.Themes.PaletteValues 1.3: QtObject property color activity property color activityText property color background property color backgroundSecondaryText property color backgroundTertiaryText property color backgroundText property color base property color baseText property color field property color fieldText property color focus property color focusText property color foreground property color foregroundText property color negative property color negativeText property color overlay property color overlaySecondaryText property color overlayText property color positive property color positiveText property color raised property color raisedSecondaryText property color raisedText property color selection property color selectionText Ubuntu.Components.Panel 1.0 0.1: Item property int align property bool animate readonly property bool animating default property list contents property int hideTimeout property double hintSize property bool locked function var open() function var close() property bool opened readonly property double position readonly property bool pressed property double triggerSize Ubuntu.Components.Panel 1.3: Item property int align property bool animate readonly property bool animating default property list contents property int hideTimeout property double hintSize property bool locked function var open() function var close() property bool opened readonly property double position readonly property bool pressed property double triggerSize Ubuntu.PerformanceMetrics.PerformanceOverlay 1.0 0.1: Item property bool active Ubuntu.Components.Pickers.Picker 1.0 0.1: StyledItem property bool circular property Component delegate property bool live function var positionViewAtIndex(var index) property var model readonly property bool moving property int selectedIndex Ubuntu.Components.Pickers.Picker 1.3: StyledItem property bool circular property Component delegate property double itemHeight property bool live function var positionViewAtIndex(var index) property var model readonly property bool moving property int selectedIndex Ubuntu.Components.Pickers.PickerDelegate 1.0 0.1: AbstractButton readonly property Picker picker Ubuntu.Components.Pickers.PickerDelegate 1.3: AbstractButton readonly property Picker picker Ubuntu.Components.Pickers.PickerPanel 1.0 0.1: Object singleton function var openDatePicker(var caller, var property, var mode) Ubuntu.Components.Pickers.PickerPanel 1.3: Object singleton function var openDatePicker(var caller, var property, var mode) Ubuntu.Components.Popups.Popover 1.0 0.1: PopupBase property bool autoClose property Item caller property double callerMargin default property list container property double contentHeight property double contentWidth property double edgeMargins property Component foregroundStyle function var show() function var hide() property Item pointerTarget Ubuntu.Components.Popups.Popover 1.3: PopupBase property bool autoClose property Item caller property double callerMargin default property list container property double contentHeight property double contentWidth property double edgeMargins property Component foregroundStyle function var show() function var hide() property Item pointerTarget property Component style property string styleName property ThemeSettings theme Ubuntu.Components.Popups.PopupBase 1.0 0.1: OrientationHelper property Item dismissArea property PropertyAnimation fadingAnimation property bool grabDismissAreaEvents function var show() function var hide() Ubuntu.Components.Popups.PopupBase 1.3: OrientationHelper property Item dismissArea property PropertyAnimation fadingAnimation property bool grabDismissAreaEvents function var show() function var hide() Ubuntu.Components.PopupContext 1.3 UCPopupContext: ActionContext Ubuntu.Components.Popups.PopupUtils 0.1 1.0 1.3 Ubuntu.Components.ProgressBar 1.0 0.1: AnimatedItem property bool indeterminate property double maximumValue property double minimumValue property bool onScreen property double value Ubuntu.Components.ProgressBar 1.1: ProgressBar property bool showProgressPercentage Ubuntu.Components.ProgressBar 1.3: AnimatedItem property bool indeterminate property double maximumValue property double minimumValue property bool onScreen property bool showProgressPercentage property double value Ubuntu.Components.ProgressionSlot 1.3: Item property bool asynchronous property color color property color keyColor property string name property url source Ubuntu.Components.ProportionalShape 1.3 UCProportionalShape: UbuntuShape Ubuntu.Components.PullToRefresh 1.1: StyledItem property Component content signal refresh() readonly property double offset property bool refreshing readonly property bool releaseToRefresh property Flickable target Ubuntu.Components.PullToRefresh 1.3: StyledItem property Component content signal refresh() readonly property double offset property bool refreshing readonly property bool releaseToRefresh property Flickable target Ubuntu.Components.Styles.PullToRefreshStyle 1.1: Item property double activationThreshold property Component defaultContent property bool releaseToRefresh Ubuntu.PerformanceMetrics.RenderingTimes 1.0 0.1 UPMRenderingTimes: Item readonly property UPMGraphModel graphModel signal frameRendered(qlonglong renderTime) property int period property int samples property RenderTimer.TimerType timerType Ubuntu.Components.ScrollView 1.3: StyledItem default property Item contentItem readonly property Flickable flickableItem property Scrollbar horizontalScrollbar property Scrollbar verticalScrollbar readonly property Item viewport Ubuntu.Components.Scrollbar 1.0 0.1: StyledItem property int align property Flickable flickableItem Ubuntu.Components.Scrollbar 1.3: StyledItem property int align property Flickable flickableItem Ubuntu.Components.Sections 1.3: StyledItem property list actions property var model property int selectedIndex Ubuntu.Components.ServiceProperties 1.1 UCServiceProperties: QtObject property string adaptorInterface 1.1 readonly property string error 1.1 property string path 1.1 property string service 1.1 property string serviceInterface 1.1 readonly property Status status 1.1 property ServiceType type 1.1 Ubuntu.Components.ServiceProperties.ServiceType: Enum Session System Undefined Ubuntu.Components.ServiceProperties.Status: Enum Active ConnectionError Inactive Synchronizing Ubuntu.Components.Popups.SheetBase 1.0 0.1: PopupBase default property list container property double contentsHeight property double contentsWidth property bool modal property string title Ubuntu.Components.Popups.SheetBase 1.3: PopupBase default property list container property double contentsHeight property double contentsWidth property bool modal property string title Ubuntu.Components.ListItems.SingleControl 1.0 0.1: Empty property Item control Ubuntu.Components.ListItems.SingleControl 1.3: Empty property Item control Ubuntu.Components.ListItems.SingleValue 1.0 0.1: Base property string value Ubuntu.Components.ListItems.SingleValue 1.3: Base property string value Ubuntu.Components.Slider 1.0 0.1: StyledItem property bool live property double maximumValue signal touched(bool onThumb) function var formatValue(var v) property double minimumValue readonly property bool pressed property double value Ubuntu.Components.Slider 1.3: StyledItem property bool live property double maximumValue signal touched(bool onThumb) function var formatValue(var v) property double minimumValue readonly property bool pressed property double stepSize property double value Ubuntu.Components.SliderUtils 0.1 1.0 Ubuntu.Components.SlotsAttached 1.3: QtObject property bool overrideVerticalPositioning readonly property SlotsLayoutPadding padding property SlotsLayout.UCSlotPosition position Ubuntu.Components.SlotsLayout 1.3 UCSlotsLayout: Item property Item mainSlot readonly property SlotsLayoutPadding padding Ubuntu.Components.SlotsLayout.UCSlotPosition: Enum First Last Leading Trailing Ubuntu.Components.SlotsLayoutPadding 1.3: QtObject property double bottom property double leading property double top property double trailing Ubuntu.Components.SortBehavior 1.1: QtObject property Qt.SortOrder order property string property Ubuntu.Components.SortFilterModel 1.1 QSortFilterProxyModelQML: QSortFilterProxyModel readonly property int count readonly property FilterBehavior filter function QVariantMap get(int row) function int count() property QAbstractItemModel model readonly property SortBehavior sort Ubuntu.Components.ListItems.Standard 1.0 0.1: Empty property Item control property string fallbackIconName property url fallbackIconSource property var icon property bool iconFrame property bool progression Ubuntu.Components.ListItems.Standard 1.3: Empty property Item control property string fallbackIconName property url fallbackIconSource property var icon property bool iconFrame property bool progression Ubuntu.Components.StateSaver 1.0 0.1 UCStateSaver: QtObject Ubuntu.Components.StyleHints 1.3 UCStyleHints: QtObject property bool ignoreUnknownProperties Ubuntu.Components.StyledItem 1.3 1.3 1.1 1.0 0.1 UCStyledItemBase: Item property bool activeFocusOnPress 1.3 readonly property bool keyNavigationFocus 1.3 signal activeFocusOnTabChanged2() 1.3 function bool requestFocus(Qt.FocusReason reason) 1.3 function bool requestFocus() 1.3 property Component style property string styleName 1.3 property ThemeSettings theme 1.3 Ubuntu.Components.ListItems.Subtitled 1.0 0.1: Base property string subText Ubuntu.Components.ListItems.Subtitled 1.3: Base property string subText Ubuntu.Components.SwipeArea 1.3 UCSwipeArea: Item property Direction direction readonly property double distance readonly property bool dragging property bool grabGesture property bool immediateRecognition signal directionChanged(Direction direction) signal draggingChanged(bool dragging) signal pressedChanged(bool pressed) signal distanceChanged(double distance) signal touchPositionChanged(QPointF position) signal immediateRecognitionChanged(bool immediateRecognition) signal grabGestureChanged(bool grabGesture) readonly property bool pressed readonly property QPointF touchPosition Ubuntu.Components.SwipeArea.Direction: Enum Downwards Horizontal Leftwards Rightwards Upwards Vertical Ubuntu.Components.SwipeEvent 1.2: QtObject property QPointF content readonly property QPointF from readonly property Status status readonly property QPointF to Ubuntu.Components.SwipeEvent.Status: Enum Finished Started Updated Ubuntu.Components.Switch 1.0 0.1: AbstractButton property bool checked Ubuntu.Components.Switch 1.3: AbstractButton property bool checked Ubuntu.Components.Tab 1.0 0.1: PageTreeNode property url iconSource readonly property int index property Item page property string title Ubuntu.Components.Tab 1.3: PageTreeNode property url iconSource readonly property int index property Item page property string title Ubuntu.Components.TabBar 1.0 0.1: StyledItem property bool alwaysSelectionMode property bool animate property var model readonly property bool pressed property int selectedIndex property bool selectionMode property Item tabsItem Ubuntu.Components.TabBar 1.3: StyledItem property bool alwaysSelectionMode property bool animate property var model readonly property bool pressed property int selectedIndex property bool selectionMode property Item tabsItem Ubuntu.Components.Tabs 1.0 0.1: PageTreeNode readonly property int count readonly property Item currentPage readonly property Tab selectedTab property int selectedTabIndex property TabBar tabBar default property list tabChildren Ubuntu.Components.Tabs 1.3: PageTreeNode readonly property int count readonly property Item currentPage readonly property Tab selectedTab property int selectedTabIndex property TabBar tabBar default property list tabChildren Ubuntu.Test.TestExtras 1.0: QtObject singleton function string openGLflavor() function string cpuArchitecture() function bool touchDevicePresent() function registerTouchDevice() function touchPress(int touchId, Item item, Qt.point point) function touchRelease(int touchId, Item item, Qt.point point) function touchClick(int touchId, Item item, Qt.point point) function touchLongPress(int touchId, Item item, Qt.point point) function touchDoubleClick(int touchId, Item item, Qt.point point) function touchMove(int touchId, Item item, Qt.point point) function touchDrag(int touchId, Item item, Qt.point from, Qt.point delta, int steps) function touchDrag(int touchId, Item item, Qt.point from, Qt.point delta) function mouseDrag(Item item, Qt.point from, Qt.point delta, Qt.MouseButton button, Qt.KeyboardModifiers stateKey, int steps, int delay) function mouseDrag(Item item, Qt.point from, Qt.point delta, Qt.MouseButton button, Qt.KeyboardModifiers stateKey, int steps) function mouseDrag(Item item, Qt.point from, Qt.point delta, Qt.MouseButton button, Qt.KeyboardModifiers stateKey) function mouseDrag(Item item, Qt.point from, Qt.point delta, Qt.MouseButton button) function removeTimeConstraintsFromSwipeArea(Item item) readonly property bool touchPresent Ubuntu.Components.TextArea 1.0 0.1: StyledItem property bool autoExpand property bool autoSize property url baseUrl readonly property bool canPaste readonly property bool canRedo readonly property bool canUndo property color color property double contentHeight property double contentWidth property Component cursorDelegate property int cursorPosition readonly property QRectF cursorRectangle property bool cursorVisible readonly property string displayText readonly property int effectiveHorizontalAlignment property QFont font property bool highlighted property int horizontalAlignment readonly property bool inputMethodComposing property int inputMethodHints readonly property int length readonly property int lineCount property int maximumLineCount signal linkActivated(string link) function var copy() function var cut() function var deselect() function var insert(var position, var text) function var positionAt(var x, var y) function var isRightToLeft(var start, var end) function var moveCursorSelection(var position, var mode) function var paste(var data) function var positionToRectangle(var position) function var redo() function var select(var start, var end) function var selectAll() function var selectWord() function var getFormattedText(var start, var end) function var getText(var start, var end) function var remove(var start, var end) function var undo() property int mouseSelectionMode property bool persistentSelection property string placeholderText property var popover property bool readOnly property int renderType property bool selectByMouse readonly property string selectedText property color selectedTextColor property color selectionColor readonly property int selectionEnd readonly property int selectionStart property string text property int textFormat property int verticalAlignment property int wrapMode Ubuntu.Components.TextArea 1.3: StyledItem property bool autoExpand property bool autoSize property url baseUrl readonly property bool canPaste readonly property bool canRedo readonly property bool canUndo property color color property double contentHeight property double contentWidth property Component cursorDelegate property int cursorPosition readonly property QRectF cursorRectangle property bool cursorVisible readonly property string displayText readonly property int effectiveHorizontalAlignment property QFont font property bool highlighted property int horizontalAlignment readonly property bool inputMethodComposing property int inputMethodHints readonly property int length readonly property int lineCount property int maximumLineCount signal linkActivated(string link) function var copy() function var cut() function var deselect() function var insert(var position, var text) function var positionAt(var x, var y) function var isRightToLeft(var start, var end) function var moveCursorSelection(var position, var mode) function var paste(var data) function var positionToRectangle(var position) function var redo() function var select(var start, var end) function var selectAll() function var selectWord() function var getFormattedText(var start, var end) function var getText(var start, var end) function var remove(var start, var end) function var undo() property int mouseSelectionMode readonly property double paintedHeight readonly property double paintedWidth property bool persistentSelection property string placeholderText property var popover property bool readOnly property int renderType property bool selectByMouse readonly property string selectedText property color selectedTextColor property color selectionColor readonly property int selectionEnd readonly property int selectionStart property string text readonly property QQuickTextDocument textDocument property int textFormat property int verticalAlignment property int wrapMode Ubuntu.Components.TextField 1.0 0.1: ActionItem readonly property bool acceptableInput property bool autoScroll readonly property bool canPaste readonly property bool canRedo readonly property bool canUndo property color color readonly property double contentHeight readonly property double contentWidth property Component cursorDelegate property int cursorPosition readonly property QRectF cursorRectangle property bool cursorVisible property Component customSoftwareInputPanel readonly property string displayText property int echoMode readonly property int effectiveHorizontalAlignment property bool errorHighlight property QFont font property bool hasClearButton property bool highlighted property int horizontalAlignment property string inputMask readonly property bool inputMethodComposing property int inputMethodHints readonly property int length property int maximumLength signal accepted() function var copy() function var cut() function var paste(var data) function var deselect() function var insert(var position, var text) function var positionAt(var x, var position) function var positionToRectangle(var pos) function var select(var start, var end) function var selectAll() function var selectWord() function var isRightToLeft(var start, var end) function var moveCursorSelection(var position, var mode) function var redo() function var undo() function var remove(var start, var end) function var getText(var start, var end) property int mouseSelectionMode property string passwordCharacter property bool persistentSelection property string placeholderText property var popover property list primaryItem property bool readOnly property int renderType property list secondaryItem property bool selectByMouse readonly property string selectedText property color selectedTextColor property color selectionColor readonly property int selectionEnd readonly property int selectionStart property QValidator validator property int verticalAlignment Ubuntu.Components.TextField 1.3: ActionItem readonly property bool acceptableInput property bool autoScroll readonly property bool canPaste readonly property bool canRedo readonly property bool canUndo property color color readonly property double contentHeight readonly property double contentWidth property Component cursorDelegate property int cursorPosition readonly property QRectF cursorRectangle property bool cursorVisible property Component customSoftwareInputPanel readonly property string displayText property int echoMode readonly property int effectiveHorizontalAlignment property bool errorHighlight property QFont font property bool hasClearButton property bool highlighted property int horizontalAlignment property string inputMask readonly property bool inputMethodComposing property int inputMethodHints readonly property int length property int maximumLength signal accepted() function var copy() function var cut() function var paste(var data) function var deselect() function var insert(var position, var text) function var positionAt(var x, var position) function var positionToRectangle(var pos) function var select(var start, var end) function var selectAll() function var selectWord() function var isRightToLeft(var start, var end) function var moveCursorSelection(var position, var mode) function var redo() function var undo() function var remove(var start, var end) function var getText(var start, var end) property int mouseSelectionMode property string passwordCharacter property bool persistentSelection property string placeholderText property var popover property list primaryItem property bool readOnly property int renderType property list secondaryItem property bool selectByMouse readonly property string selectedText property color selectedTextColor property color selectionColor readonly property int selectionEnd readonly property int selectionStart property QValidator validator property int verticalAlignment Ubuntu.PerformanceMetrics.TextureFromImage 1.0 0.1 UPMTextureFromImage: Item property QImage image Ubuntu.Components.ThemeSettings 1.3 UCTheme: QtObject property string name property QtObject palette readonly property ThemeSettings parentTheme Ubuntu.Components.ListItems.ThinDivider 1.0 0.1: Rectangle Ubuntu.Components.ListItems.ThinDivider 1.3: Rectangle Ubuntu.Components.Toolbar 0.1: Panel property Item tools Ubuntu.Components.Toolbar 1.3: StyledItem readonly property ActionBar leadingActionBar readonly property ActionBar trailingActionBar Ubuntu.Components.ToolbarButton 1.0 0.1: StyledItem property Action action property string iconName property url iconSource signal triggered(var value) function trigger(var value) function trigger() property string text Ubuntu.Components.ToolbarButton 1.3: StyledItem property Action action property string iconName property url iconSource signal triggered(var value) function trigger(var value) function trigger() property string text Ubuntu.Components.ToolbarItems 1.0 0.1: Item property Item back default property list contents property bool locked property bool opened property Item pageStack Ubuntu.Components.ToolbarItems 1.3: Item property Item back default property list contents property bool locked property bool opened property Item pageStack Ubuntu.Components.Styles.ToolbarStyle 1.3: Item property Component defaultDelegate UCActionContextAttached: QtObject Ubuntu.Components.UCApplication 1.0 0.1: QtObject property string applicationName property QtObject inputMethod Ubuntu.Components.UCFontUtils 1.0 0.1: QtObject function double sizeToPixels(string size) function double modularScale(string size) UCListItemDivider: Item property color colorFrom property color colorTo UCListItemExpansion: QtObject property bool expanded property double height UCMargins: QtObject property double all property double bottom property double left property double right property double top UCStateSaverAttached: QtObject property bool enabled property string properties Ubuntu.Components.UCUnits 1.0 0.1: QtObject property float gridUnit function float dp(float value) function float gu(float value) ULLayoutsAttached: QtObject property string item UPMGraphModel: QtObject readonly property int currentValue readonly property QImage image property int samples readonly property int shift Ubuntu.Components.Ubuntu 1.2: QtObject singleton Ubuntu.Components.Ubuntu 1.3: Ubuntu singleton function ushort version(uchar major, uchar minor) readonly property ushort toolkitVersion readonly property ushort toolkitVersionMajor readonly property ushort toolkitVersionMinor Ubuntu.Components.Ubuntu.CaptionsStyle: Enum SummaryCaptionStyle TitleCaptionStyle Ubuntu.Components.UbuntuAnimation 1.0 0.1: QtObject singleton readonly property int BriskDuration readonly property int FastDuration readonly property int SleepyDuration readonly property int SlowDuration readonly property int SnapDuration readonly property QEasingCurve StandardEasing readonly property QEasingCurve StandardEasingReverse Ubuntu.Components.UbuntuColors 1.0 0.1: QtObject singleton readonly property color coolGrey readonly property color darkAubergine property Gradient greyGradient readonly property color lightAubergine readonly property color midAubergine readonly property color orange property Gradient orangeGradient readonly property color warmGrey Ubuntu.Components.UbuntuColors 1.1: QtObject singleton readonly property color blue readonly property color coolGrey readonly property color darkAubergine readonly property color darkGrey readonly property color green property Gradient greyGradient readonly property color lightAubergine readonly property color lightGrey readonly property color midAubergine readonly property color orange property Gradient orangeGradient readonly property color purple readonly property color red readonly property color warmGrey Ubuntu.Components.UbuntuColors 1.3: QtObject singleton readonly property color ash readonly property color blue readonly property color coolGrey readonly property color darkAubergine readonly property color darkGrey readonly property color graphite readonly property color green property Gradient greyGradient readonly property color inkstone readonly property color jet readonly property color lightAubergine readonly property color lightGrey readonly property color midAubergine readonly property color orange property Gradient orangeGradient readonly property color porcelain readonly property color purple readonly property color red readonly property color silk readonly property color slate readonly property color warmGrey Ubuntu.Components.UbuntuListView 1.0 0.1: ListView property int expandedIndex Ubuntu.Components.UbuntuListView 1.1 UbuntuListView11: UbuntuListView readonly property PullToRefresh pullToRefresh Ubuntu.Components.UbuntuListView 1.3: ListView property int expandedIndex readonly property PullToRefresh pullToRefresh Ubuntu.Components.UbuntuNumberAnimation 1.0 0.1: PropertyAnimation Ubuntu.Components.UbuntuNumberAnimation 1.3: PropertyAnimation Ubuntu.Components.UbuntuShape 1.3 1.2 1.0 0.1 Shape 1.0 0.1 UCUbuntuShape: Item property Aspect aspect 1.3 property color backgroundColor 1.3 property BackgroundMode backgroundMode 1.3 property string borderSource property color color property color gradientColor property HAlignment horizontalAlignment property var image property string radius property double relativeRadius 1.3 property color secondaryBackgroundColor 1.3 property var source 1.3 property FillMode sourceFillMode 1.3 property HAlignment sourceHorizontalAlignment 1.3 property WrapMode sourceHorizontalWrapMode 1.3 property double sourceOpacity 1.3 property vector2d sourceScale 1.3 property vector2d sourceTranslation 1.3 property VAlignment sourceVerticalAlignment 1.3 property WrapMode sourceVerticalWrapMode 1.3 property bool stretched property VAlignment verticalAlignment Ubuntu.Components.UbuntuShape.Aspect: Enum DropShadow Flat Inset Ubuntu.Components.UbuntuShape.BackgroundMode: Enum SolidColor VerticalGradient Ubuntu.Components.UbuntuShape.FillMode: Enum Pad PreserveAspectCrop PreserveAspectFit Stretch Ubuntu.Components.UbuntuShape.HAlignment: Enum AlignHCenter AlignLeft AlignRight Ubuntu.Components.UbuntuShape.VAlignment: Enum AlignBottom AlignTop AlignVCenter Ubuntu.Components.UbuntuShape.WrapMode: Enum Repeat Transparent Ubuntu.Components.UbuntuShapeOverlay 1.2 UCUbuntuShapeOverlay: UbuntuShape property color overlayColor property QRectF overlayRect Ubuntu.Test.UbuntuTestCase 1.0 0.1: TestCase function var findChild(var obj, var objectName) function var findInvisibleChild(var obj, var objectName) function var findChildWithProperty(var item, var property, var value) function var centerOf(var item) function var mouseMoveSlowly(var item, var x, var y, var dx, var dy, var steps, var stepdelay, var buttons) function var flick(var item, var x, var y, var dx, var dy, var pressTimeout, var steps, var button, var modifiers, var delay) function var mouseLongPress(var item, var x, var y, var button, var modifiers, var delay) function var tryCompareFunction(var func, var expectedResult, var timeout) function var typeString(var string) function var warningFormat(var line, var column, var message) function var waitForHeaderAnimation(var mainView) readonly property QuickTestUtil testUtil Ubuntu.Test.UbuntuTestCase 1.3 UbuntuTestCase13: TestCase function var findChild(var obj, var objectName) function var findInvisibleChild(var obj, var objectName) function var findChildWithProperty(var item, var property, var value) function var centerOf(var item) function var mouseMoveSlowly(var item, var x, var y, var dx, var dy, var steps, var stepdelay, var buttons) function var flick(var item, var x, var y, var dx, var dy, var pressTimeout, var steps, var button, var modifiers, var delay) function var mouseLongPress(var item, var x, var y, var button, var modifiers, var delay) function var tryCompareFunction(var func, var expectedResult, var timeout) function var typeString(var string) function var warningFormat(var line, var column, var message) function var waitForHeaderAnimation(var mainView) readonly property QuickTestUtil testUtil Ubuntu.Components.UriHandler 1.0 0.1: QtObject singleton signal opened(QStringList uris) Ubuntu.Components.ListItems.ValueSelector 1.0 0.1: Empty property bool expanded property string fallbackIconName property url fallbackIconSource property var icon property bool iconFrame property int selectedIndex property var values Ubuntu.Components.ListItems.ValueSelector 1.3: Empty property bool expanded property string fallbackIconName property url fallbackIconSource property var icon property bool iconFrame property int selectedIndex property var values Ubuntu.Components.ViewItems 1.2: QtObject property bool dragMode property list expandedIndices property int expansionFlags signal selectedIndicesChanged(list indices) signal dragUpdated(ListItemDrag event) signal expandedIndicesChanged(list indices) property bool selectMode property list selectedIndices Ubuntu.Components.ViewItems.ExpansionFlag: Enum CollapseOnOutsidePress Exclusive UnlockExpanded Ubuntu.Components.i18n 1.0 0.1: QtObject property string domain property string language function bindtextdomain(string domain_name, string dir_name) function string tr(string text) function string tr(string singular, string plural, int n) function string dtr(string domain, string text) function string dtr(string domain, string singular, string plural, int n) function string ctr(string context, string text) function string dctr(string domain, string context, string text) function string tag(string text) function string tag(string context, string text) function string relativeDateTime(QDateTime datetime) ./examples/0000755000015600001650000000000012700370716012716 5ustar jenkinsjenkins./examples/calculator/0000755000015600001650000000000012700370716015047 5ustar jenkinsjenkins./examples/calculator/manifest.json.in0000644000015600001650000000067112700370714020157 0ustar jenkinsjenkins{ "name": "calculator.bzoltan", "description": "Example application of the Ubuntu UI Toolkit - Calculator", "architecture": "@CLICK_ARCH@", "title": "Calculator", "hooks": { "calculator": { "apparmor": "calculator.apparmor", "desktop": "calculator.desktop" } }, "version": "0.1", "maintainer": "Zoltán Balogh ", "framework": "ubuntu-sdk-15.04" } ./examples/calculator/calculator.png0000644000015600001650000011407012700370714017707 0ustar jenkinsjenkinsPNG  IHDR\rfbKGD pHYs B(xtIME 22 IDATx[r\gQ(poGaD% @@UPŧZ'7-D($@a7̕k|{@#7bgf|H;j}I6WnFșufpgUޅmԼq;V<9N2s%c|oVMNZԫjHO^x'k#@d=SEkuMeϝON.ffykd뢴kas4O]COOO8y=ڂ5 87;N3ǬVa@r׉;S}f|.2gSה.p{ Ùxݷ;n8 Y*d}-3 `iɑ k|1<==MdyuzͅXiys'HIrSdYZYו7+33a‚3h b[??+̃RϽVevo;߱ӢKxsCZM}^=Bs扚'~FLxZîZr.n{tt4sԿe0V;z/'⺟|O= tl%3&fL*da epfFk$nc8אi<y][Vi3=3A}zAҧHICT_f)꿹 '/n"Zk/_t>67q R,s^SWY=b$trn=C+bJn Olfu+@@9YfT\|~ @)]m~ZvQEZ$D6a899|߹3Z/ɇ0nlNk0A5~>|Y/Ȏw.]3L0R!B̀e_=~sml6lr]0.q !ZJ{yɻawחˊ*LϲDW-,櫛'oi$)6#=l)憪NxhVb^_CX$G!W-{ `| A!{ٽk`*OGdpz '/!Lsst!g9lIZZ^oq[2զ@6v noowbl(>dޑx` {<>>].?Kd},NZN;Fzd.2eg͑vxr-i2gGnDv9X 3;07sn fBN)1?3e\k<=dy``krp$t Zw 6dEq||<{"TycD)f1#)6yF*,)eXO&K Fkw2e&%6= 7{ k[93׫& dpdG;@&.lH, 2:d7wGN0ٕOO߾}D1X_'Ed\U5$Kř۩(5HivR`HFwn$̉x2h3Ӳ>x:H>%OQq3'e uvlz#Xpt&+ 3j/ Ys呆46Q_Ѝ{ʛcaAq21"g=<{jT~l@iQcbZ[-Фbw؈=cDY#Ʈ%8\A<)v˃z?@%l]c; Tܥr5,emOOOxT#ia(!Ð$% 2uZ`Yf;/Ҝ`LR^ɸ~>EYӉaV0N',SRCyhTeo`|?E>ʞ1SdI"9DpBfD{ ˾>߉ѳE j05:b'wd)@bFN:{C?SbM4;Sk@Fe>3ʴZY=ѳ.I; ZKyM'oCl}l0"fE]i)wRlr X{7͘ L%S~OKt;9âyw炫/;HɛI46m." ix3%U'-S:%s*`--ߟѢ;Yt~߷oߔk;"gn"7! UP^=SpIҪ'ƃ$Y}N{(b)5d {G6N0z$.On. 2qdtN_C2 pl/V Hz)rA0iƠtb%g9Kw zցY,۷o-iܬ^-kM-e  pPYD̙; R_)l 31/o"I6DQl0.a ğaZW3g=1YS4]lZaמM]yMsIAI.6of,:~c )Zַ5aB i3do f'4߁Wdڻq`1i=DǔӨTgX:Y#<10FHPd5HU3"LyĜ hIصORȔѯh |\ J |Y0>2ґIyxdWF= &bZi v\zSuސr`$3{\- rS%Gx32@+Olo[SٱBϯ^9.qHKϠu5&<3c7>3%5fkemӍ&^ ޙ*(AV7vSΞ;ue35$)SL ʍAwxY} rcGb7[fZCF?-\͎SgNu HeY. &}9eWMqiQg&66uG[4i_\D VAXWfXj8 lHtʲײ Dm(#vqҴv5MDWYo=?I&nQP$&[֝d12[,K5*:;ǜXǷa']H&1SPVcMR:] gik%-ÃzxÞ45Us4x 1 s6!ā)2{ gYOg9Ip}|3ec:Y4qGgc Q5Й WҰ4#:ÉL)iXii[**ɕ E:c3-XʣAs3tĐz֯1$Ȏ =M4a%4o.%UwT -\*d^Vɝ΅i5hh,EΤi` 0.߯\uxSQ3yL(T}벎cLvf+C.Yw_t񝴕fډ)P{7dj|0q32Nf>;;ۓgΤC@j(5Q$,k$ӗO(-Yv]| q bN3 Dɨw\uB5C,خ3tryoYˈ[6ݑL)[XXpS"ND,<\5Y noS2KTtxv$ M$b3)&ɏ9tԥ'Ӎd_\\*PiϻѣqRrMdYǓ `Vޣ 7`0v#TIKL%ρ?;))5YQs^RYw!@G-+LMh an継Huj b͸`K&k\Miy3j z"9g k]ia(^gxZMڳ 0x6ּߌܵUsݷ6%FwAN?fW8LmQsQIM|wi[sy [ug;4=']vr]<?TKA5Ñtno-13=M`KRW=G\z5L6:1JZwGTnIq5xߛQm5ɆLچ%KO-IT=מD,ͩc3=hݼ) dO|;54GNfbO?AQpvO!H\Q5Jj2b4y*7 +V}gw?g|xAe΀a IfSw{v&wN<gV g] sp,fbcgcjv4oD*u6s">-X!|hsJ%#*Xiabr+c$u-WHAJ~ E`}ӿ,:ZkƎ#n35& N=#hь-Sb-OΛ>\ tKBQLJO2W@5aތsr&1%oE;Eb ff~ڦ dS~:>#rgdΡy[KgZaxxxU4"YfwTjn8#SL3g?S%2S!ulja&`Ğw^kX9r䕺Sesib&VJY/s:zsm*@s6HVđg2s(5%f$e~s5x X/jQd6N CF2Qn_><<'?-,0qxHgLdzsjN^KKXs2U,S֒'''{vڿg߆aXC~a%삌1-g*OG,zlLXf5̇y\-I3cJu,J/AnO`bƒ2RWM!\̬{n3>Ale1笜v;Js)C~՝/@KcZxR6Z^'ו hb,=;텵{||f3 7G@Aɫ?b "߾}e2~E?KCMm"r;NSueVs\iA IDAT.0s6e6"N\Y$5G jfXcFz*+͎+eptt4&YQeO]wM_sINYjw`um~N [v~?>45ˣ (?\W{خbff5N.=:' ۡ6sӟ G` L/-G oHkRd91&w4JF$ƐD:ܬv͸Al޷۷ɋ_{$,œ3Z1 m'7tGUf4HQ].wHB[z+vR~^gbےIfVԞAxd@~0s|}:ڙI+T#cXՍ9_4?VZl-sZuuu5md)Bϟ >eƕG-u4Ș54@LJ?|0f|_ |3`*54dZb)y&AXQ7Zq3}Ew&v;~a vh2#b&ƚu94_'F&!y"G8Ce`Hd9> :,(L>{\۷yΕ`dw 檳z,ӻ䆵֠vso}Q]~dVJ6蔬 6AD;ϜQ❢RlnLnKRe:'Y zxx| $KCz:^s,c2!*وgĜ[20 -a^AAm9qR' 6[*];'0C#`AyL/ijSZl}|Ky܍FۦΔRRkrQ̚F1kvҵ'K1;gn\puرMsH.|vUa4ac.tR s3Z3L:yMfyc9f]C2^v`CSux2Fud`eɔ٬˗7umnxf4%tlɚ ?"*Y)Xs{{;^|ԝ\pA''ی U,ӳkea[E$&x0;1(1Zi fi \9Ӻ+Lˌo6 rd_Y3eQc3DZj_ud&e<Wž[ym -Q|ظ/fnAڰ1\u2爽l?#E;ov#tGdkʅbd`JߓcQhoP|uRw)l6%N]d3龷mjCUğTjj,ؖdc͟%Zkw,I05F,hoD6"#64&Fԙ\b5$3n2#f.L`E76?cAgSƔXFFXw݌ Bl7مV2|5pXmFN L 3LzPv22x1@yemeL("5s|ب(f | 7 \Ox34._DiNUtr<S6j}6M 0OrvPL[Pl8==,.cp)v0Ça)I/{Vb&S)VF73M'Հֿ+eIXɸc9atw"rڲzxxnnnZ]7o~fP5Q P90;=*Pouyy91E;U+r/{::mhu\g`_Y\ w,O#[e}62~3}"|Ҷ^(Z2v:ez;\lO< K)H:Okkۑngr\;i$7b޿+_P֪4u[&۶/N?$`V'9(8לeɝш#K͙62a T^>>H3gvO~=kvI:y9gv߰R]__޽#`,NW2N03kSL\ ӭ[k957;:Wl>OFCdDdfvVv t&wƲ% G>oLŊdZ{g SLr*On]Vjc=`]'Q.~B#("Ш;"\<13(܋NI`0]86^QK:rԪr/MXbIS>HzH,"OKh  s)_Lˤ|/l.DRu'=AVt4pєG_kmKtyxxP46"kD 888kCfd?+>kf+ f$Xe6qIuߜO[ЩJBE~aXDNcӥ@(fp؉խEf sV[wtƒJ[VÛ7ox :,)O>Ǐў+|ݤʸ9aHq d9a"2\@;q=,[]3Z)$dke\{ 攲n'CEkT:_AwV{"R#[Rf Գ?::NNN&>Z۬U eo]% ܵ,;#zd+ڌ6P<cNމɖ 9Fv"efnnooK}iTyD;_fD9/b^w2V@I 5:sW;??...ԕƦ_t|/6n_jHyLn`^>*| f$ 7tIJ6 lE2JI jSg7s 4LXA|x||t0 wwwsB"VdϹtn˗/Yf /'fN۳ُseK d o!ܦ2#N6vq!fzd/jgvG8%b0 5锻L`~9?(k٭>,L[k7Mr9yf&pvv6DYl(Ꝧԑ뫺Mx?<<< F F~;L3߽h=eիWŅt*OɅsc*lCcgvc{0 v>|yn$?sOYW1 張n I)MƐ{7F1cǽQV j^~=yF_|_~~2( O{zznoo8_^^F{NlcuH2 ƿDߐYcJyBa:U圹bV+mH]///rK[-`K3}fgO(Lќ; =lJMޫ ͟R.Z 0xԦD+߼y3F,bJ/7I}X;4>wj18UfXG$js'Ӷ74K%٥f&0}:2wqϗ|g Q\'[*L:A }~z_6[!իW4''''#'~$ unB/;iAt_&A~ɹ,7،=l&ley ]/0ů.@YUrRҀCjXjy͡fEfiNJ$=܌svL߿WO<l:eoyo޼4yo߾J9wtt4C3 \C̠S RPlZ_޽{7ǣ 7իQV{s=ڵϕ[fuǏ6ʔ|*ln07FV,X |iͺ-44[:Yo>6) [1ly7YC8n]%U8 &pķ ܤ=N"䗿kIsn*i8%RirYli1׽M9țbBz7pѡ/OU@Uh`b:>݀|._mYj L[;|'Ǐ hIfj`{֬ę>??q32C;g샫QU>3gT~t:1H'pq ڈ9TuAVK,Xo2߿~;Ov;r d`R꺘te;-'''٤gb']&BF*L2ze_]cR*Ort]#~gց乁Y~Ӓ/Z?;{򶉜{룓fi|v)%fAwaMLkɐF|xx8}vsB'aLp* JC0*3# T|o 8YYY<}vB¯ ,]vѱHJz=Sme3*`|'Ӳdv4  4n;^f&S(aV_t%4F梳{߾}ڜd5U)4e#\l?g'p~NMVYך_a.ʺ7o;z"fjK ㇺ M,s1JC<;"EoucN߿tNynjceԦXb &TN.yLI2VZO:,sMxN˜jYFz3=S42heͬܐEK˗c""dA9:1*6Ң>}&Mc߹Tt3:muXO7\׭Cm,X|:<<7{|luRb1 5ߌ Jx;r&L)Q^nTA^ H۷ɜDRdI6h=7oLv_u #Aw\I~˔ߘH ]lNc|EA999P22\ ]Mکe՜;HQ,&VsCSi|qg???o޼Q"E%,%d0͘z>;D0x ~zO)Af;irxxx+\C~ f ͿgB1irJ% dVKV_k: +F'Ґͦ9*_lֲu}\NN~)$+Q]բ] S{/ IDAT鲊Ji0?YÕDXVU Y*LAb0)m=0K'} ,:muxx8<<< mʂMV쬦b6Ym.u/˃Zih"G'2`/ceˮDM[ʅk K,ܵ{IA_~Ke\=rg`H7TJwxf%YDf׀@;͢bUזEt%a96~nl5x||O|ٶ ?///CnE1 [JUM[יڳi=;Ɓ?::'یMg0^o߾8Yz/r&K 6b/l)FxZ͙N䟧kLxsDImLu|IDكgZ˙Vo XЪKQn`n PW>:e)3AA&.0~Lo T3R-%k)l$3WvRsc|I<];<1rꭥ\dߛl0e%bmXWU4<#sɬ IR6QނڑNr[|ڛ=Ɔ?qxDE'aleQ>N>?s;¨hVy@9p'?Fȅa&˥2i[f=cFeKCHY::WXG3Tl;k6mF;jGcCvª3&vp,HBcuS`ggҦ~O #PXMbjI4M%N.3?r':ns>A+d.IlX0V['lYIzӉ%J;iTm8&y*8CbK \h녓Er1c{{2`aiYFQGzʡ#̔ y6,+͵Z-ugy(TYfJTHME?20F@gfˍrRnĪjadmlpYK|5OXj$2|+͡s3먿[c'պf1ZL٘PsE9w2'qEiƩLR5 qV*>Kc([$F!CQV8|ymH3F^؏?ƀS_nLhm@*sBܠKUY.SKwʑ/, BaYbTYvb5Nf6?F*PTS߲ȇcщ5UR@SƑcLapʠE=. e@Ǐij1޿L,2,6m mL-RQH,Rps5 ˒dCL;MBJm[&@i i84mre6\9.YM]O6(ݢS+@)X> 1 %eܬکN7cVQypp0/{>SÇ{Az3[q3Pe)Ɩu6+O}r]HPnn(j7fGj`<]`ڜӗ-C,0hw!)O@{2 {;N8#f aeV~gHI<ǙqE0ʀܷojiRMM^JMf"фupg\YUkZgќ;+UMMi7SnLRX}p9+~{˒g9FeCnd=V%矉0-J 2d"Q`a Q&' `Zl*&QegY'i[`6jo'h&df}~; $V&w@"{>xs+dk&3lO5 * 0>݆q9cfΥB3ȧ;r Hh ,d\0H w"{%;fGEzQ-Z%"_DYl&$3 W" ;\<|]:β6YfL0ߛa",CX LZsv)xbHIIJSshdHŊ̒it|l1u|᝶(2xOfC0K BfGOrA)[Tnz5$TDU1x/ͬ8ds}_93=ˮ~"cL!*):Ev ВS"ּT v9Kn~NhL5q=ivґp2U6IjVle\H1uo93°nDxsQr'Y3*[F`5?kN% dW+ґ:9* }5YsKiƩ/_Q!Ɣp3FleKK@X)Ŷ`; ;v.)`L: hc #lɿ r-VP׽^'<0j33#-0;'d`fRJQnΔ]V|l9ʝe2 yŝ%iItlf<m0ԚOb^rCaf9=\t.H4lhc[^zGh1"X7#JezO4IwHP& ,,S\I|V:&{HNncZ0ي҉ֵA^S(ѻFRCDLENj<hhx|/BΔN.cd"Y#G$$ޘ X:ϿYu'?yd~ ro[cmsPobC[ιaXFiY{fH3 #,tZpv;/_())udo}e~~^z`NrT8yh$Y7Xpg0SWPeeQ GaLNНs馵Y7ͤ ՍNJ;ڂB<&]5F1ȧ1p56a $S(:%=X{QYߓɚ_}>oooϟ?OOOOׯGzfi7.e!ÍI^L]DtTfumrX$3 qq z>f3X>...=P7qe899tD~KB3يDYW\yZuƜ3N0f gvdXZ'/].+6cONca&'Β-D-s$$Sl0ue۰ˇԹ$fe"# ZPƺxLci]C& Xzz:G)Tٜ3xCuwzۦxfFAni3@%󱴾?q!fۀΘgE^})յً֮4ڴ:\Np6{f $dDҍ4dnڌ!s:m+ɓP_f\@cܐ_]kx899cɮ\HHp\[=6x%%?R;3|弅|T Yv&&r&rghZfb.ngq1]Tդ b43t^Mʸ-)mԲEfvQ6N,^z5ӦI!1%K#9z5ߏl6bɃ[iTw3!/+n8 K1gK6ͳ\tުSSš&~oN |x]d` 瞱rzzw;D krܼ|؛fL~6ׯ%[YWZ$@ `Yj8K-]CgXVIOuIm6gZkT TFz겏L#-1'ò43Wa&ȅeCW"Z=kG؎Y.vUgG!o 2,N2H/; ĩgƢf nzxr443ImNcG,\דuE 8KTm50؅@E;p]n+Tge }%ͷ,t/5dfg?^4bcaٔڸٛ7ϴfdMV *TeIOޣM[a#do`O[|xED<;!s(իIgNlڹyPC6ٙ2+􃃃QY@' y $QV672H*{DԫU6{=OEk1fr\N(2>zxxe7MZ=Lehٕ0Kw8%I*g#hY!˞H33Wf@F2j|2I6;63+ }%9܄ϸOԀ_&1%6ԃiKzec|!ӥ8[cIIEc {Jf % g0r"uFqjM*J .$X1:/y{̺?3٬My OOOz+X2Yۨ᤬#qxggg~-ѤsZbM`=GaY݃ONNu#tae![VWX9y8@IBB:慿yffB!|e\F5!eo0#z}}wJp@- ᒡFx >f}ɭg*Iw&ȓe^2T7 =7ij ,= sV24biXrӧ~`' Ht;INQ}#CgV $⨑yzKEחikݎ`uXr)el6cL\ A+˔,Hyfx/ F նʹfφ˼ i9䦫MQeGNY6;`*TTa Y]YP|q876\:&8S/([.˛Ouy.aْD*I+~gm@)KH7f’T:)2e8;;MffYZnX-(˅:ﯿKԄY W8|Vd弆:Z>ZhN 'Kߔ^ZLqɠ &Ud,e-ljMBf[mj:)8Nu}Mn|///X~=??^~=|a8???gin.ࣣ׺@D\*7YME:=]}v M'+8Z>%}Q>ݜi-OZ9 8쏲8;fHnUȠ3TƉfۄU/mnz#K9Rlr ɶ,e~:l6 }e{\qd]=F,yd@\nG<)UmY}SKob)ðySgN_^^N8L5e5NgT籎/NyyȋD۷{וdj5:a |'-Y///HEdG.pUv;ϯÍuU]gPA&LYgcaf/\dhiNBWΚ(Ai@Z$ \j5Aɹx2“a,.3C13@pww7<1)F!VlФSdڌov`a IDATۥ+W z||@Rɀk:Tۦ7:p,JLcݛF:Div`|ߴ3ay&#)Ȕ*'M`FЖ1ˀXE4 ^oZ ڵlϟޓrAeWRgvh7ԟ?>< h]e}eIj.Mcx/UfRrKe+Unl]|4\Dbu TevG2F-;3x؃@4ZE:oujeVONc$v^<<<Vhfࡅw D@@+h߇ϟ?OZKdL ~{eEYLDN 3/{8T3aIaї ]Rl#Vظ$;e3XPύW/bH#ЖʲnIr ߾}KU.o޼lI^uHH٭юSG.f2X,(ap>*>|Ƨ9>>>~8e ! MʍXrf|mGl3wu4Wa'$KEq0jf5k#+cVDkt.SIlyFx6,R Eӡ+3#nDt}RΔͦ3ȓ(s1OFJIrssf}v*`3r{nTL'T`܈U}d;͚tfI" <)5J#3EGԲι2EK:/BF4o}NpdI!LAMGHpRNIQ9f,iҹ&PV3˪5jih91e~f6UH|1dR땀)q.6,+6ugY3u1 J2]bj `ͷe#y_6, &nv >,N(Qfl6ϟG ؉Xm] ydt{KWA&($pu71==NNNRi9ʞ쎕G,|5eYu~Z\X/Ot: g4\o2xq. n^v#9_~~:qbgƲ0ώD(Wdñ0|^R $gw 8vׯu&π99%ׅ 2 O^2i8|3աP^K3˴?kXk10Ӌ9+L |Y ck*5b *>92v><|eGѐNrg+~5Qz4pi653Uv ^^^FY'kRi0qvejLzOFhK:  Wj`fK_KLa\߿bKAn^>r9VS Wwyy9q%&К(&gf>L9F)X۫F͚7 qDf5^?>>fŘ5s>OrE(l5'P#s11S22+e@(ɼ4ga1B4Y阍Yt%B׋M{ g'IJ_ɵyjכymb& 3 ׯ_WWW*)Znqlujn}OIa57Nml"2tn.aWȔ9MDbde烃͛7%9yH7J2x@){*, $e!  [.\$X"-$Cٮ)vY_xԋrsP@’\ؼyjLIT471|)K-^'ߺBsYs0j}vi5sO]3k5q%yzzsafʝMtI}\{ֶJMAw(;Q"VEZ6VꬁYi̺ȜA$w:jx*96E}³Y]B5˴3X$摘jS|lb.׌Zfkf¤|l2vؾ.EY*s*p(Kbl}-cF^xY[4c+]~t&S_;xXsWtrL_TeC<*9 ia?(0l4܏ScfPNgb $5qJU{,/<<07l\JG-A&qrsRp2=/"%CV >5Iu%txrNe4\p<92K;K;!c?cptg^ Ů]KIZӓ&BeF~t)=:rR= .}fMAϴ@̌LH&)"AƙFu8R+;V[%6_2 `LK~n׺Ln%y&[w*5|ʞ?>xQZuuuKf/_&~GGcfʌÇ{8a7u;h&yP$a&;8G2dFA:.0}IdFʗ=OF=G3bCIxzz'"(M\v:/Y a^Ç&|܈g.tbIY ePk,mMG2Ek6Aٜw?˗/;0L{MAHrCr2d/ $cb {d@i {=w[̍/+d{`ݎr\+:F ǐYǝu6$]J6Ǐ0:Ce9m R{5ޑN\#ƙ$W`iAŗP> AL;j͚2ìВ/%?4]!'ۗ8l!LgjCOfU;bKA mz?9 ZvrIAiL>5 #O:۽I.d/2ݵys =S.ԆXB)7OiN#6.:Lh ^Vnk {hRy8?? f1%Y#իWÇ4Oʶ );bv#0. ;I* #FletQ[T>'En>>>N5 mLF]0X7r|gq?;ʭe_:W$Cy{w٥eg6aZQ PXv7GUq+23z< n۴ K988" &%#AM:C dEplUe/6E8 *ģoۤ1$4$U"^m\;q0a65eLWd^W'x%F3ԕ*ĵ\A] zۭN+r3ʌ~qAuSlsg`}ݐ hq'~WIBFcNtmHC^ywwwÏ?S)&kxsx!THs2S+49djy?t`>3аq_u:ǖLN˿ t:KeHDf ξ|7l! \Fh>LsV<>>5+K8<0Qt͡YuF81߂3ZVnnmvkY 1fԵH<7\DnFќ_^^>-2 R7JmQRrSu}3&g͞2ImYm0ş Uh439\j7{nس=M Vd^$Pl;>UМNsnMׯ_OƇ d", &mD&s)"c4)b՘ E7kϟw2逢Ǩɇidƀu)TPYtusN62! z?13eJKIZ ^:M9:yrdFrf=gfckLS2jK'mA)h4b}}gKfhŪkOPǏfٓM[J&hB͍E cnf@%]l8??\a%PI6.p:05׵@3ck$~.Ft\j R PO|XD9#B'oB$t]o YkPT:v.O4vͅ#xrqцְ.sIEV材2T s Lֺź~goCF3wcrHm;|(3y]Ǭ2Q+Cm) 0&,~G/lXmV)ȗXݰlt22O#tXT&6n;BfI"~+$KZfIL˯(` 3IS:<朘XѓѸUuO2RPmVN|l&Y=(Rz-B7`d ?f ɓl!"Rc9(C aFw3✆O;;;1gXu(NKñQ6gB$kѿ2=;[w1u69ײM2\ş` =6" k/I!Tgg+p~v\JOķfExxx8hȺ8  W f\ &Z~Wħ: emm~&Ć~v:J30 ZZ*aofbLӸ12K Sٹ 2v ,~?UmOuasٚ!)c2 3"N|Nf>۴guMfTqWPM7Yzf֑֜aaY 7;l;`ka3eHSYBj4 =0I+m2]O95!x:;(3@rZ ??fĞ0_pּ4j4sUyh^u$*ZVn#1H:cƓmܤ gpYF 6 SYr-eڡjl_3Fu%2N6d_N2s(N`s\vu79q3w5uP.4*ggS8cI $'2-Ό؉VJ}dM޽i,̰ڦ:Xk7F,b59Otn|A|@Fdji[𬹈TzĹvzfxtt4MR9vJLI3SbBKa_ASmZs | rȇQ=''=Xa&uL"MkN[6qmXr&]$xh>@_6,ۭ@li1 `\E^yeM57'#v7(Pf[E5A-fbUN06$~OY~ܟ3|٥.^?5$E{vf-ɖ_]hUkӀIwnXX<=LtQE6Ն" zzzg I~ɔ&d$zaٳK{1/9ڜfRJ୛ `-ۆls %@f IDATmN%6l)e+K1ד13RN$sa:>ݔر~c\N-8,OL'9^t'miϳzM eչ"`;.0jj\_x*5p3kN;mf)MJlUOO )gw>ON˺7a^ا l8Q$?jo;lN 20&nsS 6hN`B|<2;5; (g4LY2$Sp >U$fAYyΥM,wd)'OfOS&֞w :ПWf>Rn]zߟ"d2PU- Dl02rTv¢?ZNOO=)9mz.c9&trSZﷲf3AM=F,~qJeG#<,ĉ=lA2SH}dE'j")ݜiAğ_3k\5&:FN}߿C2J930Kr*̻dFr"2Ѱm<={jL@B^4B0}8(_A|D9U/~5QǕ2tign>,]n+2}fH~Y,ިqj keY}l{"4_ffd'ZKB3.#='R)tXOiX !,M(F$蜙 L^Ոm6arD 'iFEtac}%w#%Jdm?3` 2U:l'7Fz tS30Tښz?3ELh '$GY!XjJ;M[ AJt: /IV&ׂ@㞩kr㪲0Ze0vpP&A0\x!268Uk_"$$Uus?ߏƦRRDvs$jj5xDdY'Qv٬%Ƹ]̬g0-n Tq2Si 04$L LP&ΡD:-(/7jD~'i]IE҉(K2d,'v8~oue}[t:)h΋P'`KnݓO+@lXE#9g Dd&@ 0f^8DTe$d ;Sb dY N W: 5dn*l +P͔2Ԫ![b&Qw67%ujn)-]qy]Jjx 7|8ZE% U,I^kn+ve9чkl$*${3V bITu#gցFFqd4oYJ؀hѓ1I9 8UVA-A&gfU>&kbӌ]2NeUq JK)K85u*g&ٽ5|Տyׯ_o|qg}駩?IY׿YYYf//{eYp%mYŋҴpаK}>q*i,`R)2qM˜k_o5j󗆟59+^ ~AV\YTI~`Q:WW ǴS LT)K_u]Wlӓy]NF{kINo7vib3a)\B|dflj *=J{hF8FONze'-*=0 >d]O3Ȓ.otsIߞ׸u&Cxx>_֒/j~zJ[5<%).3lzL}ݧ؆zFQ}6c9i1f"N?aSrI&&ӣ1?H~ g.T\m6'w\|"(fJt} rފ2ܘhM2rym @K~j𹽽M~5[ &AN4&^>c/rS b8CØ'bĵyմp]6uO][-Ӈj"j4~Oc\ejٳ=5}SR`[]\c'/n?ܐ4g (F ~g)'cB,܎W5 Ge`%#p5Lr  !R]3aH vo~!=!szΘFxE^q~l\`8RΈUOܙF\ͱ+ @#)OYrUGZ̜GngWWWyj{Vo* SQS4&CFsMxl-3MbuS% ks>̅I/0Im2^/7?.Mqgyr^6Ƥ줯Ϲ;}ςbxcB<0 sOeIʠT'&Ws8~0v<̜Nr "w޷Rwۇ,ũ p+%TS̍^?9Vcmӕ^:(wy \Xw{3,s7ULde_&D0ks jЫ<իW"f\⏳SI}e/Mz-zS=+Tc1HoV.X9.ܼTӘQmLTԨt5m5$ #ϵdOP&aI'3wL҆d%7G˩F0Q)r}V)Ě{lTR-~id f???М :Xh).:+eǧG9aqS`Û:!]L'I.&$iaq}S`AIf8Q^˥[ABߓRd[J8'0T{Y+;xh^:T&j̢Rb]odt LCcplZ&}UY'4#k0ɋO)bŷ}1\KSKh)K) L-еH-feT E oj@QlArsOY$eVE6jg61ޖbĔʟ}rf-)p\x'/jB1?͌_@Uq0'`1-TNps鸞B:Z' `SnUkO_Y)2tIoĸ]V7Ϋ>S|wwww#ĻMe}~~ul5,Zfa#)LlJLoP_egi7fό0ՠMMJ`BUV L?Vˀ_LA[3TӢ+44XzrD}/sP(?{/^ݛ7oՍz :}ﴼO^; IENDB`./examples/calculator/calculator.desktop0000644000015600001650000000035012700370714020567 0ustar jenkinsjenkins[Desktop Entry] Name=Calculator Comment=My project description Exec=qmlscene $@ calculator.qml Terminal=false Type=Application X-Ubuntu-Touch=true X-Ubuntu-Gettext-Domain=com.ubuntu.developer.bzoltan.calculator Icon=calculator.png ./examples/calculator/components/0000755000015600001650000000000012700370701017226 5ustar jenkinsjenkins./examples/calculator/components/DefaultLayout.qml0000644000015600001650000000777612700370701022544 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ import QtQuick 2.0 import Ubuntu.Components 1.3 import Ubuntu.Layouts 1.0 Item { id: buttonGrid Layouts.item: "buttons" property real spacing: units.gu(0.5) property real buttonHeight: (buttonGrid.height - 5 * buttonGrid.spacing) / 6 property real buttonWidth: (buttonGrid.width - 3 * buttonGrid.spacing) / 4 property var operations property var __model: [ {"label": "mc", "color": "darkgray", "width" : buttonWidth, "height": buttonHeight}, {"label": "m+", "color": "darkgray", "width" : buttonWidth, "height": buttonHeight}, {"label": "m-", "color": "darkgray", "width" : buttonWidth, "height": buttonHeight}, {"label": "mr", "color": "darkgray", "width" : buttonWidth, "height": buttonHeight}, {"label": "c", "color": "brown", "width" : buttonWidth, "height": buttonHeight}, {"label": "+/-", "color": "brown", "width" : buttonWidth, "height": buttonHeight}, {"label": "/", "color": "brown", "width" : buttonWidth, "height": buttonHeight}, {"label": "*", "color": "brown", "width" : buttonWidth, "height": buttonHeight}, {"label": "7", "color": "#5f5f5f", "width" : buttonWidth, "height": buttonHeight}, {"label": "8", "color": "#5f5f5f", "width" : buttonWidth, "height": buttonHeight}, {"label": "9", "color": "#5f5f5f", "width" : buttonWidth, "height": buttonHeight}, {"label": "-", "color": "brown", "width" : buttonWidth, "height": buttonHeight}, {"label": "4", "color": "#5f5f5f", "width" : buttonWidth, "height": buttonHeight}, {"label": "5", "color": "#5f5f5f", "width" : buttonWidth, "height": buttonHeight}, {"label": "6", "color": "#5f5f5f", "width" : buttonWidth, "height": buttonHeight}, {"label": "+", "color": "brown", "width" : buttonWidth, "height": buttonHeight}, {"label": "1", "color": "#5f5f5f", "width" : buttonWidth, "height": buttonHeight}, {"label": "2", "color": "#5f5f5f", "width" : buttonWidth, "height": buttonHeight}, {"label": "3", "color": "#5f5f5f", "width" : buttonWidth, "height": buttonHeight}, {"label": "=", "color": "orange", "width" : buttonWidth, "height": buttonHeight * 2 + spacing}, ] property var __lastRow: [ {"label": "0", "color": "#5f5f5f", "width" : 2 * buttonWidth + spacing, "height": buttonHeight}, {"label": ".", "color": "#5f5f5f", "width" : buttonWidth, "height": buttonHeight}, ] Grid { id: grid spacing: buttonGrid.spacing anchors.fill: parent // memory Repeater { model: __model delegate: Button { text: modelData.label color: modelData.color width: modelData.width height: modelData.height onClicked: operations.execute(modelData.label) } } } Row { anchors{ top: grid.bottom topMargin: -buttonHeight } spacing: buttonGrid.spacing // memory Repeater { model: __lastRow delegate: Button { text: modelData.label color: modelData.color width: modelData.width height: modelData.height onClicked: operations.execute(modelData.label) } } } } ./examples/calculator/components/Functions.qml0000644000015600001650000000252012700370701021710 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ import QtQuick 2.0 import Ubuntu.Components 1.3 import Ubuntu.Layouts 1.0 Grid { id: buttonGrid columns: 4 rows: 7 spacing: units.gu(1) property var operations Repeater { model: [ "%", "1/x", "x!", "x^2", "x^3", "x^y", "2^x", "sqrt", "ln", "e^x", "sin()", "cos()", "tan()", "cot()", "sec()", "csc()", ] delegate: Button { text: modelData width: (buttonGrid.width - 3 * buttonGrid.spacing) / 4 height: (buttonGrid.height - 3 * buttonGrid.spacing) / 4 onClicked: operations.execute(modelData) } } } ./examples/calculator/components/calculator.js0000644000015600001650000001511112700370701021714 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ .pragma library function Calculator(textInput, memoryIndicator) { var operationStage = 0; // 0-lvalue, 1-rvalue var lvalue = 0.0; var rvalue = 0.0; var lastOperation = -1; var memory = 0.0; var clearInputNext = true; textInput.text = lvalue; memoryIndicator.visible = false; function setValue(value) { if (operationStage === 0) { lvalue = parseFloat(value); return lvalue; } else if (operationStage === 1) { rvalue = parseFloat(value); return rvalue; } } function value() { return (operationStage === 0) ? lvalue : rvalue; } function clear() { operationStage = 1; lvalue = rvalue = 0; lastOperation = -1; textInput.text = 0.0; } function memClear() { memory = 0; memoryIndicator.visible = false; } function memRecall() { if (memory <= 0) return; textInput.text = setValue(memory); } function memAdd() { memory += value(); textInput.text = setValue(memory); memoryIndicator.visible = true; } function memDec() { memory -= value(); textInput.text = setValue(memory); memoryIndicator.visible = true; } // arythmetic functions function add() { lvalue += rvalue; } function dec() { lvalue -= rvalue; } function mul() { lvalue *= rvalue; } function div() { lvalue /= rvalue; } function sign() { textInput.text = setValue(-value()); } function invert() { textInput.text = setValue(1/value()); } function percent() { textInput.text = setValue(value() / 100); } function sqr() { textInput.text = setValue(Math.pow(value(), 2)); } function cube() { textInput.text = setValue(Math.pow(value(), 3)); } function power() { lvalue = Math.pow(lvalue, rvalue); } function powerOf2() { textInput.text = setValue(Math.pow(2, value())); } function factorial() { var rval = 1; for (var i = 2; i <= value(); i++) { rval *= i; } textInput.text = setValue(rval); } function sqrt() { textInput.text = setValue(Math.sqrt(value())); } function ln() { textInput.text = setValue(Math.log(value())); } function exp() { textInput.text = setValue(Math.exp(value())); } function sin() { textInput.text = setValue(Math.sin(value())); } function cos() { textInput.text = setValue(Math.cos(value())); } function tan() { textInput.text = setValue(Math.tan(value())); } function cot() { textInput.text = setValue(1/Math.tan(value())); } function sec() { textInput.text = setValue(1/Math.cos(value())); } function csc() { textInput.text = setValue(1/Math.sin(value())); } var operations = [ {code: "+", operationFunc: add}, {code: "-", operationFunc: dec}, {code: "*", operationFunc: mul}, {code: "/", operationFunc: div}, {code: "+/-", controlFunc: sign}, {code: "c", controlFunc: clear}, {code: "mc", controlFunc: memClear}, {code: "mr", controlFunc: memRecall}, {code: "m+", controlFunc: memAdd}, {code: "m-", controlFunc: memDec}, {code: "%", controlFunc: percent}, {code: "1/x", controlFunc: invert}, {code: "x!", controlFunc: factorial}, {code: "x^2", controlFunc: sqr}, {code: "x^3", controlFunc: cube}, {code: "x^y", operationFunc: power}, {code: "2^x", controlFunc: powerOf2}, {code: "sqrt", controlFunc: sqrt}, {code: "ln", controlFunc: ln}, {code: "e^x", controlFunc: exp}, {code: "sin()", controlFunc: sin}, {code: "cos()", controlFunc: cos}, {code: "tan()", controlFunc: tan}, {code: "cot()", controlFunc: cot}, {code: "sec()", controlFunc: sec}, {code: "csc()", controlFunc: csc}, ]; this.execute = function (operation) { if (operation === "=") { if (lastOperation > -1) { operations[lastOperation].operationFunc(); textInput.text = lvalue; } operationStage = 0; clearInputNext = true; } else { for (var i = 0; i < operations.length; i++) { if (operations[i].code === operation) { if (operations[i].operationFunc) { clearInputNext = true; if (operations[i].singleOp) { operations[i].operationFunc(); return; } lastOperation = i; if (operationStage === 0) { operationStage = 1; } else if (operationStage === 1) { // evaluate and continue receiving rvalue operations[i].operationFunc(lvalue, rvalue); textInput.text = lvalue; } } else if (operations[i].controlFunc) { operations[i].controlFunc(); clearInputNext = true; } return; } } // if no opeartion was performed, add operation to input if (clearInputNext) { clearInputNext = false; textInput.text = ""; } textInput.text = setValue(textInput.text + operation); } } } ./examples/calculator/components/components.pro0000644000015600001650000000046612700370701022143 0ustar jenkinsjenkinsTEMPLATE = aux filetypes = qml png svg js qmltheme jpg qmlproject desktop wav OTHER_FILES = "" for(filetype, filetypes) { OTHER_FILES += *.$$filetype } other_files.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/calculator/components other_files.files = $$OTHER_FILES INSTALLS += other_files ./examples/calculator/calculator.pro0000644000015600001650000000243512700370714017724 0ustar jenkinsjenkinsTEMPLATE = subdirs #load Ubuntu specific features load(ubuntu-click) # specify the manifest file, this file is required for click # packaging and for the IDE to create runconfigurations UBUNTU_MANIFEST_FILE=manifest.json.in TARGET = calculator SUBDIRS += components QML_FILES += $$files(*.qml,true) \ $$files(*.js,true) \ components CONF_FILES += $${TARGET}.apparmor \ $${TARGET}.png \ $${TARGET}.wav OTHER_FILES += $${CONF_FILES} \ $${QML_FILES} \ $${TARGET}.desktop \ `` #specify where the qml/js files are installed to qml_files.path = / qml_files.files += $${QML_FILES} #specify where the config files are installed to config_files.path = / config_files.files += $${CONF_FILES} #install the desktop file, a translated version is #automatically created in the build directory desktop_file.path = / desktop_file.files = $${TARGET}.desktop desktop_file.CONFIG += no_check_exist exists($$PWD/../examples.pro) { desktop_file.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/$${TARGET} config_files.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/$${TARGET} qml_files.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/$${TARGET} } INSTALLS+=config_files qml_files desktop_file ./examples/calculator/calculator.apparmor0000644000015600001650000000007712700370714020745 0ustar jenkinsjenkins{ "policy_groups": [ ], "policy_version": 1.3 } ./examples/calculator/calculator.qml0000644000015600001650000001037712700370701017715 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Zsombor Egri */ import QtQuick 2.0 import Ubuntu.Components 1.3 import Ubuntu.Layouts 1.0 import "components" import "components/calculator.js" as Calculator /*! \brief MainView with a Label and Button elements. */ MainView { id: mainView // objectName for functional testing purposes (autopilot-qt5) objectName: "mainView" // Note! applicationName needs to match the .desktop filename applicationName: "calculator" /* This property enables the application to change orientation when the device is rotated. The default is false. */ automaticOrientation: true width: units.gu(40) height: units.gu(71) property var calculator: new Calculator.Calculator(numericInput, memoryIndicator); // default portrait layout Page { id: page title: i18n.tr("Calculator") anchors.fill: parent Flickable { anchors.fill: parent contentWidth: column.width contentHeight: column.height Column { id: column width: page.width height: childrenRect.height spacing: units.gu(0.5) TextField { id: numericInput anchors { left: parent.left right: parent.right } readOnly: true font.pixelSize: FontUtils.sizeToPixels("x-large") font.bold: true horizontalAlignment: Text.AlignRight height: layout.currentLayout === "landscape" ? units.gu(5) : units.gu(7) primaryItem: Label { id: memoryIndicator width: units.gu(3) height: parent.height text: "M" textSize: Label.Large font.bold: true } } Layouts { id: layout anchors { left: parent.left right: parent.right } height: page.height - numericInput.height - mainView.header.height layouts: [ ConditionalLayout { name: "landscape" when: mainView.width > mainView.height Item { anchors.fill: parent Functions { operations: calculator anchors.fill: parent anchors.rightMargin: parent.width / 2 + units.gu(0.25) spacing: units.gu(0.4) } ItemLayout { item: "buttons" anchors.fill: parent anchors.leftMargin: parent.width / 2 + units.gu(0.25) } } } ] DefaultLayout { anchors.fill: parent anchors.margins: units.gu(0.5) operations: calculator spacing: (layout.currentLayout === "landscape") ? units.gu(0.4) : units.gu(2) } } } } } } ./examples/unit-converter/0000755000015600001650000000000012700370716015702 5ustar jenkinsjenkins./examples/unit-converter/unit-converter.apparmor0000644000015600001650000000007712700370714022433 0ustar jenkinsjenkins{ "policy_groups": [ ], "policy_version": 1.3 } ./examples/unit-converter/manifest.json.in0000644000015600001650000000072112700370714021006 0ustar jenkinsjenkins{ "name": "unit-converter.bzoltan", "description": "Example application of the Ubuntu UI Toolkit - Unit converter", "architecture": "@CLICK_ARCH@", "title": "Unit Converter", "hooks": { "unit-converter": { "apparmor": "unit-converter.apparmor", "desktop": "unit-converter.desktop" } }, "version": "0.1", "maintainer": "Zoltán Balogh ", "framework": "ubuntu-sdk-15.04" } ./examples/unit-converter/unit-converter.qml0000644000015600001650000001521512700370714021403 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import "conversion.js" as Converter /*! \brief Example unit converter application. The application demonstrates the usage of - i18n - units - Label - Loader - Page - PageHeader - Action - TextField and - Button components The application converts length and weight units between several metrics. Related units are grouped in the same page and conversion happens when pressing Enter/Return after entering a number in one of the input fields (i.e. accepting the entered text), or by pressing the "Convert" button. The navigation between converter pages is provided by the PageHeader component. */ MainView { id: root // objectName for functional testing purposes (autopilot-qt5) objectName: "mainView" // Note! applicationName needs to match the .desktop filename applicationName: "unit-converter" /* This property enables the application to change orientation when the device is rotated. The default is false. */ automaticOrientation: true width: units.gu(100) height: units.gu(75) property real margins: units.gu(2) property real labelWidth: units.gu(12) // Length conversion model; the unit is Mile property var lengthModel: [ {"unit": "Inch", "rate": 63360.0}, {"unit": "Meter", "rate": 1609.344}, {"unit": "Miles", "rate": 1.0}, {"unit": "Feets", "rate": 5280.0}, {"unit": "Yards", "rate": 1760.0}, {"unit": "Kilometers", "rate": 1.609344}, ] // Weight conversion model; the base unit is Pound property var weightModel: [ {"unit": "Pounds", "rate": 1.0}, {"unit": "Kilograms", "rate": 0.45359237}, {"unit": "Ounces", "rate": 16}, {"unit": "Stones", "rate": 0.0714285714}, {"unit": "US Tons", "rate": 0.0005}, {"unit": "UK Tons", "rate": 0.000446428571}, ] // converter page template Component { id: pageContent Page { header: PageHeader { title: "Ubuntu header" leadingActionBar.actions: [ Action { text: "Lengths" onTriggered: { if (status === Loader.Ready && item) { item.parent = parent; item.model = lengthModel; header.title="Lengths" } } }, Action { text: "Weights" onTriggered: { if (status === Loader.Ready && item) { item.parent = parent; item.model = weightModel; header.title="Weights" } } } ] trailingActionBar.actions: [ Action { objectName: "action" iconName: "clear" text: i18n.tr("Clear") onTriggered: Converter.clear(converter) } ] } // expose Repeater's model for reusability, so we can set it from // outside, when we build the tabs property alias model: converter.model // remove the input panel when pressed outside of any text input MouseArea { anchors.fill: parent onPressed: Qt.inputMethod.hide(); } Flickable { id: flickable anchors { fill: parent margins: root.margins } flickableDirection: Flickable.VerticalFlick contentWidth: pageLayout.width contentHeight: pageLayout.height Column { id: pageLayout width: flickable.width height: childrenRect.height spacing: units.gu(1.2) // show as many lines as many units we have in the model // it is assumed that the model has "unit" and "rate" roles Repeater { id: converter Row { spacing: units.gu(1) Label { text: i18n.tr(modelData.unit) textSize: Label.Large width: root.labelWidth height: input.height verticalAlignment: Text.AlignVCenter } // input field performing conversion TextField { id: input //errorHighlight: false validator: DoubleValidator {notation: DoubleValidator.StandardNotation} width: pageLayout.width - root.labelWidth - spacing text: "0.0" font.pixelSize: FontUtils.sizeToPixels("large") height: units.gu(4) // on-the-fly conversion onTextChanged: if (activeFocus) Converter.convert(input, converter, index); else cursorPosition = 0 onAccepted: Qt.inputMethod.hide() } } } } } } } Loader { sourceComponent: pageContent onStatusChanged: { if (status === Loader.Ready && item) { item.parent = parent; item.model = lengthModel; item.header.title="Lengths" } } } } ./examples/unit-converter/icon_clear@20.png0000644000015600001650000000237212700370701020746 0ustar jenkinsjenkinsPNG  IHDR((mtEXtSoftwareAdobe ImageReadyqe<$iTXtXML:com.adobe.xmp 3lIDATxMKAEDADy Zgx3B$hzfaqyfuv^PH)mni-#0:Y/%STyS*!H'w{Xn".rቻ}j.te\>f>"=&7Yx(xhXA߄!úAJRpU+ZɥeXU;kxg6 yX@RpLpr PUۧl quKd"S2-Rf"P+*ր"Ӛp4 ې 2 |{@#7bgf|H;j}I6WnFșufpgUޅmԼq;V<9N2s%c|oVMNZԫjHO^x'k#@d=SEkuMeϝON.ffykd뢴kas4O]COOO8y=ڂ5 87;N3ǬVa@r׉;S}f|.2gSה.p{ Ùxݷ;n8 Y*d}-3 `iɑ k|1<==MdyuzͅXiys'HIrSdYZYו7+33a‚3h b[??+̃RϽVevo;߱ӢKxsCZM}^=Bs扚'~FLxZîZr.n{tt4sԿe0V;z/'⺟|O= tl%3&fL*da epfFk$nc8אi<y][Vi3=3A}zAҧHICT_f)꿹 '/n"Zk/_t>67q R,s^SWY=b$trn=C+bJn Olfu+@@9YfT\|~ @)]m~ZvQEZ$D6a899|߹3Z/ɇ0nlNk0A5~>|Y/Ȏw.]3L0R!B̀e_=~sml6lr]0.q !ZJ{yɻawחˊ*LϲDW-,櫛'oi$)6#=l)憪NxhVb^_CX$G!W-{ `| A!{ٽk`*OGdpz '/!Lsst!g9lIZZ^oq[2զ@6v noowbl(>dޑx` {<>>].?Kd},NZN;Fzd.2eg͑vxr-i2gGnDv9X 3;07sn fBN)1?3e\k<=dy``krp$t Zw 6dEq||<{"TycD)f1#)6yF*,)eXO&K Fkw2e&%6= 7{ k[93׫& dpdG;@&.lH, 2:d7wGN0ٕOO߾}D1X_'Ed\U5$Kř۩(5HivR`HFwn$̉x2h3Ӳ>x:H>%OQq3'e uvlz#Xpt&+ 3j/ Ys呆46Q_Ѝ{ʛcaAq21"g=<{jT~l@iQcbZ[-Фbw؈=cDY#Ʈ%8\A<)v˃z?@%l]c; Tܥr5,emOOOxT#ia(!Ð$% 2uZ`Yf;/Ҝ`LR^ɸ~>EYӉaV0N',SRCyhTeo`|?E>ʞ1SdI"9DpBfD{ ˾>߉ѳE j05:b'wd)@bFN:{C?SbM4;Sk@Fe>3ʴZY=ѳ.I; ZKyM'oCl}l0"fE]i)wRlr X{7͘ L%S~OKt;9âyw炫/;HɛI46m." ix3%U'-S:%s*`--ߟѢ;Yt~߷oߔk;"gn"7! UP^=SpIҪ'ƃ$Y}N{(b)5d {G6N0z$.On. 2qdtN_C2 pl/V Hz)rA0iƠtb%g9Kw zցY,۷o-iܬ^-kM-e  pPYD̙; R_)l 31/o"I6DQl0.a ğaZW3g=1YS4]lZaמM]yMsIAI.6of,:~c )Zַ5aB i3do f'4߁Wdڻq`1i=DǔӨTgX:Y#<10FHPd5HU3"LyĜ hIصORȔѯh |\ J |Y0>2ґIyxdWF= &bZi v\zSuސr`$3{\- rS%Gx32@+Olo[SٱBϯ^9.qHKϠu5&<3c7>3%5fkemӍ&^ ޙ*(AV7vSΞ;ue35$)SL ʍAwxY} rcGb7[fZCF?-\͎SgNu HeY. &}9eWMqiQg&66uG[4i_\D VAXWfXj8 lHtʲײ Dm(#vqҴv5MDWYo=?I&nQP$&[֝d12[,K5*:;ǜXǷa']H&1SPVcMR:] gik%-ÃzxÞ45Us4x 1 s6!ā)2{ gYOg9Ip}|3ec:Y4qGgc Q5Й WҰ4#:ÉL)iXii[**ɕ E:c3-XʣAs3tĐz֯1$Ȏ =M4a%4o.%UwT -\*d^Vɝ΅i5hh,EΤi` 0.߯\uxSQ3yL(T}벎cLvf+C.Yw_t񝴕fډ)P{7dj|0q32Nf>;;ۓgΤC@j(5Q$,k$ӗO(-Yv]| q bN3 Dɨw\uB5C,خ3tryoYˈ[6ݑL)[XXpS"ND,<\5Y noS2KTtxv$ M$b3)&ɏ9tԥ'Ӎd_\\*PiϻѣqRrMdYǓ `Vޣ 7`0v#TIKL%ρ?;))5YQs^RYw!@G-+LMh an継Huj b͸`K&k\Miy3j z"9g k]ia(^gxZMڳ 0x6ּߌܵUsݷ6%FwAN?fW8LmQsQIM|wi[sy [ug;4=']vr]<?TKA5Ñtno-13=M`KRW=G\z5L6:1JZwGTnIq5xߛQm5ɆLچ%KO-IT=מD,ͩc3=hݼ) dO|;54GNfbO?AQpvO!H\Q5Jj2b4y*7 +V}gw?g|xAe΀a IfSw{v&wN<gV g] sp,fbcgcjv4oD*u6s">-X!|hsJ%#*Xiabr+c$u-WHAJ~ E`}ӿ,:ZkƎ#n35& N=#hь-Sb-OΛ>\ tKBQLJO2W@5aތsr&1%oE;Eb ff~ڦ dS~:>#rgdΡy[KgZaxxxU4"YfwTjn8#SL3g?S%2S!ulja&`Ğw^kX9r䕺Sesib&VJY/s:zsm*@s6HVđg2s(5%f$e~s5x X/jQd6N CF2Qn_><<'?-,0qxHgLdzsjN^KKXs2U,S֒'''{vڿg߆aXC~a%삌1-g*OG,zlLXf5̇y\-I3cJu,J/AnO`bƒ2RWM!\̬{n3>Ale1笜v;Js)C~՝/@KcZxR6Z^'ו hb,=;텵{||f3 7G@Aɫ?b "߾}e2~E?KCMm"r;NSueVs\iA IDAT.0s6e6"N\Y$5G jfXcFz*+͎+eptt4&YQeO]wM_sINYjw`um~N [v~?>45ˣ (?\W{خbff5N.=:' ۡ6sӟ G` L/-G oHkRd91&w4JF$ƐD:ܬv͸Al޷۷ɋ_{$,œ3Z1 m'7tGUf4HQ].wHB[z+vR~^gbےIfVԞAxd@~0s|}:ڙI+T#cXՍ9_4?VZl-sZuuu5md)Bϟ >eƕG-u4Ș54@LJ?|0f|_ |3`*54dZb)y&AXQ7Zq3}Ew&v;~a vh2#b&ƚu94_'F&!y"G8Ce`Hd9> :,(L>{\۷yΕ`dw 檳z,ӻ䆵֠vso}Q]~dVJ6蔬 6AD;ϜQ❢RlnLnKRe:'Y zxx| $KCz:^s,c2!*وgĜ[20 -a^AAm9qR' 6[*];'0C#`AyL/ijSZl}|Ky܍FۦΔRRkrQ̚F1kvҵ'K1;gn\puرMsH.|vUa4ac.tR s3Z3L:yMfyc9f]C2^v`CSux2Fud`eɔ٬˗7umnxf4%tlɚ ?"*Y)Xs{{;^|ԝ\pA''ی U,ӳkea[E$&x0;1(1Zi fi \9Ӻ+Lˌo6 rd_Y3eQc3DZj_ud&e<Wž[ym -Q|ظ/fnAڰ1\u2爽l?#E;ov#tGdkʅbd`JߓcQhoP|uRw)l6%N]d3龷mjCUğTjj,ؖdc͟%Zkw,I05F,hoD6"#64&Fԙ\b5$3n2#f.L`E76?cAgSƔXFFXw݌ Bl7مV2|5pXmFN L 3LzPv22x1@yemeL("5s|ب(f | 7 \Ox34._DiNUtr<S6j}6M 0OrvPL[Pl8==,.cp)v0Ça)I/{Vb&S)VF73M'Հֿ+eIXɸc9atw"rڲzxxnnnZ]7o~fP5Q P90;=*Pouyy91E;U+r/{::mhu\g`_Y\ w,O#[e}62~3}"|Ҷ^(Z2v:ez;\lO< K)H:Okkۑngr\;i$7b޿+_P֪4u[&۶/N?$`V'9(8לeɝш#K͙62a T^>>H3gvO~=kvI:y9gv߰R]__޽#`,NW2N03kSL\ ӭ[k957;:Wl>OFCdDdfvVv t&wƲ% G>oLŊdZ{g SLr*On]Vjc=`]'Q.~B#("Ш;"\<13(܋NI`0]86^QK:rԪr/MXbIS>HzH,"OKh  s)_Lˤ|/l.DRu'=AVt4pєG_kmKtyxxP46"kD 888kCfd?+>kf+ f$Xe6qIuߜO[ЩJBE~aXDNcӥ@(fp؉խEf sV[wtƒJ[VÛ7ox :,)O>Ǐў+|ݤʸ9aHq d9a"2\@;q=,[]3Z)$dke\{ 攲n'CEkT:_AwV{"R#[Rf Գ?::NNN&>Z۬U eo]% ܵ,;#zd+ڌ6P<cNމɖ 9Fv"efnnooK}iTyD;_fD9/b^w2V@I 5:sW;??...ԕƦ_t|/6n_jHyLn`^>*| f$ 7tIJ6 lE2JI jSg7s 4LXA|x||t0 wwwsB"VdϹtn˗/Yf /'fN۳ُseK d o!ܦ2#N6vq!fzd/jgvG8%b0 5锻L`~9?(k٭>,L[k7Mr9yf&pvv6DYl(Ꝧԑ뫺Mx?<<< F F~;L3߽h=eիWŅt*OɅsc*lCcgvc{0 v>|yn$?sOYW1 張n I)MƐ{7F1cǽQV j^~=yF_|_~~2( O{zznoo8_^^F{NlcuH2 ƿDߐYcJyBa:U圹bV+mH]///rK[-`K3}fgO(Lќ; =lJMޫ ͟R.Z 0xԦD+߼y3F,bJ/7I}X;4>wj18UfXG$js'Ӷ74K%٥f&0}:2wqϗ|g Q\'[*L:A }~z_6[!իW4''''#'~$ unB/;iAt_&A~ɹ,7،=l&ley ]/0ů.@YUrRҀCjXjy͡fEfiNJ$=܌svL߿WO<l:eoyo޼4yo߾J9wtt4C3 \C̠S RPlZ_޽{7ǣ 7իQV{s=ڵϕ[fuǏ6ʔ|*ln07FV,X |iͺ-44[:Yo>6) [1ly7YC8n]%U8 &pķ ܤ=N"䗿kIsn*i8%RirYli1׽M9țbBz7pѡ/OU@Uh`b:>݀|._mYj L[;|'Ǐ hIfj`{֬ę>??q32C;g샫QU>3gT~t:1H'pq ڈ9TuAVK,Xo2߿~;Ov;r d`R꺘te;-'''٤gb']&BF*L2ze_]cR*Ort]#~gց乁Y~Ӓ/Z?;{򶉜{룓fi|v)%fAwaMLkɐF|xx8}vsB'aLp* JC0*3# T|o 8YYY<}vB¯ ,]vѱHJz=Sme3*`|'Ӳdv4  4n;^f&S(aV_t%4F梳{߾}ڜd5U)4e#\l?g'p~NMVYך_a.ʺ7o;z"fjK ㇺ M,s1JC<;"EoucN߿tNynjceԦXb &TN.yLI2VZO:,sMxN˜jYFz3=S42heͬܐEK˗c""dA9:1*6Ң>}&Mc߹Tt3:muXO7\׭Cm,X|:<<7{|luRb1 5ߌ Jx;r&L)Q^nTA^ H۷ɜDRdI6h=7oLv_u #Aw\I~˔ߘH ]lNc|EA999P22\ ]Mکe՜;HQ,&VsCSi|qg???o޼Q"E%,%d0͘z>;D0x ~zO)Af;irxxx+\C~ f ͿgB1irJ% dVKV_k: +F'Ґͦ9*_lֲu}\NN~)$+Q]բ] S{/ IDAT鲊Ji0?YÕDXVU Y*LAb0)m=0K'} ,:muxx8<<< mʂMV쬦b6Ym.u/˃Zih"G'2`/ceˮDM[ʅk K,ܵ{IA_~Ke\=rg`H7TJwxf%YDf׀@;͢bUזEt%a96~nl5x||O|ٶ ?///CnE1 [JUM[יڳi=;Ɓ?::'یMg0^o߾8Yz/r&K 6b/l)FxZ͙N䟧kLxsDImLu|IDكgZ˙Vo XЪKQn`n PW>:e)3AA&.0~Lo T3R-%k)l$3WvRsc|I<];<1rꭥ\dߛl0e%bmXWU4<#sɬ IR6QނڑNr[|ڛ=Ɔ?qxDE'aleQ>N>?s;¨hVy@9p'?Fȅa&˥2i[f=cFeKCHY::WXG3Tl;k6mF;jGcCvª3&vp,HBcuS`ggҦ~O #PXMbjI4M%N.3?r':ns>A+d.IlX0V['lYIzӉ%J;iTm8&y*8CbK \h녓Er1c{{2`aiYFQGzʡ#̔ y6,+͵Z-ugy(TYfJTHME?20F@gfˍrRnĪjadmlpYK|5OXj$2|+͡s3먿[c'պf1ZL٘PsE9w2'qEiƩLR5 qV*>Kc([$F!CQV8|ymH3F^؏?ƀS_nLhm@*sBܠKUY.SKwʑ/, BaYbTYvb5Nf6?F*PTS߲ȇcщ5UR@SƑcLapʠE=. e@Ǐij1޿L,2,6m mL-RQH,Rps5 ˒dCL;MBJm[&@i i84mre6\9.YM]O6(ݢS+@)X> 1 %eܬکN7cVQypp0/{>SÇ{Az3[q3Pe)Ɩu6+O}r]HPnn(j7fGj`<]`ڜӗ-C,0hw!)O@{2 {;N8#f aeV~gHI<ǙqE0ʀܷojiRMM^JMf"фupg\YUkZgќ;+UMMi7SnLRX}p9+~{˒g9FeCnd=V%矉0-J 2d"Q`a Q&' `Zl*&QegY'i[`6jo'h&df}~; $V&w@"{>xs+dk&3lO5 * 0>݆q9cfΥB3ȧ;r Hh ,d\0H w"{%;fGEzQ-Z%"_DYl&$3 W" ;\<|]:β6YfL0ߛa",CX LZsv)xbHIIJSshdHŊ̒it|l1u|᝶(2xOfC0K BfGOrA)[Tnz5$TDU1x/ͬ8ds}_93=ˮ~"cL!*):Ev ВS"ּT v9Kn~NhL5q=ivґp2U6IjVle\H1uo93°nDxsQr'Y3*[F`5?kN% dW+ґ:9* }5YsKiƩ/_Q!Ɣp3FleKK@X)Ŷ`; ;v.)`L: hc #lɿ r-VP׽^'<0j33#-0;'d`fRJQnΔ]V|l9ʝe2 yŝ%iItlf<m0ԚOb^rCaf9=\t.H4lhc[^zGh1"X7#JezO4IwHP& ,,S\I|V:&{HNncZ0ي҉ֵA^S(ѻFRCDLENj<hhx|/BΔN.cd"Y#G$$ޘ X:ϿYu'?yd~ ro[cmsPobC[ιaXFiY{fH3 #,tZpv;/_())udo}e~~^z`NrT8yh$Y7Xpg0SWPeeQ GaLNНs馵Y7ͤ ՍNJ;ڂB<&]5F1ȧ1p56a $S(:%=X{QYߓɚ_}>oooϟ?OOOOׯGzfi7.e!ÍI^L]DtTfumrX$3 qq z>f3X>...=P7qe899tD~KB3يDYW\yZuƜ3N0f gvdXZ'/].+6cONca&'Β-D-s$$Sl0ue۰ˇԹ$fe"# ZPƺxLci]C& Xzz:G)Tٜ3xCuwzۦxfFAni3@%󱴾?q!fۀΘgE^})յً֮4ڴ:\Np6{f $dDҍ4dnڌ!s:m+ɓP_f\@cܐ_]kx899cɮ\HHp\[=6x%%?R;3|弅|T Yv&&r&rghZfb.ngq1]Tդ b43t^Mʸ-)mԲEfvQ6N,^z5ӦI!1%K#9z5ߏl6bɃ[iTw3!/+n8 K1gK6ͳ\tުSSš&~oN |x]d` 瞱rzzw;D krܼ|؛fL~6ׯ%[YWZ$@ `Yj8K-]CgXVIOuIm6gZkT TFz겏L#-1'ò43Wa&ȅeCW"Z=kG؎Y.vUgG!o 2,N2H/; ĩgƢf nzxr443ImNcG,\דuE 8KTm50؅@E;p]n+Tge }%ͷ,t/5dfg?^4bcaٔڸٛ7ϴfdMV *TeIOޣM[a#do`O[|xED<;!s(իIgNlڹyPC6ٙ2+􃃃QY@' y $QV672H*{DԫU6{=OEk1fr\N(2>zxxe7MZ=Lehٕ0Kw8%I*g#hY!˞H33Wf@F2j|2I6;63+ }%9܄ϸOԀ_&1%6ԃiKzec|!ӥ8[cIIEc {Jf % g0r"uFqjM*J .$X1:/y{̺?3٬My OOOz+X2Yۨ᤬#qxggg~-ѤsZbM`=GaY݃ONNu#tae![VWX9y8@IBB:慿yffB!|e\F5!eo0#z}}wJp@- ᒡFx >f}ɭg*Iw&ȓe^2T7 =7ij ,= sV24biXrӧ~`' Ht;INQ}#CgV $⨑yzKEחikݎ`uXr)el6cL\ A+˔,Hyfx/ F նʹfφ˼ i9䦫MQeGNY6;`*TTa Y]YP|q876\:&8S/([.˛Ouy.aْD*I+~gm@)KH7f’T:)2e8;;MffYZnX-(˅:ﯿKԄY W8|Vd弆:Z>ZhN 'Kߔ^ZLqɠ &Ud,e-ljMBf[mj:)8Nu}Mn|///X~=??^~=|a8???gin.ࣣ׺@D\*7YME:=]}v M'+8Z>%}Q>ݜi-OZ9 8쏲8;fHnUȠ3TƉfۄU/mnz#K9Rlr ɶ,e~:l6 }e{\qd]=F,yd@\nG<)UmY}SKob)ðySgN_^^N8L5e5NgT籎/NyyȋD۷{וdj5:a |'-Y///HEdG.pUv;ϯÍuU]gPA&LYgcaf/\dhiNBWΚ(Ai@Z$ \j5Aɹx2“a,.3C13@pww7<1)F!VlФSdڌov`a IDATۥ+W z||@Rɀk:Tۦ7:p,JLcݛF:Div`|ߴ3ay&#)Ȕ*'M`FЖ1ˀXE4 ^oZ ڵlϟޓrAeWRgvh7ԟ?>< h]e}eIj.Mcx/UfRrKe+Unl]|4\Dbu TevG2F-;3x؃@4ZE:oujeVONc$v^<<<Vhfࡅw D@@+h߇ϟ?OZKdL ~{eEYLDN 3/{8T3aIaї ]Rl#Vظ$;e3XPύW/bH#ЖʲnIr ߾}KU.o޼lI^uHH٭юSG.f2X,(ap>*>|Ƨ9>>>~8e ! MʍXrf|mGl3wu4Wa'$KEq0jf5k#+cVDkt.SIlyFx6,R Eӡ+3#nDt}RΔͦ3ȓ(s1OFJIrssf}v*`3r{nTL'T`܈U}d;͚tfI" <)5J#3EGԲι2EK:/BF4o}NpdI!LAMGHpRNIQ9f,iҹ&PV3˪5jih91e~f6UH|1dR땀)q.6,+6ugY3u1 J2]bj `ͷe#y_6, &nv >,N(Qfl6ϟG ؉Xm] ydt{KWA&($pu71==NNNRi9ʞ쎕G,|5eYu~Z\X/Ot: g4\o2xq. n^v#9_~~:qbgƲ0ώD(Wdñ0|^R $gw 8vׯu&π99%ׅ 2 O^2i8|3աP^K3˴?kXk10Ӌ9+L |Y ck*5b *>92v><|eGѐNrg+~5Qz4pi653Uv ^^^FY'kRi0qvejLzOFhK:  Wj`fK_KLa\߿bKAn^>r9VS Wwyy9q%&К(&gf>L9F)X۫F͚7 qDf5^?>>fŘ5s>OrE(l5'P#s11S22+e@(ɼ4ga1B4Y阍Yt%B׋M{ g'IJ_ɵyjכymb& 3 ׯ_WWW*)Znqlujn}OIa57Nml"2tn.aWȔ9MDbde烃͛7%9yH7J2x@){*, $e!  [.\$X"-$Cٮ)vY_xԋrsP@’\ؼyjLIT471|)K-^'ߺBsYs0j}vi5sO]3k5q%yzzsafʝMtI}\{ֶJMAw(;Q"VEZ6VꬁYi̺ȜA$w:jx*96E}³Y]B5˴3X$摘jS|lb.׌Zfkf¤|l2vؾ.EY*s*p(Kbl}-cF^xY[4c+]~t&S_;xXsWtrL_TeC<*9 ia?(0l4܏ScfPNgb $5qJU{,/<<07l\JG-A&qrsRp2=/"%CV >5Iu%txrNe4\p<92K;K;!c?cptg^ Ů]KIZӓ&BeF~t)=:rR= .}fMAϴ@̌LH&)"AƙFu8R+;V[%6_2 `LK~n׺Ln%y&[w*5|ʞ?>xQZuuuKf/_&~GGcfʌÇ{8a7u;h&yP$a&;8G2dFA:.0}IdFʗ=OF=G3bCIxzz'"(M\v:/Y a^Ç&|܈g.tbIY ePk,mMG2Ek6Aٜw?˗/;0L{MAHrCr2d/ $cb {d@i {=w[̍/+d{`ݎr\+:F ǐYǝu6$]J6Ǐ0:Ce9m R{5ޑN\#ƙ$W`iAŗP> AL;j͚2ìВ/%?4]!'ۗ8l!LgjCOfU;bKA mz?9 ZvrIAiL>5 #O:۽I.d/2ݵys =S.ԆXB)7OiN#6.:Lh ^Vnk {hRy8?? f1%Y#իWÇ4Oʶ );bv#0. ;I* #FletQ[T>'En>>>N5 mLF]0X7r|gq?;ʭe_:W$Cy{w٥eg6aZQ PXv7GUq+23z< n۴ K988" &%#AM:C dEplUe/6E8 *ģoۤ1$4$U"^m\;q0a65eLWd^W'x%F3ԕ*ĵ\A] zۭN+r3ʌ~qAuSlsg`}ݐ hq'~WIBFcNtmHC^ywwwÏ?S)&kxsx!THs2S+49djy?t`>3аq_u:ǖLN˿ t:KeHDf ξ|7l! \Fh>LsV<>>5+K8<0Qt͡YuF81߂3ZVnnmvkY 1fԵH<7\DnFќ_^^>-2 R7JmQRrSu}3&g͞2ImYm0ş Uh439\j7{nس=M Vd^$Pl;>UМNsnMׯ_OƇ d", &mD&s)"c4)b՘ E7kϟw2逢Ǩɇidƀu)TPYtusN62! z?13eJKIZ ^:M9:yrdFrf=gfckLS2jK'mA)h4b}}gKfhŪkOPǏfٓM[J&hB͍E cnf@%]l8??\a%PI6.p:05׵@3ck$~.Ft\j R PO|XD9#B'oB$t]o YkPT:v.O4vͅ#xrqцְ.sIEV材2T s Lֺź~goCF3wcrHm;|(3y]Ǭ2Q+Cm) 0&,~G/lXmV)ȗXݰlt22O#tXT&6n;BfI"~+$KZfIL˯(` 3IS:<朘XѓѸUuO2RPmVN|l&Y=(Rz-B7`d ?f ɓl!"Rc9(C aFw3✆O;;;1gXu(NKñQ6gB$kѿ2=;[w1u69ײM2\ş` =6" k/I!Tgg+p~v\JOķfExxx8hȺ8  W f\ &Z~Wħ: emm~&Ć~v:J30 ZZ*aofbLӸ12K Sٹ 2v ,~?UmOuasٚ!)c2 3"N|Nf>۴guMfTqWPM7Yzf֑֜aaY 7;l;`ka3eHSYBj4 =0I+m2]O95!x:;(3@rZ ??fĞ0_pּ4j4sUyh^u$*ZVn#1H:cƓmܤ gpYF 6 SYr-eڡjl_3Fu%2N6d_N2s(N`s\vu79q3w5uP.4*ggS8cI $'2-Ό؉VJ}dM޽i,̰ڦ:Xk7F,b59Otn|A|@Fdji[𬹈TzĹvzfxtt4MR9vJLI3SbBKa_ASmZs | rȇQ=''=Xa&uL"MkN[6qmXr&]$xh>@_6,ۭ@li1 `\E^yeM57'#v7(Pf[E5A-fbUN06$~OY~ܟ3|٥.^?5$E{vf-ɖ_]hUkӀIwnXX<=LtQE6Ն" zzzg I~ɔ&d$zaٳK{1/9ڜfRJ୛ `-ۆls %@f IDATmN%6l)e+K1ד13RN$sa:>ݔر~c\N-8,OL'9^t'miϳzM eչ"`;.0jj\_x*5p3kN;mf)MJlUOO )gw>ON˺7a^ا l8Q$?jo;lN 20&nsS 6hN`B|<2;5; (g4LY2$Sp >U$fAYyΥM,wd)'OfOS&֞w :ПWf>Rn]zߟ"d2PU- Dl02rTv¢?ZNOO=)9mz.c9&trSZﷲf3AM=F,~qJeG#<,ĉ=lA2SH}dE'j")ݜiAğ_3k\5&:FN}߿C2J930Kr*̻dFr"2Ѱm<={jL@B^4B0}8(_A|D9U/~5QǕ2tign>,]n+2}fH~Y,ިqj keY}l{"4_ffd'ZKB3.#='R)tXOiX !,M(F$蜙 L^Ոm6arD 'iFEtac}%w#%Jdm?3` 2U:l'7Fz tS30Tښz?3ELh '$GY!XjJ;M[ AJt: /IV&ׂ@㞩kr㪲0Ze0vpP&A0\x!268Uk_"$$Uus?ߏƦRRDvs$jj5xDdY'Qv٬%Ƹ]̬g0-n Tq2Si 04$L LP&ΡD:-(/7jD~'i]IE҉(K2d,'v8~oue}[t:)h΋P'`KnݓO+@lXE#9g Dd&@ 0f^8DTe$d ;Sb dY N W: 5dn*l +P͔2Ԫ![b&Qw67%ujn)-]qy]Jjx 7|8ZE% U,I^kn+ve9чkl$*${3V bITu#gցFFqd4oYJ؀hѓ1I9 8UVA-A&gfU>&kbӌ]2NeUq JK)K85u*g&ٽ5|Տyׯ_o|qg}駩?IY׿YYYf//{eYp%mYŋҴpаK}>q*i,`R)2qM˜k_o5j󗆟59+^ ~AV\YTI~`Q:WW ǴS LT)K_u]Wlӓy]NF{kINo7vib3a)\B|dflj *=J{hF8FONze'-*=0 >d]O3Ȓ.otsIߞ׸u&Cxx>_֒/j~zJ[5<%).3lzL}ݧ؆zFQ}6c9i1f"N?aSrI&&ӣ1?H~ g.T\m6'w\|"(fJt} rފ2ܘhM2rym @K~j𹽽M~5[ &AN4&^>c/rS b8CØ'bĵyմp]6uO][-Ӈj"j4~Oc\ejٳ=5}SR`[]\c'/n?ܐ4g (F ~g)'cB,܎W5 Ge`%#p5Lr  !R]3aH vo~!=!szΘFxE^q~l\`8RΈUOܙF\ͱ+ @#)OYrUGZ̜GngWWWyj{Vo* SQS4&CFsMxl-3MbuS% ks>̅I/0Im2^/7?.Mqgyr^6Ƥ줯Ϲ;}ςbxcB<0 sOeIʠT'&Ws8~0v<̜Nr "w޷Rwۇ,ũ p+%TS̍^?9Vcmӕ^:(wy \Xw{3,s7ULde_&D0ks jЫ<իW"f\⏳SI}e/Mz-zS=+Tc1HoV.X9.ܼTӘQmLTԨt5m5$ #ϵdOP&aI'3wL҆d%7G˩F0Q)r}V)Ě{lTR-~id f???М :Xh).:+eǧG9aqS`Û:!]L'I.&$iaq}S`AIf8Q^˥[ABߓRd[J8'0T{Y+;xh^:T&j̢Rb]odt LCcplZ&}UY'4#k0ɋO)bŷ}1\KSKh)K) L-еH-feT E oj@QlArsOY$eVE6jg61ޖbĔʟ}rf-)p\x'/jB1?͌_@Uq0'`1-TNps鸞B:Z' `SnUkO_Y)2tIoĸ]V7Ϋ>S|wwww#ĻMe}~~ul5,Zfa#)LlJLoP_egi7fό0ՠMMJ`BUV L?Vˀ_LA[3TӢ+44XzrD}/sP(?{/^ݛ7oՍz :}ﴼO^; IENDB`./examples/unit-converter/conversion.js0000644000015600001650000000300412700370701020414 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ .pragma library // the function converts the value entered in the input to the other units function convert(input, converter, index) { if (input && input.text.length <= 0) return; var baseValue = parseFloat(input.text) / parseFloat(converter.model[index].rate); if (baseValue <= 0.0) return; for (var i = 0; i < converter.count; i++) { if (converter.itemAt(i)) { var inputItem = converter.itemAt(i).children[1] if (inputItem !== input) { inputItem.text = parseFloat(converter.model[i].rate) * baseValue; } } } } // the function clears every input field data function clear(converter, except) { for (var i = 0; i < converter.count; i++) { if (!except || (except && except !== converter.itemAt(i).children[1])) converter.itemAt(i).children[1].text = "0.0"; } } ./examples/unit-converter/unit-converter.desktop0000644000015600001650000000035512700370714022262 0ustar jenkinsjenkins[Desktop Entry] Name=unit-converter Comment=My project description Exec=qmlscene $@ unit-converter.qml Icon=qmlscene Terminal=false Type=Application X-Ubuntu-Touch=true X-Ubuntu-Gettext-Domain=com.ubuntu.developer.bzoltan.unit-converter ./examples/unit-converter/unit-converter.pro0000644000015600001650000000230612700370714021407 0ustar jenkinsjenkinsTEMPLATE = subdirs #load Ubuntu specific features load(ubuntu-click) # specify the manifest file, this file is required for click # packaging and for the IDE to create runconfigurations UBUNTU_MANIFEST_FILE=manifest.json.in TARGET = unit-converter QML_FILES += $$files(*.qml,true) \ $$files(*.js,true) CONF_FILES += $${TARGET}.apparmor \ $${TARGET}.png OTHER_FILES += $${CONF_FILES} \ $${QML_FILES} \ $${TARGET}.desktop #specify where the qml/js files are installed to qml_files.path = / qml_files.files += $${QML_FILES} #specify where the config files are installed to config_files.path = / config_files.files += $${CONF_FILES} #install the desktop file, a translated version is #automatically created in the build directory desktop_file.path = / desktop_file.files = $${TARGET}.desktop desktop_file.CONFIG += no_check_exist exists($$PWD/../examples.pro) { desktop_file.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/$${TARGET} config_files.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/$${TARGET} qml_files.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/$${TARGET} } INSTALLS+=config_files qml_files desktop_file ./examples/customtheme/0000755000015600001650000000000012700370716015253 5ustar jenkinsjenkins./examples/customtheme/customtheme.apparmor0000644000015600001650000000012312700370701021341 0ustar jenkinsjenkins{ "policy_groups": [ "networking" ], "policy_version": 1.2 } ./examples/customtheme/theme/0000755000015600001650000000000012700370701016347 5ustar jenkinsjenkins./examples/customtheme/theme/Palette.qml0000644000015600001650000000152612700370701020464 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ //![0] import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes.SuruDark 1.1 as Suru Suru.Palette { normal.background: "#A21E1C" selected.backgroundText: "lightblue" } //![0] ./examples/customtheme/theme/parent_theme0000644000015600001650000000004212700370701020741 0ustar jenkinsjenkinsUbuntu.Components.Themes.SuruDark ./examples/customtheme/manifest.json.in0000644000015600001650000000067212700370714020364 0ustar jenkinsjenkins{ "name": "customtheme.zsombi", "description": "Example application of the Ubuntu UI Toolkit - Jokes", "architecture": "@CLICK_ARCH@", "title": "Jokes", "hooks": { "customtheme": { "apparmor": "customtheme.apparmor", "desktop": "customtheme.desktop" } }, "version": "0.1", "maintainer": "Zsombor Egri ", "framework": "ubuntu-sdk-15.04" } ./examples/customtheme/customtheme.pro0000644000015600001650000000240112700370714020325 0ustar jenkinsjenkinsTEMPLATE = subdirs #load Ubuntu specific features load(ubuntu-click) # specify the manifest file, this file is required for click # packaging and for the IDE to create runconfigurations UBUNTU_MANIFEST_FILE=manifest.json.in TARGET = customtheme QML_FILES += $$files(*.qml,true) \ $$files(*.js,true) CONF_FILES += $${TARGET}.apparmor \ $${TARGET}.png \ $${TARGET}.wav \ theme/parent_theme OTHER_FILES += $${CONF_FILES} \ $${QML_FILES} \ $${TARGET}.desktop #specify where the qml/js files are installed to qml_files.path = / qml_files.files += $${QML_FILES} #specify where the config files are installed to config_files.path = / config_files.files += $${CONF_FILES} #install the desktop file, a translated version is #automatically created in the build directory desktop_file.path = / desktop_file.files = $${TARGET}.desktop desktop_file.CONFIG += no_check_exist exists($$PWD/../examples.pro) { desktop_file.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/$${TARGET} config_files.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/$${TARGET} qml_files.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/$${TARGET} } INSTALLS+=config_files qml_files desktop_file ./examples/customtheme/customtheme.desktop0000644000015600001650000000030412700370714021176 0ustar jenkinsjenkins[Desktop Entry] Name=customtheme Exec=qmlscene $@ main.qml Terminal=false Type=Application X-Ubuntu-Touch=true X-Ubuntu-Gettext-Domain=com.ubuntu.developer.zsombi.customtheme Icon=customtheme.png ./examples/customtheme/customtheme.png0000644000015600001650000011407012700370714020317 0ustar jenkinsjenkinsPNG  IHDR\rfbKGD pHYs B(xtIME 22 IDATx[r\gQ(poGaD% @@UPŧZ'7-D($@a7̕k|{@#7bgf|H;j}I6WnFșufpgUޅmԼq;V<9N2s%c|oVMNZԫjHO^x'k#@d=SEkuMeϝON.ffykd뢴kas4O]COOO8y=ڂ5 87;N3ǬVa@r׉;S}f|.2gSה.p{ Ùxݷ;n8 Y*d}-3 `iɑ k|1<==MdyuzͅXiys'HIrSdYZYו7+33a‚3h b[??+̃RϽVevo;߱ӢKxsCZM}^=Bs扚'~FLxZîZr.n{tt4sԿe0V;z/'⺟|O= tl%3&fL*da epfFk$nc8אi<y][Vi3=3A}zAҧHICT_f)꿹 '/n"Zk/_t>67q R,s^SWY=b$trn=C+bJn Olfu+@@9YfT\|~ @)]m~ZvQEZ$D6a899|߹3Z/ɇ0nlNk0A5~>|Y/Ȏw.]3L0R!B̀e_=~sml6lr]0.q !ZJ{yɻawחˊ*LϲDW-,櫛'oi$)6#=l)憪NxhVb^_CX$G!W-{ `| A!{ٽk`*OGdpz '/!Lsst!g9lIZZ^oq[2զ@6v noowbl(>dޑx` {<>>].?Kd},NZN;Fzd.2eg͑vxr-i2gGnDv9X 3;07sn fBN)1?3e\k<=dy``krp$t Zw 6dEq||<{"TycD)f1#)6yF*,)eXO&K Fkw2e&%6= 7{ k[93׫& dpdG;@&.lH, 2:d7wGN0ٕOO߾}D1X_'Ed\U5$Kř۩(5HivR`HFwn$̉x2h3Ӳ>x:H>%OQq3'e uvlz#Xpt&+ 3j/ Ys呆46Q_Ѝ{ʛcaAq21"g=<{jT~l@iQcbZ[-Фbw؈=cDY#Ʈ%8\A<)v˃z?@%l]c; Tܥr5,emOOOxT#ia(!Ð$% 2uZ`Yf;/Ҝ`LR^ɸ~>EYӉaV0N',SRCyhTeo`|?E>ʞ1SdI"9DpBfD{ ˾>߉ѳE j05:b'wd)@bFN:{C?SbM4;Sk@Fe>3ʴZY=ѳ.I; ZKyM'oCl}l0"fE]i)wRlr X{7͘ L%S~OKt;9âyw炫/;HɛI46m." ix3%U'-S:%s*`--ߟѢ;Yt~߷oߔk;"gn"7! UP^=SpIҪ'ƃ$Y}N{(b)5d {G6N0z$.On. 2qdtN_C2 pl/V Hz)rA0iƠtb%g9Kw zցY,۷o-iܬ^-kM-e  pPYD̙; R_)l 31/o"I6DQl0.a ğaZW3g=1YS4]lZaמM]yMsIAI.6of,:~c )Zַ5aB i3do f'4߁Wdڻq`1i=DǔӨTgX:Y#<10FHPd5HU3"LyĜ hIصORȔѯh |\ J |Y0>2ґIyxdWF= &bZi v\zSuސr`$3{\- rS%Gx32@+Olo[SٱBϯ^9.qHKϠu5&<3c7>3%5fkemӍ&^ ޙ*(AV7vSΞ;ue35$)SL ʍAwxY} rcGb7[fZCF?-\͎SgNu HeY. &}9eWMqiQg&66uG[4i_\D VAXWfXj8 lHtʲײ Dm(#vqҴv5MDWYo=?I&nQP$&[֝d12[,K5*:;ǜXǷa']H&1SPVcMR:] gik%-ÃzxÞ45Us4x 1 s6!ā)2{ gYOg9Ip}|3ec:Y4qGgc Q5Й WҰ4#:ÉL)iXii[**ɕ E:c3-XʣAs3tĐz֯1$Ȏ =M4a%4o.%UwT -\*d^Vɝ΅i5hh,EΤi` 0.߯\uxSQ3yL(T}벎cLvf+C.Yw_t񝴕fډ)P{7dj|0q32Nf>;;ۓgΤC@j(5Q$,k$ӗO(-Yv]| q bN3 Dɨw\uB5C,خ3tryoYˈ[6ݑL)[XXpS"ND,<\5Y noS2KTtxv$ M$b3)&ɏ9tԥ'Ӎd_\\*PiϻѣqRrMdYǓ `Vޣ 7`0v#TIKL%ρ?;))5YQs^RYw!@G-+LMh an継Huj b͸`K&k\Miy3j z"9g k]ia(^gxZMڳ 0x6ּߌܵUsݷ6%FwAN?fW8LmQsQIM|wi[sy [ug;4=']vr]<?TKA5Ñtno-13=M`KRW=G\z5L6:1JZwGTnIq5xߛQm5ɆLچ%KO-IT=מD,ͩc3=hݼ) dO|;54GNfbO?AQpvO!H\Q5Jj2b4y*7 +V}gw?g|xAe΀a IfSw{v&wN<gV g] sp,fbcgcjv4oD*u6s">-X!|hsJ%#*Xiabr+c$u-WHAJ~ E`}ӿ,:ZkƎ#n35& N=#hь-Sb-OΛ>\ tKBQLJO2W@5aތsr&1%oE;Eb ff~ڦ dS~:>#rgdΡy[KgZaxxxU4"YfwTjn8#SL3g?S%2S!ulja&`Ğw^kX9r䕺Sesib&VJY/s:zsm*@s6HVđg2s(5%f$e~s5x X/jQd6N CF2Qn_><<'?-,0qxHgLdzsjN^KKXs2U,S֒'''{vڿg߆aXC~a%삌1-g*OG,zlLXf5̇y\-I3cJu,J/AnO`bƒ2RWM!\̬{n3>Ale1笜v;Js)C~՝/@KcZxR6Z^'ו hb,=;텵{||f3 7G@Aɫ?b "߾}e2~E?KCMm"r;NSueVs\iA IDAT.0s6e6"N\Y$5G jfXcFz*+͎+eptt4&YQeO]wM_sINYjw`um~N [v~?>45ˣ (?\W{خbff5N.=:' ۡ6sӟ G` L/-G oHkRd91&w4JF$ƐD:ܬv͸Al޷۷ɋ_{$,œ3Z1 m'7tGUf4HQ].wHB[z+vR~^gbےIfVԞAxd@~0s|}:ڙI+T#cXՍ9_4?VZl-sZuuu5md)Bϟ >eƕG-u4Ș54@LJ?|0f|_ |3`*54dZb)y&AXQ7Zq3}Ew&v;~a vh2#b&ƚu94_'F&!y"G8Ce`Hd9> :,(L>{\۷yΕ`dw 檳z,ӻ䆵֠vso}Q]~dVJ6蔬 6AD;ϜQ❢RlnLnKRe:'Y zxx| $KCz:^s,c2!*وgĜ[20 -a^AAm9qR' 6[*];'0C#`AyL/ijSZl}|Ky܍FۦΔRRkrQ̚F1kvҵ'K1;gn\puرMsH.|vUa4ac.tR s3Z3L:yMfyc9f]C2^v`CSux2Fud`eɔ٬˗7umnxf4%tlɚ ?"*Y)Xs{{;^|ԝ\pA''ی U,ӳkea[E$&x0;1(1Zi fi \9Ӻ+Lˌo6 rd_Y3eQc3DZj_ud&e<Wž[ym -Q|ظ/fnAڰ1\u2爽l?#E;ov#tGdkʅbd`JߓcQhoP|uRw)l6%N]d3龷mjCUğTjj,ؖdc͟%Zkw,I05F,hoD6"#64&Fԙ\b5$3n2#f.L`E76?cAgSƔXFFXw݌ Bl7مV2|5pXmFN L 3LzPv22x1@yemeL("5s|ب(f | 7 \Ox34._DiNUtr<S6j}6M 0OrvPL[Pl8==,.cp)v0Ça)I/{Vb&S)VF73M'Հֿ+eIXɸc9atw"rڲzxxnnnZ]7o~fP5Q P90;=*Pouyy91E;U+r/{::mhu\g`_Y\ w,O#[e}62~3}"|Ҷ^(Z2v:ez;\lO< K)H:Okkۑngr\;i$7b޿+_P֪4u[&۶/N?$`V'9(8לeɝш#K͙62a T^>>H3gvO~=kvI:y9gv߰R]__޽#`,NW2N03kSL\ ӭ[k957;:Wl>OFCdDdfvVv t&wƲ% G>oLŊdZ{g SLr*On]Vjc=`]'Q.~B#("Ш;"\<13(܋NI`0]86^QK:rԪr/MXbIS>HzH,"OKh  s)_Lˤ|/l.DRu'=AVt4pєG_kmKtyxxP46"kD 888kCfd?+>kf+ f$Xe6qIuߜO[ЩJBE~aXDNcӥ@(fp؉խEf sV[wtƒJ[VÛ7ox :,)O>Ǐў+|ݤʸ9aHq d9a"2\@;q=,[]3Z)$dke\{ 攲n'CEkT:_AwV{"R#[Rf Գ?::NNN&>Z۬U eo]% ܵ,;#zd+ڌ6P<cNމɖ 9Fv"efnnooK}iTyD;_fD9/b^w2V@I 5:sW;??...ԕƦ_t|/6n_jHyLn`^>*| f$ 7tIJ6 lE2JI jSg7s 4LXA|x||t0 wwwsB"VdϹtn˗/Yf /'fN۳ُseK d o!ܦ2#N6vq!fzd/jgvG8%b0 5锻L`~9?(k٭>,L[k7Mr9yf&pvv6DYl(Ꝧԑ뫺Mx?<<< F F~;L3߽h=eիWŅt*OɅsc*lCcgvc{0 v>|yn$?sOYW1 張n I)MƐ{7F1cǽQV j^~=yF_|_~~2( O{zznoo8_^^F{NlcuH2 ƿDߐYcJyBa:U圹bV+mH]///rK[-`K3}fgO(Lќ; =lJMޫ ͟R.Z 0xԦD+߼y3F,bJ/7I}X;4>wj18UfXG$js'Ӷ74K%٥f&0}:2wqϗ|g Q\'[*L:A }~z_6[!իW4''''#'~$ unB/;iAt_&A~ɹ,7،=l&ley ]/0ů.@YUrRҀCjXjy͡fEfiNJ$=܌svL߿WO<l:eoyo޼4yo߾J9wtt4C3 \C̠S RPlZ_޽{7ǣ 7իQV{s=ڵϕ[fuǏ6ʔ|*ln07FV,X |iͺ-44[:Yo>6) [1ly7YC8n]%U8 &pķ ܤ=N"䗿kIsn*i8%RirYli1׽M9țbBz7pѡ/OU@Uh`b:>݀|._mYj L[;|'Ǐ hIfj`{֬ę>??q32C;g샫QU>3gT~t:1H'pq ڈ9TuAVK,Xo2߿~;Ov;r d`R꺘te;-'''٤gb']&BF*L2ze_]cR*Ort]#~gց乁Y~Ӓ/Z?;{򶉜{룓fi|v)%fAwaMLkɐF|xx8}vsB'aLp* JC0*3# T|o 8YYY<}vB¯ ,]vѱHJz=Sme3*`|'Ӳdv4  4n;^f&S(aV_t%4F梳{߾}ڜd5U)4e#\l?g'p~NMVYך_a.ʺ7o;z"fjK ㇺ M,s1JC<;"EoucN߿tNynjceԦXb &TN.yLI2VZO:,sMxN˜jYFz3=S42heͬܐEK˗c""dA9:1*6Ң>}&Mc߹Tt3:muXO7\׭Cm,X|:<<7{|luRb1 5ߌ Jx;r&L)Q^nTA^ H۷ɜDRdI6h=7oLv_u #Aw\I~˔ߘH ]lNc|EA999P22\ ]Mکe՜;HQ,&VsCSi|qg???o޼Q"E%,%d0͘z>;D0x ~zO)Af;irxxx+\C~ f ͿgB1irJ% dVKV_k: +F'Ґͦ9*_lֲu}\NN~)$+Q]բ] S{/ IDAT鲊Ji0?YÕDXVU Y*LAb0)m=0K'} ,:muxx8<<< mʂMV쬦b6Ym.u/˃Zih"G'2`/ceˮDM[ʅk K,ܵ{IA_~Ke\=rg`H7TJwxf%YDf׀@;͢bUזEt%a96~nl5x||O|ٶ ?///CnE1 [JUM[יڳi=;Ɓ?::'یMg0^o߾8Yz/r&K 6b/l)FxZ͙N䟧kLxsDImLu|IDكgZ˙Vo XЪKQn`n PW>:e)3AA&.0~Lo T3R-%k)l$3WvRsc|I<];<1rꭥ\dߛl0e%bmXWU4<#sɬ IR6QނڑNr[|ڛ=Ɔ?qxDE'aleQ>N>?s;¨hVy@9p'?Fȅa&˥2i[f=cFeKCHY::WXG3Tl;k6mF;jGcCvª3&vp,HBcuS`ggҦ~O #PXMbjI4M%N.3?r':ns>A+d.IlX0V['lYIzӉ%J;iTm8&y*8CbK \h녓Er1c{{2`aiYFQGzʡ#̔ y6,+͵Z-ugy(TYfJTHME?20F@gfˍrRnĪjadmlpYK|5OXj$2|+͡s3먿[c'պf1ZL٘PsE9w2'qEiƩLR5 qV*>Kc([$F!CQV8|ymH3F^؏?ƀS_nLhm@*sBܠKUY.SKwʑ/, BaYbTYvb5Nf6?F*PTS߲ȇcщ5UR@SƑcLapʠE=. e@Ǐij1޿L,2,6m mL-RQH,Rps5 ˒dCL;MBJm[&@i i84mre6\9.YM]O6(ݢS+@)X> 1 %eܬکN7cVQypp0/{>SÇ{Az3[q3Pe)Ɩu6+O}r]HPnn(j7fGj`<]`ڜӗ-C,0hw!)O@{2 {;N8#f aeV~gHI<ǙqE0ʀܷojiRMM^JMf"фupg\YUkZgќ;+UMMi7SnLRX}p9+~{˒g9FeCnd=V%矉0-J 2d"Q`a Q&' `Zl*&QegY'i[`6jo'h&df}~; $V&w@"{>xs+dk&3lO5 * 0>݆q9cfΥB3ȧ;r Hh ,d\0H w"{%;fGEzQ-Z%"_DYl&$3 W" ;\<|]:β6YfL0ߛa",CX LZsv)xbHIIJSshdHŊ̒it|l1u|᝶(2xOfC0K BfGOrA)[Tnz5$TDU1x/ͬ8ds}_93=ˮ~"cL!*):Ev ВS"ּT v9Kn~NhL5q=ivґp2U6IjVle\H1uo93°nDxsQr'Y3*[F`5?kN% dW+ґ:9* }5YsKiƩ/_Q!Ɣp3FleKK@X)Ŷ`; ;v.)`L: hc #lɿ r-VP׽^'<0j33#-0;'d`fRJQnΔ]V|l9ʝe2 yŝ%iItlf<m0ԚOb^rCaf9=\t.H4lhc[^zGh1"X7#JezO4IwHP& ,,S\I|V:&{HNncZ0ي҉ֵA^S(ѻFRCDLENj<hhx|/BΔN.cd"Y#G$$ޘ X:ϿYu'?yd~ ro[cmsPobC[ιaXFiY{fH3 #,tZpv;/_())udo}e~~^z`NrT8yh$Y7Xpg0SWPeeQ GaLNНs馵Y7ͤ ՍNJ;ڂB<&]5F1ȧ1p56a $S(:%=X{QYߓɚ_}>oooϟ?OOOOׯGzfi7.e!ÍI^L]DtTfumrX$3 qq z>f3X>...=P7qe899tD~KB3يDYW\yZuƜ3N0f gvdXZ'/].+6cONca&'Β-D-s$$Sl0ue۰ˇԹ$fe"# ZPƺxLci]C& Xzz:G)Tٜ3xCuwzۦxfFAni3@%󱴾?q!fۀΘgE^})յً֮4ڴ:\Np6{f $dDҍ4dnڌ!s:m+ɓP_f\@cܐ_]kx899cɮ\HHp\[=6x%%?R;3|弅|T Yv&&r&rghZfb.ngq1]Tդ b43t^Mʸ-)mԲEfvQ6N,^z5ӦI!1%K#9z5ߏl6bɃ[iTw3!/+n8 K1gK6ͳ\tުSSš&~oN |x]d` 瞱rzzw;D krܼ|؛fL~6ׯ%[YWZ$@ `Yj8K-]CgXVIOuIm6gZkT TFz겏L#-1'ò43Wa&ȅeCW"Z=kG؎Y.vUgG!o 2,N2H/; ĩgƢf nzxr443ImNcG,\דuE 8KTm50؅@E;p]n+Tge }%ͷ,t/5dfg?^4bcaٔڸٛ7ϴfdMV *TeIOޣM[a#do`O[|xED<;!s(իIgNlڹyPC6ٙ2+􃃃QY@' y $QV672H*{DԫU6{=OEk1fr\N(2>zxxe7MZ=Lehٕ0Kw8%I*g#hY!˞H33Wf@F2j|2I6;63+ }%9܄ϸOԀ_&1%6ԃiKzec|!ӥ8[cIIEc {Jf % g0r"uFqjM*J .$X1:/y{̺?3٬My OOOz+X2Yۨ᤬#qxggg~-ѤsZbM`=GaY݃ONNu#tae![VWX9y8@IBB:慿yffB!|e\F5!eo0#z}}wJp@- ᒡFx >f}ɭg*Iw&ȓe^2T7 =7ij ,= sV24biXrӧ~`' Ht;INQ}#CgV $⨑yzKEחikݎ`uXr)el6cL\ A+˔,Hyfx/ F նʹfφ˼ i9䦫MQeGNY6;`*TTa Y]YP|q876\:&8S/([.˛Ouy.aْD*I+~gm@)KH7f’T:)2e8;;MffYZnX-(˅:ﯿKԄY W8|Vd弆:Z>ZhN 'Kߔ^ZLqɠ &Ud,e-ljMBf[mj:)8Nu}Mn|///X~=??^~=|a8???gin.ࣣ׺@D\*7YME:=]}v M'+8Z>%}Q>ݜi-OZ9 8쏲8;fHnUȠ3TƉfۄU/mnz#K9Rlr ɶ,e~:l6 }e{\qd]=F,yd@\nG<)UmY}SKob)ðySgN_^^N8L5e5NgT籎/NyyȋD۷{וdj5:a |'-Y///HEdG.pUv;ϯÍuU]gPA&LYgcaf/\dhiNBWΚ(Ai@Z$ \j5Aɹx2“a,.3C13@pww7<1)F!VlФSdڌov`a IDATۥ+W z||@Rɀk:Tۦ7:p,JLcݛF:Div`|ߴ3ay&#)Ȕ*'M`FЖ1ˀXE4 ^oZ ڵlϟޓrAeWRgvh7ԟ?>< h]e}eIj.Mcx/UfRrKe+Unl]|4\Dbu TevG2F-;3x؃@4ZE:oujeVONc$v^<<<Vhfࡅw D@@+h߇ϟ?OZKdL ~{eEYLDN 3/{8T3aIaї ]Rl#Vظ$;e3XPύW/bH#ЖʲnIr ߾}KU.o޼lI^uHH٭юSG.f2X,(ap>*>|Ƨ9>>>~8e ! MʍXrf|mGl3wu4Wa'$KEq0jf5k#+cVDkt.SIlyFx6,R Eӡ+3#nDt}RΔͦ3ȓ(s1OFJIrssf}v*`3r{nTL'T`܈U}d;͚tfI" <)5J#3EGԲι2EK:/BF4o}NpdI!LAMGHpRNIQ9f,iҹ&PV3˪5jih91e~f6UH|1dR땀)q.6,+6ugY3u1 J2]bj `ͷe#y_6, &nv >,N(Qfl6ϟG ؉Xm] ydt{KWA&($pu71==NNNRi9ʞ쎕G,|5eYu~Z\X/Ot: g4\o2xq. n^v#9_~~:qbgƲ0ώD(Wdñ0|^R $gw 8vׯu&π99%ׅ 2 O^2i8|3աP^K3˴?kXk10Ӌ9+L |Y ck*5b *>92v><|eGѐNrg+~5Qz4pi653Uv ^^^FY'kRi0qvejLzOFhK:  Wj`fK_KLa\߿bKAn^>r9VS Wwyy9q%&К(&gf>L9F)X۫F͚7 qDf5^?>>fŘ5s>OrE(l5'P#s11S22+e@(ɼ4ga1B4Y阍Yt%B׋M{ g'IJ_ɵyjכymb& 3 ׯ_WWW*)Znqlujn}OIa57Nml"2tn.aWȔ9MDbde烃͛7%9yH7J2x@){*, $e!  [.\$X"-$Cٮ)vY_xԋrsP@’\ؼyjLIT471|)K-^'ߺBsYs0j}vi5sO]3k5q%yzzsafʝMtI}\{ֶJMAw(;Q"VEZ6VꬁYi̺ȜA$w:jx*96E}³Y]B5˴3X$摘jS|lb.׌Zfkf¤|l2vؾ.EY*s*p(Kbl}-cF^xY[4c+]~t&S_;xXsWtrL_TeC<*9 ia?(0l4܏ScfPNgb $5qJU{,/<<07l\JG-A&qrsRp2=/"%CV >5Iu%txrNe4\p<92K;K;!c?cptg^ Ů]KIZӓ&BeF~t)=:rR= .}fMAϴ@̌LH&)"AƙFu8R+;V[%6_2 `LK~n׺Ln%y&[w*5|ʞ?>xQZuuuKf/_&~GGcfʌÇ{8a7u;h&yP$a&;8G2dFA:.0}IdFʗ=OF=G3bCIxzz'"(M\v:/Y a^Ç&|܈g.tbIY ePk,mMG2Ek6Aٜw?˗/;0L{MAHrCr2d/ $cb {d@i {=w[̍/+d{`ݎr\+:F ǐYǝu6$]J6Ǐ0:Ce9m R{5ޑN\#ƙ$W`iAŗP> AL;j͚2ìВ/%?4]!'ۗ8l!LgjCOfU;bKA mz?9 ZvrIAiL>5 #O:۽I.d/2ݵys =S.ԆXB)7OiN#6.:Lh ^Vnk {hRy8?? f1%Y#իWÇ4Oʶ );bv#0. ;I* #FletQ[T>'En>>>N5 mLF]0X7r|gq?;ʭe_:W$Cy{w٥eg6aZQ PXv7GUq+23z< n۴ K988" &%#AM:C dEplUe/6E8 *ģoۤ1$4$U"^m\;q0a65eLWd^W'x%F3ԕ*ĵ\A] zۭN+r3ʌ~qAuSlsg`}ݐ hq'~WIBFcNtmHC^ywwwÏ?S)&kxsx!THs2S+49djy?t`>3аq_u:ǖLN˿ t:KeHDf ξ|7l! \Fh>LsV<>>5+K8<0Qt͡YuF81߂3ZVnnmvkY 1fԵH<7\DnFќ_^^>-2 R7JmQRrSu}3&g͞2ImYm0ş Uh439\j7{nس=M Vd^$Pl;>UМNsnMׯ_OƇ d", &mD&s)"c4)b՘ E7kϟw2逢Ǩɇidƀu)TPYtusN62! z?13eJKIZ ^:M9:yrdFrf=gfckLS2jK'mA)h4b}}gKfhŪkOPǏfٓM[J&hB͍E cnf@%]l8??\a%PI6.p:05׵@3ck$~.Ft\j R PO|XD9#B'oB$t]o YkPT:v.O4vͅ#xrqцְ.sIEV材2T s Lֺź~goCF3wcrHm;|(3y]Ǭ2Q+Cm) 0&,~G/lXmV)ȗXݰlt22O#tXT&6n;BfI"~+$KZfIL˯(` 3IS:<朘XѓѸUuO2RPmVN|l&Y=(Rz-B7`d ?f ɓl!"Rc9(C aFw3✆O;;;1gXu(NKñQ6gB$kѿ2=;[w1u69ײM2\ş` =6" k/I!Tgg+p~v\JOķfExxx8hȺ8  W f\ &Z~Wħ: emm~&Ć~v:J30 ZZ*aofbLӸ12K Sٹ 2v ,~?UmOuasٚ!)c2 3"N|Nf>۴guMfTqWPM7Yzf֑֜aaY 7;l;`ka3eHSYBj4 =0I+m2]O95!x:;(3@rZ ??fĞ0_pּ4j4sUyh^u$*ZVn#1H:cƓmܤ gpYF 6 SYr-eڡjl_3Fu%2N6d_N2s(N`s\vu79q3w5uP.4*ggS8cI $'2-Ό؉VJ}dM޽i,̰ڦ:Xk7F,b59Otn|A|@Fdji[𬹈TzĹvzfxtt4MR9vJLI3SbBKa_ASmZs | rȇQ=''=Xa&uL"MkN[6qmXr&]$xh>@_6,ۭ@li1 `\E^yeM57'#v7(Pf[E5A-fbUN06$~OY~ܟ3|٥.^?5$E{vf-ɖ_]hUkӀIwnXX<=LtQE6Ն" zzzg I~ɔ&d$zaٳK{1/9ڜfRJ୛ `-ۆls %@f IDATmN%6l)e+K1ד13RN$sa:>ݔر~c\N-8,OL'9^t'miϳzM eչ"`;.0jj\_x*5p3kN;mf)MJlUOO )gw>ON˺7a^ا l8Q$?jo;lN 20&nsS 6hN`B|<2;5; (g4LY2$Sp >U$fAYyΥM,wd)'OfOS&֞w :ПWf>Rn]zߟ"d2PU- Dl02rTv¢?ZNOO=)9mz.c9&trSZﷲf3AM=F,~qJeG#<,ĉ=lA2SH}dE'j")ݜiAğ_3k\5&:FN}߿C2J930Kr*̻dFr"2Ѱm<={jL@B^4B0}8(_A|D9U/~5QǕ2tign>,]n+2}fH~Y,ިqj keY}l{"4_ffd'ZKB3.#='R)tXOiX !,M(F$蜙 L^Ոm6arD 'iFEtac}%w#%Jdm?3` 2U:l'7Fz tS30Tښz?3ELh '$GY!XjJ;M[ AJt: /IV&ׂ@㞩kr㪲0Ze0vpP&A0\x!268Uk_"$$Uus?ߏƦRRDvs$jj5xDdY'Qv٬%Ƹ]̬g0-n Tq2Si 04$L LP&ΡD:-(/7jD~'i]IE҉(K2d,'v8~oue}[t:)h΋P'`KnݓO+@lXE#9g Dd&@ 0f^8DTe$d ;Sb dY N W: 5dn*l +P͔2Ԫ![b&Qw67%ujn)-]qy]Jjx 7|8ZE% U,I^kn+ve9чkl$*${3V bITu#gցFFqd4oYJ؀hѓ1I9 8UVA-A&gfU>&kbӌ]2NeUq JK)K85u*g&ٽ5|Տyׯ_o|qg}駩?IY׿YYYf//{eYp%mYŋҴpаK}>q*i,`R)2qM˜k_o5j󗆟59+^ ~AV\YTI~`Q:WW ǴS LT)K_u]Wlӓy]NF{kINo7vib3a)\B|dflj *=J{hF8FONze'-*=0 >d]O3Ȓ.otsIߞ׸u&Cxx>_֒/j~zJ[5<%).3lzL}ݧ؆zFQ}6c9i1f"N?aSrI&&ӣ1?H~ g.T\m6'w\|"(fJt} rފ2ܘhM2rym @K~j𹽽M~5[ &AN4&^>c/rS b8CØ'bĵyմp]6uO][-Ӈj"j4~Oc\ejٳ=5}SR`[]\c'/n?ܐ4g (F ~g)'cB,܎W5 Ge`%#p5Lr  !R]3aH vo~!=!szΘFxE^q~l\`8RΈUOܙF\ͱ+ @#)OYrUGZ̜GngWWWyj{Vo* SQS4&CFsMxl-3MbuS% ks>̅I/0Im2^/7?.Mqgyr^6Ƥ줯Ϲ;}ςbxcB<0 sOeIʠT'&Ws8~0v<̜Nr "w޷Rwۇ,ũ p+%TS̍^?9Vcmӕ^:(wy \Xw{3,s7ULde_&D0ks jЫ<իW"f\⏳SI}e/Mz-zS=+Tc1HoV.X9.ܼTӘQmLTԨt5m5$ #ϵdOP&aI'3wL҆d%7G˩F0Q)r}V)Ě{lTR-~id f???М :Xh).:+eǧG9aqS`Û:!]L'I.&$iaq}S`AIf8Q^˥[ABߓRd[J8'0T{Y+;xh^:T&j̢Rb]odt LCcplZ&}UY'4#k0ɋO)bŷ}1\KSKh)K) L-еH-feT E oj@QlArsOY$eVE6jg61ޖbĔʟ}rf-)p\x'/jB1?͌_@Uq0'`1-TNps鸞B:Z' `SnUkO_Y)2tIoĸ]V7Ϋ>S|wwww#ĻMe}~~ul5,Zfa#)LlJLoP_egi7fό0ՠMMJ`BUV L?Vˀ_LA[3TӢ+44XzrD}/sP(?{/^ݛ7oՍz :}ﴼO^; IENDB`./examples/customtheme/main.qml0000644000015600001650000000354312700370701016711 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ //![0] import QtQuick 2.4 import Ubuntu.Components 1.3 MainView { id: mainView objectName: "mainView" applicationName: "customtheme" width: units.gu(100) height: units.gu(75) theme.name: "theme" Page { title: i18n.tr("Theme sample") Column { spacing: units.gu(1) anchors { margins: units.gu(2) fill: parent } Label { text: i18n.tr("Theme.name:") + " " + theme.name } Button { width: parent.width text: i18n.tr("Set Ambiance theme") onClicked: { theme.name = "Ubuntu.Components.Themes.Ambiance"; } } Button { width: parent.width text: i18n.tr("Set SuruDark theme") onClicked: { theme.name = "Ubuntu.Components.Themes.SuruDark"; } } Button { width: parent.width text: i18n.tr("Application theme") onClicked: { theme.name = "theme"; } } } } } //![0] ./examples/customtheme/manifest.json0000644000015600001650000000063312700370701017750 0ustar jenkinsjenkins{ "architecture": "all", "description": "description of customtheme", "framework": "ubuntu-sdk-14.10-dev2", "hooks": { "customtheme": { "apparmor": "customtheme.apparmor", "desktop": "customtheme.desktop" } }, "maintainer": "Zsombor Egri ", "name": "customtheme", "title": "customtheme", "version": "0.1" } ./examples/locale/0000755000015600001650000000000012700370716014155 5ustar jenkinsjenkins./examples/locale/manifest.json.in0000644000015600001650000000064112700370714017262 0ustar jenkinsjenkins{ "name": "locale.bzoltan", "description": "Example application of the Ubuntu UI Toolkit - Locale", "architecture": "@CLICK_ARCH@", "title": "Locale", "hooks": { "locale": { "apparmor": "locale.apparmor", "desktop": "locale.desktop" } }, "version": "0.1", "maintainer": "Zoltán Balogh ", "framework": "ubuntu-sdk-15.04" } ./examples/locale/locale.qml0000644000015600001650000001040712700370701016123 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.0 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem /*! \brief An application to test locales on the device Demonstrates following: - ListItem - MainView - Label Uses: - Date() - Qt.locale */ MainView { // objectName for functional testing purposes (autopilot-qt5) objectName: "mainView" // Note! applicationName needs to match the .desktop filename applicationName: "locale" /* This property enables the application to change orientation when the device is rotated. The default is false. */ id: root width: units.gu(100) height: units.gu(75) automaticOrientation: true property string locale: view.currentItem.locale Page { id: page Item { id: chooser anchors { top: parent.top left: parent.left right: parent.right } height: parent.height/2 ListView { highlightFollowsCurrentItem: true id: view clip: true focus: true anchors.fill: parent model: [ "hu_HU", "he-IL", "en_US", "en_GB", "fi_FI", "de_DE", "ar_SA", "hi_IN", "zh_CN", "th_TH", "fr_FR", "nb_NO", "sv_SE" ] delegate: ListItem.Standard { property string locale: modelData text: Qt.locale(modelData).name + " ("+ Qt.locale(modelData).nativeCountryName + "/" + Qt.locale(modelData).nativeLanguageName + ")" onClicked: view.currentIndex = index } highlight: Rectangle { height: units.gu(2) width: view.width color: theme.palette.selected.background } } } Rectangle { anchors { top: chooser.bottom topMargin: units.gu(0.5) leftMargin: units.gu(0.5) bottom: parent.bottom } color: theme.palette.normal.base width: parent.width Column { anchors.fill: parent spacing: units.gu(0.5) Label { textSize: Label.Large property var date: new Date() text: "Date: " + date.toLocaleDateString(Qt.locale(root.locale)) } Label { textSize: Label.Large property var date: new Date() text: "Time: " + date.toLocaleTimeString(Qt.locale(root.locale)) } Label { textSize: Label.Large property var dow: Qt.locale(root.locale).firstDayOfWeek text: "First day of week: " + Qt.locale(root.locale).standaloneDayName(dow) } Label { textSize: Label.Large property var num: 10023823 text: "Number: " + num.toLocaleString(Qt.locale(root.locale)) } Label { textSize: Label.Large property var num: 10023823 text: "Currency: " + num.toLocaleCurrencyString(Qt.locale(root.locale)) } } } } } ./examples/locale/locale.desktop0000644000015600001650000000032512700370714017005 0ustar jenkinsjenkins[Desktop Entry] Name=Locale Comment=My project description Exec=qmlscene $@ locale.qml Icon=qmlscene Terminal=false Type=Application X-Ubuntu-Touch=true X-Ubuntu-Gettext-Domain=com.ubuntu.developer.bzoltan.locale ./examples/locale/locale.png0000644000015600001650000011407012700370714016123 0ustar jenkinsjenkinsPNG  IHDR\rfbKGD pHYs B(xtIME 22 IDATx[r\gQ(poGaD% @@UPŧZ'7-D($@a7̕k|{@#7bgf|H;j}I6WnFșufpgUޅmԼq;V<9N2s%c|oVMNZԫjHO^x'k#@d=SEkuMeϝON.ffykd뢴kas4O]COOO8y=ڂ5 87;N3ǬVa@r׉;S}f|.2gSה.p{ Ùxݷ;n8 Y*d}-3 `iɑ k|1<==MdyuzͅXiys'HIrSdYZYו7+33a‚3h b[??+̃RϽVevo;߱ӢKxsCZM}^=Bs扚'~FLxZîZr.n{tt4sԿe0V;z/'⺟|O= tl%3&fL*da epfFk$nc8אi<y][Vi3=3A}zAҧHICT_f)꿹 '/n"Zk/_t>67q R,s^SWY=b$trn=C+bJn Olfu+@@9YfT\|~ @)]m~ZvQEZ$D6a899|߹3Z/ɇ0nlNk0A5~>|Y/Ȏw.]3L0R!B̀e_=~sml6lr]0.q !ZJ{yɻawחˊ*LϲDW-,櫛'oi$)6#=l)憪NxhVb^_CX$G!W-{ `| A!{ٽk`*OGdpz '/!Lsst!g9lIZZ^oq[2զ@6v noowbl(>dޑx` {<>>].?Kd},NZN;Fzd.2eg͑vxr-i2gGnDv9X 3;07sn fBN)1?3e\k<=dy``krp$t Zw 6dEq||<{"TycD)f1#)6yF*,)eXO&K Fkw2e&%6= 7{ k[93׫& dpdG;@&.lH, 2:d7wGN0ٕOO߾}D1X_'Ed\U5$Kř۩(5HivR`HFwn$̉x2h3Ӳ>x:H>%OQq3'e uvlz#Xpt&+ 3j/ Ys呆46Q_Ѝ{ʛcaAq21"g=<{jT~l@iQcbZ[-Фbw؈=cDY#Ʈ%8\A<)v˃z?@%l]c; Tܥr5,emOOOxT#ia(!Ð$% 2uZ`Yf;/Ҝ`LR^ɸ~>EYӉaV0N',SRCyhTeo`|?E>ʞ1SdI"9DpBfD{ ˾>߉ѳE j05:b'wd)@bFN:{C?SbM4;Sk@Fe>3ʴZY=ѳ.I; ZKyM'oCl}l0"fE]i)wRlr X{7͘ L%S~OKt;9âyw炫/;HɛI46m." ix3%U'-S:%s*`--ߟѢ;Yt~߷oߔk;"gn"7! UP^=SpIҪ'ƃ$Y}N{(b)5d {G6N0z$.On. 2qdtN_C2 pl/V Hz)rA0iƠtb%g9Kw zցY,۷o-iܬ^-kM-e  pPYD̙; R_)l 31/o"I6DQl0.a ğaZW3g=1YS4]lZaמM]yMsIAI.6of,:~c )Zַ5aB i3do f'4߁Wdڻq`1i=DǔӨTgX:Y#<10FHPd5HU3"LyĜ hIصORȔѯh |\ J |Y0>2ґIyxdWF= &bZi v\zSuސr`$3{\- rS%Gx32@+Olo[SٱBϯ^9.qHKϠu5&<3c7>3%5fkemӍ&^ ޙ*(AV7vSΞ;ue35$)SL ʍAwxY} rcGb7[fZCF?-\͎SgNu HeY. &}9eWMqiQg&66uG[4i_\D VAXWfXj8 lHtʲײ Dm(#vqҴv5MDWYo=?I&nQP$&[֝d12[,K5*:;ǜXǷa']H&1SPVcMR:] gik%-ÃzxÞ45Us4x 1 s6!ā)2{ gYOg9Ip}|3ec:Y4qGgc Q5Й WҰ4#:ÉL)iXii[**ɕ E:c3-XʣAs3tĐz֯1$Ȏ =M4a%4o.%UwT -\*d^Vɝ΅i5hh,EΤi` 0.߯\uxSQ3yL(T}벎cLvf+C.Yw_t񝴕fډ)P{7dj|0q32Nf>;;ۓgΤC@j(5Q$,k$ӗO(-Yv]| q bN3 Dɨw\uB5C,خ3tryoYˈ[6ݑL)[XXpS"ND,<\5Y noS2KTtxv$ M$b3)&ɏ9tԥ'Ӎd_\\*PiϻѣqRrMdYǓ `Vޣ 7`0v#TIKL%ρ?;))5YQs^RYw!@G-+LMh an継Huj b͸`K&k\Miy3j z"9g k]ia(^gxZMڳ 0x6ּߌܵUsݷ6%FwAN?fW8LmQsQIM|wi[sy [ug;4=']vr]<?TKA5Ñtno-13=M`KRW=G\z5L6:1JZwGTnIq5xߛQm5ɆLچ%KO-IT=מD,ͩc3=hݼ) dO|;54GNfbO?AQpvO!H\Q5Jj2b4y*7 +V}gw?g|xAe΀a IfSw{v&wN<gV g] sp,fbcgcjv4oD*u6s">-X!|hsJ%#*Xiabr+c$u-WHAJ~ E`}ӿ,:ZkƎ#n35& N=#hь-Sb-OΛ>\ tKBQLJO2W@5aތsr&1%oE;Eb ff~ڦ dS~:>#rgdΡy[KgZaxxxU4"YfwTjn8#SL3g?S%2S!ulja&`Ğw^kX9r䕺Sesib&VJY/s:zsm*@s6HVđg2s(5%f$e~s5x X/jQd6N CF2Qn_><<'?-,0qxHgLdzsjN^KKXs2U,S֒'''{vڿg߆aXC~a%삌1-g*OG,zlLXf5̇y\-I3cJu,J/AnO`bƒ2RWM!\̬{n3>Ale1笜v;Js)C~՝/@KcZxR6Z^'ו hb,=;텵{||f3 7G@Aɫ?b "߾}e2~E?KCMm"r;NSueVs\iA IDAT.0s6e6"N\Y$5G jfXcFz*+͎+eptt4&YQeO]wM_sINYjw`um~N [v~?>45ˣ (?\W{خbff5N.=:' ۡ6sӟ G` L/-G oHkRd91&w4JF$ƐD:ܬv͸Al޷۷ɋ_{$,œ3Z1 m'7tGUf4HQ].wHB[z+vR~^gbےIfVԞAxd@~0s|}:ڙI+T#cXՍ9_4?VZl-sZuuu5md)Bϟ >eƕG-u4Ș54@LJ?|0f|_ |3`*54dZb)y&AXQ7Zq3}Ew&v;~a vh2#b&ƚu94_'F&!y"G8Ce`Hd9> :,(L>{\۷yΕ`dw 檳z,ӻ䆵֠vso}Q]~dVJ6蔬 6AD;ϜQ❢RlnLnKRe:'Y zxx| $KCz:^s,c2!*وgĜ[20 -a^AAm9qR' 6[*];'0C#`AyL/ijSZl}|Ky܍FۦΔRRkrQ̚F1kvҵ'K1;gn\puرMsH.|vUa4ac.tR s3Z3L:yMfyc9f]C2^v`CSux2Fud`eɔ٬˗7umnxf4%tlɚ ?"*Y)Xs{{;^|ԝ\pA''ی U,ӳkea[E$&x0;1(1Zi fi \9Ӻ+Lˌo6 rd_Y3eQc3DZj_ud&e<Wž[ym -Q|ظ/fnAڰ1\u2爽l?#E;ov#tGdkʅbd`JߓcQhoP|uRw)l6%N]d3龷mjCUğTjj,ؖdc͟%Zkw,I05F,hoD6"#64&Fԙ\b5$3n2#f.L`E76?cAgSƔXFFXw݌ Bl7مV2|5pXmFN L 3LzPv22x1@yemeL("5s|ب(f | 7 \Ox34._DiNUtr<S6j}6M 0OrvPL[Pl8==,.cp)v0Ça)I/{Vb&S)VF73M'Հֿ+eIXɸc9atw"rڲzxxnnnZ]7o~fP5Q P90;=*Pouyy91E;U+r/{::mhu\g`_Y\ w,O#[e}62~3}"|Ҷ^(Z2v:ez;\lO< K)H:Okkۑngr\;i$7b޿+_P֪4u[&۶/N?$`V'9(8לeɝш#K͙62a T^>>H3gvO~=kvI:y9gv߰R]__޽#`,NW2N03kSL\ ӭ[k957;:Wl>OFCdDdfvVv t&wƲ% G>oLŊdZ{g SLr*On]Vjc=`]'Q.~B#("Ш;"\<13(܋NI`0]86^QK:rԪr/MXbIS>HzH,"OKh  s)_Lˤ|/l.DRu'=AVt4pєG_kmKtyxxP46"kD 888kCfd?+>kf+ f$Xe6qIuߜO[ЩJBE~aXDNcӥ@(fp؉խEf sV[wtƒJ[VÛ7ox :,)O>Ǐў+|ݤʸ9aHq d9a"2\@;q=,[]3Z)$dke\{ 攲n'CEkT:_AwV{"R#[Rf Գ?::NNN&>Z۬U eo]% ܵ,;#zd+ڌ6P<cNމɖ 9Fv"efnnooK}iTyD;_fD9/b^w2V@I 5:sW;??...ԕƦ_t|/6n_jHyLn`^>*| f$ 7tIJ6 lE2JI jSg7s 4LXA|x||t0 wwwsB"VdϹtn˗/Yf /'fN۳ُseK d o!ܦ2#N6vq!fzd/jgvG8%b0 5锻L`~9?(k٭>,L[k7Mr9yf&pvv6DYl(Ꝧԑ뫺Mx?<<< F F~;L3߽h=eիWŅt*OɅsc*lCcgvc{0 v>|yn$?sOYW1 張n I)MƐ{7F1cǽQV j^~=yF_|_~~2( O{zznoo8_^^F{NlcuH2 ƿDߐYcJyBa:U圹bV+mH]///rK[-`K3}fgO(Lќ; =lJMޫ ͟R.Z 0xԦD+߼y3F,bJ/7I}X;4>wj18UfXG$js'Ӷ74K%٥f&0}:2wqϗ|g Q\'[*L:A }~z_6[!իW4''''#'~$ unB/;iAt_&A~ɹ,7،=l&ley ]/0ů.@YUrRҀCjXjy͡fEfiNJ$=܌svL߿WO<l:eoyo޼4yo߾J9wtt4C3 \C̠S RPlZ_޽{7ǣ 7իQV{s=ڵϕ[fuǏ6ʔ|*ln07FV,X |iͺ-44[:Yo>6) [1ly7YC8n]%U8 &pķ ܤ=N"䗿kIsn*i8%RirYli1׽M9țbBz7pѡ/OU@Uh`b:>݀|._mYj L[;|'Ǐ hIfj`{֬ę>??q32C;g샫QU>3gT~t:1H'pq ڈ9TuAVK,Xo2߿~;Ov;r d`R꺘te;-'''٤gb']&BF*L2ze_]cR*Ort]#~gց乁Y~Ӓ/Z?;{򶉜{룓fi|v)%fAwaMLkɐF|xx8}vsB'aLp* JC0*3# T|o 8YYY<}vB¯ ,]vѱHJz=Sme3*`|'Ӳdv4  4n;^f&S(aV_t%4F梳{߾}ڜd5U)4e#\l?g'p~NMVYך_a.ʺ7o;z"fjK ㇺ M,s1JC<;"EoucN߿tNynjceԦXb &TN.yLI2VZO:,sMxN˜jYFz3=S42heͬܐEK˗c""dA9:1*6Ң>}&Mc߹Tt3:muXO7\׭Cm,X|:<<7{|luRb1 5ߌ Jx;r&L)Q^nTA^ H۷ɜDRdI6h=7oLv_u #Aw\I~˔ߘH ]lNc|EA999P22\ ]Mکe՜;HQ,&VsCSi|qg???o޼Q"E%,%d0͘z>;D0x ~zO)Af;irxxx+\C~ f ͿgB1irJ% dVKV_k: +F'Ґͦ9*_lֲu}\NN~)$+Q]բ] S{/ IDAT鲊Ji0?YÕDXVU Y*LAb0)m=0K'} ,:muxx8<<< mʂMV쬦b6Ym.u/˃Zih"G'2`/ceˮDM[ʅk K,ܵ{IA_~Ke\=rg`H7TJwxf%YDf׀@;͢bUזEt%a96~nl5x||O|ٶ ?///CnE1 [JUM[יڳi=;Ɓ?::'یMg0^o߾8Yz/r&K 6b/l)FxZ͙N䟧kLxsDImLu|IDكgZ˙Vo XЪKQn`n PW>:e)3AA&.0~Lo T3R-%k)l$3WvRsc|I<];<1rꭥ\dߛl0e%bmXWU4<#sɬ IR6QނڑNr[|ڛ=Ɔ?qxDE'aleQ>N>?s;¨hVy@9p'?Fȅa&˥2i[f=cFeKCHY::WXG3Tl;k6mF;jGcCvª3&vp,HBcuS`ggҦ~O #PXMbjI4M%N.3?r':ns>A+d.IlX0V['lYIzӉ%J;iTm8&y*8CbK \h녓Er1c{{2`aiYFQGzʡ#̔ y6,+͵Z-ugy(TYfJTHME?20F@gfˍrRnĪjadmlpYK|5OXj$2|+͡s3먿[c'պf1ZL٘PsE9w2'qEiƩLR5 qV*>Kc([$F!CQV8|ymH3F^؏?ƀS_nLhm@*sBܠKUY.SKwʑ/, BaYbTYvb5Nf6?F*PTS߲ȇcщ5UR@SƑcLapʠE=. e@Ǐij1޿L,2,6m mL-RQH,Rps5 ˒dCL;MBJm[&@i i84mre6\9.YM]O6(ݢS+@)X> 1 %eܬکN7cVQypp0/{>SÇ{Az3[q3Pe)Ɩu6+O}r]HPnn(j7fGj`<]`ڜӗ-C,0hw!)O@{2 {;N8#f aeV~gHI<ǙqE0ʀܷojiRMM^JMf"фupg\YUkZgќ;+UMMi7SnLRX}p9+~{˒g9FeCnd=V%矉0-J 2d"Q`a Q&' `Zl*&QegY'i[`6jo'h&df}~; $V&w@"{>xs+dk&3lO5 * 0>݆q9cfΥB3ȧ;r Hh ,d\0H w"{%;fGEzQ-Z%"_DYl&$3 W" ;\<|]:β6YfL0ߛa",CX LZsv)xbHIIJSshdHŊ̒it|l1u|᝶(2xOfC0K BfGOrA)[Tnz5$TDU1x/ͬ8ds}_93=ˮ~"cL!*):Ev ВS"ּT v9Kn~NhL5q=ivґp2U6IjVle\H1uo93°nDxsQr'Y3*[F`5?kN% dW+ґ:9* }5YsKiƩ/_Q!Ɣp3FleKK@X)Ŷ`; ;v.)`L: hc #lɿ r-VP׽^'<0j33#-0;'d`fRJQnΔ]V|l9ʝe2 yŝ%iItlf<m0ԚOb^rCaf9=\t.H4lhc[^zGh1"X7#JezO4IwHP& ,,S\I|V:&{HNncZ0ي҉ֵA^S(ѻFRCDLENj<hhx|/BΔN.cd"Y#G$$ޘ X:ϿYu'?yd~ ro[cmsPobC[ιaXFiY{fH3 #,tZpv;/_())udo}e~~^z`NrT8yh$Y7Xpg0SWPeeQ GaLNНs馵Y7ͤ ՍNJ;ڂB<&]5F1ȧ1p56a $S(:%=X{QYߓɚ_}>oooϟ?OOOOׯGzfi7.e!ÍI^L]DtTfumrX$3 qq z>f3X>...=P7qe899tD~KB3يDYW\yZuƜ3N0f gvdXZ'/].+6cONca&'Β-D-s$$Sl0ue۰ˇԹ$fe"# ZPƺxLci]C& Xzz:G)Tٜ3xCuwzۦxfFAni3@%󱴾?q!fۀΘgE^})յً֮4ڴ:\Np6{f $dDҍ4dnڌ!s:m+ɓP_f\@cܐ_]kx899cɮ\HHp\[=6x%%?R;3|弅|T Yv&&r&rghZfb.ngq1]Tդ b43t^Mʸ-)mԲEfvQ6N,^z5ӦI!1%K#9z5ߏl6bɃ[iTw3!/+n8 K1gK6ͳ\tުSSš&~oN |x]d` 瞱rzzw;D krܼ|؛fL~6ׯ%[YWZ$@ `Yj8K-]CgXVIOuIm6gZkT TFz겏L#-1'ò43Wa&ȅeCW"Z=kG؎Y.vUgG!o 2,N2H/; ĩgƢf nzxr443ImNcG,\דuE 8KTm50؅@E;p]n+Tge }%ͷ,t/5dfg?^4bcaٔڸٛ7ϴfdMV *TeIOޣM[a#do`O[|xED<;!s(իIgNlڹyPC6ٙ2+􃃃QY@' y $QV672H*{DԫU6{=OEk1fr\N(2>zxxe7MZ=Lehٕ0Kw8%I*g#hY!˞H33Wf@F2j|2I6;63+ }%9܄ϸOԀ_&1%6ԃiKzec|!ӥ8[cIIEc {Jf % g0r"uFqjM*J .$X1:/y{̺?3٬My OOOz+X2Yۨ᤬#qxggg~-ѤsZbM`=GaY݃ONNu#tae![VWX9y8@IBB:慿yffB!|e\F5!eo0#z}}wJp@- ᒡFx >f}ɭg*Iw&ȓe^2T7 =7ij ,= sV24biXrӧ~`' Ht;INQ}#CgV $⨑yzKEחikݎ`uXr)el6cL\ A+˔,Hyfx/ F նʹfφ˼ i9䦫MQeGNY6;`*TTa Y]YP|q876\:&8S/([.˛Ouy.aْD*I+~gm@)KH7f’T:)2e8;;MffYZnX-(˅:ﯿKԄY W8|Vd弆:Z>ZhN 'Kߔ^ZLqɠ &Ud,e-ljMBf[mj:)8Nu}Mn|///X~=??^~=|a8???gin.ࣣ׺@D\*7YME:=]}v M'+8Z>%}Q>ݜi-OZ9 8쏲8;fHnUȠ3TƉfۄU/mnz#K9Rlr ɶ,e~:l6 }e{\qd]=F,yd@\nG<)UmY}SKob)ðySgN_^^N8L5e5NgT籎/NyyȋD۷{וdj5:a |'-Y///HEdG.pUv;ϯÍuU]gPA&LYgcaf/\dhiNBWΚ(Ai@Z$ \j5Aɹx2“a,.3C13@pww7<1)F!VlФSdڌov`a IDATۥ+W z||@Rɀk:Tۦ7:p,JLcݛF:Div`|ߴ3ay&#)Ȕ*'M`FЖ1ˀXE4 ^oZ ڵlϟޓrAeWRgvh7ԟ?>< h]e}eIj.Mcx/UfRrKe+Unl]|4\Dbu TevG2F-;3x؃@4ZE:oujeVONc$v^<<<Vhfࡅw D@@+h߇ϟ?OZKdL ~{eEYLDN 3/{8T3aIaї ]Rl#Vظ$;e3XPύW/bH#ЖʲnIr ߾}KU.o޼lI^uHH٭юSG.f2X,(ap>*>|Ƨ9>>>~8e ! MʍXrf|mGl3wu4Wa'$KEq0jf5k#+cVDkt.SIlyFx6,R Eӡ+3#nDt}RΔͦ3ȓ(s1OFJIrssf}v*`3r{nTL'T`܈U}d;͚tfI" <)5J#3EGԲι2EK:/BF4o}NpdI!LAMGHpRNIQ9f,iҹ&PV3˪5jih91e~f6UH|1dR땀)q.6,+6ugY3u1 J2]bj `ͷe#y_6, &nv >,N(Qfl6ϟG ؉Xm] ydt{KWA&($pu71==NNNRi9ʞ쎕G,|5eYu~Z\X/Ot: g4\o2xq. n^v#9_~~:qbgƲ0ώD(Wdñ0|^R $gw 8vׯu&π99%ׅ 2 O^2i8|3աP^K3˴?kXk10Ӌ9+L |Y ck*5b *>92v><|eGѐNrg+~5Qz4pi653Uv ^^^FY'kRi0qvejLzOFhK:  Wj`fK_KLa\߿bKAn^>r9VS Wwyy9q%&К(&gf>L9F)X۫F͚7 qDf5^?>>fŘ5s>OrE(l5'P#s11S22+e@(ɼ4ga1B4Y阍Yt%B׋M{ g'IJ_ɵyjכymb& 3 ׯ_WWW*)Znqlujn}OIa57Nml"2tn.aWȔ9MDbde烃͛7%9yH7J2x@){*, $e!  [.\$X"-$Cٮ)vY_xԋrsP@’\ؼyjLIT471|)K-^'ߺBsYs0j}vi5sO]3k5q%yzzsafʝMtI}\{ֶJMAw(;Q"VEZ6VꬁYi̺ȜA$w:jx*96E}³Y]B5˴3X$摘jS|lb.׌Zfkf¤|l2vؾ.EY*s*p(Kbl}-cF^xY[4c+]~t&S_;xXsWtrL_TeC<*9 ia?(0l4܏ScfPNgb $5qJU{,/<<07l\JG-A&qrsRp2=/"%CV >5Iu%txrNe4\p<92K;K;!c?cptg^ Ů]KIZӓ&BeF~t)=:rR= .}fMAϴ@̌LH&)"AƙFu8R+;V[%6_2 `LK~n׺Ln%y&[w*5|ʞ?>xQZuuuKf/_&~GGcfʌÇ{8a7u;h&yP$a&;8G2dFA:.0}IdFʗ=OF=G3bCIxzz'"(M\v:/Y a^Ç&|܈g.tbIY ePk,mMG2Ek6Aٜw?˗/;0L{MAHrCr2d/ $cb {d@i {=w[̍/+d{`ݎr\+:F ǐYǝu6$]J6Ǐ0:Ce9m R{5ޑN\#ƙ$W`iAŗP> AL;j͚2ìВ/%?4]!'ۗ8l!LgjCOfU;bKA mz?9 ZvrIAiL>5 #O:۽I.d/2ݵys =S.ԆXB)7OiN#6.:Lh ^Vnk {hRy8?? f1%Y#իWÇ4Oʶ );bv#0. ;I* #FletQ[T>'En>>>N5 mLF]0X7r|gq?;ʭe_:W$Cy{w٥eg6aZQ PXv7GUq+23z< n۴ K988" &%#AM:C dEplUe/6E8 *ģoۤ1$4$U"^m\;q0a65eLWd^W'x%F3ԕ*ĵ\A] zۭN+r3ʌ~qAuSlsg`}ݐ hq'~WIBFcNtmHC^ywwwÏ?S)&kxsx!THs2S+49djy?t`>3аq_u:ǖLN˿ t:KeHDf ξ|7l! \Fh>LsV<>>5+K8<0Qt͡YuF81߂3ZVnnmvkY 1fԵH<7\DnFќ_^^>-2 R7JmQRrSu}3&g͞2ImYm0ş Uh439\j7{nس=M Vd^$Pl;>UМNsnMׯ_OƇ d", &mD&s)"c4)b՘ E7kϟw2逢Ǩɇidƀu)TPYtusN62! z?13eJKIZ ^:M9:yrdFrf=gfckLS2jK'mA)h4b}}gKfhŪkOPǏfٓM[J&hB͍E cnf@%]l8??\a%PI6.p:05׵@3ck$~.Ft\j R PO|XD9#B'oB$t]o YkPT:v.O4vͅ#xrqцְ.sIEV材2T s Lֺź~goCF3wcrHm;|(3y]Ǭ2Q+Cm) 0&,~G/lXmV)ȗXݰlt22O#tXT&6n;BfI"~+$KZfIL˯(` 3IS:<朘XѓѸUuO2RPmVN|l&Y=(Rz-B7`d ?f ɓl!"Rc9(C aFw3✆O;;;1gXu(NKñQ6gB$kѿ2=;[w1u69ײM2\ş` =6" k/I!Tgg+p~v\JOķfExxx8hȺ8  W f\ &Z~Wħ: emm~&Ć~v:J30 ZZ*aofbLӸ12K Sٹ 2v ,~?UmOuasٚ!)c2 3"N|Nf>۴guMfTqWPM7Yzf֑֜aaY 7;l;`ka3eHSYBj4 =0I+m2]O95!x:;(3@rZ ??fĞ0_pּ4j4sUyh^u$*ZVn#1H:cƓmܤ gpYF 6 SYr-eڡjl_3Fu%2N6d_N2s(N`s\vu79q3w5uP.4*ggS8cI $'2-Ό؉VJ}dM޽i,̰ڦ:Xk7F,b59Otn|A|@Fdji[𬹈TzĹvzfxtt4MR9vJLI3SbBKa_ASmZs | rȇQ=''=Xa&uL"MkN[6qmXr&]$xh>@_6,ۭ@li1 `\E^yeM57'#v7(Pf[E5A-fbUN06$~OY~ܟ3|٥.^?5$E{vf-ɖ_]hUkӀIwnXX<=LtQE6Ն" zzzg I~ɔ&d$zaٳK{1/9ڜfRJ୛ `-ۆls %@f IDATmN%6l)e+K1ד13RN$sa:>ݔر~c\N-8,OL'9^t'miϳzM eչ"`;.0jj\_x*5p3kN;mf)MJlUOO )gw>ON˺7a^ا l8Q$?jo;lN 20&nsS 6hN`B|<2;5; (g4LY2$Sp >U$fAYyΥM,wd)'OfOS&֞w :ПWf>Rn]zߟ"d2PU- Dl02rTv¢?ZNOO=)9mz.c9&trSZﷲf3AM=F,~qJeG#<,ĉ=lA2SH}dE'j")ݜiAğ_3k\5&:FN}߿C2J930Kr*̻dFr"2Ѱm<={jL@B^4B0}8(_A|D9U/~5QǕ2tign>,]n+2}fH~Y,ިqj keY}l{"4_ffd'ZKB3.#='R)tXOiX !,M(F$蜙 L^Ոm6arD 'iFEtac}%w#%Jdm?3` 2U:l'7Fz tS30Tښz?3ELh '$GY!XjJ;M[ AJt: /IV&ׂ@㞩kr㪲0Ze0vpP&A0\x!268Uk_"$$Uus?ߏƦRRDvs$jj5xDdY'Qv٬%Ƹ]̬g0-n Tq2Si 04$L LP&ΡD:-(/7jD~'i]IE҉(K2d,'v8~oue}[t:)h΋P'`KnݓO+@lXE#9g Dd&@ 0f^8DTe$d ;Sb dY N W: 5dn*l +P͔2Ԫ![b&Qw67%ujn)-]qy]Jjx 7|8ZE% U,I^kn+ve9чkl$*${3V bITu#gցFFqd4oYJ؀hѓ1I9 8UVA-A&gfU>&kbӌ]2NeUq JK)K85u*g&ٽ5|Տyׯ_o|qg}駩?IY׿YYYf//{eYp%mYŋҴpаK}>q*i,`R)2qM˜k_o5j󗆟59+^ ~AV\YTI~`Q:WW ǴS LT)K_u]Wlӓy]NF{kINo7vib3a)\B|dflj *=J{hF8FONze'-*=0 >d]O3Ȓ.otsIߞ׸u&Cxx>_֒/j~zJ[5<%).3lzL}ݧ؆zFQ}6c9i1f"N?aSrI&&ӣ1?H~ g.T\m6'w\|"(fJt} rފ2ܘhM2rym @K~j𹽽M~5[ &AN4&^>c/rS b8CØ'bĵyմp]6uO][-Ӈj"j4~Oc\ejٳ=5}SR`[]\c'/n?ܐ4g (F ~g)'cB,܎W5 Ge`%#p5Lr  !R]3aH vo~!=!szΘFxE^q~l\`8RΈUOܙF\ͱ+ @#)OYrUGZ̜GngWWWyj{Vo* SQS4&CFsMxl-3MbuS% ks>̅I/0Im2^/7?.Mqgyr^6Ƥ줯Ϲ;}ςbxcB<0 sOeIʠT'&Ws8~0v<̜Nr "w޷Rwۇ,ũ p+%TS̍^?9Vcmӕ^:(wy \Xw{3,s7ULde_&D0ks jЫ<իW"f\⏳SI}e/Mz-zS=+Tc1HoV.X9.ܼTӘQmLTԨt5m5$ #ϵdOP&aI'3wL҆d%7G˩F0Q)r}V)Ě{lTR-~id f???М :Xh).:+eǧG9aqS`Û:!]L'I.&$iaq}S`AIf8Q^˥[ABߓRd[J8'0T{Y+;xh^:T&j̢Rb]odt LCcplZ&}UY'4#k0ɋO)bŷ}1\KSKh)K) L-еH-feT E oj@QlArsOY$eVE6jg61ޖbĔʟ}rf-)p\x'/jB1?͌_@Uq0'`1-TNps鸞B:Z' `SnUkO_Y)2tIoĸ]V7Ϋ>S|wwww#ĻMe}~~ul5,Zfa#)LlJLoP_egi7fό0ՠMMJ`BUV L?Vˀ_LA[3TӢ+44XzrD}/sP(?{/^ݛ7oՍz :}ﴼO^; IENDB`./examples/locale/locale.apparmor0000644000015600001650000000007712700370714017161 0ustar jenkinsjenkins{ "policy_groups": [ ], "policy_version": 1.3 } ./examples/locale/locale.pro0000644000015600001650000000227612700370714016143 0ustar jenkinsjenkinsTEMPLATE = subdirs #load Ubuntu specific features load(ubuntu-click) # specify the manifest file, this file is required for click # packaging and for the IDE to create runconfigurations UBUNTU_MANIFEST_FILE=manifest.json.in TARGET = locale QML_FILES += $$files(*.qml,true) \ $$files(*.js,true) CONF_FILES += $${TARGET}.apparmor \ $${TARGET}.png OTHER_FILES += $${CONF_FILES} \ $${QML_FILES} \ $${TARGET}.desktop #specify where the qml/js files are installed to qml_files.path = / qml_files.files += $${QML_FILES} #specify where the config files are installed to config_files.path = / config_files.files += $${CONF_FILES} #install the desktop file, a translated version is #automatically created in the build directory desktop_file.path = / desktop_file.files = $${TARGET}.desktop desktop_file.CONFIG += no_check_exist exists($$PWD/../examples.pro) { desktop_file.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/$${TARGET} config_files.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/$${TARGET} qml_files.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/$${TARGET} } INSTALLS+=config_files qml_files desktop_file ./examples/jokes/0000755000015600001650000000000012700370716014031 5ustar jenkinsjenkins./examples/jokes/jokes.qml0000644000015600001650000000737612700370714015672 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.0 import Ubuntu.Components 1.3 import QtMultimedia 5.0 /*! \brief A Joke Downloader Page for Examples Gallery Connects to an online service which returns a json from which the joke is parsed into a Label. Demonstrates following: - ActivityIndicator - UbuntuShape - Label - i18n Uses: - QtMultimedia / SoundEffect - QML State */ MainView { // objectName for functional testing purposes (autopilot-qt5) objectName: "mainView" // Note! applicationName needs to match the .desktop filename applicationName: "jokes" /* This property enables the application to change orientation when the device is rotated. The default is false. */ automaticOrientation: true width: units.gu(100) height: units.gu(75) id: page property string url : "http://api.icndb.com/jokes/random?limitTo=[nerdy,explicit]"; readonly property string _stateLoading : "Loading" readonly property string _stateNormal : "Normal" function getJoke() { laugh.stop(); var xhr = new XMLHttpRequest(); xhr.open("GET",url,true); xhr.onreadystatechange = function() { if ( xhr.readyState === xhr.DONE) { if ( xhr.status === 200) { try { var obj = JSON.parse(xhr.responseText); if (obj.type === "success") { jokeHolder.text = obj.value.joke; page.state = page._stateNormal; laugh.play(); } } catch (e) { getJoke(); } } } } xhr.send(); } SoundEffect { id: laugh source: "jokes.wav" } UbuntuShape { color: Theme.palette.normal.base radius: "medium" anchors.centerIn: parent anchors.margins: units.gu(10) anchors.fill: parent ActivityIndicator { id: activityIndicator anchors.centerIn: parent running: true visible: false } Label { id: jokeHolder anchors.fill: parent text: "Tap here!" textSize: Label.Large color: Theme.palette.normal.baseText textFormat: Text.RichText horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter wrapMode: TextInput.WrapAtWordBoundaryOrAnywhere } } MouseArea { anchors.fill: parent onClicked: { page.state = page._stateLoading; page.getJoke(); } } states: [ State { name: page._stateNormal PropertyChanges { target: activityIndicator; visible: false} PropertyChanges { target: jokeHolder; visible: true} }, State { name: page._stateLoading PropertyChanges { target: activityIndicator; visible: true} PropertyChanges { target: jokeHolder; visible: false} } ] } ./examples/jokes/manifest.json.in0000644000015600001650000000063312700370714017137 0ustar jenkinsjenkins{ "name": "jokes.bzoltan", "description": "Example application of the Ubuntu UI Toolkit - Jokes", "architecture": "@CLICK_ARCH@", "title": "Jokes", "hooks": { "jokes": { "apparmor": "jokes.apparmor", "desktop": "jokes.desktop" } }, "version": "0.1", "maintainer": "Zoltán Balogh ", "framework": "ubuntu-sdk-15.04" } ./examples/jokes/jokes.pro0000644000015600001650000000232612700370714015667 0ustar jenkinsjenkinsTEMPLATE = subdirs #load Ubuntu specific features load(ubuntu-click) # specify the manifest file, this file is required for click # packaging and for the IDE to create runconfigurations UBUNTU_MANIFEST_FILE=manifest.json.in TARGET = jokes QML_FILES += $$files(*.qml,true) \ $$files(*.js,true) CONF_FILES += $${TARGET}.apparmor \ $${TARGET}.png \ $${TARGET}.wav OTHER_FILES += $${CONF_FILES} \ $${QML_FILES} \ $${TARGET}.desktop #specify where the qml/js files are installed to qml_files.path = / qml_files.files += $${QML_FILES} #specify where the config files are installed to config_files.path = / config_files.files += $${CONF_FILES} #install the desktop file, a translated version is #automatically created in the build directory desktop_file.path = / desktop_file.files = $${TARGET}.desktop desktop_file.CONFIG += no_check_exist exists($$PWD/../examples.pro) { desktop_file.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/$${TARGET} config_files.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/$${TARGET} qml_files.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/$${TARGET} } INSTALLS+=config_files qml_files desktop_file ./examples/jokes/jokes.png0000644000015600001650000011407012700370714015653 0ustar jenkinsjenkinsPNG  IHDR\rfbKGD pHYs B(xtIME 22 IDATx[r\gQ(poGaD% @@UPŧZ'7-D($@a7̕k|{@#7bgf|H;j}I6WnFșufpgUޅmԼq;V<9N2s%c|oVMNZԫjHO^x'k#@d=SEkuMeϝON.ffykd뢴kas4O]COOO8y=ڂ5 87;N3ǬVa@r׉;S}f|.2gSה.p{ Ùxݷ;n8 Y*d}-3 `iɑ k|1<==MdyuzͅXiys'HIrSdYZYו7+33a‚3h b[??+̃RϽVevo;߱ӢKxsCZM}^=Bs扚'~FLxZîZr.n{tt4sԿe0V;z/'⺟|O= tl%3&fL*da epfFk$nc8אi<y][Vi3=3A}zAҧHICT_f)꿹 '/n"Zk/_t>67q R,s^SWY=b$trn=C+bJn Olfu+@@9YfT\|~ @)]m~ZvQEZ$D6a899|߹3Z/ɇ0nlNk0A5~>|Y/Ȏw.]3L0R!B̀e_=~sml6lr]0.q !ZJ{yɻawחˊ*LϲDW-,櫛'oi$)6#=l)憪NxhVb^_CX$G!W-{ `| A!{ٽk`*OGdpz '/!Lsst!g9lIZZ^oq[2զ@6v noowbl(>dޑx` {<>>].?Kd},NZN;Fzd.2eg͑vxr-i2gGnDv9X 3;07sn fBN)1?3e\k<=dy``krp$t Zw 6dEq||<{"TycD)f1#)6yF*,)eXO&K Fkw2e&%6= 7{ k[93׫& dpdG;@&.lH, 2:d7wGN0ٕOO߾}D1X_'Ed\U5$Kř۩(5HivR`HFwn$̉x2h3Ӳ>x:H>%OQq3'e uvlz#Xpt&+ 3j/ Ys呆46Q_Ѝ{ʛcaAq21"g=<{jT~l@iQcbZ[-Фbw؈=cDY#Ʈ%8\A<)v˃z?@%l]c; Tܥr5,emOOOxT#ia(!Ð$% 2uZ`Yf;/Ҝ`LR^ɸ~>EYӉaV0N',SRCyhTeo`|?E>ʞ1SdI"9DpBfD{ ˾>߉ѳE j05:b'wd)@bFN:{C?SbM4;Sk@Fe>3ʴZY=ѳ.I; ZKyM'oCl}l0"fE]i)wRlr X{7͘ L%S~OKt;9âyw炫/;HɛI46m." ix3%U'-S:%s*`--ߟѢ;Yt~߷oߔk;"gn"7! UP^=SpIҪ'ƃ$Y}N{(b)5d {G6N0z$.On. 2qdtN_C2 pl/V Hz)rA0iƠtb%g9Kw zցY,۷o-iܬ^-kM-e  pPYD̙; R_)l 31/o"I6DQl0.a ğaZW3g=1YS4]lZaמM]yMsIAI.6of,:~c )Zַ5aB i3do f'4߁Wdڻq`1i=DǔӨTgX:Y#<10FHPd5HU3"LyĜ hIصORȔѯh |\ J |Y0>2ґIyxdWF= &bZi v\zSuސr`$3{\- rS%Gx32@+Olo[SٱBϯ^9.qHKϠu5&<3c7>3%5fkemӍ&^ ޙ*(AV7vSΞ;ue35$)SL ʍAwxY} rcGb7[fZCF?-\͎SgNu HeY. &}9eWMqiQg&66uG[4i_\D VAXWfXj8 lHtʲײ Dm(#vqҴv5MDWYo=?I&nQP$&[֝d12[,K5*:;ǜXǷa']H&1SPVcMR:] gik%-ÃzxÞ45Us4x 1 s6!ā)2{ gYOg9Ip}|3ec:Y4qGgc Q5Й WҰ4#:ÉL)iXii[**ɕ E:c3-XʣAs3tĐz֯1$Ȏ =M4a%4o.%UwT -\*d^Vɝ΅i5hh,EΤi` 0.߯\uxSQ3yL(T}벎cLvf+C.Yw_t񝴕fډ)P{7dj|0q32Nf>;;ۓgΤC@j(5Q$,k$ӗO(-Yv]| q bN3 Dɨw\uB5C,خ3tryoYˈ[6ݑL)[XXpS"ND,<\5Y noS2KTtxv$ M$b3)&ɏ9tԥ'Ӎd_\\*PiϻѣqRrMdYǓ `Vޣ 7`0v#TIKL%ρ?;))5YQs^RYw!@G-+LMh an継Huj b͸`K&k\Miy3j z"9g k]ia(^gxZMڳ 0x6ּߌܵUsݷ6%FwAN?fW8LmQsQIM|wi[sy [ug;4=']vr]<?TKA5Ñtno-13=M`KRW=G\z5L6:1JZwGTnIq5xߛQm5ɆLچ%KO-IT=מD,ͩc3=hݼ) dO|;54GNfbO?AQpvO!H\Q5Jj2b4y*7 +V}gw?g|xAe΀a IfSw{v&wN<gV g] sp,fbcgcjv4oD*u6s">-X!|hsJ%#*Xiabr+c$u-WHAJ~ E`}ӿ,:ZkƎ#n35& N=#hь-Sb-OΛ>\ tKBQLJO2W@5aތsr&1%oE;Eb ff~ڦ dS~:>#rgdΡy[KgZaxxxU4"YfwTjn8#SL3g?S%2S!ulja&`Ğw^kX9r䕺Sesib&VJY/s:zsm*@s6HVđg2s(5%f$e~s5x X/jQd6N CF2Qn_><<'?-,0qxHgLdzsjN^KKXs2U,S֒'''{vڿg߆aXC~a%삌1-g*OG,zlLXf5̇y\-I3cJu,J/AnO`bƒ2RWM!\̬{n3>Ale1笜v;Js)C~՝/@KcZxR6Z^'ו hb,=;텵{||f3 7G@Aɫ?b "߾}e2~E?KCMm"r;NSueVs\iA IDAT.0s6e6"N\Y$5G jfXcFz*+͎+eptt4&YQeO]wM_sINYjw`um~N [v~?>45ˣ (?\W{خbff5N.=:' ۡ6sӟ G` L/-G oHkRd91&w4JF$ƐD:ܬv͸Al޷۷ɋ_{$,œ3Z1 m'7tGUf4HQ].wHB[z+vR~^gbےIfVԞAxd@~0s|}:ڙI+T#cXՍ9_4?VZl-sZuuu5md)Bϟ >eƕG-u4Ș54@LJ?|0f|_ |3`*54dZb)y&AXQ7Zq3}Ew&v;~a vh2#b&ƚu94_'F&!y"G8Ce`Hd9> :,(L>{\۷yΕ`dw 檳z,ӻ䆵֠vso}Q]~dVJ6蔬 6AD;ϜQ❢RlnLnKRe:'Y zxx| $KCz:^s,c2!*وgĜ[20 -a^AAm9qR' 6[*];'0C#`AyL/ijSZl}|Ky܍FۦΔRRkrQ̚F1kvҵ'K1;gn\puرMsH.|vUa4ac.tR s3Z3L:yMfyc9f]C2^v`CSux2Fud`eɔ٬˗7umnxf4%tlɚ ?"*Y)Xs{{;^|ԝ\pA''ی U,ӳkea[E$&x0;1(1Zi fi \9Ӻ+Lˌo6 rd_Y3eQc3DZj_ud&e<Wž[ym -Q|ظ/fnAڰ1\u2爽l?#E;ov#tGdkʅbd`JߓcQhoP|uRw)l6%N]d3龷mjCUğTjj,ؖdc͟%Zkw,I05F,hoD6"#64&Fԙ\b5$3n2#f.L`E76?cAgSƔXFFXw݌ Bl7مV2|5pXmFN L 3LzPv22x1@yemeL("5s|ب(f | 7 \Ox34._DiNUtr<S6j}6M 0OrvPL[Pl8==,.cp)v0Ça)I/{Vb&S)VF73M'Հֿ+eIXɸc9atw"rڲzxxnnnZ]7o~fP5Q P90;=*Pouyy91E;U+r/{::mhu\g`_Y\ w,O#[e}62~3}"|Ҷ^(Z2v:ez;\lO< K)H:Okkۑngr\;i$7b޿+_P֪4u[&۶/N?$`V'9(8לeɝш#K͙62a T^>>H3gvO~=kvI:y9gv߰R]__޽#`,NW2N03kSL\ ӭ[k957;:Wl>OFCdDdfvVv t&wƲ% G>oLŊdZ{g SLr*On]Vjc=`]'Q.~B#("Ш;"\<13(܋NI`0]86^QK:rԪr/MXbIS>HzH,"OKh  s)_Lˤ|/l.DRu'=AVt4pєG_kmKtyxxP46"kD 888kCfd?+>kf+ f$Xe6qIuߜO[ЩJBE~aXDNcӥ@(fp؉խEf sV[wtƒJ[VÛ7ox :,)O>Ǐў+|ݤʸ9aHq d9a"2\@;q=,[]3Z)$dke\{ 攲n'CEkT:_AwV{"R#[Rf Գ?::NNN&>Z۬U eo]% ܵ,;#zd+ڌ6P<cNމɖ 9Fv"efnnooK}iTyD;_fD9/b^w2V@I 5:sW;??...ԕƦ_t|/6n_jHyLn`^>*| f$ 7tIJ6 lE2JI jSg7s 4LXA|x||t0 wwwsB"VdϹtn˗/Yf /'fN۳ُseK d o!ܦ2#N6vq!fzd/jgvG8%b0 5锻L`~9?(k٭>,L[k7Mr9yf&pvv6DYl(Ꝧԑ뫺Mx?<<< F F~;L3߽h=eիWŅt*OɅsc*lCcgvc{0 v>|yn$?sOYW1 張n I)MƐ{7F1cǽQV j^~=yF_|_~~2( O{zznoo8_^^F{NlcuH2 ƿDߐYcJyBa:U圹bV+mH]///rK[-`K3}fgO(Lќ; =lJMޫ ͟R.Z 0xԦD+߼y3F,bJ/7I}X;4>wj18UfXG$js'Ӷ74K%٥f&0}:2wqϗ|g Q\'[*L:A }~z_6[!իW4''''#'~$ unB/;iAt_&A~ɹ,7،=l&ley ]/0ů.@YUrRҀCjXjy͡fEfiNJ$=܌svL߿WO<l:eoyo޼4yo߾J9wtt4C3 \C̠S RPlZ_޽{7ǣ 7իQV{s=ڵϕ[fuǏ6ʔ|*ln07FV,X |iͺ-44[:Yo>6) [1ly7YC8n]%U8 &pķ ܤ=N"䗿kIsn*i8%RirYli1׽M9țbBz7pѡ/OU@Uh`b:>݀|._mYj L[;|'Ǐ hIfj`{֬ę>??q32C;g샫QU>3gT~t:1H'pq ڈ9TuAVK,Xo2߿~;Ov;r d`R꺘te;-'''٤gb']&BF*L2ze_]cR*Ort]#~gց乁Y~Ӓ/Z?;{򶉜{룓fi|v)%fAwaMLkɐF|xx8}vsB'aLp* JC0*3# T|o 8YYY<}vB¯ ,]vѱHJz=Sme3*`|'Ӳdv4  4n;^f&S(aV_t%4F梳{߾}ڜd5U)4e#\l?g'p~NMVYך_a.ʺ7o;z"fjK ㇺ M,s1JC<;"EoucN߿tNynjceԦXb &TN.yLI2VZO:,sMxN˜jYFz3=S42heͬܐEK˗c""dA9:1*6Ң>}&Mc߹Tt3:muXO7\׭Cm,X|:<<7{|luRb1 5ߌ Jx;r&L)Q^nTA^ H۷ɜDRdI6h=7oLv_u #Aw\I~˔ߘH ]lNc|EA999P22\ ]Mکe՜;HQ,&VsCSi|qg???o޼Q"E%,%d0͘z>;D0x ~zO)Af;irxxx+\C~ f ͿgB1irJ% dVKV_k: +F'Ґͦ9*_lֲu}\NN~)$+Q]բ] S{/ IDAT鲊Ji0?YÕDXVU Y*LAb0)m=0K'} ,:muxx8<<< mʂMV쬦b6Ym.u/˃Zih"G'2`/ceˮDM[ʅk K,ܵ{IA_~Ke\=rg`H7TJwxf%YDf׀@;͢bUזEt%a96~nl5x||O|ٶ ?///CnE1 [JUM[יڳi=;Ɓ?::'یMg0^o߾8Yz/r&K 6b/l)FxZ͙N䟧kLxsDImLu|IDكgZ˙Vo XЪKQn`n PW>:e)3AA&.0~Lo T3R-%k)l$3WvRsc|I<];<1rꭥ\dߛl0e%bmXWU4<#sɬ IR6QނڑNr[|ڛ=Ɔ?qxDE'aleQ>N>?s;¨hVy@9p'?Fȅa&˥2i[f=cFeKCHY::WXG3Tl;k6mF;jGcCvª3&vp,HBcuS`ggҦ~O #PXMbjI4M%N.3?r':ns>A+d.IlX0V['lYIzӉ%J;iTm8&y*8CbK \h녓Er1c{{2`aiYFQGzʡ#̔ y6,+͵Z-ugy(TYfJTHME?20F@gfˍrRnĪjadmlpYK|5OXj$2|+͡s3먿[c'պf1ZL٘PsE9w2'qEiƩLR5 qV*>Kc([$F!CQV8|ymH3F^؏?ƀS_nLhm@*sBܠKUY.SKwʑ/, BaYbTYvb5Nf6?F*PTS߲ȇcщ5UR@SƑcLapʠE=. e@Ǐij1޿L,2,6m mL-RQH,Rps5 ˒dCL;MBJm[&@i i84mre6\9.YM]O6(ݢS+@)X> 1 %eܬکN7cVQypp0/{>SÇ{Az3[q3Pe)Ɩu6+O}r]HPnn(j7fGj`<]`ڜӗ-C,0hw!)O@{2 {;N8#f aeV~gHI<ǙqE0ʀܷojiRMM^JMf"фupg\YUkZgќ;+UMMi7SnLRX}p9+~{˒g9FeCnd=V%矉0-J 2d"Q`a Q&' `Zl*&QegY'i[`6jo'h&df}~; $V&w@"{>xs+dk&3lO5 * 0>݆q9cfΥB3ȧ;r Hh ,d\0H w"{%;fGEzQ-Z%"_DYl&$3 W" ;\<|]:β6YfL0ߛa",CX LZsv)xbHIIJSshdHŊ̒it|l1u|᝶(2xOfC0K BfGOrA)[Tnz5$TDU1x/ͬ8ds}_93=ˮ~"cL!*):Ev ВS"ּT v9Kn~NhL5q=ivґp2U6IjVle\H1uo93°nDxsQr'Y3*[F`5?kN% dW+ґ:9* }5YsKiƩ/_Q!Ɣp3FleKK@X)Ŷ`; ;v.)`L: hc #lɿ r-VP׽^'<0j33#-0;'d`fRJQnΔ]V|l9ʝe2 yŝ%iItlf<m0ԚOb^rCaf9=\t.H4lhc[^zGh1"X7#JezO4IwHP& ,,S\I|V:&{HNncZ0ي҉ֵA^S(ѻFRCDLENj<hhx|/BΔN.cd"Y#G$$ޘ X:ϿYu'?yd~ ro[cmsPobC[ιaXFiY{fH3 #,tZpv;/_())udo}e~~^z`NrT8yh$Y7Xpg0SWPeeQ GaLNНs馵Y7ͤ ՍNJ;ڂB<&]5F1ȧ1p56a $S(:%=X{QYߓɚ_}>oooϟ?OOOOׯGzfi7.e!ÍI^L]DtTfumrX$3 qq z>f3X>...=P7qe899tD~KB3يDYW\yZuƜ3N0f gvdXZ'/].+6cONca&'Β-D-s$$Sl0ue۰ˇԹ$fe"# ZPƺxLci]C& Xzz:G)Tٜ3xCuwzۦxfFAni3@%󱴾?q!fۀΘgE^})յً֮4ڴ:\Np6{f $dDҍ4dnڌ!s:m+ɓP_f\@cܐ_]kx899cɮ\HHp\[=6x%%?R;3|弅|T Yv&&r&rghZfb.ngq1]Tդ b43t^Mʸ-)mԲEfvQ6N,^z5ӦI!1%K#9z5ߏl6bɃ[iTw3!/+n8 K1gK6ͳ\tުSSš&~oN |x]d` 瞱rzzw;D krܼ|؛fL~6ׯ%[YWZ$@ `Yj8K-]CgXVIOuIm6gZkT TFz겏L#-1'ò43Wa&ȅeCW"Z=kG؎Y.vUgG!o 2,N2H/; ĩgƢf nzxr443ImNcG,\דuE 8KTm50؅@E;p]n+Tge }%ͷ,t/5dfg?^4bcaٔڸٛ7ϴfdMV *TeIOޣM[a#do`O[|xED<;!s(իIgNlڹyPC6ٙ2+􃃃QY@' y $QV672H*{DԫU6{=OEk1fr\N(2>zxxe7MZ=Lehٕ0Kw8%I*g#hY!˞H33Wf@F2j|2I6;63+ }%9܄ϸOԀ_&1%6ԃiKzec|!ӥ8[cIIEc {Jf % g0r"uFqjM*J .$X1:/y{̺?3٬My OOOz+X2Yۨ᤬#qxggg~-ѤsZbM`=GaY݃ONNu#tae![VWX9y8@IBB:慿yffB!|e\F5!eo0#z}}wJp@- ᒡFx >f}ɭg*Iw&ȓe^2T7 =7ij ,= sV24biXrӧ~`' Ht;INQ}#CgV $⨑yzKEחikݎ`uXr)el6cL\ A+˔,Hyfx/ F նʹfφ˼ i9䦫MQeGNY6;`*TTa Y]YP|q876\:&8S/([.˛Ouy.aْD*I+~gm@)KH7f’T:)2e8;;MffYZnX-(˅:ﯿKԄY W8|Vd弆:Z>ZhN 'Kߔ^ZLqɠ &Ud,e-ljMBf[mj:)8Nu}Mn|///X~=??^~=|a8???gin.ࣣ׺@D\*7YME:=]}v M'+8Z>%}Q>ݜi-OZ9 8쏲8;fHnUȠ3TƉfۄU/mnz#K9Rlr ɶ,e~:l6 }e{\qd]=F,yd@\nG<)UmY}SKob)ðySgN_^^N8L5e5NgT籎/NyyȋD۷{וdj5:a |'-Y///HEdG.pUv;ϯÍuU]gPA&LYgcaf/\dhiNBWΚ(Ai@Z$ \j5Aɹx2“a,.3C13@pww7<1)F!VlФSdڌov`a IDATۥ+W z||@Rɀk:Tۦ7:p,JLcݛF:Div`|ߴ3ay&#)Ȕ*'M`FЖ1ˀXE4 ^oZ ڵlϟޓrAeWRgvh7ԟ?>< h]e}eIj.Mcx/UfRrKe+Unl]|4\Dbu TevG2F-;3x؃@4ZE:oujeVONc$v^<<<Vhfࡅw D@@+h߇ϟ?OZKdL ~{eEYLDN 3/{8T3aIaї ]Rl#Vظ$;e3XPύW/bH#ЖʲnIr ߾}KU.o޼lI^uHH٭юSG.f2X,(ap>*>|Ƨ9>>>~8e ! MʍXrf|mGl3wu4Wa'$KEq0jf5k#+cVDkt.SIlyFx6,R Eӡ+3#nDt}RΔͦ3ȓ(s1OFJIrssf}v*`3r{nTL'T`܈U}d;͚tfI" <)5J#3EGԲι2EK:/BF4o}NpdI!LAMGHpRNIQ9f,iҹ&PV3˪5jih91e~f6UH|1dR땀)q.6,+6ugY3u1 J2]bj `ͷe#y_6, &nv >,N(Qfl6ϟG ؉Xm] ydt{KWA&($pu71==NNNRi9ʞ쎕G,|5eYu~Z\X/Ot: g4\o2xq. n^v#9_~~:qbgƲ0ώD(Wdñ0|^R $gw 8vׯu&π99%ׅ 2 O^2i8|3աP^K3˴?kXk10Ӌ9+L |Y ck*5b *>92v><|eGѐNrg+~5Qz4pi653Uv ^^^FY'kRi0qvejLzOFhK:  Wj`fK_KLa\߿bKAn^>r9VS Wwyy9q%&К(&gf>L9F)X۫F͚7 qDf5^?>>fŘ5s>OrE(l5'P#s11S22+e@(ɼ4ga1B4Y阍Yt%B׋M{ g'IJ_ɵyjכymb& 3 ׯ_WWW*)Znqlujn}OIa57Nml"2tn.aWȔ9MDbde烃͛7%9yH7J2x@){*, $e!  [.\$X"-$Cٮ)vY_xԋrsP@’\ؼyjLIT471|)K-^'ߺBsYs0j}vi5sO]3k5q%yzzsafʝMtI}\{ֶJMAw(;Q"VEZ6VꬁYi̺ȜA$w:jx*96E}³Y]B5˴3X$摘jS|lb.׌Zfkf¤|l2vؾ.EY*s*p(Kbl}-cF^xY[4c+]~t&S_;xXsWtrL_TeC<*9 ia?(0l4܏ScfPNgb $5qJU{,/<<07l\JG-A&qrsRp2=/"%CV >5Iu%txrNe4\p<92K;K;!c?cptg^ Ů]KIZӓ&BeF~t)=:rR= .}fMAϴ@̌LH&)"AƙFu8R+;V[%6_2 `LK~n׺Ln%y&[w*5|ʞ?>xQZuuuKf/_&~GGcfʌÇ{8a7u;h&yP$a&;8G2dFA:.0}IdFʗ=OF=G3bCIxzz'"(M\v:/Y a^Ç&|܈g.tbIY ePk,mMG2Ek6Aٜw?˗/;0L{MAHrCr2d/ $cb {d@i {=w[̍/+d{`ݎr\+:F ǐYǝu6$]J6Ǐ0:Ce9m R{5ޑN\#ƙ$W`iAŗP> AL;j͚2ìВ/%?4]!'ۗ8l!LgjCOfU;bKA mz?9 ZvrIAiL>5 #O:۽I.d/2ݵys =S.ԆXB)7OiN#6.:Lh ^Vnk {hRy8?? f1%Y#իWÇ4Oʶ );bv#0. ;I* #FletQ[T>'En>>>N5 mLF]0X7r|gq?;ʭe_:W$Cy{w٥eg6aZQ PXv7GUq+23z< n۴ K988" &%#AM:C dEplUe/6E8 *ģoۤ1$4$U"^m\;q0a65eLWd^W'x%F3ԕ*ĵ\A] zۭN+r3ʌ~qAuSlsg`}ݐ hq'~WIBFcNtmHC^ywwwÏ?S)&kxsx!THs2S+49djy?t`>3аq_u:ǖLN˿ t:KeHDf ξ|7l! \Fh>LsV<>>5+K8<0Qt͡YuF81߂3ZVnnmvkY 1fԵH<7\DnFќ_^^>-2 R7JmQRrSu}3&g͞2ImYm0ş Uh439\j7{nس=M Vd^$Pl;>UМNsnMׯ_OƇ d", &mD&s)"c4)b՘ E7kϟw2逢Ǩɇidƀu)TPYtusN62! z?13eJKIZ ^:M9:yrdFrf=gfckLS2jK'mA)h4b}}gKfhŪkOPǏfٓM[J&hB͍E cnf@%]l8??\a%PI6.p:05׵@3ck$~.Ft\j R PO|XD9#B'oB$t]o YkPT:v.O4vͅ#xrqцְ.sIEV材2T s Lֺź~goCF3wcrHm;|(3y]Ǭ2Q+Cm) 0&,~G/lXmV)ȗXݰlt22O#tXT&6n;BfI"~+$KZfIL˯(` 3IS:<朘XѓѸUuO2RPmVN|l&Y=(Rz-B7`d ?f ɓl!"Rc9(C aFw3✆O;;;1gXu(NKñQ6gB$kѿ2=;[w1u69ײM2\ş` =6" k/I!Tgg+p~v\JOķfExxx8hȺ8  W f\ &Z~Wħ: emm~&Ć~v:J30 ZZ*aofbLӸ12K Sٹ 2v ,~?UmOuasٚ!)c2 3"N|Nf>۴guMfTqWPM7Yzf֑֜aaY 7;l;`ka3eHSYBj4 =0I+m2]O95!x:;(3@rZ ??fĞ0_pּ4j4sUyh^u$*ZVn#1H:cƓmܤ gpYF 6 SYr-eڡjl_3Fu%2N6d_N2s(N`s\vu79q3w5uP.4*ggS8cI $'2-Ό؉VJ}dM޽i,̰ڦ:Xk7F,b59Otn|A|@Fdji[𬹈TzĹvzfxtt4MR9vJLI3SbBKa_ASmZs | rȇQ=''=Xa&uL"MkN[6qmXr&]$xh>@_6,ۭ@li1 `\E^yeM57'#v7(Pf[E5A-fbUN06$~OY~ܟ3|٥.^?5$E{vf-ɖ_]hUkӀIwnXX<=LtQE6Ն" zzzg I~ɔ&d$zaٳK{1/9ڜfRJ୛ `-ۆls %@f IDATmN%6l)e+K1ד13RN$sa:>ݔر~c\N-8,OL'9^t'miϳzM eչ"`;.0jj\_x*5p3kN;mf)MJlUOO )gw>ON˺7a^ا l8Q$?jo;lN 20&nsS 6hN`B|<2;5; (g4LY2$Sp >U$fAYyΥM,wd)'OfOS&֞w :ПWf>Rn]zߟ"d2PU- Dl02rTv¢?ZNOO=)9mz.c9&trSZﷲf3AM=F,~qJeG#<,ĉ=lA2SH}dE'j")ݜiAğ_3k\5&:FN}߿C2J930Kr*̻dFr"2Ѱm<={jL@B^4B0}8(_A|D9U/~5QǕ2tign>,]n+2}fH~Y,ިqj keY}l{"4_ffd'ZKB3.#='R)tXOiX !,M(F$蜙 L^Ոm6arD 'iFEtac}%w#%Jdm?3` 2U:l'7Fz tS30Tښz?3ELh '$GY!XjJ;M[ AJt: /IV&ׂ@㞩kr㪲0Ze0vpP&A0\x!268Uk_"$$Uus?ߏƦRRDvs$jj5xDdY'Qv٬%Ƹ]̬g0-n Tq2Si 04$L LP&ΡD:-(/7jD~'i]IE҉(K2d,'v8~oue}[t:)h΋P'`KnݓO+@lXE#9g Dd&@ 0f^8DTe$d ;Sb dY N W: 5dn*l +P͔2Ԫ![b&Qw67%ujn)-]qy]Jjx 7|8ZE% U,I^kn+ve9чkl$*${3V bITu#gցFFqd4oYJ؀hѓ1I9 8UVA-A&gfU>&kbӌ]2NeUq JK)K85u*g&ٽ5|Տyׯ_o|qg}駩?IY׿YYYf//{eYp%mYŋҴpаK}>q*i,`R)2qM˜k_o5j󗆟59+^ ~AV\YTI~`Q:WW ǴS LT)K_u]Wlӓy]NF{kINo7vib3a)\B|dflj *=J{hF8FONze'-*=0 >d]O3Ȓ.otsIߞ׸u&Cxx>_֒/j~zJ[5<%).3lzL}ݧ؆zFQ}6c9i1f"N?aSrI&&ӣ1?H~ g.T\m6'w\|"(fJt} rފ2ܘhM2rym @K~j𹽽M~5[ &AN4&^>c/rS b8CØ'bĵyմp]6uO][-Ӈj"j4~Oc\ejٳ=5}SR`[]\c'/n?ܐ4g (F ~g)'cB,܎W5 Ge`%#p5Lr  !R]3aH vo~!=!szΘFxE^q~l\`8RΈUOܙF\ͱ+ @#)OYrUGZ̜GngWWWyj{Vo* SQS4&CFsMxl-3MbuS% ks>̅I/0Im2^/7?.Mqgyr^6Ƥ줯Ϲ;}ςbxcB<0 sOeIʠT'&Ws8~0v<̜Nr "w޷Rwۇ,ũ p+%TS̍^?9Vcmӕ^:(wy \Xw{3,s7ULde_&D0ks jЫ<իW"f\⏳SI}e/Mz-zS=+Tc1HoV.X9.ܼTӘQmLTԨt5m5$ #ϵdOP&aI'3wL҆d%7G˩F0Q)r}V)Ě{lTR-~id f???М :Xh).:+eǧG9aqS`Û:!]L'I.&$iaq}S`AIf8Q^˥[ABߓRd[J8'0T{Y+;xh^:T&j̢Rb]odt LCcplZ&}UY'4#k0ɋO)bŷ}1\KSKh)K) L-еH-feT E oj@QlArsOY$eVE6jg61ޖbĔʟ}rf-)p\x'/jB1?͌_@Uq0'`1-TNps鸞B:Z' `SnUkO_Y)2tIoĸ]V7Ϋ>S|wwww#ĻMe}~~ul5,Zfa#)LlJLoP_egi7fό0ՠMMJ`BUV L?Vˀ_LA[3TӢ+44XzrD}/sP(?{/^ݛ7oՍz :}ﴼO^; IENDB`./examples/jokes/jokes.wav0000644000015600001650000033230012700370701015656 0ustar jenkinsjenkinsRIFFWAVEfmt Ddata                                                   ! !  " " ! " !# " ""$ " &% %&&( '&(((*(+*** ,,.+. ,./. 0/.1001 22 14242456578778999::;;<==>>?>??AB@ACBDCCCCEFCFEGFEGGGHIIJIJKKLMLMNPNRRQSTRRSRTUTU TWXWWX[Z\\[[]]_\_^^`a`bbacabbcecdgeffffgfeihjiijkknpoooopqopqqtsuwuzxyxy{{z}~}                                 {~z}~}}~y~~|}x|zwu{xy{{z~}~}{{yxzvvvy|zxy{v{xx}|~}~|y|y}y}~|z}z|yx{yxxxy|wwvypwnzoyryszpwxtunxrzlzk}fmrv{nmlkljmnigjifffb\a\\YWZZX[USRTQOLKIJJGHGEEEBFGGDCGGCIGEHDCB<B?D<BBBFFFCBCDEAEHFGGGB>@FJ@AD<9;945/-1//(&,*((&((&"!       !"*+-.(0013.535133.0-63/26949<C6.3<?>HJKF@F>?CEF?BEB;9<<<??@B@B>@FCBACD>@B?CB?>BCEEEILQNQQONSOIKQORLPPQVRWRNLVSKOMNMVSSX_Z]b`bfbd^`\_g_`bb`gfbfegjcadb_ed^fgpmlcjdkohjlllprpsnqktovwumrsuyst}yrsrwwvsnigaa`b\^ecefaWaYb^\b]Y]\YX]]`baTZaYXXTTb`c`\gaa\adg]UX]XUU]TSXMKDBHCLHICCCHLKCIDHJLMSQLCMPDC@HFEJMKEC:@;:DBI?@?:?;C?8C<;??DC@C<79;?7<>?@:81//+.-01.&.2/2/...*+!+&%/." '%&).2*2773766A;@132')*/%"%#%*&%%&"&&&&!+..3-<32877.:86:8?:A:@?DDB?C@@C>E@?C??G?CHDLMKIGOMK}LMvGvHxIyG{Fq@vDm@iCl?p8p;s:o;sKEPGOPMGHIJGGH?D@DAHC>FCKLJQLGOLLQHKPPOVMJRRXYWPOYOXLYJUKTOUIO?^<]?XC]C^;O4Q6O6P.Y3T5V6K/H.L*U'S&Q&Q#GHL!K&PMPTUQOLQHHL LP L DHT LHB?E G QPP O PUYP SQQTaaeakn]a]VWUPRGGIGKDMOKMLLKMPLQXPQPOQQT`]^X\baXaXTUQTTQQ[ZPPPTUUTKUYXZ[ZQY`fmjsur{{~zz|~   { ww sz w |}z!$%..'1.)-#)),) &# &%! $& }$ %&#.$$.(-,'2:9>KFCBAG=B;K0w $| xy!#|!~|(*v#}-{2v(w.p$v'w%~.},y(),24:;95:z9~-y0z2|,.}45w2u1w5}:v8q6z5q9v7p8v9q:pGkJjJmLwSuY:`SgK|lo[lOn\wcpWpap_gXjZf[k``\cW^O[]WRYRZPTNYSWSZXZWZ]VZ]OSSMPONKSLSKJCKCEe9\EeHl9l=h?dClCl=l0a,`)X,R.O"JLD!BP*N+F-K+N4OO?ZFdF`G\GWMaMVQ\JeRcZmScUi[`^_`_Yl`n_l`q_k]i]`ZcRhP`M_P\QeKhPdMcQ_O`QdL]JSJZEWES?V<]A\?O=W9N:J8K4G5B:KN2K4B2C->&9&:&6&0,;0=059>79423'5):-7.2#/-46))!!$!)'+)-,:3A061,,"&.$#"$&)) $         uoja^W]U\]Yakmw~ ##(0:;BCLSSUgfaYWTEA=91( p [QG?7=6??DCLb ez1?N_gcd\]c`^Y\TKy;4/..3+-##0%6&" *35";%J4?)4/<G#:-@-RCWMfPnYfXdOa@VDUGdTk^fW[PUNXKK67"0+ 6>G NKEDC@ 3"+BJMOWT@,)"   #&#,3;.-/: FV#V%Zk*j2j%`"Z]_a!h)t/t!q|){"}zg\ZSG3     /69K_#dZVaZL9'pgouaVgxolt$){u_Xhgfkfk {ox}wkdl|sW4  1/04E[ux9E:=@:# #u$39FZd} 4 ! *2&/$6+4&#ttg_P_VQWt )<(%61" (,xAlck_SMLNM C , )37CLN7 9 R#tWtjzVtGIcn{z`sGVOtpnaifaY|JjGcgg5F*86cCxAoBfJpKuPxwBk4NMkO4V+B>V#P E1,4/48kdn_ky~sg`wafsz^}Lg\gM7ZHdX9s/ W}eygAlO^L:JTE3@ahZe} >imoO{ ~ P{UzaIJSTEyDsSWFp*U_Sf6Yz)PL'&.&gJp:Y/36j7=3If]{nmFyZsyj{68-1}W0;PoD%g3bp !"6 svUwTPZ ep qFMu[ywoP8W@kUn)* 7m m1A9ZpW0z@sdrm4#PAa3#4` (Dd^Mn Rd\`\4"d yyj\9w0NJ{I K*FTDuE.Q^LgmbjV0 z4c\ P.]$ jKKzH1v9} `m @;`+Y*9~$ci:B&zbA&Gl%;tvT:c7lL<p!vliV5Xam^,Y(x T~2( 3r V(L,B9'e(tGL+94GOfVy_*neugLoc.%tDOvp>`/;CPHsP.PM{UX:2BmI _#E"p0OYYW4kF~ ^SYc|+&S"CWykgVd;A9e?;,xN?R$Th`%>0.i-! mhyF9E` c?h6eUSGqdY1\O</C<f>zyj&/4\'s[(`S GM y-L|rkyuz`yS\YK~f^?|?*pN%sFB>ZRxGq[{((5VFv9g`Hz`;SHpUP {bneri; |Q70|z`P@Q:PjBmkN>{5>~KE*(B7Fr1; >Hs_SKtVhiw|ex2uhMHdP xO}TK8a!]nO}_~;CB5@ANfNscZNUS-\8xbhhC=0[M[}1#>YKFMG(JNy= W7dUkfBP9:tAhdwP}kBbV^Eo`V{ZxrqBN ]e#4$NMWTju k6v1!Q-C 7qW`:\ 069:kVFqtOVuty0[`li\vbG+d#2+:G?c'Z?Byzv3057QgnU01 "LJ pDwqwO3VmRNsB_T:W=Un<Y =7CZ+',1:f[HwQj`CuJ.@72  yd*abg./S/$q<y:N O0w!]7eH/QYf|_o4] iJgNIrt9"A$ 5>P.H*NAeo& b}uA~R@'amk \MqIGN [4gq"XVPS}j6lS2D%8 kp(J}dQ88^w1F`- CsV V4Sks<ms0Ng;s}+;UbV54{%anD|I4Z~ga1OQsxC*NCKGJ{ -yotUnJ x N7'>oc/ZlK qmk) RM8-bwXm]d{Vv)Q\+ _kY[1F|P!y-fRCIkzY&vht8 }\l LBJDHcle2i%Hj7t6ip:UVR]sxwQ8Lb:A; %% VqSuVu7$v*s@BE3OoS 9$ z, $  + W 2 K -  K " $ $ 2H   X ?r ~ P S R8 S h    R MN +  )\ ( Fq  au&E /axd i  g 9'  A~  ! & N=     & N Q $  0 Z n #D   n o {J ?jGSY00W=n(L@t#~g3]H#R/({ g]UC- ;53`><{L mij;5VAM#MBhwz$ >Y<*[FnV JVCMk,qm_Ac SKc42AW`-%7Py-84e~"/ri c1Cr7w 2H@E#stfac=+GdspTQE"wt3'n -  " 39 B> 3O+ 9 4y33roEOeI|{EX3InI[? W  5c c /  >    kl ) _ 1 2 h  5 zL vv b( ,  r[  0 i   ]Q0G'5Fwl`JrH2eK.j}Nl$;Nr2G ?V  3 ~ V G. l"_hq >  V*kJHMk0b7 v:uL/XR lo H*23[S  O&GSkTs&mKluO)uyX?N'f* U {  ^n Q 5 } k T u  T  %    "J4pt3^uD+ 4Y 17 =  ubs6; 6 | M\dc @ f 0 d "@ j  / ID  b05lc WH wEgG$%4L#^&,G6:G$Dtso tc/-H?@}R!;NFLTnsp#NA)7+Je/?+ xq\%#K<)lH~ YpfiVAj)< LC] O >[QrY **;K,Gb2R/R%8?QRK07u[ZCy,>>&eSZm+_ /VyB yI<.2 bwshvG1, ]/0:cz5S\DJ 7O / M q j{ 5j   H ?  t  n f R b  1F  I49Y@(>` /r  r m6=_ r0 Dl 9  7 9 '    2Y J  ao /dY$h.&%k rSLR4r+/ IWg0Oe^\P$qRc[ZUy.htiOZ"-z 2Un2;V ~.[*o-G.{|_n6$*4>'"()9>+=r>qs6-q@EU(y[oBCmn}"6/E,^v!<;Ua2S`ko#ICRvlaO\!?XuJB-WliZ7zz4@ 6s0:{$YIQT3 CuZsStJ5sO c= oyn~AvyP <  c>o 3  p  L    V a :: ( & M  >    cDY&/v ME *Kml~ GLw0C { 7S,B,   )v? <? 4} & [k W g      y d f X ' mp L#C)*l@^xD  c5>:m63r.lhlJYc)s!_NJZ&O k2*{ty,.WInHpfr"v(z+f>P:RAo&-[ *=z^ #Cc]^D27TSvhy^u7y#Ms>JFg[E-.[T0qBvs8 kl $(Rs#]+G@~elbauT.*ANZg_OQ8*RWowv#p'3N6 M-LT/Xg*G"HZ]'3H5 ( !a0Kn {< l #?9+W>il  o 9#   ~  t . | K B | ! "  >  >      u  aF  G%  0  4  ^ )l K7 ^ \l zX 2 Q  } g p Y.  JEH\ i _ Q! >y o   wE ( !!2n~gcgb}+Ag 3 v F W /  P 4gc|:y<x%!p t4U&z}p+gC=P%Y-u(:=<-ngUmnpkICKDi&Fc [g" pcFOUr"+89dTScIH)^1   Q &  " + $z     =  ji Z ^#    wW    [ T#  `   'm   {XL C Q Y7 : ," I v    K  W ; 1m-SPy9<#{   6-{# 86' YBGeO5e"kP\5r)=pniB60{pd5{LT3 6f@.KPPwahAy&K ,8}!^CK@zV1qY7[5gj+tZ|9Cxbh#BNkY3BAXtc9Sc TtIffgb7xbBI/A>?mU Q<&Z:{z!/Ln'+fw@J~?]mSk_L& a`\q#0_o[Z8sBV=4El._&> <  v  Q  | T + s Y W  B o + { L  9 r & b R h 3 Z4  #8 qT W  HM   u = I N}   L ) A   H   i a#  K $} !m"!x!|H"l#P$o#"| !f X    ^3Fy5ny|^0] 6 Gi^s]bbDhW 4pP#u"#{AL%wzY djQDGfp-[5S~k*lrx<gcNZx5IQ64d80+/ =wR,will0A'_[WaFiQ iIpd%:eq{!bbm&f'scyP;D&nb9RtDNGF.;KdH_iZd =Z}YVl`oXPyixQ im ?% G Vu m   O M  - O 7  << 4  0 f d 0 ^  a N .d u {_  wF?bz&\Od2x`L+"Jr{0 .+F=/~!_"C$F$!1#"%zn'&Z&''f'V)+%-G/N.|-,,-Kq,~)!%J W'@Q=`Jp })<=1%7`JM"fGa,~!,Fa.= , /]  x[L 2Q, :QI Y0uuf&(0nMb!}+0HwGoRMe EWU=M{ %,?R!W'Zm Z7, w/<=oUAK#oK-m'NB&AbREXt*\`sMUJQ_FSLMde}& ocG R>15P<rLc \`Y`~ a   K   VD   h 5iJ `  DB v J F % d    v>j3[rnLnI;nr_ ~g!y#$ &Y!'!:(()\ m*N M)'(A)")@*)L(.b*Uf,M-c/0b0~i/!0>1jV1H(0.gA,7*g)*L)&$" 93T͝%É_%Y?$Ӈ} #F߮(~| , :x,j070p6=YbD*{[  mV3\n2W;cv\9Q'(en& c\0 +td9DVRFfZ9-FL b"YHN:EY;e>*<X+v&5 @  * >     X   d  tx<"aNF|` QpPI"XDuwYX# '<Y0    \ pmm X n Y  P  P[OYP 79reC3B6EA|V1d!# B!E !{"$<"%T#<$)!%s!2&!,&R#,'e$&$C%#r#?#*"%R$)s'N+' +&*E$$+#s,F$.d&/%/#/"0"44%7M)n9)8&>8#6_ 321)n-|$  tl!ayВr/ܿcQWXߌ ݁"gv7%ʘVQ iBλ.ݗNXP{}./Zg yJWcM~E\)f^1W ^X3f3I,K;u(+!߬hf| z\Uד<غdع׿EԊٖuRյrӨ$,Qۀ5Vp<$gdA~^ J+sMx  -VA I[cw  H 14  3 Q  xD  @  5 _  D vm^)`} j j c O x v  1: t L>a/UtG1N@lN80 B  :u R- . k $ md=x-lE-{ !!# #" $"&"&%#'$(t$A)%*).,~0t,00*L.),))o-'-}&N,$[*f"d(_&Ms$%4:%##z#` N# " " #"%b$&d&W&&O'[&'.%#G 9D ]&ZޜbP2 @NJ!4ǧIڒPͅɶI8¨N޲ ^ܵƝ+e հݓG:0L{[Up?nrG N # J br w U <{SAsC*[" o IOI|]#`Rzu0=5фC[ڽպૺx";̾׸Ib,zZ9Xƴ͓],?8533 J ]!M3!#!"9\ Ygq2!$M'a)K + -R!,B!*>(%W!M[ D-  1 7;d:kwv<Ren^XR:-r1yfi)J ; H   C f< 61f"J8(?2t^p c"%W }(#*j%+&U-)W/$,//--+++--0112122E254a9L98<=& '"m$"8 + D 3   /ky_QYEr[7?39IAe:C;lE >vHqA LE)OGPHQdIRiIPINILGIENEA@="<8!512+% M= O1´B$]>GǍǪ@s@ͽa%k8;% ԯְݴ{G¡5ʋΘ4ݰ>f-c\'փsA/)Ԧ:ިTogzT""*/32hz/,)(W''7(**-$:1)4,6.7-6*3B'04#u+M&$e   [X'yi8ke}hLgەK:̲AC/ı( 5.ñ"M%5C|aźjbDao?ֶ0#{t+" z:Z/#)$.0)2J,3,2*0'>-p#({$)9!-\A9Ri T9^+1QO (   {)|$hKP7atb|U9)MXvt  V@S 22\ 5!G"v#$'',*/+,w2.I6[2 ;7=:=:K>b:?V;A=Cn@EBHCLE\QJ.VNO/YQZQYPXNTKMDDe=i<53+ ), _+taLjݣõբ75ŝѵťCf.B@m벿HKWǘ̻q:iCܣe0/c҉tШaް ޳X?ARny  *%*q.0r0S./,y*2t*,s"0g(4-72l;r6p> 8:?7=S38".E3t(,!$fD7ZM & \UBG9#^[zތ"֑nI0ûC1ưs(”[p7npI S-"jŊ_τI5ف}߰s *O)wrIfw B 2 < :uUO%Gg 3-X]t(;% )@?F )S >I&( f>2-kRH[)gkN.THM#E&  Z N =IU ( "e!A$#t&?%(&)1)+G,o.h/9123j558K88=P    Z   0 Q drSQuIc=s$e IT~D~hKWw#RgurtB?' 6t2u'` hc ~.>)M ]/6O%!:# $"&^%(3'))++w-M-.P....y/.0.12-/V+s-5*i,.)*&a($%F"!N E ;\FZ_OѭݖϮ?ߎ@1ֽFCܸܺqg_73ܯک֒+݃}c\MCwEp~Y9|YH6 l: $b1),-"-Te+<(P&R$A#b""2{$&sU'!!' %#s Ly / 3" 3u5fh=Yv?RwY62~ڡ֣վּ(ՓwotcWJ>"ۿL`ט%jfYݼw}n)df    ; ;IFA"u;oo[9- r _ 2+k u}3A]JA"|cBwa?._ aY3 \   >t IzX\Q"Qؐ~4қ+|Dl "'5EULd`*[xyx\h@!9,D   > w T|A;/[j_=* 1'C6" Z M2@TK=yG?DdHZudRp7Z 5j`Xe{ .?rD? 0 & &p W>O1A!&!"9"$"b$"l$#j$D##"!#"z /"!!=5!!"!! "!!!" !'!  dtJ4fDi#]:J]Nem  {  "_{+؆NG~߂ԏ ,ݭ+q>A܀7ٱ.#Q:Rړގ:v~86/ gn; rG  9 &^ KV#0'1)([@'9$\y @+ S 1v z9? 7:euc" T({X 8(DG:+?[ _tۇ>ZO@Ջՙ1ڑlqKeR7z*-f(=/R,>   (  yGm { !"2##0#$"$!!-uY83(<# h B sKAk Ovى;^׎ق׺ oܬޡޥbޅKSE޲8w'-hV&c 1?l* | |eol&8a 6WRe+)Hdob @D<'\#Y-bI    L  {  3caZ15.7%$ !h8?65j'$8ur>Zdp +!6k ; @ ?  u a  J  eqi-G,"  r}GfZ$;A3i[(0% lWt?ݝX8E"RJAfASDl]e$Mk 52|~ # Z  c g 1 w o W 9f4  >W s > ] q : d 5 ) C d @ _ i zgH$d\    P   A a` 4  k_4K>ZrP*zj#70'*k *S . ]Q.cpzQ5 W- zk_Yne)CXI= j2K)_z9,ooP4fZroV_l {WU kw  H: "!%I$(%($%"}!K /kl_n s G_ sI b]@W.:"UGeX5&{uM;},DTX PQ c _ d W  <] g|G{?d  I h 7   z.u%U'R$Vl*f Y>7#JY8Fd7J$3A H\*^_ N eV( # c`gS JY * Y g"#w R@D[Ul0gHzw!""&!M~7V OCJmfdL<FQ!> ^$![)=&,^(!/)P1t*^1)J2#*g/&*y ~$nFW)Ƥށ(rJ4Ɋ,6wDLЫӞl7s„Øi-T֦*YpyOFVB ihAI ,Qw >#%'G3* *H(\,%! ^ u ~%#o+J+V013R66:s9G:y86f3/}*'u  =WZ d\\wJPAW v4/Iڲ٭ڂVBܦW@yJP4b} ݙیb܁؊ݺv߮&u[bPK @ Y6Md!U$(7$*'+*+-*.)/(E/_&-"T+_(,%!= pR X ~srh,Oz4"}s֋ܑԲڥ-xyNχ ՐGmhNJ"CߏӨ7Coއ 2($d6  ~   W{>,djV]jqryG h N Y T*#O8 o T9 . W  }`mJ!^N$3>(UY^ z b kfNx{, !i"j$(&(!*+, .c!8/U"r0<$w1%2&(A4*D47+5'-7/8/%:/z;/;.8(e4".& ζ,Ղ)W}Tbċ$5ѲI5NJ7óV30]̭, Ƥ/ӁcU C G&;QN[ E$d)-05495N;q39/3s*.&)"%!S$$%f)&)/ .7P5@=HCLGNHMGYI.BB97e.+4!  m!\&vo2fZE15G&I(znjǩŅ|ͩ>1ֵ7ݞjn)toT2gdG.E s  n=R ]Z}S!$wq$# 7~ e"6F yq`PH6FDA'mҚqZ#z ۛ7ܗL ߟߍ,HR~Zx@y~H 0 u .T?" r I Zy N<  n9 |ad rvO$Y1{   @   Ka 0 2   U2F%cq. 0!'M E": j 9 s  D . >W ~   MDFo $2m i e +u9 /Q{ f t - [c X k = O* j (](k F n    aަ܊]cޫH_=KGߟ#;Dg0n# q(ZY ~  .w V | j F %Fel 0R &f B-ckI T0 4 " > WgwA]l _nqLC_f[h vC u2~s}C8/tH{bK-E ^6QjH*#`~H3uNt 7&` @@?x#O2bCY{ Crm<1K=7($@d50<*@qdC l# :#B`]XT%XyG w  /  0 m.xJI;u  g< A0_+}u%1+6 N+{ & :  C 5/ GG R  +  &Q & [ # :     PU  I N(y  6 E R |  & V.u|8yO&F mhxRfYp8 Ru3<_%!"-c##r!g= Tl ( Uy; XWSUw9TyA%C 9o]FUb*:&v*'x'Mco._}9n U* mo  lX  rbD([  S G`hOyr\Etkbc4;`5PH9T"@=vqTIS"erOhq\W*Z8i?&geO5.. Vf@ADn{>?E D12mw>a9 f   %  n  !+  w]3 ?-'a(_KA.6t!oGMo;rL| GH+-1A3T=2f3`. qzondAT&KdB A.yG!KWS6d`isl8bV1Id?< ?YU~v0* ?1     r ' / ; f  m e @ _ s %` PyV_ YRnUzc18    1 F[piECC9-jF r&yF"\n/cy nc\5a"f[_F8x~s]m}   hgm  1 vD y Q Y f & C Y ; X  * Ki e g   : tc`;<G%L\C W+D:^ldV{-P2qG6W6m5^@V/mTQ!*`]| D|Z C   MN  M EVbs-4CuSP>!-`L\Y.6})Q}|u%}: MVf=b(afma0 ;8 T>Qw. h u G Nb0{^'J3n:py5utdx\3  7   I  y   ( | 8 ;  h P i r=x;A2wJf8dXpPe^fh4Oyz,D @, 2fuBߍ3ޕߏ߭by$ߡ7-CYo#`6" hqyDWr W u s 1{g-lGEEP"iE    w!jv0p'1Q6n6[2;6#5VXk^E,m2%KgWSu(i=6/+A]yL[QH1Ph[]xEi8FJ,^Fa%BQLna.Nv?9vDP-M s^&TR:?z#^ӿjӏ{RTr@0# ]Ch<g|r~ 0 ]0FYyV 0x:?On . !' mKDM ; e <p c@'{WU_*,eq[pfl i)k05# R/H  O?    &D5Q+b2y(4KR+%9F)n 0;| J{  M 0Tvs?rZ\  lQ,a8 msEr1P_Ew̨4|6F<_'K|paQEKҵݒCѧ@fݏյ٧wd4|{DoKvURZ ?T<K  .!!! "J!"~ /" Y GkU!2"%"&"y! @~ 7b0 B2}#WC-J| j_WDs0cKS_Y~.[CHGqzty8^( v ; ; v d eD\d (Y-| 3" A U:Sf8DDpSFP[ݐz܋ 6\9 ap$_;VoY2 ZR  ' ( s .-}[  R }  w  M  Qe3}5UC+*7V(Z,;7a6O4V\J'5Q"x!RlJb? ^ D Q  4cZ4!i>#+W%&7&''z'%t','&-&%%%# !x     :R n CsaJ =2nڪFɖÕ߿̗ˉ3d‚ 8.ҁi-ѻ~˾e[^ қJInhB| 0 (\A9C;XOr`"!& "E+_%_/(2H+4k-5P.4K-3!,1<*(/4'+#(G &%]@%c&&k''O('&%] R  K`s8adyr^%XһۜѕХLТ֍ְѨp/ӟ$TbUT:uEnMs4t/4 F2  T!| $%j!k'#x(K%p)G&)\&)%(%(%'$&#N%!f#6 s!UIg\ ":Z/lNg~ MTOօѴsЬTTԕ Ӯˎ dž8a@XWΣƄiPԉlۋxߍ#-;A9# E 0uS'!2#!%$'Y%'%''P% &#+$J"3" #]M9.iPyOQ1 |4SkMZ[pcx9|7B%A<%5R*\0PYv_N Z  2 vJ0B!#%X'Y6)*+ , s-b"-"-"."o.#.#.p$[/%/%h-r")M% 4$Z܃_׋ŠӐ°Èԕɛ̄~ЏҴ0ϪϘ>Ǔܼ_ TÆ;X |t=eebR&\S6H%z8 u qL'"#/)4/q8l3o9595 84 63E3;0g1Q.0-19,27,3,5R- 8-{9.7:.9-7r+3 (/#(cf!;i`0 =BPF+~`B6Py@8ףնDpϨ˨v&r5W2H6շlۜseܝ%P?\Kw~a&Z 9 9D "%Pk'n"`)$%+&,'M.U(-/(/'/&4/|%-#+!c)p&,#6 ] N% Z>t 66n!ځuN!GKٙγt>+pD!Ύpx*lqbgڞޔvk;^JXW3 RFW 3`,-~'@EXaT-  0C 8\+ \^=[z]dfYKw\P@G(/&/36A K{sxnuE r t+ P | w.:}'Amp N!M   ]!y!Y!! ;(UQ H'V,JNFT/1al@ՄZe,Ӣx-Ϡ2ОoЄѦ-۲.+xH9#2#6{_ ?H II#^($,(//<+/,}/},J.,W,*))''w&&%T&n&&&&%'l&'F&( &(f%w'"$ %& e "`ynJ#A<#W(/اEڕFݭk.9i(I%MY ,(* +K| X6m tfc@or4 !!$#%$0'%'%;'$%")#* z/+  !ir#^?Hb]Ex6l_jIEp2:b(a_޼ܶ /( pPb%<^LOuw3??* >  q 4z`[}; kYZ} k  x 2E M_9h]!<OZ@a8+MH;c*vBnu5<Vxm N  ,P 0A fj;>y,[8<. ~! b"!"n !A&x, wxuDXߕ^ ޏ߼a5X2`ݚ`ۮڝz֛ՃҍcjN=[ۙ5Q/T4gJ =Gc> & pz"A#$%%&$&"%[ #o!-tUr ! ##b%%,'8&'F%&#j$l  : H gc_76%Me!N2UATUPPbUOLF+Q(e@   v^^zsf+"VdW` "   Q  3  /   q:h.{LLT}g4"yP<@ +`tv%4-pY/y' CN _ Y  nY t %gq&[nI1 -L  x% U ; {sU[<2 J4mS)Z !j  mg ;f ( r P X} cc k tQ$.g=K Y.U" |=! E|Z59L:M_<=(Hl' q7 M~   5 2;qE AD 0EF%m:-3k y D C~V4ry2cbN:+#SmgW=< APW5>0kvwZ*@N{uQ$L h   : W G@  0  9 M c@  ^ S [ !/ (|6E to' IH"i%oGgC!w(D]Qfey&*7 #N+ADFs#sBeFA    $  R  | M f 2   K Y zp 5$(ysf)Y[.*dmj{Y}(ht pjHIx_sD@/A( ( d E ` cF  &t 6 c    f   & % d r } b  = 40@w'wu;UM4 MX!w$.\7@S~]`7d[R.mJ.JK97:K_m{wZ3?N! I3 hh[at]7'gew$f%[cpS>sy0]$`!O UbvH$WM25d]N>@xNV= !&*/$O~J< S^>S5h:y:FGG^Fg1QDrPf~nmi3O'p^Cn<mBI= / g |  > { 0  @ & W m i > l 4 C v!1) ?R  g  * i 6 = ) 2   =.]CCM LitK,, ._$ J>4KCb3> z iqw<BJb p R G O H>(   M ^  t  d k " } lK o.!6B@JDd x`/Pe{1:S?H9u VPfP;:ypH sGh->SS  m d f o &D 9 C & t  ! zVHZ,b6[RfDt" jPx&E%>Ul|/jeexEBh/H?s6 kg-v1  & 7 \  q _ 3 :y X' = 8 }  [Ahg$mP| A8 HPpgFI9|(b07`(j(+n5\`> :~Ent-.q F#h&SLsc/S#IF C#&V"o "FgE4 5QUBEnIUO{8q( ,i79,^~oogBe,Nl   O   v   H  \ XH" @Ir|F/:_XY8~RekMd|q[}U_I,?bBS{*Ackl+ ~E\C5$jW/:8@- V$NXl}\FyrxLtfH3Qq ~J`\_+)S4&!hZ@'f g<L)ksq8ugS:J7m|V,=&,c#_GA4|iS&z)6!#tLz] _y'B( !1R=^oEu~Bg(#pa.q2\Yh %,cxGRix+;nWHErXOXdtdc~_ /'}Q32V~EVC=g)q"R|1Y Y}#vkouo$k(wuV?N:q/^I+ {C}Gpoz$j2ysf)I6k0n"'Rkda\2$kl^>P"_0(   2 9M/{UlUQODbQ{eCC 0 2/J;a_%g*`HR{#;i<,cFx[V& 3#I}BuG=%U?&GgJ~Ez5k{1*'%/I+Cl5cO&qLL3 v4`t4] Ek/z=ZP'~_==#~]uj Ha;&D]?2UhP74,  ;(f;O8?-sGyT]uECxX4JMQ7Q[N6%HYsJ){GPD|&H>MrB"P`zz1])Ub#vY>b/O;E:6MX%8.EUv~U`bKndK7nmR$V +apO&BMH8/ <N9h$;enNAK59]Qard~p6[a;v@imH]YK}8;UlX#8OlTmgTK5>D4`"9<>uGc-tI-A2US3Wy}W ,_W70S!mKx#2/'<rgZa +#g S$_+H(zNp&`>8iquS<F#FLfLN!0-wzRo5# /(bHzRS6T,akfBROJS4:M4^KT999V=iO_&#jB&T;Z/; B)`>y1(BM1m~Hp"nxhs!h E7;%2 $ ;8bLxltx_qEJnzw[d<:F(94D1M@0/5@'Jl"xDKiunTgP & 6N$xAYc;E'0sC5>xoo. AE#H#K 71  W  tF P+pMF:8!`(9D+;H4k0y;ABX&jiqf98W6I1) %*?Cj|ggwlFQVPnAO/L-j&a(U&P5'\TQ>Pnql@v-A= :)1K>o3X&6*RDTPY~j| /9Dco&$8 bPH,;^bv U_}+eJ,2'EJYZZg~pnbG3ON`wP{BxJ]76|SP*5x.C:S0rGRJEm;!X fY#TchnM%n#|UH4 $2K/)u@hsG7Xzv-6 i& "r_t] D1Y B"CH?];TgKu.W*nDxVlKdTjbso~~ ?PSt%HL}r~lqy<^Fla]+I|=DU[Z_+M) 8#W8i:Yr,5K#(r:Q!(] l7|faq%Z@*{"]SknU=SrK;Z D= BYW1\i2V57c_UJDzF@`~iw ?hs[HR=!M.K.M'03L85 pH[eq|&{'c!l$0.* Biz#B7'5(D*B%&  ?t @s/;NMKLW!^?m7|T&  )=A*+* 130NHzau|ojgwyK65TAW}@{ JVZ>/5SKRxwBAB6g!S_;/]%f%Z&[XYG*IX/iS$m"z)'}AEe}hn{mcY!c? AA na){fe[Hx~au$K,)efuTXp#p $_4aW'/n~ %8JiYX|_=Na<)q5f4 nmA#y%?! pG~*P`>-+f)#iGNL&(b&[Wy8<Ur~k~tqCc^X8{a;j5}cpvcHLJ$/DX=}ia@R^dKhq"332NqVcUTJU-r[fx}anYrb`E,a."*0+i2n 1v;;{\;? N2to?@0iEAw$&5>l;!%B]o m|P2(JF sD{i+]Johvr~m9y,c,y\[|U*T4h Ern2aze? %2Iw2 hI\-Qby08-s=. _:w1@Q?51m:"b6`N UCIV,:QP[ZFkNx-Me!Iut7m'V?s [\?%8}9A+C@1W C0 z_RAxml.aye;n}6G8:1w62o,Z[gei#<~%[-pT(aG%2 !  $  K 9  L  , 4 F z |  Jy%(A-Z/J|9_r % wZY!1=:)H/zcXn$o8d3;%sm    4 % T   C {tfrt'k4r.t`BXBynDS0."#O0W~X"+,zdDy9=?LZA\i( CB H 3 YhO.2I'`e#H', 67@tGA+,;4@R>rE J-cz]ukN">F4:G-0$C]oR,xK5 ZW(^|l>83[,<F+}N0!n-ii4)Y^I= Tr$FY  h f   Wa 9  U  Sk1iW P)_~<x $ I~gn2$ 5;8VM%L,_Q|wX)H@ (=fj(;/fQds9@GT 2+`z_ Dzk7aW5n_+w?uBcvcpV3ssgI'J&,Ckt5y Yqx"}[wTSj-eSBr>{|Vxp$#@&HVDQmX; -BMNXnhkb?orX#z<#swI-^k CAGf^>+aCp\)mgD 1@b9Px]uHGMo9:fcrKuAm0r[Bv$=p#TrP'ldW0A;U n-J \ =!xBH3j?{yHE A+ <}SnduyK:6dU9T>3qHpQ`WiVFAEl{?l+JMo_a\aH?0SgRV{S|_F6t[8nX7 m(,_7G <9d=):j>n(uPnBx#PLo[  & LX;Y;<@x3/S.lZ0XTrz>oB/'v.Y LEc +{o1'M@> jh!F[q|Xooq>h]LdcYAA0mp<#Ey&r?p*](cp6 t4IgQ35d&DMxq J+|QxQQq 5&W+u9F<|G@5LwkzE5+ kRC'">J`vAYh-%(E{ >1mWm}g6 1 Rw>l6H42K),6 wwod>.>9rU }reU\3S"(>*h"Kt,Oo#wvhH`gES"Cit Em JfLC4*pivb7+zu\T\{MU]9w[C)3VUzrryyr|2 )xP6feLvgv fX\8=>!Q~Gu{53&./!cW+G:6D/G1]0w9L_chpwjYHC%7/ &*-|3IINSgvz,>LP<&wd_aiq }.MdbzT^HJD6L'G73Tw&?k-*~j= ?8`$$KF`NmjiOm6J3JU3G/54.D&P1|]ct|$Qq{{]D&V+~pb>!mRamI$N?)=*A"`$YN?vb\GKbokfo~~u~U_+1][C"{c,gd Ef7 7H3 lgHEWw@a{))-9:T<_9eIpl""=::4-+0':)5#+6>K&`/e>h+^G:& oicg|'AQ k+W{; a)}C[ 4)hKq2K_lox 'F R#E'+  uYo9eX A! zLe(THPZYi (6Hc5KIOm$+$H     !#   v1c ;y.uSz)^XPPYYabr"@(K6]=y\Lt8p OZ/^./  ]QODO/i\ tjtbYM 3xu0Uk|j@59PY[8'o.wC!`{'S_)XosnoFml\Bh/' q7p&(kZ/0uF2^B 4cTPd53_S"{Lw Ak&HFn&`wT6{Nx<~hA`'uYPrbZq+wag}tvu|9TqTh7BFlZ7i%9;dDDS]M.]p15~6?+U=}v4AZh>g{$~ixE([uDj Lr$= 35<?1;QbwIu|.Q:9x'ZJX$|nXe$io.lQ*lk,s!+ipZCLKWp-fgN1 a:tI]i6a'bD/zV3 ="j/Ga8Yy5] &<CJPx\\D3"  NeE >;9Vz9XLZlS< ,[5#< ga'9KJd|"hbA/.wk4 b+=J?>3';Sp` {^v56Z'`AmoeCWON\hz0w@Sn0r?~@t6|< mRU+y8f:L8%>C9a0Pt/N 5rT2 }V0 1J5qCUs #AUn'IqnIah> \*h8BP~S?Y3 -:P`u1XD1mIg=d<a| 6y?g;F8%5:2T:~gI,ndZZZey-Z "@`,~\</gX{ 8`~&.66;7.+/> S[i t~}{kxXMM8?$ pR6b8t[H/  !0?W\u)<KLWotrtsyocfG_,WHF2! eHfG)n VO@9"%z#rd Z*P-DE>G1['b%o),-./8DG+L;RC[Padkpmyolx  {nj\ P H<2.'&-*/12,.,+)'-(($0:?CPc rw.559FOR\_e[Walswsvqquypyulmmqtuqn pp ih c ` dd hk mr hquyxz$),69;HIY`jpu {zvsmjba_|aa\[][c_gjeibijklpnolvzyuo^~ombIiKpV`RRtmGyS}aY_Pu/\AhFvAx?m2[0d+i&`%i3y[`m'z!|vk& %.:;:CGJRORPV[_ksmlszrytuwv~xz}}{yy}$",39299@A?@ 90'  xqm|gmyescpes_k\f\dSb[c\f`faicjelhokuqsqtvv}}v}r}vv~~|{szppjbcyf{_s_yZ{]p[]\^nejlrtu~|}}~}yy~~xx~}qulhecd\VzXs[sWq]s\h[oTkMaJ_P`K`OYJXBWKREUKPGMENJJQPNKNPLHEIKOOSORBVBSKRJ\BgKhOiXiOmR|aZwds_v\\\[`\ghmlmcjd`ba[_`\~\{XW`_\[W[ySzOxTvR\ud_hqnu}|}||wpommlbb\]Y]Y\XTQIHIEC?<86/4-,2762+,((062/1/)&% !#~} }v~t ~ x {t}z rp tv}"#"!""#"%&%(++-,.5,%                  ## $#(#$-%$%$*("+,/+/("$&'$''&,#-./1/125=<@@EEEJIPJIIJDEDFDJMHNMJMMFE@DAEJPI EEAD B;=DBDEIJ8<89=:#93"8!534.6 2,'0/3,26 +/08"54348#8&:@D!E)=)?*E0E'D"I0I,J,C/=1=0J+@+D0K.L3M2S3V1L<V9S6V5P2U7[3[6Q1S3Q8N8Q9M5R@Q8M3N6J7N6M<E@@;888:4?0;,A4A4F4A3@+B(F&I+E(I&H,G/B(@(?,?"?#9"6#8$5"8'@"9':->+9&5,3'5$:5#<#>#=$9>@>C;:=AB >F ILKOTNVX`Y]X`U\W[V\[VYYRLPUUPSLFDGHDGIIG>EIOKG=?:94:85=>=4:>8<96501385/-./)).,2/,+-/++'$&&    ~}   } } } |~yzyzxihmt q pqqtp l r t} x ~u |vtzyyzz}}x~}~xuz|pyyuhpquuqh``d^[\a[WWWFPNHOMTSSSTVTW[SWNTOJPSRSOGFFBAC>95>?>::812,0--% $*+-)-3+%((*+-%$%)) #)          }{z}{}}{w{z}|~            ##!#+""#""(#((%'$ $ ""#(!#*/#*+"#$"$'" #%%-2+2///--/.32//82/3219:;;7<85560.782//.0-,)32(&()()(-+&(%%&$&#"" !&  !&(#%%&  %#&$ ! %$!%&&*-++()-*)(0**~()*-+{/~.%~),%(&%$&$&(&()()~!)%"!'!"  }~x~|}}zy}w~||y{ysv}~vtqv|v{rxy{z}zzy~}|y~zs~|}wz{y~v{z}|u{v}}~{vx{xuoq~}zzzx|~yx{yzt|z  "! )#(&((&*+(~+75z5{926y2v6|8q5v9w6v=r>r?v6s8q3s1l2j:o4v8v9v;rCq@v;{;|<y?5:4:;=>@?><8568w5z=~:A{A{C~H~JO~SXw]s[y]x`qcnbiggkmlncifginbmYs_wfrimijpinnnspvsnkomhikjmuesepgteoerfr\qbv]r\w\uaofv]y]v]wariseob{]a]``^e]a]]a^\b]ee_]\]\Y]]XYb`b]]jieinomnfmshjnjvmejjkjemkdZ^XYS]a^XZTXYSUPYPQJEOPQKLH?:;;:9;624178;777>/)&.-#! ~|xswsnqksomfjeaicjgYc_X\`_cc]Yfnqosz|zq vs yy x|y}|z }zqsvvsuyppmkmgeeifcbccc__\\^dededopjiigfiieijenkiqoomkqr trz rnm mkijllllf b d\Y[`_b]!_\`e!m*l*i*i&i c*f'e$d/f+i3i6j:jo@qDn@tKrMp>kAk>lIn?nLiMeBiHk;p?i?i@lBnDfCeDgDcD[?]C\=c?^>cDi?jZ@U:X@[H`G\HXH\DYF\H`HeHfLbCdLfDbAaGf?iAjCf>c?d@d?^Dd?`;`C_D[?\<\5]=Y>^<]>XAVCUDR5S$;"7&8)5!7)3(8-2*217+?"5%8)6+402(7#-#.(7/:+@*D,C(D(H-G'C1D.@+F,E-?(C'F(L(M+M-O)M*J3I9O2M5U3T8TASAL>QGPGOBPDP;M=G:H9K9M6G8D<?9B<H7G2I5H6K2E0C2D9C2E/=2@8707/?/>6*A5:17(C/@2;-7*;*>(?)L)H(H+C)C-?0E%D*H(C(?(L(K%R&OP!Q#P&Q'P*M%L%U%Y%W"Q#K!Q"U&U'Q,\%e,e-j(e(g*e'fd b `]i pa]aib^a)a'e)a$n'r"wn!n%i&o){+z)r*q(o&r)u(w/{0u+s(m)r%s%s"q{wzyswry|vmorvs#m%m&j"k&e%](\a"^!d%g%h#n"n#j!a#^&T$U&W"Y$Q#YPTU]XX^]]]UX\YXUY YY\Yf jh nxvrsinormkqw ~{ {w z{ |z w u ||#y#}%#$  "  !&w"v+-}(w+w({-q3w2r6w5w8z9w9u5t6{;}6x:A{4~6~99z5w67:;<=?;>?<97;@;=9?<88;C<=;@8;<<C<?=58>C?CDB<55625831/28=;@?9;@?B=B;@>?99?@F?EJADB?C?>?@BCBHIE?<>A????7:BACHGDG>>@@8998<;CIHLSNJOMULQWTWXZ[YVUVX`XY_a_`_ZYXZY\\_\a]X\cif_`]X_``bdb``U][]UUXKSKMCLIEEB?CJEDEB@;JHDBCE@CABC?8>8<<8=;7><:@FB<>@;987>@7A?ACBE??BAEKHJLLLPVYXWRPUYYZTVVPRSVVV`^_`\]`Zagffidefbdcb```^b`b`\][cacfge\\`eciidic_dcebbgbffijchgff^dedaiigiidff_`_]`\] ^ce jb_]\`]\[_Z\YWRSLOUV Z\UWX V WY[\ SVV U VU Y S SRPQO MRW OPONPKOI? ?? FC BCIKIBCBCGGGMKGDBIJEFIIIBB CCFGLMPKIP)P$Q%W R$X)Y*Z/U1W2P1S1Q4R;T8O:OAH>J:O9O=TBR:OBMFL>NAV>T5RBR>R>PFFFIKILGIIKIKIJHKJJRLRIXKQPWRQNMOIKBOIJIKFTDMMSHSG]DRFWGTBRESITLOKTHSCRFTFWAWDWBYFQI[L\L\F[B`C]E[EXT\I[E\FSA`J[H_HdJ_G\M[I]LVPWKaR\ZVXX`c`i]iUb\h]l[nah\cXi`d`hYcaa\Z_e_cda^_]a\_]aT`Zd\_[cc`_[baidf`fkpitdogourmtplhmnutwlxpzqvnyq|x~x~}|}u|}{syrtxqw}p|y{yzw{x{v~z{vsmssjoporoncekpkejmppulhmmoslmolljlkhkpfghfhikmrglekpslnusvwxv|tsyswwsxy|}z~}vtury}~||~xzt}{}|yywsqsqqlvmyussnshtgpakalbhbkbl`m_c_iZdYjWpXmSoUkNoKnUnJjEjHjEoChDlCmClHqJiFnJlJjLmLlHiIeHmBdDfHhEnBj?g:g:m@l:h4c4e4d8`4`3]6d4d3c2h0c/_2c-g0]/X,\,b1c,`.^+`.b3d,e*j,h2h-f*g(e,f'a&Y$_\ ^h h#dd"\$`!a`_d!`Y]b`abc___\XW]]\a\W W []` \ ]^Z `` ba ba d gc_cac\\__aee`\b][\W[Y[Z^X[YY\W\]Y\cdcb^bd`^X]efe`ceeghadeci_chcb^fYWVRYY\XY^XW[]\WX[\_feabYYZYZYV[UWSSYTRTQTTLJGHIKGFJKJ?FEEAFBABALFJEHFJHJGIJDKMQNOKONQSMOMKJNMJGJLOQLPMTUOKLRMIKKMSOPSVXQRQQPQUSWVXWVSQSSUU~W|T}UwSzUxQwQyUzR{UzR|UzUyQuRuQsPtSuQwPvTyVyTuRtTsSrSpTmTtSqNsQvSrKqQlLnRrSoQpPmSsVpPsSnNoMmOjKlLhKhNfLgQdMcOfNfSeVeUeSdUcVbV^U`W_Y`Z^Xa]_S[X]Y\Y\YZYX\XZXWZ`Z^YYYWTYWYT^SXWZVUTXVVPQRSRONQQNQROPNNMQNOKRMOKMKJJSGQFSGSGSEQERGQ@OCOENDPDO@QAQAQ>N=OAR>S:U:VVZ=V?Y>W>Y=X;[;[<]<[:[9[:W<]<_>a:]8`<`9c:b:f;c9c;c;c7bk=kAl@l=op>moo=p=rm;kAlCnCpGnHnEpFoEpCrItFvHwIvJrMvOtPuOuNxOtPuPtQxQyTuUvV{VwWwW{WyUyVxVwXvYvYw\u\w]x`x_v_yavawcxdybucvfsbsdseodteqdqbpdqdtdtfpftesfqfpcrhrgweyizfzezhxizlumwjxkulvkxivkvqxmymzmwnvqxpwq{oxq|p}m{q}n{q|oyqzsxuxxyxyx{{{zzxvwxzx|y{z{x{xzy|zyw~wyx|w{w{uxxyv{v~w{x~t~s}u|wus~uuuutuuxwvvtruuuswvy|z|y~y{zxuuxwwzwyswrrqsrqprqpqnopnopoqoonlnkjhkkjjjjggfhidefghegghgeidcbedebac^b_a`^`^_^[]\ZZZ[[ZZY[XYWXVVVUVSUTUUTRUTROSSRQQOOONMNMPLLNJKLMJLJIJGJIKHCGLFG?BP@GF?E?@C;:>:>;9;;8@86<4=929688577673403521.3201101..0+/-,.,++*+*(+)((%)'$'#&&"#$!&%"!# " # !    ./examples/jokes/jokes.apparmor0000644000015600001650000000014212700370714016702 0ustar jenkinsjenkins{ "policy_groups": [ "networking", "audio" ], "policy_version": 1.3 } ./examples/jokes/jokes.desktop0000644000015600001650000000030412700370714016532 0ustar jenkinsjenkins[Desktop Entry] Name=Jokes Exec=qmlscene $@ jokes.qml Icon=qmlscene Terminal=false Type=Application X-Ubuntu-Touch=true X-Ubuntu-Gettext-Domain=com.ubuntu.developer.bzoltan.jokes Icon=jokes.png ./examples/examples.pro0000644000015600001650000000021712700370714015254 0ustar jenkinsjenkinsTEMPLATE = subdirs SUBDIRS += \ ubuntu-ui-toolkit-gallery\ locale \ jokes \ unit-converter \ calculator \ customtheme ./examples/ubuntu-ui-toolkit-gallery/0000755000015600001650000000000012700370716017773 5ustar jenkinsjenkins./examples/ubuntu-ui-toolkit-gallery/ListItemsSection.qml0000644000015600001650000000222412700370701023742 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 TemplateSection { id: section property alias delegate: repeater.delegate property alias count: repeater.count documentation: "qml-ubuntu-components-listitems-%1.html".arg(className.toLowerCase()) function itemAt(index) { return repeater.itemAt(index) } Column { id: column anchors.left: parent.left anchors.right: parent.right Repeater { id: repeater model: 4 } } } ./examples/ubuntu-ui-toolkit-gallery/ubuntu-ui-toolkit-gallery.desktop0000644000015600001650000000060712700370701026440 0ustar jenkinsjenkins[Desktop Entry] Name=Ubuntu UI Toolkit Gallery Exec=qmlscene %U ubuntu-ui-toolkit-gallery.qml Terminal=false Type=Application X-Ubuntu-Touch=true X-Ubuntu-Gettext-Domain=com.ubuntu.developer.bzoltan.ubuntu-ui-toolkit-gallery # Added Icon and Path as a workaround for http://pad.lv/1227359. # TODO remove them once that bug is fixed. --elopio - 2013-09-18 Icon=ubuntu-ui-toolkit-gallery.png ./examples/ubuntu-ui-toolkit-gallery/ListItemLayouts.qml0000644000015600001650000002046612700370701023623 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Template { objectName: "listItemLayoutTemplate" TemplateSection { className: "ListItemLayout" title: "Examples of core apps list items" // no spacing between the list items in the Column spacing: 0 ListItem { id: addressbookListItem height: addressbookLayout.height + (divider.visible ? divider.height : 0) ListItemLayout { id: addressbookLayout title.color: UbuntuColors.lightAubergine title.text: "Address book list item: Name goes here" Rectangle { SlotsLayout.position: SlotsLayout.Leading color: "pink" height: units.gu(6) width: height visible: width > 0 } } } ListItem { id: addressbookDetailsListItem height: addressbookDetailsLayout.height + (divider.visible ? divider.height : 0) ListItemLayout { id: addressbookDetailsLayout title.color: UbuntuColors.lightAubergine title.text: "+12 3456789012" subtitle.text: "Mobile" Icon { name: "message" height: units.gu(2) } Icon { name: "call-start" height: units.gu(2) } } } ListItem { id: telegramContactsListItem height: telegramContactsLayout.height + (divider.visible ? divider.height : 0) ListItemLayout { id: telegramContactsLayout title.text: "Telegram Name goes here" subtitle.text: "last seen 12:02" summary.text: "Oh wow! What a nice layout!" Rectangle { id: imageShape SlotsLayout.position: SlotsLayout.Leading height: units.gu(6) width: height color: "red" } } } ListItem { id: systemSettings1 height: systemSettings1_layout.height + (divider.visible ? divider.height : 0) ListItemLayout { id: systemSettings1_layout title.text: "Call forwarding" ProgressionSlot {} Text { font.pixelSize: FontUtils.sizeToPixels("medium") text: "Off" color: "#525252" } } } ListItem { id: systemSettings2 height: systemSettings2_layout.height + (divider.visible ? divider.height : 0) ListItemLayout { id: systemSettings2_layout title.text: "Flight mode" //see http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/wily/ubuntu-system-settings/wily-proposed/view/head:/src/qml/EntryComponent.qml Icon { SlotsLayout.position: SlotsLayout.Leading width: units.gu(6); height: units.gu(6); name: "airplane-mode" } Switch { } } } ListItem { id: systemSettings3 height: systemSettings3_layout.height + (divider.visible ? divider.height : 0) ListItemLayout { id: systemSettings3_layout title.text: "الفيسبوك" subtitle.text: "الفيسبوك" LayoutMirroring.enabled: true LayoutMirroring.childrenInherit: true ProgressionSlot {} Icon { SlotsLayout.position: SlotsLayout.Leading width: units.gu(6); height: units.gu(6); name: "facebook" } } } } TemplateSection { className: "ListItemLayout" title: "Custom labels properties" spacing: 0 ListItem { height: customLabelsLayout.height + (divider.visible ? divider.height : 0) ListItemLayout { id: customLabelsLayout title.text: "Lorem ipsum..." title.color: "blue" title.horizontalAlignment: Text.AlignHCenter subtitle.text: "..dolor sit amet, consectetur adipiscing elit..." subtitle.color: "red" subtitle.horizontalAlignment: Text.AlignHCenter summary.text: "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." + "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi" + "ut aliquip ex ea commodo consequat." summary.color: "green" summary.horizontalAlignment: Text.AlignHCenter } } } TemplateSection { className: "ListItemLayout" title: "With swiping actions" // no spacing between the list items in the Column spacing: 0 ListItemActions { id: exampleLeadingActions actions: [ Action { iconName: "delete" } ] } ListItemActions { id: exampleTrailingActions actions: [ Action { iconName: "edit" }, Action { iconName: "save-to" } ] } ListItemWithLabel { title.text: i18n.tr("Leading and trailing actions") leadingActions: exampleLeadingActions trailingActions: exampleTrailingActions } } TemplateSection { className: "ListItemLayout" title: "Custom vertical positioning of slots" // no spacing between the list items in the Column spacing: 0 ListItem { id: dialerHistoryListItem height: dialerHistoryLayout.height + (divider.visible ? divider.height : 0) ListItemLayout { id: dialerHistoryLayout title.text: "+12 3456789012 (3)" title.color: UbuntuColors.lightAubergine subtitle.text: "Mobile" Rectangle { SlotsLayout.position: SlotsLayout.Leading color: "pink" height: units.gu(6) width: height visible: width > 0 } Item { id: slot width: label2.width height: parent.height //as we want to position labels to align with title and subtitle SlotsLayout.overrideVerticalPositioning: true Label { id: lab anchors.right: label2.right text: "19:17" fontSize: "small" y: dialerHistoryLayout.mainSlot.y + dialerHistoryLayout.title.y + dialerHistoryLayout.title.baselineOffset - baselineOffset } Label { id: label2 text: "Outgoing" fontSize: "small" y: dialerHistoryLayout.mainSlot.y + dialerHistoryLayout.subtitle.y + dialerHistoryLayout.subtitle.baselineOffset - baselineOffset } } } } } } ./examples/ubuntu-ui-toolkit-gallery/Colors.qml0000644000015600001650000002054412700370701021746 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import QtQml.Models 2.1 Template { id: colorsTemplate objectName: "colorsTemplate" TemplateSection { id: paletteSection title: "Palette" className: "Palette" documentation: "qml-palette.html" property var palettes: ["normal", "disabled", "selected", "selectedDisabled", "highlighted"] property var paletteValues: [["background", ["backgroundText", "backgroundSecondaryText", "backgroundTertiaryText"]], ["base", ["baseText"]], ["foreground", ["foregroundText"]], ["field", ["fieldText"]], ["focus", ["focusText"]], ["activity", ["activityText"]], ["negative", ["negativeText"]], ["overlay", ["overlayText", "overlaySecondaryText"]], ["positive", ["positiveText"]], ["raised", ["raisedText", "raisedSecondaryText"]], ["selection", ["selectionText"]]] Flow { id: paletteFlow anchors { left: parent.left right: parent.right } spacing: units.gu(2) property var previewed Repeater { model: paletteSection.palettes Column { spacing: units.gu(1) width: paletteColorGrid.width property var palette: theme.palette[modelData] Label { text: "theme.palette." + modelData textSize: Label.Small } Grid { id: paletteColorGrid spacing: units.gu(0) Repeater { model: paletteSection.paletteValues Item { id: paletteColor property string mainColor: modelData[0] property var textColors: modelData[1] property bool previewed: paletteFlow.previewed == paletteColor width: units.gu(4) height: units.gu(5) z: previewed ? 10 : 0 MouseArea { id: colorHoverArea anchors.fill: parent hoverEnabled: true onClicked: paletteFlow.previewed = paletteColor onContainsMouseChanged: { if (containsMouse) { paletteFlow.previewed = paletteColor; } else { if (paletteFlow.previewed == paletteColor) { paletteFlow.previewed = null; } } } } Rectangle { width: paletteColor.width + (previewed ? units.gu(26) : 0) height: paletteColor.height + (previewed ? units.gu(2.5) : 0) Behavior on height { UbuntuNumberAnimation {duration: UbuntuAnimation.SnapDuration} } color: theme.palette.normal.background parent: previewed ? colorsTemplate : paletteColor x: Math.max(0, paletteColor.mapToItem(parent, 0, 0).x + (previewed ? (paletteColor.width-width)/2 : 0)) y: paletteColor.mapToItem(parent, 0, 0).y + (previewed ? (paletteColor.height-height)/2 : 0) Rectangle { anchors.fill: parent color: palette[mainColor] border.width: color == theme.palette.normal.background ? units.dp(1) : 0 border.color: theme.palette.normal.backgroundText } Column { anchors { left: parent.left leftMargin: units.gu(0.5) right: parent.right top: parent.top topMargin: units.gu(0.5) } Repeater { model: textColors Label { width: previewed ? implicitWidth : parent.width text: previewed ? modelData : modelData.slice(0, 4) color: palette[modelData] textSize: previewed ? Label.Medium : Label.XSmall elide: Text.ElideRight } } } } } } } } } } } TemplateSection { title: "UbuntuColors" className: "UbuntuColors" // Except orange, none of the colors from UbuntuComponents 1.0 // are included because they may be deprecated soon. TemplateRow { title: i18n.tr("Orange") UbuntuShape { backgroundColor: UbuntuColors.orange } } TemplateRow { title: i18n.tr("Porcelain") UbuntuShape { backgroundColor: UbuntuColors.porcelain } } TemplateRow { title: i18n.tr("Silk") UbuntuShape { backgroundColor: UbuntuColors.silk } } TemplateRow { title: i18n.tr("Ash") UbuntuShape { backgroundColor: UbuntuColors.ash } } TemplateRow { title: i18n.tr("Graphite") UbuntuShape { backgroundColor: UbuntuColors.graphite } } TemplateRow { title: i18n.tr("Slate") UbuntuShape { backgroundColor: UbuntuColors.slate } } TemplateRow { title: i18n.tr("Inkstone") UbuntuShape { backgroundColor: UbuntuColors.inkstone } } TemplateRow { title: i18n.tr("Jet") UbuntuShape { backgroundColor: UbuntuColors.jet } } TemplateRow { title: i18n.tr("Red") UbuntuShape { backgroundColor: UbuntuColors.red } } TemplateRow { title: i18n.tr("Green") UbuntuShape { backgroundColor: UbuntuColors.green } } TemplateRow { title: i18n.tr("Blue") UbuntuShape { backgroundColor: UbuntuColors.blue } } TemplateRow { title: i18n.tr("Purple") UbuntuShape { backgroundColor: UbuntuColors.purple } } } } ./examples/ubuntu-ui-toolkit-gallery/TextInputs.qml0000644000015600001650000001141512700370701022631 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Template { objectName: "textinputsTemplate" property string longText: "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + "Suspendisse sed nulla in arcu dapibus vehicula ac eu tellus. "+ "Mauris malesuada nisl vitae neque auctor placerat. Ut vitae "+ "luctus libero. Praesent tempus nisl faucibus tellus semper "+ "eget iaculis purus congue. Donec elit tellus, malesuada non "+ "vehicula a, sagittis vel purus. Ut elementum vehicula accumsan. "+ "Pellentesque habitant morbi tristique senectus et netus et malesuada "+ "fames ac turpis egestas. Suspendisse ut rutrum sapien. Nullam id lobortis mauris"+ "Maecenas sollicitudin ipsum eu mauris vehicula rutrum. Proin aliquet "+ "justo ut mi luctus eu lobortis risus elementum. Cras sit amet "+ "sollicitudin magna. Quisque facilisis sodales tincidunt. Maecenas "+ "ligula tortor, luctus id elementum vel, varius vel augue. "+ "Nunc porta mattis bibendum. Nam vitae sapien ipsum, non viverra neque." // http://qt-project.org/doc/qt-5/richtext-html-subset.html property string richText: "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + "Nunc pretium iaculis risus, sed vehicula odio varius ac." + "Etiam orci lectus, bibendum in vulputate ac, tristique quis dui." TemplateSection { title: "Single line" className: "TextField" TemplateRow { title: i18n.tr("Standard") TextField { objectName: "textfield_standard" placeholderText: i18n.tr("Type me in...") width: parent.width } } TemplateRow { title: i18n.tr("Password") TextField { objectName: "textfield_password" echoMode: TextInput.Password text: "password" width: parent.width } } TemplateRow { title: i18n.tr("Numbers") TextField { objectName: "textfield_numbers" text: "123" validator: IntValidator {} width: parent.width } } TemplateRow { title: i18n.tr("Read-only") TextField { objectName: "textfield_read_only" text: i18n.tr("Nobody type here") readOnly: true width: parent.width horizontalAlignment: TextInput.AlignHCenter } } TemplateRow { title: i18n.tr("Disabled") TextField { objectName: "textfield_disabled" text: i18n.tr("No interaction allowed") enabled: false width: parent.width horizontalAlignment: TextInput.AlignRight } } } TemplateSection { title: "Multi-line" className: "TextArea" TemplateRow { title: i18n.tr("Default") TextArea { objectName: "textarea_default" text: longText width: parent.width } } TemplateRow { title: i18n.tr("Expanding") TextArea { objectName: "textarea_expanding" placeholderText: "Expands up to 5 lines" autoSize: true maximumLineCount: 5 width: parent.width } } TemplateRow { title: i18n.tr("Rich Text") TextArea { objectName: "textarea_richtext" textFormat: TextEdit.RichText text: richText width: parent.width } } } } ./examples/ubuntu-ui-toolkit-gallery/Pickers.qml0000644000015600001650000002012612700370701022101 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Pickers 1.3 Template { objectName: "pickersTemplate" id: root property var stringListModel: ["starred", "media-record", "like", "language-chooser", "go-home", "email", "contact-group", "notification", "active-call"] TemplateSection { className: "Picker" documentation: "qml-ubuntu-components-pickers-picker.html" TemplateRow { title: i18n.tr("Linear") Picker { circular: false model: ["Line1", "Line2", "Line3", "Line4", "Line5", "Line6", "Line7", "Line8", "Line9", "Line10"] delegate: PickerDelegate { Label { text: modelData anchors.fill: parent verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter } } onSelectedIndexChanged: print("index=" + selectedIndex) } Picker { circular: false model: stringListModel itemHeight: units.gu(3) delegate: PickerDelegate { Icon { anchors.centerIn: parent name: modelData width: units.gu(2) height: units.gu(2) } } } } TemplateRow { title: i18n.tr("Circular") Picker { delegate: PickerDelegate { Label { text: modelData anchors.fill: parent verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter } } onSelectedIndexChanged: print("index=" + selectedIndex) Component.onCompleted: { var stack = []; for (var i = 0; i < 100; i++) { stack.push("Line " + i); } model = stack; selectedIndex = 3; } } Picker { model: stringListModel itemHeight: units.gu(3) delegate: PickerDelegate { Icon { anchors.centerIn: parent name: modelData width: units.gu(2) height: units.gu(2) } } } } TemplateRow { title: i18n.tr("Infinite") Picker { id: picker model: ListModel {} circular: false delegate: PickerDelegate { Label { text: modelData anchors.fill: parent verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter } Component.onCompleted: { if (index === (picker.model.count - 1)) picker.expandModel() } } function expandModel() { for (var i = 0; i < 50; i++) { picker.model.append({"blob": "Line " + picker.model.count}); } } Component.onCompleted: { for (var i = 0; i < 100; i++) model.append({"blob" : "Line " + i}) } } } } TemplateSection { className: "Dialer" documentation: "qml-ubuntu-components-pickers-dialer.html" TemplateRow { title: i18n.tr("Clock") Dialer { size: units.gu(20) handSpace: units.gu(4) minimumValue: 0 maximumValue: 60 DialerHand { id: hour hand.toCenterItem: true value: new Date().getHours() * 5 } DialerHand { id: minute value: new Date().getMinutes() } DialerHand { id: second value: new Date().getSeconds() } centerContent: [ Label { id: hourLabel anchors.centerIn: parent } ] onHandUpdated: { hourLabel.text = Math.round(hour.value / 5) + ":" + Math.round(minute.value) + ":" + Math.round(second.value); } } } TemplateRow { title: i18n.tr("Overlay") Dialer { size: units.gu(20) handSpace: units.gu(4) DialerHand { id: selector hand.visible: false value: 311 Rectangle { anchors.centerIn: parent width: height height: units.gu(3) radius: width / 2 color: theme.palette.normal.background antialiasing: true Label { text: Math.round(selector.value) anchors.centerIn: parent } } } centerContent: [ Label { id: handText anchors.centerIn: parent } ] onHandUpdated: handText.text = Math.round(hand.value); } } } TemplateSection { className: "DatePicker" documentation: "qml-ubuntu-components-pickers-datepicker.html" TemplateRow { title: "Date" DatePicker { // make sure we have the whole component in screen width: Math.min(root.width - units.gu(16), units.gu(40)) onDateChanged: print("picked date="+Qt.formatDate(date, "yyyy/MMMM/dd")) } } TemplateRow { title: "Month" DatePicker { mode: "Years|Months" // make sure we have the whole component in screen width: Math.min(root.width - units.gu(16), units.gu(40)) onDateChanged: print("picked month="+Qt.formatDate(date, "yyyy/MMMM")) } } TemplateRow { title: "Time" DatePicker { mode: "Hours|Minutes|Seconds" date: new Date() // make sure we have the whole component in screen width: Math.min(root.width - units.gu(16), units.gu(40)) onDateChanged: print("picked time="+Qt.formatTime(date, "hh:mm:ss")) } } } TemplateSection { title: "PickerPanel" TextField { id: textField readOnly: true property date date: new Date() text: date.toISOString() Mouse.onClicked: PickerPanel.openDatePicker(textField, "date"); } } } ./examples/ubuntu-ui-toolkit-gallery/ListItems.qml0000644000015600001650000003450412700370701022423 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 as Toolkit import Ubuntu.Components.ListItems 1.3 as ListItem Template { objectName: "listItemsTemplate" ListItemsSection { title: i18n.tr("Standard") className: "Standard" delegate: ListItem.Standard { text: i18n.tr("Label") } } ListItemsSection { title: i18n.tr("Subtitled") className: "Subtitled" delegate: ListItem.Subtitled { text: i18n.tr("Label") subText: i18n.tr("Secondary label") } } ListItemsSection { title: i18n.tr("Icon") className: "Standard" delegate: ListItem.Standard { text: i18n.tr("Label") iconSource: Qt.resolvedUrl("avatar_contacts_list.png") } } TemplateSection { title: i18n.tr("ThinDivider") className: "ListItems-ThinDivider" Column { anchors.left: parent.left anchors.right: parent.right ListItem.Standard { text: i18n.tr("Label") showDivider: false } ListItem.ThinDivider { } ListItem.Standard { text: i18n.tr("Label") showDivider: false } } } ListItemsSection { title: i18n.tr("Progression") className: "Standard" delegate: ListItem.Standard { text: i18n.tr("Label") progression: true } } ListItemsSection { title: i18n.tr("Single value") className: "SingleValue" delegate: ListItem.SingleValue { text: i18n.tr("Label") value: i18n.tr("Value") } } ListItemsSection { title: i18n.tr("Multi value") className: "MultiValue" delegate: ListItem.MultiValue { text: i18n.tr("Label") values: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } } ListItemsSection { title: i18n.tr("Item selector") className: "ItemSelector" Column { anchors.left: parent.left anchors.right: parent.right spacing: units.gu(3) ListItem.ItemSelector { text: i18n.tr("Expanding") model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } ListItem.ItemSelector { text: i18n.tr("Expanded") expanded: true model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } ListItem.ItemSelector { text: i18n.tr("Multiple Selection") expanded: false multiSelection: true model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4")] } ListItem.ItemSelector { text: i18n.tr("Custom Model") model: customModel expanded: true colourImage: true delegate: selectorDelegate } Component { id: selectorDelegate Toolkit.OptionSelectorDelegate { text: name; subText: description; iconSource: image } } ListModel { id: customModel ListElement { name: "Name 1"; description: "Description 1"; image: "images.png" } ListElement { name: "Name 2"; description: "Description 2"; image: "images.png" } ListElement { name: "Name 3"; description: "Description 3"; image: "images.png" } ListElement { name: "Name 4"; description: "Description 4"; image: "images.png" } } ListItem.ItemSelector { text: i18n.tr("Label") model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4"), i18n.tr("Value 5"), i18n.tr("Value 6"), i18n.tr("Value 7"), i18n.tr("Value 8")] containerHeight: itemHeight * 4 } ListItem.ItemSelector { text: i18n.tr("Label") expanded: true selectedIndex: -1 model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4"), i18n.tr("Value 5"), i18n.tr("Value 6"), i18n.tr("Value 7"), i18n.tr("Value 8")] containerHeight: itemHeight * 4 } } } ListItemsSection { title: i18n.tr("Control") className: "Standard" delegate: ListItem.Standard { text: i18n.tr("Label") control: Toolkit.Switch { anchors.verticalCenter: parent.verticalCenter } } } ListItemsSection { id: removableSection title: i18n.tr("Removable") className: "Standard" delegate: ListItem.Standard { text: i18n.tr("Slide to remove") removable: true confirmRemoval: (index % 2) backgroundIndicator: Rectangle { anchors.fill: parent color: theme.palette.normal.base } } Toolkit.Button { text: i18n.tr("Reset") anchors.right: parent.right onClicked: { for (var i=0, iMax=removableSection.count; i < iMax; i++) { removableSection.itemAt(i).cancelItemRemoval() } } } } TemplateSection { title: i18n.tr("Grouped list") className: "ListItems-Header" Rectangle { color: Qt.rgba(0.0, 0.0, 0.0, 0.01) anchors.left: parent.left anchors.right: parent.right height: groupedList.height ListModel { id: groupedModel ListElement { name: "Orange"; type: "Fruit"} ListElement { name: "Apple"; type: "Fruit" } ListElement { name: "Tomato"; type: "Fruit" } ListElement { name: "Carrot"; type: "Vegetable" } ListElement { name: "Potato"; type: "Vegetable" } } ListView { id: groupedList model: groupedModel width: parent.width height: contentHeight interactive: false delegate: ListItem.Standard { text: i18n.tr(name) } section.property: "type" section.criteria: ViewSection.FullString section.delegate: ListItem.Header { text: i18n.tr(section) } } } } TemplateSection { title: i18n.tr("UbuntuListView") className: "UbuntuListView" ListModel { id: fruitModel ListElement { name: "Orange"; details: "The orange (specifically, the sweet orange) is the fruit of the citrus species Citrus × ​sinensis in the family Rutaceae. The fruit of the Citrus sinensis is called sweet orange to distinguish it from that of the Citrus aurantium, the bitter orange. The orange is a hybrid, possibly between pomelo (Citrus maxima) and mandarin (Citrus reticulata), cultivated since ancient times.\n-\nWikipedia"} ListElement { name: "Apple"; details: "Fruit" } ListElement { name: "Tomato"; details: "The tomato is the edible, often red fruit of the plant Solanum lycopersicum, commonly known as a tomato plant. Both the species and its use as a food originated in Mexico, and spread throughout the world following the Spanish colonization of the Americas. Its many varieties are now widely grown, sometimes in greenhouses in cooler climates. The tomato is consumed in diverse ways, including raw, as an ingredient in many dishes, sauces, salads, and drinks. While it is botanically a fruit, it is considered a vegetable for culinary purposes (as well as under U.S. customs regulations, see Nix v. Hedden), which has caused some confusion. The fruit is rich in lycopene, which may have beneficial health effects. The tomato belongs to the nightshade family (Solanaceae). The plants typically grow to 1–3 meters (3–10 ft) in height and have a weak stem that often sprawls over the ground and vines over other plants. It is a perennial in its native habitat, although often grown outdoors in temperate climates as an annual. An average common tomato weighs approximately 100 grams (4 oz).\n-\nWikipedia" } ListElement { name: "Carrot"; details: "Vegetable" } ListElement { name: "Potato"; details: "Vegetable" } } Toolkit.SortFilterModel { id: processedFruits model: fruitModel sort.property: "title" sort.order: Qt.DescendingOrder filter.property: "details" filter.pattern: /Vegetable/ } Toolkit.UbuntuListView { id: ubuntuListView anchors { left: parent.left; right: parent.right } height: units.gu(24) model: processedFruits clip: true delegate: ListItem.Expandable { id: expandingItem expandedHeight: contentColumn.height + units.gu(1) onClicked: { ubuntuListView.expandedIndex = index; } Column { id: contentColumn anchors { left: parent.left; right: parent.right } Item { anchors { left: parent.left; right: parent.right} height: expandingItem.collapsedHeight Toolkit.Label { anchors { left: parent.left; right: parent.right; verticalCenter: parent.verticalCenter} text: model.name } } Toolkit.Label { anchors { left: parent.left; right: parent.right } text: model.details wrapMode: Text.WordWrap } } } } } ListItemsSection { title: i18n.tr("ExpandablesColumn") className: "ExpandablesColumn" ListItem.ExpandablesColumn { anchors { left: parent.left; right: parent.right } clip: true height: units.gu(24) Repeater { model: 8 ListItem.Expandable { id: expandingColumnItem expandedHeight: contentColumn1.height + units.gu(1) collapseOnClick: index % 2 == 0 onClicked: { expanded = true; } Column { id: contentColumn1 anchors { left: parent.left; right: parent.right } Item { anchors { left: parent.left; right: parent.right} height: expandingColumnItem.collapsedHeight Toolkit.Label { anchors { left: parent.left; right: parent.right; verticalCenter: parent.verticalCenter} text: "Item " + index + (expandingColumnItem.collapseOnClick ? " (with collapseOnClick)" : "") } } Toolkit.UbuntuShape { anchors { left: parent.left; right: parent.right } height: index % 2 == 0 ? units.gu(6) : units.gu(18) backgroundColor: "khaki" } } } } } } ListItemsSection { title: i18n.tr("Expandable") className: "Expandable" Column { anchors { left: parent.left; right: parent.right } clip: true Repeater { model: 2 ListItem.Expandable { id: expandingItem1 expandedHeight: contentCol1.height + units.gu(1) onClicked: { expanded = !expanded; } Column { id: contentCol1 anchors { left: parent.left; right: parent.right } Item { anchors { left: parent.left; right: parent.right} height: expandingItem1.collapsedHeight Toolkit.Label { anchors { left: parent.left; right: parent.right; verticalCenter: parent.verticalCenter} text: "Item " + index } } Toolkit.UbuntuShape { anchors { left: parent.left; right: parent.right } height: index % 2 == 0 ? units.gu(6) : units.gu(18) backgroundColor: "khaki" } } } } } } } ./examples/ubuntu-ui-toolkit-gallery/demo_image_3.png0000644000015600001650000074041312700370701023014 0ustar jenkinsjenkinsPNG  IHDR6bKGD pHYs$$P$tIME 6BQMY tEXtCommentDBPZ= IDATxԽˎ$[fGfszrWB9zB~gy=9aspirXUUv<m===YuV׵vthOíǦi}x_ff׮~]Άayj>Sm.7sgin n7jz8h}/eYu:33{D `u][۶V׵ `}{ןCσ;ڶz~=uƦiy/^WkrYCm{ W+SU‡1T>eϥŏ|gí4Mv<il{׺m3}?0Z]׿s5^qfCw<gH00junw_߿t]7=7883忇6 0Tg =0g׼m[; ǧ7v  K~_n8tgv=lY}c}hYxmw8. `1|lt|q8*ppaT;xQMoB+1|?& sQQ(ql?ƟP3"vqC>=4+J)E#^, QRGnΦ xn۶]e[>߻nvf]׭2o9 #dil=Z_C~n70 -é(72|%1AH鞑,qF,:aGZbr_@H+y$#k}~>ͪ?fhxZG ^UfA{ n `~൲a# 6Q2k~o\O5C. 3R˯peoKИ{~k]9ID!/ , sm霁Q?Gb*QTd\ا"~* Xko(rQd49}WG/u@O?XA?g2if߮z]N8}4MiNUUU_W? pF.g̢eo0NA=y䮏!4<u]1yf)CQ.k׶]׹iήr/BxmAMfZYnp3 w>Seи&~7%*'ETAuv8浻\.;sSl^k_C^wׯff{ ~y>&3^ pf]Y4fqR~4l9Ś܋0 h}Opdeύðξr}VjeysqE2rgQWmhf3MI! A#RdmnQGBOѶA[n=Bq/M$SG=8|P6zzT! vk}"̂,_ʍzO 1(Ok*3"F3K kܧPUՋN9 QQ3mG-:?ٛY~/AWTn3ʹ5[* 䞮3eqh13r s▋#HG9r ¹i*hƹ쥄6:7d(T:pyw}T@F5fQwv+շmѨ# 01]kMk==V䩪S]ׯLV(  RT[v*ZD8}rI#G׊ qgKnT*TOΆay&1NL#Ď5v lpa@dT0=J3֜n#p"#'QUJ&YG9ݝLUQI"hnDD4۷2 TR|QH)gS|7\<^/×i^qO+*2xذ;lRibFlYTfXco{۶s/h#VT*J^XCAh'g0D$ҏIIEz70.*QetT7/;0ʇTA]\t;@X'b"@T?"M ͟7N>gaDsSOi1CM{R– ?~,k!>/)QDu3HXi >GgZt1>vqgzi#Hԧi|z0~niLe%(j(u9 EU|P5wj֩2pcJ FNq#S7+.Z[_Eo DD67wFx*~vߓ)Q6@Գ"+Ť{UI)֗/_fƙSK<>u=+rVUթi er!A& x6| ;vuV».zv Q/ӊT (~dQ2@r} 5FExQm :J!K4EZUebfA~5\KG=߬ Tr kMRZ0q((09̘h*bgx'xղNH pEQUHF :ܮGknی%"@9/^<S0Y\퍨) GJL\.+ރw.R0&d!Q!рϏ'C"A(b}ڥzQwQj=R_k 1xDhh*:.*yσa\e2*r$ 31Bw~-,Y_`=1d4T3-@#(UcRhp|׹m>,peʘΆdHB|y=ɍ3alC@eZ%OQ a K2TONJ 7@ =9F紴0@Z {\W 7U,#~·!aFak?AUhKQ,**|gy>L{L9Rz`;Lg!Y"dOIӨ@d}{tizUT_iIeɳ UPBuEWqU;eǜ`HJZKl#zaV O-D 7Dǹ"]u=+1s=R4ҁ,'Y(͑8GeuUE.6_RHԃGlif :k(!xJg ŸP-nPb3,ZatF5<2w#TuZzUFd`!G>"Ш΋^ }B J)%l@$J3U2$:ߥuES-u@٨3d(" Dd8Oy1I\&XP+*.ta#8*/mŸ(N,G*u¥*`5CK0d攔1CUN&}308t}VN49g>a}䮅Fexl)Su>e_Ih6U֬b9z`43"*f.{*u^i=cD]zh/˂~5dv+ dV=X6p2U-$Jj\4+77!_8KSH>Xr5P|n7.:}jbJ5~9 ?D@JT[٪\\h%fԧř!KڴuR묨!D)pI.R ƒ&qzDQcQ,#YA"X'7 +WUeQCj!S7|XA8;1UUF:[0T}/<44F#eo*ƗWkIRJ )4 "[(g$էJHYC(!.4YC*yxƸT4WT63*b<ba;쪠]/*li{{{[0X?FSGHD3)T-DA܌7*Eb41z) C:oz(ODF!_C>==I/o N5 ؐUJ8\ޜs0 "#շS(eqԧu>g(? a+qc\7Y7ytCr*7+oaiazZqsFU * T,AJs`$m6ԄLyP{y*zOzJgW_#" 5k) OvX9n[9F* c~<ć3wiXav+{}s4~ Yv%4J"h0^ (+bwma9yWs|oE"P&"|WZeP"Q_ʨxĜ"yCP6Tb*.~FzwX`)G.,g^1|Vܸ!0=# -)G${؃ `X݋Aͯg (}zU3ұWe  _9+n#7* j8`"C, MD5D XW)&8#pq% ~cõ5CHLs9UOfu]ЏiRc,2uWER!>O6l7<"jiD|?evr,F l.@3?a@ϩö́&UDWJ!l~y쨁{}ap=&>/!Bɲ;w5p#;g  F~PpRL]|OOOFFE7@؎71TF#+!0,"2_ IDAT$ f'gR1T iJeQ/A 0/8r矫(_@f1|y@ZY%ElJU?kVP;[FCpD4k<="6lÔ+F.*#G*u 1rޙ}f( /57菥/U~W39~x9Â4_lƌBOfvR&ġH |sRPR wbcaﱰ^ک5Μ"S$[l`%E6P~8D8Ȅ-V\x0{}"*Md5bs35ɍ.K9('7BUl]sGw{][8ԨMz F'hXTIQXdQӸpH&/ a2Οw =/D&(^9g!LܢB5>6KQIe<(*pk| ]*)OѿSxE檕EjT#+Ժ՟Oj!UQMu(I_arQyU? f,^Ql+%J[b gŜbh?Z0PEnI?p=J)g{kP+0p# sU*glf /G3R*](Y쒽vnN]kdK({^z/AF#g#=$:ayE A!L,QbY?ˁ0-:5/gpojnu^JTSj堐(=,ɮ Ed CZ7 =(0 v.bENcf2kASfYP!s KvQ砼F0#+霏DgHtP HYf!j4,(5ltTаnёújb?<]PZuF}ajTÈȂrv"m!ى{ΰ:RTp$DuXTXb4AfpI4|>K;z.զiUVMMSm5VYeC[Sct8N6qŴ |Q4^]uwBKF=Xr3a 3:Y-8Eǽǽ KDȍH1H2,W˜ó濋zVXd'4yhK0pc^H"e Jg3rD/Us fXJ'9AmCݭ 8kMYYQ4H_eYMj/c7 X Q`1jtH%%5"q< =pc4u>ىSG) XuԯvfMp]b0:0M܋TNmlx7CQ4J*F8Qٽ=b"k^p*v(MCĉrl߭0,WЏgH20r m;O\Sݸ u]qTXO˝,2*{ 0aQZ4pHTl-C$ 9(9J*RrXmT9+%p*#GGu~K2H#,5`IyO_8ه-Bx\gjtK_<4a\MjM89hdY1H&TٮT~,ſVjXo@snC+nR>Fxg8`] fЧ|MCF mx] Su3s de鞛YZ|}GV޺@/mi׮^sy{)׫}eU$ X^j^Þ d5Mcep^gov?==C",3)0+iT0+gXO}h^?ˠKXpHd\.@7%γFF4V8RWB YbʘG~Gl=HE-Lg^Js #K#(^V^?N$yCF njaqHI4+H/ܩ爘L)08*ȡt=:RMykOlG0rմS6Ue~XJ#c Ma |#G JT б&ɠR㫙͑tX([Jr&¹TE&rt-׏ K ĊUO5;f/lO a9vw@Mp(:bH?PY#%f_9*8Hh#gנR}x@CdsQ qFCGqd% җQMs-0 ?|UkR있)ChL*ϱtB9y7Ꚙ);l) ,%@lK"9HNI%^V̷?6㌡p+\_ YdZ3Xq24M!w[-U#H=?Sy )#:Ԛ^w<hgk۶ڶtދ2Wl0@ƽYrÎ/ b Gs8} yވ.ȒY2/yD,n'\.p v$j1xyu6M=ɥ})+S Xz{{ UR hofZE`K6Mf48޿x@F뺅6lfu}ĻMa[42PE\^Kl,RjuK9I~Hx#ATiRd;F)CpG 24"^$F3SʴWE&~ cn&:4:ѐ"OKA #bSdTǥJP\ IzEU>KTe?#{AkNM5HXE@ոR'-t9CU')1 #+ZQ?r YiI! &t)T3*j2דu F]VWoM]0W\eͶمrdqjkv嘢]jm~0hV÷`^1 ZJ@gd wp~2l.%֋B)C/8#=%NC1psjɦc5鏾r}3[9^q|ͱRWCDJQ7w$6vunyGSS}^%ZD(p8g֑mNqR-ץU<%(h!_!#c?7;-ӈЈ8GICqyYF"ZN9Os52pGa@c!0Ew@JmbG!P$N+u<N8l,`頻SUUg!dwjT -7Ǟ0`6 ,T.~f)-Qi f?dZ}k}Jͺ(SYFQ6G6uN(zBT Z+v륛1.g%7QJK$lSRI4L/mh$qo%&GCK쥤5+r a:-p8x\ȍ_Wp^Lț=L+Wo9yc ѱ)@m3-!c{)X! |` R4^^@p; [LiÂuSbڰ|&9fװ꺶0?IFL7nUaFs {oØ":,Q7Ƽ=*9""h(jdc1;ɱGXg&F#,T=V3GӉXC[8)~q}CoRϹ2©ڧ7"SHl}ߍQ$>_]Bٗ;NPj}]6()V0GH3ELB;Ю"Svu0 tڇS0팠U|i 4Mck_Sˈ׬*M7ܘG^*6`+|5WESv%0T䬰Ae%%5J~oVUGNn"}pJ2ӣ0 :7|FM4~"aY[Ѽ iYޱj³ 0Kin*eYRݲͪc*kښ16kzg+wUUY5)#_`\Y9P0cTɪ ȜU#U!9VP{!Oɱ/6( 0af uH9$K>$*Z,Ļ{UsȬUjBdžGD)ZpօG;f\TEl)ٙG[BPLsQڒEjঙiu.$5Mem[ > Mjq(S4jYH<@Q ]5O(yݯ0 ufQxiK ?(ͪ x>=`N9Mc2) i:x5"e*0R|dڣ @ފdRKe!TBXlpzՄrsYWV];SzX48>tTI6YÇZdFR/#E9 }VO?9BT30XMaf+K)WY}@ a7K?>S?SrUUxc!ERA/EOɩL?  vL)qNQC_IjJ!7]հ"I`SuO@<~8(\T@']j8R wj\-Ut~VE|Gn"#cIe%AX 'k)③ dK$WI >17K^rZe^,k C]EcFku>ܒ7*#Y @e>Dќ0|>b`7!ƒ!#L{(~ P5f~7j6}}UXN\PO†U#atY;bE;/ IDATר:DDsF!=E!ZM?" `XJEѹH۶s pz7]Qwp"7{{5?.u΀ ׃NvdU;|`=jê:6^iY΢T#-NoƱ_LΆ.H85 s`n}CaHԧMlE+5%Lec<`^RL5BE\sTUeMa4,ƚ7Qj% 3_\N3}z FMԒ:"??Uĥׯͅ Ưw,, q䠾_8YQ'!c.l׆Aj%6#*`c~>m/)xwaJ&{m[{]=?9v]=R0K0-B.xhg\k(Bɂ3G@L]bb(TOmȜjnbb㐬| Gz?DN!H%zaÛl QPza3JXh(1;#["0ģ7R׏>N)8=$#-5CIiBrd ̐E;˗V;LJ&# 1W49\N5Kr#8JƩ́DPa3%X,T,h$ulyXa%eޕFןkr vz:_@AK/Rf5zHfhz'5 2J}DUgv]7`,![oE} ұt1;=Y+̂/.Ա*]_t@bl~Tq伔w륈湰H\4ݵY?%GPRM[pi*eUg|#rFDnIɻ2daz&eT_LPq ?fr7T1=R3`x,!RRYjs^<{(`iˋE"5GA >> BBs2%,9×k 3NcbԀ,dS*QVZ=[XzʹAS},ap ؙ!ӯ˧ 2gyVĄh^ ֗林ͶʹVYz@2b#+oTa{ }e#9TDϿi}L1fu휖F/ڀHQ܀)9_"HV&Qj]I ?. sActJ%Qf!eXz>Xl(Q"Q1TT: tB'E:x=8tQI! ׯ3d >QiFLޞBX_Ov*D)tmg,l1X-lͤ;RMП졑 pMy6l}G#Ū (lXzK3WX'Oͳ砚e"+eʤ 5nɒT2S.ME_/:zT2}¦CLrI#cU?Ug˿Zcx}X|EQ >~VOf8]/ziv j΁|>G}ߔ8hgZix}fQ֛b VΝ p8m"a=߼LmkCӅ~qZɥ AVicn8@%6N>0|X뇤؝o.rST1r⭿oPV^3a|?4߾}arȹ-QvjvV{ Su1NXf:<QY|XTiէBI!rgsauTS D#EKTIU 8k< "Qѐ<"b}q1G<x?YS]_ ^xu]6 5LO;A F w򃢮, +Bo`s)&Y1vK*spcf@R}^.ySgu]gu?q^0GIQ!,{ 2L,!Y-_D_Hȟ?sCNߖ 0Q5c |h\n\?xIQ>:|jm1&r5r64h~L 1iD'v8W"B`ԉ:0J),š g)> }oc6> |jIs81K4#IlDp-VcH Jim=ό,X'ं:J!PvQʌ"'39ĄV˥P|68:,@F4Z^p+m2HT$C5̋R Y J#JSW- Q"YKE`bʨڞ%oU8/.%Q–&8ҩ8C?f *( KNd,ĉ׏d e)Cc69䩔>r^E#iS2#=XI,FMJd@>zr\_tǦ2|} j=E'O;h&J@~[& Dj#&bI- ]:VKSY|Yd US0EY\e`gPT4x=z{{(a##mO{D FH& 4gMsJ8pQ΁P B*"G٣S±r>n~hy^m/+v6ޮ"kZ?3} t}WagG)>Q]IV \i G)b 9FJPk#[{L6HKMfP8MI0jE\D9D)ͣsܣח/_ ,JkG=N(U2)jcwss5/B=^I˽XWAu<ɮ^10چEIA?HKR#: o.0#̲:A*ţ,F1;t(8 ۩bK jSr*2љszIj'뉽Y$v3ݗ#\{O J(EF2SA*Z`[$" !:SVwڷ>㽈bwT/֊YXy7qtNr53e@8dCp8z,gS}?h)XdnY^F0H]c(=\$eywv`sMI9WA;]ΚH0E2mE!IǔsN"CREEÁPɬOل<12wx\"S8Fw(mzKjcT/[MÃ}>嬄vcR%7Pivb{j pQaQ#E,vӬ "{xޯp aFsdXD3g nyfij^QYDxp'3@`D=>!ߧF~4f6i_LO2y?_(u԰R{˿:TγBpf+&؋hCZ`ʋX!~TPuzFB?SS"ʒy @%$ tb2`9ݢ♅ppg|SdG<, )pS79KVT3%`| j v55OLqn/Je;|V9.pI'1k#̖ DGEb\zE-E-ƵИsr8WIMi8z1PL|xruc:(ѲR_%)RjJ.]6\cPڹ Bax1XTjyj(WOw "jd; 3pԪ56bP3xZ`˗ņe?s!;W9z2|R[{ ͫhQI߆wiq3@u{KT-\*9 72㫪{0BLf?9Y4B˟ aJ#?1(Š-H?k`%_K(g~ ZEi⁳(uq#ж ?~Ic{@M",4.U)*J\$u5o׿>7(Bn{/Bq8E(S쩮,yҸQQ]$Ü cUۯu]rvcOA7xϞ|?M#1R,) )ap8dґN!1YrEU$YfD1RNSE=noJܹf0G9ZAQT5pޠ<?UUEqHn[4aqP }1@J\*:NI -i,*UH6հMg%B:Q3IRnIΜU >TOr@cug). G9 cQ\E\I^TDa9/7 9j3-ƣ p#oUQ0+RE(RH1猶E:i׈p3 }72zEcƁKu|׏wxgD Q,6NNjS(pXR#rS#IYAPjC`h~uTVB̆9C(cFQ-|? K}62I!""0wTnXJ -ubQjԙ#fYmzB1eF)R;$nSE4U[e\>:֩ϼܾhhdO;x.ER:hl䖗jd9xz#u#glSaBIDޛ#JRʔdx},7c$z===êFXo)hD`]9>?w)vn[ʑcBhkݿ9g_j0{| dո(LJR"-/5Wy/2ji5ɱr;71 [ W9VИ%@OdNS5?t?6'qۏEvN=DfI"%u|v2g3SEDEd2Tк~#PA*S2Qu+W&Q E3J>sW*nCdC:AȥgOsZ\%jXlL@J6AʁrǍFňcJʂ9ClT+%1\EC#f~r5 !5u)(#D~‧^AX^s$<:3qfF(EDpZBLe;' DD DR[!(#a~I[xQ|K&v-g\bk CsCA20wnޒ3ƫj |"H^/KC4er׎2.9%AdT,W|%G=1|Bq|5䠅UY+15--:Ͼ6GT bن)9VK JMiE"EG_~e>\Hy4zT Ze#)-jYmDשh~Pqc*TJ/+zs0IY yP!i4M;!F'kX\i¢IVO4]eG;69\.vfX-'%>*mTmg'>lXK e.$Y=jY}Wė\\J}G}q#9)~^p8?3}v]gRBlqmnW۷(l_yCjS" q%}6n<L.BExaDhT.ҏ~VQ=]0`a*V?2\6e$G?RDW0)>v)T]KUJg {fވI@TI`i㯲@6j",2X,ČfΐfjTFX(M$R{T)̬UB,F#]\D}TlPx}uMEcG8TDu sOKd RoT9=Eb +7~FLs JdrQVa4slF+IroD-vGP6\/T6_or*i[T (ɕ([*rPFxU0?"N(vJnOX}$?MbֹI͇PR6 l|!Lt%\K%00q` !QRuT`Y?L&R^NMKɒG(Xh#H4.UlKqO69Fƞ3>@Դ3*>|u][]YXߟ*‹ _*cdKk!J Q,T#Z|)EDR[k "4W N^#tn#{_%t)X+'׶,}_В%)2hN{zz#U|v#Q@n׆3 IDAT",q_1rP31p8d NEy)i_K`hFMt!cvqJ/v~HUnċ tX)DI+in8+pmG \X\s <(`#D+R4HM _<(p܅4ZTG@ 6R;qn]> <:tÁ 'Eqa\5/&qH0JzP9UUGj h84":ʳM<(5>`UUÉ0`a?uM{aC?. >wŠnm??~z-;iQ/5/QG'%T׵ݨЫ%-\n`H!Mh#(Lo8rzH VU584B *Q]!ZtY0v݋+DAI_yX4M6Ve{I)$~ >.PL;Mq$hᰟ 4)`xkh%=B))p0CdWy=_GaIr󳽽;6:)?ODZׯ_lLyu-kQ@|R|r!}k~^C9PL"?R${-;u1JI_;szy?J 2 m~_&@?n43Sչ2|cr  )d! O+6: al€X3(vE~i0*b@{hc[HC%Gru]SO#ޫia1B8kz?kuhwt Hcř>h(U/Yo }~m}aL{ l !Uwlyt'M?,Vig7M_۷oV׵/6MV׵߿jʋ5$JDgv1YoST'E..*˼|Oٗa?BcK|ȜzFϊjw4f7"Mhe#WSRHr<ʲ.fؔg,G5dӈY]cߣjqʪzrkX;qz2ǺV|OgH,͍umtmVU3+@_<0j5?G5- uUTNMEUs`.u[\SBE2;X `Yl5|đ=!{F5A#`9C, ??) qELho2]a^(Q }2FDsf7W@!Oz+)je #r0[crY4__SYpA!\FjEI Zgׯvu5 fڥJ&zh^~oi"ABo:\rQrr,B׵Uv+a? ?_OVaf,>P"j033R ⣛8MVYU$ԙjd-$ ÙJ\=Gf)r R4ٔZvD|ITs[@6kpl>Se8`EuZ=(=ޯ]PG>Cq}?рUbu}(J PlF2#V! !NpGɥn j(yl'<ىPgԼvC8;1M_~s:ZtK`>&8;nF}z蜽dBr}ܣaٛji`at-Oq@Cf9$1ކJu ^Z7RG% 2M535TYXC3qS(xxxgR7~#\dus~DQZppȮʱ25⩚{u8Wt$j ⋌۵ =/R| F%LTEr 6e*RP(95ދ0^Uq/%ke TqNEe;e>6M6XUdǘ p5ؿig ?i|/&-,}lau~N߾*k^yn~*{Vq]7aP.b\:ɦ}i17)+KONu_(l aUJh$r)L#Ql>u}Bu~ڶ4Yq+ZG]«:5f|>+Ekkxs,H儙h/dW"2L4Ybhdᵫq@)ǧ.b;J!2[W>8y~_HH ilLƉ:vYKFEqJ@uGOI*3H{^RrTn=pکF&uv-YPT܅}>/Kr} Di+~,)Rph3y+=ܫ>յxvȕlUEh"B15R\|6R9IJxų{C%5Oղzopa=bͶ+6MN&4nκg)8 u#a! Wy4X$Hp5><F;uh ^h6McV?g}߾}[Omm,뺹w9kVp d"<,(I*:2l$ y)^4?Yj[A[9%l$ZѦiX g̯!"G-F5"T( 1EUN髪by V ),~~h+xiۏq8"hT&R2spݢ荲cLR^JH 9;txƗޝ+tx;=mh?w1t{DM][]U6>PUe5g?R"5F:l?֥Mښi|\|ޅ{j]DcaxQta8mgj3b7t $D*[UI{N(F5,D˹ ]]7GQρ ]nbSnT[ _9~:I9E@aX"akK9π}3놴hkGEsʬl%٪gI: hm_MTfM]_! =ϸ͚fAߟ7@̣sVC~ϐ2|䠖u%@)-3SΨGY,)v)ˈnj-'  qVI,0 /8Y gcy̾Rg ^˓J*@z\VXgu]ErTKIs/3E5Dv+x3{Ujia68cQWL8΃ɦi潋aT%FxK- j}ST%c?Ko4,p3 h")\˩5ӵQ4|+Ȕe~BB4=|TA[eTa#Gr.ןr;0% .a$E/cGefjeս&\([@֖BR#ۜ(x+2*e"To r*+2@-}XTr-J)R Fm۾!F|CãOlNjFBpTq+&FFQn'k*V5%)+C9a-W_3"ф>:(oY[m5Td+5b,:)7.{7 ֘S,4V')Ƽ^ (c"5w%{>n&Twji~jfV FN5*||=N3cYR0",Cs8۷YG(E)ȖhFI.`L_|ņ|Cߣymw,^Flzgtjz%UkM>XA-հ54V~>u8{Κf!٤231=6n*8Xn^Eِ$k<$!61T9л[=Ȓ7 Qª]k8CDIxw<Eɕ{=C~.EI D1nv;Gϒplipv]dP^U3v$}a+=a]O޵]bq_F .-9kƐJ;Ml&N4]YuT~ɚ}c1aMk'ou]gq} `VǽꪙgC<3==٭n=zq)a&2-vǾ;ܟYu`mvݛK}\l{꺶?|b}NMc4ٴk*s=z;~}iN]׽VUe*Qh~s?X4|,Y=㑙VfK$4@BK@@4F fff<_uNdOu׽kv$ VF-LxkU<` {A keFԴ@~X?lZ׵~X;S۶nUUmvq KJRխQ=Nߦo;Q3;-vú0Mgi fC CMeHH,6XX(4"__Lm䴕g=}a3zqA]gK޸u]+䃑bRLݜy$ qp c,#Od΢CS̝pU}w/zjQ m+ `,vZ1 ,7v3jVl[Yr^pw [>9W'!9ȑ AY;5.UUr$^Οz=V%/g̠Sk2I}y䀿x;7Kπ:i `KTq~~9) <Nx'A(;savRsP;ٔP3Cd .JlL}?@ALuA3)tN,<7$It:Iee4z/g/.R !} p$ IDATJƯS|Čap,q-~FkF ~>1nl2 8:f! _R_,KaEvƢ(f+.vAvs]|7 8iZ)F2;f-,ȢyD~=;NŌ}hbj,̂Ǟu-u]^A aP3Xg&GY:O~a5\-sHs ,a Л!fF0jd$4hVIV(4*ud]:OdbqvDa(!>(wBA&V`#-}kQ  fd+ , a4H0nqKSƉhA1^|537cs md 0 !$m19"z;E'Nuv2s9MbIb(VED_̯GR9Epjɶ5+cxEAP1F0}PnHiX!qz-C|&C89>‚> gKV9q,@Xr,PCphj̲4 B(n *BVۿPi 9Da8 A=sD`@8q5reX03Awerq':C0]2кJk-SI?𿜭(FQ$)b}`9Sjn>dUSŅLf@z+B/~leȝnN5A툳$8(X(@kY&x,K;{^py.I׫SV+uhx6DJ֛:,6T8qG;7!- %m[ɺpu⬵x 3!|f6fL9Śa,4`RLyz~ 3;G`{ftg2V0K黱"vջt2́X[{zLa8^RĹg˸!d캮Eȹ<wAl<CXab`,<*:nx<>8,E{ a{IH_^є/ɁoI~Sbsc,*?  ȑp'Zc{0$]l6x`hFbŦr@#K<3R%e֍F8} )0(hb\ ~Zц⢩/K‰M(}gǻl7M6tQeG@@Xn%"Ňs3ciqj4aJQʺDK8 q/LeGt F!;R|]d}}Yו;8`_zH_FL Y{8"_M{:aPHJ]G@60Ōdzf2UkulO4CCG pGhLvȴvngX9HnrVt0eA E-."]J`h4u@0PiW$\\X; ) HH?w}{yqaGA ٸ2>u0\a0a|XL)t60z1VKF é1L2*@b<7ˁaznMj`a5Q8pp0Xi/!a"041Z+߾=?tݲgp-:K3rA18VQY3ꐙi*`fg^᳘]@S]  W~k(AU*? }Ϲ^ZCdZ* 3ؤ 5$JIWKg~3haP؛J y#ˇy6g}W^.yZksɠڃ+fgm+umՑl[ 糞[pkuvy!f"@$V$Yi*/`ŏHdVV;Z+ dCs88 Uݴeq (p>m'c?(~ Sq88JFƉ 8/'Ԛ$Idݪ?Rz=Ā,$bDdG9 ڈǙRxORbRӚ!u\NEC."lRUpٖe\> 'X90bc o34򯺻}g> 7 Gy2zU(! ť3% sF @WEI`V+yzzfhAHSO0"ixIa"]tM8$$Z($՚>? BQdO O88? WC(Ds̤~:iZJLu3,AP}'=aD)Kɡ# A=\ ֏;&0߿뺢!u-"+j>ȮJ/G}O (Yq3Sm2ř3u0\ij(7* 1Yh\ˁ~a&-ꋆt$q%VN^mۡP2D{}  kQ: \fȬ;/FVgvw2$dbPl0+FQ$mU(Cb=mXYiJ'at;j.ٌpVDCABa"dSCEH`֧LA4Gh7sJD`s#pqь1CGD~GQąFI>>5K)(>:djޢ(Ǐ\ՠǏ)0LZ$I*n(fQ&V iE (yp:%mZ!qڴXW[sU!* g-˝;$&a@S: O]גf AC3$ɟоzsp뵓dVL=@ܾ $׫۟qg wpwAw⿷QO534E{N&DBM0FR9 {^{hB0tPV$D`|ѡ~M>3rj/}߉1 q7E$,t:_Lc',hȬ3(d謮57Yr :˳q,҇|sax 1И㔺ȍ4t],D2{->$<==9 gzcMg5F<2Uߣ:W Y^1opOOON ^fCn8eiOOON )ƒܱ`9BJYouY- LGH}:Ta){̄6<:Ɏy .&P 8ȁ]~ dxFdʹk\66N㩗&})Vl P2me٨=EDQR&&XdH8pԌ"0F1@dA j|1Cc8^3Qs;WycM#c?H83nn4`d"ây~b A8[JO[w>axGX_&g184tqB8B~? j\\wGaT8ћetElzش:G2L8Cb<ՑpD:\0 %YNU-w^7nfe#=? zn'a 4.t╌cNLme9])Clۨq3rŏd~I;=J8GlkSdQat7/.fQc5ƼYk ԫJtv8`,Dz0  ;Ȁt䪚ur9ey &Ը q́skhU׵tC+s@gДñ8ӟLD?K> w%QIFČ4Tb4J77 "1SSM}^rf -79E0RӗZЙsѹ' (t:qr`!QNV?Ȉ$#K"(hy q:猆0A%G} "g*_1ndDžW;,>VٚWymXOKp~)/N4Y^AHW7" $ #YʹvΥiX4ϽzID9hJXBЩgzpBk=;Yp_2*u#1P2{p8L]P 1]+]2$$-6]1F_ IDAT&g4k#m;a$McIRX%=,Uo3hƆPp0]QtBv;ھ\8w O lJp'*S3+-R.qG=`^W1Z+8dYv`HZϪI< :al?}--Κ8~{B#NfN׭ެ3ԇ<|'ʹP];*.h]kթNrrZ9pOSFoꁗɞ$ CVI̔C  {NpNEZ{~^գYY$;RgZly${+ oǥ-k< |:i&€81`l2aL2/3L䑺<<G[Ǘ#ըᕥ8tp)3a ۷onz^Ԛ#`2 3%s^l:넉L f1Fnԇ ~7HcC]SirEU5 M흙=#DҖ=HyÚt:IQ3CG&YC"dcG!7@!gP`V ɥCOj%|' x;v}TMh6/jx8,%{f?1:2ۡ(t:iߧ' Q gYvü#}~\l1m:c19rUUS|T},2`G3!CJV4|ơ U^^|S\QKCɗ" #A3t0,OZ/0_H8i yx<*D|]k |~~x&3S$롡`",\YY$KH"r`3`t:t}8pM<6t5gI3"]՜P +9MeL2OK2X(3bVad%SHg:-̑^ns 핧^.yf.2,%VfJ-ĹuV33z 9&l6v#Sp;w[b"ra78ͲL #w4ցG27xw<.f\E跍V643 eK8 eϴV.}s`fg{&;U;;ҧM4r4 lQ2'S`a+Yl֙TNPԽnRPW \'w!!/G#t~'խ"Dƶw4M: V !>>>H9j gs#8XLKDq SPj4QBTJdדּ;B_We>0(t}DL9c$r|ǒ <0kfvga?DTd^u23# m2{l'$,^(0O5Eu=,Ȃ{pQ'Q@T.S@1)tf^#P*fqN̚}X9u*.MKd0f`|p͡i0 o8hwq;j* iąYwS=A6e "4S AO)x4qԎ;y.s >22Vg!]67]K=YoaD3cZ6E!b5~褾WrGAVJUz=KN)ew]*d"sXEب/Gq88q llgYς{ԡ0y 3ʲ|$L\)4s{̩߰w x 9'Z1GIj&XI2pXm0{_pbATʧ@#HtYdi9A:.$'I"A;uO? ud Ja,0}ϓ! y-w3 NGZ ,o}`E>90 {\EW`*Xvq,+oYhDW˳ғ)˱h\W/Up!ijY fXbI>ER@ ޙu&.J!7E` P ;1pƑ!&NYi>WXj`6>aZ!MfK4erQ%pHQ&.뺖1X3\ 6G;K1c""&G?21e֟hYfF~M0X],> ƗkH$Lk>Y#")#ƔmGhGiZbytpYkك`y D9 iD$yFJ$bZ+Q C D$ h2~AИ܇|xWgzNuT-AՐy9\Bc&&zSa~Ey.SXn!EDOdzIT0`$4j9|(ZX YHea.m+v@ĘQF30HfԅJ3L4My0,l~= B?ˊ^l \TQA`8\D n!F:^_Pxfgif?>>ңB\q']שaZ貁3f:0Xsq.ᐘ?8#gf4(B,}R$m)yHOLPC&s9p~ ɰ\X3t/!2 {ZYX8hɀ'j3$IkU15cZ;xdg||p0>&m6M#y9KSDHÊ0,0CveY:Uka pQsú Aqܨ IHF^/нƢ(s`9=JS&b6MG$- X+ɚ|@48.VkwaFKR(*?F\ dYPVuX* stHtS`-V8&@eY.E~K!N]9O``0E0 LQ߮q,39L~E,M`$K3ud/~ɉT}dq9rY*:Bd] St:1o)vEX..~>8F}Qq!+c!I7! kaEQ$|ChܷPuCgܩ48p! %@,Vci Mu]B}<=,KgDp8f8(84?,#~ ĂŹ%1(] 8ը3My_`gE#QID8tu"f8^$q/Nl,8 |Y/_d?s\p}@º契Fa< ~ߕ>;3^A qE."tPY xZQFԋ,Uv9`a KHpvtͩW];#"- ts>?ܻ23̳_yjuEeX;ΒK\9sM$z 00 1 tVp^狇پs`18!Avp/63: O0AFR ٶSx>Y幄&X4ĪL)଒YbÝg [eYN3g멁~ge"q@G2 L8vI,~;"w~1<z9X0,\|)k#4Jbno|hKLy8e4 P48A8OHϏb bn Bap:,}FM0`YM`)-}AI /{Fd;u(;@ w]'?gf̞ad-&`N1,F8c}kכ@k*#oFF4[l`Ր;b a3#e Xg? xBiJlm駟v?~82&8_ӤIgmQG駟d8\>kGED4=T&T:7V3!GB q#1MAcС>].:Vqu8ճ<AExҮq TޟCpXpy?( Ȃiő \.=Ë́pb̜q he$J^p'HLW;Xʊ \CN_VKۭA ߵ]'ƍaQV?A j҃lm ,pd ', ,K`p-ٕ:|?Z7kNr4iވf}G,D,Ԋ?1r,g=сqVP$820^(5XmYYLfS_wǗy[@HġST֪JlH]bq6;h+O2ɤDf,q ^ަ`31#€j3Kđ<5q|PfYB#nnć >H U>n ĿF Sh6V6s*^0 @ M@uؤ!7Bȇ4pKDZ+iL LNn0A#ѷĽ~S:HAjFeKP`,Tcj +EMQ$WU3ٱؔo߾9LwUi{8%Owwq,q8BxG!D}V RPR}5J1|I)qsr=s<qj$^p1~ˏ?ԉ0U~vs)^>n|:^~ SU($%I"b8-lXm2#/.2M XX^Wae5T{͙⫈N?8ўsSV8_>57r\ .FB͔;ՙEqݬO\7=ym~wV0ƈmѲ|G 3R^F,'FL{+EAB1u-V$ +5qa@̂mht_rVʦr9я*!sk ODվnY/ x 0wgu0d:_9r#>+E"(rͿ,D5:՘rpj' ;3OZik!.fu+01t`  +f0}I (2c}X $đfY+;h`bA҅\i}\b; &p!|}0aZxN^^^dZ)z,zJ>;W, fG_Pq#p?gl1Q$OV8Zfndq"}0նq"9̈}jZ%v00E߉I2<~^'At(~xh\^^^4A/Wc84MxNw:4hfe)BN#よ~kv=F &0X)ˋ#$I"pismD,Tb *a2t|{r .ڮ~qK'}U#{yVgEɚ=Kf`LyC qKQ`vsI_2 5dPn6DIp!R^hv6ӕC8Avt<9߉|h1q@7 wD297uXpuުv$a89W~;3e$ƘpI7ޢ0EI2tUULG[ulSN'imcH4$Mra< C7{n M tfAz'ô}pY3kK)ODZ!H<:8 8F!V&B 7pMWH6$o*f7'y~~,|>xO-231`>Cq<3mb6dڕ.E03cѝ@dI `\W;@~Dzy?oa$&$O3Q+v,DSpCnx~:ϭGSDt:iT5ju͆ 4\yoze!=+_wYDz?U56uC)}K':DqeVF3c|r`>O۩0Q(v}4HP!7d1ܓrM@#½=pQDD d:yκϤAǹqL&Iߌ;'xLL<2)Y3IL=Lh]X~0&,K9š#a &00}O(`<===hᅭN%";.N'gy+_c?‚ gO}<q\ pƔ,xCBPTe.! n81L*SQ$#qA(FA73!6b1Df!F0 oߜ1lT.|/&di&A(xA{gzV=Y9o۶r>]ǣ3502pE~)R{؀|C"Fu^wNDjg:_%(D ']g~\U7u Dc履~Rj8\e8SBZ;G 0FUU^N}M IDAT]Dy'e pQ>clkwi*߾McybXHEe^JNlUOKs4kϴ/[Fڅ %ky"<9 Wa$*;J]Q>@qHlcd|\CEkYfΒ' ˿#ʈaS`VfC8AB`c=4wg20NSofIE!UysȘtF;n_"d Apv8}OFw$fgQAa$IdRyZߜ=8qh}A8qb}M~//~ET$Tȵ9{&P[lwy~~V' HyI(FB;SFako2rKxw P'na; X; Bӓ:0J͏NO/j҉8  ͕!884b67KjQucXjh ,D~3& Q1dܤHIw5|0#iCGH>i9|Eb( "Iȣa-y;jS̎eWpnAM>Dq*bB |gi^0OD 2qddYaM'n7g3fE4G"ij4 V w,UUIZ9¤ = w?EDz.|rF 0 r? 4s (fpExM Yxad4S ,4J"'DBQNm[TL@ ʱkZ[THqO)iZ$Ij-sWi&ie`TM#U~7_u4A㠐Ƀ Q΋{r%]lЬM[g\Wl4xmI8fh Ebf0ߟ3<0b"N}gV^v0k???x<.O?-Ep4]0 ,ˆHh‡㸋earQLܧ Xg8G?G~?э'&bq̓eLj MST7S) TCwaJ%tVidŬ-Z;rIM1c8Sa83,69Evc8یk7AU,s^62W xGdlD q뚾 ":(LgݺV: S J<yq?.H GbF/gr8|x<#8[UhMӈz`uTFȽn)6feY:b8@Lg:=X fkL3.#}8c& aZAebVE x30 ray`*Y9=T3Ae"S.2TBxh&禑3Q 83f^3۶2Ҝ-aX2l+Q@Dzkf*s qnj |W#,aGa1n8ׁUgbOCR|$K#28+fۃ1h;qFk.j牃J:mfgbeE], ;(]. >Aprðp$֖qc_e?{ x0,U/ip-,7֞#Id2gLY߳"[#""mo>AbbB[+&d^FN`9q83_{9h`9ɣD0Jd3Eur|Pu>z:@dA(:$Ia=-R{0ʀY|9hZEdD =й;;JFh+bLs^t:l,ܛ [55oq"_\E?l,/%q$QD`8ݜ{p/J0RL'$0Bg$, zf܎{ʲt3#E?,,rLp٩= [{@iٮ#ǀJ1tHajmw0k]/cdOӤ+/F3hi<@ ,X,45 aFY xak yv458rajoN]F8v0ѭ<a$HgFt:LJNDe_d>^VZ"I0 tg]۳ZQ'"9Wp``dGQ-@VKQ:kFn眻,}`i4N]f< G AR}e,`󸔰bdp$S*G(S ϱvO玓XVQ )(aL`R䙽\c0 WF3 Eڹ5EAqꁦh fPMy>_< g/#xtbQpp#fP_}ә2 ;94c8lQb$t>6CGBm[??9 R6S &a󵮐Ivd?`3d8!_f1Ag}@sc̤ 6\WI]m)̌BFq ꨕDwbtpL 9Al\; BIYE3 D~Q4N?܎q>1̙3 >8Lž-pg;-AQ]78#蟡k94a%[g2O,pTvNC?-~D@,_"\TD 0~/Ds7Nх;3~+2)\3I$Cba</;kc4XwEϹq`&~9ȩ/u,6LaRr&saQ_7zKpP<F|M/n2)Tb_\m>f82xG?b?9z!SBr\.bE?~z'LGamyvSf/]gedgƙa;֎L $.8 K5NC\]7N1Ns,9ց/ 4ı%NJ#[h"߼?lvL{Ǒ 0Q,HE̲sa 68c!bSwfCy/&X@X Y\@*I0h}1T^ hp>P(N~EhhtaNF”Jabg,833#B(3$pp`6B#7$I5 A?_CPѣK<< v @ъ+Bݒ)*`vN,e+d#M#&G˼`%JI0LfhIF7u y CrD x %SIL:vf7ىI5Zn}'͊P,΃%|%2>)SZ3B-2.D$vJ|p ŋFzQ|8zk80k `k.X3 /<6΂+j2n|Bi鿻Ο3yJ?I_0Fl6RUա/6v""|c </[k~;;<pƤ ;y|,6 8c6>dYAuN暦3^\^.>]Y*Z+q)åƙy0j,GpƘC$oI>Y`䱚jаnp\d3uD3'9$N$8JbpRPw4 3=@ѝA>_gό_co”ZZLso"c{YJH> [2 ŰBa/lU)R>Зy 8P_K/"bDF2 c0AdGAz$3ga0~8td }=(L)\$rYX~sl~Lϊ3 R݂`/.3rp8yc446 CI'Ha$0CI ᔑ8 $ c )#`q0 ͡CUo~ ՟3(Rv31"kN~48 H0/N#0+2wqsSfH8QrAFYkDSءG2ٰ>1{^R4g\? ; ?Ю8Tb~b^SKG0 g~ư \jV );!XJ;S,$Ι`8'yj,;_2P?r%A y?`%_F7k4 *$AF9RuUWV@ w>SsVq/So8CĎ^{-U%*2b$w !|+y⼊~}후,/A쪚_|kBȑk?IR驩NofN(CK cS{d{5 Ѽ( Tp7O`\U1ҧ(A&~9J\W@ՃX,"\}xi>S0$}>k޷bO!mc 9B#U4?D$~ //ObNϓ9 ,.~םQ9Djh$СN\*VV9(_DŽl=U`Rgj[LYBO`Q芩D8p(sj+rqsO5?Li/O LEfTQ։dPHНN1*@{B\tx5Ãꠧ _"ͫ 3.>հJ| IDATLZ!<%1茋&M:KJRONFs(-F^[$EuB0yڶ4̢mĄ$^հBcQ#|YCT{_+3i2.CboC<@ x}'*4g* *dO;0ΒD×kR`"`Tͤs^R8s}M4cL.!~)k<Q<(%TPKkWl6oD/ ckB՟DKY/hMl tmbѱsbr5ukʑsdࡲ-pr%\&ʅ˟nsMDžO+q7d@0p{XaRaT˜*Š7\Wpvu9nqqP]aKڤi=xV+EףC}ߣ>;PVq L=f~ԇiFڮs$}^OlH[H[Vjٱ(CVQ'%/LR623wʓ?0CzFߟ{0aTnms L\=Br&^ʇ&Ѣ5rqSXFX@ ݒ cVA) hSƗ>\wŽ":,'Š_筽`JsL*\I5s%5BM,I.NG*xu}Ju=9[g ͵NUU I!Tl6V`J]ϡX"oѡT mI0-PAÀ= ՌIbѠEQ%J0]ߡߢUS62>Xk?2qMx-g 8@Oer)iC'wy,Ke(@C@;( 3I#Lxju8^ƪXٺ&OOOzj30J%)~=Y,uD\'%dP1BFU M70Z.HF>4H\5gDŷ@YX֥!n" G@u0@ J0]xuMw۝N i*4Džl:s jv fs:g*j%G4V`OCL[WNփ @lURɸRV^CR'}$'bL䅢{:ps@02 k tml"0 @@ΠB8N uX:q==|ο׍k,{*s$ZL9^$Q8U+~}=TlVFuea2ΡTԕRׄl|^I GMb ؀!,vʖ?;1`8H6hVTFhs2GUUXQ_4-yt†yMfRE=hQ7iCRes!2v]йp$L?Us:yd4Yf,v52fP_͙-fY |gV<]p!]HڼgEws&ӦvntLW5줌Οy^A*V2JQv^Uri$Vrj>>:flvm[m?NTO*qx]T4Jl[@7a"Xx?ΉM,cׂgpHι"- aCB--)4g>R_DRYŵc \t'/// M8U% k@㘰+J(9'{Ruᤤ$Opk" _#x:8L/@𕞜d0ʡ-ٕpͯ%zK+$b wq@Ha%\P!ƦiPL&@$s2FCSbVSM<$UQX͑rhI~,TlM|ާ( L'䝫_ ~/mVvQZ"twC$v:&iڄ<*>* kc:y__ QK'd+8z&3!Yer άLkwț&ncCzEAPBW]3v AAoVg몪>rR*>:jL2몪Bdh/yE,Bpyfxa2xXXw}3 8 !I|N?`8ᜁ1a?xPQ!HG>c&L,\+?@4!Nd'2]S=&!@J}=S ѐQp~3)P -ܺЇӅal6lӬC04y}H8: LBdw}[XBYeY]ec/zmQϦsg8[pnU19Ĥ6 gGN܇s0!ו0q9A\%v?lҶݠ\h2 ,`JX +H/cL&A'P ۨ16BgtiO^*'f@:+) u&TxJ*ɳO=z!Vx:!Ca ϥ-sq-YԱ4eEEɿVkɻ}>>Qƨ-M.Q::.)5 }XӤC :y|Ї*Ъ d6GZTXd %_uP*G;`״Q}jytB=tlXU3=] ̟=p>`1҈۶{lUFp nI$a)лl xJQc̐7q6,t̘ gcXNDP:pޜTqSUUOFPR>HT/BmupXrZƀz<a|z}|LnMkiMT`.ھƎ$'ڜ1Z\k ܱ޺mkPnٓ+}H+WK1{=@5*E_UU /QGnxP]JH؋~rWv4YFܹsiL&.ܜ~>/|6mM\KOꞩ2;(N`"TM2-ZkOaQX&Åmmэt*P!lZ)]$i2#lsdmfAG39brT7e)%!]BlevylM\?U51ųTI{1?P7ãҟ,t!+L`aqmhbkYCGѶmk0 :Ғ׬oy+0ò,k` I9}pe1&#nbbRrRi:U o.xwC=JXg 3W)fX&*)-x6j=OwNGaO.ISStRU (46 =, m~3؎NzأJdVCU]S!!#lk잴hfbE}QeC }5=B >p! |>EQ,QydU[Um[ǀ0LP$Fe 9n&VivwpaN[ho`Ј\{Amg38,sM*,D` fםԆ c/Pr6y;tf!34ߤ^rYKg`]i.ֻN ci+}Ӿƾ?X,Jr J;VX\LEU4؟δܪ(ǩqh77zR_UUe ڼzۀ3d;VF~qa;&$=|1JFR\Q[S$ֺsקC[ P'8vu1PR5$e9oAр|O2Ŵg0ߣ1q*{ zݜ#Sx.o"kAfy}kVMu\;ZJ wѪJ劜 ]35l&Ȍy/z_5VU P} fwCsNJ.!7jC,bJ1,1OJt:EQh62cȠPP2L2B^& ald~ MJZoz\$Bx$l{noo&*cQUUNtmqsf{ Ο>}JzR ,*ƟJ̘GC%8bʮ0[4O nnner CZڣB(U9Xj#d`P87< Ϣ I8ю3}&3L"XU#$V\3{X,!ͽpZo%dG>ACY;w,lb_k=;1UT]n4vXa1ShS=Њ=@d\"*jxfI3q<] K|X@f3jɫl6zo=7cGc+of&].QİɅV `X%*bfUO__77e`Þ\zk-^aNnpte~^=.|j?kZřbPyȎ2݅{;>f'&-)o`C{:$^^^pr1P EȞuh2N:7Mn&fTXfեsV6tAtJ<\o?Η1AQ:hu/zU:޽{g ֙M N ;@1;Zc!,w2"Aj,W\ /F=Y}zޣs;NtNM`Y |{SdD:ˉc>|1pJaH</lc^,;U' nnnbŴ>'6*Aݶ-noo(j0Ci?%.aa ŚTܮᵩD38fwQj5{|!B||ue:,TP=̳np<6љpxs<4h/ fHf\Tk pjұ" yp.(0.)zs?Չ1d>xٲGSBpbyՐG'[!wOw l] M~"6Q^iq~iP&pmO1Ea#/ Cf|`ϼpW~ QMOS37\3seY*>B9$XIC%+fx툡D'Ӷ mFO=<\c%`vDaXjC`Y'F9c0VTYf 3[UUb>VZ13m}Ҕ܍@Pp~-݅5QaJtm۸)JXD+u6dVQ˗/q3f3<<<.&\=uQPI~6[OOϣ|,NJ, ``6f'㏘QـweR@vhsEQקdrEa{YL8;hC#?*us1!ϟ?%#Pٔez1dj ypY-ÖçOfՂ6d5 9V hhP ӫEW77IR{EADqS'RMmkyk,3vBdHGvȋp\ա$"x#t:Fr3 -T){>,!K6FPc1?3ytR?N&UL///Vx'#] r8"B M >' IDATYRy諧RtWk5QxVmBdK0innbo]Zkq{{a(2f6 >}777T~`˕yP?EzNLVBŬ%n(fS)"! AxU c5%5!////#Ekz\EZi[`TV[տwX\chZsxk-`ӉTr.:9?^"/4.s\K6zKN0*~5'DkIqbZh+4ŬΑeYγ'#,E>d~CxGnۦ$ M0#N{p*ɮNt5@>YAm<(T,#^7/1X{: 3'!f66sSklGwgBGܟ|9Ll\ 2b4P7Mԇ'cb5MfyRjC% V@|rn@vWc2_ms1J# ڨU9O?#=zkIE=1s9˖(5Mk Eܾ(A6=E V,o[Vv1]=Z"ZyI)c,Kyvt 5T+3^ND3Aȅg@Yh!xm [Tc۶|d!?Qa,@7tu̼G#I0hi KrvVyQ:a^Ϫ&aZ+LPm{􀱨&\14d@R ig5£*>&{:|R{:t}KdQ\lkc9%!Y0;<γV>GJke6ՉǡtOn3G5t0W|H鄢*]4q&QsjL$?ȮSb{:à;-텛btmXבVu])!ϰsc=PJ.<cab%Z0# ?"5SV gP|o3'N'eل w^X'cP(lS U ?< zJG}-aE=;8}o=*"FmC%3ɲEQra~v }⍠t:08 "~< w&xPf)5Ҭ5Lf1D`|(P0ܢiN!j=k&Lsplذ*f#9ic9Y] sFHJ ;s0[(]Lvs/o~4| 0vxi)ev!?O.lj-EVe4T zp1;Un͛dëd)$vƘHyyvD΁1QO.T>4MQDLȒg|H 3DO!NY¦=]hqyo߾۷o#ӧOQe:YݻwOL6MVonn͛=??C8b$Ffv_'{y&~?W%C^Ri頺-.?"yZjT}{!)| F{+$2HTWTW!G ;1k֌?g`9ZLm[*|a0*Yk჻Zm]]ӊ0WK?_I^}5ٚ EUq 4V)=M{ʄa8)NHaFYN2jr{$>!CHE2'IY!5۶s#㛇ƒFml;K+0rŲJ8l,! 9\V|F~rn&vv *ҩPIZ[% hE4MX-K>eaGh ;lz 1Sla(F^vh`}w9<`RrB2"K{bݵ ?ڇb_z'JA5km=h@? ~r{q}e98Zr+?@t5?<.L9hEݝ*0 4M'?7wo>Y?yc!5a u#MZ%\}߼>yJ8Qc(LѦ;O\Vڟ|^\wz>4 GƷݘ^Ӣs׌3v蕍=1g檟?2flC\%Zɬ0߮ڏ=%t}j󵐣(j).wY*ꠐ:U*MԻih8( dGmw\s}"џ˒ЮFfE2LcEBKְMs د`2s: REmƾht=eV;KTQ;qc PiiWf+eɺ4r3^rܵm Wd ׄپRh'{|Bn L_\|x(72bA=kנY /\||_絬W?v::}nOI VcWH\~];Bs J+BG<лk V!LuNɀuRL\y`ofD1E7~&f`|ө`/">qΠ(8l9G.'nPzNИLw:X!Yb EB sm#;ZC{{c&>< H,:PZ\yݜAPnXK"{.x̰ICԶl!ae5V0Q ߫A%q>ApmvE[~ius-8+ C~x ѯ`us5ecZ{ByOCo_?%wz A9 p5f w od1#rh~Ed30؈QKʄ0R ?=t+\Hn*+B\;ϟfYlsU+,Թ1Ϻ5D癊@dF+:fz][kv֘?}x<?ķ=`0D?&כ!b\jהS\ℇzU.$G(C?&푩wNJ*0C'[m9i^U*FlxXp^4@Qa@9:/Lf C_B[7Y#|>f+3'(m xνL 3P]1^g`9{ 80 `J`iE>|]iL4UQ*A\خyŗHL|gMa >ƚ["i%u%(pm}׷J=0W `.#ϣZ.wmBXZ5f$l-HFRJX$. ] C^π'C|ji݅mj-S<rڜy]77NПYR.g>>$猍DOzyad(#I!3Žw>\5M1?Ÿ OK$#O2 9ۯ_gfxd`:T ÄW1 2܂9[MIP^eU\e]%!Z̯M:|>x<%ny5X |@:n\o31gA./c |.Q1< X]AC1sJ#+ ڶCﻋg{:!9Nyz0nDgE-Ou"ZftZ&KWj|K_WM>@Ç?E#a<F52B> k˥Agz_0T&l[8*RFߡ,+P@$זo/ fʠ*UyT:E}3W<4۽\{_ɾ52M.SL&?? gd g.d% H!];py8t V5}oz,U =(IxpP?Uf*ʥ BSӧP@YnT$0ܓJ sGl[<<<$Hm=Ȅh8Vjx/E"\chdnpzpAQ^\ķ ,_ mW3x)NNOw:ɇ2U`.۠`$ϛtW& C*$v}`Mʃ!hT_-u+'׈V_I"*%kAڛ9N&NbzQv.!'&] *i mc:ŸYͷ13S}2Y N]pyR1ʋIA|Pq<]<`\pDS['C\BlbX6*{5eT}k)jʮ77Ӝ4sǰ( j:C W}@xO[f9*Ƞ"^-NjM,/6˫4HuN~c ޽{7Q[_}}C!UU#o7Zb6C+)\ ا]ף} !{tVxmg`V7%WZe^Yf]wt69|ܷ{Y[>Kp>E4b_) 2Jz :iʤ&k5_{ M`6|p~֡(-U9|$BYSosw3|(@*D6q1`)cdx(N8UZk wB|@ >!  GF00AJzԧMĿeuHZc Xim.DiW(q*jTfFm>c0I_22iw-8RIwՂR8qHzXiS Z5&[qKpL@;6 n8&t7Ut轃&Q}g~OuP6DQc%EETt jbת7*XDO8G9_^#B:_L֞!LohGM>xgǫh2e Iu]wV=]G;BEŒ@+өd%KL6e5p4X%k0W{1Lq[x!xj`]9FyܤOzZ! tip.N"z#Fhy\a)0$c8ZXc`]@)$f$l[#?# ,KLg3UKu_U¹4ElZ*Q קJN1J^!R'ODQUU-Y4TԊL&yoqOsP?asR%ARvAqhjo!&շ抨$ЪdN>`{3&90px_MvvngDiXIyHြWrAε.@H3b-<4{UN=uMTUV7Bh&S,af<{LsIpacT4T!;}]ס.vy-k) ^7H2'$jɭ(IZt7#,u,2 40yG0Cr#ٛv0]S'P*5*]c6(&njOY6y՘bMxJzh;u+LhC^_ѾT>ze{c1ڏlj-{&P:]?/_9:w]T=l?5m T=.D%{U-(x_[{:S!h?Hˉ6tH5u!k>oV}*m84qa.gQ|v$f>T3z®h>8ctԹ>iV=,V&H3k3p֩%f͚ f {8I鼗Nq_kL>9(i8 8k-13~* V (4"D9l^7 dK~ l2e`W4OuF[%hRy¯q DuU)wȫ#UV385EjQ?5+ܳ`+U)"F+ 5 r2K:B^d ' 6zpe0ʄsN1;MPa){n4g;(ia"\HΕCz&z¢k{ >3GkXcIx}bhSxzzulry"e\ﰡf3M<x ְvAZDty"~5W>Da±эf=nQkum0#fB@< M&瀖yiժJ|0礴'ʺw(̫&{N͓k՜ü8'cFD>;УKz9Ě_km'T?_i9=rL :>gc-<LTjJܩk =GAt,&  ðrG*>x<.iFG+5zFSi:8Qx#,us3|Ďv ޼YEN`9e8E5DpSX.Kf}"7M Ç @1c{T@}~^%? ?|7qIC/Ee(l{xU AX 9(6wMX2C%_heO2B o;  Zi`uy} W1} #VU9x4f%M= 9N7Mɦ=chBWqD΅ IDATs0<+]ΰ* M]{}.>'\t:+rM ;g\yԆJM>g]xoB!3Vi +rC@\gB uDz,1O 95euA]@9T55\,1BlT?:H~M!gv};L'L'SgsMϟ>3sv@nq=56.ZX.b2j OiUdT]rMFiF'uh#v /EB]0c 4 >~>}]q2OOOqRVlia(N It3TEf9Ak c60K\Б|>l6 ju!I&Ƭ9u#+c#(Kf;h,؍tZk E j5rYA%r[`/q:5lv(媪Qr(c .,&;^kzZoyzؐ<\.ѡ=]]اc9C'!*Kq3r-X}]Q7W L^z\d 3 5[9p<My*4~Ec"DdnK!_=[:&uϐ9jI;w}@i+?)x_K$i?~{eY۷ocZ.VHE?:k?逋T Ol|??ï~|aX,p<>:PM~ Dx0@===E tʒߋ8*1vdZ%7<)s:bкs.^#el[VYf}1],Qώcg3a:1q[5:yf Z]˲mTT=^0Lpssc=Hg_?NMکt:n=]va:*A؁eW0]-{3s@!Ue'U:ar\?OrE( y[5Ҵ: 4*v&Z -f{ur~P2D*Zi5zLt0E<#xP5Z{ȵri(r1(I 0ϭ-O-dz!&/8q@׵IuCwဧ'f3| u]㧟~AIBVK|u{JXRWUx ڶ=~! -^__O?RrEz f#kwN5vX(IKh}CqX|Nɜ1{JnDVNJ#e00ed}MKO攩HN:6Cy3=/tojQklV+yL{X9 fCSuݣsq:~d|EK22݅ ױ1YTxʂ1h0iCgi>to\SMЩu9*R%=9)|˧O8]v}ʭamټbߡ(%nrklFzfɊf-)}UYu]c=~GE }v;&~O?ϟ?Ǟ|>:" ft-S0{/ MضM;bj&4C?]euDX-WEI&Lp=Pl+Je(4-uf\Qzm#p(+X~9jwl1v2s(z|X0NQ%ڮxD4ÍMۢ9uGQŇHm^.~P2zߣ:t}7X!!#u>\ 5v0֠JT٨YTIYk@{f5|Ոx=GHUY1gF"_f׆7iyb"!`:k W} @00]kaXS}@H1,u8\v8O8j}@tf,M،u1~箭q.o޼=>+BD~(񈻻`;ϱX,7نbo{xJj' GG{~>o~Z,qu,߿o.?l_|կ~Zlʳ*ޓ6eY>Q,dsܼXEXbAf3ljqZp8`6 _oSV˛K/ }!QnZ̏TK|&" ʀ'Y>u}kNk5r#8W&hap C=NMv &Cu(8އ͸TcMAykeW!="D.b0}@w_u5; !š9=Yl^;[@tM 0ps*:/s5 Ky<}{Dp繩;.G8c`2N3ҡ,qaլ-LWy^䃢jarB/(#X,[?fz<x}}B ~-F*~_k|{>,3V/!| o޼ƻwpss~ ZV~|%}8' j >la>:| &.k4jo&TYvh󛛛Ѷ-nnnu=9>#exR*\pw45r7Ãϒk'ݻP{#]yόL4%ZZlTUDޘ3͇42Nzunxk\ჵTUY|]='̘&Ǥk3#:بtfk-Z&c>pJLL' COUk$ϩ뛻Ifzsp_a>t<ϾjDwM'hIVetoN'UUQ n78X޾EOON&p^wq:Rĉ+>}k-޽{gHTc?ʝg?\dOm$b!~f///x}}~ooL3 Ed 7mۍ GӴ|{Xp:cɗm;bDf/L&L3@<~O౾j}, EYͻXoЇ™sCYUwX.)%ڮtaAtel`ZLpjjxsj}[8z CtE cKm'L-p8QT%\Q``:Tטg0 i0@Q(?ZD؎?>>â*QM'85ھqXb|ZLfSgʪRC0+ t#\Xzpy>c)j-s}U [|%V?~x>`DF&ͪ6nϟcrMlYd=1^~μLJyVdNuNnoo#(  N|M3fkN'|9}Oϟ"yC"?$|>j5]/JPAWY~, {rHkŸ'k(+'k{ FSJ:JеZ¯IoCT!Tܾ[:,*D1eܿט|Z6u?舂i`(q |ocf>5zF^L dbWHV5YKOx[ȖC~P7p8w?w=Y4#K=g4ݵtŝľ# $?$)*2s~ywh42U,J'al !:i7nZp[[cin7Lӄ(οs${$Iw\SQU@q"%*́>FT*EDlfhZiL7nϵvɆ!C S&ˊG& iaS{}xbD_x8 өm$ݲ,GwŽ W.$:mh4rGtTA-ć+.|(wZ|QT4ϡ:k to?l;.[,M.]W{=nn|>YX95)F#$=5a!W3~h&0YX{`MyRgIPޏ-gj6]$9kvMe;_8KpkӁlg Ћł &Zoãt](bm L)ÀTty^cHm64NVg>ۆ=o(B 8TOBmC!{Yjk=ImĶWaɾ{mR/ EPe0Ɍ7STUO<]j"ы+lA/ 5baT ۆ9`aX-Wp .hY1u6`01d$;'Y+m Bw2udYF \Nbz.|>Z-P(bɼvt]wdb40) :6wU u*\q$9a^y}C}xxJI!n@G8A?14FKG%XCbBr5a4cjY ct] - :̉lb rއ(Ar˚c: I2|>?xbDR b>šS n՚h5X ;]S$Ae-ECHdbc<C@@shhj ipSU^UU.rFh(r Cge#,uZ:6:w۳ .ַɄՍ"pg#tU^T h#C-%>k{߶`4߄cض]Z?kEU {˚9ϐ{Ϗl˚9M-6\.5c@96'&fsL&&0D7l6z0f>Wv <+fN $k^n (/ʶmmizo5z.0;BXۜhpXc<i h,t:E&E-#+4ͩ!ht"SB׃ilt:ǐ$;z?2Sg"2)8t:--K|>_rFa #$bCł 𢪋 0PV1v,&ȅ溛`j^y_zxAU m (0^= d:۩21"W3ömaDQL&|.~?˱}NSo6XV p #V~Ȳ̝m"&(,4[MҶ+]h6=zt]G(V8ˌ`- lg(&P5:LD& QN1"k~?Sڼ\ۑ8tgsx0XN]I, x;[$a]~x(PU14J_NPc_k?x<A\w brn~vI9)) c7yDƫ':8)wp$`"DtovF= mvAD/4rh4K&tv Ì?R "0 _.z,Gf'p84 <䴡 $ҍpoA@(D-Z^$HRO o4e>,%EQGX=/v{qDJHa I2B0JJ;H$H&SHy?J$},xfs p;;kǔ9H QD8@B*@\͖6f2D±m#."8; R nb6uZW@7f *1y.^X PogV5Z%I~>ݲ)v{(m@@^ݎw$8fs\" :tE7.@m/x{Fa[sw^KIC /I9,7_.W7ݘ4) X +a۞AEB4-xYG^G<,*gkZ# ǂ&*:)WDtc+ ,$\0 E\\\kL&ǹ2z܍ IDAT|H#GAt:}X,'*.$IB4e,ˈFxcłJG1GD-g$ḎXaߏP(_Ib:eV"{@ 1Ģ\ ! X-6U Q~x @UhwfJVWwu$RI$ L&!H @BH.Rd:1r|?~PWULx\܂yH D#]H,ōⱷ~ u̻UǏ 8i9#@系4 ^ᜥ _] H )ldLƁbd͵ 96X Bh6hǸ>0Jj= ,DQp8x:w @*F$C\FՅ5sGIW" ͇KEHJth4 ˲PV!Jzd2bvh4ua|>IIA$B!i*8i3VU;ڐhEGT6vM: JHA"E&&C$_lހt ^^?M;sz< 8]<vg(ȁDi g_,X-{DL ctX{K K(6 {¶!Kk m#Hن(a#^7b#!0-!ؖ kban1La #̧s+C8F" + BMSqvvW^l`:"L܉ )dY׫p1`fFpX6.z(  `inF!dQ3|k]x4 ܲB~A41ᖤg!M[s$Y^XZ#~^YB<db@X/%`@^E݄(z "! ^ {6!:hZ|?P(0e zBba#NC$ G12H&)qxA{SzWqǏS,@\EȤG#Xgpa{(i*(|^SV+(n7D t N&!\8|P`| I!\z}JF"H* ~vwK4*ng~W "L@P,`-Ȓ ; !f l.{nca/a{# q: 1 A<ׅv ]"L"ly^H^01-NkD=.rE c5bI%XÅno+Bfۋx ٭`0'ҰkMx? vF@ avhãjPA,ேf<OPoQ14 m[X.E6IWA<04 ClzK$K()>V+, Z-F# Ànc2c>%Xmd{>>b:E B0Z6zn nWb [eϱv -lH73 N.4-X4u8`0CSV Wgʚ3)BQZ-ZOT AX"w /_ʛT|nnnEL-,h8??GVC*CPFSDf@ jRxlX,lZm>J Iҧ+F!TO3wBZ@X H Ԃݖ |ðfNC]Q2=% vͯr=`^b42 J.RIbQjD|PٌU24IzIt wXi􎫙*$"1Pe)C' KP(&X,1bL&/D+u!`Hrܭ&IC@>Fx!2t]jޡ Fq aJQ K~M)2/ I؎ l%Ҟ2s9?j׸븹ARᵲZGzo L&h5uSwc%TUm(XgLu]g`]nhẒ T) CF n8TG޼ysg.!%a꼷j[}[9j\.>X,B-sM$FV(,!%^р!)i\.3}}s\__c8:l$(*Aev0Is \m#sK,eLR  svZ꠪KGe&04MCE<G,ò,Vuz=qc 4MD"hg2@"0ò,V86`"6Gƌc BSUٌ1vǃ`j 4yd2h4S4'^Q5Mn À͏SR$GRA.e^b^CxyPeYFjx8z(?z2ANR|Im/A*B<r;׋Sb1躎m6y\P:Їh7[H&!eIpuu嬽@a]*r$7R|(MMx<]F㩉9M@Q 2SdY%^-1ϰXةNx 8\PDwjgLu^Cu$I.0tL!$ImFHMkf'"i=RɝiO"jR&;rX,Jx<+kQ,L$q+ b~(qP\V4L&4 XdfYJ%ljɆ" >߁[$ px ~QE%{*T*FH&PNȀ$v ͟ŃPd2F8-CDY, ?]:͐p8fyg`0@hcHRGҡ/^>˱ʈ˲8$3H  ZBuT[+m) z0mĢ14Mehzj7"9Cz.5"BUU#tNh4~aEv5M0 LWV${52 2 EA6e- RQi>rWolRbC,c@e ;)۞ߏh4 ۶YBEk#" !  ܞ BV$!mCOr NOOq~~ΡȘH$*;NW( i󦢧X,"Z:~^WWWHeҐ$eE*"% 2...prr¾)FF 0 o߾-]__܈j~ۛl69g^Ha\:CT\V*y Y"ɤh4ط5 m4<,wFl0fwVU 6Ma6wapEBß-X.oNmT,͛NFpqqR2y L&\. ޼yØbZ -R {e$6m) #(򉢈o_5j.//pssudR+=4駟ͫo`p "0B Lkʒdٽn'[M{8䮥v4M"ٔ[t=zt&Ȁ!@-?m3tHꙫ;^4JFQTna7mw])jn{jbx-j1m\\\1GPUՂ f Q%vK8::⇹n#H0<t0j:6xxsst n 0pssˇ\Ղ>9<0 ƈb3>޽{K.<|>* 8B }b:k$b`T<g1q}} 0NF(xjnQV EKNþ۶,&dT+xx!-9#6&qU !-FTx>t{X/W\"^_ɧxF<}^2"G2 VQJKKQd"n4VH@V;RM&t;ܻwnڟ~?2?};5TUcP$>Lu#(eap]R)6.EQt<<b2 ^/_d׋FkH,gggbRr!"ͲZhĎ_2sF{%#se*2>#yܻwX \p=[.KNt:i5M`nFo矣T("H`XT*>@$~`0<^jPQ`07)`P>|(ɇeP<HdzK( HSX)2 r,&,<;;;\> xpK vwwqxx\.fH$\L5MC(BV厖5R)köm4 (KTG EZYQd24M@i<=2 ( 4MǏ0L9UPeN]CK";],TeRgDnFvT*Ml9H<>|v.~ӧnif NTO?F!zz=v֖[vCx*a[JC5C"Pb\Ƒn p($,o6j `X ; = n7|^/RM f(h4r$29 T*!ϗҩԯ 46t1Z.(˸ǏٗE< mtb?7F4&[QaE%Җe!N$gUJJ. rӇPUZ z\.ϟիWP{{{ſz L:NCOEr{vI'T _};!O#Z6]޼}J AtuD2WkmP_ѣGLj5T*6=|Zfn˩|=, 9~/ ?Gw;Çd2Lj1:߿d((m;JX,T*Φc⨊,x<#('ѣGE0e>G\$INT*;p iH{{{fhZ.W(Jx<( F<DŽ888ӧOdz DхJz@Sggݽ|>MӐfX5>V9Rj!L&x1L?F,pFɫ@\nχC|{"j>::G}`1T*><ÏBJթn,=NULl 4Ypxx#sr8e ` $ޠ`%֣N ]?)2 >jB&ppp1c6T*Wo^vw9\NhhyBR[z$+>^zd;9{S.4[.b"\?!N3Ah4Zt.U777~ F&IrxP`6>}~W^(4Mgc|0 H Nr (l̤ IDAT"!JCD3&L͋?ġ)3p iH%vDt^s(t*A% *}2 tog@Ii5N[f/\.:F~!`ZoС|{{BxDS~4G::v<`Z$J%uNmZh6Pt]ՇxCHb8Q4&NH$?3MD.^rxG@c tx6p,˼IlCB 5FP "B%!94U].?C\4aww. 777PUTj=Aq;ԑbMp}j5F5ȿC 6aF(~=AzB$uKG4 '@t-3 wdTԑg\__ e8nnn6,s#d2//P(g. wdRgP1$IB.dZaiNt"#1K8*#Eq |i-2.Z Hǿ#BgtI=QB %k9H0i{|›P<|(˗h6)GńyfM$L&IBׁeDBHޏ%8}T"30 ]A.ғOSc=~I:g%IrIJx1E?(}P3jn)vdF\&@i}0t$C#]g_,D&2h4ʇ S<~S\]]!ᣏ>b`@*BR̕$v+"V#H&tOHI*./^ׯq~~ rtpzzp_!o4hϞ=りqid61gq'( ˰@Ksc>4 ϹxsZ,$+z$c7\QH\ !HRORdP.IR)ό;D2=A|,K`5.//ΡrR)i|WN8:: q.BE8C7)|>EYSG)9y#> !`:c6BޞU6* WRt8&~?+xQ'Oi #؁Hr:gh M9ۉ6j";$qt:Lҽ, ߻w'''&1P(hv`{C~lƝ2X,:r\FȲ`[DQ(DQtmpzRi3`Ja06n+"ހD"@P{DdWWN/'?a!dB <`zwBViC2l QYTK2Yuffb~> b$ œ`2,L"˱P(pH]1dYDQ^wJ)lr?p6WUVl6y$!%V^nui)&e$Pz,˂tV Fpea: \.b ~ߢagg+«+awwg}J%4Mx^nonnXH$&h<3tyy Q F@O<?3vww2Ƒ\.YFj;(J>A~;NݤCbn^šA4 FWWWw&@UU<@)&2$) NV<ۃ"%݃mAVC w{{{A-4̯<8>>F&b\2ƾ= t:?^KvGaww@ d;;; At:EP@Cá:F#F#zg6N,c@>jQ"8G0?|FgI9Gtṗ;U$PDBh4Z$ L|$Rn{ !o uggglX WC9>>.~*?Ff1dL!L޽{Ǖ@+ >3ɓ'8::F*;`W>CJ%Z-I΀Xpuqqr̸ׯaYߴ>?!{"`HR1ob >5 dYN*o4777LEq-huhZ6Qf:~㏱\. Pu{p2FjzÆHzJ]2˗N,œv$QNӏ0u G#Wk`[((wIt:e+@XhDt]^x9^~͎vrdGmGfΠ:qΰip'芢Z24C*{{{(t:bHR_Yy U|}yIcu}ߦ_@/_ȗs Z-d2`o9u{qN:tfz+HD"æ| D HgGTB~_šN!K2f vvvj ~/b\.[!cZ9n5_`d۸[ u8?;Ë0x~i2+ x|^/^^xD@V9@E̗ iBrYëWprrjP(`5`eY, HNhޮ] QL$9) Gh!rX,xn8ƻw0dgţn9ӷo4PH~,! 'E0I֣$Fe7WfL&ϪrY(⮎Qꈈm EȂ#0oF#Du]G:f.!2 'ucOB;qT,\\\jɓ'„ bxPaA#OfNJgHgA(CedYnd.H8d"P06].Si,DH8x,X4%BPbr >jOR믿.ٶb\m~=)KJ Çفiʧ*tȠMiY[Ū֫+(D"2L&X4`Bז t*/H!CZRQ"~3TnYDT?1[\뗐D7v??A*A;޽x<^V@k:%aX#BB$7p x<].>|%|'y4-J;P kfc4J'c G-}w Tj ;8|!~!!+ [,37D) ,WX2߼F2ã(GDWWhZn&g tLh o PЬ D"5X2d:z]R en ih:?G_!:.Qɻ3]+_A:5%_%dpI2+ Uo+}|;C k2C![0w(w0[h(_W`M'xppnׯp09Z xdBFj ߯F. :*:^~&*ÚtqqyAosbœ-i!`e0/x!D\_1hwtz-Uq1K0SmgEX$Xb!}DJbɒ,;Nu&37ΗԜ8N2$]g:؎N"EIB$Ab_|x>JU.w]rsT5N'D1ʥ PEHCVa098/3vZZ0<4F&yqAK y&t:E6arrI*2JeYnd&K FIR%?Kѵiޢe&3JFAZFVCގhىUŠ׋DPooX(ТjEjE 88:Y:, x(W*Y]%Jww74$I.eZ5\.ҙ4Hل@[{\ZEKd3)T|llq瘌/Kk2AVѢh|ku4j5VBR@8je #pNn'qQ*_heJFRz ^Z w| )\A1/h4tttpttD" FÁfG9u`ڵk  63W4DL=9=9R.Snb&4 GgppU #!xwr<(x [nF"={&Z SYYYa}}nV_oqc>S)ϟݏ>ӧ #L&z|>>ȷ'9NW_}%|ML&R) r:H~GFK.%Rb48;9uVF"h5>~'|ZdB>Md87Fz~I!513TTtRA~2{kkD"!\b^i4 /P%,84$Fm2L9T*xT٣1008 IDATߧ9b#Cr9_E\R`X|R)^|I|gspq~~n,Bf\rRD*utww3==df>淳j>ץGFQD0ٶԖRb00P,RI]]f FZEQ\M+~XQ.{OY2$/Q奘ehkI ̓O[sjm%@4WPf3tZhҰ6mmmoMR!l~{Jfdt~[R1==-_2nYfnEzLjCCC|z=q8 r:xQc2 q{}> <|tYZLNNhDWWLOOfddDpn7|VZ9(3338N<0W=X,*ZRz$na 60b`H?m[F~.i`eeMtIz}w600 " "e@^__1XVEF_}g)KdHT*f!H$mODɧ]$<~ܷpOi̲sT*qx^"G崖G Bu8;\.1 kuB'dP E6`FG3Pda.KJ?6Q3y!n.?egOOmmmA6771ܺuK>xj ^v==="~CӅ)#ҋ *_[,t rZFEK ccRr3GAVCP{^+8DXk+Up:#66~|\>r'{ܹsP(BVgjjh4ƫ%H/Z& v1 c28;bavnNz[o1J@bNs{ЭVwe{w_WR)_KKKtt1C4 A$ Sꎟi޼y#ZHs$ ===xl&VrVUrw AR(댎/\SLPH$(^/}Ryv\>M6[v,)Cdh] ŊE|.(-˗eڴm9Tu: zX6nomS26/24h4r5,333x^X JL& rZSd*,d2IoW E MgP5Kq2a']&3ZO?}.'H䯖NS<"#R9ZI)wX,\\UB91N.%24O?ffjBRR.su^bpЂVkȢ%`e~~A^|p7o2227ߦP(spx0Vgg'ϟ?'y~7pJV[n?9`_b\?URz^I0k׮ɥiLϔJe+fy2###ˎ^߁),^VWWꫯnkø`P0ĎXrxDbТTry)i4hH_{PVq\$ 1 EZJBILOw7ZL:& o*b .F^O?b219rpm'?`ggj"(ܧP(Nfkb%3^d<2{oo͆&;;R2T8ģ14nJ0ע ^T4.Iu~7o^{{ج6f]#qvy{9dI$/uuB {{|_Z܂677fsqqqfAn7 z B|v"f0y^cQ 1s brB^-,,PoᰠKc>cH&bfDH٪nts||fc{{UFO ΎPxDDYRqqq!bF^ˆh8BX$WffI$8FA &fYkI)DJ2I7I6~?t`0f΋//}bt:DK=NޑZ棏>p(J4CjC z/Rb4$d9./ˬpzzJkkEP.GqeS8;;cwgVe+Zl&KNGh$jҦm^eBPIgVDYxtt$~jKU~KD`hlFꭼZzp)J) 8r`|>6VZrEX,N*FR+rBV=>g}_W7UhQ`WB2feE% YYYCDPORaqq.X__ᘝ>29i,KJo޼/_rxx(]]]|>?۔^%y9߃E kH F~/_/_~IfܹsN6oժ{<yFGGޖ*6;looDȤ3 W8$e j<|ЭO]}>;-AdÇcqq#&&&0$ ~W 14ˍ2<PJ/KFg F>lvì)端9;;c``@ }>b1bR)<02,LKؔ^i-˨`t I$^8ΝT*Dʕ+^'W_+(>Nqvvv8;;;d2I4xyD`766Rc7oވb|!###YX[,P%feBZ]F$"͈Fd(bdd{n͛lll83ׯ_!p{|ѻα$#8]N}667[ؚ=Uk+:zo[ܹsŅ*k5JE:bpbr?;0@gG[p}>ggC!&I75𚚚"qz^gnnNb*$0ǏF"ܺu ȋ/8;;ݷGJ>g~~^Yjf_n":b1~Z^^FшEv}{u.^XZM jrqqA<p}~?@@x:̷m@VammM dj5jbtxxE*E8{]lI4j5/#Xz,].F %6zOy5.37oZ8&Hgss ?@R%8'֦X,qxxdTdi%mm:zϟ/2>>fggͳgϩT]P(P(ܢр2w4ryYnRTX{eg ܽm-cj hTҟœ<ݻԛ;q߿/r`D^^^݁L~ haMuo^g*J%A$"J>|(F//> ӵp:]8} I&SryZZO C"Jϋ?a㣣&ĵ?1+X,޽+% \vMyln\N'#Ct;iou5jHʅ^ـ966FKNG8baph @o dXx<"z<33#@mmmJ%|?|(瘹2m:}GhdҔ+RX*E0ʭbW^eooh4eH{K^~<{ObtdD$9fṞx`2$ az\6˫8;=eg{Ve+s"^ok"L+O`P($EX sd~eSwz +++d3NOOh4g(JDQ[AH$ch4JRᣏ>"Ŧ磷 ~pϟbŋXV "cd&۷hUj+G0fA[[~޻':;yh?ׯ_r~?$I8կx^GD"vvvAlhZ{dd۷oO6?'M?L7ZR~G)b$Щ7(uQ\loH$w7ޙ9<#[[[x^ <7??hR2>o/+r "!L2fׯN/I ݻ|.'"W^r-}2+$. ̒Fɓ'TUt:^/6MĂU*"-|l6̩V"DSxJa<##4}w}~^%GS @BA__{{{"e0ium6t:n6x^v]  \6WyvbhPu $LvcccRC>Y,,,C===~ֆɓ'$$-@B%\Ed3^zM8"zʕ fNOŵl6otj?[PV@7nfu/昜zB:1>NZU"6>9!L2RBi0`0dr30h4t:X,".)Oa<.^W&޽{'ԓF^SY[]c"Z'cg'b6J~T2'Oq@C{^PjLF#=BV]{8Qww}7NYw| `b(zo`{{%k1*tMc^ 3M&LOO__F1\qM>[-(JB0pY?}B6cc#G^nghhH٬G1Fkv}=zD0(lFFF R~U999aqql6K7~={FyҖ鋤x%IHVԓhK sss|XXxvCK ҥ*ZM:a^zŋ/MGztwwsuT*8^~|'tW^R"ez ͇*\zp8q.y׮]ci%C7J" zz, ?~V4z+KEvtt~XdjjJH2 N ^z0M4or1Lp8y&le_3-ccc867)6oDTbEhJF^op,2-((K'.x4R Tj i D0#H.N39<<tDNZC DH6iFӓS$~"hiRs<@RI*k~:LZp/..Z D"=(N 8lvj*jcccs/e6-L6K6Cy,b022DrIKKZbgq4,..b"ׯRDT| f3`ENKś5֛}*&z@M_‚ 7\\\p5 izTj%w D>W" -+++tH$x%?񏙛cggGd(drIƺwww-z m"C$d'L8ER2NK`{dHDht[ZZDE& L&|>4T*cXD"]vԨj=oJhP(NMW,hJ_~32 GP(DXIHf|3XZZ t ++drY猎P(J 9X!Go޼ns5wvPTy^;F#nCGٷh4괶*JFN[VC0!P(,HjUL&#*u+t2 W\h4 ^h2QԌRII)h8L*El^j҃-DDIIv jF2bwoVKP8v9??T*q]l6X짧i!㭧h4<#߿F󱵵>3|OzՊJjA*ccc[uvwwy .􂛞fwwׯ_@>͛f$O>N6&d2߸y"?O%Ob|>M'GyQiJH{X, !:==“}qq!r$#!^ϵkbSP044WmaԔ}&z*FL&#S2ycc]09==7 S._bww\\S([`$aook33LOI%hUO0@҂jQoPH%#oP.RI?E%vww m(\.G$!޼P, ! M ^pP*IA #d:??A9,h4\0`tt^gTr9Kl6gjjNgg'[;C! Ke8h423=FL[VnC׮h216>J&mkcu\n;ywlNIJXL}T4S2zppHʶQ>FGGXy9pXzzdd8::H ^ʍl6+fdx<͛ҵXvpS\.o'mɤ&_豱1 hݦnPB"R{xx(FFQՌpzzNSV/^ '۷׿58%Ջ/DE$ooJ- uŎ`0099(KyNNNp9[FѣGx<{znܸA,css.\.(raӧRg4 h4x[&i3 e (|R,|RB=.TV^zjx ([ۛ$g,.>gss!:ڵI66hU)իdsBBW5|#f6..YxB!Ob>==v9;;㫯ӧg2\.+YYYazzj5PX䞙䄃aRdyyg(^FQ?xZPS._bﵡR֦EԢT*E~0* 2Xk`i_E󗗗T2I$aksɌf#<%dXٌdQq9(Jo~tuuJDywwW*e|GS~'%VeeeFo}[y,wvvDQ޽{ JqXa_za^dP4wILvcZղ䀟3X788ǜ344w] G#looU ^Jwwt+++")733#n>ӧ[8::BX\\Y{{Bf``(@X,}Y[[#244~>###DQQLMM@}> rp}Nf^.-KU)e(===7G$ zrLMP*ʕ+ `9[L$CWW]]]|jR]nbb뵊F4OBgx/\.O$A166FXdddL0{~ 0Llllࠀ5䄍 f 77"=Dhii- > z{{EDZCww7:ۿrO$ fTWWܺuK|&''$}SJr,YBUR[P(H#c.K^s||JVի<|xx\* 'OdssSe |Ȟ#yGG7odyy+WQ)Wt(J"ˣkcupz~eZUj1c$ ϧSLz )TƂ4ӪjcB^ejb|.Z͵uN-VGG2^;Ke:;鲘rؚٕej͍ :ZEK |a~O EK z"9Q-M]P+iTkENc1M&j2v6;tu·!W\ve@h$νypQ^jT@ n=^Z"<"Ah,JG{;J"kox]r {vw z|wvh;.+emm x]vizzX]CҰE!|w ƻGTЩq~'wνܸuUҹ>7h( md 6w6$M`lrH> ^,-oKԡH%<|Fg^QXzFfc5orN?0>1F8HZfnfPO1CUf\mZu2G{.o~ s7Enݾ&Aϝw1zfbioT4Z-ڠ1jB׎dDSfmg惍X$@ HoEI}KeLgiWuَv8/Gf"cb{*r]TJFJ 6b'v`.x*CyTR9}@RpSWZ]E{K2 T*biJ`n@BSSS Hp?@"L&BsWzjJ%wvEsP@*a2 L&BQ8BVt&z ǁK{{;.\@&W`i҂\!OT΍ Q[[s&Jn9ZZmCJUR[K3)LM=A'4 '''N?\.j(@.+YE^BxWn"fY\. s.DD,uGάgmB䄙6*fd6z}|C\.D=99>@~ ~򓟈 u>xuz(KdBj{{X,JUUW@&$^/C!v;#_cc#{{{x^A[]MOOD AR x"J΃z?2 N'/_fuuj:::D?L&Jdii+W 裏H$FRqAą 475":%αGBglo?FCwO Q]`2d{{_8kfia'>&kW ]2#t+2RY!V bl:<< =>$J#677\T077g}&0 c?`#/^EQk45, b(NT | mv;`XRBILNN-<3)JgE_Չc!Pi6 !M*d2نB>O*YylM¹T*ءP(ޞgdT*brnepp %:;5V2f Eֈ+Wh% P(3Hf20:XSI%T HT*M#^T*Iܕl6nܸH*wޡ¡ۅD&V_૔ ''Bb,dmm~pp0?O>Dxx Z__guuh4*0:t&[_O7{HhmiAbϟ=c}mRΔ` IDAT" gbf{gl.G"d~qFM[{;i ﱏhA"(wMKd2Y\.7LbiZ"b Luzj=U*WR`! JRUm1J]Ggg{,I3d2>1{{{"akjPѝb3t}cVK,X*b0 q ZEё$ {M6;Wfܠo~=[y{\~ J"@[ z{$sm^(JR q5^y!F(QӴXBF|> E.]J$  ( &9P0l2 @Zx rt:׿.}}},..RFVFu,G5z^t ua    *BMn7ãcHR;>&>!M4\rD"dȓ)QOzrrb6D*62o˗.֑Ne\y2OS_o$zETj bK+b6Ս Rmmm .>nqU:bI5GP_,,.P*`dEQUE0\)"Qx  B*ćً^*۷oh!M#WȐɥ8ӧHdr|v;5͸\.k)#+ΡR_|ett~P(ӧOd2ܹse~Os%$j}zzĢx}lmoD*% `0~''tvurTUU}w\.R,pIO) rYjkk8>C6exx^4 _ÇN,{{{>lFp: EZl->dCƍ;wm \.g_pQU Vi7z} TX, p6nیCU;::pJ QPK#.]FTe#&V58;>payn)>4DCCMr,fJ{{{].jϟͭ-X]_#^X r㡘/h3i`nnL6Moopz>b6 ֺQѭa6J a\h9/,,G؂3=ô =fV*Y\\AݥRF|TRX,׳pt:]) DNޥ=rnxx̿lKfff0Ltvv")C8d4A0$z!Ň?Ǧ7)&'&&hjj `Pf2os9&''ꢹI^`okCVITF!LD[c1͆N%rrB2@RjnɄB&gkgwn\xQtsU,47 LV*%cξh~CB ׮KUmTUƵ7ľ<`2LgDww(j<{!ɤ[YYݻD1qc6 Z#b 6[ mm",OP(>t:=j\eNo_/`:bH6%#r p50RlVRI%YZ\E\BבIeΠKOrLr'IqeN'*ǏD{7Ex5do}Cx@=t8qpVS-Ƈ N*z X_ /#QJ`^HFs>r/V [[[JR!J*G(u'>MWP*FcR8L&F%PW[C8$ V*)]S.46$z#X >c_ɓ'}lR.(K.P*gts,f3z#o$ppGbddFógϘvDZzY__VdeskL6XǑwn|Ab7S˗'333?*qf3>B~?===ܼy"pX[GS &.]dy"(HPg xa:u554ۄA&+̐wikkРBȤrD*H,Oдa3/Y*NWDx0D"'' >h40?K\;6CCCLOOT*#͊QD!>ZM__hbv1ܿDnhhKR*nł_ HhD⢈.r"Le:77'28}v>*3*e&!/ݱ1s"m=>>׿u"*O1D+WLL308ȝwx%PX@}Sjj(8NyKքVquv9Ñ8-A>B!0Ӽ~uhhh`eeׯ_QTbś ϟsc qs8)ǫWt31::G}ϹwNrNWVx`49::^0pQr.c~~΍188:?ϙ~ʕ+Wqˢ [Nw\J%T*ϟ?geeE[}F+2͍M+ \FGʄ n1^bI6WdjJ6'OrtP,s!x^~ߐdhd%Z-wtp}h5:* ) d/>*F( CTqu_l> W=6zlJ@F0|9xQe2 J\Po2 }~O+W|&k3\'vR pwyG,rEy)~_xWj{{457cŅ~P*K4 7op q?@T(L"J_F*K[[~%Z5W^_:z^D0H$?py&<}:&&&=b_?b… IA 11qZ~?計xQpommP(~7nܠIOLLKR (/^>'.\@\jC霡iimʕ+ttto7PTLNNOWWW%, Ț|>ZV(DGGZtuuۋg`0HP䝯}\t 1&*CmmO$@"AףhD~QCCX94޼{M1q^wNZG$B.W0<4T)c"ٜ9c270~nnCdg3,˃X]]VIR2 oߦ%fggbLMP(!=}V_~ITKL\ &''e{;nB0RpC$){:q{&+w{D8da~7w~ىVez#̼zI\!*o_Vo(5Z^]aCC ˅NSM] ncUra8@_W96779*Z/Οo fz`e||ߠѨ ޮUlD޼{zP_~d2j`(\UNNNvn$"4;::gssKD YTT*no%|>ܺu!8-\t1GKN^@޾>yj>fuu*>kɓ'4R@Css3~Z[[D*ųgPTܾ}!%wEJ1::0׮]CW[#Qh41v{}n޼I}}=2 ϹsPYtޣׯ_]>Cŗ_CCB4"Ro\\ll+X#sUz8"J988jjjx1Cb1o2::J:fgg&1yxpp8 rM.\:TJdry1fX޽{h4^|;#hnX__ ?ooh4 qe^|I:OO7F#U'''\pA^|Y*$lK__.wapcywZwcuuUtכL&%*u^zŋ/웛?mnnfoo?xyxxr 27 ^Id2T&PTr9jkkӧ?VKMM d1T( L\89=MQ00ՒCȤ:ɄbC5R a6rx$ ?hh0F~tz-FRH |!W\]]]lll HĐ˅dss qa"U*󿳴ȟck~) )L~y2\schb1jqCqxg}}]Ϫy%ܾsZ@^q:~BTP(hb?>տsJ%##l6oOOO/###r]]]v(n oX Y>Ny$ 2 |&u:ccc,,,AVUUPc}=ss<|{[K ##].4ʀZ#Xo\'T*~YDĄd2z:I$@<AQ>%jj7(FTbyeťe.g%0rj׾&?~,r9d2zPȩ7ğkhktɤ&&&&| s=zVk#>/݄!vwwEn4e`c{PWW種fssz7pljR.*2HX, ?,tR0;;KTT*#NCɤQ*",wX,rģGF*PgTXt:}|.2O$=:biaE69rq~!L&^xx!O>pNhD=Jݭ5b,d2ɽ{|碉. YgϞN\&-.µ׸}iZiuHǁKX4P_r3VWQy{]VWWp N3vT|^ZlMtwuCKk3--6\n2S*& 먮84l288&}(JZ.q\<|l6ce\s9ʥ>z<^ۣwQdi6בdK%dpu( sK%z{٩_xA*Y,\qj5R:>#O?O?%:j}>din>3LO㩰^xO>!qz**z4dL&#B0 DDusuu5[7oKOM& xVWE":$ -)0 U*fC!#0 HpvBYGp܌?>&Lddow# WDadR Wx*'_}šA_O;[["'d2IuTP($lʹPWWG432:LOo7;[y꠱тP8iLV`Y{---|᷸{p~-<lݧ˗/,L&>1Fe,5ZZl!R FhZo6Y?jXp8v,|GDQ\.(f=Rp:Cnݺ'hZFw߼J*PL&͍7H$,.,nݺyl֭[ |~'|L81߿ϧ~'|"r9a:66&p8Ϩfff\.G" :eaaW^NX$J+>dxd2NQ*.n޼IGg_K ?鄓dbmmC\K$DŽB!*adR)O>۷o I!e8w[[["`0&6M|c1Nv&>(NNN RB.PWGWG'ROZ[Zc* uuA\C\.FQ|cٸt򬩩AP… t:6|BL"!2ͯhT$ioIKc.7[ܹsW{E/Imk;kyњV+gDH$noo}i0 |X,FSSTUU1;;Z-@@@  LYp f3ls*F669f3'''<~L&#u"(vśR$RmJ%455!ݥsھ)!LXT*NB@Xr47vbѨ3sQדIQP*jzF+}X-dN d y1pZR)8ەٰH\P(DNNH8*5hס#fg_c5d hhi JIQJ@vZ"oߤ 5jpʎCB!gnnD"ר!WJ,qp`i@0L|h4rx`0V|8`@ՐL$VK$LwwFIHH4PRprFFlnn.eI&h4Z[[1̠f4887v6 x+D\NPyxHT.#J`ՅER5T*sssL\[oͻ dYZ-^bmU ~;;;TUU*~kJv399I$*YrRSz{{Y]]effA[[`AK 3WJ-$6[l ,//c2 ׳N\.-x^\]Iuu@Fx:}Hp 9g˗/7VK2SZZlܽ{],6q?4t:j%CcR|.G"8Y2tZLYE"Z-}}}$IvvCJQhS2i;<~!?gssFj8餷шy袪 \N6E.WH[1\q,- `շzp8L[[w%\I\.FFFE"D襥%jkkEnd2 ښn߾>g[VZ&ND"dY(2R埦OOdQ2]l6(AimsCD,,,cqqQ|aɼhT`s]C!ZlX }C'FC5zp57|$ɤgR huZdƖnS(72Ug3Hww/_SYgkKȵf χPGXp8L8$B,v#HRC,ҊيJQRQENO/\SjjYXX>:ɂRdgkG^, L&66X]Y%z%/Να"hB7(RWύיe+.7jё*ݝM::9wO?,ir9n>=z}w̌u`PQUvg=R)_ktt۷os b1:;;YZ^$b4`Z~:n33Sg{{;ݣO9N'7^{5&J|d;F84V w'1 V*;vg@J@l|)Ϟh'܎f>L\E"h4jQcoGcͦ5jD#!8XLƩS$,V+2JJ`{gFF 0ObXT֮.T*2LtuuurvQVH$lmmLjD”JE4 vv f38v~X__h4j5I( 86^:v{>O!pT*%=nGGA2 sh4,-BVR(K?r B1T*aeifAWW'jm^VWWh4ܼyAϣGq:tuuNV+̞9<{L ^[$ 2 %R"{H~TrѨ(r:-gΜ&2yJ"zrj$~:6Z4 CjU::zh6djjd  S/W~@|d2vtTc1BTFj@ZETht4-{hZDX,J:@.Fyz Gl#br1x2LGmB x뭷x,xN(,S4'NDPt8Q)U5j${{{|>.6/P]tppQZM(B!:::x3z`m-R)U z1L Eׄ5}l6/˅qnXu}D#ӧj?! /_yd2JY@j_?^O:VJ011>N*"ňD"xCVV lmmXYY!H Dձfj#!j0\~]b1&''bXVt:`H$zTssȤR>M.]ĵWIH%$HBN* j Z ʰYm樔ORl4^SNB?9{\^xȁoH8B^ѪRoVakkq^ˎF!088^Zf d2FGG1TWUONQ(ndh4Dq#>[[[4 ~055lh0ns$QX/266FWWfp0??O" vpVz.UOT piXXX?3RH$>88ŋH$vwwq+KZ*G ?Hx`$JK}z7|Sv5\~^'Nc2ı"]]]TU>}*B!,C^2RH\BTف3@Oрjh^6 ^`aCPȩժ.:~?2K+O[b%HRF.d6133T.+Ͳqz(2 R Vjڕfm6WnO<5} -I 0xϑ)d{ ^ቹ9Μ?O(e^j{=T-9k˫bd~~L,ۛ;tNa8i͔y^,9uo}7Pk\qSX[_czzDcd)Z:2$H4:@IKʹ8yrudR$aàC# S*@ptpUL&-Ϟ=dgg ΅ sT00f}}f6h Z,#Z @Z`. Xt2I.f˜:1CT"ШVZXM&`tK_L*IQfV)sbzdvDY~!0nB! z=6ZJ$V NM VG"ɓBh4 &&*vwH8이uVrJ0~l|6O!WD#C@xC g;4-J2c4Z $ Vb鰳!BWh2&džY[~I'>R,%rBV32^a)J\vH<)l:)U+t,pp#pRi^ ##3A ,XW/__:Jr` #ʐIԁA0=FR*WPT zhnmx퉙tvtŊT"whLtxXɂ~]<7/~A*%&?SC, JjhZ1sIClVal6P_?X?g(EB>d  JB.BѠ3dl8y$|G#tbDW/\S'q8\z7jx dsy,kLLp JL&Œ=v9n={'NfytG!˙`rbH$‹..T{Q.1[j?0[[[DQk׮HD"AWWLLF(bK:fpq>|fٳd2677ؠVNLLAX,\.G."^O>GCG q:XVir]\ZFR177CV[blP.(J( ^ #{zhZQT0pyDF]Z8h4h4p:h4 O>eppWJT*զdg1Xp8xeg'r$ c}}iy@OOZm0^>O2BRaYJNb1VÃ}rD"F"ٳ\zRb^^ IDAT~I4ETlS|gPV9u&M B zxwtZ{l6wua2 %eggZ&R%;:,+wmr9, ~P(D4X,?줣C?{+WDիWv;*J }z{{D{Tĉ .;LFPukkk$ {+rW`!IP,8uT8@*.56wh5ܹ]T %ffzDBOI.ex+<h5Z>l&˲¹sp9݇?>R:TW_ZR`T.S)A&Yo5`dtw/%z{{/&b Ъ5|T e\B\oq^\$ˑv*gϝ +ggloob*駟hD/ӧ98H)J'?`xdiAEX_/ */*e,PTtV OjZB{\377'JrZ-ɓ񰶾,掣=== eDSTbP*H&jn)h[`JQSL!)2JRZ-, ph4ăDPV9u Z͙sd3i~vqr$c$Ib}hO@ S"hCAZr89A*ptt$L[RoZ =ixeodQR~ LٳgtX2FT۞#B!FFP*\zNGGG33'ăG $+, Mſ!DQF#}}}fn>?87d2j5CCCXV >jrYRZ-jS*LLL0??/$h5H$N(lVTJpٷ/JPhF۟r zhhS>_F.gq%.]z BrZR颳FV#nNAɄJba ###8f3ڬ]!'Ш7t8 a0YmX(UjJW/~MvwY_]c}m gΡѨYYyZίnH8.RaYEq\9siX633COOnӧOvQT;wRI85E677J?|L<֭[&JQ.,. )˗/cZ6.Z__cmmgKj7oRZDtttj8٬T Fh4Z#WP(Ba**V.Zbq,B Q.㹹9$:8h'1͂IդP(&n\󱱱Nr\[ AAfOom9'Μ/)Zb “'ŰY U*j"qyy|>?3wvT*ZL:!CKg`Ύ.TJ5rFK*u$IUvR[Pms:ZD"< J"5_)$Ϟ=dhm,˗/0>dcc"zojfhr133L&ɓ'r9^f@fsdrżet&DL&;D.vy%UA7xLFxxLLL{sH& =tZR.W7b vPױ\'Vw!yVEcs,!Hx``|3g s2ūW*X V˝;wHR\., &@ Wh6ZM{n0ݜѣG DfR `Y9<ժ5^B@?kk./q۬ۙϟ?gksZ>Q#AC?X \AVkt:*%}}}y!tJa!dHT*Aboob(,<%&׮_UDTE/Q4ŤVh4W&lr 4Rݥhp5J%`PHR"̙3 EDH<T*cXdj ZӎYjHGd2Y<8.q\x<|>QVqw{]5677TNRX*P岬,ɤi61J\.>)izN<`aq&6v  &ے%7ktZqttD UF#Ν\,Nk()5Z([zpKKKT*\.H ^Ư$oZ|>Çd2ՑJbRnP8X^^F.քQo{,h4XYY!Jq%0Lr99H|VlfQVE_.lۋ" SSSAmO(GF#RNG>`˗/ O-jy::ɤ3|>jPwk4ޖJ%f6IXxr91e6-ĝ@?^Wij;8h0/X TJ,CRN׎ChhJM2HI6%HVłGԩSR)={:~i6tf2zqdsy#n3(tjR0D9Ν;G N r P(+RTR8RtSDyFbih Q(D2B7ppp(1 ;;d`0P. /Bx13JkkdY<^<&Tomm?CLM H Hh4Z]x!/jVF4gww>7q%n߾:JRRLNNK{XӉׯ8}A-Sc2j<}TLry[]CR^ R ~g֭[hHHԞ;wN,f2JoȤR4 >P*vwvf҄C!.Ϟ)72bb|m, {X-2 67oܠT(L$wuK*\,BTN0Zuj>T5gϞ% v f>mt:Qȅ,qxy;ZUKl}9Yor;I'S֐(R0u$xjds{l&׾5FGGrr585?T*qxx(t:FGG1\r???9|^4T*ݝ-PX@>}JPiT {LNNFYYY4xwB2LjL&$XXX f`ߡU(mJEkZNVwt8::faL&8n/F#tvvt:EhN4tCO8.?(xtIg,8N4 vӃZ5\>O<[[[b̳jJ& "dX0hT@t:PE8ccc,,, "F .zj,..F!RTێJd2 %׮]c||?L&#?r9?|WUbJEA8TΡ@" 1g;D@6$J|!O NC2lh6m;(~_tyjGlt:bd2S*)˨Ttz= {c TR łh$BIF.QU9[ϟ  "G=1T*ql\(|P(`dxxrƺM$H$, rFqW*RVn::J.C"`y;;;.L 7fV !T(QtجVXoVz=<|fb||\\0ommVE?| $G 8bhp=JgΜaff۷ot_ueJ%t&INJ%0ߐ^/o߾M*h4KRavv-666nL{I(wEёDB(`zzbHZ%Nc4E_1ijZ܍MzL|Ǔ PX,x( e2fxY[_m5-pxik[{E׽D"ӸzD1* Vmn xh: xWV888B Z{g#F^|>@ql:ccc|x_RΎX` NT IFdp\~vvvv|&#LPJ-DL.r/!vMl]:vG333q .HT*l]q4jM!V+@JL&lP5"K\.rRLh'awm:\v!fff˔Ef3#<}}8V*F<{@0`9{ \ ӓlmL&8iP*88$2):A/DÁB!n:::~[嬬d2I.Btvtr%BP#xͷY;X_`scKX|7!LjBgGJ2rwwF+׸yH?T"GTdHҔ%q%fTe@@@h;dJ%!t/@"AgѣG7NsMZ-4MΝ;G$X,N  l1͔%&#ft*Eoo/}}\\,kR)Q"S9GGG<{ ÁٳgX,岨qGGG377gwrpDyͷ\.wH.oSuɌ@70<dfgggbQ>bggzBQ4 rAJ|{-}j5D966>dbbBCrŢ ˗\.s}VVVd2yqo~SX^ٳg$I1$Bo'wb߁@ܤG LOOfihhCݻ'./Iv;  ^|) eΙχ,N̦ IDATE+]0x$ѣG,/.bOGGGBah4(Jz= Zh0S;wF"m "jV>V!3pGh:H z<\|"|۟~_җ| 2,B9ێO߸q^677I&>S"^w+p- ˗qb?pM1~q|T*)Jjg>LFeq"ߏh`jJ af368 Q.x7AT!17;Kյ5tzJFT.C*S/~ Aw:_ڻ x+_:_=^xGRUQ(UT>}TjUvE>_Pxw8u$/q:Ԇmll077([[[Q6ݿ+,%TJsɓ?6fKd!*}^[qu&&M&‘5&'x%d^7.\`ffH$ƥK0  .\:kkkqU>'#V+LqgQ(R)Q)_/-}R}}}\:*h,FGGXLo匌pM?Yas<*ryy-H2 %V Վ9;АǏ03s}w(loR.WHT*UZ-)cX,V/[o===\rSȤˆ)Ny뭷x<,--XT B^u99  reqd2ݻTppySjޞ^-R}r,F` 2gN$ P),//S,ejj ^R]{pt,FM >J%vtzlaf,,T*!0ж޽{?D‰'Tٳh6[bqf VbLАYVVV}6\t\"\2bXQ( ׯ癞Va6 ѡ^'.-Lh4IDcbb JƩY/FyDw}J  EOp ͝ǣG$_r\qZ'&Iu;wϜ9sN$\ d2144njrYkcX}6W^ҥK^d`pt:^)XY|ϟ# r? ۾Nt:b]:ăqTAPP*0 .^ b>?==H$R߿_z {ßQq8Τi6b xG0xD`3Ftn, =$Hjettz222FayuT"\t3'"J%FRA:Fr%.޸RQP ´244įk j:O,ezz LsD6^/?Gۿۘfxdxw@X壏>s|(ʖ8^\.ǟr}2P]J$qW8n<&pz.x^Lpuppk+q,-hAr@ Lk`ssS8B'? ?R)Xj5}m{HRtzf zuTxW(?ӟB xkZ!ʇ~ȕ+WַD">czzݯ_},~&qG.oNgO; @fŐ׋;PΣ XmxvEᡟn26~S|7u&&' L099ͥwKwO7^իW {lll' \/_lnnP9{,ZU=Jx4e\Ým\z!/zfE2I~s?0:oEΞ7:O՛}w/,$H H}'%QHdYvlgk43mLOϽgNg:gm&33q'vl+E+IE FBl/sp9}~^Gan~ &VV{ZM,ۋ^ɓ<~ӧihh~LbFoo/[[0[;^$ MMMx=zĽ{bӧʕ+\z*.](O>񐝝B !A`0Eyyy=66* "^H$1˲ޣG.p K Azf3BCFߟYX]]E&8N^xkLmݺuFN> ׯ_?>222\&H(hr'%ĺ%B4X B~NTVV(^ۍdBR 5$%%R(//G&02,*[ZZ}[ZZHMM!Bwannn[@`BbЄ^YY!..uJ%HX@cp8jexx:v;&K.s8\Фp8#^DG8ϋi֍&^= ,. 4Y__ 8{=z'NX__ٳg4׳4 /NFV&}&bD" uœjh9[[8vJ{ @g{wNڤ-[v\6'.m󅏁зu222bn`00 8 N"EbJNf~~p̵mJZPBF(vLΟ?1. HD__뤧/~Avŋ}Uɟqq\d2cՊT"!*X ҸxjjH'#ơP*H{9rQ ;O 8}4Z-Ѩ^[_GG4; EE(RddfLSFq?-&Idffri0loo#9$&& O 5Uf5*IOWLjUռhim^019td{sETj5_+NAV69'Nt LF?r]~1<<"{{{ Q(D">SVWWqLNp'O<,A?aqi+*(++CQ377"L}?я(//g`` l6.Ƙ|>cXgrq^JYYmmm8dvvU:::(--uJ^^*=% وD"ݻ4##iii%??yJ%))B"^,fRRZ"D!䇙wZ*͜>}] 2erbCߵy)!S[[ceep0kK$f3rbz=uuu1Bŋ1k|,ִ|i$''#8›fF|||̷>lM.^(j߿Oaa!} ^eeeo8ye366ƣG),,h4)vߧG__.`0qLnn!F&CzsJJ YYY$ *p8^AT0JE GE"`4Z;v ʆYxO~?:Q8ʽ[w .'^=fxdiںzy:ssƆ>|>:1;;K[k;='y뭷dnno}Fn޸CAAF=C /^P,@ee%ܸqtLZ$??ڵk1KMII ^H$V+`N:Ea~g~~:$ԨsNjjhoog||HR:uyr E(RRXX\D'%j׿p8̱cMn޼y(/i0يpޯΦ/BHRFG v<dgg">|;86DZvvo!/7}fȑN a!77B~!ͭ[v33B^R__jk7 9qZm:e|b&zNvkn( ;Hgg'.k׮t:)--%rM>ɶ6*++IKKC^$CF~Iss MMMlҒgG, P(R.hmm]̮!#ʻ{mhlD"0օ0ol򲰋 ?7X eO? w ].sCNN RHD[k++kHR֌뤩T ^X9!!!& H$?>A̴ED.FF! 18"YE/Famu@ S3P(RQJ*++FY@Ƥ YTVVq8dv⢗B%rJJJHJJt=Jkk+itcֽSN@`0đ#h HJSRRJJZmVVV HR:::ea~kr )))x>FǙ_F$bf r}=z/͘"e 0M>?hz0*Ģ~$R)9yܹbB0SW)..ǃyLNNuTx><}d 4[X,Q՞Baggl60,266J"338677czz:t$''c2fVf.55B, Ūee\z5]+..F*bوD"ʹwtλ2:>A2UV#׌b9gOWfBF|b4dye7o kҨYXZDqYDa̕?ckk222a߃,^soe?h`{{$9^/,.- s JK˱ZmBa s[w!A.clC4JG;:HLV/,| XV~SZZJYYH$&:}j&WDx+(~˿|H Vgzz1x<8D*[nvc/KgBL ddP(ΦZ))) T*a{γga4y뭷0buu57bsS8[Vz=u$%%ފX,¾ma~aOٶӟNǹsX,ttvT*1mn8^$+D"n/_ b/fckkj)--5tqNss3[[[ĬuV8t ƊT555֢RHJJ"099"@j#kbbC}}= =JII Ӭ1)nLKK ?cWF;N Qjc1|>_l<#v<>1fgg*q/*:::hiiaff P(ĝLNL x *\^0>>Ix VKjZ:iJiii!$-- 6f@~99yH$~_ '$)]F"TVTjy&Lh,===l`6IUJmU !YZ\"IeB$o`յud24<rezllÎ+=@Vrf6oPRRLrr2>dhhh?aQZZJBBV5-//?.F"'05:eae6-,Iת{,Mt2ymwpN|TKU(%H`rzsOQ[_ųAfQ(H'73{.ƽ囹ΣLMfߥ^/LFF`fvʊjV׌;osYfp8m8^=ftttZ1,//LQU5Ɔ cddZEBB\Vi7n@4Luu%[6(H%$^cd1nN4dyaC@IRHvﳼNQi%mGPtӰ8yIKQC{K+:0Ш:FǰX,h ٙX2- ^RJKx> Db ٨422ƷMqIIj뚙]"/8 F\.7$&ʙbii]/,PDR)F#SSKlv$@a|t$|DxgE;w)z{{_8̥сLOOj HXp4' yjṲq"jF.8) ?~L{{pARa(%- xTԢT*կ~%ϼ{|~& B:^,sct??pSb1]]]={?/R,//?Y_[% s:_"%!!LJ3HI ;=MMM$&&b2t/ Nn< j(p"ZQ&!676IOא Kd||Dylp{iEEETTsN Fͫŋ]dds5`X%×qVE||<t ̗nZ(aq hii(B!x CCCl6:;;jOpxw9y=f*+fjLq& &B**atl,ѣG9Y\`}4\pR({{{r*z[]ea~ɓ')..fzzs׋bV˳gϰ99s >!6+رc:!j1dxy9vc7o g5P*&-MʊոHݴMעLQ4G*3OI8$]a 󔕖,go~>5 ޞD> ---TWʊÊ HYY E %$Fqq1[[۸\{XëxY\ af3ΝON&hɄ&pdaVXEh:<}hkk<~mEF\J2hmmp! pK_5/F$rQL7._BHa0Fii)99TTTtxP$+|tF*3>1~oKt0;;"%%f+,,bsÌsX}xϞ=㝷FNv6| eee޼Ig{;'kWl36h$L8klͪJ CrvwOOOۄB!Dr:|VWLLL`  I^~>d2A:::|ЕX,;y"Z Hww7ţgr,//(,,>dpp_]st:F`pPHj9('O`0kvca{A0e崴T23;ˋ)*o5p:8~z} m44pK"..LJiFF xGP2;5EXBUyo&Ō=[%&8T`0P(hmm9y<_`g?-8t\áe%y{kKx1 @<}*0D9MM͘f>/ dg`ٶյ^29ՅH"ҤgJ).-ezvյ5v;Z}~Ri*ccx<jdhq\pip$L(!1I.hhllDVX,"𓒒BRRRGTN_Wbc:3(MyPQQq*sb6o4 Bnii}8~bٵrlvv;J\ӧCsMkZw:~̬L*+hdd wqP&>tk<|=*y>39DpxWY/$- :L DAa!KWW/++kܹsܽw  R_׈%$-/_,(&rZ5tZ-f fIר9q'd2qc\7 }&N Ujvwh҉c0xˉ BJG(Dl6VWՊNiS\RӧA,DWWLN.;gϞp|By1rdRLF)/"77ׯg(4n71}P[Wo$ LQp𓟟((dgg1>>F{[}'ج6vwvfeibO>v50`o|ۂOPH_, (,k!^GyY)yy 30 s05|Sodp>l6ַiҹvCfgb|ZͥKoPRZŲ [ 165 ,LNMsXv G+|ϯ|ɧL($ p\4S]-vuQQYA22IHMK#:;.uuu$''Lk[+V. sf p<:fJ%tzs9hhhfff1 hZaN "KG*X,[ 8y466166FAA4"GB[k; `[n]ǏLƖP$HO ZB"v-ZfeeRif|',,.H=8v>?n_|ƆӨyG366FSS='[G$^}wDޡ<qܸqp8L;=H;vj D,//sR)h6(-)!t)|`ZoyeJ ׯ]d4%Y.' !yfrb4 U"--"=ܹõޫ[6E9y\R wy'O!ٳ\8Y xo17ǿ-6=T"1!_('{zNWW/^yr Iр8M LMN"Hn͎J"/@[[%%Zv6{.?x=IVVs㶶66?/]1p8\֋B̅ =)p8G}D8dwA$c4[ܹsx^c6IOO?k0hmmF.ΣjP(BII 0}aH4,IMMVK^^H&.\=Ө9}4===8\.hJ8" pYYYa|1np F10WX^^a~nIƞ=ef']&x xp4W_}ӧ;)IIٳ!~ETUՐDII>2Y"IJVpemN2,/-q.V*ssD"JfCHO" NUX^^fbbʊ*'c}뱂ee=zVsNhٹY IIIܿ{ch4gjQ*X]Y$iwɓ'lmmQZZ\.gppt‘ۛ^4& ׋L&#??}kdee PÈq\|'99eH$̰Avv6:ш$)67hllߧ%fffGRk(**Fi'TW ɪ9‡/~RR55RY7 ƦRz{osZ/f3XVs෿JrsJȆPQQnHMU"Es>}B}ciJ=嗿ۃ@HC.,>HDFF%%%秡Ɍj*1>/zш^G27;D"e߳O$ARo|FRSlwF`k_QˣTQ*qi:awoӧΡ>Mz{"sRw> 44XX2Ν; ={ hii*0ҙ@$"fT*Mm2rssĵD ]d)GDQTijKarr㩬O>fqq8OtQ(4* 9?juᨀG3gdV$O4 MNsD"awF.OBJc}} ]:䰽MAZx3D":=nD` )J6+ ^|+@QRSSdddmdggQJɓ'a;(//GӑLeeyyy ]ZZbk׉Fô4pk\ QUUt;H!O>_pERa$Pe2|>?>Cϋn-s*)zK_+:^{<+k qī\pEff&2'N*C7Ltuuq)"0##BIaqq9wCszFff&6:d2^tv+u}VIܠ~. BeeTܾydLMMa0QUU48w,CToA{{;"5EJ;;nERqu sMݻ{\3=5b|)H3gpҵ,.,_Xݴ 3$lPYQ^f}eDFb~~\NFBghiw* >O(7/ղM~^6ϝf='z˓ZmHdL&#O qY;6ݻ! y=**b &F$-" .7()qVkS !Z1M|BgO+J;vyw/b מPl׻ϕ+ra0䑚D&tv`8H,"^A ۳ώeukoV%ڹg}Fqq.m-2l2r]Ƈuy, x^Db1N-())ٳ$&%p88z(?dYkii>hP]]C8d2 QoULMP*IL'9YNMijh&Ug?8vM WWݍbbRlooSS]֖@*JvNLNN{ ܸq{ <`nn6##:KKK<aׯb2zZJ),- ;tNDbgee5&JKKc}}9 PU(JWБGv|5ixżaDlmo1y<*(,шqsC7% IDATB!ᰠYZZ숑r!222*|> djW^|^!())aqHSc3YYt d <&'7B:IR dqN m* iTiT컜, vv7zT"ioo >!RRdee/s)*.<-;J=w@vv6pEZK(..9zᴷ#+/cᡡgp\TWzn0|133T.>:=999g?ó+]dd٭lm$11 Z"EɋI"(bCffsS7$NU Ɵ=nj%|vvvayeI@?KKKʈC ݻ/$>}JUU|'uqp:w8N9^k7(--9d`h4l.\/`[Q(>``iI09nnnr1x ^u|>333`ѣ1WP8e``q^ɓ'g~~NpO]8MK2QY[^oמIff&?qQZR@QA ǏGNvo$eg\ ccc9\RS $(SIMM:Gj<vxHFKo211h4D"tP$(s)"o"w oocIj5OtgG8qr\S}i>sBEBΑ $R"EIVmv{:llwgqzm)Jh")Q`HD"BNP9.>\թSUyש,#P3? ==}D#N.fdggx0 9txST*cnnNc;xt{k_Si!_DL2';;ÇV M|_ghhL&'g?$;;`0ȥKdmm&zȥK(//gbb^D"addÁX$Bjjj' ObX`aaa#1ooYZZ"??^OeUцw: D2կī0쳋LLѺc^^x<.]048H~~>{ATFՓ (0͜:u܏cn7Rt(zkn1---jJ<|o|=^]D"ĉT*-l߾r`bMwO/T YxքN.f]H1 d24ht:bHeM6X,F.Sn"W4 \IfhU TL&ƘeNy>}T̒K?s$1Vǣ466ֆ5jm8bi:;;|2366A0dzŕ+WۅQx^eeek8|˿h1O$ GWC,V3Bw˖-ܾ}۠2t233)Jo'$bFFAc[(Url6ۆXKEePzw---=ٮn+ N:ѣGP?я6 }pqv@"`4ַ!u'Y]]#dsizJNN]ܻ%7oDP癓'EYyo7@Q__ɓ')--O?}صkTRHi3݄fcϞ=:uI$f8@EE崷s EzLũJ%Ţ(*n7~Joo&vjj|brBTb1 dX,(wd"ɱֆX"FTx "9FƑn<ٿ?Ty V^:x|C)!ظپ};r _{u^z%XL t::n2r{axh1)f\ӸWF„DaD4bQi2T2)J Z &JN%""sף,1:2£N?l+Ŭxq*pH#+ZZZ"套_<5N,f+?;v#G`0 4 7@8DtJ%I$2Y,--RYUg]gH&lB&Dw^dqqZo\v/渝NSc3>H$F(}v)**$L 8x DP_|!aF=,b1ݻ.V^.}9gΜ! ~B`2e1SSSÏsO[L4Ҵǟdpp3gΐLٻo`wmJJm̹83]3+*)tAD2B*!n ?,#bQ\$wJy( nߺO1?7GrjxlX"׿u BR~d&^|a/c\vMtwuAÇiيfeyy@`|ۜ:,w}T&_}e**l9shT(AW^y,Z >Z(TWqyVVVPA#?/q1Em;wrSh4z}#A$&p"yy,(JZ9BF"&'6琟'L,* N<455Ӷspo_ǭ7a#dp{<2hD"^C&GI@R"Hň2I$dc"T )RLD,J&D.#ɤq2bD dK%b:  RD "D!Y[ebrqۏnebb\V#"s xp8 d2R-ݻ$RXX#A,:pzXYYFT_v臘#G32<@&?qm r5B~47,^E,G$Da<5>*:s3Di9| VCtm;V r; &pX17bF %%%=n, ENY&jkپ};%7ԳՕrrr ^G%399M0^h28gOK)//# ϫB) HA)2JI&R(ri,,vVxCٲe .:t*!`D&S022J__--[9~F#ZL,&~E&UM: vٽlqPPP֖?%Crrii)grr_3{=YYbqz_b}=hy`0DYY9999ᇌOL0<P UEfָvK:k+!zz76 #jDIjj8 9r;wV),C"`6R@ݻwԈ-B&''W^l6ى磪o9pp/UhTJKK)33K[ P(۷`0yyyՕ (lm/cmΏkkk6۷ogߞl߾fQQQg}ɔEqsÊ' $9{<7odqy VKuu ZV0^"hl"'zuy<J*,..S]YͩgOH&:hj`uY0f380oD"QJJJئۃTfdd=~z\AvGp=tz^~8N~Wbl|ں:vlC$rYN()\S >c|t%|5Y^#C 2=9ϳ\*#p½{E$0"MM"_^^\3EiI~XG*l* 6@ԎPy$E%NjftXpX0L&n݊Jaaaa^Dx>_8ǃ`cYI&d2P(E9zGoOCTVT259LBTCz:TzA (=wشݹs`0H,F˗h(2& s|vU 下Cfgg$IKK|ᇄ#!k311W~L:fwywpﻦq ߻y) 1߿Xű#jt"XYYCR1L&c||sq]nܸI&A*004H:&NujˉǓa"v\M<&N'"?|zz)//_'Iak6z>{,gΜS'9t###LNNb줫|yVKKK v5 &Y\XF,rU\.}}7C@QQn["VR~ZF)AV2H(loD"'|YlY>cz{{I,/lQ|/iߏD" ְfja/.+b4f!SBǭ|GXJ ,-/3^ǜofĂQ&yLzv+XT2`G!Hh#dPH$"0i26R KqidIA HRTJ92L*N,"H-*ڕ/()+ i<^H$F,<F#8ad20 b#_F:&(^~MV/H?_cfq$7?\i֖Q$tܽsX$ŋiHDeG7e]\ti'ljF3|>TJ5C=FJ+Q*/4V]1144D,ׯL&rOVV3,gϲȉOS__/I2 w"Ϯ]hii!p5&&&PnSXX1^X1>.8d2A-IǏioo|{d\.Z|zH&楗^"}E,// [nEҸ =^P,SiZ[[d2izbVÃ=|=߻cc<~QIeR6d2###hI\vH$^̝;|`oWW$kdg簣Ç EDb-r!ʩ@PA&bغփGFX][Giljd~vn#ܼS\\#n\.b8Z,)1Dj]. IDAT0*UG}( 9{,>n$JbD$Iܺcyyq|//~E AϢy7ǣDc>}>#^aiiF1o~vɾ}psyrssٷod2i$ˤi+ p8055Ngum H]}=x lO4j%yӜ|ir97w"HX^^`0C<7CC#bZ&fc>}=}{Fo;._NOc]3`nڅl>w~OAiE)V` 22elvœGB!W ܤT)*~s~vhΉ'(2kyѺc6XB8&LR[[KAR۳?CRicmh4 ‘ UJR$TXBFF35P$ҐFBAP̈HĨ:H2u:9:YzTJ9QH(L0D+= {f_b(t:RT*Eѐka}]قlpP__i& 2mò())F$DJ%*ne`Z<~ڶB__/k+'ѪU[tu>Y2yȤS$L=RH!dH$dHӫQ*eb2P JLEHA"`7I `h¾˥gR^^_wyc$bFFFqm{+;vV7l. Kaar-l?`ttn޼Ę0*y֭h46oqE‘APP]UKYY9. D`pB`-//'/G"2<:a2F# >/Nx2e _"d2)2%FFFQ)Uu7GV,+;wLYYlo: %2W_YXz Roٙ9|^?aX9<@^OQUtw8O~WBAA B~FFH0Fv{|2'tv> ??5jkk`0m[+LOaZx<0@nNO=LLN$RR) D4kzZu]v 33;vrf\1F>|5Oh4={ݻexxxò8!g#''1*rq***A*m6[N]]=PYz=6sLLL211BD3SXX_QCmۆn128L"}g;%\ .>1bj+kE135b[ex Y]]Mb"W ̠jd2<(++gvu`eeI{vw^X__g}155ţG(/.ƨ1=3̓۷YͥZ bH"29H8T&A&N1f1f(TjVS T-Th`K8@DVM2''NLPe}+tZ"F_K˫ҺcN'J^FoߎY‚⒒͢jҥR,f3{졠D2Wrٹs'Rhu&.Ɩzvj#//X,;{LVV%%dLP[#df339>?6Z5c#S)j04QOMu ZٙYlevf^gMpN%=p_TV$2"r $>8#q_ {X# uxXZBoeV:CuU5حvX\ZdPWߌ`zf)Μ;hluس&xyghjn_w, Ʀ'?,Ng~~wWR@򨻛?~_Zg>'/7|5 z-D^{.0::E D2E0H͖Vŧ.a7zGwD$I!/+;rr ?J?FiY9]{p_x{܂ȡ#$bi&)/qD# fgI)|عi[K$twwN#77x<.艉 JJJx嗩c~~~# ''cǎp8%??[Zx}lٲ*57ngשc`p{wRS]CnN"N/p& 9wG,aX(..aٶ?F ֭-۷oHD}}=YYY 8qr^. k3>>. Nbx -2<3&љLq4Z-55dmnY s­[Ysm:{Px%%/g;~m-p> KÇȔZ?yTj5%EE_\j;˄B!fyye "'룸T{Q*Ut366F N#ħ~Ñ˶twuqUzT2I:%&˜E,?fjjX,ƙ?^p/{=zM0@&m4^'K(DGGwE$t:u.qΟ?G0h4T*hljF*-&;ہT"--eDrWVpX46Գ}*X"$ 44Ubŋd2H$tܸJ&ZسوժctxwyZ[[ "Ȥrlc||tӍ!+bԄX$&/'TFee%;ZXZ\bnnv~ u VTP*==LOP<,|UՔUO% zltcnߺŃA$Ѻ}ގ}^/>ƢziiiJPT8".㌏Orq{ΡV@*' J!Cقd"NdP('SēILf*5xD h %VDFNnkfznj#h2`ڑJd2bS{tw"– (JфD"% 155-lv+$)8bp8LS999ft:M&!N Jde lb2éI>3ʅneeyݻB*~ilja3ml66Mo$Oru53G*f~~NCqA. \5 RRR߿,TD"ɝ;_qsIYu67:hljb~n)LND&X,lom%Xg~qթtvj,|tvv dx𠓭Zyy!c6[X,6bpikA{.VVVqa2 ~zA*++v ~[w8GT(JS)A߻'q?;v˗/sF@( pu6FUJEߺ6$?xh,۽J@7ãNVY^Z$HVE-و%rJ x_crr+8P1FGxqO.0=913H&P/,{( s )*Jy,-PX /GVR,7,=TD0ZBL@*hh jz RQ(Uuf J ;[RMņͅNoil6S5 %V9r:Lf)>Eu`J ZhZ69Ujr (rؔg0D__'VC# hB*cXHҴHer,V[;Pk!$R]=f;ѽ=dv1&h,Fbc} s^T^1yl +Fk019A"|G>be7G.WGcSUb1z_\.AB>,>Wf`h`ݿ=X[]ecv(KD)b}8yR\tzvvQ*T$inܸA>;<lɴXo~k( 0L(5W_:РX,xO07?G^#!O p,/- h4t:r%}߿F0R)h( kkr} ƛlmnB:7`xdtuz:xHy套W|oDfjV9-8.]D:"#ɨH$⬭'aӔg},wA.˃r hRK_f趐Ĵl\.oj ,//9u<4Z z[8z*哏?f &#h;k\~%&N QJB.T826АTe2=Dlcxh A&IgolX,r B^ "W~3LGG'JRŗ%fEؑqNfX3ܸ~_]vvvq:(W*X-V\n#;;{H4jɓD0110VAháaƎ'l|2##4"#kD2ɉ'~b!1rhjիW2;8z(hB}{ IgvY^^M )Hjj fzLDT!Hdȕ*& h ހގbA73s6 IDATKU 5]4og2~Fxw;H$VX-f^zeFFVhԛ,.>Aa;tRZ-IU\mnfjlATL&jz}GPTetZRpq:mN8`/^j4JN BDRP(1X6`#=e~~ ߚN񰽽8xO~)pī~67KΜSNpdYr9O.Ņ~ծP0T&!NQV7L80}t1T:->B瞧j6 LZfs1ǏP(׫r4 o"2zx'hxi6˗ES}m2} z|D*fd_Ea4"ˉ/L&k=IҤI2*mX]X  Si6cj5Z333{RIV< r|>?BOT=H$d22~d5CJ䵿;Pȕ  Ӫ7%r_&˲Nb`( X("HOx-pyx;՚*lR;r ֍J}{N>gNM?a>ıDw eo ΎN^ze w#H022BX,x=|o{RÃVit9D}WW7v^ku [ b4y&w!h2rq;~L&3b_̙<|8ßsU\>{>RUYg?A&#ˈExo&\Awh5Z:I%266CۏB0ܹX,l6q=88@__/r LJWW'jՆCw^tP,u d,.,` 7cttn޾ݻw>sܺy&2VbQ*~ `7ob2 C1N'|.|_ŗJE>#_\?TO?T2}FT`yyNΞ}&sss?իV~wCTd}}]7Z %uzZJ3hZ$IwꢷۿvvCVWY^^9y4Ud)xVW`i~h,Ù9|x‚H JEGx{;J_fV+| lv(K &4-&q5|677py,XbDF&cyuJf@(l_z$D¡Çi4[XV\.ܽ&ND2J H$2ݟanq{;Jonb~O`1Y1urV+|ݎfc}}FSSSR.D"hZv;J@7O;"@R Ҩu?Chj1 ,//kq-6;ZɈRݽKt?FcjܤR.qos- NM)^B 7X}F ^ JۿoH$D*$m‹y/Y_`p`o{x.<{Fww'K+Nl65[[{r۷o󭰳hJ{LND2q4ZG'`2I&H$j˜Ftz-Z!N39yo 07oRjG.WR+q8Lf@syWr4Zv!z "6q:`ggD2Jdssuz{dt: )dREK JPJ%,&3*Nfrb6YiXmN -@RTjT\L"],&^X,yFQ24{=fΰJno}{9jrorY2|T:9Vֈ' sQҙ,pIӬ)>̽{_&MqN4 |>]3Yn߾y:;gb< wiOFq- \vG1;;K.ʕ+N?7pې;ͳ_aX,r HhTd2 2X4Jd/df}>{]ҩ>'JVy83`hcPD&_9~!XfΝ;ի\vSb{zsppqHEԲNlR(d2(JΟ?W_|ƟtvCF#_\x L:&M9u.?яnӟZBQcwFC_WxܻTuϊqn7~;w榧UgsEDթS@Y:( _5O<`0P*hooS ƈF"IrB^OB3g?0ʹv]ObF$PFRP,H$htZ 1"YWj5#z:{;;lvɹ|26nj{*֑ R)4HZ"ܥV.h4&z`aw3Ǔ_ܷެ%NS*j4lAuQDtwWW "R)=}bo <0Rj0X`eeZRh4" .4b$Hjd2b{{GRATRQTtttY[]R3VML &^x}z޿Gpg?5d^h1 #Rj~>tZ=lX,RrQ*_?"pUfggIjo}inoFP)G?B3t( 8NqSSStww#H&X) Y[]kqCI2h`}BT*RD\D&z*|#Gǩ77Un"H3sαɝ;wX[[b+==TeܽT*+H$O^nd2 @"f)J|_e{{@P`kk Ë@+Hx뭷 133P(de)z{P%R *xAJ y!^/lwfdHR::::DnϣGs4 B@Z//CQkT*"Clll Q7yȓ'Kd9\.7_9}zBH.?t)>FdAhT*$D)-308Q&3#?@^ރ{8GS(dsYr`0`FQTЙM PE8d Xȳ`l6K1uHm}+b YRV)q{8mttv&NR.+dY677릣 G[AtioTRTHSww E˜,&~Jȭ[r34F\ S5Vkui*wfF ںwO襐N˷~ATdjrfT"zU+mD#w( FB|.JDg \p;M͛llma4gsc N,|;:xyR)[bIGI&y1Lh(ܼu T* }>:X*W4 YQQJ%h486,y.j`Q`/deGOof*5###>MR!L؏D:m6i{A" Wy<7GVe!R);~?*\  z1i‘= TBKha0ꠧx"I jq{H3up)b2)^z%:htT+X]]}AQ `0 H*󭲶`{{LQ'HpؑH${FFF`wwD"rJ%)T*Q.E b٢ \A@`Id3iJ*+Kd}?ycx>OS(x;:#( 8xslf =6˗_~Si6$*LJ!)G|+ \a±(F ߚyڽ.\o\'H癚"PTi4Mr9l͍-6P)? Ξd0`1[ʜ{,RU߿KѠ d377eppX,Nt?BRP( l > |k[,.Ϸ^(@&d/`ueTLFo?GƎp1RA!Z?Fz۹y`г|WB0<j!JR(&͠kH2LF$;6cVWW\.sg( 4uťKf"Q2 TX~BRNXdvvAO&[R KKK[fh2!Jq{$SIJ%TkZ&ZTb&# hBQҐbRZE:A"H$)'\\.G0`fD͆f%\eTR"kURp8̕+Wȑ#}}矰EiǃD"h4"W(_pxl >5V ZMoo/(UfAg`y BB.΃1wv2Yj kXZZzwͦxGsa(0bZ.Z8WI&cj"{!*%Z%adR=I: pYvӧqۈţ-&~g}J{FBRՐr9W'Z-֨T*]SSS;re4Z5Eh!`2[Dx;:I3DcqtzFJMC"J71[DJ" rORAÿERA&R* vȥRm<){QD#h^ߏp \VWʤLf3bD\*%twߵE8mmm,,.֨PU5|y$B;o@kRTbM&FZ`4juMd29Jd.bϱ4X)z\dq~n.\$Rzsy*5j TF2l@L癞oTtƝ瞶T*bWD.q=R$g>C@*ڋ` XMQtFf\ޠjL&P(U=4ei6Z4yέh*ʥ"zZJ&JIZZ|&Vr'\z9`7xZ^tbrTby&izJI08N]:泥'Or=[[[0}**:X,FTD1z-}D1J%VڈD"{iON@&rjxރ0DsYV&mf"FWW]Dy޻D*w^VL@yS4 z=zxj @"Z!Or};!NG8A*!kbD ZCo_/^wjd*M C#">o@`p8dh4d1M$i*2LFM  XբP(X,ORY `C/R(CrxdDB{{;CCCQRē'Oh6>N0$_ߑe ~fgg452AI&ʯ$)DRE[[.7nh +lP*j}tg'B!Tj5llH3tvutIҔ %Mf2jHR\:;{bel6TJO>X,s"R}._DBlnlBL:C nt#Gä3~z=33n7JRO)c2I&3LgG ikh4JZ1 ,/`0XZXb}-H$E}@O2 q{֛vbd.WPDd 4dzlhmSO__/ΝC"9nw`0D" nE, $>9{.x&08.q9|$DО\7"ilv#]=NZ5j!WItz-RxbY]~*]#|dH!E\e÷cY_a2,c3!`ni6ݝ}  D"[qS8p/~ZshlL%bs;vBH>WĠ7a2YފrmP(An<|dN6#dށ^o8j 6=R!X,b_%˳o>EPrAlvNz'#p] SgsՅtJ`Zg}Ƶkp\b|>FFFww5}74HOw7nj۷YZZѣۏ ӧI<|4Vdg:nݾ͛8yǞx [bЀF&Mt::Dggn}cc{bػWll6>E p T* 2d9fghkoםp\.K$JP*iҗy]7`sN#< @¿vb9{)>LVD8AP`KKKbY؉Zq:PbF*tihh`0c;bѭ(FC6d0zYn߾T=ޙi;9w  /Ǐ$pu昝Դ9 IDATG0?H__==\t{111A\dtt/NGIw>=i`iiRɯ~+M2ZvgIgtwws BuTc{9z&wޣ\.K{{kkk7LOOL/h4&;B!tz,d*G}DXilo NSC#HDLJ*2oyubN*&d2Q)IDvGOoXX,ll!Q)AVJRS*xnoN*;,m^bmx&- zT5~ߐf-NOO3;; }xO~‘>ZGZFPHƢTr9dr  %Q(Vb"Vٱ{DL*@J%ʅ"v Jvdd:CK[+FQ1h;wPBK[M-{8C ]2dlfPk4^;A jN0=}])&rZZZf$ \..kC.CPpYF#brLPf}8pF:R%Έ8u x:;CPp9gسg2N)ۑ-6 nGlQ.TJtuؾ;5,/P+) 7wSmmgX YyL"dCxK%j*RAAB fe*C<{yN}GhP)g8zqX&;-m;RO:G*32M[[7F:honwqMه!KtcԨ9|gjU 팍jLO_/;|ݟ33=Bdl~|4@_?2d*ѣtt6TqetwѨTvc0xXYYa~ad*ET!E tuv&St:\.LOO#D fQ+|;I\3ONP+gY r LTP.PJBjd^*j8jj5$))$RY4oI$L'{&CC Lj2|^ZvFLO=z:j 2nDDF%<@&?1JA]ʧ~FVɓ\vW"dk>p78Ⱦ}d``R$UnD2beeE TEw`dttǏ$.[oqM^y5h0X_$+bڨ;4s'1 465we\Dck3|~؆ H$Ι3Q,--ŐQ8qbrwmBO?47n`bb.O8,77\tu^{3::?~#VWWxgx嗩w7P.W8vdX,7 =4Kt ml  #HmW^3%[wo~^ĆBA<C"dxx'xbG}})$*VG 2z NOH$K*j51N.+"\;TASS&jJ0jj>|U.><g~D"υ " r֣Vi1 ۷6zE5p}}== B`~~)r ԪT+EJ j\FZ!N#5 H25@"TdVRV)ת( rhm$Z3I&\N<\ h,A:ɤZMq*k8n^|%;D׹p#zzz8)L&]TjU~?W\b3#Wʸ}Uj*N>!STvsj5f3?&HיPphnjX,lMB0KK @TښRwUloo#HVtw!H$z{:ͭ0lh|d<ƪw)^?N<ɱcdr(*-b8Dv, W\bjjJEt,'I)FZxӬF[8իWѨu444Ő277ǚ׋žArĉ'4`1Z(Jj8nZNTWCYPƱLO'qM 22:FG<$333ǣi"Έݞ&;hƍz9BRH$Bcc#={ﱺng=;:tx F̞W*yR8w,HCMJP,RLbJB\FH|Sptta6Y Sg8z(jt:mF̤S1yehH&b$)LfH$,,,0==Mg/]ƙ3gY__#|At:q!sAXXX@rD"aBMzR?~ȧ~6 J[@.WbwT\~V>'C@T"C;V2 lB`445dX\{?y=Ã?fj%E8fii{A1?( lnT.oRV9r<}&2wikkܸq}߿<8J8uv3kˋ(2`ŷ[BPcX(!;؇J+N*W\'J /^Bl; ssܾ}p8L*_ @ GL1??h$͛|EyT6͛dz4Cd;ZwBGH5vV+jt&NVg!D"\.b2PTLNNrÏg~z{{x"lV H]@ @\޽QAR r ^[LlmGX]Z7)brLeikkC*EfHPbjj6& D ΒJe8\HJ)Q(T8.իW|4҉PV1!癛c;dA=5qnp>6j\.Y/ߝ B$R*RVwϥ2F9. i2\DF#A:AI6Љ_9}7n};^'I1>>{GpC0::JWW.\ _077G*A.;vFFFFs[o&lEw ---˻ $Dhh4r]w2y8gkkE\%[r^0 +#t6DBwW/ Vg"!V!Ofxf7xbWj\vD phd A*PQ #r8Lp:$1v)KKK;q#~E}5Z[VœJ:!{e2r9ba~Kh$͐LwxXfHĢo[vY__GoВJ%mg/#)_l y1VѪLNNPU9}̭[믿NwjaTypTb& \G2"V#ahhv4 JLNZ%XhR% I IF TtrS\݉Zv100.jߏL&VC[[n;w*dۿ`Lq8jo0??s7!MFnVZ&qfggtCc||GjR)8GD2;̙BbgACbG3N) ܼ|W ;twсwՏ/sNK/s%%"[TY[~>Ud2lRM{{.g=׷BRfdt?o2o+Wp.}z~n7~ $rAhD's&@g2޾[R2hZ.7dybmV:$?ݛXYY؉,,quJ0%v89v؎L.Cb{<#`0O>fA㠿gL<ykmcXV666d2L&2q D\zgw(X iq833C*#ۉ lmmAa PT;#Έx@`4?O&Cp/~>z=؊.Ngqד/dQ"n7Ihoo7As, (f,uvQ0v^r V.f(e'˲B4'J[ Ll$ND'@ղɧ^&L)UsE11eVMm\ZD˩TK;*Jb@VA.Ȑ*dy1#)PTT+%A 199L*n,o% tX__`vBaR(H(JYQPo^xyBA"B ADb VGTJft &r@dZM>{pÁD"A&=J$R~^1FDq>A*̙3t٬(+/Gѐgq4yTOqGl^Çw/^/zHp:|k_W^A.": ~ѿ IDAThtN'q\b'} .]D:F"PTH$znz/l6K"AQ.ԩSH6%1Lܾ}T*Vt]ln+ Md2(`LOO]YEբRi%iH&`;p\HχS]j(B^LHg2x7v&=iL&ƶ|>O,0>duՇ\DTL)˨j*EߣP+v~Rd2lMT*Q(K2i h,rrDr^GWHgS߮B N'D7XT2IOo/ַ;L*@*SQ(jPKĩVxo6\.Q(Tv4[1fff|4 jTken'T]=aMSc32`0H&eH Ev"ܹse8}SNܼK%nlo#MVWWي$  3?7Z@XF$T Gc#=Ll6K}A8f/s">Z* EdR#jJdd 2%L\FբRjXؤ\.S*hl!0鴘&ܞzz=B%3r7U'v1kkk %Y[ R*<'.Ѩh\.rHX0ZRph:(tp8u4|;w(U\ޮJil`Ϟ na%M#p:467RˈD6 ȤGE&g|AϬp)S-3=;˗%vi79s6JJA2J(,*Lsq <GCspp͏nRVI666@ 1::<7zQqPF^e|lPUH<w~w癘3H h4 yy( m a.vY ߣYctڨ!D,BQöatTmmn`mai€E^4RuuNА)+E , MSHX_6 j4bQTMq,aT*EH9w|H, [ Jl6O 6Jm?^ns8C?:ǏVx&reP#"&1#DNPZ~:^''9b"|$IU;Nƈ0_ts01-iay1\ YSwspgY9wPM 67Ï *[[[LLLtH&Ҝ>uXT4mllQ(HRԪ RɌp/X7g_YFFFH2'C:IJ,N>M@QJϰm!T*<}dШJeß]Q>֭[p]0L&IC&1MnG#\~/Q*ڵZ)p69.\ s%9jevvvX__`ttl6K%L;癛cff??0 >}a| RoooMQ& 2L??%_G-Vh bDu@;s ӄt&9d<}Rhwju?< qB!|E@^5&榐$ڠEQa 'OL4b}ʥ#a)܃~HZ<(nW277'פ힨^qnc#6=Gb w\\<7r,Y|LabYQJѧlm=|$&&xkb .J$ccca&&&BNO ㏎voZ=q àj:b]ġ6 {B!qQ%;TPPD"& ﰶNUG$vSbnn^sRߚJ% E27~9} a[<믿+H<} lӧlEz=ӴǒpQ5f&R׉t$9DTBӴk$~6Qg8d|Q pOV,/bttkd2VΝ'$vvcMsܹ[HpHett\.$I\x>-MaXSGD/,1Vw#o^YQ,z=.SsN>J'X0& \We( =uǏ ~\T8,R}+Nbrr+W053ɷm* tP(7odi HO>dvXVkpe<|FnDj)l6iؠR:Zr\>r؁1 Rίj"ٰ,d|fs]~ o%(JDŶ]MerjzݻEZP1H1ǥ&?nB( RQBaΜ>3dW$%`Tu.BA=,mav;Fvp\.GѠ^dL.Gwx\ZNu*w{u]u JL,@Q'W|HM"8__*LZu躎aXz=,ǵD"8韚b"^"mLt\FFF FFLML2==k9H/_g}g{{ĉG$iqlų-$G"XMftl|6GVx:ۂ4wM x4*,OjDpg =xx>uTUeyyD"A* R<2=e|ml7w>qqBMaDP* :>_ggou  Yi[XH N .۶wOvIt4 uCc'h o/2<2>6x~חRӨP@4jLMM8{Gll<֭[x>LL2::LUJDŽB!j# 7t|\iHF# !&/css[nRTDx\r4Oe7xa8<%P*8<ڧ177ǛoIZfy<<<ϣlRm䭷ޢ{{`\xr l2 /_El8t~l&G:}UUn.K Z-p]}u9!Ј*+J%N>E$awwZ1V$* >ӢxeAB2rHWT1 dt/| M;ԛ "8q#0s \Ksw3h7[4kuZm EQdd"h6i4Jh55dIpbVA)IӡۮX=<2 ,؎%QߧkFt2 >!ݓ4h]\ۦ82B2j y\GBH2R@"RBqyVWd9a$X]}e9QnzOP ì{G9uzzNtH0%ŗIR7Ǣz9frB:X,ض|GLOJ8si#2 cccB!677E ű !n ҬP(pFF'Qn)lI>/$kaŠrCZHDB+ I5L}N4tTj/"o&rtt ΉjDQ%e],bffؖ[gQU鴛wZQb1 1 nݺ%fXLly W{=m1:ˋ\tJৄ̟>ar kBUvr@]_\)1=bQ&'y}̙3#l,__ QTGT*TU& ;AUUbwI߉O4vzLLL``Yڝ&zM h$B (NzQfX&d԰62N@cCd1CzoJGȪ̜6Ϟ=#R,81214?V 2 ^nˑ"Lۿۜ9ww?lN8>qZEDO=!*jLNHO[ln='٬ D2vRH$my'ꮃX?[o}<~V0;;CcLO8O&ZsE߿ϣGkoB~鴰>/^&GX\XD4߿Ͻs\p\.5ϜA (O8Q] BLLLPt $/R{_^irс|vbݻBet9={FD.tl.M`{gFAU. ˝;w8{n%x7VceL&g~^Ȉ_l%L&OHfAXȀ&%~?ϸvٟA8x8Y։`cjjjp$6<<,nm F\} `||X,A*4͓Z(AqZnRidrY鴨q 3ٳD"1,壏?R/}ð8&ϳ#^筝mLBE$hwp-pP,D8]( 2>mloAhzzgOEd4;m:hhDV) |W<DQ( \$N[*b=K F v<# q\nޝ!*FI# iM0:2A,5.^/L̓dk6CC"tqoEV9B0t.KKK( #I353͝{gܛor qg<{WNy%~ ӨHw 4*xcVWW~(@,f M"8'.xT+uJk(b8#I7p) T*E!'x>AvN&L.K*QoPdZȨ0vYiܽ{ۛPC iAH^,|_tvmN4|Àð,K~Y C(Q q/n/Dq,1ߊB`奋/[07oݢRh*8zӨHģ|5\jb;!Mq}| f@bbe űZL˦Dף7 *J%6ǵ(lw[loHIerEgg VgϞegg U, 4ŹyG,o}[|;KWpUvv)QT/)$i  &􈹹9Μ9m4M.^}=a}$jH\z]9>*H}8>x>(UVq_e90rl6 v524ǘymdY,IR vggG mP|Wy饗X]]E\xyR4FMl$;\OMM @3T6#@ SKh疖}'t:/w\}U$IT*L&iwm&&&X\\8#d2Y#M XhaE2h(!!hUN>(ÿ%_Ϸ7) U Q"1}^pӧb{{o0Rّ]@<磏EQVҥK\pYsSwHD#$|Iײd3yE$oxx?Hq-G24 ? h6dY?Cݻ7 4M^;䛺%o011v|)նyч\.'hO215ɇ}~H,C(EtW,9E_nZNVjv0>^RpYR}TUN&` IDAT:ݪ32>ʹsϓJ RR|\btZnJc:6kȗ #|_~;cxCRѬiwq=EVT p0__#G% 4L q |O$ <s| x~$aZ'"*l"+2Dǫllnp\Pv8mllҨUtmPiS.W: >}F-}疘gzrr4XxDG4>C6y۷X_N'%,9tJ{؞G4Vo_I$8wZVM@ [O |l:u+aVl<{S\|0aptT2fh4:S,/-l+^ FFt; \|h,An:t%>SFFˬ>Zoq= dY>&{;;4*5VWWY__g{Kxub(axL&y( NgϞqt$ bR)ŀ655 a84LZgm :V\.B BX IA4]=JGeLa6CB =1'ǓضåKYZZDebj$0_jGFxW?}]J]ױ,grae$^,gΜT*eZ%Lz!N2"dP!|˱PZMXIe2,,,bY5t:<{aA.x|"hX\Zbykk9>.lԐdRYE$4C!qvRAm͍-vwDcc"QrO>0?@SDhi8ffF $>D$ DI\axx\.Gvh|>?v笭HO)/'O|o}[DX|>[?Szh7nhw;Ȓ&(lv;y'P(Dx\>(77.~|I[v)؆R%$#yu=E&õ="3L wßA"ASeFp p]{MH&)(bD'kb+ | 0mD Rs}GG"&"GEq6ayqW/!2i^$Q@@*Safg({Ys6L)fB$X2㇫hƯ|{n?fffSgdIo:33SFڵ. 3S|adɋ}!XXXpt6AHE\shGTBh>;{Iws?eD"ׯ_X}n "* ijdMn߾cccx`nܸ 022"o͛7ŋ|&Ϟ +tڢH;<|\%@dU#S7=:fgRēUg98:">H2|?o<:Z[ަjeFwllw|"KP( Oj e4 4UT*s8_ddȓ'Oe^}Uۻ`6333Y67&g}}!HvyJxE# z$L"OPUkԪU|'0 B6GI(>fZN^'ɐf9gscPQ)J6D@2.u5֟<]M4Q>65C:%K:>z^%cyVCޤP嗯299MTacD|H'3lll"qJ*a|zY>E^gsݾC._ٳ4MB!F6e/=@-x|+_}6r\>"B$\&/LFM<;ERvHrcrzݽ677fwoW]#_c[BU,{ T8.GG䆆u}6l&jԪ5H Ukr 8*w|p]<{1v=b})zvh4JH,6IY_m;ؖC4 FV頪366az|QUt:C* G:}KcaEZzX"EXP:/IFFHD1xH4Vq% ?mBSUXXX O(ҬՐT"A<Es"xP9p=uq۱QC2Z319pf{k!Yq..]ߥլ1|õm\&3gVw!CJ4 ]%|C )ģ:H5$ezh,J'119oI>;{b j {{ 7eY^\f~nP(_/rCeqqB"|l<>¶E(rgO'j5vwv핓|>~pѨ7T[np B![>7ȓX͏}OpTzF#iZ}˗pn<[;{HLNN + eJ<$DH$$\.4prj*122JXĶmj>;A2"1quJ `8FbbqQ.-10O$=iL&SiӴ~R*oomm3"(eǟPֈyl'Oۣ項ÔJ%e?BH K2V^ Ht:$I CE2Y]ꪨdr?tH Noq>ax.c:6h^,KY|@Zsuq=]P5v;"kX&bB|IE%=\EC/hia)H|?A `(k[h2hh6whBc[b{q]=b(h~!+8LMMQm Ky~̓vd6"3DxMբV=ja&HVzkߦXeog}Μ>i죏b|kˤөUm8. 6Y]7| b|LQgdH<:ↆ"SE 3T/}3"R$b|bMas>sU |&gΜl[71l.L$R39=C2bhxeDԚ U&'Tɉ .\8ϙeFFG5X4J<C%ڍ3>&:;cY2m$IjQ0MxN<;IPӜ={A5y˼JP(k^'G>u`ޝjF<`aaNkLګWq~pxx@EkXɃ@ 0-PH S(NHiLǦn2HUi4|?wMl${.zMIX]1 vӶ|4!$"|$mĢa:.;t]ɤMPHƵ ºF1=DǴ/jv%qx@D?K$0:(U7|w|A  #hS%^kJBb[r,@B |TɧR.!2x]д8ccc rgϝAEt\Fg/ý{wh6]ץot<EVqlD.mxqKlᣨa{$Sϩ7xw^F FE<ʣ50Ν#~w?oF?K.KryJN0y0XvC$MhZ(rhsFGG-| 3MYaht 'ٯTГIΝcan۶%B京?Csg;B6w+m&nzNZ;)U3N  eoo7ol6j8u|>OOk2ZXBH^E"9υ/*!AH$Nrފ#D"}#OX"M*'p|2g3m$rXIxK_7o2?;#u ªʩSgiۍFF>.]"Pc(fzrDPgH |GxxlV+B _x˿kb(/t창]|d"[xG,^#,|SN133J Y\gϠn/իW1Mbq!>Ν;lmmR.322B<(2O?&|BG,--133C#*./~tt=R#EΞ=0B-fgfwh]ATd$d|tML$:ubd BƒH~d2 8AݠZ֎qB2"H 4MY;(N6EZ-OGG`XHK?_GӢe2 t}*Q2Nqn߾w3(q*;;yO:kg..e [;C$G8{,wsgCa&Y__gkkU~1L\>Óa(Jiud394#3tzIO#'Tb~7ݣt|jSIcllL\D.W~TMHvz^S)ʕ+><#W;.'Ϣ* ZDF%\ˢY-Fb^>TI&'eҸEQpLZMW wQ15Fo&Dl>;HDMdd$$B/="8X0@$tME(0]Ha0؍DQq{,Y6xD00\EVdDt7ȸuɠ*=rL>KDiZG:nhIeo.1Mr,:{S(+lp||DRݬӬW)IN´[U2$sEƦf_^e|vT~I.\y7޾Fqj h6BA#YB1\.(=xZ lŅE&&{iX{c,+ܽ{wL_㣏>6O>%pE6{oE&fum U6zEcܻ4\*Z6_x1ţH R:[/{>ǥy IDATcMid/BÓxw{syl<"9M`fn|"t[-hja[6߸L:DUi Ǥ٪sLǵjh <"a}8dnMRbyqh~DdɥU9"S.c.{x|>H:]zQ9J2"8<^nQŋP)"ɓd9{)fgF61Zbqa%癚dzr&F nm=s>w}wP:iX3,ٶ;`WZ=H='ɐfqAVA@DHV2Ƕ1ɲuƓ%eXw%CƇ7>&SA_ݍ:~t:2+++~2KSlaXJC li;;;:창$Ij5:?!e`&vb׾ԛur,V/_ G\6\xUP Fcx{Ͽ?`qa<| X;D\fwvHҨFߥpx/=q^KQ\~1Yv:.A! CNNJ|'|gqVDea~SdYbyy Y8sfFTӛTU&j4->yƟ7y4 =z??pxxH$h4}}EHT4Mr@9w<1][ܼyS^x.{/.`;.zqh֚bxxC:'Gۦ}ݵkHD$䀄GfGX 1DYFFi6Zu4]Gdbi`rfff+u'uG=xO L7&'bl$)D |#,!!NdhD$<?$ ')G$>ی2>1SLX*,ewwV/`t;}&]W];C^q-&DZ,1TUhw;=$g)a#Q!Pi44YA6mΞc+ڽ.d/iˤiZ;&`wrr2cZ-1"polH&t{ml\>m] h4bt$&"FB4%\ANLJ4U,]|vCxrtQ4 n޼).Ǹ-׌-h6hN6CׅT*xb~Ǐ2NgY8أ:OۦlG2D^1 A`F2)~ LML{^ .|{>"peqߡ3|_D o>G?17{Q4wtm;lnnQ.WlzE,?^Z_7b1W^1}MqrrW011iH}`iqkMt"%"V~p/:Q \;'D)z&Ba?~:< X^^&s^zػal!,z{. N9})ژ*pzozOχoY&U(sq`p >@D++8 DRd'\VQ\nX%3>>N-,xPa]*ɥuByxx0LFiڌG0M) n+ѶN2aa96/_F$SV/^ylm_?ܹGm|ߤX,23;&9a8,./ 9>w?|ZXX\.CZ ,,m9Νۤ3qfggs䵳خ.as&vNlZzm<%QK?I1C!:,K%ဘ `7z'[CkiCCe&auuu,SVib}V(zWy t]Rmw9I.[`{wh4[_xoG^/K"o=Ek_*?lonk_:Ox?{ `rbz1kt>VYFGGq<+Wl쓣C:Li&rDX$HvҥK\v|&#IЃMfm,1rYΟns Eb|^ր#2zV5aH'q]oK~fnn,T]6?gjj "IlOn0,9%:B6Q$JxiZئ8ƨԪ<{t^gNbeu^_4EJ?տdeu U311A1Q* ;;;Ą wMH$̗yYǶ,fE.?8>. - ʬ:#֧xhץݪS)W, @"c&(VjNqF#,"Iܻw0R:?9z*i/2[E"޽{z=zxW(Bۦn"I!1鴰E.--q||=4}<0ul&ao&O<",*L$Йǯoll Hr={p(-w;?`{{QZJ I826:F:QYVע*4 |& <_^^T@D2X%>jN'\ssMO33$~JZڨa6#u[oД" H$a]g{^G~_L|6 AG#}딖eۃOH0K+f P5j|s#0^+ ku,|s,|F )!l|E}qGtl ϱ>06Z$(kDŋtFy{T5&KVÀL.(ÏH$tN>ǹrM2  3 qaa:D8sf/:V'X\gvj0Qvv>cQ)}~=9$il4G\I5qi2,Q8:>G?'|<=²\,--{wn`lP*uab[__'O#aw>C6vLK쟒ie7{6VC-w5д(RE(g \q |lZ_@( y,/,rYa.s$ӨQFAgOBV*=[D`F `ssv[3 ^#4M\r<,"JI 4sja~~qv,sP:1>;J'T\om?~LTbfjã:ss$ l"Jb=nVk$iKz I@( PZmU }vck=pGMF5"bҽ~ٕ9U1*TcR/ IɘAB6CL[|~6/\"J ]M\VVRѪ39=w&&'MzGfb1/|*aG+DQ}p0 I~|z<2SS ?G"*@9J@2%F ӄA RbG!Q#Rwa 6=`w{+ &s//$焾9JR4lfgu9=3L*RB@.?B!?>תJ' ҩ|O!E&U; _~bH2磟bttճg,l٤2WX! W/w8:9HrB,& x|sSNa1''%gh4{^.R7|IXjF8{\0 >qj#6h7(x1{ ޾&>FGh'j*z6Y^Zj|9xյ8C~t>|>G~t8[;F/r-<[cZZ\vQTǸ ZmB3gV19ffD$?3&wEQv,W^ y*W$U8 ;>>u]r{= tF$!*,-/k6\I8(&LjXIG _9FXs6v1҉8cc=&ض%Sa d !il65"ZخѧVoJgB*UL̹|묭23;pQLOp*/_ar$/G@4Ał|BOs}F^|#p!4|W( ( vEn( a$ib$wƈuU1L%" E#C!X6G(1 --K"s= $Iw\~,fQ#2hc1,nvM$%Cju,,,j vb|.ry#7o~MJ'{\v|L-" cl0F˩)ԨB$I"(F'~U2ʎDH.Jz٭;LOMH bnf_j4ʓ'OثnOt4MWu<_`qΟ;s= N:Sy-R4>1 yqVNUA,VO&H$q-\eyq5vvv8<377ooq|t˗8>V,..r9&FX:Hҩ41=ƫWPr &Dat+1"ظf͍w7_H ȏ!kMNj ]ۡ=FR$Dev/Md:KpR{yjNOosX.|L/-q᭷8]}7.Qn8n7)u4-٧bI!d ,Pp>& IDATy 7v'P*!)2/ &"Bdd%B$!јJIJ:!д8јHdR 9gI +20\⺊յmP܈wmBK @nyIa_$$BMOa6HJH"#bx6 z\CG1[<w 89> ޿߹ͭ[ye |gܿqVN1/039"E捋Xw}8;\m wB k:x vu fHI&oxwi*wMp < (dSdSqbTMqTw p$uLrDQAGi֏T_0Pb>]NS&v:\Ko^TaZ.jqNAZcivFoFSMҠ 4m>c~~WoO$HRDUT>Ӎu2#yI^#Ar 9"A;X2< չeLݻqxO`P=Eb N7Q[ؖ$)]6I"Lbavg+!G$T]#O&);oX,:/}+\{}VNcj|.06=Cvt=r%CR8N}^.7=<|ۣh ^ĠRSo}c,"jhVjKvoc[&VFm[8 /I@YB#ȊB @y(, W bA"+ &IbUUp|#O + tTF`;f%sAm|`?tO! pt=e9ÑbduI$lϲg|bJN-c '?a۴=\'<NjB+;;3ûC"!7z}~E\2 U}J%aeav5ԩS_ OnݺE*u]:6hmj۷o :,1==E:!J2:RDJ٢\.(&/1]\>ӫ:uz笮t-֟tdc*a$ دRP*XMLi0=3˅9{NMvvDgrr`љnmcr|j XAi4j LW~+rJr'5^zAft I\ES,rjeB!O"칳(Z>_(d9F Ξ;Hlz5Ge2Y4]y+fh(s,5 |0 N Cyju&@]Vq\϶kH̥ iZ(B<BONN˲qmX\_pzgЮ-ɴ_) GGGt}F#1:Z@lP.Pnt|r3·Enѫװ-Ib2iBBL!H1rDA52$@BDeV!XL/\p=Nii""x0jEQv"Zo!!YaP.W |Eֈ XEreԥ-.!/_,gh4h58z@$ŵxqN+VF4OT}Ѕ0 Ea*80>$`Q|2 C\8C vFYij*[AkU"Àe4 HK> ؠl/Kzs8X@l\t:hTA0QEFhwHT92,A0Lbei/as]n޼&{;<N6E׵>30UJs(Q>9OX/vQq:QH$j3"_ r0]QI ?#2D)ի(js"G{t \ϤZXZZ"ZoOq-r<`lb+,,Қyr~O?34pMiEAX\\dddlסhs aRVc3g uHY?TVC?G.#H`.dH$kM&dSbcq"ǶWt^<D\E,fC>'č>Aql9~}\ۤnS=m6tk\OMg ~ub'OoܻwgVQ}Dbq%h*V۷PȐը){ (`f-Է': O""2PڮTU*VI QU7O 7o255Gdfq]JmU$)$K0P%Ydz  J c C=C,&DBGUsxGHeI$@k$IÅ@hЊZ;tYN6O8KRO,BEQ$$I'I)$@T C`lIYKBE߅hedyԘCRDi;wp]1LٳgKG1,Ӥm"^DHvY@).mǡztitH,Y`PSI||p EtL<BL70M6tOgIM1BYZ-2S!K155C:S`own7~kl<$bރk,>:F|>넜W CzM4t:CRΝ 푞wsR)H$md39 j̳2iN"-`vVI'hL.Ϣmm6_l#||N-^ͭZb}l&WTUԫ lban .D"re&Ϟ>G?GL$D@ ]Ul ]zH̯mca;O'h*D=wv1Mv''IӬfkkX,", _,$aH$X\\IJ,QzC&''Y[[2ի-,]NW%NOvrX<׵dyNO.vx>x+o^kSk4(cQfȦSȲ[;{Ģ =(t=۹N9>ܹsMO-0??:8!I 8K:zsV\B8XvwE),(yJ>%aLZ:F=C5!l4i޹Dog||Vk @"c t-Fo " J#8FW5u8{¤w%2>NzE֖?OC ..q]j e:̛1[[[?4$h͛7/"hhg2s_y"CQu6vvӳ+ԗ,vt:%S={Ypa4lֹ:Ɉw`:KeX7/l1Fmr}{/͗dyIE/IxCQD ɢn[[-NO/qPnjcgm4)-dYi|{c}}HȄ۝$(]Vdd ]k$\^\͝K(t;b6st:isv12 E0.0MqV+<~,`J۠a<} 4)2a} q'#D/T-2Ij.iN&=p޽wTk rrp 9%r^ u#PU>3vOu666ek/.8<oY{$t]䉋:EY`Cx8Ifb&a9Y'dNnRu<|5z?\h UTj2S)JS>eb+#CRZse PZ[RGh %I$)4:aQWʔyJ'IJIL^CSu4T(dӪSedB7EZr R/)5j Wضxԧ,sT]!Cj:caILۢj--]ôEI)$q"ZHdFJBhU#k:q!+MաVs4!v1Wu..?Gnw;/QUlF)K+xl6800 /r:,{O曯yA3G=0eш3SϏvWPTksCX_"'C!NL MC3^dcutJt[m*7gġϠwE|`n)]%.$i5ƛ<|5V)0< ÐjoRf"na<~666{a);;;z=&szz8^*uMv1Mx~Hũc $Z:kk\\\y-EaElχ}B \ Hĝ^Y>c}}Ǐ2ϰ ~g)%rggLܝ2 - |7<{fzw"O?:/i6t]lpoOoEd2!sD&޽իW//~#f,f8HDB$(8l]%أ$'OFyܺI|4Vk j&I"t]:$ HQy>i#%d9˫su$H04/CV?ba,U'8%E^t'B$ e$S%`iy>Y|qAE$LJ"ft)2QdJIf2X&FeR"~&ZlYT*B\^/y^,cϋ(0,6;a`4 j&=b)$I,ԙ<& R}cp3j&i7GQr6&ER:YZeQ` 32&L<0`kkgϞ쮈jۡDFC4 + sU7QuU7@r(1*F1L"ʄQB7ͩ6llll6y9]W*UKtˑL m;'?_BbgsZTF3TUZ_ pn^%'Z~r||_ Ede};c\w9YQw@$z]Z]gssS={X8EQǏi4tW:}jUn\RU$Yt7Oȋ6P_1 t"ax_;}h4mtGk(8=蔣S y Hוݻ 7[ł֟N(a3$ ]Ty&*$򘢌 tzf} Ӥ^k`Wәsl IDAT Ӡ? A8 ]9 8E9"00ufI4m0EjcZ6hp5Zf k6-Uwv|NPo4)JBQH< dl:Yqidyt> Bt,kvZS65aU0 d9Q\j++lo:T?U:+Ⱥhbkkܾu>ZNKV ˦p}c2cf!(ۊN1}dy뺜SYv8;%nݾ%e;<gsc2]f!k+{G{Y C^ySRT]P&s7r~~p0fpLNNNeG{1NH"(L EPQp%YZdadIHdE)T˲|5Md«W/Qu4ϛs~d@9E$ iP9 IJId F̽9PhM2 (Qy+˒() aB{j:fR%a=IxILf2SIX$8AD4-{,#/%j:q.Tx $ Y!FE0 FxOT,I(Yt+tWVTlG| C\wJfM!hB^gn_;EQq5|Gt],~˨?(]T*U|?`8t988l"i 3x1 N+5`2 y1Mxwl6q*Qs}էRqX[[端Z\śq%9q,F"2\e)i*<<QHES[RtELƘIݤK=/^inj1R^BZwﰲÇq]ԪUi X!_t0 s1/ms@oZ~%AP`&[$颳Rm47ZM0\f5h6ݻw44X[]SA]dꈼQcΈh{n72ݫ L}$['BqEL{Bն`]%qxG)N$X__nh7b\^\}SY2]_'S:6+ }NNNP͍Mn1y\]^/U'$ h0dtvYQ5]h"R&32#<{$䇲"aԫ27B )"C7, .uE 뫨\0<`g(iiUU,MFsJ9<KJ'3Hƺ$dD.0(VB뺐I)3iFsƣ!E-eٌ<ɗ#j|/Kχ@e>jtrί.&$eU(OٜzIұkl} JT@7,4;@tdr\jYEf3O) 9>yOLT2 sgqv4DkkXAޠhJ2q&̦m!bn7a8 da 4(iԛԶw9z˫k.$Mgsn&$VH*Au mEYJ8vh6ڂIt.0{ l5a`6eVT4-wZ "'Kl'{嗿! .?˿KKvvvi4Pʸ"XeAX0n(  Ҙ0tԅ!MS $D&f(K,)˜Z]1}(XY]nhTuTUznW!Oϛ1Ϲy*)%Zf K5$xPq58,ESfHHX6V7y 9K =677 {y, j4ŋzJaC`1-CeYKU2̘<|"&Zc a0&9aiweYAiUH Y鮮 Z!O z!aQ10@'3d6Ь eFW L)e!p^bOqzz*| :m2JZGA!.ίXnPUh6TA6XctWW-(˒{h6ٳll֥&#F#qxO C)PE-򀲐H0%)y"2nPX&i պCKk"Sױ i/$Csl&G"S9+*Z f3fXxc.K Fj\4ë́bX5mۨPOL&SqXhL)a;@SdlFQe++"fu]Ҕ*ꍅEYp4EdF"jqt6g]ydYF l:+{3 ( tS lI8/0T $D7 TM#Ns D 5V۰i{d-jGSUBc*dB䃱01a"FE5?Yo$ ~4q''V}ƣ^;P )2ZK/ G.[[nlK۱0 qC...QeYlohtȒ~?ԙL&S0\|H~7h5۬1 9??fN]go$կ2٨5ypͼb*>0hꬮu""pp拽h<w2bNhTJ("qHiyeތtg ? @,u#+ĸh}o]$d^\\0ϖԀ?L֝;f:rvqOL^۷4ZM~ӟrzz<}wGc޼yNGYNש-eQ asy~ʰñ+XJLUZm(ɲ $^_hwǨD@ʯo21kͲv[8귷MghnL&h&E. 4T,E.Q.%4Y5CX9|{o u]]s}}ɰl'BڿҨUy{"|󻯈./$Hz!vg{/ O "s:秧cW?_\^^Sd2z>j rT&lUs(6ijBQsFk$I-K,ʅCVhqxBUPUShkjn+ Sccc𚣣SfSfKM*U0N>Aprz%Jrr Bc6<űt !9޽˗*Ɉ4i5عE8(0**V .kk,K{,K\`h<[F]J0 `d:/x4h4Zj2لh㱫hIը789򊦒a#E)- y^"";TjU"? B$˗sf,Mt!ԛeiԫe&Jv>}Jh2c03IBb[9b&A ]au}ߟi ŀxL.jRV >D4,"$d'dIJئ"8"=|?u]?`0?ŅPelmmCBYnвI0J14a6TdD~,í}I/^՜2裏<$✫>iis{/_B8q5<ϓ4\"LRT5tCnUl1Y&;;{)F*#vw9>>FMOxh+8MGm < |TDSM4&FV{(.Č6)dvFaoe((KJL1y.B)i`B:(4K0X]]ϟ3͖luUUr1z?Rp~~DsRa{{{OUp-,\^^`*TݠQo`XIG)i^z}yS)  AI~O狑w ABsu͝mvvv0 ם1œ7 gbTql]T3OuE\nQX?'-oê8J@{s2Y^iS7i:vS:jcyAHМO}JoNl6c(= jb A`&* \fy1YYY4Mk?#2'I"laem(9{G?Z>'\^sv.xr-:0q,˲:nQo8m;]1Eƺ=&qrOF;vETݻwy%ݽ[DYc9Ed6;X%` ?{IF ߟ}VB [BeTK7=<) EujhS5Muga>n1Ot=4'Bfޜ /{PjWx愕5n߾t:->-Qs]6Vud#  g̃lJ^é4}Ac0c:ܻϽwzHDޡy]B_T-d6U\n#IQ/u&ׯ_3qg ADQ|>~0M\dc_^^rqqy躍$Irmwslzo.5nzbF,>5ic{kG-Jl&եLӴE|yQdqeۋ]ױ,_](DQDg2F1}GFm,{7JGl 1}oW/FUU:wܡŖ$1^:%NIt:g4M `8TdYNףs֛666sRrrt/Eq@u {VMљN\^^sqqm8U$9::w=& }ViK.үu2°0Aahqwܢ, F =<u5LQguh4qTlno77{n߾۷o1t>(RzUiF$).A1錍Pdί. MhwXZFaLY aj&̦S.Nl$O‹$c:Q9zJx(]#˄Qnؔi$1oF7Kz4b6wy 3QTӌwv f3dYOOmG|>)w෿-ȉCo>CUUpܛd}Ւn7Lx>.|)77/ ~m$vWSH̭[w~;[ܽu{ӤXTaDJ(Ǭ?9yU#Hj6V( Ҙ\ޟ3(L(4}w%1W{Z3uo4eefUwq]7oQ]nfo=d(1MUV\-qSE*Ja\3 L%IDAT Jf` Pچ!`k\]T5\ mI3[.!OʺmU5llsppj_sʲĶm^bWV8<<ӧSv9<<(D7V%i]+ u|pqqAeQ,r:GHQ}~|.4NؖnR*xGX*]?~L]8s1X0 M;ޝp||iZ;RRSԅLfnٳgvvvtW7aye F)a|v!aS{5{}|hAl6ӏX]55:[ᗙddYܟFiSk6MLB5T&4[uv739Ʉ/K+RnݺE-Q?,K١(Ç\D![kaVZM mĽXͦe}>zi+ Ӱ#ZU+ܿ6 c<cdI]oPL(< CeYFt\T^1%1IFOaۡ3F;֭[8N ? 9=='bZ.㐦9r\E;;;sfs8~_5WW=ԅ eccG(HT (i[lnn,H*2^ȵRxc ,Ǐ 2u,,?'䔫S4D7?Z鴿#>E-ZNS,ߋ29JY$IiWGO ~3.{h6{{tV:;]7ָwr}Q`d<ׯ^r~ߛEbI1ibn jfW}vXj:[;t׺NL\$NpjUҥijn4so޼^ |$%|kT'# "'[uHeJ&DaHvgy!| 9PeipKeu]\2TlV@S,ۅ$c5nEIئͭ"+ .+uZPW% 67謬.;0oJA3ލU$MlۢjbY&E {L lzZ/Y.^^|FLhŋyfi20 ;;;LgN/}$ ">b41 |tE^؊fwSVl6"qDА z^ӋS XzccEUp)l .\VbA>9Y.I89i")Rch*2%y}XUyN\\S*U')(-?z?\.,Z tC\*RUwNO77W<}UVu =9gbf\ J.(ik[̽ӗoDL@::¯deZM`(qsw˗pzB>szzP`«뺎"KhʒeM eE, z*I"B>@@ }0$%% E$L%D.IUAJ$%7%2,!sn/DTP|?G/Jʂ$wmbQĎH麾(9Ŋd;`8.c!\Fe%0ŞDIDY_]>1[62 b"/(J0SvQrԚ5Z@~+*ǚ!%`,dvyC !N8([C~}$V(t$I8:cwc^Ba6swKHET3L˗`oof\N +(rlmlFj|q{' g C0\^9c:{."S昅>#1BJFZFRdn=^zpgC.[GQe)DV"j"^d.lL:-,QLFplq34=AEBet]#X9X4M054MA|w-uSd`QR> !2YG썆áG=_e*z|8¶m$ * Yif( NO#l,>4 :F, $ k6>_ ~vOg8+.$@H03y*5{dyvvߣ\+SWƓ!"vN~O6壏}WWCd5BWE,6Q12iB)""] 'C"_*JjeGaY3E#mNnjfmR*Hi 3Sg1wDR#da<8<-#GȬ%#KhCQTr>¥P!AD"$&sfђ%a#"ۛLS,Z M_ԒD$h0\jEDXTx.Fmu%AC~ \U3XN/C0p@p0Qulf8}>y ?tb7ϿJ}\5|5*<}jbjqn6t"5QBTUFSEq,ф\>KVP!zsZ$ n,4[lJ8>>FK%]YZ|1[_w%I& Ո*JSV@(lQ(q!&U1_[_ZD)fk"cXR4kqwwy i{1 XxjM+|}'ȁj sn.bJBEđ1{R??Çt{zٲ^a g<׿5ϟ?T*O%@㰾)ͦuFbٙx9.˩T UQ3:wm1sLbYj:60xɪhFϟszz*HbEO [Ț27R& ^Nꊂ²quuę%ךiݻ6-G?˯̶f(bj 8FZh=H;;btviu- ϱR YQבO@:^.bf2ܼ9bHR"c?NV/m]&s 041ˤ3wI" Yڅ+<=Rs//! #S3A%%QK<cSEXD5TǷfheLݠklbLXu]^|I?d<!9^\nCKܿf cstf8N1BE C7TjrSoA:Ŷ+cQdkSyę AZlR6N- /V_p{s:aγh}~wzNRUX"-iL[Υy[ I,)VXݥh<Ŷf؎X֔8x%HH>c벽= ?',[E nR47ZN&ۛIS>3a yK<>itJ!/AHDaHZ!<Q0 tY&].JymP,ǔp>1j Ȓ5k( }_4 3!)#1Q""]!Bx+޶%n}u>56/?rL$~JLrjW_}1IѪ5EZ+ u \h۫;TL:ᐜ3nh6טN+?%Z:pra i2[~(IX3&֌Ãq\^ǽm\ץP(n5Z&v`JLfs˸ ۞A^^D# UT%']p{!t:,`6ɗ3"*?x R#؅Kbp__~5w\\'K^>![()kQ}*&apZ̜XKkU1N$Ʉno`ooЏMmz}^|GOxi=yPo_6c^S^xA7$aF ++2xC`sFcT`6ihd j`1 b# ~8Xpd%"Yh5Ym CGRDHHK(zD KtT|#Yw$mekXDk\.s|>3Y_+E=c8Yl6+50ޢZ#> 66VEIs+1Mqfm#I D;PVRy ^R@gaL c3|5y;rQs~yeYD{&,leh4X__Dzf\^Ri4T$H;=r2X"ixܦ#I irwu,BU§hDGNX,]X,^ϛW0Nj!p}ٟ>m y+O^7/uԝXW z@7 b)ƈ}w ѫ9*mӾL-$CZ!+ KAi ۚs|ǴZ-:^,w$aW@?j8 Z ƞMɦEizs]YQ舋ض-vKHLҒQ(Жiǿ?N8=PЄ3= "r-CQ"f )BY&d$UZ͒Vlf|ND@r9q(rF]?x4Z K_\ח = DQeRUPK$aDNSUS~.(膴f[E;TP!E"b涳BhnzKn"V_[ ak'+BQg0quuE T%]?9;{~S%!tnO,[īWx1\ħX .//9??GUDݒ^$LӤX _}e9B.o4㓷dY>я kSU׹`0CtD? , 0h4Ӣz<'(%|L}*3M,K$uØzV 8??~O^Ųo:w/ww73HҸ)jVhMeItL3bG4fF hli*2"nRi}c8 qu}ׯ_uz.-$RJ"fR "AewpHkshm-jS}Yn6J.WWWHĢ_4,iYVTIX8B5 "$1&2 RNT"KqBQ]V˲Z8V_#Zh5X!5TUnMI-oۮ LT$_(шj1C%/o"R+QVōqxxH'||q{{d2VqppDZ|fdYjb? V}MӨTEӹ-ztZ4h;X#f]&01 . ^T14q>y7haIENDB`./examples/ubuntu-ui-toolkit-gallery/ProgressBars.qml0000644000015600001650000000531412700370701023117 0ustar jenkinsjenkins/* * Copyright 2012 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Template { objectName: "progressBarsTemplate" TemplateSection { title: i18n.tr("Progress Bar") className: "ProgressBar" documentation: "qml-ubuntu-components-progressbar10.html" TemplateRow { title: i18n.tr("Standard") ProgressBar { id: progress objectName: "progressbar_standard" width: parent.width SequentialAnimation on value { loops: Animation.Infinite NumberAnimation { from: progress.minimumValue to: progress.maximumValue duration: 2000 } PauseAnimation {duration: 1000} } } } TemplateRow { title: i18n.tr("Infinite") ProgressBar { objectName: "progressbar_indeterminate" width: parent.width indeterminate: true } } TemplateRow { title: i18n.tr("No label") ProgressBar { id: progressNoLabel objectName: "progressbar_nolabel" width: parent.width showProgressPercentage: false SequentialAnimation on value { loops: Animation.Infinite NumberAnimation { from: progress.minimumValue to: progress.maximumValue duration: 2000 } PauseAnimation {duration: 1000} } } } } TemplateSection { title: i18n.tr("Activity Indicator") className: "ActivityIndicator" TemplateRow { title: i18n.tr("Standard") ActivityIndicator { objectName: "activityindicator_standard" anchors.leftMargin: units.gu(10) running: true } } } } ./examples/ubuntu-ui-toolkit-gallery/manifest.json.in0000644000015600001650000000104712700370701023075 0ustar jenkinsjenkins{ "architecture": "all", "description": "Component showcase gallery of the Ubuntu user interface toolkit (UITK)", "framework": "ubuntu-sdk-15.04.3", "hooks": { "ubuntu-ui-toolkit-gallery": { "apparmor": "ubuntu-ui-toolkit-gallery.apparmor", "desktop": "ubuntu-ui-toolkit-gallery.desktop" } }, "maintainer": "Zoltán Balogh ", "name": "com.ubuntu.developer.bzoltan.ubuntu-ui-toolkit-gallery", "title": "Ubuntu UI Toolkit Gallery", "version": "0.5" } ./examples/ubuntu-ui-toolkit-gallery/Toggles.qml0000644000015600001650000000436612700370701022115 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Template { objectName: "togglesTemplate" TemplateSection { title: "Checkbox" className: "CheckBox" TemplateRow { title: i18n.tr("Unchecked") CheckBox { objectName: "checkbox_unchecked" } } TemplateRow { title: i18n.tr("Checked") CheckBox { objectName: "checkbox_checked" checked: true } } TemplateRow { title: i18n.tr("Disabled") CheckBox { objectName: "checkbox_disabled_unchecked" enabled: false } CheckBox { objectName: "checkbox_disabled_checked" enabled: false checked: true } } } TemplateSection { title: "Switch" className: "Switch" TemplateRow { title: i18n.tr("Unchecked") Switch { objectName: "switch_unchecked" } } TemplateRow { title: i18n.tr("Checked") Switch { objectName: "switch_checked" checked: true } } TemplateRow { title: i18n.tr("Disabled") Switch { objectName: "switch_disabled_unchecked" enabled: false } Switch { objectName: "switch_disabled_checked" enabled: false checked: true } } } } ./examples/ubuntu-ui-toolkit-gallery/PageHeaders.qml0000644000015600001650000001165612700370701022661 0ustar jenkinsjenkins/* * Copyright (C) 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Template { id: page header: standardHeader TemplateSection { title: "Page Header" className: "PageHeader" Label { text: "Use the icons in the header." } } PageHeader { id: standardHeader visible: page.header === standardHeader title: "Default title" trailingActionBar.actions: [ Action { iconName: "search" text: "Search" onTriggered: page.header = searchHeader }, Action { iconName: "edit" text: "Edit" onTriggered: page.header = editHeader }, Action { iconName: standardHeader.extension === sections ? "media-playback-stop" : "filters" text: "Sections" onTriggered: { if (standardHeader.extension) { standardHeader.extension = null; } else { standardHeader.extension = sections; } } } ] Sections { id: sections visible: standardHeader.extension === sections anchors { left: parent.left right: parent.right bottom: parent.bottom } model: ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen"] } } PageHeader { id: searchHeader visible: page.header === searchHeader leadingActionBar.actions: [ Action { iconName: "back" text: "Back" onTriggered: page.header = standardHeader } ] contents: TextField { anchors { left: parent.left right: parent.right verticalCenter: parent.verticalCenter } placeholderText: "Search..." } } PageHeader { id: editHeader visible: page.header === editHeader property Component delegate: Component { // FIXME: Replace this delegate with the new // text button when it becomes available. // Also update example code in Toolbar.qml. AbstractButton { id: button action: modelData width: label.width + units.gu(4) height: parent.height Rectangle { color: UbuntuColors.slate opacity: 0.1 anchors.fill: parent visible: button.pressed } Label { anchors.centerIn: parent id: label text: action.text font.weight: text === "Confirm" ? Font.Normal : Font.Light } } } leadingActionBar { anchors.leftMargin: 0 actions: Action { text: "Cancel" iconName: "close" onTriggered: page.header = standardHeader } delegate: editHeader.delegate } trailingActionBar { anchors.rightMargin: 0 actions: Action { text: "Confirm" iconName: "tick" onTriggered: page.header = standardHeader } delegate: editHeader.delegate } extension: Toolbar { anchors { left: parent.left right: parent.right bottom: parent.bottom } trailingActionBar.actions: [ Action { iconName: "bookmark-new" }, Action { iconName: "add" }, Action { iconName: "edit-select-all" }, Action { iconName: "edit-copy" }, Action { iconName: "select" } ] leadingActionBar.actions: Action { iconName: "delete" text: "delete" onTriggered: print("Delete action triggered") } } } } ./examples/ubuntu-ui-toolkit-gallery/TemplateSection.qml0000644000015600001650000000317112700370701023602 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Column { id: templateSection spacing: units.gu(3) width: parent.width property string className property string title: className property string documentation: "qml-ubuntu-components-%1.html".arg(className.toLowerCase()) Item { anchors.left: parent.left anchors.right: parent.right height: childrenRect.height Label { id: label text: templateSection.title textSize: Label.Large anchors.left: parent.left } WebLink { id: docLink anchors.verticalCenter: label.verticalCenter anchors.right: parent.right property string prefix: "/usr/share/ubuntu-ui-toolkit/doc/html/" label: title ? "API Documentation" : "%1 API Documentation".arg(className) url: prefix + documentation visible: documentation != "" textSize: Label.Small } } } ./examples/ubuntu-ui-toolkit-gallery/po/0000755000015600001650000000000012700370701020403 5ustar jenkinsjenkins./examples/ubuntu-ui-toolkit-gallery/po/pl.po0000644000015600001650000002171712700370701021366 0ustar jenkinsjenkins# Polish translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-11-06 20:30+0000\n" "Last-Translator: Krzysztof Tataradziński \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "O programie..." #: ActionBars.qml:68 msgid "Short list" msgstr "Krótka lista" #: ActionBars.qml:79 msgid "Number of slots" msgstr "Liczba slotów" #: ActionBars.qml:92 msgid "Long list" msgstr "Długa lista" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "Wyłączone" #: Animations.qml:24 msgid "NumberAnimation" msgstr "NumberAnimation" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "Standardowo" #: Animations.qml:58 msgid "Standard Durations" msgstr "Standardowe czasy" #: Animations.qml:62 msgid "Snap" msgstr "" #: Animations.qml:98 msgid "Fast" msgstr "Szybko" #: Animations.qml:134 msgid "Slow" msgstr "Wolno" #: Animations.qml:159 msgid "Sleepy" msgstr "" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "Połączenie" #: Buttons.qml:37 msgid "Stroke" msgstr "" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "Kolor" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "Ikona" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "Ikona + Tekst" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "Zwinięte" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "Rozwinięte" #: Colors.qml:30 msgid "Orange" msgstr "Pomarańczowy" #: Colors.qml:36 msgid "Light grey" msgstr "Jasnoszary" #: Colors.qml:42 msgid "Dark grey" msgstr "Ciemnoszary" #: Colors.qml:48 msgid "Red" msgstr "Czerwony" #: Colors.qml:54 msgid "Green" msgstr "Zielony" #: Colors.qml:60 msgid "Blue" msgstr "Niebieski" #: Colors.qml:66 msgid "Purple" msgstr "Purpurowy" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "Otwórz" #: Icons.qml:29 msgid "Scaling" msgstr "Skalowanie" #: Icons.qml:79 msgid "Theme" msgstr "Motyw" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "Etykieta" #: ListItems.qml:33 msgid "Subtitled" msgstr "Podtytuł" #: ListItems.qml:37 msgid "Secondary label" msgstr "" #: ListItems.qml:52 msgid "ThinDivider" msgstr "" #: ListItems.qml:73 msgid "Progression" msgstr "Postęp" #: ListItems.qml:82 msgid "Single value" msgstr "Pojedyncza wartość" #: ListItems.qml:86 msgid "Value" msgstr "Wartość" #: ListItems.qml:91 msgid "Multi value" msgstr "" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "Wartość 1" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "Wartość 2" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "Wartość 3" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "Wartość 4" #: ListItems.qml:103 msgid "Item selector" msgstr "" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "Wybór wielokrotny" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "Wartość 5" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "Wartość 6" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "Wartość 7" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "Wartość 8" #: ListItems.qml:190 msgid "Control" msgstr "" #: ListItems.qml:202 msgid "Removable" msgstr "" #: ListItems.qml:205 msgid "Slide to remove" msgstr "Przesuń, aby usunąć" #: ListItems.qml:215 msgid "Reset" msgstr "" #: ListItems.qml:226 msgid "Grouped list" msgstr "" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "" #: ListItems.qml:364 msgid "Expandable" msgstr "" #: NewListItems.qml:39 msgid "Colored" msgstr "" #: NewListItems.qml:42 msgid "Highlight color" msgstr "" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "" #: NewListItems.qml:114 msgid "Move" msgstr "" #: NewListItems.qml:163 msgid "Basic" msgstr "" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "" #: NewListItems.qml:163 msgid "Immutable" msgstr "" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "" #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "" #: Pickers.qml:31 msgid "Linear" msgstr "" #: Pickers.qml:63 msgid "Circular" msgstr "" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "" #: Pickers.qml:137 msgid "Clock" msgstr "" #: Pickers.qml:174 msgid "Overlay" msgstr "" #: Popover.qml:38 msgid "Flickable" msgstr "" #: Popover.qml:74 msgid "Action #1" msgstr "Działanie #1" #: Popover.qml:78 msgid "Action #2" msgstr "Działanie #2" #: Popover.qml:82 msgid "Action #3" msgstr "Działanie #3" #: Popover.qml:86 msgid "Action #4" msgstr "Działanie #4" #: Popover.qml:90 msgid "Action #5" msgstr "Działanie #5" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "Pasek postępu" #: ProgressBars.qml:59 msgid "No label" msgstr "Bez etykiety" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "Rozmiary" #: Sections.qml:34 msgid "Enabled" msgstr "" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "Tytuł" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "" #: Sliders.qml:42 msgid "Live Update" msgstr "" #: Sliders.qml:57 msgid "Range" msgstr "" #: Sliders.qml:74 msgid "Labels" msgstr "" #: Sliders.qml:85 msgid "Small" msgstr "" #: Sliders.qml:87 msgid "Medium" msgstr "" #: Sliders.qml:89 msgid "Large" msgstr "" #: TextInputs.qml:50 msgid "Type me in..." msgstr "" #: TextInputs.qml:56 msgid "Password" msgstr "Hasło" #: TextInputs.qml:67 msgid "Numbers" msgstr "" #: TextInputs.qml:78 msgid "Read-only" msgstr "Tylko do odczytu" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "" #: TextInputs.qml:107 msgid "Default" msgstr "" #: TextInputs.qml:129 msgid "Rich Text" msgstr "" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "Odznaczone" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "Zaznaczone" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "" #: UbuntuShape.qml:73 msgid "Radius" msgstr "Promień" #: UbuntuShape.qml:115 msgid "Image" msgstr "Obraz" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "" ./examples/ubuntu-ui-toolkit-gallery/po/gl.po0000644000015600001650000002362612700370701021356 0ustar jenkinsjenkins# Galician translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-07-21 18:33+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "Sobre..." #: ActionBars.qml:68 msgid "Short list" msgstr "Lista curta" #: ActionBars.qml:79 msgid "Number of slots" msgstr "Número de slots" #: ActionBars.qml:92 msgid "Long list" msgstr "Lista longa" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "Desactivado" #: Animations.qml:24 msgid "NumberAnimation" msgstr "NúmeroAnimación" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "Estándar" #: Animations.qml:58 msgid "Standard Durations" msgstr "Duracións estándar" #: Animations.qml:62 msgid "Snap" msgstr "Aliñar" #: Animations.qml:98 msgid "Fast" msgstr "Rápido" #: Animations.qml:134 msgid "Slow" msgstr "Lento" #: Animations.qml:159 msgid "Sleepy" msgstr "Adurmiñado" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "Chamar" #: Buttons.qml:37 msgid "Stroke" msgstr "Trazo" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "Cor" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "Chamar %1" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "Icona" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "Icona + texto" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "Recollido" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "Expandido" #: Colors.qml:30 msgid "Orange" msgstr "Laranxa" #: Colors.qml:36 msgid "Light grey" msgstr "Gris claro" #: Colors.qml:42 msgid "Dark grey" msgstr "Gris escuro" #: Colors.qml:48 msgid "Red" msgstr "Vermello" #: Colors.qml:54 msgid "Green" msgstr "Verde" #: Colors.qml:60 msgid "Blue" msgstr "Azul" #: Colors.qml:66 msgid "Purple" msgstr "Púrpura" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "Abrir" #: Icons.qml:29 msgid "Scaling" msgstr "Escalar" #: Icons.qml:79 msgid "Theme" msgstr "Tema" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "Accións ao comezo e ao final" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "Etiqueta" #: ListItems.qml:33 msgid "Subtitled" msgstr "Subtitulado" #: ListItems.qml:37 msgid "Secondary label" msgstr "Etiqueta secundaria" #: ListItems.qml:52 msgid "ThinDivider" msgstr "DivisorFino" #: ListItems.qml:73 msgid "Progression" msgstr "Progresión" #: ListItems.qml:82 msgid "Single value" msgstr "Valor único" #: ListItems.qml:86 msgid "Value" msgstr "Valor" #: ListItems.qml:91 msgid "Multi value" msgstr "Valor múltiple" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "Valor 1" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "Valor 2" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "Valor 3" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "Valor 4" #: ListItems.qml:103 msgid "Item selector" msgstr "Seleccionador de elementos" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "Ampliación" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "Selección múltiple" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "Modelo personalizado" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "Valor 5" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "Valor 6" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "Valor 7" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "Valor 8" #: ListItems.qml:190 msgid "Control" msgstr "Control" #: ListItems.qml:202 msgid "Removable" msgstr "Extraíbel" #: ListItems.qml:205 msgid "Slide to remove" msgstr "Esvarar para eliminar" #: ListItems.qml:215 msgid "Reset" msgstr "Restabelecer" #: ListItems.qml:226 msgid "Grouped list" msgstr "Lista agrupada" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "VistaListaUbuntu" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "ColumnaExpandíbel" #: ListItems.qml:364 msgid "Expandable" msgstr "Expandíbel" #: NewListItems.qml:39 msgid "Colored" msgstr "Con cor" #: NewListItems.qml:42 msgid "Highlight color" msgstr "Cor de resalte" #: NewListItems.qml:71 msgid "Leading actions" msgstr "Accións ao comezo" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "Accións ao final" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "Delegados de accións personalizados" #: NewListItems.qml:111 msgid "Edit" msgstr "Editar" #: NewListItems.qml:114 msgid "Move" msgstr "Mover" #: NewListItems.qml:163 msgid "Basic" msgstr "Básico" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "Divisor das cores" #: NewListItems.qml:163 msgid "Immutable" msgstr "Inmutábel" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "Sen divisor" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "Seleccionador de opcións" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "Este é o segundo valor" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "Houbo unha vez unha historia secreta." #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "Altura do contedor personalizado" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "Non hai unha selección inicial, desprazábel." #: Pickers.qml:31 msgid "Linear" msgstr "Lineal" #: Pickers.qml:63 msgid "Circular" msgstr "Circular" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "Infinito" #: Pickers.qml:137 msgid "Clock" msgstr "Reloxo" #: Pickers.qml:174 msgid "Overlay" msgstr "Sobreposición" #: Popover.qml:38 msgid "Flickable" msgstr "Esvarábel" #: Popover.qml:74 msgid "Action #1" msgstr "Acción #1" #: Popover.qml:78 msgid "Action #2" msgstr "Acción #2" #: Popover.qml:82 msgid "Action #3" msgstr "Acción #3" #: Popover.qml:86 msgid "Action #4" msgstr "Acción #4" #: Popover.qml:90 msgid "Action #5" msgstr "Acción #5" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "Barra de progreso" #: ProgressBars.qml:59 msgid "No label" msgstr "Sen etiqueta" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "Indicador de actividade" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "Tamaños" #: Sections.qml:34 msgid "Enabled" msgstr "Activado" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "O estilo visual da folla é un traballo previo e sen pulir." #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "Título" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "Valor real: %1" #: Sliders.qml:42 msgid "Live Update" msgstr "Actualización instantánea" #: Sliders.qml:57 msgid "Range" msgstr "Rango" #: Sliders.qml:74 msgid "Labels" msgstr "Etiquetas" #: Sliders.qml:85 msgid "Small" msgstr "Pequeno" #: Sliders.qml:87 msgid "Medium" msgstr "Medio" #: Sliders.qml:89 msgid "Large" msgstr "Grande" #: TextInputs.qml:50 msgid "Type me in..." msgstr "Escríbame en..." #: TextInputs.qml:56 msgid "Password" msgstr "Contrasinal" #: TextInputs.qml:67 msgid "Numbers" msgstr "Números" #: TextInputs.qml:78 msgid "Read-only" msgstr "Só lectura" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "Ninguén escribe aquí" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "Non se permite a interacción" #: TextInputs.qml:107 msgid "Default" msgstr "Predeterminado" #: TextInputs.qml:129 msgid "Rich Text" msgstr "Texto enriquecido" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "Non seleccionada" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "Seleccionada" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "Aspecto" #: UbuntuShape.qml:73 msgid "Radius" msgstr "Raio" #: UbuntuShape.qml:115 msgid "Image" msgstr "Imaxe" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "Degradado" ./examples/ubuntu-ui-toolkit-gallery/po/nl.po0000644000015600001650000002101412700370701021352 0ustar jenkinsjenkins# Dutch translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-07-10 15:38+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "" #: ActionBars.qml:68 msgid "Short list" msgstr "" #: ActionBars.qml:79 msgid "Number of slots" msgstr "" #: ActionBars.qml:92 msgid "Long list" msgstr "" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "" #: Animations.qml:24 msgid "NumberAnimation" msgstr "NummerAnimatie" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "" #: Animations.qml:58 msgid "Standard Durations" msgstr "Standaard duur" #: Animations.qml:62 msgid "Snap" msgstr "" #: Animations.qml:98 msgid "Fast" msgstr "Snel" #: Animations.qml:134 msgid "Slow" msgstr "Langzaam" #: Animations.qml:159 msgid "Sleepy" msgstr "Slaap" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "" #: Buttons.qml:37 msgid "Stroke" msgstr "Streep" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "Kleur" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "Pictogram" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "Pictogram+Tekst" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "Ingeklapt" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "Uitgeklapt" #: Colors.qml:30 msgid "Orange" msgstr "Oranje" #: Colors.qml:36 msgid "Light grey" msgstr "Lichtgrijs" #: Colors.qml:42 msgid "Dark grey" msgstr "Donkergrijs" #: Colors.qml:48 msgid "Red" msgstr "Rood" #: Colors.qml:54 msgid "Green" msgstr "Groen" #: Colors.qml:60 msgid "Blue" msgstr "Blauw" #: Colors.qml:66 msgid "Purple" msgstr "Paars" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "Openen" #: Icons.qml:29 msgid "Scaling" msgstr "Schalen" #: Icons.qml:79 msgid "Theme" msgstr "Thema" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "" #: ListItems.qml:33 msgid "Subtitled" msgstr "" #: ListItems.qml:37 msgid "Secondary label" msgstr "" #: ListItems.qml:52 msgid "ThinDivider" msgstr "" #: ListItems.qml:73 msgid "Progression" msgstr "" #: ListItems.qml:82 msgid "Single value" msgstr "" #: ListItems.qml:86 msgid "Value" msgstr "" #: ListItems.qml:91 msgid "Multi value" msgstr "" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "" #: ListItems.qml:103 msgid "Item selector" msgstr "" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "" #: ListItems.qml:190 msgid "Control" msgstr "" #: ListItems.qml:202 msgid "Removable" msgstr "" #: ListItems.qml:205 msgid "Slide to remove" msgstr "" #: ListItems.qml:215 msgid "Reset" msgstr "" #: ListItems.qml:226 msgid "Grouped list" msgstr "" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "" #: ListItems.qml:364 msgid "Expandable" msgstr "" #: NewListItems.qml:39 msgid "Colored" msgstr "" #: NewListItems.qml:42 msgid "Highlight color" msgstr "" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "" #: NewListItems.qml:114 msgid "Move" msgstr "" #: NewListItems.qml:163 msgid "Basic" msgstr "" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "" #: NewListItems.qml:163 msgid "Immutable" msgstr "" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "" #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "" #: Pickers.qml:31 msgid "Linear" msgstr "" #: Pickers.qml:63 msgid "Circular" msgstr "" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "" #: Pickers.qml:137 msgid "Clock" msgstr "" #: Pickers.qml:174 msgid "Overlay" msgstr "" #: Popover.qml:38 msgid "Flickable" msgstr "" #: Popover.qml:74 msgid "Action #1" msgstr "" #: Popover.qml:78 msgid "Action #2" msgstr "" #: Popover.qml:82 msgid "Action #3" msgstr "" #: Popover.qml:86 msgid "Action #4" msgstr "" #: Popover.qml:90 msgid "Action #5" msgstr "" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "" #: ProgressBars.qml:59 msgid "No label" msgstr "" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "" #: Sections.qml:34 msgid "Enabled" msgstr "" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "" #: Sliders.qml:42 msgid "Live Update" msgstr "" #: Sliders.qml:57 msgid "Range" msgstr "" #: Sliders.qml:74 msgid "Labels" msgstr "" #: Sliders.qml:85 msgid "Small" msgstr "" #: Sliders.qml:87 msgid "Medium" msgstr "" #: Sliders.qml:89 msgid "Large" msgstr "" #: TextInputs.qml:50 msgid "Type me in..." msgstr "" #: TextInputs.qml:56 msgid "Password" msgstr "" #: TextInputs.qml:67 msgid "Numbers" msgstr "" #: TextInputs.qml:78 msgid "Read-only" msgstr "" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "" #: TextInputs.qml:107 msgid "Default" msgstr "" #: TextInputs.qml:129 msgid "Rich Text" msgstr "" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "" #: UbuntuShape.qml:73 msgid "Radius" msgstr "" #: UbuntuShape.qml:115 msgid "Image" msgstr "" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "" ./examples/ubuntu-ui-toolkit-gallery/po/ia.po0000644000015600001650000002056512700370701021344 0ustar jenkinsjenkins# Interlingua translation for ubuntu-ui-toolkit # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2016-03-20 20:30+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Interlingua \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-21 05:59+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "" #: ActionBars.qml:68 msgid "Short list" msgstr "" #: ActionBars.qml:79 msgid "Number of slots" msgstr "" #: ActionBars.qml:92 msgid "Long list" msgstr "" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "" #: Animations.qml:24 msgid "NumberAnimation" msgstr "" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "" #: Animations.qml:58 msgid "Standard Durations" msgstr "" #: Animations.qml:62 msgid "Snap" msgstr "" #: Animations.qml:98 msgid "Fast" msgstr "" #: Animations.qml:134 msgid "Slow" msgstr "" #: Animations.qml:159 msgid "Sleepy" msgstr "" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "" #: Buttons.qml:37 msgid "Stroke" msgstr "" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "" #: Colors.qml:30 msgid "Orange" msgstr "" #: Colors.qml:36 msgid "Light grey" msgstr "" #: Colors.qml:42 msgid "Dark grey" msgstr "" #: Colors.qml:48 msgid "Red" msgstr "" #: Colors.qml:54 msgid "Green" msgstr "" #: Colors.qml:60 msgid "Blue" msgstr "" #: Colors.qml:66 msgid "Purple" msgstr "" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "" #: Icons.qml:29 msgid "Scaling" msgstr "" #: Icons.qml:79 msgid "Theme" msgstr "" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "" #: ListItems.qml:33 msgid "Subtitled" msgstr "" #: ListItems.qml:37 msgid "Secondary label" msgstr "" #: ListItems.qml:52 msgid "ThinDivider" msgstr "" #: ListItems.qml:73 msgid "Progression" msgstr "" #: ListItems.qml:82 msgid "Single value" msgstr "" #: ListItems.qml:86 msgid "Value" msgstr "" #: ListItems.qml:91 msgid "Multi value" msgstr "" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "" #: ListItems.qml:103 msgid "Item selector" msgstr "" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "" #: ListItems.qml:190 msgid "Control" msgstr "" #: ListItems.qml:202 msgid "Removable" msgstr "" #: ListItems.qml:205 msgid "Slide to remove" msgstr "" #: ListItems.qml:215 msgid "Reset" msgstr "" #: ListItems.qml:226 msgid "Grouped list" msgstr "" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "" #: ListItems.qml:364 msgid "Expandable" msgstr "" #: NewListItems.qml:39 msgid "Colored" msgstr "" #: NewListItems.qml:42 msgid "Highlight color" msgstr "" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "" #: NewListItems.qml:114 msgid "Move" msgstr "" #: NewListItems.qml:163 msgid "Basic" msgstr "" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "" #: NewListItems.qml:163 msgid "Immutable" msgstr "" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "" #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "" #: Pickers.qml:31 msgid "Linear" msgstr "" #: Pickers.qml:63 msgid "Circular" msgstr "" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "" #: Pickers.qml:137 msgid "Clock" msgstr "" #: Pickers.qml:174 msgid "Overlay" msgstr "" #: Popover.qml:38 msgid "Flickable" msgstr "" #: Popover.qml:74 msgid "Action #1" msgstr "" #: Popover.qml:78 msgid "Action #2" msgstr "" #: Popover.qml:82 msgid "Action #3" msgstr "" #: Popover.qml:86 msgid "Action #4" msgstr "" #: Popover.qml:90 msgid "Action #5" msgstr "" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "" #: ProgressBars.qml:59 msgid "No label" msgstr "" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "" #: Sections.qml:34 msgid "Enabled" msgstr "" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "" #: Sliders.qml:42 msgid "Live Update" msgstr "" #: Sliders.qml:57 msgid "Range" msgstr "" #: Sliders.qml:74 msgid "Labels" msgstr "" #: Sliders.qml:85 msgid "Small" msgstr "" #: Sliders.qml:87 msgid "Medium" msgstr "" #: Sliders.qml:89 msgid "Large" msgstr "" #: TextInputs.qml:50 msgid "Type me in..." msgstr "" #: TextInputs.qml:56 msgid "Password" msgstr "" #: TextInputs.qml:67 msgid "Numbers" msgstr "" #: TextInputs.qml:78 msgid "Read-only" msgstr "" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "" #: TextInputs.qml:107 msgid "Default" msgstr "" #: TextInputs.qml:129 msgid "Rich Text" msgstr "" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "" #: UbuntuShape.qml:73 msgid "Radius" msgstr "" #: UbuntuShape.qml:115 msgid "Image" msgstr "" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "" ./examples/ubuntu-ui-toolkit-gallery/po/pt.po0000644000015600001650000002244212700370701021372 0ustar jenkinsjenkins# Portuguese translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2016-01-01 18:51+0000\n" "Last-Translator: Ivo Xavier \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "Acerca de..." #: ActionBars.qml:68 msgid "Short list" msgstr "" #: ActionBars.qml:79 msgid "Number of slots" msgstr "" #: ActionBars.qml:92 msgid "Long list" msgstr "" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "Desativado" #: Animations.qml:24 msgid "NumberAnimation" msgstr "NumberAnimation" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "Omissão" #: Animations.qml:58 msgid "Standard Durations" msgstr "Duração padrão" #: Animations.qml:62 msgid "Snap" msgstr "Snap" #: Animations.qml:98 msgid "Fast" msgstr "Rápida" #: Animations.qml:134 msgid "Slow" msgstr "Lenta" #: Animations.qml:159 msgid "Sleepy" msgstr "Sonolenta" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "Chamada" #: Buttons.qml:37 msgid "Stroke" msgstr "Traço" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "Cor" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "Ícone" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "Ícone+Texto" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "Colapsado" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "Expandido" #: Colors.qml:30 msgid "Orange" msgstr "Laranja" #: Colors.qml:36 msgid "Light grey" msgstr "Cinzento claro" #: Colors.qml:42 msgid "Dark grey" msgstr "Cinzento escuro" #: Colors.qml:48 msgid "Red" msgstr "Vermelho" #: Colors.qml:54 msgid "Green" msgstr "Verde" #: Colors.qml:60 msgid "Blue" msgstr "Azul" #: Colors.qml:66 msgid "Purple" msgstr "Roxo" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "Abrir" #: Icons.qml:29 msgid "Scaling" msgstr "A dimensionar" #: Icons.qml:79 msgid "Theme" msgstr "Tema" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "Etiqueta" #: ListItems.qml:33 msgid "Subtitled" msgstr "Legendado" #: ListItems.qml:37 msgid "Secondary label" msgstr "Etiqueta secundária" #: ListItems.qml:52 msgid "ThinDivider" msgstr "ThinDivider" #: ListItems.qml:73 msgid "Progression" msgstr "Progressão" #: ListItems.qml:82 msgid "Single value" msgstr "Valor único" #: ListItems.qml:86 msgid "Value" msgstr "Valor" #: ListItems.qml:91 msgid "Multi value" msgstr "Valor múltiplo" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "Valor 1" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "Valor 2" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "Valor 3" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "Valor 4" #: ListItems.qml:103 msgid "Item selector" msgstr "Selecionador de item" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "A expandir" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "Seleção múltipla" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "Modelo costumizado" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "Valor 5" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "Valor 6" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "Valor 7" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "Valor 8" #: ListItems.qml:190 msgid "Control" msgstr "Controlo" #: ListItems.qml:202 msgid "Removable" msgstr "Removível" #: ListItems.qml:205 msgid "Slide to remove" msgstr "Deslize para remover" #: ListItems.qml:215 msgid "Reset" msgstr "Repor" #: ListItems.qml:226 msgid "Grouped list" msgstr "Lista agrupada" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "UbuntuListView" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "ExpandablesColumn" #: ListItems.qml:364 msgid "Expandable" msgstr "Expansível" #: NewListItems.qml:39 msgid "Colored" msgstr "" #: NewListItems.qml:42 msgid "Highlight color" msgstr "" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "Editar" #: NewListItems.qml:114 msgid "Move" msgstr "Mover" #: NewListItems.qml:163 msgid "Basic" msgstr "Básica" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "Divisor colorido" #: NewListItems.qml:163 msgid "Immutable" msgstr "" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "Opção selector" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "" #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "" #: Pickers.qml:31 msgid "Linear" msgstr "Linear" #: Pickers.qml:63 msgid "Circular" msgstr "Circular" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "Infinita" #: Pickers.qml:137 msgid "Clock" msgstr "Relógio" #: Pickers.qml:174 msgid "Overlay" msgstr "Sobreposição" #: Popover.qml:38 msgid "Flickable" msgstr "Flickable" #: Popover.qml:74 msgid "Action #1" msgstr "Ação #1" #: Popover.qml:78 msgid "Action #2" msgstr "Ação #2" #: Popover.qml:82 msgid "Action #3" msgstr "Ação #3" #: Popover.qml:86 msgid "Action #4" msgstr "Ação #4" #: Popover.qml:90 msgid "Action #5" msgstr "Ação #5" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "Barra de progresso" #: ProgressBars.qml:59 msgid "No label" msgstr "Sem etiqueta" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "Indicador de atividade" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "Tamanhos" #: Sections.qml:34 msgid "Enabled" msgstr "" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "Título" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "Valor atual: %1" #: Sliders.qml:42 msgid "Live Update" msgstr "Atualização ao vivo" #: Sliders.qml:57 msgid "Range" msgstr "Intervalo" #: Sliders.qml:74 msgid "Labels" msgstr "" #: Sliders.qml:85 msgid "Small" msgstr "" #: Sliders.qml:87 msgid "Medium" msgstr "" #: Sliders.qml:89 msgid "Large" msgstr "" #: TextInputs.qml:50 msgid "Type me in..." msgstr "Escreva-me..." #: TextInputs.qml:56 msgid "Password" msgstr "Palavra-passe" #: TextInputs.qml:67 msgid "Numbers" msgstr "Números" #: TextInputs.qml:78 msgid "Read-only" msgstr "Só de leitura" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "Ninguém escreve aqui" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "Sem interação permitida" #: TextInputs.qml:107 msgid "Default" msgstr "Omissão" #: TextInputs.qml:129 msgid "Rich Text" msgstr "Rich Text" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "Desmarcado" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "Marcado" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "" #: UbuntuShape.qml:73 msgid "Radius" msgstr "Radius" #: UbuntuShape.qml:115 msgid "Image" msgstr "Imagem" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "" ./examples/ubuntu-ui-toolkit-gallery/po/pt_BR.po0000644000015600001650000002061212700370701021752 0ustar jenkinsjenkins# Brazilian Portuguese translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-07-14 17:02+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "" #: ActionBars.qml:68 msgid "Short list" msgstr "" #: ActionBars.qml:79 msgid "Number of slots" msgstr "" #: ActionBars.qml:92 msgid "Long list" msgstr "" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "" #: Animations.qml:24 msgid "NumberAnimation" msgstr "" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "" #: Animations.qml:58 msgid "Standard Durations" msgstr "" #: Animations.qml:62 msgid "Snap" msgstr "" #: Animations.qml:98 msgid "Fast" msgstr "" #: Animations.qml:134 msgid "Slow" msgstr "" #: Animations.qml:159 msgid "Sleepy" msgstr "" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "" #: Buttons.qml:37 msgid "Stroke" msgstr "" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "" #: Colors.qml:30 msgid "Orange" msgstr "" #: Colors.qml:36 msgid "Light grey" msgstr "" #: Colors.qml:42 msgid "Dark grey" msgstr "" #: Colors.qml:48 msgid "Red" msgstr "" #: Colors.qml:54 msgid "Green" msgstr "" #: Colors.qml:60 msgid "Blue" msgstr "" #: Colors.qml:66 msgid "Purple" msgstr "" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "" #: Icons.qml:29 msgid "Scaling" msgstr "" #: Icons.qml:79 msgid "Theme" msgstr "" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "" #: ListItems.qml:33 msgid "Subtitled" msgstr "" #: ListItems.qml:37 msgid "Secondary label" msgstr "" #: ListItems.qml:52 msgid "ThinDivider" msgstr "" #: ListItems.qml:73 msgid "Progression" msgstr "" #: ListItems.qml:82 msgid "Single value" msgstr "" #: ListItems.qml:86 msgid "Value" msgstr "" #: ListItems.qml:91 msgid "Multi value" msgstr "" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "" #: ListItems.qml:103 msgid "Item selector" msgstr "" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "" #: ListItems.qml:190 msgid "Control" msgstr "" #: ListItems.qml:202 msgid "Removable" msgstr "" #: ListItems.qml:205 msgid "Slide to remove" msgstr "" #: ListItems.qml:215 msgid "Reset" msgstr "" #: ListItems.qml:226 msgid "Grouped list" msgstr "" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "" #: ListItems.qml:364 msgid "Expandable" msgstr "" #: NewListItems.qml:39 msgid "Colored" msgstr "" #: NewListItems.qml:42 msgid "Highlight color" msgstr "" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "" #: NewListItems.qml:114 msgid "Move" msgstr "" #: NewListItems.qml:163 msgid "Basic" msgstr "" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "" #: NewListItems.qml:163 msgid "Immutable" msgstr "" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "" #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "" #: Pickers.qml:31 msgid "Linear" msgstr "" #: Pickers.qml:63 msgid "Circular" msgstr "" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "" #: Pickers.qml:137 msgid "Clock" msgstr "" #: Pickers.qml:174 msgid "Overlay" msgstr "" #: Popover.qml:38 msgid "Flickable" msgstr "" #: Popover.qml:74 msgid "Action #1" msgstr "" #: Popover.qml:78 msgid "Action #2" msgstr "" #: Popover.qml:82 msgid "Action #3" msgstr "" #: Popover.qml:86 msgid "Action #4" msgstr "" #: Popover.qml:90 msgid "Action #5" msgstr "" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "" #: ProgressBars.qml:59 msgid "No label" msgstr "" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "" #: Sections.qml:34 msgid "Enabled" msgstr "" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "" #: Sliders.qml:42 msgid "Live Update" msgstr "" #: Sliders.qml:57 msgid "Range" msgstr "" #: Sliders.qml:74 msgid "Labels" msgstr "" #: Sliders.qml:85 msgid "Small" msgstr "" #: Sliders.qml:87 msgid "Medium" msgstr "" #: Sliders.qml:89 msgid "Large" msgstr "" #: TextInputs.qml:50 msgid "Type me in..." msgstr "" #: TextInputs.qml:56 msgid "Password" msgstr "" #: TextInputs.qml:67 msgid "Numbers" msgstr "" #: TextInputs.qml:78 msgid "Read-only" msgstr "" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "" #: TextInputs.qml:107 msgid "Default" msgstr "" #: TextInputs.qml:129 msgid "Rich Text" msgstr "" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "" #: UbuntuShape.qml:73 msgid "Radius" msgstr "" #: UbuntuShape.qml:115 msgid "Image" msgstr "" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "" ./examples/ubuntu-ui-toolkit-gallery/po/ar.po0000644000015600001650000002110112700370701021340 0ustar jenkinsjenkins# Arabic translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-11-13 14:25+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "" #: ActionBars.qml:68 msgid "Short list" msgstr "" #: ActionBars.qml:79 msgid "Number of slots" msgstr "" #: ActionBars.qml:92 msgid "Long list" msgstr "" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "معطل" #: Animations.qml:24 msgid "NumberAnimation" msgstr "" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "قياسي" #: Animations.qml:58 msgid "Standard Durations" msgstr "الفترات القياسية" #: Animations.qml:62 msgid "Snap" msgstr "" #: Animations.qml:98 msgid "Fast" msgstr "سريع" #: Animations.qml:134 msgid "Slow" msgstr "بطيء" #: Animations.qml:159 msgid "Sleepy" msgstr "" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "" #: Buttons.qml:37 msgid "Stroke" msgstr "" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "أيقونة" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "أيقونة + نص" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "" #: Colors.qml:30 msgid "Orange" msgstr "برتقالي" #: Colors.qml:36 msgid "Light grey" msgstr "رمادي فاتح" #: Colors.qml:42 msgid "Dark grey" msgstr "رمادي غامق" #: Colors.qml:48 msgid "Red" msgstr "أحمر" #: Colors.qml:54 msgid "Green" msgstr "أخضر" #: Colors.qml:60 msgid "Blue" msgstr "أزرق" #: Colors.qml:66 msgid "Purple" msgstr "بنفسجي" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "فتح" #: Icons.qml:29 msgid "Scaling" msgstr "تحجيم" #: Icons.qml:79 msgid "Theme" msgstr "" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "التسمية" #: ListItems.qml:33 msgid "Subtitled" msgstr "" #: ListItems.qml:37 msgid "Secondary label" msgstr "" #: ListItems.qml:52 msgid "ThinDivider" msgstr "" #: ListItems.qml:73 msgid "Progression" msgstr "" #: ListItems.qml:82 msgid "Single value" msgstr "" #: ListItems.qml:86 msgid "Value" msgstr "" #: ListItems.qml:91 msgid "Multi value" msgstr "" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "" #: ListItems.qml:103 msgid "Item selector" msgstr "" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "" #: ListItems.qml:190 msgid "Control" msgstr "" #: ListItems.qml:202 msgid "Removable" msgstr "" #: ListItems.qml:205 msgid "Slide to remove" msgstr "" #: ListItems.qml:215 msgid "Reset" msgstr "" #: ListItems.qml:226 msgid "Grouped list" msgstr "" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "" #: ListItems.qml:364 msgid "Expandable" msgstr "" #: NewListItems.qml:39 msgid "Colored" msgstr "" #: NewListItems.qml:42 msgid "Highlight color" msgstr "" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "" #: NewListItems.qml:114 msgid "Move" msgstr "" #: NewListItems.qml:163 msgid "Basic" msgstr "" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "" #: NewListItems.qml:163 msgid "Immutable" msgstr "" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "" #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "" #: Pickers.qml:31 msgid "Linear" msgstr "" #: Pickers.qml:63 msgid "Circular" msgstr "" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "" #: Pickers.qml:137 msgid "Clock" msgstr "" #: Pickers.qml:174 msgid "Overlay" msgstr "" #: Popover.qml:38 msgid "Flickable" msgstr "" #: Popover.qml:74 msgid "Action #1" msgstr "" #: Popover.qml:78 msgid "Action #2" msgstr "" #: Popover.qml:82 msgid "Action #3" msgstr "" #: Popover.qml:86 msgid "Action #4" msgstr "" #: Popover.qml:90 msgid "Action #5" msgstr "" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "" #: ProgressBars.qml:59 msgid "No label" msgstr "" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "" #: Sections.qml:34 msgid "Enabled" msgstr "" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "" #: Sliders.qml:42 msgid "Live Update" msgstr "" #: Sliders.qml:57 msgid "Range" msgstr "" #: Sliders.qml:74 msgid "Labels" msgstr "" #: Sliders.qml:85 msgid "Small" msgstr "" #: Sliders.qml:87 msgid "Medium" msgstr "" #: Sliders.qml:89 msgid "Large" msgstr "" #: TextInputs.qml:50 msgid "Type me in..." msgstr "" #: TextInputs.qml:56 msgid "Password" msgstr "" #: TextInputs.qml:67 msgid "Numbers" msgstr "" #: TextInputs.qml:78 msgid "Read-only" msgstr "" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "" #: TextInputs.qml:107 msgid "Default" msgstr "" #: TextInputs.qml:129 msgid "Rich Text" msgstr "" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "" #: UbuntuShape.qml:73 msgid "Radius" msgstr "" #: UbuntuShape.qml:115 msgid "Image" msgstr "" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "" ./examples/ubuntu-ui-toolkit-gallery/po/hu.po0000644000015600001650000002240712700370701021364 0ustar jenkinsjenkins# Hungarian translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-02-09 08:21+0000\n" "Last-Translator: Richard Somlói \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "" #: ActionBars.qml:68 msgid "Short list" msgstr "" #: ActionBars.qml:79 msgid "Number of slots" msgstr "" #: ActionBars.qml:92 msgid "Long list" msgstr "" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "Letiltott" #: Animations.qml:24 msgid "NumberAnimation" msgstr "" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "Normál" #: Animations.qml:58 msgid "Standard Durations" msgstr "Normál időtartam" #: Animations.qml:62 msgid "Snap" msgstr "" #: Animations.qml:98 msgid "Fast" msgstr "Gyors" #: Animations.qml:134 msgid "Slow" msgstr "Lassú" #: Animations.qml:159 msgid "Sleepy" msgstr "" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "Hívás" #: Buttons.qml:37 msgid "Stroke" msgstr "" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "Színes" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "Ikon" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "Ikon + szöveg" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "Összecsukott" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "Lenyitott" #: Colors.qml:30 msgid "Orange" msgstr "Narancssárga" #: Colors.qml:36 msgid "Light grey" msgstr "Világos szürke" #: Colors.qml:42 msgid "Dark grey" msgstr "Sötét szürke" #: Colors.qml:48 msgid "Red" msgstr "Piros" #: Colors.qml:54 msgid "Green" msgstr "Zöld" #: Colors.qml:60 msgid "Blue" msgstr "Kék" #: Colors.qml:66 msgid "Purple" msgstr "Lila" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "Megnyitás" #: Icons.qml:29 msgid "Scaling" msgstr "Átméretezés" #: Icons.qml:79 msgid "Theme" msgstr "Téma" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "Címke" #: ListItems.qml:33 msgid "Subtitled" msgstr "Feliratozott" #: ListItems.qml:37 msgid "Secondary label" msgstr "Másodlagos címke" #: ListItems.qml:52 msgid "ThinDivider" msgstr "" #: ListItems.qml:73 msgid "Progression" msgstr "Haladás" #: ListItems.qml:82 msgid "Single value" msgstr "Egyértékű" #: ListItems.qml:86 msgid "Value" msgstr "Érték" #: ListItems.qml:91 msgid "Multi value" msgstr "Többértékű" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "1. érték" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "2. érték" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "3. érték" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "4. érték" #: ListItems.qml:103 msgid "Item selector" msgstr "Elemválasztó" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "Növekvő" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "Többesválasztó" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "Egyéni modell" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "5. érték" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "6. érték" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "7. érték" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "8. érték" #: ListItems.qml:190 msgid "Control" msgstr "Vezérlő" #: ListItems.qml:202 msgid "Removable" msgstr "Eltávolítható" #: ListItems.qml:205 msgid "Slide to remove" msgstr "Húzza az eltávolításhoz" #: ListItems.qml:215 msgid "Reset" msgstr "Visszaállítás" #: ListItems.qml:226 msgid "Grouped list" msgstr "Csoportos lista" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "" #: ListItems.qml:364 msgid "Expandable" msgstr "" #: NewListItems.qml:39 msgid "Colored" msgstr "" #: NewListItems.qml:42 msgid "Highlight color" msgstr "" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "" #: NewListItems.qml:114 msgid "Move" msgstr "" #: NewListItems.qml:163 msgid "Basic" msgstr "" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "" #: NewListItems.qml:163 msgid "Immutable" msgstr "" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "Opcióválasztó" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "" #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "Egyedi konténer magassága" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "Nincs kezdeti kijelölés, görgethető." #: Pickers.qml:31 msgid "Linear" msgstr "Lineáris" #: Pickers.qml:63 msgid "Circular" msgstr "Körkörös" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "Végtelen" #: Pickers.qml:137 msgid "Clock" msgstr "Óra" #: Pickers.qml:174 msgid "Overlay" msgstr "" #: Popover.qml:38 msgid "Flickable" msgstr "" #: Popover.qml:74 msgid "Action #1" msgstr "1. művelet" #: Popover.qml:78 msgid "Action #2" msgstr "2. művelet" #: Popover.qml:82 msgid "Action #3" msgstr "3. művelet" #: Popover.qml:86 msgid "Action #4" msgstr "4. művelet" #: Popover.qml:90 msgid "Action #5" msgstr "5. művelet" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "Folyamatjelző" #: ProgressBars.qml:59 msgid "No label" msgstr "Nincs címke" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "Tevékenységmutató" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "Méretek" #: Sections.qml:34 msgid "Enabled" msgstr "" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "Cím" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "Aktuális érték: %1" #: Sliders.qml:42 msgid "Live Update" msgstr "Élő frissítés" #: Sliders.qml:57 msgid "Range" msgstr "Tartomány" #: Sliders.qml:74 msgid "Labels" msgstr "" #: Sliders.qml:85 msgid "Small" msgstr "" #: Sliders.qml:87 msgid "Medium" msgstr "" #: Sliders.qml:89 msgid "Large" msgstr "" #: TextInputs.qml:50 msgid "Type me in..." msgstr "Ide írhat…" #: TextInputs.qml:56 msgid "Password" msgstr "Jelszó" #: TextInputs.qml:67 msgid "Numbers" msgstr "Számok" #: TextInputs.qml:78 msgid "Read-only" msgstr "Csak olvasható" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "Senki nem írhat ide" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "Az interakció nem engedélyezett" #: TextInputs.qml:107 msgid "Default" msgstr "Alapértelmezett" #: TextInputs.qml:129 msgid "Rich Text" msgstr "" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "Kijelöletlen" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "Kijelölt" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "" #: UbuntuShape.qml:73 msgid "Radius" msgstr "Sugár" #: UbuntuShape.qml:115 msgid "Image" msgstr "Kép" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "" ./examples/ubuntu-ui-toolkit-gallery/po/it.po0000644000015600001650000002055512700370701021366 0ustar jenkinsjenkins# Italian translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-09-23 21:24+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "" #: ActionBars.qml:68 msgid "Short list" msgstr "" #: ActionBars.qml:79 msgid "Number of slots" msgstr "" #: ActionBars.qml:92 msgid "Long list" msgstr "" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "" #: Animations.qml:24 msgid "NumberAnimation" msgstr "" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "" #: Animations.qml:58 msgid "Standard Durations" msgstr "" #: Animations.qml:62 msgid "Snap" msgstr "" #: Animations.qml:98 msgid "Fast" msgstr "" #: Animations.qml:134 msgid "Slow" msgstr "" #: Animations.qml:159 msgid "Sleepy" msgstr "" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "" #: Buttons.qml:37 msgid "Stroke" msgstr "" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "" #: Colors.qml:30 msgid "Orange" msgstr "" #: Colors.qml:36 msgid "Light grey" msgstr "" #: Colors.qml:42 msgid "Dark grey" msgstr "" #: Colors.qml:48 msgid "Red" msgstr "" #: Colors.qml:54 msgid "Green" msgstr "" #: Colors.qml:60 msgid "Blue" msgstr "" #: Colors.qml:66 msgid "Purple" msgstr "" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "" #: Icons.qml:29 msgid "Scaling" msgstr "" #: Icons.qml:79 msgid "Theme" msgstr "" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "" #: ListItems.qml:33 msgid "Subtitled" msgstr "" #: ListItems.qml:37 msgid "Secondary label" msgstr "" #: ListItems.qml:52 msgid "ThinDivider" msgstr "" #: ListItems.qml:73 msgid "Progression" msgstr "" #: ListItems.qml:82 msgid "Single value" msgstr "" #: ListItems.qml:86 msgid "Value" msgstr "" #: ListItems.qml:91 msgid "Multi value" msgstr "" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "" #: ListItems.qml:103 msgid "Item selector" msgstr "" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "" #: ListItems.qml:190 msgid "Control" msgstr "" #: ListItems.qml:202 msgid "Removable" msgstr "" #: ListItems.qml:205 msgid "Slide to remove" msgstr "" #: ListItems.qml:215 msgid "Reset" msgstr "" #: ListItems.qml:226 msgid "Grouped list" msgstr "" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "" #: ListItems.qml:364 msgid "Expandable" msgstr "" #: NewListItems.qml:39 msgid "Colored" msgstr "" #: NewListItems.qml:42 msgid "Highlight color" msgstr "" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "" #: NewListItems.qml:114 msgid "Move" msgstr "" #: NewListItems.qml:163 msgid "Basic" msgstr "" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "" #: NewListItems.qml:163 msgid "Immutable" msgstr "" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "" #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "" #: Pickers.qml:31 msgid "Linear" msgstr "" #: Pickers.qml:63 msgid "Circular" msgstr "" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "" #: Pickers.qml:137 msgid "Clock" msgstr "" #: Pickers.qml:174 msgid "Overlay" msgstr "" #: Popover.qml:38 msgid "Flickable" msgstr "" #: Popover.qml:74 msgid "Action #1" msgstr "" #: Popover.qml:78 msgid "Action #2" msgstr "" #: Popover.qml:82 msgid "Action #3" msgstr "" #: Popover.qml:86 msgid "Action #4" msgstr "" #: Popover.qml:90 msgid "Action #5" msgstr "" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "" #: ProgressBars.qml:59 msgid "No label" msgstr "" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "" #: Sections.qml:34 msgid "Enabled" msgstr "" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "" #: Sliders.qml:42 msgid "Live Update" msgstr "" #: Sliders.qml:57 msgid "Range" msgstr "" #: Sliders.qml:74 msgid "Labels" msgstr "" #: Sliders.qml:85 msgid "Small" msgstr "" #: Sliders.qml:87 msgid "Medium" msgstr "" #: Sliders.qml:89 msgid "Large" msgstr "" #: TextInputs.qml:50 msgid "Type me in..." msgstr "" #: TextInputs.qml:56 msgid "Password" msgstr "" #: TextInputs.qml:67 msgid "Numbers" msgstr "" #: TextInputs.qml:78 msgid "Read-only" msgstr "" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "" #: TextInputs.qml:107 msgid "Default" msgstr "" #: TextInputs.qml:129 msgid "Rich Text" msgstr "" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "" #: UbuntuShape.qml:73 msgid "Radius" msgstr "" #: UbuntuShape.qml:115 msgid "Image" msgstr "" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "" ./examples/ubuntu-ui-toolkit-gallery/po/gd.po0000644000015600001650000002415312700370701021342 0ustar jenkinsjenkins# Gaelic; Scottish translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-11-19 20:15+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Gaelic; Scottish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "Mu dhèidhinn..." #: ActionBars.qml:68 msgid "Short list" msgstr "Liosta ghoirid" #: ActionBars.qml:79 msgid "Number of slots" msgstr "Co mheud slot" #: ActionBars.qml:92 msgid "Long list" msgstr "Liosta fhada" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "À comas" #: Animations.qml:24 msgid "NumberAnimation" msgstr "Beòthachadh àireamhan" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "Stannardach" #: Animations.qml:58 msgid "Standard Durations" msgstr "Fadan stannardach" #: Animations.qml:62 msgid "Snap" msgstr "Greimich" #: Animations.qml:98 msgid "Fast" msgstr "Luath" #: Animations.qml:134 msgid "Slow" msgstr "Slaodach" #: Animations.qml:159 msgid "Sleepy" msgstr "Cadalach" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "Gairm" #: Buttons.qml:37 msgid "Stroke" msgstr "Stràc" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "Dath" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "Cuir fòn gu %1" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "Ìomhaigheag" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "Ìomhaigheag ⁊ teacsa" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "Co-theannaichte" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "Leudaichte" #: Colors.qml:30 msgid "Orange" msgstr "Orains" #: Colors.qml:36 msgid "Light grey" msgstr "Liath soilleir" #: Colors.qml:42 msgid "Dark grey" msgstr "Liath dorcha" #: Colors.qml:48 msgid "Red" msgstr "Dearg" #: Colors.qml:54 msgid "Green" msgstr "Uaine" #: Colors.qml:60 msgid "Blue" msgstr "Gorm" #: Colors.qml:66 msgid "Purple" msgstr "Purpaidh" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "Fosgail" #: Icons.qml:29 msgid "Scaling" msgstr "Sgèileadh" #: Icons.qml:79 msgid "Theme" msgstr "Ùrlar" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "Gnìomhan roimhe ’s ’na dhèidh" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "Leubail" #: ListItems.qml:33 msgid "Subtitled" msgstr "Le fo-thiotalan" #: ListItems.qml:37 msgid "Secondary label" msgstr "Dàrna leubail" #: ListItems.qml:52 msgid "ThinDivider" msgstr "Sgaradair tana" #: ListItems.qml:73 msgid "Progression" msgstr "Adhartas" #: ListItems.qml:82 msgid "Single value" msgstr "Aon luach" #: ListItems.qml:86 msgid "Value" msgstr "Luach" #: ListItems.qml:91 msgid "Multi value" msgstr "Iomadh luach" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "Luach 1" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "Luach 2" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "Luach 3" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "Luach 4" #: ListItems.qml:103 msgid "Item selector" msgstr "Roghnaichear nithean" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "’Ga leudachadh" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "Ioma-thaghadh" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "Modail gnàthaichte" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "Luach 5" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "Luach 6" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "Luach 7" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "Luach 8" #: ListItems.qml:190 msgid "Control" msgstr "Uidheaman-smachd" #: ListItems.qml:202 msgid "Removable" msgstr "So-ghluasadach" #: ListItems.qml:205 msgid "Slide to remove" msgstr "Sleamhnaich gus a thoirt air falbh" #: ListItems.qml:215 msgid "Reset" msgstr "Ath-shuidhich" #: ListItems.qml:226 msgid "Grouped list" msgstr "Liosta bhuidhnichte" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "Sealla liosta Ubuntu" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "Colbh so-leudaichte" #: ListItems.qml:364 msgid "Expandable" msgstr "So-leudaichte" #: NewListItems.qml:39 msgid "Colored" msgstr "Dathte" #: NewListItems.qml:42 msgid "Highlight color" msgstr "Dath an t-soillseachaidh" #: NewListItems.qml:71 msgid "Leading actions" msgstr "Gnìomhan roimhe" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "Gnìomhan ’na dhèidh" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "Riochdairean ghnìomhan gnàthaichte" #: NewListItems.qml:111 msgid "Edit" msgstr "Deasaich" #: NewListItems.qml:114 msgid "Move" msgstr "Gluais" #: NewListItems.qml:163 msgid "Basic" msgstr "Bunasach" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "Sgaradair dathte" #: NewListItems.qml:163 msgid "Immutable" msgstr "Do-atharraichte" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "Gun sgaradair" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "Roghnaichear roghainnean" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "Seo an dàrna luach" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" "Boí rí amrae for Laignib, Mac Dathó a ainm. Boí cú occo. Im dīched in cú " "Laigniu huili. Ailbe ainm in chon, ocus ba lán hÉriu dia airdircus in chon." #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "" "Roimhe seo o chionn fada an t-saoghail, bha sgeul ann nach innseadh daoine." #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "Àirde ghnàthaichte an t-soithich" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "Gun taghadh tòiseachail, gabhaidh sgroladh a dhèanamh." #: Pickers.qml:31 msgid "Linear" msgstr "Sreathach" #: Pickers.qml:63 msgid "Circular" msgstr "Cearcallach" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "Neo-chrìochnach" #: Pickers.qml:137 msgid "Clock" msgstr "Cleoc" #: Pickers.qml:174 msgid "Overlay" msgstr "Tar-chòmhdachadh" #: Popover.qml:38 msgid "Flickable" msgstr "Smàlagach" #: Popover.qml:74 msgid "Action #1" msgstr "Gnìomh #1" #: Popover.qml:78 msgid "Action #2" msgstr "Gnìomh #2" #: Popover.qml:82 msgid "Action #3" msgstr "Gnìomh #3" #: Popover.qml:86 msgid "Action #4" msgstr "Gnìomh #4" #: Popover.qml:90 msgid "Action #5" msgstr "Gnìomh #5" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "Bàr an adhartais" #: ProgressBars.qml:59 msgid "No label" msgstr "Gun leubail" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "Taisbeanair gnìomhachd" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "Meudan" #: Sections.qml:34 msgid "Enabled" msgstr "An comas" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" "Tha coltas gu math tomadach air an t-siota seo leis gu bheil e gu math aosta." #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "Tiotal" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "An luach fìrinneach: %1" #: Sliders.qml:42 msgid "Live Update" msgstr "Ùrachadh beò" #: Sliders.qml:57 msgid "Range" msgstr "Rainse" #: Sliders.qml:74 msgid "Labels" msgstr "Leubailean" #: Sliders.qml:85 msgid "Small" msgstr "Beag" #: Sliders.qml:87 msgid "Medium" msgstr "Meadhanach" #: Sliders.qml:89 msgid "Large" msgstr "Mòr" #: TextInputs.qml:50 msgid "Type me in..." msgstr "Sgrìobh mi ann an..." #: TextInputs.qml:56 msgid "Password" msgstr "Facal-faire" #: TextInputs.qml:67 msgid "Numbers" msgstr "Àireamhan" #: TextInputs.qml:78 msgid "Read-only" msgstr "Cead-leughaidh a-mhàin" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "Nar sgrìobhar an-seo" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "Casg air eadar-ghabhail" #: TextInputs.qml:107 msgid "Default" msgstr "Bun-roghainn" #: TextInputs.qml:129 msgid "Rich Text" msgstr "Rich Text" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "Gun dearbhadh" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "Air a dhearbhadh" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "Taobh" #: UbuntuShape.qml:73 msgid "Radius" msgstr "Rèideas" #: UbuntuShape.qml:115 msgid "Image" msgstr "Dealbh" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "Caisead" ./examples/ubuntu-ui-toolkit-gallery/po/el.po0000644000015600001650000002364712700370701021357 0ustar jenkinsjenkins# Greek translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-04-06 19:00+0000\n" "Last-Translator: Aggelos Arnaoutis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "Περί..." #: ActionBars.qml:68 msgid "Short list" msgstr "" #: ActionBars.qml:79 msgid "Number of slots" msgstr "" #: ActionBars.qml:92 msgid "Long list" msgstr "" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "Απενεργοποιημένο" #: Animations.qml:24 msgid "NumberAnimation" msgstr "" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "Τυπικό" #: Animations.qml:58 msgid "Standard Durations" msgstr "Τυπικές διάρκειες" #: Animations.qml:62 msgid "Snap" msgstr "Προσκόλληση" #: Animations.qml:98 msgid "Fast" msgstr "Γρήγορο" #: Animations.qml:134 msgid "Slow" msgstr "Αργό" #: Animations.qml:159 msgid "Sleepy" msgstr "" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "Κλήση" #: Buttons.qml:37 msgid "Stroke" msgstr "" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "Χρώμα" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "Εικονίδιο" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "Εικονίδιο+Κείμενο" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "" #: Colors.qml:30 msgid "Orange" msgstr "Πορτοκαλί" #: Colors.qml:36 msgid "Light grey" msgstr "Ανοιχτό γκρι" #: Colors.qml:42 msgid "Dark grey" msgstr "Σκούρο γκρι" #: Colors.qml:48 msgid "Red" msgstr "Κόκκινο" #: Colors.qml:54 msgid "Green" msgstr "Πράσινο" #: Colors.qml:60 msgid "Blue" msgstr "Γαλάζιο" #: Colors.qml:66 msgid "Purple" msgstr "Μωβ" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "Άνοιγμα" #: Icons.qml:29 msgid "Scaling" msgstr "Κλιμάκωση" #: Icons.qml:79 msgid "Theme" msgstr "Θέμα" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "Ετικέτα" #: ListItems.qml:33 msgid "Subtitled" msgstr "" #: ListItems.qml:37 msgid "Secondary label" msgstr "Δευτερεύουσα ετικέτα" #: ListItems.qml:52 msgid "ThinDivider" msgstr "ThinDivider" #: ListItems.qml:73 msgid "Progression" msgstr "" #: ListItems.qml:82 msgid "Single value" msgstr "Απλή τιμή" #: ListItems.qml:86 msgid "Value" msgstr "Τιμή" #: ListItems.qml:91 msgid "Multi value" msgstr "Πολλαπλή τιμή" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "Τιμή 1" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "Τιμή 2" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "Τιμή 3" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "Τιμή 4" #: ListItems.qml:103 msgid "Item selector" msgstr "Επιλογέας αντικειμένου" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "Πολλαπλή επιλογή" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "Προσαρμοσμένο μοντέλο" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "Τιμή 5" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "Τιμή 6" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "Τιμή 7" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "Τιμή 8" #: ListItems.qml:190 msgid "Control" msgstr "" #: ListItems.qml:202 msgid "Removable" msgstr "Αφαιρούμενο" #: ListItems.qml:205 msgid "Slide to remove" msgstr "" #: ListItems.qml:215 msgid "Reset" msgstr "Επαναφορά" #: ListItems.qml:226 msgid "Grouped list" msgstr "Ομαδοποιημένη λίστα" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "" #: ListItems.qml:364 msgid "Expandable" msgstr "" #: NewListItems.qml:39 msgid "Colored" msgstr "" #: NewListItems.qml:42 msgid "Highlight color" msgstr "" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "Επεξεργασία" #: NewListItems.qml:114 msgid "Move" msgstr "Μετακίνηση" #: NewListItems.qml:163 msgid "Basic" msgstr "" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "" #: NewListItems.qml:163 msgid "Immutable" msgstr "" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "Αυτή είναι η δεύτερη τιμή" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "" #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "" #: Pickers.qml:31 msgid "Linear" msgstr "Γραμμικός" #: Pickers.qml:63 msgid "Circular" msgstr "Κυκλικός" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "Άπειρο" #: Pickers.qml:137 msgid "Clock" msgstr "Ρολόι" #: Pickers.qml:174 msgid "Overlay" msgstr "Επικάλυψη" #: Popover.qml:38 msgid "Flickable" msgstr "" #: Popover.qml:74 msgid "Action #1" msgstr "Ενέργεια #1" #: Popover.qml:78 msgid "Action #2" msgstr "Ενέργεια #2" #: Popover.qml:82 msgid "Action #3" msgstr "Ενέργεια #3" #: Popover.qml:86 msgid "Action #4" msgstr "Ενέργεια #4" #: Popover.qml:90 msgid "Action #5" msgstr "Ενέργεια #5" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "Γραμμή προόδου" #: ProgressBars.qml:59 msgid "No label" msgstr "Καμία ετικέτα" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "Δείκτης δραστηριότητας" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "Μεγέθη" #: Sections.qml:34 msgid "Enabled" msgstr "Ενεργοποιημένο" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "Τίτλος" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "Πραγματική τιμή: %1" #: Sliders.qml:42 msgid "Live Update" msgstr "Ενημέρωση πραγματικού χρόνου" #: Sliders.qml:57 msgid "Range" msgstr "Εύρος" #: Sliders.qml:74 msgid "Labels" msgstr "Ετικέτες" #: Sliders.qml:85 msgid "Small" msgstr "Μικρό" #: Sliders.qml:87 msgid "Medium" msgstr "Μεσαίο" #: Sliders.qml:89 msgid "Large" msgstr "Μεγάλο" #: TextInputs.qml:50 msgid "Type me in..." msgstr "" #: TextInputs.qml:56 msgid "Password" msgstr "Κωδικός πρόσβασης" #: TextInputs.qml:67 msgid "Numbers" msgstr "Αριθμοί" #: TextInputs.qml:78 msgid "Read-only" msgstr "Μόνο για ανάγνωση" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "Κανείς δεν γράφει εδώ" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "Καμία αλληλεπίδραση δεν επιτρέπεται" #: TextInputs.qml:107 msgid "Default" msgstr "Προεπιλογή" #: TextInputs.qml:129 msgid "Rich Text" msgstr "Πλούσιο κείμενο" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "Μη επιλεγμένο" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "Επιλεγμένο" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "" #: UbuntuShape.qml:73 msgid "Radius" msgstr "" #: UbuntuShape.qml:115 msgid "Image" msgstr "Εικόνα" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "" ./examples/ubuntu-ui-toolkit-gallery/po/tr.po0000644000015600001650000002266712700370701021405 0ustar jenkinsjenkins# Turkish translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-12-08 15:43+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "Hakkında..." #: ActionBars.qml:68 msgid "Short list" msgstr "Kısa liste" #: ActionBars.qml:79 msgid "Number of slots" msgstr "Slot sayıları" #: ActionBars.qml:92 msgid "Long list" msgstr "Uzun liste" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "Etkin Değil" #: Animations.qml:24 msgid "NumberAnimation" msgstr "Animasyon Numarası" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "Standart" #: Animations.qml:58 msgid "Standard Durations" msgstr "Standart Süreler" #: Animations.qml:62 msgid "Snap" msgstr "Yakala" #: Animations.qml:98 msgid "Fast" msgstr "Hızlı" #: Animations.qml:134 msgid "Slow" msgstr "Yavaş" #: Animations.qml:159 msgid "Sleepy" msgstr "Uykulu" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "Çağrı" #: Buttons.qml:37 msgid "Stroke" msgstr "Çizgili" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "Renk" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "%1 kişisini ara" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "Simge" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "İkon+Metin" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "Daraltılmış" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "Genişletilmiş" #: Colors.qml:30 msgid "Orange" msgstr "Turuncu" #: Colors.qml:36 msgid "Light grey" msgstr "Açık yeşil" #: Colors.qml:42 msgid "Dark grey" msgstr "Koyu yeşil" #: Colors.qml:48 msgid "Red" msgstr "Kırmızı" #: Colors.qml:54 msgid "Green" msgstr "Yeşil" #: Colors.qml:60 msgid "Blue" msgstr "Mavi" #: Colors.qml:66 msgid "Purple" msgstr "Mor" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "Aç" #: Icons.qml:29 msgid "Scaling" msgstr "Ölçeklendirme" #: Icons.qml:79 msgid "Theme" msgstr "Tema" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "Etiket" #: ListItems.qml:33 msgid "Subtitled" msgstr "Altyazılı" #: ListItems.qml:37 msgid "Secondary label" msgstr "İkincil etiket" #: ListItems.qml:52 msgid "ThinDivider" msgstr "" #: ListItems.qml:73 msgid "Progression" msgstr "İlerleme" #: ListItems.qml:82 msgid "Single value" msgstr "Tek değer" #: ListItems.qml:86 msgid "Value" msgstr "Değer" #: ListItems.qml:91 msgid "Multi value" msgstr "Çift değer" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "Değer 1" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "Değer 2" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "Değer 3" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "Değer 4" #: ListItems.qml:103 msgid "Item selector" msgstr "Madde seçici" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "Genişleyen" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "Çoklu seçim" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "Özel Model" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "Değer 5" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "Değer 6" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "Değer 7" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "Değer 8" #: ListItems.qml:190 msgid "Control" msgstr "Denetim" #: ListItems.qml:202 msgid "Removable" msgstr "Kaldırılabilir" #: ListItems.qml:205 msgid "Slide to remove" msgstr "Kaldırmak için kaydır" #: ListItems.qml:215 msgid "Reset" msgstr "Sıfırla" #: ListItems.qml:226 msgid "Grouped list" msgstr "Gruplandırılmış liste" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "Ubuntu Liste Görünümü" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "Harcanılabilir Sütun" #: ListItems.qml:364 msgid "Expandable" msgstr "Harcanılabilir" #: NewListItems.qml:39 msgid "Colored" msgstr "Renkli" #: NewListItems.qml:42 msgid "Highlight color" msgstr "Vurgulama rengi" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "Düzenle" #: NewListItems.qml:114 msgid "Move" msgstr "Taşı" #: NewListItems.qml:163 msgid "Basic" msgstr "Temel" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "Renkli bölücü" #: NewListItems.qml:163 msgid "Immutable" msgstr "Değişmez" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "Bölücü yok" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "Seçenek Seçici" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "Bu ikinci değer" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "Bir zamanlar kimsenin anlatmadığı bir hikaye varmış." #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "Özelleştirilmiş konteyner yüksekliği" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "" #: Pickers.qml:31 msgid "Linear" msgstr "Çizgisel" #: Pickers.qml:63 msgid "Circular" msgstr "Dairesel" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "Sonsuz" #: Pickers.qml:137 msgid "Clock" msgstr "Saat" #: Pickers.qml:174 msgid "Overlay" msgstr "Kaplama" #: Popover.qml:38 msgid "Flickable" msgstr "" #: Popover.qml:74 msgid "Action #1" msgstr "" #: Popover.qml:78 msgid "Action #2" msgstr "" #: Popover.qml:82 msgid "Action #3" msgstr "" #: Popover.qml:86 msgid "Action #4" msgstr "" #: Popover.qml:90 msgid "Action #5" msgstr "Eylem 5#" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "İlerleme Çubuğu" #: ProgressBars.qml:59 msgid "No label" msgstr "Etiket yok" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "Aktivite Göstergesi" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "Boyutlar" #: Sections.qml:34 msgid "Enabled" msgstr "Etkin" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "Başlık" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "Gerçek değer: %1" #: Sliders.qml:42 msgid "Live Update" msgstr "Canlı Güncelleme" #: Sliders.qml:57 msgid "Range" msgstr "Aralık" #: Sliders.qml:74 msgid "Labels" msgstr "Etiketler" #: Sliders.qml:85 msgid "Small" msgstr "Küçük" #: Sliders.qml:87 msgid "Medium" msgstr "Orta" #: Sliders.qml:89 msgid "Large" msgstr "Büyük" #: TextInputs.qml:50 msgid "Type me in..." msgstr "Beni yaz..." #: TextInputs.qml:56 msgid "Password" msgstr "Şifre" #: TextInputs.qml:67 msgid "Numbers" msgstr "Sayılar" #: TextInputs.qml:78 msgid "Read-only" msgstr "Salt-okunur" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "Buraya kimse yazmadı" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "" #: TextInputs.qml:107 msgid "Default" msgstr "Varsayılan" #: TextInputs.qml:129 msgid "Rich Text" msgstr "Zengin Metin" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "İşaretlenmemiş" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "" #: UbuntuShape.qml:73 msgid "Radius" msgstr "" #: UbuntuShape.qml:115 msgid "Image" msgstr "" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "" ./examples/ubuntu-ui-toolkit-gallery/po/uk.po0000644000015600001650000002633012700370701021366 0ustar jenkinsjenkins# Ukrainian translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-08-03 22:47+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Ukrainian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "Про програму…" #: ActionBars.qml:68 msgid "Short list" msgstr "Короткий список" #: ActionBars.qml:79 msgid "Number of slots" msgstr "Кількість слотів" #: ActionBars.qml:92 msgid "Long list" msgstr "Довгий список" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "Вимкнено" #: Animations.qml:24 msgid "NumberAnimation" msgstr "Анімація номера" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "Стандартно" #: Animations.qml:58 msgid "Standard Durations" msgstr "Стандартні тривалості" #: Animations.qml:62 msgid "Snap" msgstr "Прилипання" #: Animations.qml:98 msgid "Fast" msgstr "Швидко" #: Animations.qml:134 msgid "Slow" msgstr "Повільно" #: Animations.qml:159 msgid "Sleepy" msgstr "Сонливо" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "Дзвінок" #: Buttons.qml:37 msgid "Stroke" msgstr "Жест" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "Колір" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "Виклик %1" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "Піктограма" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "Піктограма та Текст" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "Згорнуто" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "Розгорнуто" #: Colors.qml:30 msgid "Orange" msgstr "Помаранчевий" #: Colors.qml:36 msgid "Light grey" msgstr "Світло-сірий" #: Colors.qml:42 msgid "Dark grey" msgstr "Темно-сірий" #: Colors.qml:48 msgid "Red" msgstr "Червоний" #: Colors.qml:54 msgid "Green" msgstr "Зелений" #: Colors.qml:60 msgid "Blue" msgstr "Синій" #: Colors.qml:66 msgid "Purple" msgstr "Пурпурний" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "Відкрити" #: Icons.qml:29 msgid "Scaling" msgstr "Масштабування" #: Icons.qml:79 msgid "Theme" msgstr "Тема" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "Початкові і завершальні дії" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "Мітка" #: ListItems.qml:33 msgid "Subtitled" msgstr "З підзаголовком" #: ListItems.qml:37 msgid "Secondary label" msgstr "Другорядна мітка" #: ListItems.qml:52 msgid "ThinDivider" msgstr "Тонкий роздільник" #: ListItems.qml:73 msgid "Progression" msgstr "Прогресія" #: ListItems.qml:82 msgid "Single value" msgstr "Одинарне значення" #: ListItems.qml:86 msgid "Value" msgstr "Значення" #: ListItems.qml:91 msgid "Multi value" msgstr "Множинне значення" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "Значення 1" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "Значення 2" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "Значення 3" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "Значення 4" #: ListItems.qml:103 msgid "Item selector" msgstr "Вибір пункту" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "Розширяється" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "Позначення багатьох пунктів" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "Нетипова модель" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "Значення 5" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "Значення 6" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "Значення 7" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "Значення 8" #: ListItems.qml:190 msgid "Control" msgstr "Керування" #: ListItems.qml:202 msgid "Removable" msgstr "Придатний до вилучення" #: ListItems.qml:205 msgid "Slide to remove" msgstr "Проведіть, щоб вилучити" #: ListItems.qml:215 msgid "Reset" msgstr "Скинути" #: ListItems.qml:226 msgid "Grouped list" msgstr "Згрупований список" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "UbuntuListView" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "ExpandablesColumn" #: ListItems.qml:364 msgid "Expandable" msgstr "З розгортанням" #: NewListItems.qml:39 msgid "Colored" msgstr "З кольором" #: NewListItems.qml:42 msgid "Highlight color" msgstr "Колір позначення" #: NewListItems.qml:71 msgid "Leading actions" msgstr "Початкові дії" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "Завершальні дії" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "Нетипове делегування дій" #: NewListItems.qml:111 msgid "Edit" msgstr "Змінити" #: NewListItems.qml:114 msgid "Move" msgstr "Пересунути" #: NewListItems.qml:163 msgid "Basic" msgstr "Основні" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "Кольоровий роздільник" #: NewListItems.qml:163 msgid "Immutable" msgstr "Незмінний" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "Без роздільника" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "Засіб вибору з варіантів" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "Це друге значення" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "Колись давно була казка, яку ніхто не розповідав." #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "Нетипова висота контейнера" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "Немає початкового вибору, можливе гортання" #: Pickers.qml:31 msgid "Linear" msgstr "Лінійний" #: Pickers.qml:63 msgid "Circular" msgstr "Круговий" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "Нескінченний" #: Pickers.qml:137 msgid "Clock" msgstr "Годинник" #: Pickers.qml:174 msgid "Overlay" msgstr "Накладання" #: Popover.qml:38 msgid "Flickable" msgstr "Блимання" #: Popover.qml:74 msgid "Action #1" msgstr "Дія 1" #: Popover.qml:78 msgid "Action #2" msgstr "Дія 2" #: Popover.qml:82 msgid "Action #3" msgstr "Дія 3" #: Popover.qml:86 msgid "Action #4" msgstr "Дія 4" #: Popover.qml:90 msgid "Action #5" msgstr "Дія 5" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "Смужка поступу" #: ProgressBars.qml:59 msgid "No label" msgstr "Без мітки" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "Індикатор діяльності" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "Розміри" #: Sections.qml:34 msgid "Enabled" msgstr "Увімкнено" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" "Вигляд Sheet ще недостатньо опрацьовано, тому він доволі недосконалий." #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "Заголовок" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "Поточна значення: %1" #: Sliders.qml:42 msgid "Live Update" msgstr "Інтерактивне оновлення" #: Sliders.qml:57 msgid "Range" msgstr "Діапазон" #: Sliders.qml:74 msgid "Labels" msgstr "Мітки" #: Sliders.qml:85 msgid "Small" msgstr "Малий" #: Sliders.qml:87 msgid "Medium" msgstr "Середній" #: Sliders.qml:89 msgid "Large" msgstr "Великий" #: TextInputs.qml:50 msgid "Type me in..." msgstr "Впишіть щось…" #: TextInputs.qml:56 msgid "Password" msgstr "Пароль" #: TextInputs.qml:67 msgid "Numbers" msgstr "Числа" #: TextInputs.qml:78 msgid "Read-only" msgstr "Лише читання" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "Тут не можна писати" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "Взаємодію заборонено" #: TextInputs.qml:107 msgid "Default" msgstr "Типовий" #: TextInputs.qml:129 msgid "Rich Text" msgstr "Текст із форматуванням" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "Непозначений" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "Позначений" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "Вигляд" #: UbuntuShape.qml:73 msgid "Radius" msgstr "Радіус" #: UbuntuShape.qml:115 msgid "Image" msgstr "Зображення" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "Градієнт" ./examples/ubuntu-ui-toolkit-gallery/po/po.pro0000644000015600001650000000117012700370701021542 0ustar jenkinsjenkinsTEMPLATE = aux MO_FILES = $$system(ls *.po) install_mo_commands = for(po_file, MO_FILES) { mo_file = $$replace(po_file,.po,.mo) system(msgfmt $$po_file -o $$mo_file) mo_name = $$replace(mo_file,.mo,) mo_targetpath = $(INSTALL_ROOT)/$$[QT_INSTALL_PREFIX]/share/locale/$${mo_name}/LC_MESSAGES mo_target = $${mo_targetpath}/ubuntu-ui-toolkit-gallery.mo !isEmpty(install_mo_commands): install_mo_commands += && install_mo_commands += test -d $$mo_targetpath || mkdir -p $$mo_targetpath install_mo_commands += && cp $$PWD/$$mo_file $$mo_target } install.commands = $$install_mo_commands QMAKE_EXTRA_TARGETS += install ./examples/ubuntu-ui-toolkit-gallery/po/fi.po0000644000015600001650000002125212700370701021343 0ustar jenkinsjenkins# Finnish translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-11-19 09:04+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "Tietoja..." #: ActionBars.qml:68 msgid "Short list" msgstr "" #: ActionBars.qml:79 msgid "Number of slots" msgstr "" #: ActionBars.qml:92 msgid "Long list" msgstr "" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "Ei käytössä" #: Animations.qml:24 msgid "NumberAnimation" msgstr "" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "" #: Animations.qml:58 msgid "Standard Durations" msgstr "" #: Animations.qml:62 msgid "Snap" msgstr "" #: Animations.qml:98 msgid "Fast" msgstr "Nopea" #: Animations.qml:134 msgid "Slow" msgstr "Hidas" #: Animations.qml:159 msgid "Sleepy" msgstr "" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "" #: Buttons.qml:37 msgid "Stroke" msgstr "" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "Väri" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "Soita %1" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "Kuvake" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "" #: Colors.qml:30 msgid "Orange" msgstr "" #: Colors.qml:36 msgid "Light grey" msgstr "" #: Colors.qml:42 msgid "Dark grey" msgstr "" #: Colors.qml:48 msgid "Red" msgstr "Punainen" #: Colors.qml:54 msgid "Green" msgstr "Vihreä" #: Colors.qml:60 msgid "Blue" msgstr "Sininen" #: Colors.qml:66 msgid "Purple" msgstr "" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "Avaa" #: Icons.qml:29 msgid "Scaling" msgstr "" #: Icons.qml:79 msgid "Theme" msgstr "Teema" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "" #: ListItems.qml:33 msgid "Subtitled" msgstr "" #: ListItems.qml:37 msgid "Secondary label" msgstr "" #: ListItems.qml:52 msgid "ThinDivider" msgstr "" #: ListItems.qml:73 msgid "Progression" msgstr "" #: ListItems.qml:82 msgid "Single value" msgstr "" #: ListItems.qml:86 msgid "Value" msgstr "Arvo" #: ListItems.qml:91 msgid "Multi value" msgstr "" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "Arvo 1" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "Arvo 2" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "Arvo 3" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "Arvo 4" #: ListItems.qml:103 msgid "Item selector" msgstr "" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "Arvo 5" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "Arvo 6" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "Arvo 7" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "Arvo 8" #: ListItems.qml:190 msgid "Control" msgstr "" #: ListItems.qml:202 msgid "Removable" msgstr "" #: ListItems.qml:205 msgid "Slide to remove" msgstr "" #: ListItems.qml:215 msgid "Reset" msgstr "" #: ListItems.qml:226 msgid "Grouped list" msgstr "" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "" #: ListItems.qml:364 msgid "Expandable" msgstr "" #: NewListItems.qml:39 msgid "Colored" msgstr "" #: NewListItems.qml:42 msgid "Highlight color" msgstr "Korostusväri" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "Muokkaa" #: NewListItems.qml:114 msgid "Move" msgstr "Siirrä" #: NewListItems.qml:163 msgid "Basic" msgstr "" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "" #: NewListItems.qml:163 msgid "Immutable" msgstr "" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "" #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "" #: Pickers.qml:31 msgid "Linear" msgstr "" #: Pickers.qml:63 msgid "Circular" msgstr "" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "" #: Pickers.qml:137 msgid "Clock" msgstr "" #: Pickers.qml:174 msgid "Overlay" msgstr "" #: Popover.qml:38 msgid "Flickable" msgstr "" #: Popover.qml:74 msgid "Action #1" msgstr "Toiminto #1" #: Popover.qml:78 msgid "Action #2" msgstr "Toiminto #2" #: Popover.qml:82 msgid "Action #3" msgstr "Toiminto #3" #: Popover.qml:86 msgid "Action #4" msgstr "Toiminto #4" #: Popover.qml:90 msgid "Action #5" msgstr "Toiminto #5" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "Edistymispalkki" #: ProgressBars.qml:59 msgid "No label" msgstr "" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "" #: Sections.qml:34 msgid "Enabled" msgstr "Käytössä" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "" #: Sliders.qml:42 msgid "Live Update" msgstr "" #: Sliders.qml:57 msgid "Range" msgstr "" #: Sliders.qml:74 msgid "Labels" msgstr "" #: Sliders.qml:85 msgid "Small" msgstr "" #: Sliders.qml:87 msgid "Medium" msgstr "" #: Sliders.qml:89 msgid "Large" msgstr "" #: TextInputs.qml:50 msgid "Type me in..." msgstr "" #: TextInputs.qml:56 msgid "Password" msgstr "Salasana" #: TextInputs.qml:67 msgid "Numbers" msgstr "Numerot" #: TextInputs.qml:78 msgid "Read-only" msgstr "Vain luku" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "Vuorovaikutus ei ole sallittu" #: TextInputs.qml:107 msgid "Default" msgstr "Oletus" #: TextInputs.qml:129 msgid "Rich Text" msgstr "" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "" #: UbuntuShape.qml:73 msgid "Radius" msgstr "" #: UbuntuShape.qml:115 msgid "Image" msgstr "Kuva" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "Liukuväri" ./examples/ubuntu-ui-toolkit-gallery/po/ru.po0000644000015600001650000002171012700370701021372 0ustar jenkinsjenkins# Russian translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-03-04 21:21+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "О программе..." #: ActionBars.qml:68 msgid "Short list" msgstr "" #: ActionBars.qml:79 msgid "Number of slots" msgstr "" #: ActionBars.qml:92 msgid "Long list" msgstr "" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "Отключено" #: Animations.qml:24 msgid "NumberAnimation" msgstr "" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "" #: Animations.qml:58 msgid "Standard Durations" msgstr "" #: Animations.qml:62 msgid "Snap" msgstr "" #: Animations.qml:98 msgid "Fast" msgstr "" #: Animations.qml:134 msgid "Slow" msgstr "" #: Animations.qml:159 msgid "Sleepy" msgstr "" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "" #: Buttons.qml:37 msgid "Stroke" msgstr "" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "Цвет" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "Значок" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "Значок+Текст" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "Свёрнуто" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "Развёрнуто" #: Colors.qml:30 msgid "Orange" msgstr "Оранжевый" #: Colors.qml:36 msgid "Light grey" msgstr "Светло-серый" #: Colors.qml:42 msgid "Dark grey" msgstr "Тёмно-серый" #: Colors.qml:48 msgid "Red" msgstr "Красный" #: Colors.qml:54 msgid "Green" msgstr "Зелёный" #: Colors.qml:60 msgid "Blue" msgstr "Синий" #: Colors.qml:66 msgid "Purple" msgstr "Фиолетовый" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "Открыть" #: Icons.qml:29 msgid "Scaling" msgstr "Масштабирование" #: Icons.qml:79 msgid "Theme" msgstr "" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "" #: ListItems.qml:33 msgid "Subtitled" msgstr "" #: ListItems.qml:37 msgid "Secondary label" msgstr "" #: ListItems.qml:52 msgid "ThinDivider" msgstr "" #: ListItems.qml:73 msgid "Progression" msgstr "" #: ListItems.qml:82 msgid "Single value" msgstr "" #: ListItems.qml:86 msgid "Value" msgstr "Значение" #: ListItems.qml:91 msgid "Multi value" msgstr "Несколько значений" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "Значение 1" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "Значение 2" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "Значение 3" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "Значение 4" #: ListItems.qml:103 msgid "Item selector" msgstr "" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "Значение 5" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "Значение 6" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "Значение 7" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "Значение 8" #: ListItems.qml:190 msgid "Control" msgstr "" #: ListItems.qml:202 msgid "Removable" msgstr "" #: ListItems.qml:205 msgid "Slide to remove" msgstr "" #: ListItems.qml:215 msgid "Reset" msgstr "Сброс" #: ListItems.qml:226 msgid "Grouped list" msgstr "" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "" #: ListItems.qml:364 msgid "Expandable" msgstr "" #: NewListItems.qml:39 msgid "Colored" msgstr "" #: NewListItems.qml:42 msgid "Highlight color" msgstr "" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "Редактировать" #: NewListItems.qml:114 msgid "Move" msgstr "Переместить" #: NewListItems.qml:163 msgid "Basic" msgstr "" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "" #: NewListItems.qml:163 msgid "Immutable" msgstr "" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "Без разделителя" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "Это второе значение" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "" #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "" #: Pickers.qml:31 msgid "Linear" msgstr "" #: Pickers.qml:63 msgid "Circular" msgstr "" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "" #: Pickers.qml:137 msgid "Clock" msgstr "" #: Pickers.qml:174 msgid "Overlay" msgstr "" #: Popover.qml:38 msgid "Flickable" msgstr "" #: Popover.qml:74 msgid "Action #1" msgstr "" #: Popover.qml:78 msgid "Action #2" msgstr "" #: Popover.qml:82 msgid "Action #3" msgstr "" #: Popover.qml:86 msgid "Action #4" msgstr "" #: Popover.qml:90 msgid "Action #5" msgstr "" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "" #: ProgressBars.qml:59 msgid "No label" msgstr "" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "" #: Sections.qml:34 msgid "Enabled" msgstr "" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "" #: Sliders.qml:42 msgid "Live Update" msgstr "" #: Sliders.qml:57 msgid "Range" msgstr "" #: Sliders.qml:74 msgid "Labels" msgstr "" #: Sliders.qml:85 msgid "Small" msgstr "" #: Sliders.qml:87 msgid "Medium" msgstr "" #: Sliders.qml:89 msgid "Large" msgstr "" #: TextInputs.qml:50 msgid "Type me in..." msgstr "" #: TextInputs.qml:56 msgid "Password" msgstr "" #: TextInputs.qml:67 msgid "Numbers" msgstr "" #: TextInputs.qml:78 msgid "Read-only" msgstr "" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "" #: TextInputs.qml:107 msgid "Default" msgstr "" #: TextInputs.qml:129 msgid "Rich Text" msgstr "" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "" #: UbuntuShape.qml:73 msgid "Radius" msgstr "" #: UbuntuShape.qml:115 msgid "Image" msgstr "" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "" ./examples/ubuntu-ui-toolkit-gallery/po/es.po0000644000015600001650000002323312700370701021355 0ustar jenkinsjenkins# Spanish translation for ubuntu-ui-toolkit # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-03-28 06:18+0000\n" "Last-Translator: Adolfo Jayme \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "Acerca de...." #: ActionBars.qml:68 msgid "Short list" msgstr "Lista corta" #: ActionBars.qml:79 msgid "Number of slots" msgstr "" #: ActionBars.qml:92 msgid "Long list" msgstr "Lista larga" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "Desactivado" #: Animations.qml:24 msgid "NumberAnimation" msgstr "" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "Estándar" #: Animations.qml:58 msgid "Standard Durations" msgstr "Duraciones estándares" #: Animations.qml:62 msgid "Snap" msgstr "" #: Animations.qml:98 msgid "Fast" msgstr "Rápido" #: Animations.qml:134 msgid "Slow" msgstr "Lento" #: Animations.qml:159 msgid "Sleepy" msgstr "Dormilón" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "Llamar" #: Buttons.qml:37 msgid "Stroke" msgstr "Trazo" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "Color" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "Llamar %1" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "Icono" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "Icono y texto" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "Contraído" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "Expandido" #: Colors.qml:30 msgid "Orange" msgstr "Naranja" #: Colors.qml:36 msgid "Light grey" msgstr "Gris claro" #: Colors.qml:42 msgid "Dark grey" msgstr "Gris oscuro" #: Colors.qml:48 msgid "Red" msgstr "Rojo" #: Colors.qml:54 msgid "Green" msgstr "Verde" #: Colors.qml:60 msgid "Blue" msgstr "Azul" #: Colors.qml:66 msgid "Purple" msgstr "Púrpura" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "Abrir" #: Icons.qml:29 msgid "Scaling" msgstr "Escalado" #: Icons.qml:79 msgid "Theme" msgstr "Tema" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "Etiqueta" #: ListItems.qml:33 msgid "Subtitled" msgstr "Subtitulado" #: ListItems.qml:37 msgid "Secondary label" msgstr "Etiqueta secundaria" #: ListItems.qml:52 msgid "ThinDivider" msgstr "" #: ListItems.qml:73 msgid "Progression" msgstr "Progreso" #: ListItems.qml:82 msgid "Single value" msgstr "Valor único" #: ListItems.qml:86 msgid "Value" msgstr "Valor" #: ListItems.qml:91 msgid "Multi value" msgstr "Valor múltiple" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "Valor 1" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "Valor 2" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "Valor 3" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "Valor 4" #: ListItems.qml:103 msgid "Item selector" msgstr "Selector de elementos" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "Expansible" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "Selección múltiple" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "Modelo personalizado" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "Valor 5" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "Valor 6" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "Valor 7" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "Valor 8" #: ListItems.qml:190 msgid "Control" msgstr "Control" #: ListItems.qml:202 msgid "Removable" msgstr "Extraíble" #: ListItems.qml:205 msgid "Slide to remove" msgstr "Deslizar para borrar" #: ListItems.qml:215 msgid "Reset" msgstr "Restablecer" #: ListItems.qml:226 msgid "Grouped list" msgstr "Lista con grupos" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "UbuntuListView" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "" #: ListItems.qml:364 msgid "Expandable" msgstr "Expansible" #: NewListItems.qml:39 msgid "Colored" msgstr "Coloreado" #: NewListItems.qml:42 msgid "Highlight color" msgstr "Color de resaltado" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "Delegados de acción personalizados" #: NewListItems.qml:111 msgid "Edit" msgstr "Editar" #: NewListItems.qml:114 msgid "Move" msgstr "Mover" #: NewListItems.qml:163 msgid "Basic" msgstr "Básico" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "Divisor coloreado" #: NewListItems.qml:163 msgid "Immutable" msgstr "No modificable" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "Sin divisor" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "Selector de opciones" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "Este es el segundo valor" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "Érase una vez una historia que nadie contó." #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "Altura personalizada de contenedor" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "Sin selección inicial, desplazable." #: Pickers.qml:31 msgid "Linear" msgstr "Lineal" #: Pickers.qml:63 msgid "Circular" msgstr "Circular" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "Infinito" #: Pickers.qml:137 msgid "Clock" msgstr "Reloj" #: Pickers.qml:174 msgid "Overlay" msgstr "Superposición" #: Popover.qml:38 msgid "Flickable" msgstr "" #: Popover.qml:74 msgid "Action #1" msgstr "Acción n.º 1" #: Popover.qml:78 msgid "Action #2" msgstr "Acción n.º 2" #: Popover.qml:82 msgid "Action #3" msgstr "Acción n.º 3" #: Popover.qml:86 msgid "Action #4" msgstr "Acción n.º 4" #: Popover.qml:90 msgid "Action #5" msgstr "Acción n.º 5" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "Barra de progreso" #: ProgressBars.qml:59 msgid "No label" msgstr "Sin etiqueta" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "Indicador de actividad" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "Tamaños" #: Sections.qml:34 msgid "Enabled" msgstr "Activado" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "Título" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "Valor real: %1" #: Sliders.qml:42 msgid "Live Update" msgstr "" #: Sliders.qml:57 msgid "Range" msgstr "Intervalo" #: Sliders.qml:74 msgid "Labels" msgstr "Etiquetas" #: Sliders.qml:85 msgid "Small" msgstr "Pequeño" #: Sliders.qml:87 msgid "Medium" msgstr "Mediano" #: Sliders.qml:89 msgid "Large" msgstr "Grande" #: TextInputs.qml:50 msgid "Type me in..." msgstr "" #: TextInputs.qml:56 msgid "Password" msgstr "Contraseña" #: TextInputs.qml:67 msgid "Numbers" msgstr "Números" #: TextInputs.qml:78 msgid "Read-only" msgstr "Solo lectura" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "Interacciones no permitidas" #: TextInputs.qml:107 msgid "Default" msgstr "Predeterminado" #: TextInputs.qml:129 msgid "Rich Text" msgstr "Texto enriquecido" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "No activada" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "Activada" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "" #: UbuntuShape.qml:73 msgid "Radius" msgstr "Radio" #: UbuntuShape.qml:115 msgid "Image" msgstr "Imagen" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "Gradiente" ./examples/ubuntu-ui-toolkit-gallery/po/ubuntu-ui-toolkit-gallery.pot0000644000015600001650000002034112700370701026204 0ustar jenkinsjenkins# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit-gallery\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: About.qml:34 msgid "About..." msgstr "" #: ActionBars.qml:68 msgid "Short list" msgstr "" #: ActionBars.qml:79 msgid "Number of slots" msgstr "" #: ActionBars.qml:92 msgid "Long list" msgstr "" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "" #: Animations.qml:24 msgid "NumberAnimation" msgstr "" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "" #: Animations.qml:58 msgid "Standard Durations" msgstr "" #: Animations.qml:62 msgid "Snap" msgstr "" #: Animations.qml:98 msgid "Fast" msgstr "" #: Animations.qml:134 msgid "Slow" msgstr "" #: Animations.qml:159 msgid "Sleepy" msgstr "" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "" #: Buttons.qml:37 msgid "Stroke" msgstr "" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "" #: Colors.qml:30 msgid "Orange" msgstr "" #: Colors.qml:36 msgid "Light grey" msgstr "" #: Colors.qml:42 msgid "Dark grey" msgstr "" #: Colors.qml:48 msgid "Red" msgstr "" #: Colors.qml:54 msgid "Green" msgstr "" #: Colors.qml:60 msgid "Blue" msgstr "" #: Colors.qml:66 msgid "Purple" msgstr "" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "" #: Icons.qml:29 msgid "Scaling" msgstr "" #: Icons.qml:79 msgid "Theme" msgstr "" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "" #: ListItems.qml:33 msgid "Subtitled" msgstr "" #: ListItems.qml:37 msgid "Secondary label" msgstr "" #: ListItems.qml:52 msgid "ThinDivider" msgstr "" #: ListItems.qml:73 msgid "Progression" msgstr "" #: ListItems.qml:82 msgid "Single value" msgstr "" #: ListItems.qml:86 msgid "Value" msgstr "" #: ListItems.qml:91 msgid "Multi value" msgstr "" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "" #: ListItems.qml:103 msgid "Item selector" msgstr "" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "" #: ListItems.qml:190 msgid "Control" msgstr "" #: ListItems.qml:202 msgid "Removable" msgstr "" #: ListItems.qml:205 msgid "Slide to remove" msgstr "" #: ListItems.qml:215 msgid "Reset" msgstr "" #: ListItems.qml:226 msgid "Grouped list" msgstr "" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "" #: ListItems.qml:364 msgid "Expandable" msgstr "" #: NewListItems.qml:39 msgid "Colored" msgstr "" #: NewListItems.qml:42 msgid "Highlight color" msgstr "" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "" #: NewListItems.qml:114 msgid "Move" msgstr "" #: NewListItems.qml:163 msgid "Basic" msgstr "" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "" #: NewListItems.qml:163 msgid "Immutable" msgstr "" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "" #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "" #: Pickers.qml:31 msgid "Linear" msgstr "" #: Pickers.qml:63 msgid "Circular" msgstr "" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "" #: Pickers.qml:137 msgid "Clock" msgstr "" #: Pickers.qml:174 msgid "Overlay" msgstr "" #: Popover.qml:38 msgid "Flickable" msgstr "" #: Popover.qml:74 msgid "Action #1" msgstr "" #: Popover.qml:78 msgid "Action #2" msgstr "" #: Popover.qml:82 msgid "Action #3" msgstr "" #: Popover.qml:86 msgid "Action #4" msgstr "" #: Popover.qml:90 msgid "Action #5" msgstr "" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "" #: ProgressBars.qml:59 msgid "No label" msgstr "" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "" #: Sections.qml:34 msgid "Enabled" msgstr "" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "" #: Sliders.qml:42 msgid "Live Update" msgstr "" #: Sliders.qml:57 msgid "Range" msgstr "" #: Sliders.qml:74 msgid "Labels" msgstr "" #: Sliders.qml:85 msgid "Small" msgstr "" #: Sliders.qml:87 msgid "Medium" msgstr "" #: Sliders.qml:89 msgid "Large" msgstr "" #: TextInputs.qml:50 msgid "Type me in..." msgstr "" #: TextInputs.qml:56 msgid "Password" msgstr "" #: TextInputs.qml:67 msgid "Numbers" msgstr "" #: TextInputs.qml:78 msgid "Read-only" msgstr "" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "" #: TextInputs.qml:107 msgid "Default" msgstr "" #: TextInputs.qml:129 msgid "Rich Text" msgstr "" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "" #: UbuntuShape.qml:73 msgid "Radius" msgstr "" #: UbuntuShape.qml:115 msgid "Image" msgstr "" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "" ./examples/ubuntu-ui-toolkit-gallery/po/ug.po0000644000015600001650000002145012700370701021360 0ustar jenkinsjenkins# Uyghur translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-10-07 06:36+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Uyghur \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "" #: ActionBars.qml:68 msgid "Short list" msgstr "" #: ActionBars.qml:79 msgid "Number of slots" msgstr "" #: ActionBars.qml:92 msgid "Long list" msgstr "" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "چەكلەنگەن" #: Animations.qml:24 msgid "NumberAnimation" msgstr "" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "ئۆلچەملىك" #: Animations.qml:58 msgid "Standard Durations" msgstr "" #: Animations.qml:62 msgid "Snap" msgstr "توغرىلا" #: Animations.qml:98 msgid "Fast" msgstr "تېز" #: Animations.qml:134 msgid "Slow" msgstr "ئاستا" #: Animations.qml:159 msgid "Sleepy" msgstr "ئۇيقۇلۇق" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "چاقىر" #: Buttons.qml:37 msgid "Stroke" msgstr "سىزىق" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "رەڭ" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "سىنبەلگە + تېكىست" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "قاتلاندى" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "كېڭەيتىلگەن" #: Colors.qml:30 msgid "Orange" msgstr "قىزغۇچ سېرىق" #: Colors.qml:36 msgid "Light grey" msgstr "" #: Colors.qml:42 msgid "Dark grey" msgstr "" #: Colors.qml:48 msgid "Red" msgstr "قىزىل" #: Colors.qml:54 msgid "Green" msgstr "يېشىل" #: Colors.qml:60 msgid "Blue" msgstr "كۆك" #: Colors.qml:66 msgid "Purple" msgstr "بىنەپشە" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "ئاچ" #: Icons.qml:29 msgid "Scaling" msgstr "كۆرسىتىش نىسبىتى" #: Icons.qml:79 msgid "Theme" msgstr "ئۆرنەك" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "ئەن" #: ListItems.qml:33 msgid "Subtitled" msgstr "" #: ListItems.qml:37 msgid "Secondary label" msgstr "" #: ListItems.qml:52 msgid "ThinDivider" msgstr "" #: ListItems.qml:73 msgid "Progression" msgstr "" #: ListItems.qml:82 msgid "Single value" msgstr "" #: ListItems.qml:86 msgid "Value" msgstr "قىممەت" #: ListItems.qml:91 msgid "Multi value" msgstr "" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "" #: ListItems.qml:103 msgid "Item selector" msgstr "" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "" #: ListItems.qml:190 msgid "Control" msgstr "تىزگىن" #: ListItems.qml:202 msgid "Removable" msgstr "كۆچمە" #: ListItems.qml:205 msgid "Slide to remove" msgstr "" #: ListItems.qml:215 msgid "Reset" msgstr "ئەسلىگە قايتۇر" #: ListItems.qml:226 msgid "Grouped list" msgstr "" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "" #: ListItems.qml:364 msgid "Expandable" msgstr "" #: NewListItems.qml:39 msgid "Colored" msgstr "" #: NewListItems.qml:42 msgid "Highlight color" msgstr "" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "" #: NewListItems.qml:114 msgid "Move" msgstr "" #: NewListItems.qml:163 msgid "Basic" msgstr "" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "" #: NewListItems.qml:163 msgid "Immutable" msgstr "" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "" #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "" #: Pickers.qml:31 msgid "Linear" msgstr "سىزىقلىق" #: Pickers.qml:63 msgid "Circular" msgstr "چەمبەر" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "چەكسىز" #: Pickers.qml:137 msgid "Clock" msgstr "سائەت" #: Pickers.qml:174 msgid "Overlay" msgstr "دەستىلە" #: Popover.qml:38 msgid "Flickable" msgstr "" #: Popover.qml:74 msgid "Action #1" msgstr "" #: Popover.qml:78 msgid "Action #2" msgstr "" #: Popover.qml:82 msgid "Action #3" msgstr "" #: Popover.qml:86 msgid "Action #4" msgstr "" #: Popover.qml:90 msgid "Action #5" msgstr "" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "سۈرئەت بالداق" #: ProgressBars.qml:59 msgid "No label" msgstr "" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "" #: Sections.qml:34 msgid "Enabled" msgstr "" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "" #: Sliders.qml:42 msgid "Live Update" msgstr "" #: Sliders.qml:57 msgid "Range" msgstr "" #: Sliders.qml:74 msgid "Labels" msgstr "" #: Sliders.qml:85 msgid "Small" msgstr "" #: Sliders.qml:87 msgid "Medium" msgstr "" #: Sliders.qml:89 msgid "Large" msgstr "" #: TextInputs.qml:50 msgid "Type me in..." msgstr "" #: TextInputs.qml:56 msgid "Password" msgstr "" #: TextInputs.qml:67 msgid "Numbers" msgstr "" #: TextInputs.qml:78 msgid "Read-only" msgstr "" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "" #: TextInputs.qml:107 msgid "Default" msgstr "" #: TextInputs.qml:129 msgid "Rich Text" msgstr "" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "" #: UbuntuShape.qml:73 msgid "Radius" msgstr "" #: UbuntuShape.qml:115 msgid "Image" msgstr "" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "" ./examples/ubuntu-ui-toolkit-gallery/po/fr.po0000644000015600001650000002246212700370701021360 0ustar jenkinsjenkins# French translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-10-25 22:47+0000\n" "Last-Translator: Jean-Marc \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "À propos..." #: ActionBars.qml:68 msgid "Short list" msgstr "Liste courte" #: ActionBars.qml:79 msgid "Number of slots" msgstr "" #: ActionBars.qml:92 msgid "Long list" msgstr "Liste longue" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "Désactivé" #: Animations.qml:24 msgid "NumberAnimation" msgstr "" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "Standard" #: Animations.qml:58 msgid "Standard Durations" msgstr "Durées standards" #: Animations.qml:62 msgid "Snap" msgstr "" #: Animations.qml:98 msgid "Fast" msgstr "Rapide" #: Animations.qml:134 msgid "Slow" msgstr "Lente" #: Animations.qml:159 msgid "Sleepy" msgstr "" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "" #: Buttons.qml:37 msgid "Stroke" msgstr "" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "Couleur" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "Appeler %1" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "Icône" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "Icône + texte" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "Replié" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "Déployé" #: Colors.qml:30 msgid "Orange" msgstr "Orange" #: Colors.qml:36 msgid "Light grey" msgstr "Gris clair" #: Colors.qml:42 msgid "Dark grey" msgstr "Gris foncé" #: Colors.qml:48 msgid "Red" msgstr "Rouge" #: Colors.qml:54 msgid "Green" msgstr "Vert" #: Colors.qml:60 msgid "Blue" msgstr "Bleu" #: Colors.qml:66 msgid "Purple" msgstr "Violet" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "Ouvrir" #: Icons.qml:29 msgid "Scaling" msgstr "Redimensionnement" #: Icons.qml:79 msgid "Theme" msgstr "Thème" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "" #: ListItems.qml:33 msgid "Subtitled" msgstr "Sous-titré" #: ListItems.qml:37 msgid "Secondary label" msgstr "Champ secondaire" #: ListItems.qml:52 msgid "ThinDivider" msgstr "" #: ListItems.qml:73 msgid "Progression" msgstr "Progression" #: ListItems.qml:82 msgid "Single value" msgstr "Valeur unique" #: ListItems.qml:86 msgid "Value" msgstr "Valeur" #: ListItems.qml:91 msgid "Multi value" msgstr "Valeurs multiples" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "Valeur 1" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "Valeur 2" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "Valeur 3" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "Valeur 4" #: ListItems.qml:103 msgid "Item selector" msgstr "" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "Expansion" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "Sélection multiple" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "Modèle personnalisé" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "Valeur 5" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "Valeur 6" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "Valeur 7" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "Valeur 8" #: ListItems.qml:190 msgid "Control" msgstr "Contrôle" #: ListItems.qml:202 msgid "Removable" msgstr "Supprimable" #: ListItems.qml:205 msgid "Slide to remove" msgstr "Glisser pour supprimer" #: ListItems.qml:215 msgid "Reset" msgstr "Réinitialiser" #: ListItems.qml:226 msgid "Grouped list" msgstr "Liste groupée" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "" #: ListItems.qml:364 msgid "Expandable" msgstr "Extensible" #: NewListItems.qml:39 msgid "Colored" msgstr "Coloré" #: NewListItems.qml:42 msgid "Highlight color" msgstr "Couleur de surbrillance" #: NewListItems.qml:71 msgid "Leading actions" msgstr "" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "Éditer" #: NewListItems.qml:114 msgid "Move" msgstr "Déplacer" #: NewListItems.qml:163 msgid "Basic" msgstr "" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "" #: NewListItems.qml:163 msgid "Immutable" msgstr "Immuable" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "Sélecteur d'options" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "Ceci est la seconde valeur" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "" #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "Hauteur de conteneur personnalisée" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "Aucune sélection initiale, défilable." #: Pickers.qml:31 msgid "Linear" msgstr "Linéaire" #: Pickers.qml:63 msgid "Circular" msgstr "Circulaire" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "Infini" #: Pickers.qml:137 msgid "Clock" msgstr "Horloge" #: Pickers.qml:174 msgid "Overlay" msgstr "" #: Popover.qml:38 msgid "Flickable" msgstr "" #: Popover.qml:74 msgid "Action #1" msgstr "Action #1" #: Popover.qml:78 msgid "Action #2" msgstr "Action #2" #: Popover.qml:82 msgid "Action #3" msgstr "Action #3" #: Popover.qml:86 msgid "Action #4" msgstr "Action #4" #: Popover.qml:90 msgid "Action #5" msgstr "Action #5" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "Barre de progression" #: ProgressBars.qml:59 msgid "No label" msgstr "Pas de champ" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "Indicateur d'activité" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "Tailles" #: Sections.qml:34 msgid "Enabled" msgstr "Activé" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "Titre" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "Valeur réelle : %1" #: Sliders.qml:42 msgid "Live Update" msgstr "" #: Sliders.qml:57 msgid "Range" msgstr "Plage" #: Sliders.qml:74 msgid "Labels" msgstr "" #: Sliders.qml:85 msgid "Small" msgstr "" #: Sliders.qml:87 msgid "Medium" msgstr "" #: Sliders.qml:89 msgid "Large" msgstr "" #: TextInputs.qml:50 msgid "Type me in..." msgstr "Tapez du texte ici..." #: TextInputs.qml:56 msgid "Password" msgstr "Mot de passe" #: TextInputs.qml:67 msgid "Numbers" msgstr "Nombres" #: TextInputs.qml:78 msgid "Read-only" msgstr "Lecture seule" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "Aucune interaction autorisée" #: TextInputs.qml:107 msgid "Default" msgstr "Par défaut" #: TextInputs.qml:129 msgid "Rich Text" msgstr "Texte enrichi" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "Décoché" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "Coché" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "Aspect" #: UbuntuShape.qml:73 msgid "Radius" msgstr "Rayon" #: UbuntuShape.qml:115 msgid "Image" msgstr "Image" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "Dégradé" ./examples/ubuntu-ui-toolkit-gallery/po/de.po0000644000015600001650000002344012700370701021336 0ustar jenkinsjenkins# German translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-08-12 21:44+0000\n" "Last-Translator: Phillip Sz \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "Über …" #: ActionBars.qml:68 msgid "Short list" msgstr "Kurze Liste" #: ActionBars.qml:79 msgid "Number of slots" msgstr "Anzahl der Slots" #: ActionBars.qml:92 msgid "Long list" msgstr "Lange Liste" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "Deaktiviert" #: Animations.qml:24 msgid "NumberAnimation" msgstr "Zahlenanimation" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "Standard" #: Animations.qml:58 msgid "Standard Durations" msgstr "Standarddauer" #: Animations.qml:62 msgid "Snap" msgstr "Einrasten" #: Animations.qml:98 msgid "Fast" msgstr "Schnell" #: Animations.qml:134 msgid "Slow" msgstr "Langsam" #: Animations.qml:159 msgid "Sleepy" msgstr "Schläfrig" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "Anruf" #: Buttons.qml:37 msgid "Stroke" msgstr "Geste" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "Farbe" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "Rufe %1 an" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "Symbol" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "Symbol+Text" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "Eingeklappt" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "Ausgeklappt" #: Colors.qml:30 msgid "Orange" msgstr "Orange" #: Colors.qml:36 msgid "Light grey" msgstr "Hellgrau" #: Colors.qml:42 msgid "Dark grey" msgstr "Dunkelgrau" #: Colors.qml:48 msgid "Red" msgstr "Rot" #: Colors.qml:54 msgid "Green" msgstr "Grün" #: Colors.qml:60 msgid "Blue" msgstr "Blau" #: Colors.qml:66 msgid "Purple" msgstr "Lila" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "Öffnen" #: Icons.qml:29 msgid "Scaling" msgstr "Skalierung" #: Icons.qml:79 msgid "Theme" msgstr "Thema" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "voraus- und nachgehende Aktionen" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "Bezeichnung" #: ListItems.qml:33 msgid "Subtitled" msgstr "Untertitelt" #: ListItems.qml:37 msgid "Secondary label" msgstr "Etikett" #: ListItems.qml:52 msgid "ThinDivider" msgstr "Dünner Trennstrich" #: ListItems.qml:73 msgid "Progression" msgstr "Verlauf" #: ListItems.qml:82 msgid "Single value" msgstr "Einzelner Wert" #: ListItems.qml:86 msgid "Value" msgstr "Wert" #: ListItems.qml:91 msgid "Multi value" msgstr "Mehrere Werte" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "Wert 1" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "Wert 2" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "Wert 3" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "Wert 4" #: ListItems.qml:103 msgid "Item selector" msgstr "Objektwähler" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "Ausdehnung" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "Mehrfachauswahl" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "Angepasstes Modell" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "Wert 5" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "Wert 6" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "Wert 7" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "Wert 8" #: ListItems.qml:190 msgid "Control" msgstr "Steuerung" #: ListItems.qml:202 msgid "Removable" msgstr "Entfernbar" #: ListItems.qml:205 msgid "Slide to remove" msgstr "Schieben zum Entfernen" #: ListItems.qml:215 msgid "Reset" msgstr "Zurücksetzen" #: ListItems.qml:226 msgid "Grouped list" msgstr "Gruppierte Liste" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "Ubuntu-Listenansicht" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "Erweiterbare Spalte" #: ListItems.qml:364 msgid "Expandable" msgstr "Erweiterbar" #: NewListItems.qml:39 msgid "Colored" msgstr "Farbig" #: NewListItems.qml:42 msgid "Highlight color" msgstr "Farbe für Hervorhebungen" #: NewListItems.qml:71 msgid "Leading actions" msgstr "vorausgehende Aktionen" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "nachfolgende Aktionen" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "" #: NewListItems.qml:111 msgid "Edit" msgstr "Bearbeiten" #: NewListItems.qml:114 msgid "Move" msgstr "Verschieben" #: NewListItems.qml:163 msgid "Basic" msgstr "Standard" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "Farbiger Teiler" #: NewListItems.qml:163 msgid "Immutable" msgstr "Unveränderbar" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "No divider" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "Optionswähler" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "Das ist der zweite Wert" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "Falsches Üben von Xylophonmusik quält jeden größeren Zwerg" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "Es war einmal eine Geschichte, die niemand erzählt hat." #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "Angepasste Containerhöhe" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "Keine Vorauswahl, verschiebbar." #: Pickers.qml:31 msgid "Linear" msgstr "Linear" #: Pickers.qml:63 msgid "Circular" msgstr "Kreisförmig" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "Unbegrenzt" #: Pickers.qml:137 msgid "Clock" msgstr "Uhr" #: Pickers.qml:174 msgid "Overlay" msgstr "Überlagerung" #: Popover.qml:38 msgid "Flickable" msgstr "Verschiebbar" #: Popover.qml:74 msgid "Action #1" msgstr "Aktion #1" #: Popover.qml:78 msgid "Action #2" msgstr "Aktion #2" #: Popover.qml:82 msgid "Action #3" msgstr "Aktion #3" #: Popover.qml:86 msgid "Action #4" msgstr "Aktion #4" #: Popover.qml:90 msgid "Action #5" msgstr "Aktion #5" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "Fortschrittsanzeige" #: ProgressBars.qml:59 msgid "No label" msgstr "Ohne Label" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "Aktivitätsanzeiger" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "Größen" #: Sections.qml:34 msgid "Enabled" msgstr "Aktiviert" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "" "Das Erscheinungsbild des Blatts ist noch unfertig und sieht deshalb noch " "etwas klobig aus." #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "Titel" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "Aktueller Wert: %1" #: Sliders.qml:42 msgid "Live Update" msgstr "Echtzeitaktualisierung" #: Sliders.qml:57 msgid "Range" msgstr "Bereich" #: Sliders.qml:74 msgid "Labels" msgstr "Beschriftungen" #: Sliders.qml:85 msgid "Small" msgstr "Klein" #: Sliders.qml:87 msgid "Medium" msgstr "Mittel" #: Sliders.qml:89 msgid "Large" msgstr "Groß" #: TextInputs.qml:50 msgid "Type me in..." msgstr "Hier eintippen …" #: TextInputs.qml:56 msgid "Password" msgstr "Passwort" #: TextInputs.qml:67 msgid "Numbers" msgstr "Nummern" #: TextInputs.qml:78 msgid "Read-only" msgstr "Nur lesen" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "Hier kann man nichts eintippen" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "Keine Interaktion erlaubt" #: TextInputs.qml:107 msgid "Default" msgstr "Vorgabe" #: TextInputs.qml:129 msgid "Rich Text" msgstr "Rich Text" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "Nicht ausgewählt" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "Geprüft" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "Seitenverhältnis" #: UbuntuShape.qml:73 msgid "Radius" msgstr "Radius" #: UbuntuShape.qml:115 msgid "Image" msgstr "Bild" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "Steigung" ./examples/ubuntu-ui-toolkit-gallery/po/zh_CN.po0000644000015600001650000002320212700370701021743 0ustar jenkinsjenkins# Chinese (Simplified) translation for ubuntu-ui-toolkit # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-ui-toolkit package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-ui-toolkit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-11-05 10:04+0100\n" "PO-Revision-Date: 2015-12-03 02:44+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Chinese (Simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-16 06:06+0000\n" "X-Generator: Launchpad (build 17947)\n" #: About.qml:34 msgid "About..." msgstr "关于…" #: ActionBars.qml:68 msgid "Short list" msgstr "短列表" #: ActionBars.qml:79 msgid "Number of slots" msgstr "槽数量" #: ActionBars.qml:92 msgid "Long list" msgstr "长列表" #: ActionBars.qml:102 Buttons.qml:91 Sections.qml:45 TextInputs.qml:90 #: Toggles.qml:45 Toggles.qml:83 msgid "Disabled" msgstr "已禁用" #: Animations.qml:24 msgid "NumberAnimation" msgstr "数字动画" #: Animations.qml:28 Buttons.qml:28 Dialog.qml:29 ListItems.qml:25 #: ProgressBars.qml:29 ProgressBars.qml:85 Sheet.qml:40 Sheet.qml:73 #: Sliders.qml:28 TextInputs.qml:46 msgid "Standard" msgstr "标准" #: Animations.qml:58 msgid "Standard Durations" msgstr "标准长度" #: Animations.qml:62 msgid "Snap" msgstr "快照" #: Animations.qml:98 msgid "Fast" msgstr "快速" #: Animations.qml:134 msgid "Slow" msgstr "慢速" #: Animations.qml:159 msgid "Sleepy" msgstr "困倦" #: Buttons.qml:32 Buttons.qml:41 Buttons.qml:77 Buttons.qml:85 Buttons.qml:95 msgid "Call" msgstr "呼叫" #: Buttons.qml:37 msgid "Stroke" msgstr "笔触" #: Buttons.qml:47 Icons.qml:54 msgid "Color" msgstr "彩色" #: Buttons.qml:53 #, qt-format msgid "Call %1" msgstr "呼叫 %1" #: Buttons.qml:63 Buttons.qml:120 ListItems.qml:43 msgid "Icon" msgstr "图标" #: Buttons.qml:72 Buttons.qml:134 msgid "Icon+Text" msgstr "图标+文本" #: Buttons.qml:105 OptionSelectors.qml:41 msgid "Collapsed" msgstr "已收起" #: Buttons.qml:148 ListItems.qml:120 OptionSelectors.qml:47 msgid "Expanded" msgstr "已展开" #: Colors.qml:30 msgid "Orange" msgstr "橙" #: Colors.qml:36 msgid "Light grey" msgstr "浅灰" #: Colors.qml:42 msgid "Dark grey" msgstr "深灰" #: Colors.qml:48 msgid "Red" msgstr "红" #: Colors.qml:54 msgid "Green" msgstr "绿" #: Colors.qml:60 msgid "Blue" msgstr "蓝" #: Colors.qml:66 msgid "Purple" msgstr "紫" #: Dialog.qml:32 Popover.qml:42 Sheet.qml:43 Sheet.qml:76 msgid "Open" msgstr "打开" #: Icons.qml:29 msgid "Scaling" msgstr "缩放" #: Icons.qml:79 msgid "Theme" msgstr "主题" #: ListItemLayouts.qml:208 NewListItems.qml:79 msgid "Leading and trailing actions" msgstr "前置和拖尾动作" #: ListItems.qml:28 ListItems.qml:36 ListItems.qml:46 ListItems.qml:60 #: ListItems.qml:66 ListItems.qml:76 ListItems.qml:85 ListItems.qml:94 #: ListItems.qml:160 ListItems.qml:173 ListItems.qml:193 msgid "Label" msgstr "标签" #: ListItems.qml:33 msgid "Subtitled" msgstr "副标题" #: ListItems.qml:37 msgid "Secondary label" msgstr "二级标签" #: ListItems.qml:52 msgid "ThinDivider" msgstr "分割线" #: ListItems.qml:73 msgid "Progression" msgstr "进度" #: ListItems.qml:82 msgid "Single value" msgstr "单一值" #: ListItems.qml:86 msgid "Value" msgstr "值" #: ListItems.qml:91 msgid "Multi value" msgstr "多值" #: ListItems.qml:95 ListItems.qml:113 ListItems.qml:122 ListItems.qml:132 #: ListItems.qml:161 ListItems.qml:176 OptionSelectors.qml:33 #: OptionSelectors.qml:84 OptionSelectors.qml:99 msgid "Value 1" msgstr "值1" #: ListItems.qml:96 ListItems.qml:114 ListItems.qml:123 ListItems.qml:133 #: ListItems.qml:162 ListItems.qml:177 OptionSelectors.qml:85 #: OptionSelectors.qml:100 msgid "Value 2" msgstr "值2" #: ListItems.qml:97 ListItems.qml:115 ListItems.qml:124 ListItems.qml:134 #: ListItems.qml:163 ListItems.qml:178 OptionSelectors.qml:86 #: OptionSelectors.qml:101 msgid "Value 3" msgstr "值3" #: ListItems.qml:98 ListItems.qml:116 ListItems.qml:125 ListItems.qml:135 #: ListItems.qml:164 ListItems.qml:179 OptionSelectors.qml:87 #: OptionSelectors.qml:102 msgid "Value 4" msgstr "值4" #: ListItems.qml:103 msgid "Item selector" msgstr "项目选择器" #: ListItems.qml:112 TextInputs.qml:117 msgid "Expanding" msgstr "展开" #: ListItems.qml:129 OptionSelectors.qml:54 msgid "Multiple Selection" msgstr "多项选择" #: ListItems.qml:139 OptionSelectors.qml:62 msgid "Custom Model" msgstr "定制模型" #: ListItems.qml:165 ListItems.qml:180 OptionSelectors.qml:88 #: OptionSelectors.qml:103 msgid "Value 5" msgstr "值5" #: ListItems.qml:166 ListItems.qml:181 OptionSelectors.qml:89 #: OptionSelectors.qml:104 msgid "Value 6" msgstr "值6" #: ListItems.qml:167 ListItems.qml:182 OptionSelectors.qml:90 #: OptionSelectors.qml:105 msgid "Value 7" msgstr "值7" #: ListItems.qml:168 ListItems.qml:183 OptionSelectors.qml:91 #: OptionSelectors.qml:106 msgid "Value 8" msgstr "值8" #: ListItems.qml:190 msgid "Control" msgstr "控制" #: ListItems.qml:202 msgid "Removable" msgstr "可移除" #: ListItems.qml:205 msgid "Slide to remove" msgstr "滑动以移除" #: ListItems.qml:215 msgid "Reset" msgstr "重置" #: ListItems.qml:226 msgid "Grouped list" msgstr "分组列表" #: ListItems.qml:261 msgid "UbuntuListView" msgstr "UbuntuListView" #: ListItems.qml:321 msgid "ExpandablesColumn" msgstr "ExpandablesColumn" #: ListItems.qml:364 msgid "Expandable" msgstr "可扩展" #: NewListItems.qml:39 msgid "Colored" msgstr "彩色" #: NewListItems.qml:42 msgid "Highlight color" msgstr "高亮颜色" #: NewListItems.qml:71 msgid "Leading actions" msgstr "前置动作" #: NewListItems.qml:75 msgid "Trailing actions" msgstr "拖尾动作" #: NewListItems.qml:84 msgid "Custom action delegates" msgstr "自定动作代表" #: NewListItems.qml:111 msgid "Edit" msgstr "编辑" #: NewListItems.qml:114 msgid "Move" msgstr "移动" #: NewListItems.qml:163 msgid "Basic" msgstr "基础" #: NewListItems.qml:163 NewListItems.qml:168 NewListItems.qml:169 #: NewListItems.qml:213 NewListItems.qml:214 msgid "Colored divider" msgstr "彩色分割" #: NewListItems.qml:163 msgid "Immutable" msgstr "不可更改" #: NewListItems.qml:163 NewListItems.qml:170 NewListItems.qml:215 msgid "No divider" msgstr "无分割" #: OptionSelectors.qml:24 msgid "Option Selector" msgstr "选项选择器" #: OptionSelectors.qml:34 msgid "This is the second value" msgstr "这是第二个值" #: OptionSelectors.qml:35 msgid "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat." msgstr "" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. " "我能吞下玻璃而不伤身体。" #: OptionSelectors.qml:36 msgid "Once upon a time there was a story nobody told." msgstr "很久很久以前,有个未曾被人诉说的故事。" #: OptionSelectors.qml:83 msgid "Custom container height" msgstr "定制容器高度" #: OptionSelectors.qml:96 msgid "No initial selection, scrollable." msgstr "无初始选定,可滚动。" #: Pickers.qml:31 msgid "Linear" msgstr "线性" #: Pickers.qml:63 msgid "Circular" msgstr "环形" #: Pickers.qml:100 ProgressBars.qml:49 msgid "Infinite" msgstr "无限" #: Pickers.qml:137 msgid "Clock" msgstr "时钟" #: Pickers.qml:174 msgid "Overlay" msgstr "叠加" #: Popover.qml:38 msgid "Flickable" msgstr "可翻转" #: Popover.qml:74 msgid "Action #1" msgstr "动作 #1" #: Popover.qml:78 msgid "Action #2" msgstr "动作 #2" #: Popover.qml:82 msgid "Action #3" msgstr "动作 #3" #: Popover.qml:86 msgid "Action #4" msgstr "动作 #4" #: Popover.qml:90 msgid "Action #5" msgstr "动作 #5" #: ProgressBars.qml:24 msgid "Progress Bar" msgstr "进度条" #: ProgressBars.qml:59 msgid "No label" msgstr "无标签" #: ProgressBars.qml:81 msgid "Activity Indicator" msgstr "活动指示器" #: ProportionalShape.qml:28 msgid "Sizes" msgstr "尺寸" #: Sections.qml:34 msgid "Enabled" msgstr "已启用" #: Sheet.qml:28 msgid "The visual style of the Sheet is early work and thus clunky looking." msgstr "由于是早期成果,所以表单的视觉效果有些粗笨。" #: Sheet.qml:53 Sheet.qml:86 msgid "Title" msgstr "标题" #: Sliders.qml:36 Sliders.qml:51 Sliders.qml:68 Sliders.qml:93 #, qt-format msgid "Actual value: %1" msgstr "实际值: %1" #: Sliders.qml:42 msgid "Live Update" msgstr "实时更新" #: Sliders.qml:57 msgid "Range" msgstr "范围" #: Sliders.qml:74 msgid "Labels" msgstr "标签" #: Sliders.qml:85 msgid "Small" msgstr "小" #: Sliders.qml:87 msgid "Medium" msgstr "中" #: Sliders.qml:89 msgid "Large" msgstr "大" #: TextInputs.qml:50 msgid "Type me in..." msgstr "把我输入..." #: TextInputs.qml:56 msgid "Password" msgstr "密码" #: TextInputs.qml:67 msgid "Numbers" msgstr "号码" #: TextInputs.qml:78 msgid "Read-only" msgstr "只读" #: TextInputs.qml:82 msgid "Nobody type here" msgstr "没人在这里输入" #: TextInputs.qml:94 msgid "No interaction allowed" msgstr "不允许交互" #: TextInputs.qml:107 msgid "Default" msgstr "默认" #: TextInputs.qml:129 msgid "Rich Text" msgstr "富文本" #: Toggles.qml:28 Toggles.qml:66 msgid "Unchecked" msgstr "未勾选" #: Toggles.qml:36 Toggles.qml:74 msgid "Checked" msgstr "已勾选" #: UbuntuShape.qml:28 msgid "Aspect" msgstr "宽高比" #: UbuntuShape.qml:73 msgid "Radius" msgstr "半径" #: UbuntuShape.qml:115 msgid "Image" msgstr "图像" #: UbuntuShape.qml:134 msgid "Gradient" msgstr "渐变" ./examples/ubuntu-ui-toolkit-gallery/WidgetsModel.qml0000644000015600001650000000774412700370701023103 0ustar jenkinsjenkins/* * Copyright 2013-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 ListModel { ListElement { objectName: "actionBarElement" label: "ActionBar" source: "ActionBars.qml" } ListElement { objectName: "animationsElement" label: "Animations" source: "Animations.qml" } ListElement { objectName: "bottomEdgeHintElement" label: "Bottom Edge" source: "BottomEdgePage.qml" } ListElement { objectName: "buttonsElement" label: "Buttons" source: "Buttons.qml" } ListElement { objectName: "colorsElement" label: "Colors" source: "Colors.qml" } ListElement { objectName: "crossFadeImageElement" label: "CrossFadeImage" source: "CrossFadeImage.qml" } ListElement { objectName: "dialogsElement" label: "Dialog" source: "Dialog.qml" } ListElement { objectName: "iconsElement" label: "Icons" source: "Icons.qml" } ListElement { objectName: "labelsElement" label: "Label" source: "Label.qml" } ListElement { objectName: "newListItemsElement" label: "List items (new)" source: "NewListItems.qml" } ListElement { objectName: "listItemsElement" label: "List Items (old)" source: "ListItems.qml" } ListElement { objectName: "listItemLayoutElement" label: "ListItem Layouts" source: "ListItemLayouts.qml" } ListElement { objectName: "navigationElement" label: "Navigation" source: "Navigation.qml" } ListElement { objectName: "optionSelectorsElement" label: "Option Selector" source: "OptionSelectors.qml" } ListElement { objectName: "pageHeaderElement" label: "Page header" source: "PageHeaders.qml" } ListElement { objectName: "pickersElement" label: "Pickers" source: "Pickers.qml" } ListElement { objectName: "popoversElement" label: "Popover" source: "Popover.qml" } ListElement { objectName: "progressBarsElement" label: "Progress and activity" source: "ProgressBars.qml" } ListElement { objectName: "proportionalShapesElement" label: "Proportional shapes" source: "ProportionalShape.qml" } ListElement { objectName: "sectionsElement" label: "Sections" source: "Sections.qml" } ListElement { objectName: "sheetsElement" label: "Sheet" source: "Sheet.qml" } ListElement { objectName: "slidersElement" label: "Slider" source: "Sliders.qml" } ListElement { objectName: "swipeAreaElement" label: "SwipeArea" source: "SwipeAreaPage.qml" } ListElement { objectName: "textinputsElement" label: "Text Field" source: "TextInputs.qml" } ListElement { objectName: "togglesElement" label: "Toggles" source: "Toggles.qml" } ListElement { objectName: "ubuntuListViewElement" label: "Ubuntu ListView" source: "UbuntuListViews.qml" } ListElement { objectName: "ubuntuShapesElement" label: "Ubuntu Shape" source: "UbuntuShape.qml" } } ./examples/ubuntu-ui-toolkit-gallery/nav_pagestack@8.png0000644000015600001650000050001612700370701023473 0ustar jenkinsjenkinsPNG  IHDR"bKGD pHYs  tIME9$% IDATxԽi]Wu%iӦ$8F@N`~׹GΝB _?Mco  `ʿGzK`>OYس,77\Uy2j-Ewݻ96Hy]ٟ/Zrz1QP pJ OjHAJ PJ!s,Cv A k0^w?_w#{}l=Ozw |}^u eiE IxM2glRӻ<Ϳ˿}0M&y.0\re1o-*SB5)0Ƃ0ZTVcs%T IC Zk7qѠ!IcjΌ1*d{;pi:lP^U L ^Eyprl>~;pù_ƃ=`Md rU^vccfgg~.hoהGrV{oeGȏG(!<8P'Xs|`C޿y%>o!M*!0F#2C7?O_{-['AJ%K+ ./f-P rz wM}M1\(g!l~^HYcnn333}oMqT\V:h.v;"`W!\t?͇= # 0_!70kKC3e g`ݶ@%A7á;k1o*.k[~C) IaxLcaрT.Q̢"hC+.^4==>ޚj5jI"nZ HB$jȲ; Xa'?o}[w>? jfK{wمZ믻|#}/}v}33sR4җ {go ҕ+W>hZm;bgk lbғ- N:rQRSA^Dޤ*r"HRÃpZxXÃQ]y] a 61KPpA0BB0h MTZ ŤEjCAl4̱^5M4 ReȲ e<|*TU4M<$EGa2 ^nԫE('ﳳg<ロ׿w[w;g=^T[gO?8zJ cxl_ݷvj) 3H@JoI>M1(",{( Iq-E6~<{$ԃFT-*3)+e18epseF0 XEX ( hY?`~7}D R@07$>HmI%0X<9&Lṳ̌TJVc3Zi*$\I0n֨M-X,c+҄w] sH)166^`g8+.Z׽w\ b-w}Rn7ps֭[o|JĎ93'9äXh C SQi!yC ˻z[2{^2/ ȳE6?7'Εq崜8$"iraVSC4^z#C0t8EK9>sK5Yо& ڄ};KeQDKV *d䤴`%QP `sV;"@`q&#0̅&a$N@s%K-'YrtfjI!brI^jRmXbPTxV$Ru.3eZ1JFyJ)giZc:̜?q~'@ ^ ;wr9Z|mcϙ`}aDn[|eU?:\w[߄} Ⱥho:t\ Ksa,4 `ԸfB5x1@UU眵󸬀l0~Ƌő:2 G*vƣp]"0Tޛ&E0 abXfE @덙$9B̑[%rҨMHk ]?DBFsbbv 6^(j{Y?IDՓ4MƔ1%j!H@ J8N(euiJ AFpa? j7&On'6ʇV{y.n*zo4`? f}iFDjd6Ćz3#!h,"2HQz42[!Le>ӵp#$(i:<# A ϧ3 w06 BPS Sj-ϥL*+D@ft^nH%~Ž6uFA4@Rj})8`ՠJ))2R+F0ժSZ~`-O>wgkw ڒJ$BuXw\%iQZR EN|穛s3Ǒ,6T߀b9L"ħKlGy|2! ]fnN[~|;яje+?pq0H-ؖ3@i"P`Ec`;pZ;-X-6D"ȕ5QQ>9>xj R=F " /wx6!u JH%r[|o] *uqP4 )$ 2 R!X-:2Ov[t5QO؜B kj K@1l%ILjV$s&*_> "L^^ RjZIAPF!U )4>@s3 _]_Uwo]I_~ J}dߡE{eޗz[GKi=ͯzў-(3N|$\^{D9zyR;юj It]TUdYgd1K$ ڝ (0R!SsPB`*&n333;8u߳Dֽ,H Z51# @%*y̳b'Ѩn \h̝:9ӜyF#x\ 0\*0}㻟i9@)*{O|irlrx9ehXkܤ&2J Q B[ 5,]4Mo߹`vI]=\N([D.)-+w{) aRx(.4Kq Q9oU #qU̪с_© ވkF~a`ŪhMbX|9Zcch6V!jŋ2 PJQ5$ZH :kB X4= /^ij X /7ֿ? na0M j{ ˕doܧryY1EYaY2ҴY8vY}d^ef~.QTmwpQ`GAj}{) 搊RJ8y8Sv`ص}&63k֘ư<@&k':GO@ #XR*2KlN\b"1(gB:~HP2@F I ՙ$Iʨ&E Ok 5 jka/Y Wۿ#]b+؄8.E9>s=S0>MS0P 3cT" *ʀ Zl"S> Q2JZ+nQ4P^[-(:SPTgp~XK|@f9)C!^d&%*PX ~n6c9825}#Ml ̝tNoLۨ*+%V8]3hXk+`B F,^ngeXvxW!$XpD9n/׿Z瞻xi0hdaZP#aogoen0`KHE"FCS>0"(\ f s( vwr9]w]J N eRfTV#@'3DښOI@ fI9^s#"ItڧKM71erSr`U"d:*W<FN8 Ma@NȥeJ)pKX+)bDA rIz'Nņ][+&s0yB >g~o~ӀPi[ 2xMhI3`8ݠڲ4xvk\ t+E¸KQ !^ DDa \iys C&n"R'.RJ0FY0YgpuO I@I=RwN=*g}h6k}݅:K/sZ5%ETV,k_zp_C Ǟ_&9,PeTXb]jıtZ PPZ-乺7 7@,PrLsYd'`⢆Jj4Bt pV/ XE<~yU A1KRy22A.EL~JaX `RP&qf$,ERrXD @&J6`)LfNp@%.sIg-k3,fslx/I"DKY",RPΙ@$Tg$M*QΨRf}itR.y/c#WC{c/zō27ˡrB%ێH8hFv{ .C*ޅ5SpVo˻W;7;⳽ڛЮc@@z')H)Ajx=`ACGd⌚;a l"xXgȆd{SZdF:D/\B@cXljR(p pS,WF^\d^UZ 193C{99r՝ǔI I)baBuT(x mKyϑg~,hp*N"c IDATIV)GEFKgTyYc< NXXf!a q=nKdU!-5VZ@[@#@W2Bp*A A^ ::<cZk(EeUViMi#i#q26^mK'(QWʀ,V-!/-3gn133䬳ΆAށy7E~Y/6uY5*#+7&-LyfKŖ3  0 Q` dצJϙk YPE¥Su%" sr',ٿ hgθi?.,.@+8TF6?4|%Hٗ\ѝmwaFDP P*WFɨ%%R5ssTˬB J)8'2chB(a%,C1@@lkCk m-*n\ @߰  $^bҼn=?~}s69g 1hI.bnqP!.KldUѲdUzVT9-mNapoqs?rnx:Nk4M^ Y?ne ;pR(w|!λ(Q__uze3PƜf.@S}{j@rE-&oMNNCA)lU1 řȞ3jRBcZc˃ug6*n1 8kUV;gH EG* wkt)l践t+QH8 Cbp(ftt]Zў:b0t}GXgϗzӀbdjJ B\ז$H*MRVjj-K`s& <6FR 0Z{~1#ҺxIqF;(:~:  U7, N9r~X`:d Vˤ$Gp|I@  64irep0xg]dH0kc%[pAii4Dz )=nt 202p bm2oe_ J<~O L)Z 0J(1Vfِ,<Ȟxõ9Z_z7]KM@&w $\[k-ĠO/EO}>ދ>՟EE1T%ڧF0WF"Yp|;o#xϬېp&ԃfH"lcA@() Aɱla5 ZkUԂu2(-%(Y P`!t̸32Oj,s(~ּvc{p)xe 0er kXL^7.A^ Cj@"2 J8sUQ!=&([x?@^z$}Sdž\T *3PEA-vzA%*BILCJЁDU$ȳ6g(u kGXRIJi Cd Z cɳ,(2՗mn(|p2k*jKJ|r""yhm}kf|(;k0y9g_ib݀O6|J$Қw3 $J WOAm|zwRClфn{I]-y}a(Oќyi2xs-HFaN&_װQf%{.3bcEM"py\Zv+BD=מ,<6;yR&IU$() @Fc3V*jZUgȰ3frw)bpcZ*F7$[e5.Q%2H`iіWPc`Kf0FaL#>ȼYɹ +4VyphB'J KVQ2!o%!A ]EDŒeAo<7hK ߏ&Ɉ` j/E9‘/ދlZ؜N\{udu_3?AH$I1^,rHWk56&"jU&URr^NpwKK]GR&1!87>{FXa%`<adr5@ZdRt'Vbzm4̈́A I رzÙx`msr1 L&8l t1"96YT~%fKX"u<8 _ :X۶4+eZoBg?V4^/t KIQ9o~cg=uXr dw m[(Ú=@'N8jXDѸH@x&ȝ;w8TSg=4<.Nw B{ Ļ'<3w~s@|M: OE6/t̡ONNN2,_ >zS>@_>Y(Y GNxO?_O8x2 ;,PQT]A -=$VZEaE)g>2f<Ϗ|`Jy](K4N]p8Uw7dX^c VZ=t:hZزe >Ak4Mq7nG _BZ-<8r."<eWnkk֬ƍ1;;Ç㬳B8tO=1Moz.]9@VC'> ́1;SZԩS† 0;;ZhV\5k`rrO=*݋n /___F^/1Zp\ׯ_i`ٲeQq!|EJªUm6.M7݄%+|7pCq\p ,^f\s 9|xW/~1~w~R8qj|+l2,]7p7WXl^Wþ!%#+^${Zk.]2p9(l@LVȸq嗣g>ꫯ|Fe8s033ZVc z<ꪫ066&&& ĥ^ظq#6oތ[nUW]ǏX3'FAիW?M6ᩧ~l߾{/ك4Mq1,fff/~?8:>ࡇRE[&ر> /_ 6`rr{.y€/XhsNٳ6mž={?Ūyk%\Ǐc޽M6կ~5}Q8qb^g-]{*-Ek-n˻ϊ={˖yӾg:Nj &9CugMͮ',zٳ<n6}ݸ{j0;;[h^G=#lZ73Cz:5p++3 ,@p a(2= F13Ú>oz-`Ώ0Uޞs7v21J.#71_jbFJݘU IDATyoqe%܎dPdh~!+\8vލCHׯNJ+%b x x*Zk$I2onX1vq 4}q`{|'Tl1'(*O$W Lh05W`塠9} C@YPO &2Pbᆗ,J ևE%KR.0\py&''|Ї}v:u [n=܃v]jpcݻw _8j;J2bj*Z{1|sCX=(Hj0x' .0g {k=Rj ×pD* I|mbOa5pNI$%*#wŊ53]rmmۣýnu,Sew ۿ+Zky#G@7 ̛o@=k)J4)2,TkqKu[eVx'b'>k׮'DT#<4MQp}1bm 㓟$كz O>$~;v>'|ۿ,..\.c{{x衇Evލ~AX^^F?Z@B]GZ/aƧv!}>φRi@($Nds/}"9+NT+#3hauIJwp6!VWWQTPVE͖>ܹs_u _VWWO㡇c {,c8s .]˗/C]we8t2Z>+_ 066o?o4cX__GZ=܃vJ_~sڵ 0&y$$w24kϝnJ ]ĵ~h<0~6ar3JXKw͈WR8zv?+gU6tRF\T*Hn5x*VVVckk f1=z.las{K###v|".ӟ?ZpmpqQZnL눢V <{{8{,}QLMMa{{;|ESP!&w};CV a.+|kpbI=I5N`b;cݕݗ JetP Rd Vvi1G JeA^6VVV0>>]KaW2FsTU\z_ױk.|=c_n6ϵ>&H3Q9)}T*̊q?)bu'V)~f2'I;?."➯߳BJE…Nz$ShC(7LO}uXRP'WUnϼA۱c.s3_w7/ K6KC\#I|)~$?w ?kD5PMn3@<!$w~s'|WO J5d)gyY~W_Fc1̍ajj˲KMPp10.e%C;vkkZr 9:!V!cavZ)%%Z-t] [t,=c AeT*٤ETBݶ׵z.֝&ͤy>Oss8S|D=)ao~q|k&7LtƎ)L;wM#p4[x່! RMF#2>>VeDOt F:>8m&&InkWsαiWe nd&ɦ$ܴ[pAFþ\m0nˈs'Ҡ{M?ul*NRһ3%r: _Zg7*TrPBgEUI!)˄CC ޼X[T64ZwtKv ܔi+x7(q rs؏ndvYzu#~?48k >ZR`n8m}j(mw0(7zy*gWBnmmGJQΒkL2WZһcn p*J:ݧ!V FTP,9˹,>7`.εHn.n0[-n~vʇqcU[u4C<&>[jsa\IOP` j 3˰8oɯ."Y(k}%@ĿynkyXX,DQA1VnZivc%X%MvXe;i'uX%RPBiکjus:|mnw]EC(Г97z1Vh#Mv(J#bqj-JQMIӴaf9_*Fjݿy7MӶ,i k4KQ;_+|jnT*3nw݌yB0h4MӴ;44t`kkyF4M;zjuZz]s JihfLjRZBVRЌ_$@1nq!7y஻OM\@췙r7>>O.ϭ |Oᬠ~JyV2sr8kO|8uTȢ>c7' {EkX%$yWx1Я؝~/]dk>_3pReȌN= [[d(L~gtE\סk(i˞zu#;i>:Ǚ#|vq>'-cx^>?$}GEmR׉9sA^7:9G\}>9<+S|3.ku @uꎳHq;޳9W2;;[r߭٢k{?rЪ2E{:M CCEEyF٧B=z$"gggggg^׋z8??'z8;;[s;?? ϟb1|3tgonG1>_ gx_h蜟ט199Yo[28avvv^&'']gЌggg/]?#]} 3ftɯK ҥKM}|l9qĐs Y׋"Ű!Ίk#v2 Ɣ^T0푑dҥKzrF-ԏ~%B'N iyɅheer_x !6M/]@=;`_ti&y~~l&vֿ.]&y&s<`Y΂!0\t<+Dj\polɓ'̂|:;;[u 1|fyy9GJEYqt7q* !,a皱woo9^\hhԄ(VS5Y?>_=r|.Mv81`+9p^?Pz>-(e58|s>w|O'=05>*8yo Pښ&-ezMv;CYI=i"97?ŏ;~'N! `ePZ^^~stt4j:Fl6$NLL.%l6kZ<{Tix1<(RNJXݢܱ31v{= N暦j/nAj АB85l@~$Nڰӌl:XX?44 r33U8)r͖1>>~1cٓ4W#0Ɛ$ *S4922JU!q>Z]~ꠟTPצ $d?=~ͪ |755uT1| :$DyՊS-ԻHSyZ S?O<܋E5ЯNgBȴ p eJ_¤# N[}KKq\$ù:u7I` }}Ӟt4ʈ>UPy~ gDqlf' ڻOg*s {I6i:A͒g'8 gġ|M(E]_G@Z + ,@VVr?;EAw2G~L?K_'GZNнn וI?ӏ]1$6hz.SRd(Yյ= 3!NMKVVVre\_]k^Kp67Dh^. r92?ahs>G׷n'>YFwRW.% !$=ג>fg}_xV<)$g3nNR9Ek9jbtQM[oȑ# 4ET )Kd]dc9Jy4 }ݖ@(J~:nܸcǎ7o"cI`ǎ`Fy333h4 Z&*FFF0::޽7o=܃V[naxxb(X__ʊA={/_|{<Μ9Fyu bΝ--ѣGd T8C%Um;Kw'vRGMo]`|m"s>c~l27xcW԰!e!dcLqs~YYmƂ3ǩDHQ((R)_cJtL;lzWbssibss (j4::۷o֭[HX[[Ԕ,..ѣ˗q5$Ie,//R`ݨjh6~6vލqbttػw/E8OP1߿7n@VÇڡC$ 0&''k. 6c-k`4 ]_ҍ\bA {ONNBf]?AoLp%+4FI@uwL ՙ7n6.EwN(RNQ?.8==A(A {5+T*ahhNׯlZa  VAݽ{7* E@ mX[[C6h_600+Wŋ>͠?M-6vڅt: `nnB;wҒ(ꫯЯ9Ko|͗vǕv4_kBA@LЭp'h666У I2vskWǤّS b{Aصk4E¡Cnh4>Vj;wNX,RQׯ_FG>}o/CJӧOcuuV&\.cmm 1a֭[ػw/!طo* 03rnAرcn ?nvi$I-:tfӊ !~eY*{nq; IDATZ- `ss(!z=8W6yǹ t|H-Q!Ki1e~ DVm;B099>>"]&`LMŅQR.߁cs7n}3;v@Bh6?a$Ib4I8 &&*w[JSsgJ:`Ν;wԫvCCCF݆0LЩ)$IVQݻi""LOORjV(DZd'NPRN6Oo>[} WtOjԇRCeHwb'wG;S=(n{HRAIX`j38r (ejdHW6Rnkqkպm{]Ӵx5J4:&$.`n-ՙpJSUl&g͋vb5bxv %S疯*g{ _~~%N~=O=V׵/d~MF?ܿ86C1w/P9 u,)7gz}hߟK>ߺDW?qeWa~JڏݢOz9 @o\>E 1wnI㻁{>S5fL=ۖfR'tkV Js=X烺h/h_qj}{?n ~)np{>vyy6@$DPA'O}SM۰szgq6< nYAV5祗.,1$L|(M4yʏ̚S+=۠jϑAru,)!d ) RJ+:$tT_x.5N@㒨Io 3(E1cf`$= VKդN c{.J):N cƏϴܺ=o q@e_r R)WK[*)'#R$Д[aBvcH@IH)A T+V!IO^JŢ*&fZJP`| VPԟ pae!0Ӂ2ot!:.*E%za$*^Z}<9Rﶤih0"œPgn.$U4{|)RPjy i*T)B P-L2ߵ TJ!@$f54_h b1u@MޅŤlm䤝TPUoL@`@9P("T?utsbQrnۃYC$dceim)'$ Wi܉~Y75IJPO}TKlu :Ra,iN(J@T¥NJ|Zݩ5@Y}iWA@Q=s<䚲46w7-P!+>J>+'^Td+f]RMaRuKORrP\PBV^*uSr'l"'nGo.biwDS ImX)Yk-Sp&IIp)!$wYDQ|o!N7zjib .ɹRrp PK$+pO*7HHpg @ Aw`X̺߯FPB:~ aTO(%RBii"7a4]ޑHv^36Aרg+.ڐcw[ wmzD肆 PQ )9/r ]1={ccc/ r9x5o 7߄*VnA4MKBކ\ f'U)׹^U(p&;A6 QB.R.@%  @sSzoJaܰ (ŃB!8@$Trd3>ipqRLz\N.s{2Ik& rY6nGxد\3ܩuP~acch6p&&&P.1=˫hxqq ɥ^o_|9|3AExwqlll`mm O@ӈOYh0djI HG&)$~lR+TΓL{R!bH8֐a n>+# -@H b,PP[ZΙ~Lu+p"h6YѦiCy3i98zJg>={w} @,U) TAe vVw1*s˗/^ZbnnHgϞm\|'NJ8tn߾FCaxxO<&VWW뮻lP^tn|whDZs|-#v0XJ!H_\ ?Lz{%8Fl2DCdʺ+Idu$'o0PJv'xOk$Iril4Zxe  Taj7Q\Jo(?\6 H %(bZX[i܆D0ֵO…dQT?|\9?ZUF$dt Be9WѺJdO^>}/"!ߏ~5v({Ym c8f8~8N<7o⭷B6Bȗ!Y6OUܪ'KgT=|N^„R)*!%BB+@X$v!6piT@pp&6!yx>Ma9R" $JTc$>gTKWj]*1VXZ'znv@ʅIvM$Bè<")@ e@ Kt`CeRjG* %%G155V̙3سg:}Q={O~LNNž}pH)o>{˿={`bbAĉHw_]^^ Q 5Ѯ (q|uh68qX[31:>®]Gyn=ujP(pa$Ia8qBjtNGDo> -!@ξ8S$$@0@cni*lO&p.2*! +2+s)3fӁ`w,dx\p9IF{ dߌN$V~>l)t$re@&۱!@Q$җ{_:w~o_}@-p@E ($E8PVJ]%MPYn ) ڭRMRB0W^_ _SZK]{avϹHNJڲW_MQ07 rw €R̞9 [b1`@[%pH0DA'8X@Z0eR07%PDty_D3ۡIa !@4N ;7]s@ D160u brܒPIB)A@Ԁ Ki0xp.G_l2,J'+$0`Y%e3PH=#U"aGrzh(2EWFgMرcrU8*D#A h6a r@M 2,[] %PRQnPѰU#YFSeT@M'dlKniinT;Hn-\O'T[ 澄4}b8I4,);EVꝥ97L#kpƙh z;vthaq^...]@3"DW1P'e|WIP.VK^‰Q E< 6ֱ L-޴G-RipƯ ѧ7ʊbzk),/nv*D)>ۇ3g;WQoz<(s7pEj3L/~ #6U߅n|EXO_gG΢^x뭷pa:u :\cǎ̙3xpu]ؽ{72:>6z)}6ʽp8u^yCYgxo8~8fǎcC<'6*71%\u !3pM/%Tj|<{U&0̊\MqVK@Z$ijjTC t!GKYa/YƘ4VW׺{ݼcpV&h4ñ'tc7޼#;Fmb,M8r(A!‡݇b )2z kkxw]A_~:^}U0n83Ϡ MS\z?8^|1==}{xgpko8x ς1:^|E ?xrr}goArtM(X(Y >ef1jWl${@mКUv * k<ޤHf8=Y*U*#z q;+4\Ab t:*LND46R,q C61s(~W)~SxTBa u;ǧ>)رo6}:tnP7 ;Fw>g?fffcss?</###xW055}s=|_Km]S ,WMF2_ڐe|lRȞ̞ 9n@y%x\+ %v䳌"RZm kEGU=2eWVV"169`%btt?E8M IDAT8c~;&3֭täFLAR$Q*U_(Xmnq ]7XX@mx𛿍 ~G mYV9~,Mo}}PV+-3nwW%4h6ڱBLJhhZc"@Yٔ!5iɪ~xrH: j\ 27I㦅37&K_$QwQ\z\85Iˊ(ԲY1Ua?;.ckqT*咪ϛzjX_D.lv$/Chƍ9Zƭq ho " 5'G/` Zf"E'nlٷODȘ#acLcWƁuCVX D!2#% 8UyYҬ<, w;N 33q݀ѧ|f|a~4,dKɞG.Rz){ӝI*)ϖ eA2pEMD~m:N=*w^CbBE'( mbsk#% Thci6q[oS?w7hQJKmoըdP)J/5"L0/Wկ~8hȈYp~,{inr \ wR2~4c3z hZOZWpPam 5ovk174݈յ.LɼC/aP5)U1s1cL^G18:,~ةTGq#`l|8FrH#RC*BDSNu;\l9 H.zm݈a: ̥d] 3S!&r mѣb=-n]mPV*l! đp`s/=k hu*Dg{qԡNLB%^yb8K\a>BP*^`d0E1>)4H[lІ#DY6*ŊA5)~օTӿDR .N:ۨNRJP_#,pKYp )S+Y 47h~ݶ-Ƥ6)osEQ[0pp0\}I]c-M Ã$@h{OG]|:^E1s}7FvBh0\DFbazRqkZZ+j].An>]]U͆2d&չR[X: 7@{r0}LnMIEiv-jIz"|҃h4Y%ro i.~3WߣTjDX]`F:CQ'Ks3P_+Fbޙ̴xqC_ v*C)ARPV *ߛϮH!,+++RO{z!b6ƕX |[TLGjj`k`l]cbH6!3&tmZO8Mr=f._ уJ(KY?_f{g^:W EZl1.JOUD pNʔ*cVj$ 8:ShI Y#eת pKJ"Vx$L6(4siC4e߾qLG?p aoj 8gNB5\.CN7E`r":$aGTwm\"C@rM#҃P )`)ꅓ|Wм[w&wE%Q%0rj1|Epe _! RJ(7`7W(v3dFDN)PHrigS`(HS{uM%gEsnEr:z2O96N@$q'/BrX)|$<'l1%*A4Lb^"RD&e \J[P(WEZH%9BrINfԤ[TJ@c"RANCBTeˆjr NHJr( ME+JԎzp[fd ?)Ni|f%""'Ջf3WXW&bbT4r r CДn=<ܿǢ yCS0-w$Ȁh|MtDZ"㋚)L9*,<Ֆ\gn*sC,؞/&%0JLJ8ZD AT)@@q^!eARH H!S.SHg݄KnM+`m5;J0i'Jb Y2&_0UϮC=K˶#;i}%=fIuYI5P6 ;8 ہ$,̙iodu}9^ݳ vA"!$,Je!۴bbRReټ.%˩8))ȦLP!CI3ٗަq{*M03ݯ߻ﻌeӬ tAgd8Pmjj0$1B[PʂkfeiVvD! \1񻇪#..+x] %ՠr텡U:}nDݧ6n m/6ho"3̓<ؐ&t1}xD y$LutT//k=` "m^yN>cZńG"kaݍ F)|+Ʌ2Gx7֪tQU4uUhM:Sٱ>R o~h!(B ~2eSkԺnoItVFUW@JGU$\Wh$]o,dR`e46(*t·/ #EpCe䲃5 6_7(SjݛQwRÏ&H0aNIr9%Sطl yJl``D3r6VlRr#.^_&y;g0fӰTsTNN'7,^%#Eho骖#+k*sC )[Fmi4yPW .E{,RܖL8wQjR=a 4) 0DUPPt}0 EFhY*gspדdny.81IZ<K-c ̓ɡ!E| V21bnݠ ? i>6QK y26V!58ڤ㡹oXE^R ԥw/1v x%2G ڙiHJd_ kqvR,KU@.\cIP13 kBhKiJ5d! F %:ۢ)#7sAP>=pcɂv.ٷFSC7x(Ũ[=K(v^8.4Za%ei C52-:2V2  }27&幩.°%Z1"5F.- Kgy~jbŔ9Nn*Mfde$wd55+˔Aj`]pXS׺`VL<×T f'Xp6hv*.u5Sk$ZBn+*C}<ݷ䛧h\~u\VMI6^dt:Ud`FNBum TqM /4fx){͍6&Lr;czr?ʟjx HjpGQeݓU_pPGP'2 +-綢 .p%\MV;59[(!_+{vC˞Ycc/acD;L&BNrӡS6aCV >F7_e{nRerh #-(Է-~{~a4SS_mee^4}xQ4ζgmy]cN,R[jBR/ PB/.նeMO7k޷M7Z#[ 7JO}zWmDnկ5y!축eK?:: ❗õݷW?$bsejeֆ^ʹs8z(vZd7J-+L/G5( òJB֯F+xҩWɔۏ3Tյ%~Ċ_yFt]W1*2$mzH9kn樓wEX06=S,_ʉ'?qf]e;}k|g}t/ӳtoefg3?S'yET9{Χb6T묯֚sαSSS9s|+}Zs9>ccct[kzF\|(p2JE^[W],W8{ kK,.`ꊫW9}<]#m?5Sy߶MAia(Gdk$b)&݈D6SՌ:ŋ6mkAj,rx&u[@&3AX27g&1^}n-;w7Szhe1y|t#cte_9ۯ;N0::ʍ7j*Dxŋ|Z׸uwΝ;qX[[w}<lmmq5{Y\\>>,_pyn_g_}DAKZ`̑Pe{s%xi6Qދ[yuoœZ ȂS"#mdzm7񯪅պŨg=d([mNZ YUaT,I.>;E@կȽT>p_{&>Tauq˧O#3\ލT5 v#1{{w Y[[[[(wauu,cqqM<,K.]SϜ9Å ࡇⳟ,_җRN>Y^^gߡ=Wػw/_Pur-dq4Kn\|,\l!s|pӧOGYwy7oFpvDhc?Hnm7t )DK\~_JfTt;@&Щd&Nh2ښE'wG:k"E45#].}9\11>íl W@oo~9W]Jۅ8ul,`DfPҵK,--gVVV[M/%N6F0t]ϡt%?yf%qV֐YB Ơ"ӖOW)F*suzc-o|ftt{'% ?LB D+%eoe4`r1q:$ASq8DML^yu#~;N;+ٌ 8e+*zyr>`ׁ#\z].'5ggǏ? ˍ[욜y[|p'' % /ps<<ܸqdvvǏs8q™={k- =Z|I:UU|N؀OÉo{r mP'T_ hh ue*sb۸"066ƛz?>Ǚclleh -DHkr7 SX̐b{RG4l#S{!y(ʫ&mwN-{mхelna."JkN10te$W_B97qⶓwg}~%%{v%ƻttٷwZot~qyfvOSU??իWSOp<СC(޽~5{A)šC299ɱcG ٳ9vߘK1 -Ѫ+o%2_}FXƩep"f? '⩧ڵkLNNƬ )#;@Yy 7 C{Cҋ{|qǠ-uTO+\jF MN`A ):v6OˍlUvLJd]Hz6g LJnXq,`k;nWZךMcL>Xi@(ktMXZ\㱻+?cmn||aT]cvǸTM_[ʒ:Ξa.OUFm*(,w~ )ə "nm "+!Om,ݕe'2%Hƛʸ/+@dn*<\3 IM Vv#|$JThEA_N-e|ᤱVBiQ(Ņ@Y0AM  AIP4^Oi OYxvh@3dv Pgn1n u]3kb4Ѯ(r0D*4OJ_|fß8HU1D ϝf<읙/y֖VP>uQI2V7VO=hmI,;T0F@$ΌDv;*Mf3.zVVid>k"v:oL\lm*zl42इ@g 䜘~9mGM0"xHϷ7ИڧJTfG~̡`]]vo⡲"e T[H3=grW8x,o6K>`c&/gp :#ێ[ped5S#gB" U=t)Q:oa`MF\hԟz {,d"Cz+GOLq؉2#Ef ҨƯm֨#XđoCi9/N BP4/.3l5;ҍ{vO}ءYGFOpj}XX[e6ɍ;L+87Qds2o*W7Jo\grSzb׆n!5ՠO%TA]V7+~ႄ e0Ӌ>OƋN߆kȓUuEfkZXH,VP=k@AZH6HDVR՛d!"oA n4n)|R:NdM{ ߟ>`HCG'_2wESWuW [Rr]z߃sl^{$GF~n<>v.]gukfj˛W1"`ܾgQ>l N'2H)ohQ) CQuz2 0Hm1Y+Ɵn*QMχvsJ&&%"X[\} mvLL'ei@VzZۗtvol\lo? u @)?AYc$mQn P TfdRf,,`lav8e]jr y o9o~[ǞC{?cbdK[LT[bNd[֡ ɔkfD[qPI8~ʓkAFʫ.IQ !*-_*bf $L!)ְUSxoE[ \$^. m*d)_jxԆڰɛKPX/\w_U;4Ik]ػ' Jn:~noqe>Ə=&v!e? y=\@qn 2wMp t9s(7Y'3%*sMVnwмx(\SN|NQ- pnGg2~*~iABD/^]"bBɼQk|P%nwpAąSD6iiPX>Gҭ)Δ;\f#ʮ]^vj=B=;X Pf~M.}89>0{3ws̑w2ӌf毳GJ)j#g7x\ CLC)FWm ib.TsMMmÓ"ZuI ںӦEWsG 7P0B˦z/Pcf/++rt,#9o\ůy5^{#bmm}b8qQ|꩸5]zfh mucѢ,Ql ;Pْq)oR^>MxFC-%Btȫ[05F(2\r-%VK _8@M +3@!)@P&i~Il(浽($1Ɏ*dRW8y]dClT%a5hAzqy*caO,:VJ"FDÒ(5S[0[Wy,`q:.[F[xr@wCgl}{98=ή^&so< SxUj*l]| Yh}Obj2 }kY?݋2]f# X  MZDz"ycK@ɉnlKpOmUD7%r&,'An`\l{*+4MȆjN,"¯W{}v,˪(FFz#y #wnh[ayi{`n nnatžz=U9@ 4Jshgi9Ն[˫N$q\ہL؎1PB"G9JKJX)?a[KƂH-AMfшl 4HS_@IAFad.RRFYhm!sѩbX3ûSP8hζ:m9PjJ}ςPYV2ۆ$焊[("/7Ku@J״AVb_(S@_dtu4NNU#LL t uy̑BSQec|+?,Q^ o,VOjfaJ{ԢLPXfYN/F/1 l @RG~G z6PW7hyU -Lt҉IB gWQ/[~WBv{aEQۛ$TA!BQZoB,6`mC!:cL 5  0w*u*Lڦ`!dWr{m;чr^v(i}2AP-@Ss&N_@ X#eQEϞh2GQS +K:tadUZ:¹igG̮n6?}b϶M֍dZUSwgg2,lNڋ@̸G?BVxY=gy6}RGҲ\diV(JMC?0o*e;8fB`33jzm('`}Kɔ:iBb@(  D #gC \| 1X"JX6N>8¸ϣ`'wV J ٥}Gr8WMfM-Ri.pXkZuqacLMlu}i%nz0$& S+#eXB]n..."+@JIodl4{W͵\vm,#hQck1<+1C8ޭQmZd(P )Ԇv;HoЪ죤iŴ_!')Oޚ,m l]:,FPk\+kLHJ t9{8_S{ʕv1:94̚L팩4|&#x8ZEC״sS7ϲ"݆.vA Bl0' q֭%(rP&l"lOFo\ѬTT*'@c kֳm˔ȝRJdɔ%SU F 5c:~]+wr@ݿ~D>cUf~ Ug!%s{B8_6e[ C[U3h?E\*%E|J(|@![{vakHSEE!hBb2ps0ZS 4.clllpzЧ*2B1+7266,uh6i&LC }ƂmE {NzF[܁Ѽi)F'  n|#ٞ6 U9 t:%*$ņC&3@Mq"LJ؆#oPH;㷣 QYڕw0lzN -BLjƭaddkֿ|5TFglqGw1b|(fSko2б{2Ǚ3s<4e3*h]* |oi CEecc(`ee%*R stt<F*Tdzմ< {g}}/r%:O<~?ڷ:unC=)_>ɓ'} `||)ʙ`ssG늍dbwDzn2-N~ԬiL0IUTGMEty"/2Mf_ۂ&UD[76PtN'AcRgR;b4uVWؿwΓGwzt0(.65J]c%ր8SEEpa~ 666b ^x~~bll?7?<*EQD^/ȅ xX^^fmmy&''x"N!g>opܹNy^uzkkk|ӟmɯ/~gyO)SSS< VWWaee>7or9yY[[k_=lllP%޽_~-^{5~o~Vw-U$}pèQ#]nB֟!T)˜ׯN5ÎϛdA(Z!D'ҋQv$;""AEu];]w}d:(:m=[f $>Ι3g8}4Yq)8|0 9s}c$/2\tu>빇oYZZҨV ձN!1RVv&Ј ?ۃwWEz"ɩc8#['"C8TT][2>9Z67)\[x[}[,'3?7?\[e{_>o9G!8,K^ufff;x"_җ8w'NppLYK/"SSSnmm++:u@JɅ ƍ e|;C/L!~JLdyw,6X=@6YcwsMz3 />ycNpϽ{~o?21Nv?'G1X^k'0??Ͻ'?IG͛:t˗/sqvލ֚[n3o} )% = &Y^^Fkͽ4x9z(sssw}lnnrfɷ~{^uxG|8p|Ifffxy嗹yf!PAb4f^5TƴJ eڠ-F Yyx_vb6\0صijwR4S{-V|X2k}W@Qo( W)l`UXvr/ n#?9r{\==p8}}YO|#sTCǎ_-EoU"ȏ IDATU_Ge0py?ɲ,Cs\(wy2z>|e<Z=EUU;ʀʲOpneV!: 5(2֖o"6ab냳Oqu<0>e>p<(|u:Z3ĥ1{xx&dss=Ф,j2 "TeY{}pL3RGR%.79Y 7pkkUr;W.1X_be&Yl`Jg u}NFЛ0=9Ch[X:Y6YY$1 =$SeL~R v nkLOOsQZhP>ǑlXlR12X (åviݤ!Q!NaloJnVny?>0T`Bm]B JftDaU AO**G?3u>G#%9S{pkccq}Iaoqi96OV𮒕8%m[ak8'+6T#8 s8T,':V-Zf ȑSu afg.E,}rT4nSm+a36h2e$zt02An'6lx4@WH2+ :,jjztrҭn.{"Yu5@4Fsߟˬn x_QJUɨٿw'pGs"-Pt'ظ],_ơO9zvwPR U{c)7LAƀ %? @/:$ڴEg0 R0"v-gjCuCEz~Xjbj/.ncETHg#!\PL~_r)Ë`b*AtigVXdLFuS}B?8ҥ{EݑuIYqӠ)2%ܺ3'EnӜ~%o\bk}V=+K\t;Gf8?6sk#\S}=HL%i 8)A&WRZ^lء3rKT3Vilڬ}PuhmIDLu4UCذ 5l?UI h?U'H+h `K=YeYfkeds5p1o-r'bpkF2Gr҇&hb;X^ueX[su=2 +k N2 їzzX„qWi2P]Xc"+C)N2pe\KmVUe5U&NJdzZy,β"ZWZAjT6].Z.q9N:#X-V1k?㙤|u6%N<qz$h:fk6.w* o-IDj"Xv>eR}&9҆5{y2No~Jk㹶bmMr,B`ȃBhbߝ^៽S`yxȆ`38 ֗WYШ`su;:,^0Ϗ=q&5G'T_ڏ5⴫]YD6RwQc|O1d>$ 0PAHkW6睸0SiUXEE5lHۂ`1afE+lRm N Cэ@qaSL-츃a㐥})\$X/ܬ*lͭږkSC|cHar2n0u'> o+,]a{79[VD5d:/֓eˆ*< Nb6'7d:FX'׫e SeZ@hoa˦0]TRgN(Bګgsd:nq }8͠Φg'I{ TvʕMt!=0JMtHیFZ)E&sjLTdl| nɉ4oqBfl #JpQ$3,/|?z]3z&C^dc)WY&b|j jN*^Y ܱճц,kz,sƳ(m ݥX:0dx|l cdm?hgoqq ]]՛h7}nDmJc1Lܦi3*GU,m5l&i= M:ò`@K=qZiTKv`12%?K~i6e FU*c}Og4rKDtzq7-b6J>:ΈֈuXUr[G6Tum1KMAyР!-X1U ֩vh锱tVctÔ\[NێJ'S/ y_[u #wPjxؘ<;;y.E]K6 2zESET1s΄CI}꣬s6P b%2-\g>QHE2H )$]WHl|df1Sݤ/-<'A׉& <% O=KƙU:Ö]S]NhD quSY`ÿ=pvٳq4~3Q!ѐN6;kD nvvOyhKq_\ J)u;#c~AWNR❵}ޅ4;8Q0U5`GhT&Z8*j_zIvB8`i¸8l.Umd&f"%ໆx Aptlx`LgK d]yމߗ9)+peA9!'-Qd2yKu]z,]ŏy\K*bgYOo(Ru0)# !%Ӯ7T+*˲\"7FצrX`0`Pd>`-BP*L%H], 0ڸ,I 0t([Le!y~iO85 5ӳV]xXsB|L w Xհ["ӂ[__f}k!,e8ތ~jokCKdP)IvmhUUat?Է:t[Z*ȤNtG0 uE..qβX}EzPا@e.i3 +k T y&)#SJehٚV !jd):nJT17A*=&at./v\4𡭰sXRׅPĶ ?5&ˉ{V,CkP*1]y*b+hS !4X1&h6X[a1޽Hx.8HM7o|!5IÇ64abhj'|F536`U=Ժ$ pvJ^v-RDA-:wVEX5%5n,rN#',.DY!VmCp $)$B d'=dPkM= lD U3ϲiMM$:5. 8A?f`%OJg5dxgJ")GFV[SURdn'oM}$:)6s='B3x/BaFbVՠUJ _r5_晃T3ɳ,6֖&&&9t+ <.FR!?BO:)YlMphCOpYkj):,qX.H4 2&XK|!mܲثԑy>LLC)P&< ӈkC 0DR,K/ WBb5ԞƑ(Uǜ*1U腅rDȀ+% ]\5d![{(y2i˼ 6u~W69CYUuQvt!^mƓkB {haM`vtbR9)rB (sH*'Je6aRPc6Z:eOJQ -F)\mPyt d!O _+{HWHٳ[}/Ty&JX71"bH'Qp'^Z#8 ,LLc%x2>_9Jsϙ~ͰX𡊧Fmr"3; kjZDkG m9o3s ?, 7h5p̰jdReP#*$ oĕ+W8wkkkfnDZqؖ)\Bk*H,N]PDwX; J)׻ߪ"nGm[:]*t6V!4msɱ[VkGi,b.;G~>M1Ă G31k~^Z9,زasΝ=16AEDIQ*٥D)+v$e<$~H9IU*NJKI%i(QHB1 A@14It}3ZyX{W)>4}sY7߿;znC7YkB7{gTn<KKu@ !l#6u%8j\YY_d~~ Ο?Lܽn~5=ޒS+M ‰y\4 +63݌$΃Ff ǟr>7Ԭ=r\![2r$ET*.530Uwƀ*Rg!rYS1 /`@9%khX$Wbeܸq N<ɓ'|r+AI#* -Dwgi2Qy Sb8 *<{X@~2jsHcnp\IY1j59i5#v<h ^C`OCfq.Fs"]nzEdC!:Owa5hͭCZ}MvqhcaJm͸R"Yc{{y ,PRPS;ymmfteѨ\Ckqh0f4$6\ tӪզ6z0m D,$*+jB(*4zX[.EYRӞ~؛A"(F$tJPRQJ{^ x4ʫ`;7O6)̎8j:KeU[઩ǦF#ゐM IÎtN5aM*B֩=o{"J-4l1*_^[:L8Vށ %CV1ZZM*u*Sf1clbV)1VpW[L){b6.:k{yvWv1xK8N3ekԧJovı)Dtk! h鴵+ݿg4bR~p񯑖W=m!TMzbVZRǓ᠄G8 ՞JCXt\\RȞOaN QrjP֘LxqA]i2V,IM=Bu" WiѦl'/yt-M7K,|r-d[kk^ZMv<>}SQQzz6exNu.ifuza3va) Zl2쟣o .lꮙw0[ɪ$Z)W?RZPoV)tdsJ EnDa}*5N͠LNG׀6j !TnT=V,<[x:k:t o'!jQ3z1I; G>h">wi_x đ6fY>xP`pD<㤉4Zzb^ iLP`%vZʹ#MLLS:W'mq-HQ0ٵnz81ge{CDGd*C28ش$mxvtPAV^gZSәl.RJtт!q^tD%~]\0gVhŨJKBO]PҶB!nƕL$.L!et0>4'뽶B|7OQڌ}kM/**SuKetsE%`L=t|U^rTlT+~]ųm c@T1>{[!ѧYkY;fUUzkӄb۴Ԭ+%^"IUr2 [䯁5S0Il=/fɒaEdM7Kb2著qYtmPh@PULW9ZԮTΗl " Q`a}B IDATYgWf mHzV !2Zmrz...:ᘝw+ b2@eͱ,Ѩ%6M`sm3r=Lj,ZKFX9݈)vvvUpv7ƓBaCV+6t,$*e?ՕqwWj ov5CBnv|/H$tKcY U&|[LF(OKV6EQ`Z j}K=:g$Y?G?r:^}w/_O>z ;;7z2rw=e nm\ƚ!ȹì_`5>w>?;=L?Th1-&X KKKEO48nm`eyy5p]wƒU(~x .]bffx +++ё39Ke\M{ v!NZ3nMbДDLx1Qט4Z?(kX^/.EBJ=6V 1Tl@ժ*BHo4TS! [tTfg<-ҠZ~Wxe8?}|?W>9G(ƌ>[~^>ȭ#--8 2{?/wlon`E"wyM?pa:2LpCV9w<5Ν;K/`caa|+[[lmm/p)^ٳg9s W\AQ۰vvv1қ EfҠlC6E<UJqX|чXJFOfe NX)4~fJK}"&1p}MCYVZ6U-؍3[PXe"SFUfF99Ykww'ȑ5n\3"O.^9Jpg22GIN5)˜8~P=tEW䞓|S`0?Os}s=|{w%666? /t:lll/}sqw=g}6ϟg{{s|+_( {k?#.\>1K_Z>Oη-Μ9Ñ#Gxp}cǎɠsn ;1'\Me0&BDIrTVB;%&K&e+7j B;LtDJ Eeɤڅ7^!X^[;LCﰶt={7~7nxgW8r(2]GNټ~Rf,,-y*W\;1!eY3gy衇xyy'R}|-VWWx"J)xטG!<9s,ym:׾5 '_:J)fffPJo~3~PǏyȹs8u{{{Z׊Oa 8ɑփ)fA&DAiH1ϢM0m܍a鸵1W J̯>y]lJ ۶`v.asc~CK;_>28Eo(K;dqn* *VAP`<עs\t~w]VWW\po p8d}}u>OW՘)_p!Vop-f<3ܺu/~,,,}5w#<*;;;<I`T& JV}/]Cqa5~DlluUlȖ4Tbc0Rqma VT*S 6̢}Wz=s#Gc{|;{GN/>6W1I4-iD% hŦ\25wR:I<Ř>KY*ZVBcGNzM YVJJ{y1"b;bf㥗^/yי[e*pwpX[[eUɩM >쳞 3->9)-gΜ|ӟ^,..2;;?hę3gv ~`aa|3,-yg{c x;F;vӧOٳlll0Y[[ˌcD$`jwbVudѵ!zNub./ _yHfLJs3+[0`,׃ ='Rh! Zlcڤ-:/z0h!Z.(r-(cRd*css;kqQ챸O^~CVڻ`dr -4KX.[;-b<-]>=wo޼hDƓPp˙3Dd2bnn&֚CE`vQ8qk-ǩ*RjqF1z:<{-U4̀jNPYk]ݩ^ xS?3Bڍ<;?% SRhG^ir \+`.&NHOLdbbg}. M XbMF1XS*,sua<o9dy搮@-7ſ{Ɵ՛q! EU2)c5Ɉ*ZNCp$fѨubV3EZFA3mSDS?Ϝ9SO="&jj@3pZȡ0hVZ:h s8H(EIVD+^Qs6NFn\@6l3VR&krHҰsDBg2(BY@Vn:.ǡfLPI56Ֆe5[J -e6!ʁTk3^s?ȑqh?qY'J-/p50;r2 ȾxeH㠚${Z[j?0ہlݡ8u%\5P/<ϙL&L$* N:*NR}Uu7:lZB3׌.)myzv9ΝT-^EwH[##cx!XaTsM񘎫Wқc{{km0t7sp#fUg xV'?y3~YZI{! HR)_*& %:OJ?: >]w:ݷp1p)cYvw+:(jtin*yjj[I] $lRb .:qe52z ꦆ5෤FƑle*gh>.y*KUL3-,iɥwaai.| .19|׸}*Lsn#^gix8;X66o2dIM"RbhQU{mlw:7dDn5%+L}ߚqIS)0Za qcUy!ΐɍ6!`mUkТ WM4a6 o 9 G =bxtƍӨD ]O(;pt&=*k歴:g@-reY_JC/;PPV&50X9r~SXc+}4; n^ϵ7zf$w=Ȼ%xx#m?ƉVE2(<`Ψ#MRE&/]zCiX橖2mر;fy},ۚUVRNAŠ?Q}u(V-<;njjz&q8L=mF<'ro_3`F]HsJ)-RJ]D 0iƪd8sxmo;>|)6o^KX>zX>{'1bv:W2YppX3v+wOy7w?>d}wlyElrۏ$pu:1؄z'mCAʖe@:BԭVUcUirA;]JPggZaJU`U4e!q"$0hː1E%loƾd&b2)PAZ مpVUrzhtTYS}OiSr9iɥw/VWX\Yg/BCwp}G{{EĽK9;?3pMQJa$- IQ0 8`Sl[mmRPcж He!n(-Vw,iڵ .)sjMܾrWw3,:+er'PYoߺڢ $V T:ʶ†QUd:7]ŻC )c&ɲ[q*#,#⹨ۓhȥp 6tsC\8w˳\p]-αv|bq0pW"۷g~˟D+F8cBԓBH,|&+:I#[&VHn=طv"RhmI-:p \ОeM:SUtzX+nJ _Q[4ďcT\N9)F *q^agsQ:g.7~?dd_K\{=;osKYZT~'"UUQUɖH_jo_vpBɴOP}ߢ*0?:R]$œ1*-XʐHH j PV骲qRGI2p‡>kZ]ochXu="ِlrxQM :4%HWe†`=jY˪ uf:t_JN YWtwم%8z\zrBov>ږa27G>ˬݱƵk>O[AN,oc9,XK[֥-v͝3c(>Ӹ0]&Atb_: _Bs7cXA A27@BKwE罷k eYu`&ԣ8K(4uxprY7!DD:wV*,ֺj"ЪZaHh--sG?S;/EOͰtNq\7#6nsQeLYh&>u?w?˗2.O&ğR"d fZ6zf5xG+xJF!щca>GFE8GC|. o0?k@ 2n9𝐫 $ʵa.y5dPW.]^'@B,})dߥc |˿˿{"_|\9v̔}7};埽[y3˳nsmw''~OE:jnA̿mU|$R"B0ҲOPi}rڌ5UMcP_ Au-`6UkXzz )i"1Ӻqܕr#8>=j͠Vq *\(i%Vx}UrRMӣR1z@ >cx#vcy`uv6ᄳ=Fzω;UlCe#Qӟ&yL_\uVj{r.f؇#*tio 1r{7M JU.:1@X|)JFRH2(H!D}!9,9^d^.vJ D_bU(,cCF1 !1uz&%-bmMW!jw`4ʿ沚uJ+$ꅪf8 I)Eᗟ\Io}P<2?F7`- +QcHЏؘy/63"UuM;+!x9ˢ!ްIbyc4mB"'rʬ4[oJ\;qE=fzRhNi r,Ø S ={)+dTꃴbnЧmtXKQTj&p%f`p eUSid5cjA{oIZ~H uffw IDATaLjs-k8m}2)㴅+j՘K Ly7RFr7E0k12¤CsE"걫%Bp0MB&X4a*kcLi?uƖ2l, # 9޼SCu&!a-̮ޤھ{ר _^g8"6"%K3yb<gMTLjŲv BkOgԟ U{<ɁI7lK;[>yg H<)U 1XʸBb * 5E1M)k?LisIa!a:r/WkDlmpuM'S>oGn qZl JQsʬΐNDT1Z{R9]+EQx&slQי.a'z=ǍC;V?H}^l]}p^=n[Xk9!8O?x95Lټ`fkvNV}~}}y-PBO0M_^hˆjAVm<… Kc:-fpss 3 cVVsy~sw233Ûo+$pzANjh9e;7'TRhm]UI΋p+/pń~Gibw[PU[L̈́:vwk:Ly{˯{Ag[ۥ$(^7[0{̀O~ɟ οs=͛7yWz=N:/ /1O~,o{/7n܈u_|'x"162~7x9tEQp/suZʯPk8E9kLB!la/ܱt='¿ _QJJ1AH$T*nñPL+ʗV]-VY^iuZ|Dfjt|M9wG[o0[f2qc@,CՑ"JQ,j ]b]e13ca~^ǹs8{, sO_*w}7͛7r OF)__!f~~'@L^z%>+pnܸ~y嗹{"t<3;o} !'N`cc#wy'̣>JY\rpȷm?#Μ9C|_gmmSNqܹ67R( V ZObE8 C![3'BR$8uըK.D]Zr-b0̷!(3"pW"3r.FJWNl \Kl^]n7ӝ!;6|oW.qi2XrV- %p_Aje`2qL&1 ֨pӧ_U>0׾~F'N%,--177믿իWecc_~u,8z(wuGȑ#Q%O )sVVVѣGCmZ!dNu~rkm#7ϿI'4!}wտM_#$xlOdNa:p`2>eʲ0.\ࡇ,//#<.ggymFhyЇ>įʯp)ΟDYvvvX^^!'s>񏳳7 )O?48Lbz<F#yz)|A^}Uz!SG1L:s=The? j#~*33ؼ/Ñ9=]Zp,y?wcmi=3a 'Cg~W=x=1 ʿ\lݾG?!7o},/2ΝC):G?gϞevvxt:f<|O277x;;֚E?@LSN:;;;/RH>;d2Ӭ 7n`8F_v1]RFQ#|MhI%_-MBzZD浠HI_z-X0jٱN;u75\$J㽄]ֺJxHřA,V䌢{%2~OoW'h+ٻR6Ҕ.*F[E܀=ܾGYIfS!HY_333TUSL& CAeESIk0D̩ f( UU133F#Ez$ߏ֚XXXp[]YYȑ51U)Ǐɓ X2Ȃ&#萻B )I=NXOg-W+KXY&IGFo&q-V:ϳAJ 3l6;.GmL.9 J pA/8s9ʩ9 Fޥvi%W9bWӫ,ܱ›&7w]kj 3sL[a–%no8c۷cde"hGmoY:mĨ{mooǮz1:ڠb4M/)(^*bЫٹHONU4-DKv9pn]9`=SxK*N!,Qu37!NJS"] Jj)VJ|w1?Њ'L+zss|䗟c^Mx_X(__5%F7e{}0U96x[c0[V-p(*㼰=s)):e)>,Ts!ݕΕklMʦÍ-̓m4o@)= ٵH [g6'ϥX(=nCS[4MzAz990lHOXm(*=)RT?H(VZ1s#jŏ EQ:4pcb{̭_3]|C,RJ]{TQ:HB^r76 bګPVsy3qm*PRÏ*t-Av:SXxh셬5uv}kq[GGm0n(B7FyZR2.56 >('{U7F8jT&<ҍ!Cg/ܪ3%AccqՈ'!Rӊ7;H0?y35ymx0M-s!mO Q2-s8+#Svn\a7qT7o1~&Xߝ"aQ :\g} -S@xiOET+=>ל6t-JL늱>J"#a4 EcCֱ^Q8<7 ShXtL 쎧lmlq:ni$I$2Rf1H:OIaQwEh(O$W:z N3yO@ z0Erk}͋tCР;֜[mbhZMޤPxI9l$<ֺ^Y{Ȥ,Ɍũ rz}Ar9er:=%|ywx19#)*+s ʰYN@g _ y4*|&bO}Ydj8~2'uw..CmO:ۮ JZkڧ"(Ss]R*M 2 (j,Ϡ;lֽ2 )f2z6Cd瀜N&&m UUBO% nKUL֯(,F ^y~ ^ ~fш$4dW nmTkego2p~VtKN7zS1ՎjXaq5\& eo>XkkKŽaAH?B$B)4K!^Mט:&)&S e)h9k״fn   %@ ȥk<+c@ Lb"mazJeLot^[y/_\#Η=*(cb7&CvֲUoX\=N9C)(cLlh,t믩%} )4DNR ]k 8}41.EXzA8qT]8)dKǴ^ۈ>cwJykCjE=Cl0|# ;onn 1LRY RV֪/b,-nNR8Ȫ 7$Pd,M;<<-͇;?=_:\θ9b)Yt p|oxP~}}g?'no-c8a7w A4"^iLxv#RgdDy\cpE N{+j驚Ǝq-Y̦%L`j6wK= uLl)i۠hʵȼXZdnȅ6"V.d QrR:_derp<#Ƿ^[s'{VeE+F 唝|/!^4uLHJi[?m+(䨕O1:WRDae|CA}5B mେL+jct4Mn!evzz#yQ_ (%kBӠvBS$s(A1| 2)e 7V^UsAe`N]ISmWY!V ^O$q yC>xmz{#&m챓)?y%EAsޚ1dyǡrg>'ٺu-Ji)q7-.D|'HaU"j-&u$X͇F&Zm.))?h啭mk#EkwN'u IHa|>XqhkWskrc62} ZnM+o4LT}FB^NqDGQIe- -dRPLw)V>fRYNUZvR \PZZтѥIH#Szx뷪$x*&7ݪEDеJ?Z!}fb2׷0c!$Fk}-# umʮUm@x~ qѓ* l5z{9gix^oN)ճƕB mP(pOVѮD^:gP`sO<9$8zcN*le:Gc * .u@$KӚ )4|P mzEY3kJ)Hj3K5(-+);<]`61lZk}RtAՄA2 Q`T'8oxk@ۄ0[e6<)Qy$t)E֑آQbUj*gqul##-Nx|2G5lU^e HAEV2bQ~XL@Loƹ*झ5k+LU'OLvjicP݈XZp6pl8gUt4(O_;} z .]?LP BOlC nm K䟮ەR6 (iMd6ҝs.YNe BDIJ*$]jȵrJQaWa+Ux\—jP\e,XJ)7JnZP\9|x!y_ƀ"J+;L*iNX_ ,(kܗMPH1v2%X~3BpF[!ǁh1$gU}ҺHdc# f1Q'i:mS#&2 IDAT1RF)sNLC*E׷3wEM/=kTtl|nTXDA chK!ȴFG aLM%㤞V RLDF09m)ZvlHCe [ƐGIvߜeY[TF=lzGT椋{hz'j?48<~ι[o$n"iQ}#eN1r|6BgLV|[# J%ºxr <䆕&n}R)*7pW>]B^(MQ{*RLOahE!O9^JDU-*}A.AVS|hf-y[XNդ'Jt*`=@%NR9 yT TۈͰ1~r5* {<(p3`h:Fa{. `\[7O8h (`".zwp{sNV*tp 2png V`9tq%L&< عs'lQ%4|>'OR۷RwVVV7ߌr2ܻJ Pd v套^$pС ሜs+!C6+{1ȏ|\2FiPhG@XD^G][<4;;gϵ0MηBwy7rQuBbH2QF~bXpƺmz^8KRy> Ւ2@n7!$aAit>:6uC X,Cxŗ::;e;`Z:O8.]ע\qM]N @$uw{.(R7D.C[[0`6~m߿L|O>$ v.L駟_ 6`jj OƎ;044ӧO?|]w__ȑ#ضmfggEn`"J^x(U03籼6QSo1uaYVX *ZȘ_xb?ݧj|˓uxä5]SJezlSuy") $pf0DU\N?l6coco_reVcqq7O~*[7-Ja50;0p}azz\v`aaFXDX?4qFEl޼s?|> ڰ_J|nrWgy8Ο?\.n7|3ocll,$/Z"ɠX,"azzJlKKKxGc?cxꩧ:BӸpNhjwyǎ=܃˗/?0>~lE,--Q-a ʄruzPJj<, jŦNThT ^j\ŒNԗPH1ߏW a=Q{1 /<^{ o(l_n)r ۮٳ੧PZ)B#@>[aqr,s˨VT*jh4>={`qq?rn<|CC#155 6`ƍ0MSSSۿ&mۆNj/??2~ĝwމyJ%,,,~' E_#1q d2| _]jCCC(8s v؁O~4 ۷o}vp.L_?K#` wEFЁG^SB%$.^zF,`HGTÍD,>zGxhqO|c0M8y$^{5,//\.^öm2L<Q.qػƶmۄ!`!{8N4A@a.$TzX1zCiZ ?N[x~'24d?8gYMTDiť9 j2FF-_s<+ܼz֡=qe+ػw/ &'`b Ν;ť+ڂ9P.CRؿ?zzz`vލ뮻F?8n&ؘܹt޽1ض;w!x'ى+W_m۰ge`׮]( rgg'zLNN… 8z(B//s#GR\.00::,d2¡C.vލ~x122GرcvލR^x[nŶm۰&;vO<M044[o333re;vZ$6),6s en2/1ܩpT~2æ%Ǵ͉mɖ(?ﷷuAe3j翻X:)Y/} ::pя&  p;jaV*f?En10"ZWe}W~M/'A 3|:๮[F_XDžkKƫ!-pϑ[n Jؾ}w*R((dEӰi@9$#t6&xM6kQ}}MAwK#8ՓRV3v <!xRѶuh?#tuk1!=S+f /=$-YSihFF09MbSyaՑj۶aY\FX_{+bq'ϣ ###b^tvv^vqmaݺugQKC}xi*-[*[ARWm+o46cTpY8`ڍ$P mh'bILIOr_X܈R6[FӨ< p=6p$J4lepMqTS.qPmTQkؘCGo7>/?\ }p9k(WKx8wa w :w':{zQclДƧH RETt)MΩFitjY-oFmM}V]澺be8A XQW>GDhQIBO! 3b^y`+D{;%ߛ!c7xPs\ Hp <.2z֯ 1{ alܲ [EoP+b}ط_d KaJ423j.YU.7İH6:1#fڣ3)2j^x#$.C|?Sd 5 _0` ! ,7=J) MWX +CqY2Yv/{= EznӨ*^Hc_Ivk ~㢅 פ4 #8$PF#ArLjTpaǀ ~lMA)huM[ XDrGu-4n"cm_iQ!ƍNLs2@D\A1FS^<=tؔ ?pď8\)=8ظq#6mڄOc5aez^hh(.@)NenDg ?##*B@&#VU"Dx4 $+gֈ/ HHɦZ\$|VbZzbU^M~1$u7,)D.cE4Wk8b ԒU- V4h,tMDhw U|d 4)ꐛvTei4 rPPn#3`pp'ZR1(EtBH^n2nK,KNYJ@,KyׄkM2ȸ8NT@Yd*F +"B-PI јNjX!N.bU"l}&R+KQ(>1x* ;@z} ) /'*n3 Ӱ7>(X:WT\Ԕ9Lj*$$qU#'=Qp#c32MO$=&:XЌ06ZGEU5(n*&Ɏ)aYVQ$68B.MD_< nYi *)M]MnW/\R' 2dY^rBq=#$gÐ c~uNqMPdp2 ~PZ0QGȒ( 4=DɁAC>'THtQU9#XloQI:4bmgU@BLpH'\uDj #YbLz>ta#w+#Y!Js&>nP B ύZ"0[Nø;QLi&U!%XC[LNs116KH{Lx~4$|S/*2"*1PA5Q -E@#IXȵAv<\.>Jjqbt4y*IMQR>U21Z^&3P7`k`}R eF%x4Fן0LPIAO2Qp0}J4p)D{,´Z(=ef:lT0ȧO<>w)b-i]#5\bFBVq~0|vdS&kjBիʦr\бglIS S1)9*JԍHˌ Sġ `CDVh[gϞB!3;;9>>>wx[ڴqo|^5 Noۭ#S.L\KRc[Ο>{m۶ڨfggVl!YTl@gg7v^)NLL,w#=88!oooJRcddd}R BRǏsy˥RQ,={_{~~~\.P*xqjet>={/JWWW&֕u9wӆM67wҁ]{]*^園 {{{:n7ť\6ctwu]\.fLnٌjoﰝFcq>c_f{s=;FW4#(g LheT+ex.9Ȣ;Fs7gkSvk8>e-†F1iꃧx1 tW1FRk}իeIjTIO$e43%1i%m*#J|4'Mnza %ƍsi$b6@&ei_?s Sp41FTuz[5? <\! IDATnʓhYfڽ6*2CA3:;֦E#`;ga|ՌFC)D.Fɤ(TY&KN^`TdMrPb-9NMG ;[dP#YlQ! LQ䩃=6C0$v Z9DD4ڲV4xDZq ![pٶ>m'1T>a/' Z5֫`;?|qm-чIHt&MEdP \B8@'y!fL`!\K~JWVCVql+py얟49(aJ- 0.][-4E,Lk|}$a7p} 7Aׄ NOYpZ.CQ >LZxt"DU 4ke$ ~xI KB>V$"*sשqZ|-OR=/݈vSTmB}Σ@H,l>w42E㍄Kֽ ixm;غe._Rk@ XyE@뢰,VШTHXDW\] bQvt:..iV^1Uwul[x{~;_ ebeA:[8 i-9LjՁv~dM 76 RE5TR2`;0?? c6dx+?\G-5S^+NuX%*\汜;8MaT"np$5.dՄLTHc&kx@i"`Q.(@88IVb  :hPb@SϿMjl2 {WRNk3/Q+WQ#`+k~WYQ^"^SkXbuZyVU 9֌W H]5K" Z mV*%lټp݅GWFr˥S"xip(# yAM`٩B{f.# x]?x̏WΓ/%5) Ivjc^2-Ÿzc)0#kD늙T7N.Z%i~?|F. <"&`Q$&SS30uU";=燿ϢZ}YZx?ލA\dQzm5%tX"BZ$&&0"^OҐyge={}{uۮoW'addرC*P |Pdxy?|k@iJI kXm[䩱kZc!k![>WS\f|%꤭^TB0jbyd3!0rSKi1j"H`^PJt"L/6Q9WݸիW;ѫ:5d I /a4A>[wQJ1?[n{ט?rcOO`dd' $D80-F:t;;4!Oǚ%D{Їױu m 91K_Mj׫yZIV邭]}Y[&DI[UZ{ݫ VK EsV?Xѫ iR)0 L`bYz__8Vx~P  'm SϽ󓳏Sݹ<݋rmEt&P6"(9Ma"U (HV_Ǒ7 s!QMߴK{WK₋iF SHFDZOtZ4Jr`rb"*"0!6%bVY,:*U3Q>xЗ}Gʯ&$5 !?q1}]0Gchzh! _ c1q,9) Gzۏ^VhЪ v8ds5 )I<ͮ.ֹ4bfʼZJn%' dLJ++T _;n˥"Gada2457!tCNٽ.FqP/.\<'߁ШNN85e'!i}6+_ *+-t5HjY,4w8(Zk`msWp O7)K$]}:҃R'@&_aP0A}jE `R7ҸxzUC$^B D>v=Ck^)_شo .^a!e'ԮDemܤ ng%:2PZa@OܲTƕ)\48jޏ0fjՒ)^H.VazzEu^.ez[O&iژ[yӌ7^fM5JCԑq.:]!Օk4V^z90Cv:!{__pĉ{//ԩ&g"xd7Gx9G=sG?3Ͼ0\h-cG5  mB.i DM^3陓9MRڥhɪØ)l/e6&kjJu!p"_S{ua ZgzB"xUOAcTAa LB|yy"bttcǧs3~\YBOw'~ڱ!VW<}2LHEi10 ؆`.2 <}觷]3rǟ:_߳wYhq&O͜*,Kz1!~ȹLp-V ]N0%8r&5BzP7B,-励3/F%4 ZՆuՍ\8陳篼@=Qǭv ucttů}k0|Hckuk8r~Hiy`% hc?g0s` Nu }ܕY,,\J>òfVH_-PEC2U5RXo&Gta0AC@jܩƗi͵ߔj8<цC @D *gAH ŤPp$`zaVag`ƼwuO^Yގ!\>uFGG-R vZ&//4],*jX.QWB41k&(fAAafɋSC#@s=4OC{xn)Zαgcx<#L_IB=[`%rj*hGYa9p!m۵@EShe2 ttݲЁok^% 0˃5O/\yA{!u7W~4pvR @XKS4Z M2ckg GWЛotx yݟ*kX90BR1p|Y38&eGu5[WJeV^ccr E )4MC&glRtQjMco#q2=IGh0AtSU5cPH&RBLy 8!ie YvzҥggzF 8nۮ÷{)(]N`:::044ue?٭ /%<`a.U`0XbIChqLab)K 1q-x #j-NidokCq<'^H*4 j\br,89pԭ];w-?PV (7 k 8#Tՙ y񦸲2 ADI`M1`{Bʢ2'$qT-#BhAF4i4MXflZmD\^H4=Bvӆ V.}qqj%f5 NQ(d`͗_G g|A殠JfZCmyŢ*I3޴x71`$]v`llvM7uqΉ^x4@6pq<(4Ą4 bYxix`C\"%84Lӂiu,^mP\T*+$G$ u_e h&tK]g۳{h@jJ cF._7ZZb |ߟ=N%l7|s7[É6 hލiu֩^4XO,2nZ844oKZz_D>2SL Ku ]T{MӴ}'|rQ"^ ~/Zƍ[nݺP( +BOȅdjY,4MeYT w҅gΝ uf u*Ts0zP: ``:恉Y("Bc]3i `΅Pp#3:s/ 4Yi5Ajys ۶hذZ|0U<'0 dsjũKϟ?ND5-X:zhvtt4GG4>vםkcBp0zi-,˔0AmV T#fڰ"aPb^$%u: ou~7[ߺ`YFӁ2 xqMס{B\u@64M3700׷~mRz_F W/: 5фfD4E`04]pS aµaƸK)}oxk@ M'g5c ׈{!S} / `L 2='hza̮ܺ0(6&ႚ9JR^859qRTOm"VZ`5A[>:Ynunnnޛ5 [^^nUc^la }@c%aۺGU5wbTK%-aJhʍ- 8|p[nehhַ&fffb'c{0(_GuϲiCƣ^:BLY(R6 $c2cFNQedtj!iܥyc5y]v:::2iLX~}~``;3L}:;; )yرcӫ0NbɅ*J[i(E)3[;p@p`G___'!,MNN^p iU4kZa)woe jYNZʨat׮].sN8}˲tP 2Lֲ,uR؀RRԘXW\i[κrJ֭[g gppR[.juuueŢՕICw+ fBo4uX\\\T*RTp SJB8!ܢ*U[W V*}ɓ'# N3Txj|t@ZTD*1.Y+9;k校r  WW)Ob2Ţ366V۵kWN>U+_嶖U i-O5<ͻUt֒-c6117aīydᑯZHૄh1l+ZW{-؆X~'Waï{E"h IDAT8R~LZlXbf`X㱫]k=kosUl2B ks!#$yZUUATܳ}}Pjj>.baa 4 o,B;W* r`86<p//?Ksxol%ͅo3@p' !(0,zJ?u# AA eYt]ᮑv3 [$@J`Eؤs2P*`N:0B903p!:o[O~N?xOp(teEY#XXPh4J| $ 4)<TBTjN"4M뺁A4-.hFЂCz0d4R#*R-D̅($x0E9bQOqxh)UG}t€t0A9|7jC_q<2,\pZokO\Ƽ!-GeBMtT. 1u8ufIhDp:q}~tᄑ[oƗ5 К VS^L{*`bb"%^ 8OO[8MLa'\ל>=/TWYH6- mG$^x} LFT43z5G@~z7~yws@NYG>>:a>“QgzRivbqyj`U ,W͉3?|`+nX~oO0/l|a yS:Q(ձs{geI c!B&KWfgƧΟ;E.j&+vmֿO]rw2&YǦC: "G$gbKer0;B]$1J;A1pl/}᳿} MCCC7o|}Vۈ~evK.\<~ųlLE)Bk;Gw_䶭NțcGĮ&h, ǵjmvqxniqiny KKŕz޽ ^'OU}{;GwݻoÆu{vW.WWfsʵmF0hj׽L& ۶]rRٹ?O"3A= 94:vwp$F-9,s9wrxRYqkkv#rK5(@;Aߣz2S S%;*!7?O¦Oo4o;oc @ʀ6h_mOė;::\.M*5W^ Z.;>ǯ<>77G9x@*KNnّr[nje q0t+j |^3: q@t7ΡƸK:2 4,,xyp3 v0b3}X5جڞm۶hYXZaÆQ]Ӭe?y-pN i M||>>ï`S.(>=ҐD]7&Gmup5x#ՠ!TOOi(<@g@iv󂏁OTDVCR~RQ]՝{K:uV’@` $ć$ɃxE61L0f0`l[0cI!JBgUguuuwu'|νVYUx>ۿ?~)=A4La8^X- h hN!ISt~j2PYh#RI^is$ɠTF+pY~RR Vƒf RC%@=;s6Ϳz.t+y睸ӻ! #>z>[{MVM]RBT'ǹ1d+NkDHSML,w&9/*ex?s)voT'BRԸ}t,D nUs*X+cM jT+ xrGdh"*JKB-j^WR"Dc`dxt '٨hwv9@1 ,M- /Xl /~/_ J)6mڒ^&0c(xf!&5p=woq'^+ ׾033ߎ6֬[g Nڤ" b1+9I™dL~J(B :OT @%x9K`R!1+x2e9Q|7.duK0ZP۲ު0 (ihԭjk^ .`nzfn`5Av .c#fƹR nw۳󝑑U/;{,f000;}lCrӫ|[/b%y 6x7qSFrټ쳟+9}vo~1:6O}ꓸ" ?r=xFGxgR 'J0< jøZ^-VvMIydqx>KLڐp8ue9- tLpS55{,L *K5rY%bX j5\h=%8<Z5 OlOaDM)-Bš,,p4e×>3_xlLxv/_s=aݛE\ ى_x(k?|pӦx߀{[~{vt+wo`@~QR hP`@RXMH dBYzPޟs[ǬMdYkI8?r j[H@ ĜpM`yQn٤ط ֬0]$;qRڸVsJg6t*@e"@92 cι}?hCY`8T )eEQ7h \1g;ZstuC~f nO/ݼiݵmf]G."-%7k7Wyauس?XO~ @RM*xEf}চ$&ֶM9倜ܔPڍcD(XN3,Z[c'/-dl$c 'Θ2@%Vmr;Zs i\--etfXy{!4aP$ cK8+x͡V3國f}@υ(GQVJITJA)gZkfmdnzfh]?IvNonT>O_ 9Ȩa"_G>g?V-@g`4H{%™bE- }Y}Pkyꉦ% I*A'jk&HjJL򻶂^a{jR13 *|I=8o0>FC d0D>~RJIOAE`b0Jch&)DLѣxc<DiL S+"o7`&ȁI`-׈5v+QF5W]LJCp˰P,LFbo 3EtZd/ ,gCʌ1IJf{ߛVLFh  (TS#8M$x9^Q5+Kjo)hbokG`%,A Q9jd.79AmYv 5.xu( 4 3&6?`<N3460зVl IDAT=N(oWyB"ӓǧu 5{]Օ^xɥ۞Σ`ib9bу L1h=NX ЈUءqBGa$MA[8v0@/[oQ`Rg1Z@@kη>48m.ݻdz2 6hcSSIbc]$(A5CnDCN ҲrWP c dOeDd"`s!`n!))Lde٢d7 Y$!QD}/,4gJ2 $؎uj]2 OЌZ,1Ac0qԍGdܓfKi_cK_3t͡cggy=< /">yu[A :oo 5đ8\qȩ[AK/|;?9DPK)ƍ,ߦ谍` ayq3XL`14Zs3 %m2D(i4b%6;o2PYּM(j0y©{$#D K=Y4\M+ki Q #e<@^Gh@Ho5nfsY0Ძ^X SJ@QJRq&ZXIX=z=>xvб]UQr~#؇љH,IWI?C 2OHǩqsr(6L$&Rr I( 2ySxZhQAt߭ܜCi.? LHӱPy^:̵#3+Rm ="wvӌ1"fs2-p!jOCk")(51gwf@L@k4Mw'M%J< 1 [`Cr0ňƓ`pjӌ|op&OQyL:b2It4$[/|3FY~#jҶ_1#wˤL1h a|G!znshUP s_hpg2mFqUں( /* <#&R,&B)A^ԙS0=z#`vo {X?Lpg*M\CVGKtҤ$!TL|\Iis <^idOmVהt]Z[5wt¤C%f-u5ۭMsHY!0Axȸ$0ӞWH^q&֪kZS@AkK7\BLp.<(#xPèek%!6Rҩ!8 cmK(%X1r@|)k d?oW?g`rC@d@cE̬ÒnϼK;ۗD>זٷEj lL5iHqjFAR%gٿJ[>M[ӏZ1-q:ņ,2nY[ϣ"/ Hz>8c /X26<(*(K%z\kDg(U,920BG KBJXPJ6J&$vU$4Xzxe+=5Up[xo7.:$Cd/9,tUkO6dp[$'c}RXL҈)ra+m&sNUjF C1ҿ5sK?y8ԋ,jjg]Mq9laDQGQ cJPX*%u֒6`&Й.U,yPk2880-L8 ck , ¨|a U((bPP36aI&-̈́&w %Q؁,~+mB#,qEbd)CrҜ.e5VH#g94ۖ$_P(,`k=pb) :'CxY'=I ~gKd '.{FVO`}ι !88D 47e<8a8kGp{ӬFƖH` 4nnCNໂ%RRqdq bߜ3(8㬄F$qx( Zbٲh8+ip{nڲdɒ+>O&TQh'΋T )őG YQPeclItnmȝ5gafD gد՟Y{V&Ef'Ϝ)8rR,ޱӠl@&^ AUA QJXI3J9BU] ?*Q I(" ˨}wpZzV9r62S,"PΒ6HGO2"{<3,uƬűP ɒ's V+ZϦkiE[5|1~ZapmP;םmm =rz FG 8e- K:Z{%&Aa4U9K{Ϧ@ u(i^X*g?A2#@G"8fF<Ӑ=8^UfgJ'YRĉe5L!,3ԨnWuRH8 nY;1"[-w mBa 7ey.tQ-U46J@ijF8DN~J)kG-7:}oZcV|l!>s!Ff=hEѶڭvY՚dgHt`*#;rBő%3!VY`RYZ\MݠH,Q۲8'<% [|Q:V6ˁֵno!ZEhiHfbZ)k FS8&CީPÈǙ6FRB(%h# $/dHM IWeҭ*yuAG'!9F^ةKӺϐsGx1`%0\3%Ic+~& &CSLETXzh,`#X'旃h]Ҩ B*bi`"{,3*DqG^/[b,P 6$'"?贩ioa暲̀2t 0O$"Bhc5@`00He ՊlF8d k2TZՔGE$KUe-iaqDs@T82G"_Z?瘮'M$qC3S&t!g(`$uU*󄈢8ӼXJ%eQH$;F#`}0٠D,SiCXu3!Ӥ$ٶ0MY:$(@MޏѴ3Wμd"L.F\~'}%6o~0횒Pɐ9XY+-u*-KR {`EmJN ޾$䤑ceTD4eQS )$)=_~I8T$oE9es-@UJ3I(9#zA ZKyAU4뮳&{aU˺o$YVM! Y Z'P '3܅׳ptS/@hDZNn2j>2KvJ 5Q%28G:h]xɠЙ]Ӣ|RpJ`u.\R r#jdHi+mr{2'Vu-(#Q"&` z݅FK8I*p.0=F)g\%Ux>yZRkH`dȨ{LJZRP# n&Z4&0=+̆g0/H,8~lki1-Ux13DwPS؞Bi4)S+R\JтW&: oK(9{VSr7zXIof[^ڥreo4FAlO\|AdRm5,>)/P0o|Gc5Hu0};gqac3v&1K ͔Zz`!`y5 vψ=ՙ-J(p)xhM7tH)} Xl zw :RJPOP !h*pDMNNlફW_ ^Fԧw RJ\8pn&o#opA}122ϳ*ݻW^y%,Yny4M\wu;=.2 o^[?olڴ gΜ>98pǏg?Y8p[lɎo} ˖-Fl߾Bxk˖-/_J)oqf!z/o;կbϞ=x M79chhk׮-F^"R{yȿ۔$G -QLc~K; eC=ǏaOcddx+0>>+s:֭ۖ[z XXXO.6lPg>;v`||W\q8f*Zk9sYu׾&`aafF###صkmt, @(Fq1H)1??%x _~3^.!*(ɛ/x$-mJKbVXz޽ؿ?z+6n܈|#?˰}v<3͛qWbݺuرcp غu+駟̅Ě5ko><8x vmyqUWaΝvxK_'Obq<^/ƽދ1,_1LNNc{V^m۶o͛ ?z(vڅ/6m Qհk׮o}[xի^u`̙3hZ8{,?y= 5.b!vZ]ؽ{7Ξ=({nr-qi8ܥҲNI>>u&׾xV^g ݼe .8r .rLLL'k_Zvm{~z<쳈fZ abnnΡql?V$z^a"~+V`ppRPJ1:=zNxlƍB nz*o67e@8ڵktRσVI;vpf1H)EzfNNNV"Ru۫CF3>(Μ9S8aӦ-,Lgb82 DWAw:<\Ξ=;eMEIJ}!ZXx3g H1ʎ[XXw\iY8rH&U 8qRYZf|Iz9&T!=zOPˋR$k bXYp{J%֠ex7Q iQi%|P@kQ0IlHeJEpU.ł2UB*5iע-e;A1FC8M!Q6G5R1Tq܎PayR@Hx7kg 㖷?VjXsRQ_LxO z0VA ,8q}\NlAUU?!o6q$P7ҶH6Ya!.C4IJ4 g)Geozb2O\tgc7i &!B% d1znh.THӤUBt.?KaA;amwB9H]mU?K{w!Ϟ~WpʻJYxh W>;;VPG:HpP0B) ðTKG B]A0HzEMt: N@)K'ڳ)LTޞʓNZy\j骉*b l(\b+Ucg39P.vO\+wOUZ{mxByG Ed,f'N6*us}?HJ6$9-hАHc-LS^9 Xw016%P h-Ab` PJ ۟K)_=?p yF6*kp͈X='#$X%,bz*[|~@:W K4Zy0x[L~;p)5)( /IضSYypkmɘ&l2wajUmϫ7LJJWJU.b wɕCICյp[k]>b*?gy lE$FAHtO!zX/3hƋ,6@r=F6vd<rj]L(Gow3UF[YIv|.hEf9ZԸ/)ˋR7tYs Up&=6?dut>lZQfb;_lK$K4RҒa($2+R($Va#?0+&E=%azm IM"^ >iE!|pfLpiK R6) E)"G@D܋N Ajd$iT8+e Q崹Έ+Xe̍h6N5U^yYN+0Ŕ{waWAh\./ֲ8\t)@"PV(#N1)C<뭷|zC.k{/.a^#5@)$: ,LC Qy6&g7cRktÛ\:ae<&eġ R#jPvr͙ {{QW+ӗ߹ d Mݐ2axptɱ':%bd1oޮ0ލ!l޺g*}Nw q>_!qYҕ'N-$ΥӪl c L j,49Cp ,Y \²͇`qτЌ0J0cgXtnT`jf> 0@e`Dc3 P& sʶgEz|^<#Gٳؿ? (,yu6w˭ S|JӕpUfE1t kʸp&v>c~e\VP9g $^/nIk6R-$!v6v?9P8UcK\ JGP 1j%V߀51&-#`|.L9Qk$ vBaGI,YرAd|Sw;QAA'&&cǎRF[vRuz\0(o.T嵧tҲ;N9ӵ/S9 a*Ӧ*b4 c> '-z9:t.u3u NA^\0a|85t+ea8mQDrQܵ0=8:m0|5d`@1ҪVc}{j!@[O3${ORÀb}ן߇с_njj0==;޻ NB’%Kӟwu ^ǃ>%EV1\{ڎnUNf*XWR,CcUA3Rd_]:֞Z3Vzmi ΀*Bs#BkA T+xn\T ] 9,~v<vО};1ǿu#n}mES03=6.X:p|qhnAmb1K5k/ҥKd%޺udq\0wXe(y^aBA󘟟x*JJ2TޖSe.kѽPzF-kr8]tZE?p?`r$->?_投 PY(m2R۔vwPx[f&ݴ!tf'1q3~=K='Q×M|+_ObЧX8tr ]k}C)Ǐ#"DQYhqchh(rS,D*TU%,FkteS||U}W 5]xUSHS Ĝ7 FTYYRJ%A0b4! qͳݯ;:?Gk=?mn4ظ? cf,aRIBRTURͪ!3+q<ܔA̛k6lz?~Fn4RWQqX~.*dWب"J shQ\y^q9&$W8ъvnAw]+bAOM+835f+ bu].iW[ml"ΝFqmn+%\x1: QPp1Dž#V(0tV)խ`n dzUZ.!JBzrK.Y@uvFܔ"73Pʖ)p Hb~rY!ҊrnC2h*7`\b+e!\.cffV† P. JrJX?|>BHYJ ˟eb kAS.PB9/A%~%Ȕ&47Íe%li]]PJZE.˥>oj "Ue/N֨JB7m-׬@ZE5A8,"ɥE(:71>9jQX4 xz`'4y.XTX\ \<"wtaN( ٬wJܡ4Mi PsdX+]d2ҷ,MI6B47tHG7»i2Z)ۀZ4 u^CJrGs4e4)Y Re:0b!D/PyGq04Abܙs3s2sX4NajhKhDnj .@Cbu֜Xi3Ma4t~mVDTlۮ+ŮLĠ0]Q1b63ߧE&ÔN*?o4W2P@7㿇KA0\*9VG.Z\ "P)#А5]8 ,c@W*V9QDiwiQYk(2z!LφpKǒVnY"?[ZZfQ.^^( /|&Fx 066۶dgc[Q$I{lfPBCCCXlYa3d|fQ%GȔ=G$"LVpY]jP5 µ"shM&mf?8?{%E( T3M3KE/`zzA#ga-w!sj\;52 X1 ch~"R1y-WXUK`0@qa 4,.dD<*#R~iJ%a|Sqc00СCD__.7, |E"ض B!DQ?~t_d`&2ȅB!8y$*a+ƦM+_J]-p8p8ٰ8(헧:~"L'ٴ&~BC=n'sӻnfaA |ת]Wih* :hPqMvݗ-G>_GQ+e 91uK_zsXԝtx!]Dž,Jf ad`yT7r #x#7 >fߏqb1躎J'N`xxhP< 8166D"H$MpqֵF2Ξ=RęnaĉHhmm(hmm|>sܸ 뢳k׮r\LJ~7,ObdW1kbFҨasoD ueez5lmY |^ׯVoޅ; tͅ*Uкhsݷ#^V܌\Bocgx0< lzkKbl|Yh1SE̎Blp P *. Sf|r,_r'O&''qWSO=0077k{a8rnf iꪫpu?9TUE"@2xӃ?^{-瞃d2'>ף5 (JXv-?S?Oᅬx@.$wFr͢I9U[(Go|:>iUu :LiDj* )r9t'Y).,øOބʼn.lĕbъV] }zv|@Qt eXK3HNhTAcU/Gڶ^{5+V`۶mÇd`Y^|_Ɖ'066H$ow}7># OO} 'Nヒgbݺuؽ{70JK/M6Ƿ-8믿^z)}YJ%\w\ݻ /099]va֭-ns8w\LLL7@84>O0 ;whmmŻヒ;vॗ^B__S|M'?46muyɸ2ټ0GJQb;:kF"ho~~>}Y@^q!E,-*k(p3cUŅiBϳϢ $I8+WBQtMPUBv\Ś5kڊ躎ou֭C:ƚ5kdj*$ ,,,qtwwƱcp5`ɒ%{qIضE(q1zLMMkʕ+%Kܝ~_9XxgΜ5\.,,,5h IDAT*‰a5l3ÔIn1e +kH"Tbvo?~KPZB)tY*jCX3(D8{~hxTdoR]\t24<΍bpdrPt,TL* ‪c' 6Rs( ]QF lݺW}ƍ*JE~0D===E.C&ի( wCu}`ye.aضmG=" 5k( "_X@+WĪU`Y8DD{Q}{`mh4AO~F|s[, PՁjUa]c]jU-voP! T*Z܃5kb!*eBU A#=B6AL`X @,`YA4ahlي v؎P עn䳅:Ƅ, 3ײ,㊹{}\EO>J ><* /tEbo`Ic[&1g)!-Leh2;M5l HĤbTuk*<+S*w DUM&ctlaGmk*B,12PuS|2{]ĵ۰uX҂#)dR8;2 *%08\G5;ؚUk?\btDVdmTĕ& jJUukooY*~t?K)S)EZCbnWs:'*(rjBSЀ6:M #`~DLEK4 )č ʮrsYwR [@XD,A@+,@-%و Zb \~-W] sssu_*s; ނ[e3+p* p;nB1LO4~F{l<hIm(Vbj#2? Ɍ CL94Xzu&=sy?ssi]P-3yC I{"P ;M|(5ԠNC[d2Ll#3M[3+:'>Z~F4hĎ2z;N/6@cŴF|t"Ũ2)`uiUb6ʹRTKAų|U4vP^LeOYkW RDĨŘqW.H=K;y2N Gh{DSt)vX\Y( }ō'3cBt3OXpYb}ju8-;˩n4*en`۶8HPjnLo,`,7 Д y"(*]h"[+J(ctCW]Txb1GshIhפ^%3UmJT@~D"Hm&][P,+JmOGel3hF]?<>J 5tqЩ65G*2xb"Jl.PKy~d3*_g*.tg.7Tf N[u^kq)Ux%'F\YCFYnՌDv N]#EdLN?=9Q}{n599BzxxORmW6sC7қHbdIĽqlԓQ?Lge$bâ8u`b-@SY٣ v{ Ж2fœ6C84 ǎQ(*R"{a~~U$Ek?fQd~-K d:U6^\`"2?f['ܤVLSdUbë Èz WU#(P.tyWGg%Tq`y<^P\Tl]#r6:t|V\}ppK.cnn{gG?7BLo^3P_L$j2B2rIy4J֏vjɦa:2ˏoAU3qd[~ϐDj%z0[/Žbi@a^ÔS*$ @.㑤\.ò:#UTh",]V$PxJF{JLcrT!zM$l=(VMۦq~ā+T,vh7AJؠB4>. 6(!/rKRP+5qeY(+L)P iVh eY͛1:: ]qW(ذa7}, ˖-,d"c9s9_kol(5UF0W5N# @%99%%!2tAdy*J6#L6L(p@P bn Ue@NSߵCH7˵X}CSR9qaXmT’%K,]`>l6x<3NR-q{*B:`LlNR9wkkkC:ƹsEQQ*0446@ 1<<0{ Dz!ey1Z2DA5[fS8E$~;US&YX@6E.4PT<ʏ(Va׶=Z.O{J-MP- *I[{  ׿u\vexG0??D"_x4MD">|C"ɓ'aٳ=FFFPTpM7ax07700=={ K.h3<twwoe]E,-܂kb޽8tyflܸBd ۶b |ѣG+@UUǣ>b~Gz}}}x1>>4q7ꫯ~@>JkϖT4Mc-(15 Z[[QU8#G k2T* zDu9sg/lj庲J[p8A,Y۾ ۶L&q߿PM|^z)z{{aocݺuǡC8r^x\wy'8^|EytwwX," zq{J<z!tvvrI|ӟƖ-[0==}kӟ4V^'x_~9^u]z+ԩS@:??ꫯb͚5?_|qUWE%kt1dp _6[L(<а`N݆ BܔC~PMڠ:DQ,}k8oWWWНl67齙ޢ5mahW|{L4qa  wկbnn*~_[@ ^>|K,qy>aǎp]{徵,/>{,0ޱ\LOO㥗^8H&mx7011ŋ[*P,H$ӃgϢP(@˗/a6ծjdY{uVirM(S%2E2u*uh@vi"l1;;1LMM!ˡX)#W,b[Xt)"OdEepG P8jPDZUf˲/F1==ɓF 5kp|+_c_ ֭ur=;k. &bǡ*^u`ݺuuttnÉ'o~ׇݻwGGO೟,6mڄ;Gw]zعs',k.?ŕW^#G%\cccxpwp<w܁YMhTHz 7`ӕo`jj vQTێɘѼyPV YKzj*V`] B-;pt@"ZH$\cccx7T*abbO~~a߇i|AB! S099{?PAȏ&-dqɛe#-4Mͥe6b1RN ͙{?KhƸa(MeUJUe :Tł|_cJYs];wiHPU˖-C ^L&uuu*JK/---u>0|A>Φ4M~tݛp lذwqΞ=^zs)>#Nc߾}E2q-ȑ#p㦛~K/w,oJ/1>>}sXjh~ђBb*sj %Cdj'[&pҎls3uyٲD.RR{BՒM<ԺNqm˗/(4޵krt<]wv ۶1;; EQс>&=bիWsKbaaxGP.˲`>ϠP(`PUOq_XXW\۽NQ*XlV^r9J%A}|Ht] 7܀EC(H&?γYS2?~کlq6>-.6Ryo󂧣)[š[% 6V\!db:1Ǧi)_5E6e={9!Y~ZHF@ D Q0N][ N cdht?Geǿ̨e4R?̢3/96/*& MRT:A68Z0Nmw``x d$vcKRUu2 de Y.>H*o([ "TƊ[M=)gC2DB&h~0g_oo*Sğ¡ D"6Oޱꁌt+Q̣uȔeA\u0€=-@Cs5 r})]נS gG~Ptz2Ln2M䀈VݖMO!pf[_0:6:80@A6 ઎n(ڀwݏAf(P1^ ÐX2dn<4g# ݬpM)N+)2O;igDzp "*1CCyl4-]T,%:k^4Jϡ52Ffժ4lZ: \Ԡ5FTJ%J%I^qмOAu4+V?z3-ʮ IDAT#3!21dJ !Ї{r1OYV]]܌4@{$6? AnTa"6o3+qz*Չؘ(uX~N]}h\@ 0o;.:?1[U峲JڏES4h(ى$s6PwIdRq#NfbzozhׅV^UA4C lkBPB`s , Õٝz4 WO+*,h#chz~OnͥzT<^eEL".ӳшK=轣y,?n 9-~Qgp(CD NydMs\oV5D+zb\x-ݚ[׽P6b,NYd j#/^ʊ:Ҕ;%(# CId2s&:_o{B7[ R -QN4[ jȅ4A0 hBaɠ!j D#RI2fGJ0œ_H&goC\BmfEO-.]lbAJ KbKf0B!"%n]ls*N>n|ޖXKm%s@P.`nqR Qj;mwʼHgIsfU=,8"J?/@،BHe)͏e2? ?5 uOʉdiMD($P$Gu`{XyY'ڍi+rz5q&,㷟"ӌ)DhIu\2n 1;9<ʬ_D2{{I74KM"(؆lV|)M ]뉫{{V4R*q*zEL8BCCԼt`fjY ZX00 o6Sxc$/iE'eǬ7vXNKX6YLN%}xt%yk&9  OVq$ wl Xu~t pǧ 4,sT۩0|T]188ȉ fc܀P(%CHF _P\ybdǎH,s}tB_xr~YGv @!,Lq7}/:nJ!,iWQ#[~)9 EȶpՆ߽;+ yTNqVUqWhr(B.(Ο?X,SN,Z DZl29sB7n\#sZ= d/(5bhGLDB%)5dh$dN6M\ ֒Ɇh*kH)͆mJJ:+^D1 u\כ]w\:TEuT-ZyhخV82oD @6ӧ.ڊwylہ4fgg u%h%!btK_WYG%:Q.qEd|acFEmk$xwр{=3eu(/DzY\kPk'8Vl/upؚ2:蚱)֭[q!e=X,M7B!ŢEP( 1Ї|$d( hmQr3YfH'>Huj'SZ}#&vrʲ,81 dy,/< .mfse8z̹t=]Mx?ÅiPmWQ]i4cٮ.$I48{,LUW]95\s-Rl5BsUqLVs7C~fFVT#e8)5:Y ۏ_^177u ˲T,_3͝`wp1UR3sɚ[y]u) $RX,ƽPTaZb +Hr(Vģ:ffb1"xd.32l,XAⷉ(V.l$)&&ÉGx]w9_2HS@4`>RnX(逦d rucTl^.]d{KeTGZDKC[H`L4"p& o\,#l#ʣ73΋Fu_<6-@6W4T6'D(R, ԾX,"Ŭ( $קEǹ>=p8h{Xl/t:-G>ǽ[6BFmvP%QBU\!D#1n^ ~02dzVd2GwXQTWT2:F}zZZZp!DQX UUDP.DZ~p;P(Jv|sCOOoG{{;< aӦM/Bu""bbb`gSr\.={\>Xj wヒ??Aoo/qؿ?nvl޼O'N`bbaK_^}Uwxp7J~?AUNFV?-wyIdYJa#`0Ox \ܛ.hcm*t+ ́aCV'T\7ODVL?~BFx҂={R  ܹs裏裏blF"@OOrR6oތ~tuu!bٲehkk(0ߏ;S./ w>|{C?ZZZ8p|(O4MM,ՙi8(Ra&)noo#9b̏#2#yRɦi" bƫg "2BњhCbQ;bmqbӦMB f{p^;xARq6L MLO׶U{Ӏ( Ҥh؇E"LMMa޽8v`Y֯_w򗿌~^ĢEF1::l608R|Iڵ V`k/|MtvvbٲeT*!HG??ƿcݸpwػw/&&&p]wqݻwW_0Ο?[o7nO?y8qK.-܂|Dž invy|BXQ,+̙38w3<;v;H$d2H/d(:G\F,úun:r9j*Z P vڅ˗cXd ~o똝Ů]pu᷿-8-Ze˖СC.L M ?!z{{Fr^ 1d/|V+94:V^iutuz' b~tX,D~M.jP5ʺuW~콑 *Uji7MW\q$:;;yى ೟,TUӧ1::/?xm6ݻVŽ;/0776  … $X})\p---8}4^\pzzzo>l۶ \$^{5\~ðmmmm8~8Μ9CS-[A ȑ#رc6n܈?~1(> ϣNBP?̱m?7u>oȜhdyaGsR7r,>Jk^@}Gxп(ng֥ Xԅ {;VsP`W?X3NsN>Öea֭x0 tww㮻B8eY(J+80;;(={矇a?{FQ.d(۱sN9sq=`ll ϟG?p]wT*/`jj = [n-[)ݍ[nH333سg-ZL&*$"E}`:];GdSO1[ԣu^v]F6_.ĩTz,džuοk]=09O@VH4vۏ\uZ u7 'YS-&v 0ML/d2 cӀXbG)rPL7h!ySwT*AQLdyAuDS>qf^<| O<z{k⭧Ytu./|l'`?fu֗jgq #LR<^KX:W .vcD1k32"QX,򑯬T*HR ~p/`MӐ1TE6MTQ E؆~6bIj/.~K=f *Kvyku@@ӫmbk`A/]2^Iy ~;PuSAMET SFS⌟OJGldNiL H=TIOY&,rPw`ÞodX*lg+*Ouoh"_]rD2 N"yndA\bk쳩 eNKD~$qRBL1B0(50ީI͡ tHU(ؼnff: XPEz%4K4y],H'NdN|\{)ɮ[ҕ)*8hdNi׊d& ~ d9Q|YYeN@(2SGס# cN8,<{T)Bjf(@S ʥ>ڲ~`$n6-؃Y#:{ H:kpF3;qӰ>8д> #+mf@%HS+q@ ؽ޼t1MҽhPoGPQ8/t}q8+.:VW*^3Js_0E̶TKEK4E4{suN(Db(9*k6r [hJS 9vU("RVQ}j!)dsNeu i@6 H>؞;>z g4:"(˾1!~82+eP f |(W ~4u.}' mLAGO+eBT4Q&]{liMjL~* jRtT}Xuͮ,[dT :^g HREM_sm&i \ƐbRe:YԨZQPs'-$vjbbV| ]T BP1ԌjT/bD(p(hawZbES@`Zb?Y.D.9#cYxB*uŊF{֚0㜨pTӉ梫XQt\2!d3G|]~*F1ē-d)ΈU (' `.sёyiFR7zA.\rt_H5k0_(.!@ViK@ğnPu3Yd~S< :AE#UpN:Gt 3Ak{I!=HŅ'~]>EVvVC(6… %CUetKŏ jܴ$?)m >Lctԃ;h~l)&F Q\'68U?|d@7G?Ԁ&OXD) m#CPuuTUE-"h%~i2~s]Gu.ldbC =m:Ո)#y%b2V2&=(4EWmN ׽XK1[,Ju/ZzES`,<}`Α,`F{R+we,{j4'>`Q. ~W6_-nZVty' eJ`qG7)Le]R<^A1}A:4ɸOO5fWTm$⢵\q dbddk4mbbyEC#8C4%]@:]G6L} Cv"4+XجkI]._ęUN]zD9*kpr^#TX(H̦Uy6`9\JL<&''p8ܹsF"4Ҭ ɑ:(|D Hb8:Hd"G"[+rFIL2BNӈMvz$ݻx*%@Բ\tfbiٮBX,.n( l8qfթ%EHc_V(AtQe膸8)UCLCVZWx-ʫC'ӓΏ&SfP^r'_VլɽjUmm`7uFJ#z5 z@Qj>>H4S7&FuCCC( ( d2-)l$KY-sQg IfL(5ؑF$Ȩ\EfYĕ9ڽ~Ѳ O|ߡnÏ%XaP͛88['K"\5(vẛىYnX#̀jO1NpiNd_1*S2e)6-cI$YRL<)"N'?-,*empJXUO[( h$_d-mG Wes(/_^ vyE^Zarw*Ϧrfnbn')I=xeب4f.~~1W2Ə LB[pi@DZO*CMd CQyzEz͕H@T*]BbeJ]'MK%2C%ښ3VUg3\k7g>-HGEl& *v $&U;2L$MJSu*cnR$*vQ bH#\Y IDAT pӟݮ5ck`xk5;yy5o ,M1mی9 5ĖaZEbN6hb c{/:Bg)]~b/{o#< xaBc ٦*'Wpj쐹)d(|P?ƚRZL|4hkkCkkkPX҂%Ml'*5mM6BN= U7GQQz*.+ʞ~e"C Ux9z; e]bHYz{{C677c֭رc|ǓO>Њ,4\H vLҳV'S[zJC~zlݺ5Tg2@OOOx]xػw/x <#عs'Ū&4g?Փ4ѿP(ǹsaÆ*(gR(=a=kmJhŴ E*+.8i o.7|yJR3h.o T縏=z{{fChI[;sL(Cב7\hЀ\.WE?rk 7 ꍍhmm3Ϡ)|XMMMPJ!Ʉ L"#\.׿5Jn݊{lNCt:T%\tMMMa.T* 'OV d%JΖZnh}No3E(AۿQHHMV^AAJ w\!w|< 3\j2:%;(RhhH&&EEklx88¥MgT*m۶]vahllD"@?6l؀'Obƌp`˖-x{ᮻɓxbyꫯ'NٳxGсK.s=;vo7bΝsR H&8r-[u0W}zj xp<Xf ;!<#Xp!l۶ gΜ+l6n!4\r%?6'[oɓ?R 6ld:GyK,ˑH$_ 1Y[l{gݻwٳ׾[ɓ[yf޽l֚/FFԘ/#>)* ۘckL0sYyy8{aPeQ}:n6`ƌhkkG$ЅBI000PE+xwo|_=Bם_~]]]ݍS"#͢ҥK1c ,[ 6=|>)%lՔ$ g̛7+Wą^3g _2.\+V`׮]hnnFww7Z[[l2\p3g,X'OyIt;;? pma{ȍvMX 6=bF6D"L&F axx8쵛rt?L1ٳdy\r%{088?Oؼy3v܉kӧO- !lm55bxx8`ĥ^|;{@0Z@/ֱжBFnhhoӧOwc ]]] a=KJоJ8<Ø7o/_fnRG}:HT ţBYsH(†d:cQb4N'LԡFWQ-bL*Иd>zRT֑ زe qH)1i$,\u]C^oss3Bw'|& >g~!0uԪW[jΛ7q}3 Z<سgVX^{᜸. رcXd Z[[+wvv⭷cH$q뭷bʔ)x뭷---8qқ>͢7\t4ۋCwq~ӟ?9:;;b \|X~=MC /P^&;Ja~M>4mGۆhzq1j~??⋯LfO< )LLs/6yЄ1H`ݺua-СC袋pW`ĉ` fB{{;,X"aժUp]\s -ZT*~3fW^FL:x`'?uTL2A{{;.2tttqua``(nfL:3gĻヒ o }wHRRbxWGahjjW\+W"H`ll ^x!LbsK.̙3ĉ&N .s|B+V`„ @{{;&NuC8nܹX`zzz ԩSl2qkonnƴiӐJڊ)S(if^FS'a$^{ h4,Bx7<a{<>`ڴ)'c=컡g?hhh|>18$8)>66vx8T*** !ô@6qqRzNbX8Ht:èH$144)%1::z*|x+@Xyغukh=g\wu!CV\b1_ΝC:}b1U]ym@FF8<<>=HX,׶Z6wJ~7<_~O~)k҅A4e &CdxxJH)%BB+W'dI=EKDw٦s΃Ν;gu]4w&/>00u:5}Z.»p0621#'Ӄ 5kWHY1ft)Jukhhh߅m\>cѢE_YfA=aybUq7~o}tCv>{Vb%SpcRO4I 8m~:0 ll*4CL$ :~ܗ5dB "r9𥦲 p*Рq^]1&ZTc^N[nDkS0GPimVW/z͠&ӑqY(][o@mQN5l)l([ `)P#i,!R)BfM$ +PY V$>a|^ea$u4劢9OGF)i)THycBMڥhM]A LGkFL7ﱉ0M8efŘ8樊_c?ҭ^Pb&)jH7*50JrmMmdr*-z6bcԩM%afVD6)6]|IpYbZs9>4ؼ<"l=jO#M`:|#l-&L>a3'BL)W6#ٛ0҆D<"h*yǃʡW.Gr\.1a:uyؼukG45L;NjWdLj;᡾_Q(o~Wʺb>R-VgS*+柩&ˠXtBzh$12x=(v,3 NkS|kSҮ"K$&| -RҳN!0VJSCTcr[ͱN|#z= MWQ4kAlLOOH cR_e rhSAb1 nD]h4w3Uڢ-LzGӡR6ID7_ QrzMԔ>cSGjlc? fs2M&Dɐ(^ bGHe @)DRD*٨N=&ʆK6q F:jl)OS 9֫4gУFFulBzLQ&zN6K(_:[g;qlib pRjioi+xsx,K#҆])`3rQ4r؎;FUQlzl>L"ߢf|c6[":dRMj+>IXMwhh(o\O+Åpt`͜fdL;hj> *̌ʣEآM+WȣPUڜ+El#ТMQ>:ɩd"IƱ2Y4Rt5T7VtɤBTE@EwmW:1fَkH혵6}-Ϣ 烥lGMe9ԿvF6@Դ(>tso;\Zц'N뺞eeDEstޤ#*rt_]x<\ׅyb5uQmS[ec;bn"Bibߛcâ:yEII.LۿtTnG kԋǃ1Ɗʀ`"e *H%xI&8qmފ"ك|>X,{DP%|9!022JB?,-fT\ll=:m'*w6[flfˇ~er&nڧiLa|j 67\BT.xR<´dܹs8~8̙uk.J%r98s sN47713g ###xb밒6]Z=_`Jx[kMF5ahH DLSZ66 |HIZFsv8ZN"xTCCCҧ;Q }S3gHRATܹs!;#ŋcĉ8p&L. f!O5폢Q E[жhC#u4-cWղU,Y65|QVZg[xK9PP׭\b RnlsCc9(c2!3Ə$I\r%ԩSxC/d2Ve̘1x/A$I+l9FTO;E,giH7-ÿitclm)tDabE^Iț0dۭy:,~~#n|> ^VWX\A\Bї;|]]]7o Ξ= 9&OSNT*#,p.:u RJb1|ӟF2D2D{{;j{BA-D͇B#̶T9ZiרߖE;m7@S,Osh΄碐|?ZE>5+T0Y#43МqFXT*]y/ vFeL2J0o|6m ZٳgC疁 ѣxCu툨Ga سgO5S- /='T@-msȀ|ΝrkBd2B`߾}Z35S}ھT;brO~Yb~kӂR\xxHld(GMOdi烘>ūxF?ǜd R`lh$W'b}Gss3:o}[ػw/bXh0oC<L/2^{iw_455!놋/ 1J楔hii믿{D'Nyرc^ypAR)ET*!J%Nfر7nD:Ӗ&x7o6RTT.6S/:/M&̝s|>z6e477# 755axx?8 BؙLRwG:FTtƠ"6i6OzܔQ1YW,Uuƛ1岬P%bw+ivӧyf,[,)k֬AKK :7\Sl"@TB:Fgg'qq,81gΜ;$Il޼øqlٲᦛnԩSSOرc`aժU⋱m6ܹmmm0}ttvvؼy3rf̘իW=tK/ŢEpQwÒ%KpUWa˖-xWڊu֡O=9\.n ]tQ``A6Y(R78Y[N2#R!U&6-( KL,Xu3ٖf5Ny'tR\uUM?</^z]tD~ꩧi&477㣏>?xֆ|+xwqǶmksطo===0uT,Y㥗^¢EpW_|N_x7oBOg?Y\r%x122 &K. [oaӦMЀ?믿%K.ã>ӧOWuhbcÆbtv- ?(-HM&A]"1>4O$K"bN򅂉 V[a۶m8r&O={!7 2򕯄3L&6"a„ صkpcҤI5kV)ϟB)a̟?w}7_:\f¬Y#}H&طoΜ9m۶all \{|M|A>ǴiBE .###8t89'OСC8p<1}t̛6YY IDAT77tSB,[ [lӧQR)̟?X|9>+?>,Y9s`ĉE:Ƨ>)L8۷oDze0||_;5kΝnt'N5p0՛lʸ-BU6(8*W#i/sãLk:M2tB  톞}Y.c*Xr;|p΍!ngtqd+&MwމO>$fϞ(n`5<ٳͬuscϞ=oUV X xkxSڒkhh( FGGn%:t "-Σf`|TUQ93VO}GcI81.$ 34SfXhnҥKtRO?flڴ 6m5eR{i/<88ӧ?Oáu܌;wbx饗~,^f3ѣa3|:ǏP(ફ8 288Eرcxqi„ ?ϑd0| rTQرBT*AiڮkACC~Gř3gBo:9r6l/~ L2f! fz`K $A6Wz^Qje!8dhPq?jGK:ZojlL{Ǐ8E)n2\êɓPxmT*X,}iL8X xll bҤIaljj "R:;;҂S"b̙8 V466"Ncԩӧq饗bŊ}Qx|fYxS횦LN۷\&Lٳ\.#͢+LML&qžDLb ([vq@!AҶo!w~Ms磡l.(=?L?tvP49BТ_ׅC'FU-i9ƪdO:Oeahh*7ץ=5*K}-b Xx1N:e˖+$KRuu?22Pn5F,fTln>6X.}7!5,mnn Uʅ (yr,溉D" ;@xQY$Ffү HqniZ7]555aŊ(J8ǩErSjӜtcc`rlL5frl$2sR.̞=|uG=3lf!k{> dz0[QD}jH3׬ Y*6 ʙ'\nc)8dy#DsssSTx6},0+ fI,])tSu¶97)I޾첩nmvG \4O4d |~h2l&"YPL:arCvbXIXTz?x&Bd5 L2SJ9691|A=zj* `ڴi={vǬYىxCCC3g֭[2Lcll ֭R ׯ… qW7 .2 n6RX2ʠDBBO*655J$Hm_"RP*B<%шQj2Ѥ3X{LfnFwsV=5]>g9e3ln-QҩedT l^V ÑMT=33 nܶ!ڊ}v 4A]GǶ6A)FK8vϟzFY&A& elSLIo~^ +~ 1M\oPds}IhգN~,^B6]v2ب6*\Rr```*/DWOܫЯ󬁁XW_}5~_{,XQ"K_y?,-[W^y70::ŋpqaى;w+d|}_Cpαyf %K`͚5XhQء6m/ _f̘Q!<>xtAPD̝Q׀'f˛JjT>kC>pB60*ͷLk+s^BUUU>Dq8Œ\X`*]]EH@+Ӄ &{1twwذa.°v?^\GGG8X`FI$!yHѣxgJߏuq̝;|\pcXp!1m47ߌg}[lA"ڵkM֭Ã>Gb׾.a H$Fsss™QA؊"`6!Mi-63⚦&f7'=h&p '86U?V3@1HS^Ԛ蛠 _ߏI&aUW]k6\tR,_c``^x!q9̙3'tѣ\կ:u*ZZZo}+Bd2~8qf͚*kzzQ=k6%]H-YRِҎ1~:*"sQ>5E7 (6^9C`6|TJyVkU܇00J*_)pL=} :u*|߯:Mº~غEKK &Lrj^^5}ĉӦM ۟I=&)R`F(|8yPE6D$ʊv;g'[h3޳2)bӦ- qkLXx!G fߩoF%svX,V9hn=)޼io&6NZб6/_ꇦA~AG A1+~@\Z=LSFfJ0IyhJ~l#LLmCqP@A'SOPH0aKz^03Q;yR)rHQ^gF;3jn5Ns$$LزRrkT6\J=LVmxȧ8ltZ9┦CtRМ5gnH>9C;4\Xdoo/iRh3+:w-} d2i9!f?~LjA鶱ˊb8{,N<z ԩS(u?Ƒ#GH$"ۣ6-~uO 9$6qlo뜙r:6Z/ZnQ|[ůsDhf  G Ϋ,8r@\y#D\q\-B$5]̈́tT;s x  P8ZZZd^hss38JP*L&C  @6E:FSSSȡfH&a9fػw/x 466 |ܹsxBcf0Ͳ(|cX|>Z2vhH?UGӸ&pkƁ~z466Vy#(\୥bJM"-,K+}Mmu$!QSz U̵gd>&.n+=JJSYP\R ccAA;j6ߏocҥذay<ԧ>D"6Cww7&N{/qp5ذa~ 3g S-_đ#GJ022+xo-[`˖-Xb88y$c{G@SSGi'oR" %BPaNތ2>hK@V,\( .ub-3e _sW6ϙmr* zj1M9TIN}t@sWP<s1z 4Y9#8AQ~eS-Pf. UaRft4!W[x T> TnEG?ͬfM(9(fOvlMܗ)**h`S(yPS(򱘛5)rrQ͝dmenF J;^6``Jن0T>KC|PհiݤFRmXb~9`km*2'Puq^W6VzK%ϘBE3JҾ/=!+qΜh mhDIGlsD'54ږctWT-| _?D P><`/?~{xTgK?(0L#cTJXiۖ:Jjl)i 6a6>~q2\> B)~+ `ʇ'px©(gք(`+l0[2l 2u=|ĝgڊEZhV1ߴc>(8 ;R)ߘNJ#RS5-L(5-QQt:56(CJtRP p)qf?C~ (H&S.S吿<(81_]ROXulǼvP6^[#ČBxjOV,HE2%Gg ѡ|k6m|.4Ť2ڢ2S6Q`QM3B[t$ ,&!HMfB ija?$&5aUiRxPRp"P KN .\󊈃5$ik~a7wsƔnz*DyzQ 3<J"ЮUjvuL[zSvgi&hxC4Zg7uf~-|𤃄T(Eps=P^|zFc @y# pByt>渚nRU5. ~?Ϝʅ#Q6٫S#RRTق JH58:ߵU@ONeiom돛mPsnQ =JԤ\\P 3 (Acґ`gW IDAT^ y}w ~<R:9O Qm\b.T}潤HOv/¢~chBr5&s)bd |!X 1X?N*!%WnG,)ǗAmD}ljA 0C*( p sj`pC*?FH&G ׌2)ϦhL:2آȑ9"}0uү̎v?ǂP"ʠ`О UfK)\B]- -j hiflF30H(̃Ph9uw ,8ޜ0K˿v-I0Vv 6^^ڤ^@ CFevj. TV㺮K0sPi6~C+̔2g|jekAS7:t2.Tu샹P}sx<x^ L9`B|1p0s8d Ά\_0[NgfTR;(QfA.{ $!d%%+ܻ'+[ 8Pc>DEjik[OLH))鎋M󡘄't!/^a8sQ.$\)OOKMi̚M1u~TѪ_kZC'BBf4LzEX{{{-W|%Ba4>|{jq-śM:mmXT&df74_h7iRUr%A@qGI(D__IpezP% 8kR(`hb#7EG^|fvli\j1O(tp]'.WHَA 6J惣}:Ҵ*Dl^DŽE1P$$pe2S% +20I) L[,ZЇF%ʞ?!Ce c RN:Ȗg[)S*iCe*+.-#'XvQV/jk#q&5*YUʐ|pYp4@3 6c۵F@S(3<QR~q{2L&BI(W)dq΅6"EA#+eS*jܶ$G6(=ϫRWbdRMfCIQFe2Gflhhۜ( UEh:AI T&2x<݅ 1mpAQ]umQe.RzPw../"B;_4([ltCl'imkPlԐ?aSy8PSu>m^:0&lxcKehKl\xRV=s%=!O?~imTچz}6bQspx&eU8A"sX8kS)=kQզ s4Cl[6mٴ^6\2jnUV\ 0liAD-z*ڄumL;x nB:#7ξ+В* yh yeU6U >4Y=*omd)cn Mer)dµ-~bJA2A9PML~ebROS-t1 2mstof}vM;wIM*\BI ),Xx`g^8GJI|35!m3(l"Bs.`4a 5vHt,I4ߓjÂx50Vy-d`1Rgx/oq0(8܅_Qqk=8 iDUf.j Q1"6A݅h*ڥs7y=oT?'<3s`ūrb1HQQTQ`Pm7g0ui6o$%nW' w3S=KcArt̀5p8\1dLd[!(Ȋ@2y#6qs#Qnue[]kZyʾCw|_zJ2ߜ+od٦a o2oЙ&qeDE(s@`r!Xr$J~ gfQCÇ ^Q4[Q|W`_ V+eA Cey IDlFzŠmQLQfQ69nmS] ǁşWCyxw8\<߫lFzmR[plQŒ&hli` ~S |ԻB< 8\LAƒgp|o7\~/4(ÇąCɠE V[ǰt(|6Q^=jscV3|baL3EibMiqDS j^R2̋BA SN&sG@2Lq8. [ ?xCse <00ɀspC ^x0Q3S96E%ZE6L,Xmkpp8/ʐ,ȘR!N9nڝ K,5}=m5 J5YHaت񭒃Aq\0D#wG**dҖ F|bU({Trdrs&?| e +2Ar\y߹{;>,Ń&> )J",E,'\e;)9`lmˢ"lU옉X,JtH6mǒMzD !AA`{N8En)p0=|:)E̳pMt5fY bq v \ ܭIOH;慒rBd`N&PE#f|A'l#P`.Ql -.wܨmXR}x9$QCZro H n6=CC[E\2Jf]u^w!n{QsEͬX[ 8o`+saآ@b1^ChX6@6-0řͰWAŮ'?Rr/괌l̕vI4;h.5vI۰AWY:hUAdn~kN[l`PP[wBpFHIHL3)P`ۋ(./3=08Aa; qw]P"Ѹ3z۞r2ȲQ#e-8BIpq lʤU0lV0c0Ŗw`814TgIIkoG4> S xUl"( HAql6AqsxG_ix!D!W"]Y\v4O0%~bVt P̥ancyuBMH@1Q@I)&~fÞXn8.W 8%pA1) Abd G&-VDǒX]&AIt)gNA=<0'XZdegܙ.W}rr㮘oem~w7詟V*3m2(0H+K_Rv9a^;)ɐ1X֟*gIRHP cݺuJ&WH"rs)߅Mi͹m큐t3Y9[6n,)g w5A]J+@B=**@y/:KlU?_)7-'r/f(9uͺ%=-1uI;k `r5^{1Oq๊IFٚ7yJdKU!jO?%?ʾ2]x FʋMW$ݻw`ӦMXYY,}? w<&}D@mRJѾi*!ei|.$JDؿ?UqѾRacll J)~fffpE@VR>[5 C@--˙fGJeH,V2E@U}sY*pۭJ!ͅع:1u\(I+Uv<2Z/2s;uxe[cq'E^Th$bpcWiVZ:0DVs†ׯ 0;; 4&"2v4qG1$4Ŝ7S0555GzL8v{99sDZ=vΜ9u^AlݼVq:Q 8{,Jw#%^xX^^ƍq!o>pqy,,,`͚5@ZXPm>,dReJ)El-EƼ( 'Oq%R$6|zͶm;wd3^/{xZ͛m#]4@:ˈAyZ.wlCŸ${4E4oAH+dtFT]jyc=O-uϹ}[@\o%H,---e0/%ò/"y z`M?<~%{VOjJ,xmbP<ϯ$WXẢ~BsSHX^^}~*944ٶݎsD3yc,Z1'/EEӛ"(*!<_d)07nW;w?k[mK^ϙvjEuR1r!CHRJ t7tbbO=*JFT&ֲs$A@qy8AP0VҒg#̝w(v \t\ DkeAr=2 E7?WzFIDAT}#k|i_l1k;4B$o2{Jk"AZWpͤa)PP}!m$` ت6V\)ΗybʩE8\7y^2Oѱ6<\+RB}Iv +lݹZ͉?:Jl# 699vM7ۇRȡ/ E jF0rdxcX,s\ϸ2֬5G>E)DVŐg}%']d>'cd_ė3ˎ8U.haȽpGϖS3&\*;U:q0ѡ`VjEx(6,'c-9O˻AWij$1ˋJ:2ֲәϻ{";ك-UtedZK==>=c;(Jߛ XlID9J+a D ۊ9z\h ^j4Y2de].sL e iWXH\2O Hn`tQ{/,k3p?YmzQگAض̪.PN9Dё"bx¦‡>`aCz`/Q:93PTEQR`F"Z9Tv]@˗vJچ("J [ҳW-O$ovro:n^kźv`eKxS,x+BY3ӟ[>,q  dS δ @Ie@گLzrܯC# e3 T]9U]}{6rR,g2]ǡja͘= RYx wr؜yV}\bt.z,!#\Wwo>7mVRq\~2^9ij>4Zxd 蚉%@6wnwI a!l20ie_eU=1ƪRYZ%j$L}Y=<{nA a-oݷKwwITDDȮv/T3w !P.S"X0q|o[Lf[c|kR5q&ۖQƗG2XfIcZ.0 7Is\.gUǡ DQsȍJ.K'ifO+WZՔP`$-KKԙ[Ca\L2,> յҽqn=7 g2'S}u`JAf~sU=-+w ,2AH1 ʯM V2)P}֌}vf܍[m't.c|zn}A($ڋ3T":>M~Oi5I:CYRؑ0ֱ2UO:$Kf-ul۶ 'O?ݵ"?0* y#}셓qÚO v;VA P $He>:dkIeK@” V $:s28:*[.bquP0|,_G[>>V y%PMYڿC(jsQ(‰}r۾s3[5{q%^/AVU?X = @Q_u~Pyur%UFu/:RH8.O:0޵8fZ)~Rf7ǩ+6,bca)`4V';Ee6p6|["mߴi^8Kŋ I *6\u PZMŮ;pSjy:WFҝcq^UYs'I"d6./nWed +tOnnX%ă[: \mo/|iAk9,,,*46d2SD+Cj@ aر%M6yZ{V76TG1)yy W֣ *ub:i8STGuq:=e'tge=oX*wꙁi?)2A:,@74Zǒ՗")4h4XZZXtjت'w?bbbdU&;"FT( }1{vi,//c,N@]ZZv.oHy{8 -V]6^Sndvf#` `(dޡ:Kqz|++Wc||<*{1Jt(m= &^@ܾg? Ν;!'w*3͒j[o3^P!LIg+k\]XMwBSBߟeܕp0$f֏SY-&jlbaaocYZZĚ5#_o ‚2*‚fר. 'O$:|gMڽ7L#lԴcm%UbY1^LoA"v#ˮpAXiFdF_9+M-v3.r§*ְ]3 H1W]O@J}2^HAV5}óǞv_2ŷ~r7c_,SVqhԦqQۮW'OrIڽ/A)lxHGR3 wrnX|2q<ܥ7WA+{-HĪgyZBSгTQF_XLq 8 fffS¡;wmƷK[s8@mAyuʓOx~0uZnp5bll Q+B$<bP=BdHj70@3OrJ\}zFJ]Jk 4pCn&_/Mbg"+HbkG )vfDhdV]{ry[n}+_>)Ŏy >_iDHPn;o> y5T$ Hi&5Pi`FyA;n=LUnFδ[bK5.^ߪ+k:HRQQHo)KJ!-ThXv K+_h5-{>=»ر<[@-,,d ,7:F=_ܼrZ/mW_Ay`066_B$Zk0wxu=.:f͏yTNm>F}1yqwwCckJBFjuJk9m@T0|?t]`l=c U%LYf„^nĉE gvy4 ʘۀ s(R[1&&c25zy^qy'OlwtJ%WUٲ,$iF 6z 6n܈;k_}3*ڽn,?#ooo0|$>2<ցxi#`|`VRx3>KkƟX^|9 Iq]w39%0P|=`dBPCvuz"\ 6ݽ7Ύ \RZ"KEW6b,kC)h4l6E8'E|㏁)^w{gϾ򀏛nڏsxǏi ~n@wu_er/~;x:x0=|^ʑ# ?o'呑w^* > o}簰 P,Q,P,>  8OrHg2SnQt;[tIL%^uU\4Xl*wei "BjWES0>6uk74P^zo|ҟX>||oS"]w݅wZ^5xG>և Vk6T0h7;x蓟{A:Ǟn P\xE> Lpʥ]jfAh C)m^ rX,y$X'<5^xRPY'X]acMȕvy6ٖvdߎYGmkbn͞DܷZMţvC@rebr#k ;^kɓP~*!#wq}+ˋc`@ vw܁x`I)/y{h%RxLk81Bj?i߾kT#U+ܕI^r.MM,C/?7+_xs7xGGǶ/,,ApVSy Z= cY4i֭{?MQۣ !ETF,]mBQ,h}05Q,! (+yc Q--..V^9y@-oʏ [wlv+cR.V[Fj! [ ExҕzK.0G۳oї^E-=*P =_9F+3\IU9^7cuc N9 >Mkz :wliCFTT<cJa`rrrԦk(Ka@R JVkZ];;77?>@z!@!׉'D%UwZW -ПGɐH1jB+ޖɕ'OqdGJY('orb|bjjݖk0::F+.Gpʇ1 EEh4.9s3OmaIFl@B~>| @%f1>RÿŒH~DDu jyľ>gϞoy{zoN:qx≳1^N,齽R|/Ə SSS7lذm```f !)FK6rP(Z<4^.x><cLE )EޘJR+hKsQRViIO^8C_ܲyz+&xhT)k"Ѣ0 S-DDS3=J1~ E^ H6ܫ'NJl`M`A6`gm~m sgGrΕR*8yO9ĺw&Wf8FPŐm.!\pw馛6mA?q9BYI0&H&x9|E 3\.?y^%t7qhAP "j`DvZ9qHj/灘|M,6H@BVZmeh,,7FVt;B$(BaDe=j#z06{ݻnjj@J%h4?y5,HPm 8,r8ۀE%20^rxbӠ CCJ_Y|[֮]jfɣ(>O0P)vi\`yE1ΘdyupcD !2 > 3&!$#e?@)dZ,2-Ø㯸B 9P()e/֞~ DRK\Ƴ9~3%hsye|r<ːM{쩼511!"!j5yCf>={za=~j<>f80LeTx͛89'_~_|“O>yKXllkG0*S]B{ =D gv6~'r˦M׮]!"/LA΄l6E^N KΝku0^rQvkCf**5D*ǒ* om۶ ㌳P((Ƙ"k MCy8z30===Riz(Zl6kz=}nyy|ZmN>] 2BLaݶis]^[E^k q).agJ#E R(zl'e,٭EJؿn=p^SJa*zAx?rߌ05U'*>s=R_v9<>5͏_ǣ=Ma|(H8Hw7ܰ)udq|,ƖL`H=*̦C\q2F$n̈́E;Jc"6tɱpZ2 Q^@ '/kmm64Hc7,ߗ?3-y܍is];<ӈMTQ{.]&Uf99jmyNe:ӈlyj{nl= [U;EhFS%˃n^樫Р;X|/f 8Tm$J>KFQ.1>]tLI #vMW6 -q0BuО7kuNutG<Ɲ˙i, . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Label { id: webLink property string label: url property url url textFormat: Text.StyledText text: "%2".arg(webLink.url).arg(webLink.label) linkColor: UbuntuColors.orange onLinkActivated: Qt.openUrlExternally(link) MouseArea { anchors.fill: webLink cursorShape: Qt.PointingHandCursor acceptedButtons: Qt.NoButton } } ./examples/ubuntu-ui-toolkit-gallery/images.png0000644000015600001650000000314412700370701021742 0ustar jenkinsjenkinsPNG  IHDR/.{@ bKGD pHYs  tIME ,IDATh޵k]S;i)CڊzTTB"ih-@LԻ i$|a4ţhBDD>0fFx RH eʲ=޹s>ZdrH߉*`)8 8>1|\3֪ l`0!粙ݷDGdv5ǝOsEh 4/l"Un +@MP vrxE9m#| S 5L|CIO`tr20.' V@WM, [nxBmnod= 2!Ñr/JXɽ8)kA|Mdjڤ ٣5HK|ҿHmRyOw9fKo&"ƕSj*:ƀs pUKq x8ˣ; `w#%+2YU/0Z*_#c1k?eVt5bn{SEZ003zTy&L; #yN~(EtL*sĿ JKU;t>WF(ijS8,M!>o phHRN%#q >EjTJK<8%."~NAE]H3MsK'W@d՗_I{* k7raFYc< +8+U/ +ʂKrÓͧ uaU_T6=p/ ZQW^+P);;:ZTtdJq+'->Ot,cEM?l˯5b6'Kz&10 !'zKэ3 eX᩸M -{Ƥz, 5C_KȎ./! \&`pv|8و+i" xbY9)RҢ]A'{' 㢦 )Jµ#eD:ɞ6F~'km~ݳN2Oj*K6ϜҴ9 <&wԚf* 渏TVJu BERlJniFmmZ]QG7#ߑnI?.">6Q׮BQ;:t3%+ XǺb &LIENDB`./examples/ubuntu-ui-toolkit-gallery/avatar_contacts_list@8.png0000644000015600001650000000443612700370701025101 0ustar jenkinsjenkinsPNG  IHDR$$tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp -NIDATxڤXIO:t2vCH! BB\י0Yj:,$c.WW/&H薾q."ʲ̡ߎAt:wa,Ǡ%I2HB<#Ad"dzVŻ]>Ӝ; 3@cAˀe`lü;orfprp]9waf4}Ӵ\+;H#k}L"L8Ƃ~ي|K57fAxf vʊuSSS29DfQ??9ZZ$@r?lx'dkkˍkڱg QdSd@?Hh,6'yw ߂A[ZZ VrnjlT̊U]MQQs`½=fEs'r༁YB_6XP榛A_زuȑ jV3̀.//I1o 6h! 0k LY 4ic^̖Ea]cMӉewnG Q ykp=&n!qr#b 5dM&S;~&33Y[k뛞o6]/Ԙd%A޶t٦V RYj:=|!߼ Q܌U׾!h: JSlMLP*> R߅eɌEb6#YYe=ǵ } Z4#c;/溘tȔG+~$1N>ҵ/C TBNOOU_\rYA2LfKJDmsXxqtK&p&ѢՉP;]2[('/KJ'𸟚 q'b\e2wp `, SQv 0eK<נ =Aʣq9F_4tCgJJg8} q$2U{^P `ۭi;H\&x4s@1yEpKI w/[]]lXxx㣯zؤ'WM 4gmll]=9oQ-O#p. */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Themes 1.3 Page { id: aboutPage theme: ThemeSettings { name: "Ubuntu.Components.Themes.SuruDark" palette: Palette { normal.background: UbuntuColors.slate } } style: Rectangle { anchors.fill: parent color: theme.palette.normal.background } header: PageHeader { title: i18n.tr("About...") } Column { spacing: units.gu(0.7) width: parent.width anchors.centerIn: parent Repeater { model: ListModel { ListElement { text: "Copyright 2012-2015 Canonical Ltd.\n\n" } ListElement { text: "Contributors\n" } ListElement { text: "Tim Peeters (#t1mp) " } ListElement { text: "Christian Dywan (#kalikiana) " } ListElement { text: "Zsombor Egri (#zsombi) " } ListElement { text: "Florian Boucault (#Kaleo) " } ListElement { text: "Loic Molinari (#loicm) " } ListElement { text: "Zoltan Balogh (#bzoltan) " } ListElement { text: "Benjamin Zeller (#zbenjamin) " } } Label { width: parent.width wrapMode: Text.Wrap horizontalAlignment: Text.AlignHCenter text: model.text } } } } ./examples/ubuntu-ui-toolkit-gallery/ubuntu-ui-toolkit-gallery.qml0000644000015600001650000000377012700370701025564 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 //import Ubuntu.Components.ListItems 1.3 as ListItem MainView { id: gallery // objectName for functional testing purposes (autopilot-qt5) objectName: "mainView" // Note! applicationName needs to match the .desktop filename applicationName: "com.ubuntu.developer.bzoltan.ubuntu-ui-toolkit-gallery" width: units.gu(120) height: units.gu(75) LayoutMirroring.enabled: rtl LayoutMirroring.childrenInherit: true property bool rtl: Qt.application.layoutDirection == Qt.RightToLeft AdaptivePageLayout { id: layout anchors.fill: parent primaryPageSource: Qt.resolvedUrl("MainPage.qml") layouts: [ PageColumnsLayout { when: layout.width > units.gu(80) PageColumn { minimumWidth: units.gu(30) maximumWidth: units.gu(50) preferredWidth: units.gu(40) } PageColumn { fillWidth: true } }, // configure single column mode so we can only size it to minimum 20 GU PageColumnsLayout { when: true PageColumn { minimumWidth: units.gu(20) fillWidth: true } } ] } } ./examples/ubuntu-ui-toolkit-gallery/Icons.qml0000644000015600001650000001157112700370701021560 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 import Qt.labs.folderlistmodel 2.1 Template { objectName: "iconsTemplate" TemplateSection { className: "Icon" TemplateRow { title: i18n.tr("Scaling") spacing: units.gu(2) Icon { name: "call-start" width: units.gu(2) height: width anchors.verticalCenter: parent.verticalCenter } Icon { name: "call-start" width: units.gu(6) height: width anchors.verticalCenter: parent.verticalCenter } Icon { name: "call-start" width: units.gu(12) height: width } } TemplateRow { title: i18n.tr("Color") spacing: units.gu(2) Icon { name: "stock_alarm-clock" width: units.gu(3) height: width } Icon { name: "stock_alarm-clock" color: UbuntuColors.orange width: units.gu(3) height: width } Icon { name: "stock_alarm-clock" color: UbuntuColors.lightAubergine width: units.gu(3) height: width } } TemplateRow { title: i18n.tr("Theme") spacing: units.gu(2) height: iconFlow.height Flow { id: iconFlow width: parent.width spacing: units.gu(2) Repeater { model: FolderListModel { folder: "/usr/share/icons/suru/actions/scalable" showDirs: false showOnlyReadable : true sortField: FolderListModel.Name nameFilters: [ "*.svg" ] } Icon { id: themedIcon name: fileBaseName || "" width: units.gu(3) height: width MouseArea { anchors.fill: parent onClicked: PopupUtils.open(iconPop, themedIcon, { 'iconName': themedIcon.name }) } Component { id: iconPop Popover { id: iconPopover property string iconName: "N/A" Item { anchors { left: parent.left right: parent.right } height: units.gu(6) UbuntuShape { id: iconShape anchors { left: parent.left top: parent.top bottom: parent.bottom } width: units.gu(6) Icon { anchors.fill: parent name: iconPopover.iconName } } Label { anchors { verticalCenter: parent.verticalCenter left: iconShape.right leftMargin: units.gu(1) } text: iconPopover.iconName } } } } } } } } } } ./examples/ubuntu-ui-toolkit-gallery/demo_image_2.png0000644000015600001650000142275412700370701023021 0ustar jenkinsjenkinsPNG  IHDR6bKGD pHYs$$P$tIME )5 tEXtCommentDBPZ= IDATxTmkO7}=޷zbQ4C4%5#TD삂h2|S{^k?<뜷fs5f<[70 #ߑc=@uJ)ggT(`{pV+ZDif1lJ0uL㙾jQC.}@)ܯ7@ͅc `HQnKL3f&^__y7)!n8$JȊ %F#c# 9nLU|<qFCd. *lpعE8s:zdG\  7vP1tr5l +T+Hc*88KLtvA΀ n,Z++HxA?*_3JB F0?Z0 "BPJVPU"m[*Tc1(T6 HUS*PVv-UW/%\kZyJb30CAD`EeWTU}p%XS1Ikyι[}ٶV;i9aQ/{dK?iBmzu8(%qzgayxrۍ\뷿GŽp~ 9`m;gZr)roe#Ǎ.\3+DcȩҩT[v}?LdYו92Ǎ-ej.\}eB`YDPbt]}oK)QL^2۳~ylaT0N(( vk(11=I ny[g. ^Xוx`7lN'nUe! # a''pR4Н\vNcBX!]O;﹋cϊ+l{bl5iGTTCEDq"J)c u"$'ԚkGq-d2<0ZqVh`k_ȟcbNvO1ZEiT\ <ӉW!c r?J*9rGJ!D+wjmM!BA;6&fSܹ=9 ѭn3q9p8PJr0M@{;sՊ>X}=lF? 2#Ӊu_OG00H܁)Ԕ1)"b!8RvjIqq0>huaXQkW]K9Ρj('K+fl72۲;Se<_{$h&otu!t$#oxx߸_Q51yR8|zkɼmo噔vr<=`O*bӉ3"B. Mg* UHU:ױ톢;ySD 3e+"o*#!ŭ55RUPG.\q] >txa\wGQe~ӹJ-ʆ!ULTCW-Ҷp8[\2 <\5wFR'qjYe'ZLq Lz hA,[11`TȦ4iy TjM,)'U* ):l+:gU3kaEATER1+MSTix}lV hUDUA"헟O5Pb @ێz5eJݹx"UF"gwx[q3y0yMV[YVib#(acG6sw9py As?X+X1?w̚#x~-mn|*ϗ #)W#߉Q)0Fn‹\1X`}8Xw%{1/w_N*vÈ`C󂂣A8 Dj2T۾v"`*>'p  @j9B1Xk6yfRm&saH n 4_> ^泌 =4 =V? cU6Eg4l"dJ S18VݦTVJa*B.M-I#FDSJ"Ƃ悵,ΚvJEPUu|kA:>Ns1ʚZ96}p1JuA~zZ빥J) V6n˚ ΄sJ|c}CZ|lh̶m 2.tۣޢiם8t.W7FT躎gސjPW*iK%yN*y黡.k8?]pĶ8N}X0Qnt} &{8D,}2d),q016`焻d8@8U\s>_0- _xyOb׏X}7p/Wx[7)9qoX?0nO$}o}G S 2a}O3a"3~/ Ƒm۸恩cY麎pDa8#=(8Rط=Qۃ 9gLq]MCݫP@7H)c8kLjk%M\`'DF1Ʊ}t P8,u' y `G|OPҴN̊dV1"$㙜k{ϭpUdJ|78+'dj;VMYGjl-Ռܤ:xS`g޷X+iͬq'- ނYp]d´ພ { }y^LeX!g&k9쑾Y3ZJLH0s<Ȓ*#owx+ٍE|y1wqc~0vt#9Ɵq8 ;taM}2À~3 Z) #+tdo 'h_o\Z^??ɶm|Z"=:⾳;ͭE&pzzOIm1sg1+[0BM+$-যDyS7ʞGDžћ=p0`1 !93m95M.r0# V!9+4)d:c;m9²v~0܊#y<k-Y=v!RG1p8ƉyaF7y^_t8%'әqy'F wVat:NJab*@ ~#G^^e1-: VXb"F9~e|K 5ܾZw3c֙~tO.\_?bPrK1ypG@{j͔ 1.Z(ZX38D!XGUdu.\pp`NgRaԐ?vS0].N8ضqgue&pF\"ux(͘6t~}Il>w}0㚟3"m/N5pBM;JH7)n=t¹|CT3nYRc̄* G1=r9Z45p$'JMQZє Z% a؎`-F 5Sm)~I`oހouڀA'ii>m@ @EUZ3#1XӱO̦EKT!RH4VتPP s@ʴo)a lK4WnUAQ))FݝiVj)TBux8(A,δtg'?Š$Tƪ*d-+%gd=ZoVSMmKsFjI-3x{Hy\@mm)Jer醞U!LJЍ <܂W$W\t]K[].O,sDaY~$dNL)V@?X|qwFmO~@e&ַ<_HK3o_^ow7'rDWnw\VFG}9+ŵعa: |+ĭ(۷r>9@G~G\E2|r|rxeo\#t&smzA È>$ #{Ȟ8N$"5 [њaMAB?d ]5ȿ79.K!Dw>sƅ50Olj8}P ]Xי*|՗hiɝ>u.g}وú\.ʗbY(nH?}`,{Wr:S9Cەtz">:T-˕n[9- !л>Lh)ۆL= S:%N Ƶv>:5RD u-a3}،Cȇ@NГ d "|k32:GAߥW\e+k4F룛3t;}Pvj+Y݃aԖ*쥽_tUX+ضemʏ*TqBw"[1,jXpClb .tl,UX &!0#`I"TR#hjčs( rL4/f;cʼnklPS%Ղq҆R6o e\,Pnz"/(ʺo̷;=׏N|[Fp:uF yۙBr_8RL]WP4Tx:_oW~6Yh3ҤД=ꆔ8+Ut4+& " )#<ߙ+e:b-dٖ ˶b "2oÅwy]9塺#}#'ƧgH@ә6 |JJZ3O.8? gNbӟ6}?́xbt; ÁT ZBmxnS3o+Zr6sxf_z1|9y2^mF mC ݀aۗW.O"3%({ s`& R2)F%5]ҐؤGj~t4^818$1LC"y^q\q]L{K7znoX,Z*#EeH#>*&Cr'd\r9è>3{GYGycDZ1H1 MNVUR`}c)al@sF7zS70襁)H܎*m`eE&1`jz_rJ>w"˯Һ:j~4GM~8^L;̎T UXr%JU9<$1vHb9CV\I Gk1NX! &! td2sQ@oK3TKrB1,JʄC k osP6g[˻G IDATwĵ!`9+7Xĭ2ސDnۊ]?YӾ #eʻǍeYZk۰[l+P)1=]qg>F3H) 5&;DQr=!ְ6o3@qΰ '*4rW,ͅXrv#D߷BӅmXbwCBL*Kx:1&b |Gy"{g#϶, 1m^_x+3_} lG핷c`&>|c>#4t~izbt,UDa`웭0\!m(1U3o/xw80Xߺx߽tGO_\oCJimw qe7FybH9r9`@3U3ih뾓\&ȣ]I1RkDQl5%>1W_~ LJkӉ!ZmuIE=eoCR&^_иQU]Xq:01zk:`\x=&c㜉Npa€sSBtb 8c5ـh3Ẇ_wj]nI䢏%I5!"<==zma9Nqx{{;1QJj1q$6X}iӼZm8kffJ3ŷCN#{c֙w {<Ϥ9l; cb4ѹN,K)XpXVm1bo|Nqև,նZrisӖr)R 9 ]0pI.w(Uhsg*GЂ(ZH59G[+n;ҾI,%'mw5U5Pwۭjk席m%wN2GBcP0U&-TRf}448k;hVa-6"O^r|K̊u/dpr{8 2_[ }0++@,o'w}8M<b<ضw~r&+ә??x/dZǍVS[u=8@)37 8OGb{TYjm_+ct:#ȟ 9ҧk#|]Wqvq\nx9*jOf_3?hxލVhr*Lӑe٘Up8`S C;Okrε:ZT-'9-`Ry<0N8qqk2١ȥo}yc_gnjKVr[n`W08Ѽq'O1Е wJ6#N&T \x䧱I$YezXqQOc rEӷ,J,-`{C8z-`Ҋvf'}$c~B{<s$m=+I%5XTk&,V`Nʖ YcEgy̅43SuCJ:ضk[z[ޘ1?uP݊N^6FA \baS _8ώʦ^#8L%m3yۨ)ܤZb|feߛ4@ zkR|.8A'^n >|h~Y,I= 0rc>||c8o+0SS/ϏefV_~zm=sUk҆m$mH@l< %H@$G"s#}`c{kSU==]]}Ps_o~?_(.gvk6rͫ#LwU!!˙hŸ(UA-CJI34PŦ]9bdJEbLй= ?U Re[:>|`GȂR1NHHcn>ʟzQc9֝F=PnwサyoTT#J)cyKriDQuܶ- b$3#ݮ>Ҕ0/.)}hAiX5%;Z@lewфyK%&isʜ2#dI*UA۞~{@v!%JȘ,uCc,DRunݦGjS/"گݿJ/cx]K"@5+չWS1d]%1R5IzU%0uubDTHB]E(p9.E ^Rե-fn11zж6zF∔WlJ$ S}Dd$IzK/R-'CĪp "K%B(>WCYPD"=+{(8 1%0O m_Gt44:ͤP#X6JCf)*A V\<)F-чJfc\{I?!d'Iyۥmw<>>;24\P9ix9(#$r$>h${O OfaqMOoww:Mvg_=k-˥vs?(E Ezkejra%kðLm1v[QFXiFbĜ^o pA).Xk_(v9V|Nu?zWfs8 Ӹ"湪|Yjq l6*k[efٱ,RUJ)_ ]q>gGr}f !:(1Y뢿1xq9W,٠]+ 2L<"R}]$#-C C-u +}۳Q emWө1EGBn'-:ҫU4k( H9b̿%ֶsFԷAGQ_K۶HIk#EI$(|T+L E  Rp\JfQFƌ'3ĔeŷA, ET:9uMߒw R 4ƨh )gHT$s 4`T7L<™{l$*94u' h!iɹ*sd!,$ 6WU2={~f^nXJ)r~~ >Ū/ul\0눘'6meh2N'ڶib;g`5mOi.Ynu4{B|7~u GTJD^XE"^1)uzE0WN &Z}:KM[BC`)WVi; 録o\WT_*!ZJ*aVw96{vhj*|)mr֮!EbH!P4}w~G\W)W;3b`hJnZ< D=6Tv=τP9i+yzD )Vujۆ26U8m\x{|->ws^pE=~&kEpeD[y1"yz (uK5}Bv {ͦa#h[<εFaw?@ZF`cVn=ח(ˠXc`g޷m83nU~!IE?tHoV1&6#8Ejs$J#ȴ0 9<%M7=~8'B),Sx:+Fuo^r!EmrrLqT"Y06 ĊZnG J/l]̅fhDHFׁ23m؆p+ L:d-QqW}8pX%}C-.3Om!~~F4M['uk쿙okz~2F:8tW˵$AՄI2-E,T jT2 fj+6R{<`d^rWt&7 J`iK2D$9T, |CcJ*$_h].}dΉ}E'7O()/0}D#"=qv|[>t:t9ᗁþ 0R4P0M";\)*D枋Ό9FD=Zaex!%5]EIۥV=3M"H63*zіiI%8˗ͶGLS$%Gx]%v"5cP-if_ I4tY3|B )"*M\KjLPUeN1®{WQMT FoQvѷ kq+ :EWArLJQ"PJT!kٿ=2@RhFp G3oи BhEZ^Oq$/3ϴ-Is40;2㲰\&ݖ蛎I%nbbHU9ZԖXlca;Hۃ|tPk`f; kP%f!ht5Rjw4) hk6uB(&&30D@m*X[{aq0~C vôLȾ9|v=~Em2 O'>dļ.8Y䥠m0B⇩VR +V:3XH9qzm6٘N| C(~!}BfO-J_N"o"!́%~\qCZlP e ^o%e8 P% zɺڵά̭UΤE&KL a%`w-Ɖ x~̅25"hAi$l[)K$8cDјNꬂ׊$3JRGBԺ%ef(1NهZ4BZƂ2vlœg &$"aO!$az7w$%R9Ta!y8WR=h9SۼsV3#VIJ Z*o !enׁ0uXin# t!ٌOU *:S"n֐Βg ?Eël%6*nIwJUV}m$Ti¾Öe!Pv>c`5+qR?m]0q3`6b4}Ai[0>>2)kM~ř QjGJU)bTkHs=/!"4m JլuO%!q辺^k+|>:"9\ki]$oYb ^5LrʎSdL#[w()ӭS񹰤F!u)Z-1Z ԙsJxэ;۲d_[AiMZ AĜhO3#v,c s-`eun;N@t Ri0L9=~YPhھÇB+5"'2 e4yqٶֵVa "s1E(rC!蔡mQ2?/ 0cet%i<^9y)%㼪!8 2o!Cq@[:v,~=ۇꭨmn(ſZ[3y#HVC35ZTS%UǵYaXc_u!9%1ۆuU^%W%y)ꅒ[2{??U՜/-\_/)xu/ҽ[_=4UMtU#V&]^R+^RAIVHZgk|K( ڶ$+elv5>gjA9qxg* μ欭eUW $9=RXB;uܖH븴Qs m q^ئg2;Co V9#7Ac}Q_ K!ޞ: 0#1tyθhOl@- ;'D {=wydF|n߱'ٽ|~ pY>c >uځ(lmTSV(BA.8Qi!WX eILݞzcнL - GyxN8Hu{O-2}3y@Q$o=nH܋-4ӿY¿7=~BR㧏OψCKfOtgQma'.zt`gU5f|opT=($H4Z֙ )jFI-1mRJd K$?vFUf(p|2p K+Wm ꊔI}Dm-VeHY?=o :ɮQtv%䗈!3g_kUiR 50%,59m )biPiY^~mXǧB`MZ.[cxw8 rr`Z!H~ݡvV6r&.CeQmҹ ՜[ )^b?)1,eUB\nX IJ`g.xO+퉩`K)vQsMS䫉yUqi}VHA9*ER4 Я] .ի("iX_iB߿iW:vYp0q8ޓs-6`MKt=q yl"S%X1傢9 uiYIk:npj?<ޏND=V*?qbںE+Wz}1/fYCYRupƔTIL r+%ѥG tB8*ogzwzydJFO'HD]/8Ԡ+QZ1-geH9"2Qn+鱎BRkxkHRqY4C ӌN0K}v|av4°XBf. =~>:1}9tBuFp[@ÇoFta:&6U#$=rPW;残X!SIOdeՀR& E*XOG‹0U(0O0GnFbiVFf*JqP0I0^=W8heOsݧ|4ZG 춊!̙e&uNT ^1%=Ә, Ӛ)䫲JU8DaYRH~:G[֮%i׉M5mb^phqg`E:E'}nˢV%gr_zhn<>?|#!f~tر;t}o+3g?qGJ>O?0xzʂ|SB-B((H#&pW"iLPo:V!ře".%JE\JAURsfeP 4M[+{拾`N!VBmhIRw!jGuM^+ #0d6PFIRM%7ŇDKAu=9,t]' &+0slwDXǝЫ_Ekv[M5L9&f237dvnxK]"oe޶n_[[pA!xݒqL;Lנ|`Iw_aOuR#9zJ~|pf[r&~s~>|H+tͪV): O;]ЩrB&A V֬axn7l6132`2ym(d!ٸu }(\PPd0Gd|Ei%$ :WTnqx=b\e Xm'pv#.׸=ipZLkB-V0% M\Q9[hxDuSV6Gu Uz'p^2K ?>z1S N0ܪU̩8_º^w"H؞aNhh JjvB)%OtB3{n yvCw 0jm~O'3i`v,+q4j_vP)k mqJsw;zy]V\kpMm6fJ O'6vK,{#Ϟ_sz:5&Ds_Uǀ;G_Irݵc?t~xϱV񵵄? 4ygw'\oS[t2v{D&SLIRW5=Jt "MeIj`M+dMPTE\ mCJ:[ m!v8_"ELACSAj40 J@4-}g̈́DYA*p }#}4BT%&OP|Fhi$rPH)2X #qIeDdU+_b˶(y` %H)b"-oԁFhqayr0,9ud 23r$h˄Q%b'"y}eN"RK~??n)pwءǍ❇ٴȜs[q m"Yqzd8OI'\vk2t9Oڨg?yW)]^/Y2/]r(9&8UKTݾ~TńQ )4]Վ(v=tPXb/a]H݆v!D'[.@m(p-OO}viDk2>Repo|hӇlQۍ0 h\R 0iz J)_|?/|K?@Wk;Fw5a7B[U+-a?!yFx~b9_*[ӒiA̧4慻gY*eTI=OY2Ӑ3=TL:n7}e &:mt& Fkn+=8 )%գhT,! =$,y{ O{viϏOb܆e5\l ߾sOFN En #H50awa46еػtȱ`v-|QN#m ]oljwpMFK_Ol% "bvۺ(ւd&a+T |M0,}‡DFZƱ"mu*qaak5<F\^"gAIs0 -+*AkA9r"-(\``d Gaa]]wEs|s<&c>/DD134||)YZx;4|o1K872NL+Vr~f)(jeW%UN0 dUMw w ?}Rp>?|fr hay~DLq2<=O/2l9Kq;|f/>|do[TX'3 ǷGyÂg۸8Xy/5$]怶w/ RI#g0N.Խ5[TCu<}|bhS s)Fhx$ȦTe:3O>~z:b +8f7woH2r=?V6PRUm=O'|á:!ķ9翵m7Fp#so7GNUm#O- D@FCL#ac:#MCYcSTUZj0|ImJ]j*ru |N`RBay)xOEuXZ)ȧ%@HBU pX{G \Hِ$UI ȲbBԜsc /uYB\Xi Ү㎔>R|f 9ĶUzzf(m.W>=_ Ipm9l9g>^/oWȅkA*?dihl ,kzڦ_;N0J90M8Bw xT!?a` i5uO _s9)Ƒ|"Bb4q8ib$(Kk1-_:6R~*j*Ge^/1~'ȗ?XV\)yzqF qaC-Y(wd $]nV*RV 4?Ц5B7-xGi{Lp8\lR\?=bB"3>DH۾s$dAK૯Go g(kZG7lzAe@+43xc xPu-Ey$K#5ҋG $Ƙar+na\,tDj"fwclB#8v|8]XM&,qO^Fvg9Rl_ a`8!+牊<)˚E6C8O4mAj=ǺGGmhslێҮ6 vlw(LW1!uIQNmMۏ%))!; Fhl ')C9hiH $z2#[rvzE"p-Cb3bXrL-yU"L!dm|]innY r2?;CjCSw&3xɷiÈV×olbO諁I)fL -=HON8Y-y(Pcp@CdƾLhQtL& GeK%m+tU(.y7 E[ XtqE6rhJa])gUzZⓀ4J( %kyAF}A?xIL" 4۱[$I(_hk v }6##3 3+& BVsf&B81;Xa; !AsBGgĄ~3Etx%Z=hIgfsnICajj֔eNn~}=:#?XRu0rɲ8K~}YLWwL >wF0 햋g9?WLJOݾb"|yu쯷?UŶf!_|%)}c2e W? g)EK~)EQ4 (ׯ9;;= )/^svvI=j4vͺW)gϟ V珹8;'~P4C Ö5f,Ndt}ɘ*DJ"6 mC{<"[5خIɟ @Ւk[]7PQ4&zvl guE?iʆnG$+֔ *1ZJ& 9Vt)6 g4N? _?oTp̷)ij,A@}O䷖LU{{DdSʶ bɒ< $h,`4H/p4-<5 ʾ%C]TECYt`!<$U~U@X tW4 ¢K9RuոqbEoi=x% fѵٞEg9v P`5Қ( ISyFD` 2Zv18ձΏHEz h u,]g1:&I"phS H"[nG*9Y I(ELPc'vtj 21ÆMnkIʛjDM~R:+rDphB!9yW,48R}ɀ $0x^jr YN$Iif!6=B; b{\3tlJY;i BO]JȋwxEPT J)8$N'~t$z&d8{ɛ5:S:ot[5A(h)b$o Zq,8B:k{g ͫ^,ϞrQV%(c5F({wǴ渓zͳ씪x~[[ÞGO?n 2gKշ8?^e9:<{K_ ub~aQ?}NY>9rz>?nS~ s 6;{.YD|AwQc1Q5;tAt$c3,,Ϙ_!M@]V|iڞ7嚫Wtt6(380VNBSƧj{ uok4Gf'2u5]S 0hae8+lh8 cn> c(w{a>Y%Nv}sGbޙz5FIn߾BXdzPۖ^?~d(P4 x="-m+fͧg>%r-(S"#FiILI\@xtߗX?g1^K,%!Dyæ>ֳԠhI>X/IgV=&:ȨGfɡ5[W < pAVHچN 6=z,5w1 Ip]x~Ͼx{r+evp,ES ibO[,1Q ޡkHk-$1 u5A#^t"N'|T+>? ”i8NLj[B;VG}OX9Q1OhjkLqbھ' ZCS-ȂD$f'Q3T8a'Hʲ e 4}4z6 ;B7&(A }b< >$5}{tB~ܱes%$Dz6&Pv^bLN^ ASU5Urr~25<{֚7ힲ9 7M̞;o 7L$8-hAL̊Ů9M2p|qph~H Ŝ%iF ' |= [}}FOWheK>I9==ST:gBelG|A,N@Xu7?g 1%ٌtF[q^0#(%*tE,vJ~ дmW(O[u]:Sw@4{~~4McoB|UMշDqLE-^B0Jry28qBxu ٱ.,WHjߧaP}3th⋯_~e^f\={N5K躖GOx{ Alr`_ξ W~g+~9~~ˡ bD4ძj"N" r2H_qh+iHlqJ' 2ʐIJc*f9͆xzt:xء%w/9!Co}4MIR u_a}G-$-*P |:o4eM%jo7G i{lQDhxׯ8[.Y-(9% ꎥ`vj WkD\ -m93"6 `6G.IP"N3 )}{jkOOH,GS1y;(&0k@N$ pt" qJT@n<7=687-J (\J1o?8+Jz胑⻭,]S۝ @ݡmz-Vːu=vqi c04e ۊcU&7-Gptw(fK2-#lںq2U ]u|OQ!g0TEMY\\p8?>n 6ɏ8{{iNtHض#U]bhg%Hgkȱ> :,H)MP55Q dPےjDf mG?b$K鼥 mUaێXkのmΎ)3/so{)pMZQ5ލ04 eٿp<ޓŜ#sv42\1(b齽e,K4%2<+]7dSTbu_8N{65LD%}dÏp/`i6b92=kyc.䂓4#)s"#MLw\1u?[4/P sLұaW9ltEC"K YP+:,$/㫫(DG` MdBlonYwQMu>?YQ.vKDh%痈V9z6iFw8BT1Jch)ѽHjN )2yBXIML0Czkncʲ'BTf@&ȅatQ,>Z(}O,Q0)4QZP&PQL3cK[NTEΡHB EC;SF@+`7lFkp%FMqW~`9qMY74}Ci`}G43({6Ƞ$CUR%cw<6'lB^|5/QR9uאW%^s9f"`#`9opCG~< lF/j(%4"?$9CO;HDшFG9S8`quźpqL&&pƵy"5؊*gx`>HQU=:((0 D^q|lDQB5m]cH*J)?Ngudل ί.@HUQ;G(bN7LH-~+cI&tpzqK=GQAo_op[ mkMբbX/Iʣ>brzB E$;f驻Wm'?es~҂l$ g?尽Ed6 V&F$!R xrUz%w> `ŠWWl^| А߿!f/ɛ oIYM4]#]hl b7 !J?mP:] h(p6=q@!^#HlBe[wy'?#;([}A|1v{YRp>?MQ v1)34pa,azIN4TL2z|* he=HQ*T 6/αT KIaKnr] BhM lPcZLŕf衳;8t0rf, hJ4G謢 HcBx{)fS.qqy,',43R4awѻqϛ;޾yr2(CSKJb2K3ַZw5YlYgON6=O= t$fwu aAD>o89S s u 78GkäuHgl2, * 1bG,F=ecrKࡳ8=/Wdw$W0ZR(V'9#4{R9؁kMQjr+=Ӌsz;Ы'~!kh#uc~O(e8{@Fze~~EDIJf\|>7]C.|ya#>s7""A{|je˗37}ϕ93./WtK霧6 LXǏoⒿ}0KԳݎp5 _t/P, oj 툪 SUl^%\߰<,WWp"n萁be~dO0QjGf,`9hnqc(K͎xL /8KɳO>K\oK4e o;??Еy|Dg~,!l".O 097<^XW{KʼSDӢ%!%>Lgɐd:%Іh.&t'hJt4$%$+HkKxy%ZŰȟI:3 ".#fbb&-C*R1;wH~p)*ͮd_d1v=7mzVQ=1g6hɀKxkA@z7=-a`Yc:@y)7{dh@$&5d1Gʈk; P"", T,4$$JI{/jő*?p{vDi填+xetI8"2fq1,<{_ҕ=vI!I)GӌږjEYJ'je<#Ia;#PZ39:X;mr> HҔiHˆQN8 %6Rx!g'09E/i÷>R-#77EUs m)Cut轟E5Wܡ'@Q9m!}5 :,wޅi8x%upޓWM~/~hꄷ79lnq]O!>\$Ow8{ $=_E1. F}{&@:?i`8~Kps:f)Iw{p,ؿc]EWZM97_~DK͆=!X 햾,) :PaDյh!6kݞ}U7[Tm@K > IczE$сfzC6=Q6 Rҹ$ج{VX㎢m.;n_m/ !g" ICax[fNz%K-g|} ȡu X`Ŋ%KVtAh肢ʌyrqs Yۣ3<>AZ=,\p]#g.[X9!)h%Z y7uICP%8tTIJ}8BK+P2﷤ JRFtZ KD DH~'MYJ&Y˼滯^P0hi)Y| "Re K66Ԗ *e.Qgl8/~°; /A3,TE3Fݻ3ʲcwE[]ww#XN\ίi%%-iS un|F$Gg'i(6IRfew]`^!˻m(Վ)>~1W?|6c^1[1zP }WFVVX]$NFHE ?t4DATih84uv) թt[oAg k"U`hzI3"˰.(UYѳmrY;R-Ypvo6[aΖHqFī JVKHﶮDRTSg2'tLaVӰv~8+If,UEy8ЕL̛(q+m8S9J*4 p,]<Ҭh.QVR.bJ%MKn]Eђ4)BcDR(B$Gq-GcL:|Y&cdAK7byE|"b 2#QuNBS@J໫YdhXiŶ/]"' g6QÌnԝ'!BUT@TޕtM)RZ,NKRʲ$45/cZEBul*Q *2:o|AUMt] ۦ%#Ҳu1M4I!=Cg$WTQAh6`Ų;mKh-=_*u@$&S^#^]`u8U*P9?dľHmC{\zK,٢(K44tF|Qhh (ȒCӸ0L'|p˫5M <'ϐ2 ;|Yo.X}2U#T(9ՊnHAQ-WHyJY44m4 Gi/Ħ݂L#]hHgqa{=i' ykm~W$-j[lBp"+jjY?bhu`h<74yZ5UtIt6GkZ9CI火b6/]0.SFV W/ 5VTsc$'K2A_qE$YPh }W?~џ]&[55횬Ѫrs',uhLѱC$#=1ehwyszx-y&$5- H.gqt~O 3i2 YoW, ^c[9aZ!3?#H Fl9VMHק` y! ]Dry"蒴CҌ2i9Di?4!N3;qzduƴ>E% n{OX&|s9ҟLY)lZH2L1vVkR`-ԒxPb<T@Q-솶Ge͑n=@DY;-}&kT-?e.7ny7Oؾ;!]% IKF{ YBPAc+hؕUf-Vކx"{X,^t+ i K@4̢2R.ّe]~MxY^3pkP*qEU|}Y:'rm4lU@RdYK]kv]ӤϾAKĈQ7_d#UBY%X"ڡ$kbw:CIHW7h:X -bGg2RLMAS2fq7_NbĢajjMC%DuS&G%'[_mM.b_뚢hhǒ(GQ<ϑdiu.#SIK/ N.e!HԐ9gmYT 8@Gl-aY9q3LE<~ʋ1 R$/j)SG'ijT}o(Z,Re&z, >8K}[sfr6@V4c܃ oޱgpӚ3TlN>F]&yR3}Hwg8?c1V5)1yc#MmmᰏHTEձdZR} K%TnPQ Ŷ9~r`DZgM▴͐-< l$~ aLXD.ݞm[;BU$([ 2zISd,g  x6GH3nޱ^Xf,iyI&* $(I^]]q7dz6Ru0!P[D*ɼ T]˛k~W͛<䝷vEwdQ-ӝOX#Mcy*Z^2:ZtŦkY74UM.\ْ^mlZ^6br}bDT֋ asG|{urC2d I)Y&cU]*dqOl[6on/%?qu]KGH?.=(860-nU/$7)ER"Q(`75ײ}7o׼Ywο_|/Q4(Foez"x}p=Ke=_͈| )s?ln['H:{#xmKkYE6P{[/Z"XF$-l&Ɠ1!aG$Ebܙ,9$h.vZퟒ*A%c<" =4%iP($5c# 0eq{&)J5TI$ڮ˂,A$D`!/>zk_\зM(!wTEhg8a;.l@ ˻/4MQt]Ix1$$Y,J8F4MGKek4MM]U8|6$H4M+(u;2 Nv1cm)ʄ鏦ȶp؝15}aDy8ه "#XQC~G_` # ѵ^ |)ѣ'/ovx6~!O &3fUƋ>f[kzY\^?9o ( =9qbW4iN[VXvnPW\SnXnj1c ,#/D۶ҜǦvlpE48B- lC@C?2pd&'IGYG\bbi-ݡFo(2鈌](_͖yU>iuKr>GS4|2MN>bEd[zG@>|hzd|ww75_>LJȲēC?fmnVeJlnЇ/ްnkVۈ?>>?.o|BO3a_Nn؆&H;IRĪFi[NMQgI P2Oc Qae(>dvp=RldOjt'&O eHv(EN?L+89~H%+dEEѐUgoLtGR 5Q UV]Qu˲ٮ=4U).]dQ zI%qT(OA@VgP$`=vvE,TȖ+x{uF`أ.S}S9o\ū V*)_iʡeg:Ӄɷ``EI<d|,f̃`N9ruMGX<b/xUsleD \=t98Q0`uu:R*D} 9חoФP3E*Л<|/Nt*Æ2'nL %iӂ:xuՌU?#H6L8Z0[/7aLh$;ynkXiHE=e޼}p2& bv-E|u&@tsGf`uGnzk.fsՆh(0 x)e IDAT^1߹FB$iJVްeI)_0m.#ǏyC?' ܟ~%$Wq=Gx}oė?p$C0$7%5qg>'3:ί>7oB:y`H0XɣȑnDILdQJ/c#n"ɔ?R1ұlzPG 󚣃SlAlZv xQNhZIh0tLS39="nJF`}ҲS}s܃)aN1#IH6t],ӡm$Iq8zAR؆!<iOeVpL&+A9 F bEbx viƐEiR і 0_8RAW#+B;5xyd- -I` |;Ɲ>?}f9c5>5wiBY m:"2a45x& V14u%2yAqV^LJ^ʹ/b Dw*aLl^ٙOG7 GO5J$*WRIJ(lLQyHI ╇.hfET&Ⱥ YA#- 6yeia[*EQS5 j5w{!1Y6*G'eK&O"[:)ހdqP,=C$e}y$WwhyAl7+$ c[Dz]D5tisvQϟbXqDYVTE 6%eQS5ih,K4u( (TUM ʈ@QV/FVTLˢޖQygvz Hi^| ,۔I#c2I r S姿F/~͏_"9j5hhɣO9Ik" ^3Im-dDٔ 9ŦlјK'+Ϯ;wzwguL]pW+nu;cvx Ҳf1SF"]\x4 }\rG$Eɻn?0iˊlqa& eeE]r>39$&2*NO* mqQ x&/|M챾@o ַWlg74iB Y"y?" Q e[4逪f"uYNht a8#M3 e41LEǔMSCSi_o=$Mls]}A+X(90&ص31=:ḷǺ )Ŋ6%Y!J?䑻G E'Z) no]?/;G*MD%IrQ Yΰ7![Fh.db2(8CQwLƶMMJZ״@)DBDGU]micrI)hryX"]DP=(1Ztih%AG:)j2=%rә8uT\CصU)k"OtxUQ7c&u]p|pȨtq?<;b&Nӏ'c2fw~wxv=ͦ?DdV}}\ݦkwp&&+ \!SћLhm rtS`(:=yx֧;.QŤ#"貀dqH$DQL$~U^[:);n%K"֋IBY֔et:4 {?a^!nfdiA]B H%,KE}BU4ZZ(B׍P,P}4QedEYP[2?e$Uץ$>_oi~ɧ=yELHD xX=:C r"W篙^ccsyFnfDzlV% 7˜s; e/_amQ.WdbQ٬=v\~ڏ1VW[V@j a#5 ْ2uuY;VU㐢jҒGQ$la黎נ7D D⚴,rмcb2'cݥ4Vh.' CȲ59~C>2j kIհ#6O^6t7.VwH=[TLk}bq8rhҐ(H|0ưlU%n*(;JxDZ:X>-Rl #!kI##MZ#wOYJ& o҈5,lj52' 95E%tT)J5% +2ܲ "As%of[ 204U!btMS0!K Ì]8)+ʲ`{{M<#"׷XyNմH'TU"hFaY1_g>={\\g,^ꖾ)!V~6 y46?ff,^''\]^2Ud4ሣ~W6!O;]]p^E&S}=t_C]C1~Q> (2kMSDQv"zHaT€x>g(ޞ%CUgWo~ǠS :H&EmzV#c72|R(9MIqBl (KMqu-sTA|blBtm$ {N*ӌbNgH_]^\BU# -P%aa.~puMtu ij0QxqQ[x`qR\hqC&1c,ut&cbZB*fb;.X9h.IP6R+$̛U*6vNxyD`.E,jknWwlӔSB 㺸ZMduw4(=Z~8&筭)쌅ptTө̂٬BBvĒɞIf2^VUIFHsYҹV%&J Q&T19`FH"gw_u JTKVX.oUj0[|{z] %^<.#4M9_$Hqr+H-qTdj YPF9y%/8dm1}OxDx7lV -.0K|m",Y!]{ 5 ]Q C222H∻sZ]^$fD5$ڬ(xw׶N!U]u,V%z B!0uL[6I$hEY(@[YH⭱4 T4,-Ȳ Qv I2 ;^U'}n/owWHQ)kE^bZnnhԨjȢD訚iH*OˆmTI6u ?ew`$k(Iۆ,*6d?\A]'HgH"5?ዟcy#& 98:9gZë/ѤG#0p۫73Պp6Qz+?N\J`,nҀx(<5ag~5Xo~-2TԳ*՜W7ĸ.&ѓd"nK:>r&*űD~5D2:\R-J]L+hW5mmW#T*' i6 pV,dY`:LF.= o *X#O+!p 944p]؛-Lʄ;)í[pK]\Pѫt Hk6WpeȚ/ [FF%I "2T{DqP)%lf;cvsmvq=$Y<V [ư\CuAQuDyEFt ز\X*LihbUa" o+(JKVQ.H^ijjq!{Q!r4]&-PD44UBREħkl$TyFTq&6 ]MSd%AU4C"eCfX IzM`ʩmDl(+1Q`k~Lb;nh܋k~1cHBj@ , -%AJFFJRy{Ǔ)֥c0=$I;ǵ:++Z{ VQ,(vF /?i@Ba 0iU]%SghZCX\17xDc1yg>K:na^?|S|3ۿvKkפ!>[hs% Ȑk=={w8EIC[]\dv+HD ig3Ď1WWgrNULL*Xr捸5 y]t[ئj9bðb-Ījwrzjh t:$4 Z Gr<vr˞g6eX-Q5ulJQo+f$k*;PW5nAd,Ud^!eqU[ʼn\I->Y$)˂zIӡ(’t]+򼠪*pl>%LaggMU0t(0urfG9omX,E[-ϧ$YJ-;S"ޱǂ$<_^096 tj<%*kZtNñ,KÀ䖆a)}8VdŸM]'!%:|JTWX =Ӧ?`GTU͋~ݴ@Jc Z[O?]O~F,K=x/? W_s?Ð1 hD]רJhiet]OG2ti7\&#'s''6`Y TEE$%ƧhZyAĘ(yTUlLۤX̩4M9)ݱ)ꊼ=pC(;mfTy;nno Ӱqi9Ez((tkik-bb,t6 ݝ} A4tEE24D+j ǾhK!B>_T7!NA11Ufm9 ϯ^bv--#oF'\]^RbQMf/XV9Z{a^Y|sn)?H>*($F\,|39=hkwqmEr QIg2 {E\L jU!rVrWܤٔ,Gɼv9KRqA@J#ZdQI]IAEX3&*xxoMp 7,7k*I !$q~]W vI>a6 lMk7)G%.gtD3dop`[5DE3ɒΡ#`XKd7 oK$\a^KyAW'#&Z-_|ڛ.$L=8Ļdlq&,jh-f<9j!i\/1,0tL]3 ֻmf4u8z\ԀeZe[HDݢH2~[SW5ebY&aQ9GǤupt(ʔye;yE7A6H1LJ)"MUw-U'՜̐5A iv:܌F˂"Mp }4B7t.MfXP&9 Nߢi-dh5CW-N׻dQh`sl}B%Ԥ\w{l|݃CdEr4!%/RF ng1 +JrI#/὏?Bw Iߕ넚|Q{)r4@Wt`o0EUFe AZDiLAEkTm7pb搇 ufbi0lt[%L6K}z9E%$Q"KR4!"i)tEq,tr'g|i&qs,GAQDhK^WAh@T~؊of"Ix nWg߱ OdM3G 6xE ߟ 9QZ2]H՜׫9(6 h!3K6؊Xd$xi򂵔I2p6{;\)YV;EhuaYV۔Q KP9j#TDVT~'Pz2ˀV_˗Ռz}͓[^L;!ٴ6ig1~UΗ@؍EYs\|lr:Kt;]M? ӌ+zz-w>x @57$ScAlkF͚E)s8m8,r$.z!$n\nni.$"J"dC J<<%*..I8.@e.rdyRfUdni \44%Ϧ7of:JrJ.I/ȓ5I/ }mZI7bqdћ/7 ,(<ːp4ow]ωYa=SD9"b *{G vU8 JQPUtTH% ̼tﰜ(3.YbD!UyBIM"AR"i8.Ttʺb *i)DE84-ʪ$M$ q.y"ɰbxCXV:xB1 EQ5 $24Co6$ ˤVGb\c&`h%fETejMN6^~tvqO~ƿߠ.6Lz7BPk0q#^ly*" G4`K&v~L୶e'apj;{a.//TUJZ{?FMhNw ^Jʚ`ޠ:QەhqSW5"SW%Qg)PQ(*I! "QxWFp\o_{z=À/_b1G+8( dYB 4##F1rlk<-Xl-( "qI1t|2-VST9iCjU'#fɆEG O(1T4y6>cQJx A,ZAXdD!;{; In%tIG,S:Cv$jD2T*Ev L JtNw*f[%(,*:vtdz-nKF goئ/A }G28!L+z͠`ȠfpH] ˜6FDS4 n]!jdٖbW~ѡ x2.Jq@uoWp im}j ܼzJL41juYys^|[HW#Iy w3@(՜p`:U=޼x<ф%+8]v.B#8.&i^kQQdwpϢ(d )a 7Uy6H3<'r*fN1eil}rhȍ!?eU,9nIn  aYrn YUb0ء&kwiawXU) 5AFeUL^ruYɂ$UES T ON Õ_NΧxi9Wtò)jw?$e7HN{! 9|~1>o{{'yLĎFVd~t:({:Q!I2i2.(˒VEgOY-irwUNA-55"Q9il6e- 2I$Ku A/h*aHkvvBHaFU޽<)Qh4]fo}!Io,ۥE$"-B(DQl4 (k7*kcgwwC6ޚj 8>kmuIYJ$ېL,0^u6\I5?CAwm9A6lAo;vd% @#t۲i8aͨ6uqvvP6k pT9W+vrճ ޾wcrBXWHq/ TM7|{45G5g_0[̉7Ȇ\U]mB!yEI#.>^XJ"9۱^YMܮC"AATncx«x ׳ۋ5IBVR'jׯ礋ffK4VmPg jvFT u.!FdldY1"2] ?8AT#}8.o|C؆(ۀb, $`W49>8b\C^"f)Ye/x}lwn)FY[@J<* W9qg4\udB^LkEm;eAUxۂFWuDA$S( eξJ Y ݒ]7l(E(2YNi4],F+DoHDq h[ovpvy}Ged4C$t .c&ec#e#J2E^w=FqAj8AZcuHB!+w<vPd Q -$) Ⱥ Z(ZR {tApNإԨL;?ӣC.޼mJ B!~Nd l'?^O!{~__ᇿ %sϧm|z.f а]~b;(g=c5u.Vsw vwHZ > F$,˾T+3$E4L(1L0tӵ7>I*nh5[t53DR(4&!(0N0M2)ri赊,K:$eA! $A2-YFk6y~}NF܎nI4dfaɽk4bMтJ5 Ċabwak]Ś+eQ[N}֡dzXSY{;}oTbj\0v4Ê4 nyOO7 NQ3ENmCϱqQY9m32$,BRzs(U0vZ<:l1JzvxC-ͧuѪҒa:Esp|_0 .K@. 4SCt 1}l6bёj{x(*Y0TUr/A〛 p^dѪۼ{Cx]ϛO-D#;C b%\/x:g`q+l{9%Eeqڴ'K7xޒR(]0yo/_5]WlVGkjWW@ݮP7"D!o?|;' JϞ2vv=P d}[N,n}m%P?1*YykזK<\ܬ)oP4z4LzZl ?lc|ª.˧|y}AC6Pu9M$ֈEX+*Zl7YIc K0F,k:vy 2b,dzuA񱲒l<Îc(5UCƛ;rp=0ٲ]jWoYtCCl5Y7-*"JdqL$ET14Se%HYLز˔( vYzk|#Ov, I khf٢cԦKXԈ3RIDn0}hAlYEKjن7"\0Aeq3Lüq@QUԵHt2&r\t]$IEA]丶l5 <6PUy:Z8c|=CEAB nes\'lY'|$+67j@s_S>y-c$BEi(|;قo&Ϙ9LH"N 9?$ܸ?"Nb"?@ 96(^}ŷl[V"2 &$r>ۗT-pAdyM};9<`߿Ͻ;?k8\OP+aGNLVPTaJ6OeEb͟PV0 f/%qR2i Bn`Ji 5CA%fIQbq$$qPZLDhQ952VbNtDI@QPa@x}+hF,`16Tl#n뿣 uEwfME){{XpUk d<.qj J"uQbhuQ0deIȂD爵ibY뺸CYHBg2aYY `;&A%C$IDUeTEöR5,H"&v;-bMKfAzG.ސ ֤k"FZ=Nwߡ]7_{@촱 Pk*dqt6,G|o3(02G%kID`" ˴},%}20t\d2!2g(v"EQ) awK@-ϊX-( @*VMQUAHňDRMqݝ}4*+,$zH@m=6h:Nˇ,e"X "IPIq/dAo@Dqi{m|%oBPMW%ʘnMP9}IgWWӀ=zDGu9#\دTvE%c*as"Uf3c^MI4}v}vC P+ YZӐZkfDY]i?CeIemb]1N߻h&*P`[ DQblEYllGHBMieYOD]CHLQ(wUTdy(i"-PTA7=x5ePe& a %10Mzir1Ƌ"s-TuNMӰ8}0-T"u. n |5TiD. IDAT֤ $V? C0/7s{׬gdwO[N, YEa|uĕ}QdYo)q}yʼn|z{DƓ}OjS'Ix}h_\} c\Ή o+|!J_<{λCn#$p~yEG2Z7O>!G){{{(ě7o(4kLfgg "zHPd,+( uQALghTUA%(F$ϗ Ӣ FQ4M?Ղl8B8{'TUS= ^.D7YuADFq\6ނvEDL3bBv]V1oSx/v+?+!>nRoH/.)L%֨\Hٹɯ]:qB)_xNl,ܐ:y/d~T4$RbXZT*Ww{ETF$V+4Xߤ\.3e3ga9DI^2V*l2L`s}pgTYF$ZM,% &oԕޕ~r4bUX,@`}}؏3 fx~@fA&eHRQJJm;ȒJ@5,D\^T,.i>Y(2D,3_,Ðɨ(qL"*D%-G9rdic~r*[xQ@\fn;lo_ bR0r̋#o"Eapݘd7uYW1 BDSn5,oß}VQbYh(^s|>]>ȕZ/U7u>/Sƃ3|3g}sџLT-)k .6+ؽ)i`%=Dz&xwOSv ~Nl6#'inpU*}2Kc#*ڻjO^`}~.S{Id41/{eN'H;(i•xw\.$ESTu爢iz ׯ#I"|d{Qb:a !ӌhnX i;a@4MTUZmPəR;biTlU.B&%yCcYSϕE x!CQU*&yb2l4(Xs]Zq/J)GD҉iַ_Z{'X1:Gsg ǗW=ɰ7`Fr/!/oR ޼AY Dީ1j& )M=N{eZIAFȡ@ek"d5NQ[*bӽ8i=:A\z(W;'sRA"!pt:ϦLH">{g4'/L"N4wU Ty>H[*S}?oӼ%O5~=]R4 SX38Ty@mSΚj rwOwck6]hnQhvPuj d5Þ9FTLJZRI0rp hv:UhmJK':>yZTQVD 0dbA4_i\$P5cDQU(a94DdYaXk0 $ 1M(#GuR +RIDN$4!c=Z7r5aVq]v ܀9bnL,+(h2vT _6EV}qXs.]B8x2׾J}Cϰ 5ajyK.W$D),`>̈́3P+9>}=%(R/f7%bh?oRU~W|C=~^}-f!-nJf #~+oµmm6;᷿/~isms HDE GXVLbEhU\`>>sMSIST8NLLSge/(KKdJIϳwmhd`4AUF!$Q($ bf>*^szrnp2SUQ7Gs:wn)Sfp08ϟ=A2<{IyT7]9dg(9R{GSF!6a,əez!3o3^Lxq΍dqpgc{+'p|Lټ/dkeLQY̗Ȳl5,&L]FVmԹo/e m 7fy~raXfٗx< !^poEyފbP`x< 8%^1fC2բF^LtdB"ﲿur=][w:B4Kȗ<qqG3.>!( sѽD7 66֘MxCX>'AE%nا$WSkn+6inRnO8<( 6~8HPhB4b9H'bRʕ**mDMj\ RO^@cY&qW WC*ZDQdL]CFҰ,q AϧQΦU ˮzLL&ikHtF$!ˡ:A["B$6IhךTyfUD&ZHbl|r'*C5 |M|?ı\wE,sYhF^.!V(-!\xO/rhT4 uAwE^"(*s%&K3w7X߼p/]2N>-$^.sI.%2w|;7"xx̏?`{siF?6o_]4lloqzvӹK-jOTP3!SMZsvoDߙ(lnŌo~7)t[Z,_9ĕ((%3˓镰%,X,9Rl6fssY0_Lh5]׹]W?UUpKwO 'SMjH9' #$E' R #o"1OqS=G5dAf^0UART4㍻yΫ<rfDLRaR,Y3v8;!RoHVe"H 4 UEcZ1Vc#(&p̫7)}J9q1P]_cckq1q!ՒZ %Ȱ;XbۛhdU]0f0g*<;$AZ$)Mg<7sJ!Vyr~P٬ޤh!Bٌÿ⿽ g3-dVe"9OR>}k.yK=&cpo|JPGKK9bp?gz?sV噝L/~ԹXȜ 洮]B0%r:ng _<|OA1'`? I< mZ2\Av4p\U{K5#I%R*DIBetQDT,&PP)50q0!.v _ق|VŞTku\M/[72:+(3OCQX*5~$rAdDQHHHADT I"A>Y$$ Y"IF 56бsd$e!Z df '4+58*j̦S("Mqu4,"L|r9fpfø7a6s=@t`w&'Kx g6h@g1u+G%_ALQ!V$.c}B=7nc฽b4!i y1 B{0bP<z.K1%)f_0Hj1BƳRI98|FZ,py9,2ðxWYS6?`0!(>$_ȳ@ |dōWUUnI E/#y_{ݸͯT,Tp" aM6_~osMDbuMm2\*$baYOPU [l^Cd&9q&RՋ8|vwbŽ{JeuƬlѸ:Ξ ,,4C/ i{zl>ht2qqk-ޢFYx88%j82}iUQPכ(: )_z|K3yt~as,"שnجZB^̸qo! &jN&xُޥ[|T+ƛ# `AZ5y3W{ʃGѩlwЅиgBE;n} 6HbpV .Y8_8Ȣ$t佣;?{<'>"%$(J@Z},ijȆ k8q`6c:_2_hיn" 0_pyy"+LktvI89;Dz ߵphQLf"!ŋC(!^/\͑$rL9<2&"i:6ib{Ҩ,K*t1Mlb M!R˅c&>g/NXTJ27 Lm! HJ7~daL$Ny83~ΫZ0 *vI3$/^ $J[: ƱL )/g"; (Ŭ7i ةkt_0\}a8OPe 1<9zD>SqUoݸ3%q IDATg<#R,b(2\ic?76w*:RxeYxceHt2%""tțylסV3M]p堄)bpLAIY qӨp]tBPd1<IͦhJ ڕhi1^b4 Cgi/se~Z744t./'Xyrnb:膎Hb*i0]t'*lih [DQV292R)6 ]ө7Z<;8DP4NoؑǴ7"Zڔr9ώ̨w_v1`A]뼩WE:3|]FD̲'\=~γ ~>zzioĽL5pYO(Sf:w߸`v"rF]WBY-,g#0dto!\ZY|1CHLsOd <>i8{~N^5=QgOb@ʨ:[[TuYV,p`8^T1  SΖ̲>lOc?zpˇ?gO)OƜ$ut3ral]{H1t6ﰷE4[۸s89> dIXhdU)7ye,GDQJԛ;|kߡP]Mb<0ZЈ}tF{,%B@D BksvrҞ1_#]y̧}dΧtO"1 Q88xJ.ge)]"I"brL@KFU(DEg2RPU]}9Ke8 Qh4s$}2UӴ.FU,^)XkmaWK(+M-i ^"" {:IRW^\2)-'Έ5IaGpV"4kUzg} `8*괪ef1C_{UzqPO~͍{KeBwSD>QIZhPkwXqJ=PCN:7+m~f (y>O3Z{/֭<98e1?)+Vu?~׿; <<}ovvV%]~`0;_Knc22iiiJ$ĩDQL`VrI49?9Ų,V d!H芊YBeqHh,VaJQoWL.!c<hHӌUf6RTjL (NG4? S1lkۛTe:5*nD VpH2菺f3ji3$xF,l6xvHksO ) \fe 0)˜(SJu L޻Ƀ!/O|SV)o$Ox>fèS7TEN)3`^q sRnݻ0[{;B5N4U-hqj٧k LY'd1_Av=ZZ"`c8:?ǿ~Ո<]cF6 1jhdJ|0Y|t_G>swi8gx~ qX]|b%B)`E2]nln*tϘFO_0:;FU5]6;l_EIC{^&P)e$>? q䘵MuJBݰǛq963c8G,x>6tEHyId Blz\\`; 2R>e6R3ѻgyb 8JH]G7Dd5^1xfT*n`&$1rK0$fIXV(EJAq||H&(Fr93OFTnc)Ԛ 4$?Im,N+ =]St:_%:\5$#/swEP'3\.Y̦/&eJ|yJ xbKŧY) . R 0wSg/^z l6.ŭ<:qca9'L'X^P =fɊdkMސo|;,Ru*O~it g~ Ƌ9R!u/QdmnhA;XjD-M,'+=e|ĉ eu{{`@qL*L P֘d@CD,ˢ#)m3_.5ZI*bJR"0.|At:klg :\ }E<0O Ot]'(c:QRe08;`2[G Ehr~~g,Qʕ!{Kůtbi׼ƴ?'dN?eX2Nt-Vnl2Y+R @Re0'1fJ%OF/(i*RuK+Ĥ`UӈCZlxr!&;k1ٹ2vz?xS4{,}>> N>#*?_L9r,QYXw߸j[Z߽HgLIXJsFSõWm޸6%Un6EJJ. eN._~>3V^ڧum8u C7oa76k\曔+ZqcddfTR :Q'$ݐ ۬0L.//q<8Iܘr65*% CSɒjjsWx;"/gLz]5"|{NM(tt{ h6Č^,MF7[D^@+~?Ș/W%s rA"KD#">B EtLreAQT#l! E'[k\Sƿ콼EOQN)+@")JUg2b1\_hY] ?[ިYf/Tw+Vΐf ^ia8ɲ ˲PPE QB+L2=$s,EB/gYnqk;,) ,$+68.J =gb/mǧ$qJ_\6mψ|4 IEssIyVk3< :Ia%Ha,7Qs9U#Id6֮LzIKYTə9!v`)E@"JLW6ku9ۜ#DŽŠ$g&тXTo>8OQ!RXo$RLeXz>/z\[cFC7},J>[f??msn\Yk ,޷k$\nr-8Z"K ɜ VANڽ7ޢެD/7+8<|v%J[787bPC͙/rLrR):1Lȋ 3Q0s7S Bg2Oٹsj:'# \3n$VfWB~wvn}G"t?{Jz\\Cxu{۷ųw䳹Ry9N:%ט>zE(<|]TdGDZXܽ*";@jT;x_z[t:KQ5q|aI6x4٤٢ HaPr>d5JV*- 1_u%Vo%U.l 榉c/SRy ?E%/~G!l?›),UY_o9F-D{J2H`*)b/"^,г)1*ׯ%)(JȊDL OhNPHk-< ]iObfk6%\9+eh8$2NV69a2X@in!2ϻPqbS斃, L&c."95l|at JBv\4$<DĥhKLJl{kJy5!$4.n3l{x<&ɒdt(iŹdYijmdYbEhZYI$KʺnEiН dtOI" "lڌEZ*Ȥ$(Àe <̘y. Ao4" 4:mS ԘQ(V*tGj2:BqSgٔ5Ԝx5P^;O q׮_ao!}rMbh&/NLl"~7zJ5` 3| V7гee~p){-N;ovI󌬞ؼD&y/w.ߠPL1^np[w?_1?p1#]tYeYJ%\%\'A$ɜT#!ga;(,J9t -LIH z ENc;D{=,11"2N1Lrn߯TADXe86 ,6|d@U5:.rLd%"Q?ǛȤK dN䊫dRB8  v,vyQF*rI& (Xaiuvlr(AH~sD {Sѷ_SdIbUm\3yx'{iDJ FICϥR]ag-p"I { -ip8sF"^5 \ &VvLw"ǰ51s|ʋI.ѝlG/_M0E8()DI~͋XStOp] #N1KTV|cՓ?MO1bypfj.o-dDz栄%; .57nΎ9=>II"X7E#DL,qLJH7gp1dC ,r}2%(x fWHr<EgPTA|5?/Y.(ITVqA lԶYY],*J¤RYaym0"QD),3mX@bM,4X seQoN~J!G"T5IJ]d83LRB\.0 /D2DD}ҩ4A`Dʅ ;Da.mPLNETbiuve24 VwL F~CVb8Eac Y$Nh o43xp:"-keR"#k7;r9BY{ BCg(>xFwH1["689|/0B'~D"Q|ʗ?gZ)]٥7w)ɪ!Ҹ;xo} ӓ06ڸH&ų]{X֜ʝ fUaʷV_͕+O,M櫃;HF;SV۬ܺJgg}o1߻}>EظdvorO_.| !/AB@.g6 K";GV `*1aV[ş/ݼN\3o0ã=: ]yË\t=B1U 9Ww0Yx U%!KK$䍣{s'euќtc9 D$%Zgω;oهAd Yd&֘{.GGhΥu$eܯ\EU|^6QfQ\NlOi&[" 1jZę9=Fy]W$o_Mɓ ):>ngnj?˽Aq{ʚVa䌱]V4_tyomߧe~=5eaھKkn;7op!IS詐 K2^udw6dVU<H"!#gEc3W3>k 0goR %>/x3xx@u 6Vi7b;c(q!fFDt8=>uBScYuvF^XGU|!3?$-L3I&5^tx<%!)쵻H6H0S1 2zFΨEԦ\I1ꝱ&Q,"*d8R1&;h.s|{;j3&f3f=z#V_4 ~ ׿zA{Gi}3+׷ g{<=f~9I7RJH|0<|>p8DO `:R*h4ML3E9f{2NCWhNF&"` IDATT?@D@37.B,NeXxSYPbǞ 6b( d`nY,W$}bBx4ZYFS ,k؞˕hd2g03 q:B,HD!l50g YUbe/U9'MD|şPtjt'C"vKY}$2+szn(n/os[PP04|Z-͝+ܽyܦ%X.qRFPۜ:}V71H:քywoo6`9.{MϿO IB*+;woq|xDJW0 ejk>4;yL}4~IdB&3hPY(,.ik i RFI$O,mP1*0Z2u8fCg8[R).3ϙ"7@# _]fAf"0jؾKc9sb w']] h+sJo<6P1˲6{ (xHGH : }Q$.7^H>?DA7g_5jlDRtr;;Hj3loFÏBl 2*[NqQr%Κi]8| O?)FOHQENq#L!E9k3]lA”e,gIeGCbc{}[Hą&Hb:QVWprTJg:9nݻCgPdR65v6'cgs}ų{Gqy1d|~5^J{y77L!\~Ag S2O_/.{xC.Qi[-GƓ/~kWˏ~Df ^Oџ~Hk[a|VWWW,,#ٌT*h9$ ` YsxZ1N6r-b G L&S9`( 6V6p'3 #6I!a_+Ra $lB섍5b1 uIRDIU%1N)W1Rڃ:F:h0вXk<g9p;;7X*1ƬyپC蘙5`(.m!)"f$ͷX/1jHCQ7b  l;tXKm\0u79(x-U޽pǜ)Y bL۳ yJu/A $-#Tbr̝+~a\.C6M\8vVhS拈k[WuT+78r\fmmt1QZŠu:G$*:Lcu0sE._ )˜rh5J&ɤ/)u L|566o0Zd&ra0=>v&\Xڄ6O#TWי ϨagcխeЙdPm0s=%n}HJ2fǏ>fb51f>tn# yB@@ӓ(@OTRZ"gPERl^ Fka Y\nj1oP/T\xa%gQmra{Gͨ1 g)[WK,PfaB\[|)hJX[Z?6hqu&޾` U?Lg̦l୷i/#13Jǐi$I:/yT d5DWGB p#T٤RYP20S $#{ fy1)K$Esbz}id{-> gM,+c<"&1LhN:ED@df\t*q{rd' "1m"|: GA8KU"t*.ny1w =0w<`28j2I|}"X<*))9MoraBe(”U™KJ@b1?}d2'AdEѹw6s!$g_|ZPٛXqcFzX>ʤ?b%_3֗ys56$}ssr$!縳sI.S-> A8 M^gvF#)봙M2:,a=NY$Zym/ȧָs=2Mj7XYJ2[[W vZɈ'>;8 C$Y:&R˔eR P\B^2&\pìT7:X!]ey*61MH:~$$) HKqQЩ7jm49q|Vgđ@AS ˃Pf,U) OJ??ulk8#tDDRuz]0`BX"\`%[a@)VdJb (jx3+!KI.aP\X^Y!cBD")Z716qrzDmygMBf ۧlV4—ıMrȰ~X |.hba(WWiZ6W}@{2C/Tr6> "ZQŝ-TdVb<98>$O.rũқ9V9 HƬK!&3A#)$5|e2}8?"Խ)aotp\Mu67h=e0CyMNcu? \r>~ß?.o5Ƌ)5s_k78q}޾ân3<:ןqr{o\ÿKƽ %wuB]GU5}MXm)a2niab," ?ΰCT\Z]lcdKI( v.7! Iq_5XĈpQ 89Fe2k*AAq="e2~ן32l $>&E76pPPʤxT<[33ubF8X,Z)1eX8ֻ=bNab 'cfaMp\Mx;o]$Zo?'ˏ#CCp8ӧ'?!?/)T@BN5SY2ugv Ɨ ܽzS:!39;|z@HHIƷg<~)'| Sh|A&D>S[]#NDfYS{hP{}/ӝ4(K)ZunTnқg~ c9mX,oT)>8&=x!۾qe $T~e9dVv9RF.ǰ ;EOx_qGQ@:_{77qfst] 4M$I:7EYEDx=u趛X.swH(IȒ5NAi%tAKTГS'_H;OtĢx=T~&5a)dYB`A,@:#0R&l2L&TU%i`C%5S]q8s@L٥V[B#VJ5Ąʋ)6e-ϪF)%pd;oq)ApDo_J~+0ȧS6Nq{<%TL6-""zM>}'/cA1x;>r] $! <1+,z Hh̆F8B~<'2?ny m~|yW<>KL`F[Tjp.|B숝"#`4!& 6V.sڛeHBK{_cӨJI, ll͘M,-/#ǯ0s,o3TKX)9I* /R )RΨ‹۟q3<Kb{r?e8hqSN\6&qUK2ԏNW((z0rI(خ z\&9^% C8f>ɛYVB'Q2zL'=:|H9xE])T $͑J#G§qb4gf:٧gم*+7xԴ5p,ѰܸDT]GV$>duTYOj) =AH.y^o]!w]N_ d)"1v].ׯ^`k:Jfm44&g1 L+ȱ~!A"QVzO8(nT]n\{|t|DFwxO2ؾKΥ+y*D<X?o:{z w789i"ܺvGi68#m]v6tZ24:!Bu 8FӇEBE[#|gRi\0dvhylmmp]X hȢL $d=L&o 2;H\ܺ+g8?۽xq=)>q&EXxh`0&-b4MDZglm`YS?:D EPB6Vh꘦A.C,j gJnp9RIEEUltʫsj!G%ݸ ] 'Z=PYiUO2pMPp\(Q3$y{FP$Q$.A), ln8丸AP$0rNw83jHQe6y_%>^u.W-T|2T޻z[[?_|¿1j r\N~C-I qD,xܣg<9#,|M&_&.suMJ% lf [WAL.3fS Xi_F[mg-׮2  IL"K2<~9'j)!V<{<:xNYY=~N"Woi<}?!&#"3&SͰ;\V?1LI*Y"_`CHLf# _3\1r'}pg8H*&h5p I @E@!D9_yȨG% 1> oAG$ '2R XJ-Q(HL:t\;!B"j+Ȃ%xf>m "aQ2LgE!шA@:⅋ G#Y~Zd:v`Yu~NBOP$e^ --1.agwdy^#fHw,dX6 \5?L~.F7.^n5bc}bq w=_b,">>B$ yٽzC{NycPE+5}W^iD$6ь47p>ջ7G:KUCc[RG *#/12G`-\ϥi0IRz/t S3!PP87^pU& Ef 2HvI$0Qz}GBi<ϧۙp-*^@QJ)I&=wӔͮrG361D YFuQљ,x֌co!@1 {n]\*qk]3Yf@VUv.]+O!NEюm0U>A$ IYTQ6\F*^ L sv"bGX%$ʥe :F?_pv1`єid Hę٭.1|d6b1f"/Zf( k~CLjZ5x؞by.w:z;봛T IPf['hFH7~ ;DaN0b{䋛o!\K|Wwn_Hmq}6nr|:sJLW*79!Ħ*^NU|դi1% gs{Ε%.fkN!O&-/:G<}iɞ=R]޺&_}9cce3I15W@76y}fBruUr5@p*6O:ra::IM ky &1;S%c|PH֒8xBeKxdHK(9<Q0Y,pgky5q "Yb4قP ZK-RPsY2<\XqɇLpȭ]B/3wzԪUTjL!J)#qL;X#\b2x9Fdߡְ:,2M0p.ҕ-dq Ǵ6Eq}?|77d:qUƳ!K+Wq ^f|\lC\}g^` C\Ff8rV鏦X`u eq5#!Iu_ȢKНzDb`l=Y.13/?:K ;xAD9?w|Ao0;.JϤ/&>f1IͻDqhNM3K׌"GxSVF=V|ɥ x7ǵ-6k72}E(%/|TL!4fgrU 7$2*E1tl /9. M_0ljKHt)hZ0 Vkh|N I<\.GZa:~MДժLgc9@L{hzu εi]X2dYD%dY"Ib?}_.BGD)(AF ngiF䨮!;;&/{EX&V|6V{4wrDcfӰ\|>&4'4Lk <|amk3(eU\wRi"woŘ[\^եurnx|2e?#) 4`gwp@sa Z}՗?~}#}va`JΥ |U(Ih`>DS$qVktNTkeZV)G '\,%-״(G9`v'_{aFhBBrYI(FA"361Fd :i9-1\K7q'O:,)]L'c1`&[5uLzt>˙C 'G.'l"還MTrU?yBa! ϏOO'2fh/"?EvN#o\?cXd}*^Bs;}:OH^r/=ʷO>!ҬfbdGیxcV566>(-QK(:1fA?Fv=*N$)TW*"G| AP(fsSYltiZE!|>N0),QΑ͒@>Cufjw C r\dʕ:k8K"t{]\ǤZ,P)19>}P7yz.6jDBa Gh)Qy1mٷ|@sHL.U~kMj6;M$2bQ 9mQb= :Z:cqCI k aHDq0Ȧ"E 6R|&36 6Y_D6a9QbbCtHwՍe\ܻFe2 I: Q[^e$$j * m,l\oA8#;6b$2+(eKX'gjEbA_{>Ih0͂ J J֌,XبLƘQdkED8Xߨb>ـZ 7^f ̧=fc !R" JZZtK"aḋj-rvn^Ҥ/? _Xn\;hƬ١(),UHRlqAK1tx Z1o\:> qBLt ˚Q0hR.PZfie__q=B9M" DbĂ/<|-ԿWElDGLe3.JVt|l7x!/63Gi.,bp$LZGAZ?a=ǣOHY= 4Iji ")t]g4yT!g? CT*xRcc <zQ@JK+"bVg0*J ,Ǩ6lr)Bt?}+UxM~ĉ2ƏC4E!-&ܡL9:==b="%9Deq9  ;U~㛌{TY`3CYŸͽ;Qy>`mm&b%HRYe^=DAcg{g=%.^O9~"a2l &Qlb3cQ,!wxZlP(fU8m:I$:J,G%˓OU/@-#/\tTL!5&OQXZR/Uϧ4A+r[?ͷ^,9JyRk(!>; Mjs)?= 7FNy;`vyύf2cTߞQJ>C}w~L_>52٣c^V%Ȫ롢哴uaC)䂘Ϙ 15~D31x}%Sw!j>}d*B?o~NF淾&&/Ũ=֯^ZF^+!RUQq]\.+_["\jr\mM.W4,DIX(S*OۥR Up$AL p~m7E|E eQ^Je(L]i1sxt^~ `X6 b9.D<"zx9*(j(%s(?0]гt:&\Ědi {NԘ.dpBE)i0FHj*aD I( hP"xMtQegclͫľK^wR.ڨpVTdx{>bl8@H9ss >وBV'rm|D.]G u4 r*lT,Q08T+keRN͂]FY)T2 /V4Vp8̰_Rt [M] Mhޭo.DLrx{{̭a$tN4,{ہ[\ٰ˝یǝ5ʩr9 98:_0<$q`'CR)|i19~!?ÙNh=B1qZt6Ѩbc<,M6Lt>(pUBoh:jH$cZw.қٺtg 7˓EE(D-pDOt'u03<`4(|G2,Q' :sB' qDΜ0'&9Ɍzd:ĚdsY4Ec<^*JL'-Y/9<;dLAro"oyK,ai !. D{g2Yurr*_s?w_Tqh댺M E~0i>;dajWp}(32Ty‚&TF_U:K2"Y B`2hd(A"z $ 8/_;8=;h>' 3yeu''[*S>CxӟKk ^[ i᱖#i*je@Z&FIt]{XY;/r贅T[!I\DzlDQ}%jͦHHP@$$IX,{g\QD=&!K#2* Q_&J h4WF"I|dX$X[ZcL!X,3(Klnna&aS,RĬ;_ks'̌p]:kkfSd'D4m-&I|#Hi)ֱ6oɦQsZ,< {XƜVzyPIc{̦XJx |&K!G/s7vX*,QM2zV'Wyxx@R*g_#“~|gb!Z&&(HqLFQ ^0EMlS\|qo.R.Tb(dS=l[ > j+7_WH :Sw 7u6>Cҩ"ZJϞ"nsp]67.UEp՝lWW&&j?z5sDW^yAS*,/m#];LV9b'EbUiEB_ Nz a3 ICx99`63(W딫Yxgь_Urc8e)i+l_7 W/ yb?"xN*&T+cz N:mG/PQe(XkW$W/q$˛['^b(QLH9.ٔM>7;ego2)|ϣ)6w&AEی1R$*(Hy%dE"4Q!0E1)#^ôXsO鶟ɗG$tg]gM~xlojĴ,]-ON9k6\2,Ÿ~LZO?{ӓxz>ͷ%l\NauRv㯈t]=53u&VN$mPgnjkTk]c(B%gARlG6[q(U.WO[|xDŽ/v\HՕW'I 49Y+Od48II fo7#dYئsx b6;2! p-;sXbxzj̭W^a:s,w@uuB2[[q0MIRPUz*iHHCVD APC[׿f#nݾF.%c{J2:~ !Ic'NظtdBF7ptNA?vG!f.Qk+)KuLMJX j2jr7̎^`||U"gh o_AL5fz< 3V_ej(1Fu)?gQEU1EO :y}=lDw\_DOXU@fIˢde>PTPE0x֫t(3uZx^%HTZc5LXQ!eR1ʓL&mf6Y۞>9@yb@aFo<{ZXO9~͍:='_F93Ac GI X3Zn(I޳G0qf ̦sRqcI!!)T(d1aEL'T5aS.v5M}d]+p`k?ĉn265F΀:;/l\;%<^w8}v0P*,x;tMƃ^!LOt$1 B5VD79s~o6~Kef1a%`L D;D|q7No1be)4ۿO쨅(^x1(֨d4E?~]/?>bE[^ zh hƓ G.O:4x6fk{lvyF}~H<>~;/|ht%_flm=3ҝ,R fS:#I"(b&bcr41g'ju̹AT\.3Tc2I# ;LcswWr$Ͱ'^ j52-ڝ}*5כ(.!&PWy+\(qIu[e셍e;P03ZSU!d%ED&"BW4ҩ)I<ЧP.S4[m8h@FKdR(pp8#[;'M/sdJIǘr 1"ZyU.ltH}\@Vd:6)E^u,+Hp4,J41I `NUjn]}X Ȋ:xHdAI)=ɗr!GXm\^]%I48<:FV0İ#|%c9|MR \d`1z 7 KLC܅.PR2s@Q4kU]Fա2NeLFGe8h=p J%~hJEdJ%~{q-lDY+c2OAM໴'&.~o@zHJD{DDfS;PE\@"A6ɭoc\X١`α)d\[g}uFx%\v\`0m6cE%Eƃ9Fl{̫/ߢP/ZɲY\ޠ/0[4€K19ml.8|N &Y@ Ѥߥ.ٰ.g 2+8J5Gҋt'6B/8l 2|*)]GSTKC,/-b|Ɍե*>{A,2y2BXRo]HJ.GSunݼ$x t:DD.e:zހ.]bqA*f2g9[%^/1~Ls4p s5.\7pCj{ bmr% Vm0lKk$J7~{=w:âAX^#-ƣ!E*tQ7_bh42Oiij+Y1zJǴA2ϓbU' yc L 7_zk/c4prx*'x^umv3VgOdv+(|}wzy^c}f%n69̏=$0 wsRy)rm*qf )O}SY}WwU_Lϱ],q MZp"BpeAKa˴e @{vfgvzz>*/}>3؎[5p8d2(IHN BQbOL~ɤI0i1O5 nlCLМgYӑBś<)nx4C   qK2өF2$\x}^  `0L#MK2.PfMQ yZMCV*$A ahTKOu$iL1Ti\S8%𲹶B5O}ֻEC7 ]1{ /UZ.d%ܒGmݻL;`<{O9/rbyufvYkqrZfuQUhroW8/x#K̩ qQF\Y^DU[֟%#I1fx8E d 6g\]][]LuCT莺P.fD8P n³iFJ SqL@DwD IÝ~VCqI0g~&n?nh 5V&Gǜ% 3HxgftzHf#Y>-~N>' +Hi6\˫T x<$Bv6+T_.$WƠcop9g _u},阿G<wr79 "> ϯ =^ 3ײl"^-\㱂$ F3IMmEReQ'*~_/,:&Π rvz|rQt2,qrt6(.HHb:zENXe0@B,#> 3E0`Fgj覅L,tؼ-$Y닫LzC<0nGrhM^ X(j+\vޠ@ 8@e=W: ސStݘ19k(UNIdӈ&8I1# x酗Y[Q1Ug矙zu4">lr >Y/DB2 Z6ј;|o?ÃڈD5`>S[Q>_,/ڨhuXȆ]=dcg֋Dy1D<)vC898bnehHnAoP_#IyR XZ\"`#8rSըk*St|Akq\ 2!0JDD4ƒ9THDc* Ņtץ+p+ LlNGWpM6|L81ˉݓJxC+ܻأI.':\a`VÏic1qks_x_V c!e,F݌F шp8Kp,HzC0,`0J$C74d2" Qo6;CQ㊅ii R$[!6MtUa<McMM3c&:~ր .kURE%iaxY1z4Vl^N0 J&DT;'Ǐ)# Y78-HƓYJPe&$f2 :u&.Hr HA܂t:G$d&t,oP>xUo/i+:dh =ڣ&HA{ۯp(ShKF"aXpJW{lfWf [F-d 4xGTE y&Θͯ Ϸ!63:d">YA78\pS[F).mV*>BG?tyLO06P1 lG boS:w9htz`6))>{ss8ύM\2FdDOxrmxO=fhZ21$[?t)2MXA8eeyT2 X_h,L"_:_~s^}P7챲s+K(ODbia2ěMQpeg7 s+6Ȼ>$8>!td&b.,_}s oaĢOLPoӜ0eʵ{O3[dma],狋n<x IP噌0l,ˤ01Mx%4&Ի 39>nИN*A z0bsc ׍(QCdiGG;C TZ$ fya/lX8L~fE65 ! EB8>9[Ob& $"i BkϳsDf6)8hT%ABGr8.ɇvy)'ǧtlq ۚ2P$pqv(1ݺC En2-`O}ro_ tj,kW'ȥ7tD}t#e% g98;y]Ft9sKXo|.x 3~?G &'v'esI8ix2*H/3;ޗ PȮcK;L~^MD9$)@,&sѮaj&c  /srZ F(fȲLqnn˕U69B`(:;= z2KbfH (*L@ X1PS qey˴'VpyL-TMdr(j88<$MsָĎx9^b\4%N4ݧowŠ'K̤P,MHggQc~ȂQJ(caqhbY:prٱ 9Sڥs ]g(Q%pv\lnch=R =1qrzFH)貇bH!#I+./eɭk;൯Ν7ݭ+߸n-lRLh׫^n{yJ0Q?ڷ6>brF8>k421+ =:xƛlq{X[6ЯY[1vv{F#&ɳ2c8ί~[BQF,{ .0MRL d}2-Q& a^濫*<7;#n7 <~H8b15E\fL14q~!I1(=^/ %:O¶um+ aXcj1 77'>tt Y& iЦ: 2N>%ߓ`{ 磇?+~M |wPcJq-smʈvɤY)QJ B0`d.=X)+|rQE D"127Ɗ6@P(M H([_yC&JO`yvMn ޼F0gvy+Kb!NJ |~~!׶K P,Pnqylf ,/\ Ώ)f4-lG`L*]uB=60MtŢdm`IDGŸ#|YΝ;iڤyʥ*n)4u_R/ $hGNhnIf0[,;bXzg3+(8ArJSck OP% G M+_2UHMjt\t0nըZx RD}JL<-}+e@M6:O<@J1cE IsQ>! ,D\.9T1>~ p>,wSà~x?Î(%Vg_/_cxxJ,p5oϭp\YXc.G Fnwa 'P??HjM1 JeKw [X%M!i:n٢63ɤgpMtZ-DAAT0e#M db!%F1`Su2r$LMMgU&.L.%~/8Vˋ/0׸,2;(=e!="WrpqN8`uSaB$/G >DE)MkHWip `:lBL4DpB8SOo44lNϞGHdֈf88#>`*a9&ߠ/M|*Qb#4RyB"IF{@ 8C,(-B:fm%O鸄=3MҶ-R3q< +EB1͍W xdKxt1}@uk>9 G)_#+" 0w f!Gt*!h"etڼyߥiwVvِDDX>N*-u0ZLT& w:2+Ncu~j}B2?ާ?bf3J aڢę\^?AtPMr _}m)%VI_EL<"v{8ϛ#KڄVl"bqs+q|Z#7LB= 5JjϾnP.9tV :Iؖqn$s T{*ME퉒/Л(B@'<aAz1jI\Nubw Az!&&SͲhOGxs ,̾O_rsd #?)gP1{~vWi! hW ΟI½'p#$\(&/튒`-pXdG($bp&_oLDv|mMhϘD~ʐ_ʘR_m翁_\qJɣ'Ǥޥְ~7_ TJp5]Wy(jS3_5X^_m%{e(CU 1/0R<x$i$).ʱ:6`00[!ƃ]ʍ:qVoTW<7pKbcI%sL1g Ţ 8X4,4-B ~we 2 Q.-)'QӝCtb$D#ܺ9wQtЧ6w+X}~N0¶:|D ^icXc&-/N0=kI \E -98 #&w_%I^AOȌ07oqe:bSݤw rY1*]Hkk5Νy-:z~ fLdCp>x[caiNd,֗Ie3oi{4HQ)՚D ,_Yd6H-0lz՘" SJGnCYqTfIDg}|DpKCDK-"F ~BHdy{IϐId68 "^AvwDY?& , scFV`Y>ʗm$ q`0HK 1h>%3 IE3ao2Cu" L/Q>ߡ>$lx5JO3$Jؖ,, _%NtX/3Cx%m/7Q\م &ZiF(v.'{T;gh=|d5^ KD}n,$Xar/'6A)uW@ gXUj.#FPeZCUEs`k&RX4I0;fי6xzd2yt=,ׄx>4hSkD5)HC!_"2s5zK&pDBQ7" g D}~,c_)te~oBcJCaNUJeLJDG&Mt\OMuA|6?bc182Tff934zL0?a8Y9[k\_\}/^feZo I%}µܸy5^{‘,}"0h!i76SV\%]D/ k6o]"4 K\^{U*x%Jg%1s9>yy=F*{Nq4 o6r8Ty EUXYY#z .,WX syB٘=M˿GVpԉ.2 p^ Gt.+MrusPȏ=r/+E2*HrǂYv`)gM1D锣.Q3Uk| _~t:G |)YAG2g&(g{" T_'' NF).sw+3}֐t l@,P1r{XqIT@gxH:DtL,:1G'oovtᅬqTj,{C┎&R>wH>ߍr/oxN<Ua 'pN!2NvTu{9pl_ôBhۑ{Dq.xv;MvKQ%2,Czx4D6BUZLjTHgfk ,TԉAӾPEWIES(jSc 0W\"[A7[ٙ>R3h8ʨ%H`i"~'cu)}ef9[=X$yzx"CeD"ȱv;gMGcx=KY+Ѽ,,)LS%b |v '5H^FN4ްaئcJRYNywn249WWJ:g=zvy o0v *reLD$AYqY?[ryth5&Vݝ$v(W/8=8&]!\ d3+|G\Tva1Os))cd2sE< q!0آvxN,O?iLrO?91/st%N-cy)KGjm6qe8|i^]dobrP 1v8FLPUQ2^=ngNf0 *G*İiXhW]n<,`pk,5DD.g\YQ:?;m3wuƸm47+H()07* Z;-Vos=t)%aJ:g~2z8^U:2j8e mzC@r˻_:*& 2&dM>uVf2xߠ\>qei6@Lc,Ɠחh.6b'L>aJ WV -RXټOv[^ck>?#Mح?A& o9.j?ێo"B!QQW$Das)7k/uZ?;& ׮]eZi/O-q~+oX`899 Hnd*M&N "ǃ56zh2@_YѪaXK˷P5% /]&!Y|91x4#1w9?>{䓋Q7 y$W̥VVD~Y&@vx^M3Uz`aa# 3sKdQZ2bn`*6o0^fyk&#gHۦ fZ>yWw^sNZw1.DO67n`Ɵps~w_m叿Ty}Tpyq貱mVE4FϘ#C(5egH |xC1+%$nW(]霗Vip{`1pv~N6!PhS^|%: ӱB&soKn@ gshcuq~)yMh q`zt8)`j&&.|`_6a폩\eyWy5\15ʧx~L|Mj  .<)k\z1$|}]28Lhn q=a~27 I;zΔ;{::ױwѻaG`ɬo٤x=ܛkri>x[>~T"4j 02GWf|zAó2z}x~|Kču3MhG\]·GꛤZ o"++TN4J~)C&Ҕߤrثcn}7OUZDt:A$Nei|AdnG$G7 IDAT^/e1 6qPp@87RS E\N^gi*#uB?DqK2HP,Gzfݶ%x ΀B" "^rÆNP`N .)NwZ {.҂Qes\>aj(C-^vMN+I x]Y!M_zw{2Qdeq1QǏpg?K,y~:}'&AAI$%-%Q*J-J렲jU.ﺼV+YEWŴ A f0Ι999}:t?${_<{ "b6O4>/Gas<Ι9j&M0go/k)1Q7KJO_?voq̜:cJ{GgXܠrً[BjG^:'/DpݤRGLMMR*Wp:}~Jv˅@סדklVnHt 2=CXTj7h4rvooN> aRJ8!Ahjq:6pڈEurliH@E4CGV ,nn%d idippxnjaXrY^< R,z׀c&"FWyTYQϓHg"eD3/AsS% 蚂jdjr a2ۑ ج!tSc m=v#揰I`Rw=fgSșnNLl1:lH)FǞ#.|qLdpPH&ZQ*4i\nf@Wͳ}Z~vRgbt?} ᮅG?kUK˫R &]2Gd(Tk)}|Q7+[O9:g`(Fbln'(R)@TWజCP]NV5mu_c=$70 N^:<ͭUҕ R'MteJ)l8V<u{Ǩn1:2Ν;X#llbԘ#)xV1rP`vzVJbmaa3@תfAޠi 巹 3f[$ր7Unݽ[kU~/<:gݤ-J{/N{?ahl A5飴Ac|t??$EQg`bl?܉;o#łVEO'`[*tmhPTPAm>}NER's#ddY0:6z "cӕD,6DTJ-Qi6En@,KR,+AgϐQvCgvɣ]\@-)0 u6EGɴClȝ&K7I?$q{z]Zh9|9JCCvql-b !X$!bF+j+W~_p4j-弈a"gNrK^9ϽU$ؑF"|tg'.NtTtݾOek}8L%Wb5u'UNN~{KݿG\ 3;1B\I~yף{N2EWK121E+romRWI2X\":Js{L@!_DQEvqT 9XE Q֐&AKTUAv w.ВtRIS'oJV8tbE ޣ(^C{]/4%O? LnbȬoє O(-\daa kˏȗ֐ vDdʫdBU˗bb]%z%,},>|O Q,f $aKjchwdvOmt`$S9^cYk"ﴐBL|ktusqf`V$!*n攙7QTµ^uR~g0H[j=;8nޢpXY$Q, _ 24=KV/g%+\pA4e:/-w7YJbrz/@%]ࣽ]sǏO#0;wBJG-Vl+^rB__?jWE2V4ܨa[ٮݜX8I2דuM= BPn(~bI_lnWb1̹340s0j,F'JSe,:TUE.'BcgfJXlf6ZH4j6I ^[I i0p'H&Wbuc09.rlc7Z`PV =9̲!wʴzM4NWQp4Z)U LLOG):<ģq y"b4G0yuIHm, t)Ɔ/qKi\c`|zK"s 0@H/J@ A`pbM/a^Y.b,Xlں(XNqj Qہ ,VF|%ϳ.md':HݥiAIpuwvLcht@*S`n˘%,{bphetJ$X6f5Or) -ŬQJa^{UE$W;VB.;ΰM32{;8a,}Llll%M@XLl ie3x*^w?f4fi+O( 5 W|9xK:sgO*4lawR߉q=2mQski2zd]䓿4<#"A)g|қ#ξ:ID!o1!-K\<~KW.W,/!ד(sXf:nK'CǀhUڕUUdG'a4O纒$!RC6ezft:Eh4!&jVEѰlR(PQl#2{6FIdSNL/ae~aQkR* x|Ԫ5G`ZmLϓN$@a4SQ#ᰗ^hq 60D0mPoGdlo/24p,|{m݆h`` FLۤr* .z`6hd<UլM|m=.|9b7 "lm¡k/Qjopz@5t Qxff9J8S8[x|~oA0k xi^:6\pI0>7fT١ixj׮_')=M@4Jbl=CW,jv+t&:с &k ;OkΝ?C(&`41WutHx;9eH%:vNgn B KAd5I}ҥjP+6R; L^lSG?tb0$D2}DUaP.uҩc$JSKb [\hMZ&OV+ ra2~'"tS؜&bJ 8E[/E[Slɽ+ 54+Ss~޺p'w+ vn?&rIY,l̝>t0O9{Bq'L9#9+XxNQl| 7^Ϗ{%޿ǎ=} b>!@[lV\.'NI6GC\nfVI$p{ ȕr&U2~*r(6NtF,h}}}000Hb`f_Ȇǧ98ܣT.JQ0Irr%NΝnpʗ~v@"S+Ł]"'fgNx`gg.L7{ (FkɑPSr }|6 mǘfuc'Fy_5!Vҹ> fSG[nqP,єjX,wP/jX-|nΒk1tUb(>t3Hlkcg` ШuL6-@"gɖ bAbKOblb łDS͌Lt f)6d"1)gI39\6;6"‹_[ &C̎{I^VnѭU)difoH.SҰ;Hd0Z:}Go]ƫ7ػpI2NߒKM\MLV!=`yJ@]8y6dJo'lڧoxo~C"NG˘*Y&rJq_[T~FRԩJL#Y<?!~ȇ]&dl2\;|?u ҫ&6>TU&Jb1[zUQK%}T] ݠsq:6 `X&lV+.K.k*"a[ FN'^Q " 7drZE^㽟r)2jJxaXNv7]I0!I a/RrhS)m#|誌٨QnbP6l {tbVojPOWp}. l$LtNY,)4(:fFFTFvxl.6imlN;ccD}Dq~kx]~g_[}[Ou_{ .s\F-̎?[It!X ͰEBx'(2 g aߦQΟ5 7LOO.[_ {],޺CT1z#T:UYbdT#| Czm2]1mZ d #*ӻ g}c] OS.H1`xƯ zN2хx?p8Q!YqXkӐon(\{s .V)ZrDF',̌~r _hѪTR,FxfJCLjǑt_|ja4aSF̓v:Z%5ynF9K>]S *Ѿ zOJ@IQD^/ۙ$l"'8)fcv#f#ô*>Tm|^'.7F)vvU1 IDATk,VF'6>lB^>yoogi㪵 H3..UW!4Fϝ"S(rjhq& ă2M-N:,+rtCt[bok`F.H/uozg_A7Nʏ6v{.ݪH}w0#X8}j'ncdFI0[y1n?%"vdSubvd%ba?YFixg8B K[âc><']Q7FO~Ǥ+^~[ˋFe=đI~yȳWIb??O}! LMn46y +ӃÔʅOn݃N?ݎlZb1[i>ͯ[mVʅ"VH*A;MfhZm,V3dWFqـIiZ?wJJ$p?W"",10a{F* WKX^\y6R]gw0{͝ǜE@Uz}t6o^{%: >o168ʈ4K5 ޣ?AYJ}*_~UM'+"I&l6VB`jn:ȚJOiL=C*A0( ,NgeGU#~Qo# Z:nJ)NK6(0Mʜ9~Z")TMN/h6݊fB;J5֖tlv0ll$zP>GTT#4mۃhK8Z5CH0aOu21UtC ,pjsI%!fʥjhaFGz&eAv.di1o:+ 6V/RI71X[LʫqFu ? Wey7Ehf7>f&Cܪ`-h~"_"![ƣuv˷Xx<\yv*9|c /1̞:[?6c i&y3/r񻈊NWcmz,üxy:*.2;46S#.^9̔xIؽaB 榑:UE79?sӔ<3}s3<{҉>VM2 aYAɴk*Z&'q|,*SoKDp8 SHgMarrRUs/!uM,]`o/[o>6n2ű;<|Mc5Q0@00t:FlN [t) zHC̳O(# ]HRҨQ/\ Α:LP09k`F(t$$PH4pCm1'N32u ?F:`?s$Dp 6l"t^%!݆uv,> Ю7TtI BIq[TR \'M}\:}V|qEkc GH 87fs#l]BI$&U%x_{x=aFΏDWfLܢmu簐)vY8C`0ZPI]c` I3,M Ϝ`cfg?!N<6dλ? MG"gr(\"?:vQytsn6;:¬l>&gZ&yE:^tz}5h-l9=x/=w'7qTs :=nGjuP41So4 :BvNYsızsEOFcJgٳD^awb9<]'ln4e}7fI[]r-/r C?a!>BEu?L˶Xǐ'rs1by/pnO(G/p{(x| 7 H&]($ְhViDtHؐbba zj|a)ѨRp/~BEemf(k8}^Nbfyn310Hfe} ˛딚I>t KNOR(c51ahlퟠohgpz*&Ėt{NЖ% f ,4|b c`j8Ͷĉg:=*:3xpj![αԫzBM죭(0PvWZf=XXjueI8:J M~z-fe7IlN"Uո;t`UIع+f4_eqPT:|teel;7ih=/PI-Dک;&' gb)Ƀ`S|kWQ_ѭ-N&O1S#x~|ǏLL9ZQu+5ɉUnzc sn'<|+ߠZjᏎr v rHǸ2Tk9/Agt$֗)?MJU^>sk POc0i+x|o]}@ |g=p4_j]T*!uO3&"Qk6@zI[td(Ku~j5a4QvNl6l60`DkMz=Å19(b!=\+lVJ VV7h XmywpyXt#Aـo.#<>0`lҧY L(kV"J^Gdx`F3p [Uɤ;$HU;"NgJ>>m:X.p<ǔ񮉸ѭȯ|Mh `YXZMtL*(VEn Rjs5ĉIlqƒ 9F-&~W9#YN;l,w[YagsͩtG}LvfpI]vY\t -.ͿǏ 7V w?6.gUλ7FNOhĘEl7#7˃{(Hdt z(ts{%d|k6zp:4:j:6_q >Op:nZy'QM {jrZSZj#w.PmXl"/ 6MXL Llud%9]sܥ1:4ibs1:tF"!`awhKU$L?ŇyHN|K˜>@Sz$1XVm!xl`.q+VѴcOPƵ(AB˘"><>vryF.z1Ɯpy)_dR\^]ÖVTaf.]@Mx>{G6z.-%g8<#guO}UvfnpXEȓiQ] 生>W  741"O}FMSO6}s7NDRz@Q^`􈽰Iv}7-N<剳k_%z3櫟;N 6K >#ҁHB 6ch*(_fppJ"6#_y:ClK$CE #Z:7.sɋÿk{-4EW9YL9Kjvr?½}.\zz봊n:WM>V:XNE04{b:!T-w ʼnM{5c҉0;S 'y  J\H#A8(6 ţ'4ku"8*'Hb*LܳORl'{% ?޻ (CfH4hhjz5TIy!;蟞0E:)ӥ^'>{Co+7*P||V8oaf'~W|?}quhwH"+D<GA>|񣼵^-eGnx|+)83Bʙ8{"3x=?H:637YږD`mt=@adA)߶ aq< K_\ !i5:8I`[cl:.)9b(WNhVʼ[x\NH2 ƒX8?B;6ݮ9 I2$Q.mYvwCTjE{9nd*AY4H c:@@  ŰqFD<&h3gD|҉4{ۇiY UVq*zHhKsw_Ue\ nkyVFU ĹI^WSql9fPЋid&gw,Σ=-̠az6vK# q`y΀C_?շIe{oSw[Zo1 " p2|,H/z;wA;@"ȕ 7)!j F}w)W;bKIf)_{5꜔*,RsLp/1<<jN2Ƹ‡z *1 'mcȶxiut^޷(:$co(F̭O2|֚9sW~|Y‰ "06airZɵqW76giۿouiڼ{ݯ)Y^XqHyajVn>IWR M\WR|ᣟ!}bm~x?A78I Fbzgr | w5z=`5ĴMu^>7_wwj5Aby-&]0-v?g߮RE/XYⵟ0{Wї6ϐ~2~K@2Eפ- G[oP?~tgn18Yv\`!_(@r9SB0jd*`0 GUaTUbaqӴogf1M}<^STBðGa$уGpuZhӲ0 (FU3L#(wť z*/H#Ha>(LҨ׉Ţܸ~b@R#n ?i1$K>?eĬ0&)Od #9A(ac{@GH t#^ƚM‹ )q]McX6Wx8fLgʳQL(~t$=i N˘?ժ#xBIPD<c}PG*|/!{d,s|92Sq,E ѯ1#1;q-&sYA᠏C8#x/|L.>Mӧ72~y^ 2Ӣm(2vˬz/D*ksqCb^BzH&[ \fPPEuxe"K%׾,uk+ 4;  ˗8.Thx7o*{6;\8"pr]]utKG{G0##qIֈ 3z&3qFCk,=2 •8{ Kg]XD G|\rDJLoܤ]1dqv 7k{(^E :>,ÎN/T+x YZ]2,G` ~~Ju~'^d0 2 ͭm~sDI<4G#$-EgZΟ㿾}>{i~?1,֑ VlrYJq|rJr*Σ\X̓$W֑S\;wr~a$Oxo@&3ks>)١ax'Yp Bdc_DAzj8*5iNe09/i.f{?/|#J&XkH \ɳW}Kܺ}?JrĐk?9葮 C<Y_VsTG Eħzn I `C Dye\$15̭~Tt? 6rojrn!2px/e a425|>χ,HiHH$ih|ɩ ],3b -[D~6$0 G{U,I<`8*looJ8z`@.Bt-ff ƺƠ? N5[hڈʰ`y*GkM`8Hӡ3h!.]Xq=6kሐL(\o!)`jh45bM TefvWyC&3A/[c*2iR\wL^f0҈3zt2* K5&)R7+h[d0WyEk4F.P)qRNFɠ'!I&24}<nSܥP@lVW9:~h`Ыx}&;6$`vˋ{ju>Ey˄B𴘊ȴN6?+_%Am?Y=;`e}>^TXwtB/u~{(^ΰ]G0GEA=v;L71e~(+,/Rm99A9"67CTD>v8scS'F#S>_1(F2P&dnnfAv2- K3F$K" 0V-t2Ec`H:gm*>/54I_fO.?:?ӿB$^Cv<&S4QU<ɏ)V*nمYqi~Ϋa;Cn̋wD! fY3b*;\9Z˙i-6ʲ~~Dysd ,oT"I~Jr V䲵qD4Ȩߠש`h]$ Zx$&9ih|~1#=;M.`>ɫp24th3?ݨ7G: MǸ^XCiW$r 8.qpo@0tS/}B@%^{BI\ق"X= :KL)6j])WsqLP3ֈ^䤛'βʦ]ClOQ=rqK.ORtI[h|ykk6i? ϟ=<:cej㹷G!`K8Gp-֘vt&D8YW pt| Ȋ2Vq0tP(?j5qU5MϮrZ.eO4qdSqzN#M W6Y<;O<a0qZ``,wGQ+z:((3;H\W~+jMq申W?B5dw* G֘T:{iд1?7y6әG5qNV}@QC!76Iغ iՉ}*>A&P-E OZExiXvpuDO6P5l nLfڵ2I;˸W%9~z/&n2;J4)ƨCnq/W_{mj3('Gu>[_Λ?`a*IW?=7C}"AVU2R;eƦ-h#t\[nrgcxGa'ooo|ɫMKDcBw4I/|JL"M,Py;SEAڨ #rR)i}|>6z {<as^c)g.RI‘dB1mto.EklRoVd&r&O">A*9I<6AĒHMiMJc"^"9Oc$:hkq n2?d3xq*{ vTj axQr@$`hh =2dHϥW5dYvҜ]Zd=fr9GuawY8t9X+~Zo?&k[hzBHsϽ2xCc9" 1it;4^#jp4NPm{A}Zma}4dV9Ao^7m^yUSHGOҳzw2Z~*כ5R *e.^NݦkIfdE&s9 am"HިOfy|8&f"X&vo3ONYZ^٬iVɥ5р+ 'hm͓ZKAx<"N(>$o+7nqZ7q,1Y=?@ģ!z-©8x/\>';,Lg5a֦ix+,]eK\Ɠ7d )zKFYDFB37)=e$unK,`LG"ENJ%33l2 ,]tFCt͠kx|^ /\ʌdMDI|$Ri߬^q~k^ P`4#QlD@3l>Bxl,1 lEpLDzXvEuHbp$`}l}t4ZMKk`tSbNHūt}>L5 ]C3FTeSu;%Q|Ln`4/$^MNk*x0c}L `*öMvbU L&gg%g/ޣ] cK`d4}|jШWyre\MZA%<!҉y oDg[|0=h+($HYL(x]^ i]g3_ev} nƵG(J@Ui6ͦwQGX 1#J`a9ч'J^>hVO0]DɥٮV|lz xZZ`96>UdfRL%2DhWytaGŗɨ(T!x%|nNB`nq[L&}G|+_;XI'sCSrFIPUzab"xpLZ2'NuU=f}2`s:{h:E"9fA#Qh&NjׁD2a <^Bea30ڄ$G NsR[2mūix|⇟_G^ZoiyfX@%s/hJ&e9r&wn# $2FG(5E;(h_cgF,k"X5e~?\'Щ8aU8}nc)fT:/\~oU3gY^- eSh{,fit;tkC&jO7D 2<-̱Hx38Od8 ɯF ,,`&H@ ʿ[?gm޿DErq[D$qR< ((P {,s亘"AF&>Ibq~sj=Kx~bB|bIՏ3f9JRJ _bZ3yagn=Ođ4|ׯ=p:|_{ TO X=MJN #(D3nqq<43h|4{C.döu-^Ы댬FJz> ?#ZsԢWi E$l&>hԶIl>x@W@ptS'_m{z`"GG2LVBH,ShfǶLL9)Ӭu\rctFU$T ChM _oyo!̸D|ħP1 Ad' J 9}eς7¬cq˿;̆ {Cz:>5N*cB° 1h1Z/93< cu-qgod|;>u.M,qU峩v+d!^}u>O~1\=~F0%T|!qtLYFahGUd<&uCj{vx Na 41*ېVY`F gr nPL44cZ ұlF8ǒm No$__ͻlk|_b8 k6U @yrM*EJKv8zL>>r:u*:vD{o~G{WH-3 6Nm&-x퇯'?e1`K0V]sgxjDQ_x}?]Fp->sIF$c9)R@"mUUek1jPFyL<2TŋOQV GØx1{yΟKB^$`H$!1\.SOR(u:hA!2jӴ0uYaD:KT?: 5#?=Apl~s_- ض@)ˍ'N9r~^HHm‘8'cff}`qafnh\v'r ||2_YM爏~-8)7r >^psq*T "ZAd +X^Y4#B AGzPѱ`!&<w&cψ Eă3 x]LL IDAT?pz" FC<;AVGTyVN(xQ$:65T>2M6p ㇛XcCqm6p- z 4hw{3B^?Nj#6DVhltzMf3t: $EhQ.HeFA N ئDb5,c{]vcD"xleЇ=6fT2LnH$J>e؎CR# F043gfY9{`̃C.]y av*$ô>spauK   1-Hע;jc[hG\YYmB>~o"1T[UZFgsgY`\G۔6|3aL x&˳on12X$fb"cna'^%xqX\ZQkruaCF#t&¬߿KscvӧY.3}ޠPb0$Dxe<1Iz}Bc8xL-%ɟ0^#28$2z"c_kH_lɴ`~kwrnZ[O- T/oՎM?IsazrM(&O3YIS!1|,ְϽş8?zH'|"LA4yQ0VȻ֝~rfw:}ɕwznݪUrFj&qf04 e"-W=޳֮#+{ײdKE$!'3q49wu圫ny3Td 2((ki$GKc}p:]`2[LZ3,\EDޠݪaDlnn(hwd9J*:j drhzGOAj6Y4RzQH&Rβg~0A OG&/O~!Hv(jdªlz)K(JO8F0?>,<&6pԺsYJ'qzH3\:4ʘg<Àgy .~k{K'*gƏډq[^=J9'l8j}ZŅ?s]|$`*usbuԊm:M A4iHf(`: S ;v̢"i]4Q#_JQdDf6IlHnch5T0,&lVjlp贰hZf3TE@`h`B6h԰٭hԺ*RhGuL7]i2Q)9lx(VVb\+]viUr艆kt:*G#(Pl*=\6+Z.(Kt[% * 8HR rOn(򌍎 d:۠ܣ SZp1X40,?j+ 1 Vt Jh4pYBMs SDir8jj*m7;^7Mq_ff+*8ap^gOJ"27~?biuOSd\ֶV٢^o""ORl#uZsmMfѱCܼ{C<ӗ.37L*gzTcepnQvr9y6{ 66eS\PvD7k(~6Si D!~wrm:F7zc 4%y6ԱRZh 04V3햁Rkrpe4CZR7`d=(;ic?N?F%"Y|tix`H4jh FPL.CeEQ$Ib?K.4[ K[  t6Eܮ gqmR;"nB+"`FMP<.߼'cS)36҇(gNBEfz\;x Gy3S,-l- <.%"bJEr`2B~6wQLm@js1*y]vD{lN'C=^$h+],F[5Y!e5Y%{!/fiv?I!qb_Y.VR!tV*dL{o !]7Rd{5 o[e 6 Lxc\6/* Fh8wVw]eaAxDޤ1!ML0wO%Y8Zw$E7fN&Ԛ:}ܿH\8~(sq~u: l=" ◞W (:e YB=!nݾɬ"NF0% dHi~HL&!q8e0DdCv M6#AoNV &1:674]ͤ|3Y&dcʸ$OmpS'OΤh,e۟IkPrOd9˵\9e2ͫr g?a7!Ɔh>LbdDV?=<?.b̑xOO/,9F#@C7G~UFfYc>9@Ds_rvSO8ƥ/2b2Hp0Kz!odžhdJ<vdX&]M@TulfE>lհ4\\ڦV+:ўary04*vLakn/6acmcMЬ֑Dl#S*z|ح6"fPIݤ(`ZjI2h6*k%.Նd@YF$ ̂N[h5t&Rj |>dhVʹ[MJ<>>vB  s0 A0 '.hxt]u@m8Ho֥'( HeXvGG(*n{>+C $ &B m,Vs =@Mh ]2BvJ]bLzQp2;wb҆#vFI䓤3iL]H8sS.xi8}'!҃qa۰wur,B+@*q)͐/ˤw*U@4F3y,M3J^Ha0ى{9asvZN:lw sR)P([ofIաZTZ4>sjBR;OTT266TbK"ϒy;DG0d2NeQ7Mk\%\Rhv:a:N3w+J Eya 7H{G-e4tDqΙWڍ[ʭ=c;?.}u'?&;~vEZJbYQͱxE+Θw>ɳ>'c[~U^qy^-3]XdhxAqcspx{Cx.v C7h Sȴi(:~ozϟ . `z,Vo&vݽ,/ D-kC0@OODњx25Ajnt K)2^&Dv1?!).*"V .|vNWQ@ Kir&<*TM2պx2rCFU7P& ۠XL#ܿsvb TVqڽ'Vm j j#s|U\.z Ɍ@Fu}6lɂ U^Ɔ*5N ңeR}| ,28:t!, pRVp\Xd#tf4HVU`-'!:$W7fXJbwR,<,L"5D`1T ott]/}wXjv b8{2ot;9f8+|1+mtD$]r3X:mF,I8#sTEr&Kx]vF;v5!Wt2;| x.E]>{r &+X?/3 ^$?3X6O'Jwyja$6í7NQȗRn"lx=AtM$lv* FW# ڝXQ{b^6gir pO!+eBdO\bc׈FzP*#~7;{<޿{a/Šdx"x1DhZJEV=@4[x)jd f+z~|B)oVU{>'N,P)mD\Lp߼vf'X_۠T)DK4eyiZfU844 ]]ei <^/$.$7p)"s(r$H(#ʻ*O]]`yi2$|׍k`yw׶ZpAtN~$2YG'a:#}Qnlm}S}Gfsl)+Mb-s3Yz}C} YL,ve\̥Qo2} ?Uy٧;f۽d k&U$s;ft?ago-e1v9 V IDAT* ʥ,J ObddzD&'54:]bP(K`&NU`fb[ׯ{^C ""  `E.k8dh E`Qm znP-X6pEר:=ABb.4MQ+k*UK V?tsmfXٍK_,\Osxt/ETLp` ;|寰_HQ+ؼ[8>~pSO>:FcZeq#e>j,Akzq⋔f']L] Ofaw`yKҍE2d|l+,#S4vjYZ\f#a.Hc~~F;_3qhW]1囿z؆'  hm ]G5FRTE0VgP 2ux?Y`f9L5 kOFT-x2B?G7f93QIf.9 ؝Qv2 3?VY! y, a̍23W !fT<}"tFCoh4L.T ,& &(* :K[Chڧ\R-Q#uj@]GtN8bD[OetJJUDӻQUnzҨ#$Do zJMmdIV*8nBYb`EGE]j 46!SV_yT/m(pt|L ?Ld`w" &|'|Ɋ{Y#Q+trItvZ GڻEK0+F$v5@?Vc3k4ͼo|:m]܄Տ>fk#GLFJő,f<}avjNEoJ^ 7ޤ K7Vq[KT!J BGq7ew}k͠wxO }sTxN=Äa 3 $+ :[=rgxBշap|{fF?)͇4M*UʷЯuǙ1;&3VdS։F(JKU\nFW5$aC!Kdf̂@X$fڸbqE0JJRA(*xA3PU3 ;TeQ X)a2[QTN;p  ZׄlgDѸ}&ݧUQHe[}]DMrw&q'iэ $SZZk^TX޹~3[Dp1Der43<b==aث'XF5\tE6\09<>or/HLg.Phex=6Ct09< L]a#ɧXfmsl; ש5An\y_tT-2;@7^C-9;{An^ORkV۽( FV/_l'L Ѫ8'XqutəqcM߿o9]o]AwD%oΝ'߼ϱcOi82W_b (<4կ<, s&L+ńc<{iعb(/\:d[gbn>bmkt@UL Ͻ*VÓOԉ3s &sD#9z'7Fpr³zܗpg~'~DFOs籸9tIFEf/0զK>,V/@y9HА:*QJT^&&L1Sbr+vvvUDLRTQ Ak+lmR/7=.lv&Rn!bYDV&O iJath*JɡP8;[l,RȧQEbC=[%JzHQ+[q: O?z7bb%UpSfDŠPi K.>: N -WX@wH+ķ揨r;č0hBKi?IFod%&vjfWȏoc>yNDr":lY AR(fjZƧ"^}Z/ډt2|Ͼ2#̙+++m>ן9B˯Bb1OY'945G>N9D7OP-x!{$o5BCԱC&2G#984嚊'WxM;uGhZCO敟0gL!_ծJDGFyp{]<K/Ql|g>~ ~%-P:½0ۜ4^Cܼ}L.<">fanz@ lq-f3݁%8Bu"Чl23uF*&骘>ʕ=C7NY#l`K:jnw0K*]}6e0-.&MB0:u A$ ˡc`s:%*X0a|]$@..D<.=@TahhT&Vݎ%acuݍ^oPMD,PƄŁ@V.N`iXF22c{Tk 6nj9 3s@V*l667evHH,QXߥn~|n!,9m%_< KOK|_wYC:ٍ<6CSSot%͊e}!qx:OZGb2p3~R5I ] O{cnE-Պ8}-\r>#2k<%K|'ttl>r-ٙdlv FUdz)n7쀡Roԟ3"ݮBբT+ zI\"D 6@LAG>m`È&uFǰ8m6 pvlgjbC!>!A `/vH$L"`l1z.7 (lmOȹ 1m\^ UQ`tkeDyp{t,Bb%SmC~6~/16;ʃ7L ň?gQN,~wtO3gsb.HQ hJ.ږ,*U,$IE#ywpiv'9租)+g >`ldZfbjt{o}ɠŗ_eca !k>p~{SNYJ-LqƏ29u[Oo[35ÉCc|}6lnяj3>͇~zY.d~he=LG$GT&g+:ߧw`NԩC}r.yFM#N:C5aĨXblrl%U^is0!6(d uG8H&KđUUgvcqH)Vʜ;9Pkb/_:6| &qཏt`'6V\6Gl?F.ҕ|Y,?`m:OcCY\Z΍npdBSN~I,5k_|~g?:l~N;~{wquS\=wSEVg=]#W~+pOpxbL.8}8żㇱyŪޮ"+-:l.h).X/n#/\>D)Vq 2m}y07K, teWw/KY EAȱk*'nYZhvѬY_8oѬs}ߤekhQI eZE2)RJoI3!dX&Y<`{chϟ>Z.VH!dzA}bitXGlooQאdD.E mg;{|go^x1cG+zS*Ph)TL#vZ2J.T BB=[` e3[{4[m:Z=T0h6VjR&>YQ+Z&-6}Ǐ^REXuz:@j60**f EfѡUT-TfӔVs.ɫ<G_uG j˿şGFK oo| ~RV" N??ܐ򻩔l0~((X{0ƑCCGj/O^^~Jor[{k\vQ)`k`}g$j08m&l;׮D1P'BlQl6Yf;d2I:j$I1Z;{(t&MTtd2fI6bzʱ#66d:M2`wY1 DCEgkwCK33"OVk`4Ye $CD}|36Vg)٬dyjOiqu>JXكS$`v8iJ_ Xp!j01X36ı(;E}Cz1MA2F˗ot"O6W;vzng.7H$(nf%kT*LDO7^GP`g{ʵ<^˷~| |to`OǷ;>G\;u զ/dEm x0)RYDN֠Z4x}{OC|t/0[D- M ̥k jLP¢ R8P$ٽ]Sc6׾`%5D#1bT%L;ʡ^qҪ7(沈2b@|wXUI4Ht gNuFDg06'g5Z^cx IDAṰQbe#ô 6B.QchZUHwXnT8\È)"t c3.S.;op 0hǰ:ܸ|p@Q#k u4z;MQK[VK7Hȝ ڌ#Y$l (&ZnF& ֑/T1z FEl 46.Hz{ SC%90[4&lVCS( i5$4tuQIr-auhjXZ hV4 tt2y:^6GoaqmG?0m#x/61 N_z0B#K'&VFAvSH'r@-ԋ%>vzwr[3Zp,V ChW?^f󠺶Ƕ =QiqqmJʉӗЪ>F"U|Kܹu[gf0ۻb1/wWM1rl OEIU\8}K|/ROHS={\"$rʡQ}#=Äzu.Vı3<}>G 8&xBpbǤD9yXcvmM4VSkBn8g/}:&i 9 +iއxGÌG%bug`X)#rmkY_/_fdsG"ߡw; z:?|zk0˹"V7蓷Yآ{LnCtmΝ:F%Q&dqѪQ=-E[ΝOȕ<1zl~ktCb?cd4Ev IFڌ{MBPF6Y|7 Adcs_z UcqiQݪH&Z]@w0X;Ԛ22w?jȒH^-6ȤpX<둽RŌIcĮ0K"~#k14xm6Gyr]r |fA|{DFcd\GwKޣʼn?ϡ =Kػ(*L~YAo0#TTEFՂn#hx&FRc\VZR#K&^[-d*ͦ@FQVI֠Hmj88](&J]5Pu$6 W*co^M)'VepA Ifie!AnF1bAnDk/N5Q6鰵Zxf UL2M{3IXKR)fPku]8Fjbջ ēiQr..} 4s*,YI,h~ g DP*Ut(V=YFCV2Mvwp:JnG/n =I? u[ ]"|L%I8cbn.0@,v8")N^|׃k3:b K|npa$yUFbZ2 υЖ8s!'oXP6;3dT#,C6Efk R?M*y"/RVu ,,γHs.p?%7~Y^Z P``dm^m v10pޓGHm* "߶㫬(4 XMln͑+*:d"])5lF:uU%6GYuPnU1;|D=km$QBHiXi*"r Nk [wq5LCZT*DV$,f^WEF$X(Qez}J6goɉlh5ɱ'Y^!_I31=νtз% 7pze9ctI6^>jM7E=O_s9\Xq?;>CoϰNVd8:ģ;zy%pn*|xs_`X~H:E|{F`|4fNC5x|m>C"n_SNy8M_9N *z|/++I{"_Dg;ߺA_0.GN;ѩ3ԨxC>P{o|e󳱵fBn^w7 W^d/Cyn}|I6afkL6w ڼ\iFT\6h'Z uIm=Ua$_NsgmL-11=+/Y1kcyi[CJ2 cě5N_dֲKldͽ=zPF:zyG:9|]vv xu.J[P&JBEѤ@a/aﱻY`gU&VM{I2?5VSEgu`kQ*u4f" $s{8Bv}|RékQUMLEj2Z,Rlʫ_#R5QmJ-r*ѠEƩѢDTՂIPgI I|.( yCh Q-"WH0+ϓ^\F+A+b6$W x%Y18}U13qvkH&^Dh cբkp@[V0r5|>?##*d019UU u٬Q(1-r$[2\fS@j%rZNGd駷iDj:ZMp$Z4v|.Nmc2Ѭ7^TYAUX v6W7{lom#K&> rc|8ylǷnS(koΟeo&6Lbee>F-'swb[V:: h=u a cy<>|bhTJ5,]ãXM?[݋$oȥ(K45fgɏ>a(q v.F}-?88'Z^v9y˜z_8Cts,'O'+Fj&H$ӧvt{=dIΰ[,[;ܺ5[.Ƈ<zCA\V'ϟ?!dA~/l30##Q٤'Dx9n-2|<t\<gn"LDRGh\8q[ܽݍFdxhI=G#edu8JB4؇hӑdYԚ rMX#7' o 2EvUH[3Wѵ!#uBjۄk 5`b'م @K͗IUb#7/ʜ"K7^e?JCb_"k_H^<:ӏc8Dcж4jhd#bhuZ5FZbj}tMAn# U&|SDe rUg);h&rG@Cf[ W.R.YTUjŌED)Kqo %D %i\=~v#gW^zl#G5On4cyW+Tר UJ2 *et7 .pf+ؽVVC(ZN Nۇa `wr22̻RnVk}|~ΛEP%0{zc~Rkњdu:Ѱb36L84&V37_'%dI>J P5J5]bqc EaehMH[p ,Sʈr*/_{Bb*-j+d+$78 К8`f2#clcyC^V>ydq7wٜ GSGiLx~bbMAT:-F])C5bLWWM0ԅ'%췳ڢc)S{)9jVȥD ||7~BτΤ%lbu:vu tzgs71(e&G'4EEAA[BѨt.X Ƭ8{8be !ɝde,.^WXXe Z=h?.^aq3K3 a^/~W#g*CL%~28} k_?&wJŲB7TiZH  ÀH(NrTG֐-dM3 Hu +ƀKDРӔgV4bf!McowzLcPzOѭ7*1{;ȝ f`f?@LTTzQVWLJXPWr)G*R*r2jFceKK bYd \unnro|NGAFGG8F,ҏNkfu7ZpyC qj}C,bZ*&Xj`;htf=L=/}=8.RlNf!tCStGdREpEn'gg9L:p \F?Iio\&Ơ9X`fHe31СZCgmRf!;Dw4v(qkheBG& Z=ZԢcŤcqo_%x~K$ؘdŧ[m~2,1, 萫yc<({EAߠ?Nc"ZyTm Ir,RX,{@ gsç<~W7 $I.]:MY%FV9~vD}s_0H0O`tr5/ZWozd|NEwWDE!%s%|4 #42{ T珱Zk{zFfFiy2eV2Yv 8`}A6vɬ, 1.?~ T  {q"QMQAL&V`dxͻ P@.=0[ YR {:2lVr,0MTElv ^ul+y9OUzb}92 gs:E8RlmP,Mqu&$r[hpaR4jR{hΟ~O\l#vN?M-`l_AIVw8}2r^y.ϼ'^= b9šc+Ytg+^aks=_eħX޽| IDAT gpB?F}^VLwO9Шez| vOCdZ^kQQs"ABㇸ$ @isuv+Nds{-v;/\Z|>D6 |H8K$fK/][: c\k8J> $ ~ /^>G42hXvNq[BƊID@S0(2E:6US(7Ui!539]Q؍ntãG3JBK$QUrb_j3lVKd2"m|>/F%ϑe} F.^ĶAZ=)䋴D ь 4J$u-Z Aۙ% Q}2n6Pd ecmt:-Ao$ #X{0;P'y1y6LOx~468fi 2g\+a~abv{!D+Zm?z3c9\p5} _7z|p3aXLV\nJFW_x/*Ibb:I)̋|w/}716 Ef~9{;t6t0tF@e+\G)tC\9Ofi+0Ld0N-gG&6u8wqX8|Cn?K_)w(?x? 6!cί)$ X|F{ĥk'~( %8|=n඙oNQr,!PdR/ݸJnk/\o3cS<{/stnCoC:Etu{^N @RD%˒m93q2g2=gwgnvw3N8vlKeYbH H {_~xy~N):,넂hb9E%WE*Qՙ eRf.zk|:!HKg_au=v5jo/bTQg >Ym?ZaC(Wʕ ӑY8},eAH6N+ϝY!2qX<|r݌a(ahL%F\MK!)ps4z8%ޅ4ZأgEģ8uE\V\E2 &c$;m*zUTF%j1Wy\m&MЊ ϭasy~lm221$wnbJfE1ĩSsa/~Cs J`:K@)1!/cw"hUcZ5")B Q%>C%hlB*E0!oBV̰cşG^D""'0|O"aFwqSx_a78{|2/ .>Su vҚQu0]TEJ )riM Rx]8NZTJT@H B\ޢV0wwQhU AZiLPj"@D<$KtBE#2Z52~?NRG"tټtѨ4PԼ L.Ϝ\.ⴛPdX&9v$RK&SD%Wi4D~sDKw8Kӗl2`ɣw>G.b*Xn93Gr XQU)dZ?o?`~>[Ki,vxR"Gَl]1<}rp^zɑ JU;9s>8^F]\[- Xw W^X6r5*[ttC~]TFfHZb&7Ll#p$Fwf/b5KWu uڛ'[?_"wxr! WY}Hq!D;0VY˘FfPw8DkҲ5): % C4U -C]H5;;R~6ZNW~+C|Ai܅ ܺ}fFV8^6WHcry4Rf"O}BF&)R{Tc;,lJBc}}LD(%ΠQɬ#Ir*FAX#txNЏXXa =j*8y4r9KըI %NE%g nE3Hfsx2EBOY>ұ#hvZb'R8z Mb|C{ou)Ì]!#i7sCJ .F,^a Dn|HxF&Ź,hŃZPG*azy<``ey ^Kx|:NпRԢƑ1 V70z3+;!:4- eGEd#˯_3r Z SLR\FZ g^CZ l2Y&NҪ44Ь $ 7I' [4`s8w*|`xL:ިFIeek [ՕOF¨m0ۑ&NMܗdwXMޞ}X&J b-/ܵL u_ ]]n0쬭y/!3|yG#0e(~+TJ!l TuόPJs6Γ5~\C#Wao1ڭĬPQN2$J 6 LߏT'wO)hurm^}*7v.f+7O3ARrV I.La& B$2{؝NFex|(d b [7}7/NH8/hT:ZmIC\C>Z|*T,hbsM-|3ڂ,?q O7}Hv99>A.x:GXDuJ(#ZG(zJ'U+mfs{UOjm%,>$~NE$ǥPj(ʚt E>6Jos\QbjlЍ^ivo 0[5$Ap|mwJ$*R!#de_12U sJP) ۘQ7RHJ! e2_!aLf%u2 K;hJ|5f̣P멨 [{ FSPƐkûU_!P{Lbuj.O"r:Y"Ń +TIN xiJQwR{!-JВPDhMZG~on%.͡uxc疩&]zzFH$X,v;v|>8˵%O$F{?Π7کWdtOiHJ>G$,:KG(_:RI^\,a2 .cKNrRhjz{E<@!Ir8vPJVKt-|n?zB*&=j3S70LD!r\TΒHiwtzb,nOA,i@-㱙(fbt{:}ԫ2Blx*aZʻVwVX\fR h$=wq+K 8vr"vW7 рGC>4r%1ԋTl2_ur&ȨܽO;BY{H'=u Mp+LRtGl̯,= K O1ۙ>9_}?Go@(0r_wyS'N&RV) ww,e t=aI7X^0"RzKY mk!.kPֹ{!tn4FN UO^o=.#X06XG!r'm3;%J hB% I~A|xgN=/9t|B 7ofxpgqzA,f;LOIahi,N'7ɦ$q5^àRFjP-fR,+=`ewѩQbH%S"h hE2.:d2x6;GS[x64uVhת_{tdeQc͒PY[rCGy7QUln#V3v`R !B]>3vr!K篡t P-•xր@Ԣ-n=8lFXA4#M"r/"Rr+o~<@Xi h5yDQ\Ahq5Mtj# D=?.L VĪhAr"Mj@EU`a~VR"Ʊ3<[5N:vy)ox %-Sʴ!õ!k[y9kc n7}E&.a=79X($o>W^==t#L){?B9уS.DZi;;yr U2ʅ$Xxvm)* #K(N:?@&Q(H$H%64jUr .bF_eokl6A!q9HĒl K5j T* ICv.]Q.cg+܃j`1iZ-v ю&*r./s* h}HeRGy)R1D^O$5ҍrq +'+@a Yull,pX䓇=.F8buXZ\e4>ΝE9ZN\b :2\h ^F(`7A"&Lb֪hsަt˧[Nlҩx:dQ63}%.w?BĨ&XS_;YU|yjDRd`j| K#+( Ge%R86fWp~ӹGHR$ og<:Oѩ l}di`?aX\\cme Rgh5 35tRĮ3s9j "h6E\ZŠCr7ݛ78z ClnooQ)MIW,lБw# -Ã$Q?2 3 ce-jĦ"brd2Iaeo`<ѣ%t 2q ҀXB"nq_.hDZRnZSZlz\o![+' PKJF\xH2hۋffk \-rM)F>s#cǤA#;lG:3w҆ &U LIcdqz&"ILʹ]v+~' X9>}x/`lҡp39 6;ش.Dd&>YE*ғ+1u7^Bc2xa|"1.D"}HfA??$/R$rJ(lަeΝM8VF(7?:J c_W~;^'ZKcӑQ<ƫ_"3㜾vg/0h"}TOK &5A.vY0YAV IDAT z$8K+9h ) d:xB$ce>"/k]:Yyҫ$9 gIȓVg?&Hx_'biH*b v̡ô"i64:8icDַa7v'k06X#,_#45=$Bj|G]RK1_7ڧ'WjT0$ o<ܧ\*q;X9d2 j M@T JИD![ۜ:~͵m:MKXakw.>b,|BH!#M:D&`0hԫBfdo׏QH8h\β8`dpRɋ/t1^=^2)|7AU>Ïx ~FJG8}Jb)&[1$b%b QaMankJbӇD*-?Sc<t8^e|dm]Ņ/`nhKE 1Y&Z Dl.rv&3T/\ForiDm!RE%{ "8Z/fcqnP` RN")UwULJ83!8h{]t%F/u;guVZ#F/p;ƞ;GH..>DШhjҩ4Rz@-.>>W*d)4jyԊ&ez{zљt,<[`0pZfl6G< HjЩ6uy{J\jՍ!{~F?%hGXZYKMRa^ hz:F+«Ei E鲘wGXZ)kup .jR< ^tV**hgzk^dyo{CLjt(|dRD6L)E$2:IӡSaS#h |(DZ 1jz9Zǩ(gB1#f|cj-j#Ҷ ?^/zkK~>ߣL2‰IH8\pqF;ǒ7'1vuqO`?3@*P#jJ13rӪ0hMDC!*aG̮F_*BFZE)W"Kh4 J^ZC :#++4-1TL6D*"=t x_XLjh$@F*PP)UmzJNC(hq;2jJrA`g EX!I"j1,Klf3bd2N\cib \ZE" ebtG"d:ZD!H%!*1=~egի`3[,^lۅe/r ~MLv32zdr 1)xGPi9;[[4*e&Gw[<Pks&mdJ4jCb/eá?ˬ'>~ TNȮ?R)XB5u&NiC, FJRWQ\yv؏%g4 s4 P4#0yd&ʏ~Cv6Aԡ#s}J,+Tk%R6 \NZndBՏ'JO bF*}ȑ|=ܙ_@ ,VKH›X4M,f?"괱8x0D21۵SjM(`aQrBh2ʥdQj$#ܽy3'OQ+yk I925M&æ~[@}{A~" z>.< ydZB^w*~ ^bdwf 0v<Ž,lAN# ͆12kF{t^|Rlb/32^ ~ܸ+x HC屣Z:)/uA&܁lHbA63ٝeoKEj?˟rn~'05?u\c|[g˰Nr IK =&>KL2?w. oǹ]&=*L,Fh݋A7ޢ,0)#lnaq:9~o.f'pΌT@WέEb nnG*`Y7gfv`q6ЊE|ᇈs5>^ =YL.jEL TՔce'uXPlSK4 dCqf=6Q#%鏡ithfΞb+Ff2R(05Z>^jv#ך)T*rqڍ"VT"ƬS EXFZuhmDb.^owp(nrrb(ȋ5J!&ۜ$"6KA4ZG\"0?22[(m?^xWok 1a 4?XC?7c!p Q9KQQOr7Yf>N7_|p.+9.7q{@YWj{9;A2jJ9_E)24v|4|46FzqZheJ 3y;4M:Б ?DCW֖[FgH_2nw٬-.b8*NC:X Hi Ph4FFFcIm;4u<..;RǏ7I8z#Rf |Z3O4jգPHJC 2FpO0觜kF,A뢿oŻ4y:>B YC @>_A,R!Ep0fx YqzP( LkDH%Fۑ018FXV0<ڇѤɳБbP]8!D 9CS@l{w7Ip׏6 ل0F07hTȅar|z hފC\F֥gk6Bi,-.E0u؝NWV8t82N7jp${O^4qh~ ߸LhkK`TfN7.=M&O`.Ka=G/ 0 IDATj@mq%>@XP5/_?b*saf d8̝;؉y3,fsMEa<0D.y0zKjRMD"%}v BZ)ŽQ}t=Wo!f_G) =6wX8To'ǦhmfIMaoOGԐGc|)|dVeGHEh Xhp9(׫5J;C\B),T(%2 l8-PW\݋]S&\J%I(BJkxk9NA/|5Z(EDB"n8Z*9jLͩK/z@hu\k5{u{-*R4'zG0xsTM? /4;ie9ÕGv-'$ٟӟE*@jyzru=ME||^ f#GҔșC.Urs|xLL{bZ4CySD @91`qcuxxlNfǧ:$Z5%m)?w?•c<ۋel#Nf1UR^G;ҳyQ [ztT*5|rwVSl}1juC@P*C-VL@# 947KQP̒HDj-6{IƓȤ:0jݨ%f,^.K$i4 JZm(jjCC6Mׅ䠘1;ΑCֳ(bJ #S&+kP*;mlm"۝TYB"mDJ9H>_GЦѐc0iPE5&ϑV0w;I$l,2wr?\7?[!0;dwx3:s?/XdnF'UeJ͘}Gോ'Avo#7OC)SXX[ `s*h %e,rzW .Ėװ"wM>o$",p1u}dy9:um(! F1̘v ޾ N Z6BR"UHxɳ{L& +?"lh0D)$ZO# PDNPLȻ8&GhJTESs+Ă &_(h H[MZ(Bhj#]ZC Vl|Hm| F+˔I"%Vō5 k"#2IBvJc>Nlk!?C)5!YZ718۸n돐J@ޑ/c!md7bu >}rΡrVs;6j>_vww7i˄191Eޢi1? &FfE^珝ӋT.~_јtx}-7lE:6ǃʠ#JI8q(CLQnUpNӖ+Ew:HZB * n?_'H8wVB . VoHs⃷ [NZRrE4f,O!C,S g2V|&<n_w#%iRem>JWo?T.#ihD<"XDtˋY ;FvKAfѮ0KSi?!JUpح8F{&_'ݢ]171J$#u _ cԩ[,|r| D )2\JqT)*"L XJ. <~a["BJ3TPLRK֪eT:V+zѩYJ&NSGF$|G%ZMF$נgzT.M8πHIC,>ʅ<:xԏ5EhaћdHđs>¢2\ƒ]LF=>=3^mp,{4ݖ!:2 KGYYBYHQ|op+̎ sg m(2q"C] !Jx)Z <6ɭ]tJ9.RZĖvphJ5+; Deg3vxyw?J3Ue=%H~]'ǣEc뱢BgB>ᩩC\ݾ\,YZ[KYDQ&+^Nؗ*2FO(lRTdrxh45R&N:Jb@X׋J)l H-* ED*޽" tZjRH$DW!");{IZP)r$ <]BtOP5c[!Bz{{ (URM)33ahhx,&/%n߾N"MqRB133s\*`H"|>GffM92C.gGt &yIŒ|c"))j+ލ}.gq'G1  HbRCޠ%-otxX=|'B^kd] q-OM:Wޡ*7_fa1XÇ#*vȗbSI([,'tt3??Pr rEikI}zmu345EX"`R4"wr/gecR(B3)*Ο-h|G7q ,-ܣ3Bg!CQk,&'/]*ѡsk bu7P5uM9{CSYF-he|(M4t[L\| 4bRA\B$|{*NR0Ltut:Lf$ X@\F `HEL^Ԛ/Fl!KQTULFb4bdɤBבϕ00<<VF'gtdzBՋbMd>/J`||` T&' ШUj>B.Wvf\6N]"ey&]zr05זȕKҫErf*a| [ cۻÍ77IellmJ9죳k)˔*G{lY"m@&7v:LJD$Ь—_ŋOގaTٰK dcq?q_6=?Fr0S09;KRaV;v(TJL?=Opb~+`tWQ˦w877>"=ևP-fp|A!R0P*eUR6זZ{F?qmbL ?}Cz]]?Cvܪ^OMatՌpёÑ3xYZM^Jdlm _?g 7//=ŗfO~3:(}jFqxQZ/ ?l8Y5;=Z"t Àы%QX\"6{qrX:K \].C"lJT_} HU¨3#j)5JO]bt`KQYXikh/rCJ1Mx-A3':-~}^6V,=X/n|NAf!%`yBA$!E(ODL|FRVi6[rBpLN2' H& 9Lf6L4LhHtjRFU$ 'HH0H25n^QYP+ 9XBTqasvK&n۟3sXM֖VY[Q8d{]6O>s OAhrM^z[Lz>}b?2l=&Y]՗` ꣧ۂ׷e{(d*yT;Ε}<|dÐ{[J5KYm =4O,??xgO/V9}<CW\"BRRԈY5#,*g{KݳlzvQ5t096O!_S#I\[6TeUzz% iUtFzX<=LQ5H=ZsK<= ]C(D!\: ca.D*V G2bң6q;<lT%SC<ڤhlHd24["9\J@/VP:EXe@Ҫ21;MHRtPCOb;~:'(T}1zIV$jU,޽K5Y)!BmwB*I?J" &O~6⚀TCiEln<&[/ DBgT;HR#PkȨ[MI}Vz @czLF`s`FBTÎ^=Nj_{_9Ơ?.bB$̄>B#T2EHx334_\\8Mxo}v,rE)f|eF<ܸso}P1?H~L)&<\I1ǧPĚYj%3obBwl6gt:ߍ'h4*J;VR9Yf;2/C'!:q\hשpd Z'tV]nD"1ft"T$UkДIƢ2S-4hs' vM{> <|6N:Ѫ!kQ)DHB܎>&BfCD1I2gQ:{GsۦTNΥI<^ߠP*1>1I*C6!VYȦ}{nSsntbaggPUyJ`58cZ fYtjB4r% i>Kp֡)tb?|2kJNɨs;w[ZIoOա|_>CeAm)!gϟqn7u/I7:䰍?BFg.2~ M);8peECB)[))b6;HDEb: eGHڢMxȧC^22)#ǎZvDr1D¿vV*@. hQ KD5j]]cE e!TfYݭ ιIhR|A:[[5P*%fF?^1{YX8xW=D4)E&4 4r?e ZPCF!qCۅAQ6+]J;|dnTEf.4vFKUB%0M<ä11=Z%\ ̓qEEԪ@ސs_!jQOHE)gRSkgYd&;RZJV+S2 F nQX2~̉'R\$=@fpmم@!P.x6 Z=Y>{My7x:,tO(8Ra.f}w=R Riy .S0:=s֮ny|ef/93￁@f~wh_T}H`Л H\nW7>?lD&E!_QnR,gس> IDATǽ ެ&Vhj )lv *bD&d2bu"tiuT5zAFR108J.kRP@\t24jDɽ>VHT&&U͑9<:=c3x o.0qRf)tDbrJj/,٦FJA=:$ǎjlL%`;^!إ M4&-\Ig7^{zd/ޡgzX6owQH*Ϯ򇧿ioj/xC#PܜObtqd~#6(]]fvbOVXz'ths@huJtHfKPP*ٜ$9TVdE*Q44 r ZB ZET\#H$]mvXp*lMv^zzIC""rJ@B hs NbT2i"x\9֬#>A? wri&m$T~yv!5u$iǏ=D!)tu&jB~$>.ǏmPN )B2 u"m=;2*)\Zk79qI8aR{X6ւ]tj}&Gǐ( FOQn?`j|p"ҡ"OQHt b Lz36֑Hd#A\C4 ZE~SAΰӂܤZI;~Tdou̩ e*<-$JSx8\Fv7m&'ƽ8,ݬmlgCĒaZSxMv}$`Bf;OH+|pFTNMT! 7KIא4}DG̴.r9vVÑYA2k[2C=dI 1|\> cgwR7@.pi ( 㵯+?FqĔ%F|+hy4*Loџ_IQ܈,< Pf &y lJe\T"vPʔk*(nKD1Y܄RcB~F9 HU3l Dw٧/d6K Aici ɣsPο~MU#iuQc,,S+%qe+L' ۏ+0qYP&O\1J z HL8q|T(3C|hD ^8ξ?DL%*QdY7({XkWPj5)ES|S4RJ.^җyT*Gqna6/`T鰙lE[;LMͱȣ9Ha=:ˣM\0%{3 5O[ F\g?=~xO᧷>B7>4:mvH,Ef1=}:DJI׻C^B8])HE™ Q b ZZL66sm^^+8<E>|.Ri`?;?}..oa,7X6REƻ?KY)KgKHEXm 2UIãDŽU<}V?zrp7~󻨕fbcmeWy jƱc2*>dp`kC(^Bu6lapqtbwM)ϥ3tk5* l:#rZ0v L2jTPpGNxZ9bRHӝM'!,F U>{^C*yLEp}OA!YS28Cohh,\ƃ{qyjw6u 8>EJ[D71lulfc^r##:;+O(oWzZ%HN/Kєdk%.FJFZQl+t L1 {{L 1:OQ()<>/I:AZE3C%x6r4k|Nذ۔'H!yw2hR!]+D cc =*zYTorUcQ7UK$-: 9.s}n##HժUtrjZ懏9xO[1.` N1S$Q.g)NN5 8\ohA)py{GpNqo{&yFJjDJF&Cn,L"Thfjgš x wt-R+݅B^ΑUhK 5$d]d&A֥RTxkf4j2nd\."z gxxh$J%T*`h@W k_ SjIbrr/DݡP*r#"(J'\y tu* u( ѩzE":ҌJ4Q7qgfOQ;\uDD1+0d%vwi5똌 KmrS*RgxxeZGW(3ZH$tfp™ =ڙ\v>= g!0qshSlZD=ZfuO$JUT-Wo# # *~UP?'}֡Y+~@2 qfv=mƂF!LiF,?|B*Pװح(M(R*y|C*r\ U"I=F4}6,29\D9U`w~WGGGQL$AjQEVF203~g$+djUvd3 G5J4;Jr IYG/b)*\Ix])OO!UjUeZTTc޻qn=PoI"֐@+~BB=4LFR Fb %RSQ:] 6 kȺ=Sʡŵ}z.2=d'Ѩc`#&Hw?k(I$K8.r::R)TP5vZX p%tFa5vv)5Ѥr 7GyWicl&+w蝙Cf(He^<셋TD1޺xޗǸwpr~B✳_:5USb&׬`Q:ey4W`i^@៽*OhF~4?0A}&Dbq2J_`2P(TK h. *=ZJ+(W1蛦Zi099 ŅNkfj Iހ(* vjQi?2$hl:N<!ϡkiuJEڝjy ZZVEC tBH$@Oc69:5R -b$=AE0b&Ib1d~~5+A: QP020V^OFS@ev nU8:ڦӭm7~:>Ś mT=zb`x[_I0C!ouYC.WВy"n@I$Ԑ>?y=b6G Yl8.BIJ2wwH D9>Ź9j6gp9 %Bbn!PXY~B:0STa.SbhdQ;9&#vhw8^#r|DFֱjV1VF,Qnc6Ȅ4rl9&.\Ӄ=:- b%&\~WIڧJ2*^[mTdB+WZd7ygr{gX v64<$8n?œzWB@2dH(եKȺZ8 9s˼zc>=c|xsgx׸:9G`y ߼ѹYC&\,ݞGnS 7rgc^W'IkֱBЊZF}:qR*V0=(J+ad5G*bqaa34]ʕ.*#/|g.elaQ9L.Pu ',5;IEenOx ^Aեp]:p: f @&uܦZQ)IF\d\`jBϊIvA"Q>ާIc2y:Q  PNƱ{6B-O믡|[o}[?@6y5J9%P f 9ZɋTe[[h|Y萟7P{ m4(arrM"H좱xo?ǭo9ThdJ$ݍ-r=Y93/WY&M/|Õ^g>b~b#xʈɨQ$@g؏O|5B[N&QXDZ U,z9̇)kz,l(vBdW<\bpY'p1|:Jh}AW7ߠww1*uBQ<Hɥ7Pkd֎fS*=7&F8y#4ylͯccc ̟?+?~rj@& N/ju17e272 ٌZ(j[,JILn WP(䰘ԛe8r ˃f|bx"B!_DRo4x45:6b$WS1e SDiZn W_" " S,vt}NVVQk䀌ZK/AO?F֡U[}ȕrb; ȨVԪ5@fd,:m? ӳVzAަ*p.a\$Q*魸#\2FIed KW^[ ƞ3<:Aj1k9<_,vPt4 #F=*Qw= V@r5n]ƧֳWO N355h}ˇMg0dxMa?|ēeVWm$N:_$Te".\ͭ=dɧѯWcB.X@i٬"z8缄Or")>@N埮 (=*$[ŋYtZ)/c 燆>2 >bM(!pz&:['  X"[l,ߡJ06 "Ȕ+e?G%e:Ez_pu H!xzl73/)TB[=L1JZ )z &+p @ K G]i@Z6hVwa!pٳK?}z25JK/^BIE]L,ѳe$z8GFɛo_A0wI-G%Niz:Wi$x_p172h[MSs)x&7opKN1 r~xYUh"DԚ 1nr&G$ 1,&gX"rmOTDU+;ok=\-5F&tDd qN+m&FybnB9LR-UxdrSG̺|6C}6Tz-VG٠%M`oP*$kJ\tN41 lXY!aGQTJ >&.]GUwy>űafd?u "&B{̢G-2v־;6 ͜#Mj7~^o̪U*'M2JS) '^<&>rLZ+|z=M.nu!\fRŌޢGkRKn\ :|'Q.hy<Di2=# dVdzd%TJ*Jd=A,݇%zF&]gAnRQUHNQ)Ԛ I$5r*2`~/&1>6fwg_?#3RIN{[kt)R HEARGij:n',nd($m\JF$, ^J&D*^FZN4Y~^"uP /~3N"mkܹǠN: Mk+qMĎ[D\c3(lv:/|:TL<& ݄P+ez:RgQjRj4Q?rݤ^(1SVnUM_?y(D>]6T;=΍.ߙdK:̙z"nPO6Yhԛh2pKp5F*MI2(ڸ|E[9R< תbNWW"ЋQ4%kX}̰FϷ{o'˘%%LNv?.чbVGqG[]_Np1X@ouZ ).'zFKa~UÝ}tB>֏^t9͓'x,lڟ?ᑳ(UVd2wzmf'M U-Zd*%}V+VRa#HX.+4:AP*֑{r%: ZV }ZB.MfFDtڭdՌV'N!esϢRDB5j2CMF\W[H k!1 ad=clVpD,h尳E"FJ-*=ra!36:MXVj GP(J"T@!iVV#E\DED݄dAQQe9> rU*)\M,]$֫o1?5nbjacKd VAlfyXGQ-[~@e4k8eIBѳAev`R8??> ZN?i6;x1Ÿ}/iBJV`]ohblÃm"L.-x1> .NK[jSIph9 ˅em(Zt"/pV^cueJ+)Kp?z| 0N͍5:6P躴9 bdŝ'w7m :j-BAqMp402z |r*b+{>6;XɉiB$mE&}*bGOϖSL]sa3^""tGXzmgBA4Z jΟHlcN`"\YdckclY1FXYL.ʝ'dEץ7nkH׊td@NL\>{ !5#d*.& +J[8oܦ><嵗^z{^qa(Bǟf{!C>j@oFKE+,Ft3>ϒ{@$AapD6FPِGXMS gjWQs_3O&a)D\o30Pz/{=D[Owg|?33E|kINצqnZ}F\6EMQ&܈6 [3D[Im,m?{g74$J\hĠ7Po۔z6BFzED шQףMQ+I[JƧô;8!ZT@ JzC`dl A&|ᴠB.'p(45Jr)RĨ!9lEivr(MDy5.flz BG$7oaeeFFaltDRk4UjhTzvn|LD#p NPQv"uz8TJZt:lVlRMO}DHVdvIO] .8;G'}y1`ZGDkocv:X!r{L@S7_AP.Ѫ;i_lmrpMb'aN~RT8 j Ξ9Cqΰo`ހwۊjgZ ީ<^/=m_J^a/1ăG[4 E a 7*ROYk`%yqBA'G. uR,sb2F&&p:;wT<.ku,jTBPt0q ǣ>]?EPi,du}zfνgdϰ*T Pt(U -3|Pt MP{=::DAbt:wHdw!)U604Tb{~_b3a-.]'pxY^#EA4'R:^c{sh?.S=J=emfFD8jLvf@^cPZTG[b3yOinM'fҡZ q\Ls{_2F DV8M2$.!5Zo\$v3(,1;5 9]L^<]$QCdje$m :=6Uc &{L,!&jm2:ax_ YEo})j+P[Hz iXC2&p\r?\y[|Hٙa^9%Va+ˌ̱Kgov֗F>Qer|_e{e2\T:^3 ![ qȠd}V9D[/ hԴ 6 L? _O6vZѣTm6T!I,ht:ZbjCa0mzeLJ.=6^A:diڸ]}8\nf'햄Rr( PoPk*hRB#|n4FJVgl*Sg1Sp|drbQqS2a׉,a4\\N Wt&ɋ7n DHfK| nrR@8j#=R>16bH(xJ^Q8zMjF3FQ 9=@ɸscZ-fQ9 pPk t]6d+4.?F2{L> DVYFROӖ+yoOno!Prg'ؔJC0>1C#%cِ5ț [TZ-H\}J/]ġgfzRwLjI6MfV3Ʀ.q$~ ~a8jmlEcdB0NE.6(e\v"(͖RԳgw!858I$ @3_ Seظ,az&~&i ~IA N0+{dN#T6 : &5^eͦ1 "t #d,9 f!1L{%ƱY@=QB^ !R@ U͓7I@-QHplsb7'~B,G%1d#d}8ModN@S/"U eP?]#srP)eH*qz+ `PY˖72Rh>I(ƈA9BKۢP.wQO.5.ӱnnT6дD6=B~ ^ EKbR!b|{1.'H|v;Y:ss -U2R.b??((.oC::QGK_lW^$֭q*k҉IGRVE-aSYS>Pt(sY,?ڗ3.-l<ZiAls˸ 0y"K샄{U":Jy DZ0\%aJ'VIFК,l3n0y98J w޼Ydž"kf?&t:YX :BB$htgBJ6D"0]ҪkuuTJuLf+|!VBQm)VjJKP;4 y Q!G.Q*,]dan5>e'e5 gfr>_%/8?UHiv$܃j%̎3?5;u,1 p˻kխk]VKjIc{F1#1 $00 c˒,Ykڗ[wx/}=$dewK7Jm5PjuB##$EKsfoh661~,}˯bvOS:aTƷvu/] [W2FCsIfѕ)"~_>dd"Q,+,r㥫VṗxK ju:rew8;K"4,-?叿=dD3gHo񋧌$e|Sm^ؠ)%ǞJ2~{Kco\_6+{E2Ma<{My,8޻ٺϿ B h>Gy&DӏQ4Z%"Ncvz#Jb#ā@餡@K 4`b2 4TZ^O"b4aLΌeh)-,CX2`׋x% iB(dGU=:-hч ;ŋ RecEtujv[eKd8" cT5^E@, tmn޸Iףj aMɊ#:B[S8L\N)t=J4 P &]0ajM"4 @3ⴠ [>ʨƗy IDAT7wgJg .o`d:mR|:]6Vαq͛| D@t$ȋ'ϱlh_kjA0KVj64QR*N$h4mvhdjA`ay7 SSsd2)TB:{ARxGdj)YA< =@ 4t͆aGEdZr%.@brz|JDoX.j݉$ XVtt_hVΧw>|‹Ǜt;Jbbzq 1JFn0o;e"fWqZlqT]4H2E[KD$$S6 # O#׋mcK&0u%l󓊥eNbq9$+ X MgQm\VDaS/!UkdNh4cy.7 $>eQb9l^']!TՏwqKb9$;*({g6k,\HKv5 gG828PvaVNQǀ|I[g)v,'gH)GQj3nPl0EҨb d2fsQu4Bդ㾹DƤp-y{yS Lz _O4`if&01[<>CEï/]G+uH<{s5BL$_$ufEݯv TU?xUϣ}#W΋=IUv)> cs/l!wu4N%{;W^aFݼxV:h.3t z ˠ 999lsrJi|NN3';h {HF3iU*!ϧGmNIyPP&&jbaNE"1b}-=J0`tqR3@(2.p\($/;W!;1hWsX=4;m1?ϛē|˿6,S>ci )0l4ޠ`ԣ6$,PڃdRBj0KfUKi5ǕWQڈ,xCEnEXظ MCZu,L,0T)dZuGpB֦)}@dlb [\~r@/0q+\\]X&YJ#̾*nf"H1cQ\F;-[t1YSiUK[:VMpaJK ss%. V]&W.R qaiq)ZZ3z2\~erzVUBm<eֻowK:6BMֳ,L1?1ԙL$UNj.Z/_K;oRBbpsK`CL1 E$W{'LX:f2A[I< o_̧q6n㋧H*{ψ7O"F & ijJfG|H o~v#Sŷp#Cj1(9j/>FP˜>V h6 cmr7^1.a3xq'y\6LT$4=t FB'YMq9<,Dfbw Nj!EKr"_|Ƈ/k4L_ibvH8N,C|9C GxkOXlC]pML,D $>g  IPnnJ:~cvO>'˔5*esp/No~Ȗe!Vb(/Gn;i:82=V/]G&)ӵX=E87_~G̬NRIyun}_22?!Am@_VYX!Ph5hŗ) {LLNlnֹrcɳg(JZ&JtF(n A2ZMlyD",//j70Rmb19!fZ'#?H$2J?ph4 T*nݎd4; jGC2YmF]نd" "bF&7rU6;JYK.c>bjrC0Pȓ/h䳻_h5x<ѩ'S첅RDGU!&LѨ`0 8e kc|A!:>X^~fNF#%OVI F_9vVG"/wPz*#S,]D8I7HĻm'Uz-@@},G~믑A]=dp m>1+i [DC蔨n%P{aMP.UCfL7Y/(4pԷ#uTۯ9BW{HntHԤc`9v`JUI(em@(%t >;|r"k _Zfo7T=ϒQ.m2wW)"̓Lk/=!w /b[S5p-1ۘ'Gcac8|ũyds1в%޿K9 yw8|nm.."K:sFVWҧDWr||fѨ! .FǼJIl Y^^"mp<>pnGR%+D\tvTz?@.O`FF(hJ +x `z1% Z(";">ҦLTV-ѩ9hk=y *fh}khW8n"A^ߏllr`6 b6y8:,i*ď*4tKlm> qBlct{_ D'w>@ߢk(R$<"Cj66.qii/6` v_<ǽ0lТL],uȃx7ُ?\SJ4z6;tjӮ0QOfԌ]^Nn_r[EmRJ$I<_w%Ǎ-{jB^&f6Z^bvbG82*l>ڵkm'0YYA^D_Ę ~Ө"awE)}@ &h[M(|y~rR4'tD|F&>Ǹ!Weru>~F]h8sz_b;p;OΕ'9&RqsC%?T/a8yx;=>jb;\1=yU3\SrS1Md M{^HO)y q'-+&ф_ a?F1K"zASQ,_\lc5\Dwg ┩1 ww3Yv<ž0)QbK]>ۢq>݂l^BD< xڽV"S4TLc}EeƼD&َ8m<1arm"z|}uJ&3JON|F)Y*q fN%,`|" mfGO2 Ж#<#vhptB&;vNa#ƥM4DF L,^G*d"E:4M?F3NFIgtdR H%V;.znbh4 Ib4jK%.`DѦY,r|$|avj$FVj h>,f Nh` r|&cE좛dmXd ݾbV!.K_S,dI%ϨtH,saNn"=]hqp`@TI=T2ll!I^< ^[IXm" z)(yj!`H9xG.0iv'Fga8 :I퐪d)Ҙ\6޻ ^:LJryc]6Ə~|߳jl)(ax1##* lu3\`taDAZb`P=ݧUQl bGgm6ɥl9޺OgQhcwdgL]$ =S9ζ8F-dÐJ.O#v=n5ʹƫco',r5O٧ 'I>j ~mշ1έ#y}XO3rZءY~f@Y XLsT1:3iOb=~iiBcGLH.g2sT ymj2ƶU 5H(ˁ9,^?Vyi1CH.qx[*ӭiD}d'RC"#]V[:]eN;}RbޠÕ?ru^7)3ֿjn 9k]F%Sr]T@-a8FX{RԢlʸoq?pawӨH(JRD$2 Cz3C @z$^ IDAT>Hh Ap8FUdنpi*`c J1OdHX\&J2ơPU182 Gi v҆a$ Vj6rB.`%(Jiet|hXpޣ\O+ CF&@QJ -AU!$#bR9 BtD_1`sȴ:M>6l&H lg,a )0Sܼ}aP`X[{pnsK<޼O"{jMgh>2CF\;j]B]evjMς΅5>G/ri6\w;CZ]S|y$gx_fiz8 !bDQLd^<$}G/VYcUpD*Cbeuy۷oq[XQ~T%2w6@Svh ##|=}@" "F RE2 `'$ug$^bO89?kQJ)Gk ^ssbD$dIma16cnɹ%d 6 |A;ٓV[{h"`үNpMjY*OOUT«Ky 7.\EMl5F3tfo~0F7V,xW8ְeo{I]O"x Yv(`"X,bgbT 2f5vțW^^o٭JQ{_1 >J"-( Q6Ai(+h*Fɪ33\$"Nbkfer>iFH!#ڐ-oOO.f|.Ͽ n(%S*ai 4j2J͓# ^7GK O6ۜ''SOidتm߽$RXXaev ] 9L)h!:=ۓǿ̤2YZٯ~D{Fj~=e.UQՋ$-rfh΍`X _Np`fYR,$^R(}a&''vqhZnwdQm!g)nDQ2==C4:JQEިb4 Hԛ}.ZRc5KfCFUkpx"Q,;!tɁn #"LD0iU ([F[U8>٣TO앱`h6:8~ffa(rramPZz 5-N.DA`j T/ѹtU(g&(N dS)>${'M(ӧZU^Z^{HPZ4ϲ]f'Yl2LGЇ}\Q8;8Rdò>z+Ș¼k := ڌLM0wCPuvL~&m |J6D^]LawR av&CAׯ)V lsa%aʠ++Wj9ezﰿw̚G|2'HR:63SSrl## .BU3 #65[o}ځdnA!2%jϷYt&nb‡oMZ)0>n0mrbLUƂ,/: 784FB $#WטXrzh*0k 7NI"+<9w%.,cy`ˌ#}W7ڹ+VVMM!R7ZR q?W* H3^t{#O/[q2:u$SX$̲,0{~o }\.`(Y.=s0%\N7 ]lqhi4jd2Vl6EV*4n$ KGǨ+2d@mu4mSWP]@ 8N$:@;جf,cf|^Wmk"QiA7^RQ2ژ c|F4K  & 0혍V&;J3e֖a68~!e'? ֤! r`0Yh=\/t;BlVK{4 %.m\Ufb *jOumf֮bL12_1.tsGTq4AnaLO25H@؉B,Fئ30s;ߡ%hδ:VJ!MĨQ:i1e~A'+5~kCN3`6:b.G^a62ɨ˳N"sa=o  dϐx^%^LpzD*cz-޸ ϓգ/ȫ ^Z.S:f1-b}"aXwP5g¸ok47 هJ1L+uLdz>xQ;O¦;#-6 E^N@4SŽ>Av{COmLP`II5+4&)Fz e3ڕ g=%9;/+z޻F G` f8$GC2Z)< m(tPNb(VKcFk{˪o]xm‹s0sOtbSi2q0K,44bQh]t]ҋ<:k"$Ez`qƷ؊/.nX'2W:,o?G2=G?E x6'O$ | Z,g̩0r:_&{"nV([oA_.,[$ҵ3?k9w!CreV.vI?'$:_O|f-~{'=3鳺eWxSGF&q5P3yK˗6C_o1QkDE3"^`%zgx6l.4#r\tIly sEF^4s}'PQ5->r768{e7Ϙ[/Xs/op~.cM>q>1054%O86cM(xE1͜XS&x5F~\ˤ^:cЫ[+{('J!iB~)g-G< #L!2k:QYy+)z㱊$c )>:|!"5^]W >P j#D@"NBD<6ykaX]3hRiYͽMHeb N~(C$%p~ZNI>j7w?[7CDh7jrM$Kb%>y7:{[W")\iBDufLGPtS)1NBY a`J3@LGG(>Pg|^_EӧL.lG>ܭgǟp}9Je>=WYyQb(d|qݴQ]y*|cT#luq1|'2UD|"Xby:ZN#jgtc<mO afAHP& 00zD7A&eFG*`/6NLrqUD|̵)S.R)v!vAnč3r7`IWv8ϧ _yϼg'|"o&2PC3w68>b垆ymMЄk~jHsTF\&)[8H44~.ϩt菳>g<*Ĺ!^`M'hkȭlH!^:'W̱=A&Z3MXTʤzΎgT*SڈQ~;w"%Xr;_%[|}p`؄ ?1Cn {:/B6TTɀzXZ"P &/θujuK1g_?ˇGϿB/$"b<퐇W{/~K.Z4Ǐ)\ڿxQM"vF@un"'Vlq 쿏* ׯ3Ѿhtg$ea`0=?gԪ[=6p:vLL@E 'Dcx> ݰid9U 3"(-FlF6cc}~xBA$05L$K ~1F3Ƿ|_x GGmV)D2!a1-.aƥx=:Eқg& 1 >{CnUy)NWeD:3ש TGBKdK5X#67^"L9yۣzzY1xx΂dpp2Xa\יj% KgPׯtUn؃#&:zƠ˷9GG ZE\Y'YMyg]F2v%uP̭l_><qA$+{ /B q20#!qH Lɧw?g= pq\ݟ0M1$bCg~2#Gb¾(~x,Hpgw Qo9&TW  ;>VoH״J ϕ؏ CA4 ŎE"C1|$P@7Ca9͓yb6vyRH%T#6N7$RxcD/WNS;Dc7GeΏ﷘4K'vrH6H~\)S6 Y8爯_2NΌϏn;EuJDmcJ$F>>kϽ'#5&8#qC ˴]zƔd>K/DXDi&g Jj}c7iZ`8P\ZޣW(~G5󩆲@onlpͱ~$016h}ɋ|M>1K䣟k K'c&H!7H"׉߾csi/[%} ~ERDßY EhKApgfX\~AOFVbx ZupTD9s贇pf:a4:$C,KA1F$'ȒIku!H w `WHfst[=9Cu8DD&1s9&#BNiXETfeux4p>>Ѫ\o&0M z>M-C&)_KfEFT 0iZ(Bא t >y֗˸6_~uU3Οs?yB&]dueTn?ɿfdEڍ6!>c4ayc2K=Morprx1QU{fB(e=[bbئ]kQ>|JgOY4$)7JC F"!p=&>W6OQtGlv<ΠfbD:;') E07Q!B9%KQy4j#dxZH0Pq?bN1S^#?b<=`p+FI[&1f rYʱ$EGRq^ۜ|>JHG-NlFEzFa}1CN:}ZFϑ%^E=3qA4U?`oP6ytᗄ5 H ɫ2Y7i9F6yoJk>SA FY94!9ƴ6%e^K D gRQLYFnO((23z G(o6ׯ^W?%jcIJ8gC],%=D#ċ+o'DlMpc\i1 Di^8ͥ"4 J| +js)\(4,Ry"UtK!pS|a?L0(Ld)* 0q`o\f:A/,57~ccƋ{QV1W†G{v=a2feTGcko7M%3&^OK`3: 8ΟBTyᕻܾ,2W}*=,|˗?w_g~?Vn>AX^^XC&dhx(˄I Ш??A1H "Ltrlfh$eY 7#'S4$3֦L,'"?#F-D ED jd"624DmL%h :L 3 xMƘN_gxRkR+_ lvE"$΄GUшI`Ŗ\:R A>wN 1Orv} J #*%l&B\@an/8HoNh \\ 5Nxc2q'|OqAsá6v{HX]<;mCE*$0U0%K_f+:*^D"T (rA푲QiٴmbQFz)2S"Bg LfVPdSXg)& !3a?g6r%=gﲠ$ Hgu+7oiTtVՍ=B0.HeTm$vaw,||.9'"^ k{KQ|6+k4OS;˼wdeq,&`vوJ9آ/\!}?堪"(2Lئ_3pf.3!a"'3Inn3m&F4g2"BC3Yzn/PTp=T"!h:YXYf[ Dh8c$bQwF^%$QBQL RxxLS,L + (83 p|`8>}H""~9D8GF4΃g4$IpygnC_Ȯi]6ְJPR $ s!˚Dba?.&HD\h0͠Ghh< >h"Aaތɠѓdl(33,H 1,пh+ gaڏO)2 (e㌅al/[B{^<&Hؤ$_K,-Eh*eE|oی_Yb`ݼH:2H6?쑲\aCWn^'MGrQzg|6cz j!U8Ǵ1U@fp&K?C_S} ~^ g؇]Pmb}̧A?` Mf$B8_2iﭢ]5xmDyx8G3g8mTؼr 3CgBR <q 7Hlqhx:g6;2a֖99:߰3;\:Q?_o~)2F>E8ƞ5ĠX( "7 Fz3!l7#\Ͽ'M8+: l^徭rnb[$!.c/a0rqFQkB9sx9$ QyƷQ.c>?[&<oFt&e0_bO|+-f c)I*%z$dk5IJh뎄e{T^F*A ELdz8ƌH$ mbshȤrEbshngn#M$:ۜU7c2-f x92x0sym*\(F곪Kl-'S0@h4J8#dp˶p]@"Vuskdq5q]%Dhjh֩T$1@4<$H$*(H$t:]S?H2a8Du0 7T: ~vkY,/0XSP8m[`XaimZsIu, ,DM(9p>0A  X? D n,'_-|fEb"^G{NϕQA"% sLTm +a6+y Çӟiz:>wF.!2tmb$h˴]Ta2]"8#> IgI DbaJ뇴t}zLvek‹$7RA䄵mKw9V{/U@CDQƶDq3G,K@?5+H=2,ϥ15 {K{pyE5U>AOc9e9=G5!)0B&QU6I2JG(&-b zFL D},^ejB˰rƋ,]}R$N !ʵ {-))iLq]uw_R@F8cL:<`TI6Mv|H^3 H$v 󻸧gXf&77O<jm^"1~]Q1& C1' Ȭ,.x@מPc4՛\y;2|ޚ<F1QE?$>JV*Ҧe,<,i=V"JeB"%En-_1))2:iڜl_CǂU>bp m68@OO>U ".ȳ)ߞ_!"-yr+KXVΣuˤH^T 7|YTI `ub;Z$!WvvIGbcsm2*=zHFP&PHeH$R0LZ6S}J8RO<~iZ4mxr 肐(~9|*Ccϰh]i2D#\h4lf ID#!\AGdIz6 z{H*¶,8$cZF>P7 '%kD9T,a6~O.S$K|Ȣ 2W(J}2A%A&7ŚZU{~GfyZ3iEL4cOzJ8Ow/M_{׿b!B1;e٬o $L 3 \؆pYI#9N8ckgb>A`4@ziLd4\N pWvQ. >V]ϩ=C⌆+=E96E14MPmnC7H- 'hmj]%+f!va[BXSgeԁEXFb1'6`c m%&qmfј4N[nH/%Y,i&hun@EF,mShuCcjfjDcQ]\:N4jGE4j8swZc>KEmӭvp*k+_GgN13Fd$SL}yzJȧMOsTn-Q]GV/q}DEZg&i$OOY^Ze iAkwۄLD!#+|G({Z&Q~25ZLϞ"J/)f>{L镏Zc4hlZc.};X@^k4e>YrR@>~Vd&bb f&sJTMs|J3`׹8 ٴHvƤ@Cxf{Cy ՏQ˷W(ܓ |<`).Nɨ7xnmw?KK3×_tsGh#W??%~yG%b2Y2$3L! Ǐy{:>g|m ^IJ[F;Juez`V1yz4`ȍ_XJHU<{Hh#O[`&o!{ׯ0I7Hݾ:Һ9?h!\Z;tIUmX&, "kO1< %!DjuVE4$ gMD pd:\TUC plU!30GH "}xBn8E~c AW&c.8 䝗Q N6!LP1`矻jzX13m$MX 1 h0CfI[ަ0ѧ*k;Lt)GXLV_D13*eb)hؠ7(#peﻼpY"47o~sⰒ2t >9(е}1V!h۷K<ge %ҫWY&H+XCD)T!8C 68#x.Ob60.p:c w.>V'cQ DŞqEH-/-:{~G"/ҭoK@CW,ϳKLsx:D!K>jsxAWZoOp6H\43f<{QmDTE5$H"$(~O`i9N7\Rhנ~ܩJ2Qפ5kD|QԙJ%zE;HQ`CXg:I_Kdh匆2(KG'>/Fd8 QUGЬRE_e_ҥ5.ե4+V2Oz\8ECėx2#rh<+xO&)+芟,(&ӛLV7iWГ'L'Cbv@N).Q>FE?z:C9vvFVa);,A?!Q{}`a a}y uVR270AQ#rjXꔇ!>f땫L-tLN3"+~ϐ!".%|ӜŃWe&Nz=LU*>{2WdPfآ2n7(ܫxS ׯwSM[=4F,aX$ 1 AQ=& !+ifr"X:j؆pb;.ѐڧQ/d4M8W$O๠iS"F&|"p_ԫx>3S]#R0&c2߬eaV< DLSòmv L4+{ud>P1LrL`oϼpSl <|1 t|㴦LnڝsOe񗸂 qNzvkLTg Cg0@zڐ{s,ac.sx+by/3L4XBߞpһjM5GH)R lduܠ#^DTpι>D{|n;dH|L$V\a[?qgd4Lz.ʈ`|fN^餂Y ȅ ]0!LS F:8s֌Xȥgg,ܖ4?2.bc"P )Bۯb^f3XDRZ(Ry?A:N:qc{FpoBAzc2uo2S߾@Hoڨ^I5¸\La3tF/e~I^#n`p'Yi}V{HzGzWYUY{gzf8áDJ , , `®@rH7M̪Ƶ?30C4="Pisu=Ei([:<%NdDw>W,~1\x6SyU#ݸ}7Gvܹ}wpcMP{s7 [IDahOmO 8{F?LdP$n HθX RIa20L ?]x\^zmdE=N_$mMM,P|GD*d:$Zf\sZ3X%&]J4jg͔RI:a c9V6)WV)ӣԛ5&7n^OIirU׶i6[DO|GĎOeiw$ Xg{:JÌ ľEvo1XK~czK\"i\]GR褁XNhH:q ? |b 1[h2NOKE%VKL;H΀cvnT7)-ߠv;3V,t{C-Í~8lZDITePo+JS&+hƌm? )x/>m9yݓL&l?X-"YdY]fmm5fհGǵPpnX]e/W/+HE_'z*"%sM3Zv}Ǝgl 7*ERsw8 6gU@p67wSr$P S ~Y"t<woT غƝ{kiQV$diplfbGK@>SYOsz58HWum\xv9 Y^@Y#Q7b]n}?$-//ANt8Mcfc ŕQgcfM|`!I#5 KqНWp+iUX YQpC ֨(b"fV ,߼()|p.2DF~@*֘=idW*吹 gSd*UF%9Itpq`twYy}=E$oLcj>lq>/<dqo3jEJ&Y&3ww-]a++E42lY1uL} ol28Ľ:%MaS 'hт梬}!p~&.ܬ{x; f leKꯑFc'KgJTo`̱M>żE/v2h7s/%`S.0VT oKk' ģ)k^f?zO^pw:G˜_/S.#=-T1`{s{1`,VV4S~3&?FJ79t_.8YbEaCK{p[H!k9'/'X#~$^g4h"h)F(:.3gxG42<2 \L&MtSOCUQH&BD:$,$&Q4t$`hxO"%-dh_ w(Dd$Ŕ {VKt5ڭKFfyl*=ҨX^[GR;b//0LA-^Ʒ9=Yx.{oa&V8]#60VHiM#8k-1F 5qmER,)V9wгE`{XRLp==\-pH&sUc}Jࣄ3.3|U30H 6^CIW=xEE.o=$UcZ%'g ^HRs Ɍ(;,pXESrQi/gQNw^*qG4e]yblCƝrJB%`شk5_3N7+iǟ+B7q=|.G%!VJ2U-G}[J[$_ɗqu%lLLh<[LJG .O՚Xb̍w AH܅}Y35,^Ҕu'F<cwX|(h$9>ۛwb9sy>#Yrc͙yJwn׿~cJi3aN lp8>q=_ce'vi"=#Ma)Aa <8cو_<,yYUPCn)A^/ZadLj+Yxʔ{kL޺N<ѐw5X\apzb4&ʫ2FEvYu.'O٩OHجfX6K?#{n&͓{;Dc, 4}K6uL~ G1ίN%ɵM~{uZ]2̋w{ Ɵ|EVQXd5?~UȮ? L)*|%XJ?%Y4lN%_#F^+$|$AB"R'1g1<ף룪:硨^k<&ӓ4ds\AVb> ;Lm^ lmmQ]0g1" nP* Is+Xaoڧ{yJ1$51 M:fWa:r^Be!" }ZGص0D ɣF 6%Qd49Ь?ͷɚ A$@,y 7G,yCGE(jHFd&p㕷X^F؟D茞Wp2۷/eQ۩D"I6^Ze+w(v4fV{^P^Y}δ=A8S$H?ꨅjHllЪ'?JpkGNܐh1=Op:\t-ސn6AdV%f&^{*A{{ځ^~/ӿ~ye/X7iQ}ݯscgCRqO02Yz/5֌29/#jȭ*sF,m\fp|3ȖV99zgrDAiC!}Y~'lh)Y )1gJ?1mf턄pcMtg2eά=T?"DT!bRsXW} &1m桀'XAk">z{>M5b#zJ2Mz*I].%W6wKT_})QQ6ͫ :ƍU}ZUWF/Xc6*{< Y4ZT'v3KT۬~m.c&g!oU[Sxc.rkm"7L I"ڮ`4-s0Y|.wŏ It->zqLo2Qdw# ^^RxߦuE"e&6e5OYIv^nyzyL|vЎhoJ!SY>Iyǟ/Ƽl^""7^ܿO^|{#^+y4:ї?~f_c>kb\\" Rƞٸ Y)&Ĉ؁O.WE2?9BAcY=\g6"$.AISyt--WKK Cq\*13}&SH:HI*vu0)'B YILȦľjR)TUfyJ2d>>D I:LF]`AE(BL'Cń;f'hB,дz_6؎)]ktڢvb*IFK';u.OtZ3n@F\oxiO|'CΌkE!%# b29j#~I$BN-T]!c}ƧA:>|D[.l.O] Xi kX[ ' 3|||7{|ɔ~K41DpEMrkgZ;FTR"tu$:3]ve G|"URAF]IҚ1iM{ܠ1#?%u.7bZ?s67 Tׇp"y͍5B%-qѵ%^_}w=lD]lNYZGu}ʱL5q=B"&%:7Ĕb:Jn~xqѢfI/3̦}xnQ)|NKlFPh:m)E"x8cҊ, )F;C! 'wy\XD&曨ȇ/,)}M."NdC]_bDmڿq%Ņ?QkiI)4"!zC|!o NWM~Ӻ"&vCz[~ &!)cl*5Lst4cOpWJ )4x'/OWJHN]$̚Z d6݀\*C k*!PE@2Xcۣ h)[o΍})eYC-E(yzQ;`o#^G;j6n# ?A}!inRt 2" .D?>9=MxD~̕\{TcVHJ} H2'b$I(KLo}+-O&]ldz2i< ۸{(K)\y9)pq|~4L1umlU7~WZ2H걗]./yCARd#&֌| !/"-셍Z4fy# |۟Qt_~f1WcbB}/2   1CS ќiRFs2dwY?%|%.Ԟ}3]e=gu&>~N(HdS)~]/l| gꄜ1Xc~bx;߿rR@2·8.aDZsM7!9g2SNغ븖,Lf=!s!fF 6C''1$r #H!m# !1bFtfaO-<P(%Uq]k3]X[[C] G(H͵fdt0b404a1 ,)dL`p5`K>L,i=LpKJM 5J (b81fDJ‘$LxHnud>G;c ƽ+#G#۵ll" g.l{.gLGE zmTSgA8:%N*bdP.P.I+%{-z -,4ՠGUR$ GG`9<$7cRc+V qDy.bN( JrIO\ Ll]L ah|7Sk]!:c 1[옻ȚJBO)% -×W8Vwk;DќI6c{^F&f,F u;jn&6K×g67ҭPg1ñ<22b\^,ݹ[?Ct}$oJY mC.^s/HyCP +ZJ'R@5%k=f+ AcyzW+%>C՗~k -=c7kx"seVvn0O 笚ּͨ *?Plc]0ZCt]cPRmλչϓωa嶹7zo3SjL YMaDlu)G^t欘*v &RH}ۯg]ֈm 6{i:àz: )ږe8sN?-$U!Q>(D",b3xq q%XHm *l8VnCKoCBNqmoG`kD,"e;56B~3n_r!ʈ]"umtkoa,}kɐ |RDuH${ w0SIG:S"`h $Ys|H!W&",ipt( Y,b"uzȊmOHALFL6,--1 S|' QX,\\ED$I& آichDj1R I%"zz眜}%_ J,!;v)D 9Il6)0Zs^1sdL%J2s 1ϐ$AH]aMG^wX00IE{^gAai=Ï:^n_y&6gTniN'KiFN 4Jqә2 X6,$+U .ѯ_!|TJ'[\=0E$#2E Ύ>v[U CeQPop[N{H/D7%R&EsT4E;4f摟H CDki-͵ d;n\$".gxլO41;ք1TM-uNn{a19#VdҲ hG7smgWV_߹o/cN]41F6DKj䗶"F:[gderնIӘ+K[r^㝃Ԟ?E -k"y;4zuyH> YuΪ-reahSL%$/2X!gG ~W"p|=sڣCZV1;.P@8&/jϘ#fD@n8&L%I}Xʦr\HI^^NsdƛYL *"ib)TP/1AQ(NHX$)41,!"R UQdbN2}00 4IJ,4 D1&| |>Sh@ $_K$nxlȋgOZ,KU !LS$ixOE0"#V\>$ QHAأ Q2Q")1۬m|4Օ2f:ͽ7>@Ҭo`6W pN6o|.#[!J|!oN&|R)W|U%2Ys)f gϙZ/8zKNҔyUru/z}*Pk45$?@T1s^>,6f8=7y{^a;sU<5w}\әs9~Oee*;k`0[8>xD8SnϘ HJ|۟,hj`6&U&"е\Z~Y b76O?0c68A\Ag~x1`gJE4(gIΛĢH'g0?bs`FTpN"[5@Bpo"y ]QF[DUn3&{n.bBh}{γ4ҟ8\'&M2da85tNܦxiӽQyKkX~oRĄlQ7[* ?;Ff^o<={IvԙxXg~1&'S),R"ōb_%(m{6B(ci%* N\i]%dT2Aia3}wg4#ؔtJ>'H,[_HV2X3>a]6hLBD1Rh^^pqϥO&;[zpPtd9"Z3M Jl"O|Ui_0kՙ^MDb=p̼? Ͽ}/>bwm} lD$X!tL=S#pf'n'V_N*N1 碧t"?`1w0:1oa:kpu8,2 DQU5xRdEp ("} Dʥ%gm$S ia:$cY\dBX$&NI$HHDCZ3.#6bNY:S^ $ɈzLE %掋-PT z8 QXji61B4 Dwﰶ*ŜZT"6J%ixT. c/q֨h\ׯ1UF*p}wri w!"INxpX`iKEI<"%)I`>M' H ʩ <&\}bF?Bs̢ǝ}TIov,R<ۛn@5bem[oGIϘu/*0AeOU$gc&Jg>}K߼I̓)/ | a^ P^ ؾ}OOOqBMGgr;;4Wg$6ŗWఒ2oNI\P[Cы_^1v:Mgߧ[?@ T%F#J{KZ.-ka v\vQ4 F@EF w]1E,xR`f Er!z3'[*HpI(+J!_FUuQT4˚:i8sݻKP`>3 0EA p< Ӕ )Tˌ!+++h{[^j=3fFPBH 6ZQ"7 )1vճ^-9'ΉltYF6/st]dh5;4m `8ūgYY@Q C1,Ƨlw sM)>jtjaOOtQӓoR nZ:}*zNfQ,IxAf! Km}|Lt:ْ G/A_+ %lw ȡۣb^èXJ%3)^2^1tJ@n:#CjVZ*"oVNA08C)i) HUԠO]C"d:fp mQ $߸uwYX*d8l$?Î#-VrsԛCXz\]lit)M>E$="Z rҋrjI5޿N[b)ߜ G$%e5:>{o%$OGTmsu<"A9|- 绯? +8;ÚpLРYlFhZfutOjsۥ]A{@?9OiJ(/ذE `)36RtQ9͋')R=hV%h =S+;d?tl?Ęg_Yr1j:TcluXG3ݽcSY.cuL >{.7Ya#ڒx+~FN0Gg~)_|9ȆJ|pR&׹H>_od)ww_aW_IP$gOz !xB#O6/jãohH2g)K|)i iT j+ rb$#)z$)EQ~7إkHV Sp#$<+CRPB-`?{t1gS$l?QЛtoeE% x"[p.SPQuŤPy9̑J. xb=C.Cȷ_q$~ X7nЬXEnr>KVIoȋW[r6Jk7"mB98ܾsIZ&`Re'\M(}$g8RM*G.4^2]/@ĦB(z Ҽ5`sqJ6#[;=\NxSvvz̊%FT]P(9 o6?FVO쀵` :_;߸D߬mDkT*\#I-P{J%L+Ϟ<_o}ƪ_hl-:m&~GT&؇M7„ k_9ãkl3oߺF"lufI٦lsqyaTI<HӄJBokHY$IL`0&I,GQ4ĬnbY~aUjKFTp$)diYE ?BQS&a8+@@ŮA,Wk(ewvk0=bt8:AtZ=.eVpy>! S~s9`>!`λbV,z-J2]zc <b:͜,yvw{Q,OG#͔c~V YODΌ0-r!AP4lou cphuܟkuH݈cķ(W(&>m2'lMXxNuήV*uq&2+Og,#uvdĞ^z (lO(IPVlXN9$X.Ok10zCtw!̏l!y!~_ و/#f1WM~aU- E?_p笝5kT"՜IbnŒ.A)taqhs>@ m2Wݢ(Zv*l*ChйD gdB~?x]?M`3Uzdl ݤަě&ʙӸnzɗW sA#Ҋg'-S@|D͕`nX,ÐXx3vz%/OO8bUf۴5"'wb|w݉hj:p0ΰOV6ދ J˄OS658yIP *VFj4Ys Y4vwZz]GyM jDō|C5Nn6V̓WY1ںZ#@+juDQ Ei').$(ضITrqjb9_b&.g9yFS,h6;M4fXf$0e$I(ʌJm;4-4@4Ly%Q.ݬ`U(bC 4Te ƪJe+QH^@QBEUA@d`oOɔ4Oqp+HE%zBYD^ZCkwF|"Ȳ\L"e<}"44Z{a0ۢXhP.W  ɘN'(J1Cj.g%pp_k/~AaksdqWˀnئbd[TFVfbe\o406o3!;>{%W`@f5<]1 g9A)( ۝&gs8Z:CNc8"X;ԭ&2Rfà6o3p?dohl1s:U˓W9{׬.մ|{37 PIX/x<IleRt,YJ:"vN#+CVիd'T ٷhqEYiH?_?N9>Qq oް 4)՘$w_?X*1a0b; n3rfSP_|͗u^]"){-V5[aA{ jd`=no %RڧĩEbe*z%ӗ4')i9M|h !R"!}&$KMMDM??G_[}SGK⇯#Y4_dԣ o?ˋK]͹ß~LTԩQt|c$#wE08=,~Exx<J]tך {|0ßx/^iD0d|/9rtƻC0 DPU!ɈQE")LЌ^-YiEAq(9.eQ!Zvt -SRoIêy!@!u֭:T2޿~t-q q:T)mӠ/ݹ\@8GG nܡL'+B*&aRS OiJ 詆\u  AXd;)ܠٗeo,5%aL/S&Nvh+m(k*zV:zݛ>r SO/ IQJXlV+ќTlUT]ʷȄ9,b*>bI=Q$KST$V4t!vwmթ63LhM4s>Q =Z.2?}Iqu "儶i 0E=bN@IwVkY-V[]Τ(^O#.֧t*NrI!Ŝa] S%X&yE#PEJIY/ >a.Y*tTEfqt@IC$)Ďdl;hgO:r7|wdqKUTg>1"J V&)h(m'&VL oag&f収Cg &cqao nai ۬Mzf}fI4:cg4ڠ=B!Fs|)ǭ{=RhNQk:|SC-\o6y?'F DU=?k!XpWU<^Ϲ^ȳ%X IDATG3~v(\1:=ܽ@ 7c9th2N&#MgO~DKi?`WQ*I A" %y %"I 2yYF1y;6&"PRd)r&1Ay%f4j5|ͧc izEp, u0t14F^%1"R鴷4E6H(DF T8J vYљlNCCXhbωp>>U@VV%͌{\:=GzEn5yl77fIjųSt"b&r5yNΈ jS7 W_</9y5b٬mdEcO!{y]wn\/y4j~HRGBalȢ唽]DDQ{h!RG!e)bi̶aXϯp''@<vwMBEF6lJ[%)Ͼ#& >ܧ5dkc+7vPT3Kx}ʵ#Lݤb\GD]^;Fט>a5uYSv\1hQsS4@TC.5-5I):(#MzwǪhK"E*lrd(bJ(JZgq=jbr{0kF=UU{<:C0]f3 SHg#tAL +lTis9E?0jȑHn,U[s.͌oW]citA - kB5$SS3OȞ=ivAwiT[|+~z«G[wi_1;'hک5hw]ͤ8Ljk^..0:? ?7ߢhw9T?not$%{gcouF DaYSjuQ:YQUQ C-c[ǘ'&fcH{x <[6=Jr^~Ij(qJ/T+{Hʷ_N͠Lb*E^^A* !EZ„x9Wr}vaB&ˇ/7ݡƔkJ Ư~Kp߽֐a^i} RmLݤ-<¼]hFMO ^=ӮkަuJҟ^oz%wǙ3f`x )X-ƬAhL.>x1?WԜQ6CmP~/0/NL{2?:(r,) ?'unk]"УLBhE%uD۫_?$3}N8e.qC.g<89xA(J^Et {>>ɍRPnOaʃVѻ׹}{3l 70ޠoB`ppP7ៈtWUU$I&2TUlRd9ni:j4I,*R9iRJ*F|h&e*YYPP xknM2BU :aZAQ/MQQF IȊ(TU Q:~>cVȢJ%o4M)A(L  5DgFoBAdHrfȈ@Y.i:IvXfHJɋ4.0Vqva PXf"EEYU*w!+2v9%fф4˩T$qAEX,YsW\}9ym5h%Ǐ)4UXN.Xo5%z8X|]c>N+:l лY@R&h1EǔuD]{m"gz qDʈFNf_LFsO>ň.ӥ{NyhKH nWMB[IAרUksF*3FfAN<9hД6A4㎂tOu޹_s; ߣHb4t"ь#i*n.zݘt4QF{O_ q Rkq/^]!,.Xzɥ)ZP?¦If!g3^|{Ine+b${]4xû ZR9aYEAQDQf&+r$Y!IiDA@YB IHQeZDCUit> 9 5^\vLM f#::qd YE.j*P"9i`Y(RiTդhݓoQ(o*IBM|,!]L0eX8ኗOcMQUcV+Hp)~iXs YXoJbw(9/AhN?t tQ7Xi*C%<0j DdQsV;=nfMJZ'R)r A"=6Iָ J0U7suf4nRĶ3TֹC&7>%q19's~D#Y޽KAr?IʳIYPh:nb{6epYf!kt{ȝ>v^#PU62"zx~ zxaM' 7GO}KGR$,&(S4DJZ.b09?GJ~]$DQ$jy&Fc- Ķ4U$/#4 S\wNztvA,V3F YSUSavmfli#Z4t0[>&Z,lmNjP T>lX.<}wҩX#rU$>JA2Lp#2'H}7}En0BCՄ\5G?Tnv֛H+TqC N{I^e*bsn֛,S T!Tgܺaf*|WO%I|\{Vb}LFt7=mKsgzo~]4*JuUtX n4A=:"BM\t.J*sN^{/s8?koifwL}6z˫K#0 1Pyb@l p H9zPU}G_={< ],KtP$( #.i kT]ӈ)jPe:Ҙ1 Ip! .ۧ3"̬"$fuB#o{FplK$ 鐥"zQ79͒jptg<7٥:#%I4M}Fs{X)$%Q@3TEV .1\A3 ]e(!&!Ѷ.hM)"i!:6-J$CU],{Op]da@ҨJk vۚӳ 痿" O ߞ [v4C FC]y>9Ǔ|;#5jSsl ˡ:tZ- TbF,Hm\S9rS#w&2+~x; |.r"Y#C珹I9aq;>z:!6YC'vM]Bav{ptv}ٶ hH$,wLS# 8Cz j<8~H"XO~St{z)-7A7;5B8g{uJB.u[Y0MgwȻ@h,"Y dLWx MԌ7ƱM2@T**c4tIӔtuz$BT঻`[:aP7 3E64QZrS%hdi134rEQ 1Oxj:ŏ[Fl*UU:VT!v__aa 9) >bc ox@m|1O.;SX'.­ӣcm7ctlD,D UGrb%+Yq b2ͧ^.<+;`WDY}@+V؝^1WUͯ[o4C5&`>>?9xבyK )W/$=]GjdшEr$yX/ҽ'Y{Qɲ M5=8di#F0q]l{(NؤtmL Z9XJYEo]@AJɚP 7yiZȢL ./UE,s$QuzH8HYȢ ]Gɋ~[38-`kjUM%Ypzga "YZ=^`9#G-M@C vhBXHBYBE]G-putyf($$Ac IDATUpQɢ傫o);z֐PweD_1v*2+ eB9.>E'wc<LٻϨ7a]k3b2q55)2"\.9x21=vzMX&ġ#x$"Jb4GkTBt4y{C6 >n錋m9gg5W-mޠnɮoȩ'l 4Q{~rw̱G'xi9<tg-)4ƈ~2G<ϑ< W*w>A]HvEXMft5<.jĦiݮQ<,٭dZK֪4°cGZp1J0QZLG ~ FM_Se!F,>gC%G:|A&-(֋,?}J-qO~B;٫"X}ON-,$ }D `CjUdQV(6"ѮB A0LJo<Ѱp#h e0Y,P-=/)Q _PanY7)11!p1>y<{vW%O62=` M*1 w?{Fq]_ e8?C,%_r2+U6kP1ӣ?oYO[ =źsz/MwĵB*[y.Q>\Q,Hdld?J ڶOEEE4MAʲDӕ[AI m|IA'DQVȋNPTps$@-3}mNXY&=tIcV \ߡjһna,7lڔ(^FZ8'|ɟ/^"8:i7>mYdqV2jYc?ܣ5k}cdtFnUsA/`嗔?Is9O9?D޿"]Q3,@E ew4\,/9cBT-z)1 S~,IUbz7_s`{>_/~?,M/O4QsQmŏQum1 ȳQD'?렮k"(*1#fQ)4P)aP)傶*i+i Ap{}Lϣij4IJ҄VYRV)5iB,:$B! ]ik I* ] y^*,3OX&,r$#7]Q)E)]W$ lF"* I#b!JX.ާm%mSM4xLݖ̖MM]W(GEB$UbyK) 4OB+`LÓcʢ46*Rtw":rlys55o lZSr,4G\'5*yu ) A!Ic g/~4TwےJlqý}VnIX^' WbGܝq{-mRUi"+Dfcy}z4`N)[YVT=Y0P]^`b9Q%7ggDaY]sB|zjfՒ-z#CEbݠQ%Mc&l(M1U/9.mc z|_P { m!2;aom+:Y+6;,٠%l!/nqLccZq")"1egȕ=2{}р. QǴgTʵR =M8SƁv׸ 1/pْX8:.țL^ާ JQf/?)$6i6wm9r~0.PQ+rh vx?=`?! vQGc΅ۑJUDHtx%XJ-"d41s=&O0aݑ1 k -;ͳr̫whTb@Xui&'OLgX ]P`=1߿_-?9<{u\_[O'kZd7__2M ƅy삟I#>=zgoo;i48.,ucu5 (ˊmY0tlB Cla0P5](8)$ɋf_&y>#2 ܠg9EU"K *!rMSlaٜnq;h:wS7Yڷ!UעCD Y;<~<' =ʦfZV 1U"W&>siXo#&<_㰯s޿56n֔M6ɫkMI2ψ9C2t{9|/|߼l[8ؿ94if6u;|ˋiPͳ)]Jwm Lg1Nz(B@4wwuAGfxuKҔ)WEC6YëoMiӒj\ BS M;X <ք E3Ӝ {)%Wt"FeMп1j~qC*Q0=尕вCϮ:ʖ}e6;]55Iau(YO2 s6G>Oy&Xz\Mtd"~O 1rgeטAsɋM$q<ٻh-ip˗8OϿ=u'c-=GY^M1W[0;`8aOMS9bƽC޸6{s qL4џ ?!0Fw7<:>ETSlUWl9ۯx.j~DIȚ䴗 ~[J hF:\E_ )(J<EN'ȲBAufKdHbK]&8clKTY. (B7dT]BVD8RtJfAkIqQ,PV u]zaZoD˶%)ӌ" (i4.bŐuDd4͠:ʢ"3V$K $EQ?Ś0JȲiްo 6 b11 rNPHNYIB۶?)X4ʢb]RM>IP a>{t(FctClDd| `j>Z[|,\YTRM0Eks6D\SՎ&b8&rc56uF)F'+1eVlۜyoq}871pD'H[RVwt#9O-teA[ȲiɂYϦ)T0c3xMILjZM#6v)Œc"ö<O: -bq ͂nt((•R #S6襊0Vy7grHcXvFDyw  JS4t  +3g݊EV.|q~n9ϲhgG_p9MbzvKL%Lj)^ی-1hRpqBo 鏞:?w15.DME`e mV[T.;"a.C"cyt؇=VG4& Aq os|P\2N-^8 5(g~z=úfUlxY-Am>P52fC0$򂣝nfHUfXtm'HEDAtDQж"! ހ.9QHsEU"Pq$KE(UnꈒHfiE1s~ufjXY$ՈB$4m(ax!~o=O?q=4]+ހl%(v:XtjZ>Q!KeUu"ק!kdb@e "I24GUMm@Q֜:W mPeӳG}A!鱺B %QW!XR%&d1[$&lj1>)bm[!K-R *Eec0ޡd b)AQr9!&Ք5iaw-5-M(BtMaS@e,r{3K/qڎeU,标gY]#v2bs=|3#$B4Ma3+$&L4Q$Z^1۬9G4%oXrNX1 )!+:2(S6$Gl;a˻lյvFNXNpffK>8*Iro0Bi{ 7삻.d\K6FpP6-U#R;}z,o 64>=ƥ.#>|x;&Sҷp4f $~-5WM;Wg_"GT-vN8cZE4,"&XQ8>Y/xs,{*æpULe<4,[G"jߧS e c" (07ܓT0EnTstR,.==ƒ_O~G\ lwD2;ق^-_ܬo(O.p/ҤwB7Bć93>-_54iI,K{ "n a&qi:mۑ&90 Ӧ(j$IqijTuMY HBmG ȢzEQ$eI۶HxJDrdQݰel4#+24UC\ -E{4͡D\磘IU,1}d`x^EC]<*.3DTT$&L6JXayCEIU5ؖç~ TRMSWNE$[TUEVu6QFl w7WxFϵ[ߒB*u\:yy.nlNrz= ` t QaKL@dD! u ⒺDw {{?_p)Y H݄lV7\`BE"ijP4T%7o%nMߧdtK'JDI`ӊ4iأeE $uֳ["G5M]ޤ ߢf9;IQ=Iѻٳ9}jE0P^'ÁU_%W񚢊qqwL1?u-EVYAg4/ڶQ4M$t^jeYIu;I*(CT Af0"I :YZ.'G]HLXr>#3AD'貂kE Noq]E.(`u-`f=Unj$_"+2"'N" 8UҴ0\dc* 4UƲ{ؖTU Tuk{t (1F8۬7!M'h^"/1MH QRQ55IZ O|a8Em] 匶UUY Td,|zTdaI1X +,Sb豈>ʿϑ%.^s;}f}KѻLJbһ[\]$oiޖ{A$K*/Hʌ=~D)X.'(ښ|&X+EV-,EKT54HA!vLʄ:IPł+Fk)z[%IJ՜ *m $ hh*XCt01S7 rw" Dz~G2Ou$"E)Y6*4uMN]UX.gD!b#w,mLׄ8#[o=2փ+8\\*+$^62Bd>?/a*w8 FGxILXc'Edrz}065/ƾ]7֓  *dy 1ސO-nү6L0}߶DI;b躎0d8iL-] [^JQ XQt?1X-+!gGa9uŶuI0 ~  y<0h^)w IDAT3V7L&YB^dÛ&D㰻8J#V OQrOew Cޛ}%z/a~W T@d>[u-z|}xsprpb.ʼnFxqB)D:KsH{*=X$M"={ïUcQX`_X^LQ6kWiwri?SdU@D꺦RbKgtBK% ]רʌLHϳ:]3Ȅhl4ضMT@5hFӕdi*f;C2 !$ql0-T :$EYR1t> 妥j%4iIlq4Sۣ?ڡ%UMZ2c Ȳ#N% phhuQQJɓѐ؄s4 o-ED+.h(jtdtx̽fZh1=jPљ 1l 3NgTeH 'ǔ݈H8ވ'Gـ8t%R *AhKzK^ (HՂ0Zu.-&R#zQ @ jI@=N?agcex}Jr%RT]da7Ɩ$Dl:hj]Gt:Dvv1k[(36K)fJޑ"jobhTD0}84VA>e}Z5hw|nht o)+ZC r`Yx{h4 :ֲL/К.QI%owh3!;=$)KDoϿDڝФ@n  ^\㼿fem#?}3ayd^E 8 `z^DIBUw\Fb qu9K^qw͙eg=O9g<ӽ5uuW7F` 2Ȑ%$Cd)~l`LY(@Bntu3sk M+^}}G_22!?<.WԨ'T 1z6q%(0}fIYȒ_IWl1lfآۦc{^kWAp5TkCn[24ua96B6kH!09ebtmBPi+ضN99~DVtC)06m()Cy4OdV 0pmcYv-ae[v; °9q~~wCْ{0!W,Q8vf@Օ( "m֒,V PfC :6iR%J7Cٯا;N",S tG$Fv=e6=ôbSZ:SS%|K0Q?)6gWVx')Ҡ] a0MdH״M TWФK|,\u]]pyufn;6tZ.*Pnr?0qAÐF(F fsʶF%5+BG8>їLQmE$,]b-)(1egZtN8u#\҇^ԣ =CRvY %v` ' s#b6|hl~33Bi?\RUy%mPmL4U]#N<;ሌld6>S <'YVvkF^4&]ȯ߰޼~ug٘V79_{^'YS~  0q麖4Sma6im@S&߾dimxrȳi,<آTRm"AovcN!뚮-`fxax \0Z*tOI5J) EIӄr0M0i,l֤iB]הE nDa'2]=oZp8"] m]FwLۜ0l0!L<0m{җ[͊OuFZCT,%Y 2BfO_aG=qAӘ#D@x2_s2<%xGX^WBY&c#-w`Yހ=e%ɖV4نGM6C1g/뚩3u=+F3+bnޑ E&IwejC-1=>&C/YY- k_Ÿ=^;$lF(cNeP*C#Fsބ`B%/^R~0ďcYiٴEgtm(bLo飗&atv·ۻKt -(  qJ]A[px߾-2gbK{i0>9CiZ䎾0A2M-va[8ǵ' `DdU0!-z9!zCmH$͖hh³'1MvocX4zMb&tٖ2Ya6KCЏ"TRf9;Q"C)I2jAM#)2a5-E4"Пv'Kc1ӄr@两iȶ#vξg'mvCnEP%A 8b2rqqbء B,|jkz:->^*rp@ eÛOF3~tǻ56!-iyUo%\jpM_a6".$%+Z3,&I3ֿ=GI1_)^iFݴi0,dhL( ow&R8l8ࠍӴp]CX1˲Nt]x(졻,jTWQPY嘆S$ #> D5SbaXx~c{ۡ,K"%MwTDAHbZ6q ݖLhC FKU'hנ.Z&+2ՊFiVR-hKl>Qg;$lߣhH/u&ȶAV 4EP a"ۃS61("  l~1c7V`i=y`H;ӷr{hJ,Y66U.qt`)EVQ55sj9udzlryh9_ӷX_\˵8Vfu꒮-Y=\IH0 H(ӃϬ/1nr߲,oсAks_F=*ҙR(c0ic&Q7hUp;W dvqC%h:!~p)d{V V ML&s:כ{_IW篈o\%JcG/ڦ.s0joz;T.N|<'@(IUKl;ԇiciZmPsJ җsŊ|9Lȁ C)9c#_9[9 6mj`2XWTJkl[py/>v4蛟xg>dq{(Q"bCWhAY$u&OmcZ'ȇ aSC[ŧ&#ꂿŌm$[D}-?'{46PƵx6~L(ʖ:)yEB\"f$15v(~9saYV_?bhgYWT]293^:1 G))]pPuRY%\>,OWM0PAgHv;8@ӱ<4Jiʲ: N4XEU6?:$iR5eQ1O1-q]: ]M-: dURf)kh- 4k C㧟cd i{XOPn08\v)ďwb):LatP HH=]A/MحddͰMI[d8=B m0Q z=ˏȓJH-0C^?9E Me4yHhz%;>eUc[pOwd JS;>5CN_N='hdwT>='4+N.F]^\]Q"Kdz%~`U vL2"ǰyZZV RY55uW??Ov]"]Q&+|6@nc}˥Ғ}]PT nw{ iR7dM^*]ǏbzO iRk N()wwNH|rlvUK>\~pM61q״h Ej厑Ps.f<:ah4[VhCcG֥$iΠr)b8t#lyѦ&orgأ##x/$!zاy]Gukzu]c]/1+Ҝʶ`\ r#m:0_pA%c/_Dj?1.hqr 9dmӿKJ#`Yzc&cL|H)ڱ1J 3KYr6;M%j^!+O3wGe7/*dkxͷQņaXT[Fr1?|ЊQ,vD}Oe+1? q8p@;T U)n2Fa -8t b]c2 a<y iۊtFu%MF[vǶ,!kbhڶ4& @jHZiK\C0mrLFa`` pl Rh_ -dqlr-AL=]'탽-+ʼ@50."X]Ԓ`8$M?aN2*!/mWU>_}Ok;ZR71:{Vd`y t'. `m1˒8-~i4$dCktIHјņU<ȊO̲&x^4[_m1M߾) \gGS{Yl!Zd>~/S̬Į\_;\7cׇ@Xh꒦ɨ E۔Yc;S`Nz} m}%OS֛%y%;d#dIUm$6aXXpiYTU$azN&{GSVT8E+v-y1ж5nnfXl״yʪ2Mz4E0=[EWvkT ,L"/|$%6}tPu( pcCRnY/ַņ* 쐢4,-{Mq/3xG\V t fO>!Kz~{r%lp E^H5I-4jQQhS]bs#mpppGďLOltFg礿?E]hAi-`2a OKsrvMxG!ŶLο<+Mo0>jۜ&3 4o8ے=g.' ?c ?,%cݲೋ[Or{MR~=z¿MV\zr!M 1x7;>ʄ+NӚ͚__||ǧOzGy|:{|r4gCej?!2p]a3NHl0CtE#:Ms9wX>lW7tiU(Amc q'X,dMd az4:0D4 nlBUBz')`\|7xN?؂o_ͨ>.`j7:.7[foհկW5?=#m0fCqa=frr3!>ǟ?Y<ˠ(W_ݳ,/yXFI& ^7[Ɉ>`ȑ5!pk&)'֔SZ2ÎlnRh2[&|2 Hxwo^2My4}븀yd?n蚆0(t9d7<Ϧ%p-W83, ,Cz.yS!m+1lqZ+ʶ cmc!ִhBt2'q!^oAdL8!]I$i{vB4me8$ah!ˌɒV4Ex2.Ȋ 70ǿ7@Y Fّ{NW㧴3롂#Xb&Q;0mM'eAט~~IVT$_qzktCfAp:Mb߰0췗4i޳^:}ZMW%]Zbܭ9c9sNYm1  w8EjpMKV}Ru؃#iԌh.1yslu JX0Zʮ B)!>A]m?q{QeE pM^Si3YW9zMog mNZI^nvp6P,ZOIC.f9ēSxJ~Mv&~h̻>oX,@uψ&g$3FU mK#5N W n5)Pg2DOXta3*;tCpI%6D=ud,#ޣpJJ?#xݚ^+H`aew8'N'yl6PI Whﯘ-N١:q tʔb@Ж=BWt-uJ+߲x Vd?3'/ٮ(cO K̬xX=3X5-w:ǝ^x(2RԳ)cknySLϠG!a0`LoL#'JDsNؒVt_)C%tUn 钺ٓcӠ4ac}G'an5[HVn =v`TŎ^ Xxm^AӔrK :ۥ.1[g/r6;J`v&xyF٢CYS5k_R,ů~:ݱta-nraQ|l W%ߧԝbZvn2\3l&ZZbLWEAm:xE˻{S/D|]ًY75ՂrژZsb&ޔHצh 67̔`-;a">\Ṋd仴o.9Ӓ~[bѐw(m3|7įA38ܻ=zGf̎G>Up\xT?<3xX߭{[&9> G!Q'>E|B 3H]HS&O需ՒZڢda?ҎbNϙtշ v+ nYXLY!00:K]wH u%eWaЏƘV~C 1v 1voDܛ`y!dz#qzCǏh #F#+ĨKAb EQCcRb6~/FhK5lOhH9 i Su-Ueӧ7 dEm0,ƐdC4p\ x~LTy*:*LAi2G1SD {%RV1gQ_mEdv"R D@uPiCq\S~AVtyJ'حpB8cZV+ /06$-k>:%/Y^B)_<ɠz7R邁a.MBا1z>F @IG ,(r#M'wZxQ'T;$e1~|L"4Êo=EbJv?2$aaSq{OǣYY6pfwOG7+hMPi_HSnjK~U yӲ.+p3za601RU~XLJ7z.qLn?& V6\p2D MLmUO+޾Oh6ˌb˟^WHmՊU$8WC֜O`@a gJl1`eGh1 q˵tG]hmz~|# C,ˢLpcZi nEi<#" SPe&2lBJR ۶N*>8\e<1A+2,3no>RJq-Ji(a {C C} aN؞  [Lv}LB )%]1Cjݶ}pp4Eр!|jY{Knʂ 0cv}uHQn誆vCp>>!M1)%E]%zKzwGl+,á5$Jk< vD ^6ߣ!SK?P-8B0-yE58\(3nܑ4eMPNqDdxFԟ#u*mPXhp/ASk}Дٞ,caLY޲\ޡa1U\ nVqSrN2_c9-l*|ǂ2?ޜ%z""\wy} Zpk+$>EXl pL}>{UƜ3#2"0V`I)TF8 Y08KfӦTIL$8=o ^X2_\G)j{GzF7q#?oT LW(kQ3`,)?t?4SۻW#bb2Eq80aJ0|"p}GzLc".oXɔ1;4s7ak ٖ\T o퉸="2(tw/fdmKg+,d2#R fyBS>#mGD4Ӿ z( &w_ap̭ea$`7쟟r0ԄEJ"rċXQS[nIsUrIz4#dOͩɒQ"4 'S�%y3r-Rsun0eŰ? wQ #og_3D.s~z~AȻ ?"eMLuۿ3lǖ[6-ۮ:ϓ7+~Į%V;r~ǟ8 lS7- ȋQ|IKA%f%)Kd1lI8g˜4F7-iL呩08G6_2T5Q7V6tYũ9OL\TBd)Ua,H]wDi±MK,67,w,V7d3fG7՞i+ɳ\1o J\^83v ֓Zo4Axdޓ^\'ɳV3>o( 鞦zXsAS,2DmqW o."SO\6 d>rnITe2kd&ͬXQ߲b ]q}qc4#J %NC, s{" 8%2_HGdђl>g6j=,s :'SG0"0 &niW/yzM$4XV@k,-0vjyӖ\\iz왊3[MxV%a[MO W,9s+OۏȰoYXIr\ ˿r5c@gg]qgx q^mCD#çgX sF/o܂u P %4I8 ; 8u'm0yAxƢ 抋4͞/mUE߷ &~B8iMR/> Nr c= (@)Eum,?۝QS55D[X3Hqu9qfAbGH B"A0i;w) IbfuEQx,YWQ8 T C fDL<@'9RDAְYQĮֈF^2j2X cFy 4a*XIUJbS";Ap^lH YXL`$qy"͐: 4r&/nu@Cs6N~|8FY\ҏCatxO3>NLC㽣ך͗\_qyOʳXmГ[蚊PI T#>dGEGgEWfXV0& T"<3\-n緤淬^4U'0͛3 %q2==Aĺ!cd ) PU% 3A;KRW%IrLҢw$2b4/ f/^|d9!JکDeQ:#2С&f~IPAF%DyLݞhf*6+8;݁P,9P򞞫`XBk9ێyO*%YwN[ XȐD[ațņ1N G5`g*" "~dy"|j,G4L#G -Jqhd%/:]W[rG@?yv fV|?fl94Ieqwr$m;҂_>=h&K%/bz=7=La~O:_ח$E?ߎQ/n!,'ML?f;g49wK5ϩy 5GrXlOX=3m޶LSG+0象jD*D: Sx,_9ǑqMUYB(&#D T{ty@h c!'T*A߷Do(=$/YF~qIT&T!YnebTsQ/P#SRpF ?qdpCGꎡ1v<|bᇎH#Cn:|fX#FQ$ 94m;uL6醎qϲD!^^,y_K@z06@%2 &OQI+B"z:N(f CHICrGجo oQJ$QzsҍfӑX&=3fQEEJF=Lwnq5[;0q"7 ǧ_yN@Nx% I&bU@,"$,!$FKGx%|1#&H"Ѧgd~L#A0xwl`gvp{q{;o_xg߼aM;p׷o9N#ž%dDL S0ږShf+.y-?Ȏj斋8o;^yN'ْLL+Gznc20n:jB@:RgĹ (st1aID\1c4,3e ڌc PXH"8謥uPdzsnGJA׵=LJYL8E:O @7jYe-xrɨG1Z`FkƒSTI"AQDFmql a'Y q*lGWљ%OLxqa_1~dG{npxo#bg{v(g8<~šc}j3uP m2yG^1#m?Xˬț\wzG9Xt?QtSqdͦd^24bXCj;@zScgL!dI p\$^,k'fÄ͜0KHTo^!$p@'%^4ۋ< 94Q y~y& ᆬ!{~k^p.R($&jH=TQlf>ȑ2nxX,׌{o ,d Ǐ"Xx$o`bsKcgߪUh-xۿ>x?e! ="'=vgT ( (g)QٲwuR-ߧ7,^\.VfOS K q>,' 谓lbb!LC'%gޖ?RY, x^ R  bCsY, ,{vHב9ZODi0 ~n?'B$cDE(!(3$2$B{Y~I㐍u1Qc&oj2'b=IOTrAz牗Kf5:4/'0D`"7"!(^ y֋^Li]u,TDb ݧrOWGi턶dsw c19jg0_҂Kl9RxEX7iv1'1 v9158 K[00 JJ&cxӎ~iMC C:Є[;\#;w, ,ЦB%5gȣCO&_cH7K^14,Hᣘ@خCn{K4AȲK@s+VF\T;ǏWG-X_-8G"b  / Ib^N0TY$3 ;cXffLy \Ւqc%s"E@=r C Lաqh?c]RpΛu&mqb"NhA%ٚv] # 4Zt7+LkN=Ŝ;n%RU&IT:~O e ?Ñx:cpatΩj/k"U73f"1Jn^c{?ؿxsLy|afm3oil6# #x @`{˨GR*;4Ο3Yx,G }~S<#Mꊮ;„(kGͿ`/e3V+&]:fOU/sN랡mIҘa9kZ9q詫MP5Nǧ?UCCOEy9b4R7GYGUVSl5cLX\}gTk*("!ތ8I✮"`#tڣ]<{'(ga&:ixބk;7Y5bAΐA%Re cŚ[ 9IjB1-%zAȏ?J勗AHQ')7Wo@h8tuKHHxx %9q]Z'L3i֋ z{?D<4@ɡ &&[_JHpVgІIBc:@,蚆q8 IvHѺ9nϤqD`,zr~0K臆p r Ōq\ &rtA 0'86ٌ;*q<,H939(̀_$VaZtќ@@:~#/?qWcuU,۷#n8alSojzXڪߓٞ&0h|)_`9z#Xƌbusl8^OةftZ|$$ƪц>/MK28ݽ}$#yB|z"ur؈~3#|qÓњ7k7[0D1w/~A19T`P_'( ^lԵDH֋a9װ@Z펬uui{8| }u0TDQHc@B39GAzQ9BLs30cFz=plk.* xFasLO["Gl0Iڧpg D$n喦zzː>1vO}ۣGsF2bp }aN5Q#0dXD\0)k"ecw8ҫ.]Ooƞ,({ʒ9}YOk&TyQx1eq?PfQygq}nw%yo왦;Afa?( a<\B{RќǺ -Z@ҷ#o^mC,4~>`|H_ra+ ׯX`5*XΗzIg3 „[. ;iC!ZdF3]IӔ* P $ghc힙%ׄ*/R)Es0m7* 2GVD>J·G+$gMp^0j˪ RŚ& ,9A&Z# 0"a5׸&Psy?#ϤGqe=bg !rbcڒnLM/<S_X.8an7ijuߟB@e z5'-.^0X@#CDS#ϔm ,>RXq{Uf\R5azy.ܼcT!k[ބ ՁV' BK)= Fϸ({d,^A;8 \s> a~\sF[Y:gXT-3X)AD1[і둡d\\]0YϾ ?UG^{˫kvB8Ir.ʁC =PrAљэL#O͑fΝZyc R7~, CWG'\P5\_;D0jyEr<_#/o Wa<׆Is9N9䗼~z&&F&IVk9ow.,. wWDKCKdĽ&!o8}S <%r0/1I̋/kyzX.PtT6ǁEsḧj.ח|zqwSL,~x<"a0=*'&31ϖ<(Ջ7Tfq}E!cf$pusnTuJ4jR#@n ``a!vH@B ZUs 9!x'RZkE<}]Ђ%X<_BvO gxeΤ0_L`/O R&"s8IǟnG^?2$N-/?sz8^_݀R౛e {CZK͜4uU)% I4Ado217ʸ=RAZWf{% -)8Ɉ7v7hSmdyT9zӠv;rCY9n}฻QԒV[2S}DQMo+-a(  sE_qbSdRmcX79݁/Ykd! 'f!)!t)R{--S ?_G6fC}=yiO|Bb;:,K4wRb@%eӈ`^5< CaOys@7;8㖞l^E U}8 O'fï,y~<3Oج1țbڞ^ܽ0=?ao01D$jy~gY 麎iluRgy$VӠ "R%2;`]($cEjy)˒i,3h1&G댧'bl Yn) a`&0h PrC pz@ -Ye"@ݲZu(l2ϵ=#- cײjbphcD۵e9ynqsRq LV!Ad6O4P5=dJm0 Ȫ f۠fh ?LÎ9vC+oO`,Ù64Ŏ~~fV7;:c3ւMTuAUU æb\"Ei…HHp\>1^J> _>⇞0fXNbDø&'D7 C3u`O3-2aB"ni*e>3x^>WL4)j7Ĩgf4O\pzLVi-҈i IDAT9yNq$*P\7$$[cw-C;/\M Jiw7fT˕/$"%O+0Luy~QIvCUj%ffEtyw}yJ#ZIBS69_.ƄoYq^e|wG$^*6ņ"7tJ?QB<}!W#"/'?B{v'|ArEAyw~{Ousl^~` }ÚKi".3K/[v ld}|z@3>0FE;ʗ_~y +h|8 A w,إ8%3}ϸ|fyש>lmS;J18E{j{ĊAnޑmlo$nf\V*X3XOǟ0"22.ʌ]6f{t}fڽbR"jt^8M#`>㌿>L&CO4.>^"~p,|d;=3 4z ?oqGa EέO'#O=jfd=Twk?Pp%_9Tx&#v[@ $w!k_, m<- s?s±щ7c`/QeEgׅ4^&{zLI}|55[rppOۜ=co^>NOt/_h!q/-/?LLuO,8$B]Zgxm;^' ܽCKQ{B2ib K{tzeW0t@bݐ*KVVB bŭZPd'ױNcaFD5%$Y !ڞaݕeQ!ҪcWHJ+0 F$!7%:ehWbfl-X7fLyeRq.xy~e2%OD?E-J)|t8 $ؗ>kr?PƮ:T麁Ͽ2 gD"1+!87(k Bc`[+bytdwCpǬ ڤPSaж'7HJ qZya >cZ20/e=lXw8@gXc1`x{Gtj,#-ۖ#-ɊdIz2980f #U[ePm$~$\FzcOix@QUe ;#MQ ޳9>cRmo(=憪SxlG.zB+O1XH a͞<`ۖev4yﯨ0-W! YITd* ޏ!0Wʢ ",n!HU֤$pz}aԤ-Jiv5sagTC) )I6ŏ$89,,~D#`Oa.Gv>>~|mx}h/SX%N ad;|tt C~-8uJnBK4 Ӫ=Yˤc vEMRO#Ȍ)qLB)$|MC]oZ+bځ9 [6h%LSoUh4s?,id/gR y M }yqCtzB)Wm L#뉏d~4*ӊO_f{%9$/+&L3U/-OxS5.\n *oޠ>n8 LӀs34Jɯ5ʙi1G`Ma@W,1k A <!Q d@m_Y?d&p=˕sy):{"8vÙ40]O\__NS)mF|:1OW 7vi}ۮee^ pˀ2/?1뇉 ]۱-`;4Ǒa/9Of3{nߢL+)v[MM;F]/C|e #!H6 v$ 2#Ckvy^M4hY| 8*Ed#SaHrK$cwAn&7ZDp!4aQ`4E"˂=J ?7 UE "kV׸yk{bp uQdmdvϲxHz㯸0"E^!*#~'ph2@p]Np3+i(|ˌ4>~&H,cԝȍj Q`Dn{@D",LC:,+̞tnxz~F/_?$ ́;}|,9HX1|{pjʛwHê&eMYaS<}O|y%o"Ue?s|xǮH/50;_ο~b<+G2 ~u2+"8cw'f9{ÑoLna{2R@qدcvZzFȌsBY} kOJ"ØLTU_7VlHQdDbJ1Ӻtn&:0u!> RkB cG@J4e QGY.Z'L | J$Zy3]w! Q=wߠ;pAI֬&8(WoD33C%|\^!@HH!(˂ar8/l$ h(XܿB>g^z~#3e 6_]6"a| + "k* `Bg ,#,r^yN)L霻[+/T,VΕT=6/U5q Αuz /VOjD e^`s{9eZe5aKToҎd&gXQB+qŦ0[%[]HnJI&e"w c!bBYt֠5(-ǖ۲"*^u9wFΗ+]! $*VѡB`_Ԡ2TYfh(RƯl@\d:zRm9"5@R$0ӊ_nx:]HJDIْgέR&esCYק1\5:k@fkB{ڰܲߓ[2((,] 2UyY[@,g#mVr=)b=ʖ[~$cA)Eߵm<0B0-1,/%rKfW| uxx-9~#X-L+ϔ -kgxsCYi @<\V##?u,Qn HQ֤C?x{Oajvd9*D>#-Xqm~c[.g^k-TiUMJ*ׄg1ܔ5fvg34j3©%R$8]^D| DB|[CXn2A; 4\+gMMB$KQR$4 ڠTܢJ liy8y6(i9oÌQ\Ԝn)7 >$LV"[`!H ]5Tsi{#;\.pzMW ~:pf4ɵ4Y~2I ((Qx%]Iydo1G95HٲH2ܖՆlF@0ƈ,:"^{a-v8o=hOF{W7[ۚeTL_Yl=х/sܠK|e !/;rQM33#oS<<&ԄG#RocWğh6=k(e󸢕WZ DVR]l[&ew<ynY \1RYk\, y$lF pf^Fyj-wTvk- L\WHik-!- )H!W(늢`LE)AY) fhvڡ_BYd1:#U5deM\6)rbKSnQJGf}òin)# )F"6TY_/ C BD$ d(U"x(BrjiIkA(!9n)z%@}sC_扪*X܂`m%C^519h #1uW%đVZfڲ Pߤ -2ņy+r\uͶ,YD٪f&!`paDz7};T3[adNK2SxeUWG-fY-D֝RzFd^izY,^IزZ}4%D[y0pzy",3o߾g=yY1mU[x3ktfSXq1׃Tن^NL"9 CzA>39S,g=~|_TJO؇[&(eEuز $^uv4J2L>7ԓGKUJX?L|w(K 3hƉnB`e23uN`-yYRo/L~ft)f,V㖀=>_Nl?P4B9njq,x:]M9u´zۨMFy{J77-*pB.%Ds|pC8K~vS)aZWB^hϏ?7.]|q,ZRR%8Tj AJm,B)T(a}'(ܲ0:Ɗ V+H`% Z)q!-2=Rc:Me^ִ73b )[g ô^ǑpCFsvoڑۆL?|?-j{=1^;>=De#/^_ 7Ywwuж #fÂ[ZF&gm'fgB%ԡ癏@EJy;⦯XU_hDFߵ8,*2kAg˄8B4T6mn 24yUgR\PxLސ !0M#63ӈ='RȲ8ܼio:N0,'f|Zb-WxdgZebdd="TEA;4%} hͦxwwBFpF\ - ];е= p>LfwC^` _@ eYb$ cH8iYg Bysl[bl0.-(X򌳜a&y^ȽC6ۥI2Gt vXdy`3AH?1FBuEf4ݚT*0YNlno-fO%Cws&wl \y"Yd)6 "!x:CYKQUkrdzDVh. տLn vg2 Ia2(4o_%J=,qDPowܽ}K>>H{ĒzdE bF/yA۷%E]!M=2k{i,ktZ"CU6`wAwK0;[ t&t3ځ$0Eil;2#~˙Nׅ[X??ꙻvb>hv[ן vW om~w B Rۜ<~+qdf1_ɺexR96HJk4%y^۽D?\aݣ@%,"ibZ!)Is@-pJ/U5R( ES"A I5"biZȋ)'IHPō(=[bQ;+ dhi"3l8!GcBX["UFU5a@ }2[a2 1yH ԳL1i /3YSa[4`-on10 C@YfÇs_}TΰHp|:1 -q0+&h#P0OD!(X<;ɰ,j;@4he0:c8̔faDzOt3l76 r Kw-UfB @Yo)L7&vsȷSEw )Dy"Dq+4"GVe,}(`SC_iՑ#30ϛAȕ[mɪI9tnyzͲd/ 7t ُ0 )zG +/ϤcLcb[o)2g\cf8]Rq||@y;?@_ayaU @ϔ*(2 ɕ,~Lugy^# &De2rVn߳/\o%0^~G@"12d),uka&Ltd^Ln9H3ąs8[qS?w}qjVbX*8ykJ3v3.d. UeX/e41id-Ֆ=ko#e! 8h͞1kUw2h~<3{6iaDٿ 'RZJ;iyBbv[G CX S- Q*@(nTc"ħO\e0ėwn)73{>OgԻXjӆw9Z[׈1v%bi%̖E2+$ǵ'o(mQ 븽zH!z)x_g?⛷ސ4,4%fBa~Y֊=F+03F9j<Ϙ%-jG) O F[zQ &K W/!xO#J)vp<45`MvB+C[jBjo:ܠ;Q4 'Ӻ @U$$)#o'y綜6̄9_}%Hhc)ʆa!Cr g ,!f409o)s: 2Ei"3F@]P82q<0N#Ӽrb!SI!b-x|voh_~S ˏ܆/\%"SFNGz Uû{y ('&8b"3{)]23AC2NLHa,)(MaZp!3#7L\>}fRHX lvXW1C`Xf,_H?]3uUr|bo野ݽvB1RlD1C4Wۆ#)+!PT~3aa|@Yp:?ieqV!D *%AI;uĐ8Ę OfK ٰL 0"~M+K?0L3wXzRe!eYӶ{}F"I}[3%15fT1%|3Up\F{Hߟ/Z ͆ٮ.IyYg h)\P!x`^V1W,> ^W4BW7SH?WPdqJ KAh۶!CºruXۢ-̐=37"2=js`swDnrz.Yd4Tᐥ[ yB 4BB% $)fȐf6Y0g? ?l`3 (x/x hk#9E\UQ"fg#Eb3cLĮi1KDڕ$`#Z(I)_O%A("'XZapȻBd/ϫ|i#C[t#/9yʐ .lV8 W ͞n)j1$i 5RJymj.39TehngbhmPZe[*yJqRbjYG!9^z$?m"呾0FU@v>4^hvl2|< 2hށyB@:3t"1cȪ$dW0u$?牱[~4@әe8 '2J 3_e\e+PeN % ZyZJ%J[s|`k2";{)1N`d4o,J.\8T{/We&k8Y;̶a֞@c*JּΌb"F]f;i"<B_x:LmM+JJ^DaƑoc. }L\d όaFMk),$:(l#yi&@q=.P-2VA+Q+Mݶ+!"3]=,~Ah~_T)2bhVaw)kM) GSbsw CpjDu/!d]C_pvᇧ;PVZl542Ko[l6WoQ1F'n+dida52c9^ O`7%iu\l X\Ôf8-"lik)ؗ3ӏ\ā7h~3]/kebi*0CG-,rA7-/%oK cUyn ;k9O:G[""i(Q V,J"J_U$IZRfJg3U7[~/q̉"eBȕT5"jTZ[URi. p̓'p]tӬ443qxqD݅R>A8?"3t=q#șn(N?Pbv1ØMg 42MipN4Z~R O(@UۢH Iyljc' ۶]wDž;^^!)GHe\`>-)&ilxD (S)Q`dz%ȜF>Si:||BY0MǎTlʖĎF6F˘/L#9G hZӍUm$y"DN<KX8uE̞ u1)ԶFLtp"Aj[r-<ЍHaLK~'f- IDATuvUG.'8/+lJ]Rڒrӊ1EÙKb}~[~/t 7kT*)ԖMYs\ZL]L fw`i,I@i%q5FHݖ [r H1lLIJ,{ bw<<|G;kܳ?=~E(Xb{Z>=}GkJ K/Gic7dU͵(H1> 򙍘G8a1߬DF\7j9]Pힹ(ZNGDcM%'D8'DEonI5CaB }YU5Ǣ¼yjC`U$).(hrAIfz~||A OɳyG_[aRkk,? MKߟ7e(Ȋh~C#K'뛟\|P>K 8Hw-3!%ĸbC@ ѯ1aqݹ1)Y?N$V=^9C+SkGs,%)錫-qY ^4. އultg.gv0gCq-Hص:c#9yd .Z*/$$ Ȃ0{ҸBefZ:)~cׯch7-G*4/tۛwEa[DH ΖľdԄB2i,ꚦ(1gO/1MtW0 hm(eYcOOxAd Sc\Gy) 9<:i%0 VC((ʚe B.Kyb%R3DUZἆύ%DA[ IH(W5Z-vļ;}ʦ`n`"KoV#PfIRxH+HdA ׈u ;DL3ׄJ*Rʖݳiص(w9??X :i >Q&|no˼܆STf{ ]Hx~Ffګ-?~2.9blA/麞Yx'r|z|H~0uȺA o5f/xÞzOniO(*)ӟc>%yB8ve%d+ON&sw&HUXBX8>=pG=ә{n bw"FBۖsϾڲ3%cL:ƞz /uI4+X1$Ì4ٟno?GD´ 9$,K:c].Of_.|XSQWnCo34D .y;p<=rv̼_~HRm}\KxBH$ 8̄y!/gN;rZPJIb k\RJĵe$5㗙(oL32gZBXk-]:T)xU)^ԉf~ZˍBMC6nqdGvk)i7?>LL $)6@BbC!55$%@(1SaU)`Dc-BmA Rb~ug'_a@]A1J?.؆n󂳎yJv2eP77ybGKOQ9Đ~A*2Omv]YY1PWR+ֵ$1RD]()ʒ ~ʝa!ȚXk}NGnek; gaZ(gs3^HOdy CwFeSXWS%BksR#U!p ,H)J{k,[3 =0Nr0.#B]hr uQFPj:K\&LB%}B!4K8LsA9Z'ƀ~yK n!=Y&n|>2DŽq5-eegd7R4;5\Gn[.W5czlUF쉇=ElmhK~ٯ~p~|ᇩnq:f-aleIuB$9,7 3~c/<#Q!5fb?]]Tnh>' f,㌬ dFۿ[yC\q 錕j.~*B*xyďQDʺ 2 fwޣl[ KJBg 1.4q3톱 ,Hm"ӇDv'_p֭ٲ!R`ΉX֎nqY8* nofO;|I73l0fiAxy`OP_s=6xľ\[+ۈݿ9~͒~RN|G}guB &m^K9RXyY(T5(GAG^5TxOEʲZ%6)b]+@"aB6 :2iE p`qa~@8~ EI&3=J)6,?wmN1R)K Z`KfU;?uK׈fG*Vχ?ISdŴCBސk v=zOe,RTM ieD?#FhEBNJ8֖᚜]? DbO y94VqzyFIV}ڰ2!Qr]tMKYm-/״ӦiQҰt%"CJX)1g>=̼ C|$t/WOLTHgQƢÔ%fK|%@J6 )+T톘3X|HH3iEu_/Lt*PTe^aU䴐" %ZYlQ1ҁHؼa"1sxx!m-0!I)^(u5-UQR5RK_ s)֢nVW\1,o܂gbXmAZv `B*Qaᦛ(՟+ANeY^' RP sw$u әn)ښq!.?B; -Z1\ߢm!xFgۇn@hn6 3g);`^Eiy^zb]fSx!Vw=(2RhGa Vg NJQ!BH}4"$D[7~dY(+wUIR ^cՆh 3`j]#ę?Sn ^awF ~+_"|UDX$^ڒ2L?gg{pu_}G?#Q4xmndIu^xu&;ek7UªS[qS DJ@tMh$$/h ti<h"H^~j1{-4hSq+mZ!X JBG~q(iv b⵮!N#b(M- MIS)mmXZe%,]nHxox9LB=_ە^uĶ=<3XOWv=AB6Ƒj~j:;mX#F"gۆPwx<|y땰C(K{|D% ~gZ&6 )lACWo0BR4+hRH)35OX \~ae882 ;p-ǧ,y|zvim t"'՟\ΔRY~GR QO!˅md7 xYXu ];p/Xo#B wI1P(z"畒9E]O"۲r\2#J(C8ڶv$MۑRBAPcD~jFP\X-b""xt ݠ{ry'D.mĚL$]ndkY CJNtmjSXm i)V"8MB " Xk% ,dVirz#zY/=W9Ԗ-0οWIJЊFXR̹w<ٖx=3jB| Ŷ-Hi v8cBICʅsx:QBqawgݞ#4,F?QbDh }s@K8MG@,ן߾F&VT`,pRFJiASǿ` P5 -oZ"۲TIBלPlsk|X}dER3-WKh<$hU/ϟ*XȬie늸ܸ'ވȴ^"-uCCJ PH.o|2捐dlaׁ{n@Xj]2 59 |()ۡÉBe&O9tLӅ7R)XgqRpA"}*nj>B#l602l ?H0hi:{6=pNSoVBZcM˸,laEDhv<GJX+uRH!hۖ:U(Roۅu:׵r՜C~9˷W6?|PY[%a8{~!J*l9euUC؆T (U) T}k-ۆV#ÀׅxD̔TJQİuf:Aw|BG:(hbHƢ'TS‡=BVx0<>~:q<]NFCoʸ^x!1}"Zwkk"aɰ]%$ְ$EK~v.:;fpb$)0r'RݎZxv iٰ1.%+:cJd?ж!B.Rhʰ^&:c釆q]hCXi1O#3\ >p[}%ޮؒ譫Sf)(c)кG09z6J4ͤW Q#{' :r}wns 'nqǂ2M68&/|:2^'Y_}( m?!yO3_o ǟj<3 55m|܍./` q[XzSGJuwFIySm붱RKJj/UQKRB*2gNiz6|E@>gܼ`sdڮfIm"3ZcJ[_?aN+}@J mGN;Zط=t[᧙q=syV[ L& qcސH<}#@f ۞(*ak˩vk~2)}cYdTwkr^f>ߛO4MDzlթ31Fur;% :z.ӉPyRRmtɡ,Qj Kd3<|`b?~̾=8jgJ*DRr%L+ f/_""g5>YrB@Zr"F+ 6F j CF! 6D8%QJ3. IHi2J2%DL/%v=Jzz8-֔y,32EexB)슸]n-q8Mg @|zB51" Xo9N:Q2nQGK3xfÏo߿|,?|˯Dd\nh-) QжuxCtlN'ә8M,e +tAs|<a*95<Dze"3ôquZhCRP$L˂r=Vhg6F zrXG+'Ʊ74iG:֒ r9Z">F>p< ]y@D4D2q1RF2䀐u@To;pėa@ WJ JQ/De"P2u8URDr`^P:cȔ!6O'. uzȘ5/-]j:ڧ/,AFEW]G;yd= .uF/|ۏ8Qxș/Gbvd =XmK1S&݁^?y\^Gw5А|`5( T>, 'Ǫ/M5Ga@A4?sk!!'JhF#HlL[͚ȱ2Mӱ.B60gbZX׹a<όӍu+׸?cV0S҂KR5˥T IDATp v0 =:aG.%m(12;Mie/晦mH9Ѵ8~u䒘]8ucbvu&T;ɱ/¶BӴ,QX \-Bcsu Ivе|}c4!$l\GӴ\Ǒ?#$mv2˴SϊV4MW ӱkJpa%&o~d^FȶmhSmu+湊!N!MMbB)pTtՊmY*BXo1hAXF;B $`<]XiYz@*wTl!rBɁ.8awq 4QƇl3 5evm$1*ӆ-03nWAN HZ3#r?2NqŧF+19G۸P4r贑ݪJj嗒P`[n`M)Ʊ~\e"l!%Tc-Sv0y6_)bZh|`GWd'b+\Q\. #9q5g2'Jpp~#y;XrcyK74C˳x7 LS@4a@G~ W_TKlۼT#!1܈KCWJtMS"%X6m\jw:5_B46a69LJ+vCN]F"UA+K i0v5pMCJ>¢S 8Ov[XP0'0TV1hycYGV?!d"\0 eXZƑsi\u]}OYUo/yzz&'Xֹ-폩jUaY*0mpHZ=G#91 Dy5v{O,KD]O?Ӹ5αcۺ6-Z5m,0!BUa!&2􌠚#ȜBF@L4=&B 3a<.K #R%|0^ g5˹4b L#te]n(Yoph+ޯv;.F;5_c 8gx$p@ʂOor8~"iٖ%x:TvǙRi6Ն2i1]ۂ4/3ۙt;b`F!XֵF#<"萂5lYF5ƵĘ,1-1yw0u } VvT8r3|կN쇎.︮m֢+'a8=SfxyAv Ad:Pݲi<חgھ~b u8#̷€ +:r]ʾEMC1!BTC2Y(W-2(u[,B?쏏D1DWiĄ 6 ZMLa^W,7<@c,kt/rxLzڑNaEO+w?ǍS3^>ea6vkymS>~51FY ;jlۖeYhi/b+a^Ta9iTTuÆmk-1ռv2UkU=t@y٫(IoKuȄ =xeFlӐ:+Gx33R6H),ƻiw/B=Kj0V3.Pm1FF#:<]7mB hfZ<<38O}֖qI\ضO a2 Մ)Rb%޻=7rX@ 4(RI څ. ( gTauB*k=Ci:Gg71cLM{w]K.EQ\C]׭ˍR6zkRxm"yk#qXư?K :W;ZirCwαm3oX# >Q?eaFP-ZKr]Dz,R}_mb* OO/Ƶ<Gr¹EJeehfGDammr)9ZQ!=20#[3+o O{B} N3h))9"R"|c/ sJȬRmY_#~K _E}x5%TϷ1&~`0 _:Y`h$]   HjJGk-9 ; 04nWھSQ-ʹW\+'^o#)B@Q E sϏ8? d͋R↠Nu͙J@W]ʆ"#HZlSW't* )D({"K$@IJep<3AB _g) Q2߈IJFe$m팒!\K7@Q{xD SRbh@NFDnw|c<CDk :Dºq1l!'"6~ŔJΠuC̒q lET=]G  + i UhQ8^iI6}n7+?CBXY+"Wh^(ݰK$vb7w;51oQZ v]R#|x8+V_/' ضC6;Js4ءLCX#9` ״J fi|LH˅kk~ۑB"ZsE'Ii#e TʣRT~HL.Qm1֝KizDkH)'V=XSƢC(E@04ecm8LSXl-DҤɹ=QMsߣ$+4ú&օ@*/( .lˌ֒rike.p͑0]h&n ~/'YʆhgɱP~OV4mKI 4^BRiD4R ##B`Ez+]?Kc”vFk-gq+'+7˾1'f׊U[}Ķ`v}Lr͈~`J)5`L@=Hm}N>Hm< )nXTBpM4MGCt9t{ˍt}'$qa` OPN#k@r:e[iICb0ntжgNM7TG -3ypB8xqaS+I< N~yDoCoRV5+Eyc5&v{ZHo7ۙn{R:DmSk%DLt^jr{&kjXkR*oskThcY'Kvg֢ Ts0=>x ehF޹Xu]X֩Rl)"~cvw!(Qڀ9QJa%s KvȺLh8}$6Pj^N0 DE#:PJ`Yf\S msALX܅¶mxY g[5oĚIC5'L-G+awD VwXBj@bAlێ+m(9s?HnOLg|Faڎݮ(ƮR8#Bfb\l u]YyzcH 2QHt] *A>z2Iqd[G7%@kfI(y5+Gr_v\'u+}r=pxY[Hhb\0߮mv&QYAMGG2RU \hٰkL:H^&62Qm1-#ސd-S!)L"CѴG=ٳ{|"#`], ${v@)hK#huh]SQgn1F} mP4l++;o7MgT0xp`m8cif)'`Z%#} OL\8_cڢJK#2G4H8N|Rg4ǟʠe}O*^ߍkB]Y >x"gi{GDYZVitG0 Vc!!D$f}QJV<]P1LJQxGtP?p?M?pr)qZøyJh:lDL+1-N(/)-Ӊ(z2{m]: j Î 1&-t=Jʰ84MúƪluMA$ Ӟ}v RW~!e֨/qe ?}Ǭ5}s{v#*NmI~܀|kj?9oOyVM7|Z؋B[mBU=xc&Jd5m[q[oq51F"d"@!b \<>r*N_%pJ/289,y%DZ6g T.mnuym q7|ߙ4Oq|́_5nWg SAk0WǴ=dJǁ? _>amCΨ%WRxh^(naq!!@Z Jm/}Q L>RTkLY#B6D1 ́GfnzCвA-k)hATUlR40q|z Rɴ<|@ Yb{]!D\/؈7zE*F'(yaYn4[yՒݰ$\/(2BbSY)}ױ.=0'hZk[b9f:0iC_z񄸍eB7xp/#ѳ9[LkiAXJHqM[^ ~K"Ppr/xŷ:@ǫBRԆ@hc$xp(nG fHV;J넑TtR;]솮5߮uyrJt-m0Mw3~hӊ-zbPFn5TG!#]GVXYYR fv@ 5 ud<4=a(aC=Kc!FV20넖!=׵Fmpᅜ5ֶMh-9JxiO (=I8IZEᴜ3F֎K=xAM7@kM(c~dѰ{_aĽCڎǗE㼢#jL-6[thAzُ $nwu-jokx-72Z:|/xn8N,qhX##%jI<Ȇ#bBŀNp)A}xo~$Kţmh̉*.&DƯ_q2|RoEJ.3 ya7o|N%q|·/.TPFzoXxƐ$m׿e~fvF}RR(3书u%ˎkB?躖RoX]VCKqO&Hl, 2%.x^ł+A+W-{j9^QBi,K4JHIYWPJƘUS@*-#OU ZwĢtK۵BS̈"i\_BX)"XmڶͅTεl)Gp@$mgX˙Fku;gMv-41UVJ $$:HH ){٥BB _ȧRJH^kN^լi}ld;Zs)J1X]JHrm'-c;П̀-$udaQ)s,5 YWp'>h4O1FuJjAg; hQpxھER'tFv5P6=Rj ! VC b)}g=ӤRucLcGNuZ?&V(Chٜ#dT!Y@IMZ-"B(ӝd+žεߝ(SRAn(BHTe9 #hPv{ǔ۟0)rY8˵XYȜO?gbaoo3}Y2s4=_WLߑtE;B~wr.8e9ؔ`x_DZTkU:C`l\wta9n\/o-e.|@0N|]Cq,$tfFa;c;F t-@jL%t?<Tnֱ]pbOG.iŗL"ܟo6'(JA*҆BEҾ-C|)B1wAzm!r!z_WdM)a+T"֩;uE5-#7R>W&kՔ Y3BL󅸯R!u{QI(9߹QA*kd IDAT> uGG+c͑\Cľr) %-%bC@({̹D}Ts{)Z|j;B[3q|!c$XZH Zazњ 5U(mk)k'tO|)]OFÉ&mJ-AK`;_+L(5@38rQ&L.Ѭؒ@002U)JQ;J݁\ 7>rpO)r%;I9R[ |xHm| 9l. *)'Lgm4st]G߷TZPRLVZxxxBI>Vmm2`ڞq|@jvJWntbb7]o`&H5|&b=`t#TDBʄPI`!kDt䳧A]sʖ Ri~3cjӾ ɓR6J^Cn| ljT"7\IP@z}Qݿߖζ^RɩJ-aC*I*B-&5l?9>6'Ǟ\161vv>sZ}l'0sR[ZMVB}!E/ǧyE zT!+䔀BIM#f/Z,3}g)\7RFHg:MH?L"!u C\ ucK91&RbA$ rL}Ǒ)%"tkXBj!H64M mtE6Iɓκ 3Z9J8!%p:QPPڢt݈H[ LH"Bc*3܉ dj)_^}|h8A78Á"%1W-!UǭxmŇ֤kaXV)4$vTH"kYK<\Wi !&Ґ[b˯+)mCBL.WαeQ Tڿ5B8HBuTAH(\_Fy:01 ƾUA'$e#GFEvѝOHP0Q†r}J~ǯ+p=6 \<{Ot?rb,Xq3Ifb 0!>2^x>+y~ C5Po_\B Ktz`:R@x9dD˅4n\_8 THҹ}ʕֶC }[CLZ㘚طvC1?rLFLmgfmXףA"tGi"Sn˶=?%E(J=Rwte!{hfO}^J#E.'ļГS1ր$ )'ۍl!W@ݾ3ZqOkX>a]91qcOBܮRb`;ہД0+WtPG^ [=g)~y[G#xD.23dH 3|Ԇ[#SH6V\UNXV*QFXVdL%3C\/8!@m8gC?cK7?_F!:fd8 N J9KF;eyCO_QoI9ۘŎZ7֖Uơ o*#8Vm-4t!ƀ%)Jwm4ZZBh2o{8Roc ;AU ^8LivBPͷ.Ă;F+}D c59G}iqI)rXיZּ&]6(p)4ߛZ6Y kA-c-a-U|}gdJ-Zن W׈鲖BoM i`u8۵Rd֠J",3:S?LtSt(я֍<'y#ul1HKΠA(KE %%Г|w,/h ",Xھz(PNܖ +:$эq5K*-BS$v(13l˕ʶp,}&?ˁ~<C1P*7XcZSw[bFuuM BFTEj;\7jڞ8\oÀ:>16.+dH#bGad\ _x }iIKҾ~ym$Z!Pj kG$ 藙ͼά%V칼S߱%lY-Y=ڂ +b_%q\SEmPR)ȾqzSǶ0RDlh-mرol7PThX3O#_X}%V}p}%rRBDB=UIBKA+.6# XJ0ߐ>0^H4RߊTBt8w8F&Ƕ/x:~:S0_)rwo9"1jyxN&U,MєXRKJI0Ʋm7r%^)tmֵpUkDEst]+ U`T4 9ѻ,5'GE#ҹxHK$焠qhe')2/-*%{nfHh{\J &u%ueCBź/\B36R~fBH+9`MgJ辿sD)xƺƗJ_fRne@ 87ܱ$HQ q)Kh̾oR sJmRT\g@Dbii!)0Vh"m_WRk{ݿ76S@燧6Wn43%'yiZ~e[f䈠r89hۢáD1!*z\Z!9Jͱ 6|4.~llڨJK`5˂ȑNՒi.8͋V-Ak vىM k ukA1Hɠ\ZSEktG`.Ab s~}O +`YhQ1X敾45-$ R d<>-xe/ȼgt?Wplj-%+IFX^py޾$$"RfHAcL`݈ۊ-[*6f7< |;[8g Er8>m+y# ="p8 R[K@=(c)bPWRD馐oL-՚&Dן^xVJPJ;G RJdVuao)ckQ\gpnDaچZ!ŷV[@i8;09y0E;,Ez5DEIon~pg5C1߮lە߿RGL΁8} Gr̬ɣ@*ׯ~T8>}FX6bp8i5m `) R!E%VbJ)87p<>>BK5\(1JL"O,3ڡnBKCz(\:Phek5>(y߶e42T0/7N#9Wဵ]  aʾ%r~~;}Y))K!IAf.ׯ-.6+Ǡ *c#V^*ߛNjۺЏE+NOcX|:֝H!s:>b|:3{q΂h:;1 Ä B,^w^4$DLG{`:tfoLBF3(άڀjJmMߥnT(Rb]G;BƲ*◩ߝO/5>y;9vbd=qt!Sc,L %0Q N3vn`8AkVÈG>M 3_0ێZvTLÑt-q[TShɨW5%Vm;j62jV,FәZD^k򶳉z?]>zҚ"Vw֪=vҭN+$6ZP@v۲XʖJJ)Z soUdV12 }Oʥ0N$YGWfgrni:E[ME]u;HJih<$k5nlbx&HIu(h{m"guW-U X )RFn\rzr0¶mwHkmþF;1{P ,8T*raۖ[Bvc=tyRR[ZJ)uRe:0pάvEJ3c#J#Q9+mDJMÉ j#TRS+( }GnLA6Dත] ۾Re]x|83 gYgJi2c[ӑ󧏠cx8GEqpz`ç'~ /%5Y( DaX74M"ܖõShR3=R) uʰJ7}p|F mgGrH%PXcs6.W#rEiEI˺NU5 h:e)B͇m(|44ÑRH# AQ4sPKܔ kC!%Rj &P'VC7:o?Q|$n499Od=Bq"!^__8M¶Xaaes8pz~fMߧ k+#8#5JH}CQpݰA`e8<J^6L'"b+@7@4HzC Ś 14y;o,[Kص`+/^b#ax)\*Ǘ9ɓ_׽,\#O납痿pR WՏWځY=g]Zꗌz߻#Q 2jDgX+UNB2%eYMNm1iIJГRDm$P%[BBufÈϑ_}"\KM0clqmG*Z,Cf΄9d!@YrHTJIbJ} RNM+q"WBRRvP%hRp_kL3I!t;,$u=?|$LǤu۽eߴ17d~2L+tY0!]O* Rޗ?X Dٱ)Cvܽg6b}K {A ,RRhSz]Jca-c0R:cT 4 HHwR İ ~k/dvRj=";$iBv)d{un݃䰳޻TH PdžNXnDqgə2uTr|#c7p l#NZtoVK+%5%D---Tx{! vDzRͧ`Xo+%eyז2c$Ha5ڹ:vIR`5>GuYR;B6*駑$ GI53ӠV{P%T`]Xh.J D2k&Tݟ ^߈WSW+b⻏ Y.>xBF5l/"rS}K^iX+/}C(nbɂ9LW___cOP :lU-/$ta5~⻹^^ ,+n`YEbSJe8-k-Q`M=)5%y0`%ޗDDsXסteK·  ůE(-)R(Cp݀Px[Z>ZJCg f _ݻ.Ǝ6*eY~cYuZ[ץԷsΕwRtHDRR9 ǷߔKhI7d\K۱;!Vbx0C`:Md&@>6!|z5k臞hwd ` >4fZ;UT}'>~jl0!8t݄F,wlȶb+;ؖʢn-RP\ZNI>}Yl@QcւR7t@{{A_ i:+v#uDH&3әZ$xz|h c ۶1M!4Ϲ5FZn}-aww×;L)$aX/Wmayc {δCO$\E-Hɼ,ITPvO_55/xy.֙>XL=.D;GAWH3}t :OrSuA7&c zw^_Nou m;1Rh& ]4X" (Qz||3.h J,xԖX,'!n/oQit|}L&?|V-I_넫OoQye]T0OԖΰ3/aezӽ#fZa:51+a)rg?J MΕoGdm!_'751lgFebV 'NPJ?*/g~D _}CkGk/,#V9㜥~Y˼2"Q;z(xrrC1)Tޥm3M(k[OpRZzdf*2m{a$w ²ЍCYKI`>8]+!8*w/bŻ@вD'+]AɕϏw&x7R|YpDouȤ}?)qK;n,8>#D)A3R{ƑK#B̅eYNTr,4V*e%arDf: Ac$FIGQ˟z(--;ƀdly>n?%JDۋ!bf!Ř.7w)j=Q1@gdVAĤ]wÀ]0:ӃFޟ&J~8g9R/3C+fPqSI@ƗqAClqp֣}`r3LJ>Zq@I'x@37QwsG@ X1J7=>s7 (n }y _Þ^>8 +7r |K'x_u㋞Za;si&10ҟ'y0/ߓҁ1 癧> {7U|R{DAx:rLƱ.Z0Mṵ0zpfhǿ˜B'Zrsrp쑒$c*` í+:lxflT8:z}+|O7ǃO|J9z1<}7-ye2@G[(Y\4Z .}kK2hQG'0g4}JL[`X1zh.Sj 7?aj#|`jHJ0d*鉽T:_~ 4)*'(ߧ6 I/ cЊ}ƴb~?gLR]seQ뵼Cv1W>+-`M{ -{dؖpK!qUIK!FIVZ;N<j-'N)J_E-0.R`X%INfUdsG^%<%Z;IfЍ\ˍu^Au(WoR4p!] ($-T5w3JWsyF TR8.D)Qn2 Wy(5|LBJ޺fCIJ#VhkPI.]yPkZ{=4cKw%{iZ^XʃZm+J[yeY%OnI)b1jt*6_k}%ZZ_.eZ6͐gHd?Sk %W1ASj&˝-0Qmu$x ʈmhbl=F)TRVKGWTrs\+:1DX_}JbJNm ?(h6i&FftLox.85.sB!bJ$x޳V2=ӃZh趬iHgPgƐedPJq %_jK╾z^g$|cnLiMEs{;6Y,R29K9Zh$%EA>.yrJ@iZjڠi,a4:stĻG* 5gq&c"8x*Du%.M|L͍ThR(gB۷?%jEш:,aLR@ꉖRItB0=NCw5rVz438J,ㇱk,IKm kɥbP22F@S ,vA5IFn?10a*Mmm^l{jaK9j ͨWvU*q>US%ն؏;!L<;oWf[W ui%y|f X7 ˩V B-8Ih&7% Z;ډ~jB}sQFJP_6h%-{ۍs?U}-eV'wʑA?#nik^LACu4329xm3 Ibk[ŎH]dy⌑:l Hth@>bW旍Iut9?X:F RqZcX'U৉y{i@e`~_\VT^䋨%Q+Cp5LHQ: q~7FXq_NmJkmS+PyK'x 2>>/vv%ikgzԳWXZ9Ցn16H6YqȄSJe}N'n׭JŽJZ Iҕ`6p.R?Cjl/ra'IU?aC]%`C0eIKBK?jrrQ0\/BS*uPJڌ Ye<>,XPA fZމy[VrfC:I+%F(M6řTrDJ9鹕y^XTJ*`TъTNrϤrNPLbj0bVD?%(`J10 LˉLF1XI:C.='Z927'T(1Y{B苑%Lbjc ҤG;2=>`a5=M컄!{kʶ(VE&ph(=*ܶc'騹t3izb361 G.Oz/kCߌhcH2])E FAk1l8K.b_h~ccNI'G_ b3MqD18M+^k+9?7 OhosjSNc]v{XC,FPFzXgٶ;)E]p!0ۏX-Ȓqq'Gkft£ IDAT "YMp  P1dO~|4#*WRhDXוe*Z9/$$A#WDg˂}ui冁b"Ĵt$#۝7zKm" jG0KS^%O?z{5zXk)Z&U ^d'z,%8}&\*c9΄:!Dj2A=Q]wR<%:o?a\@HyO; /톙X뵌VWNr ;E[̠ 'KI~~9hc)(|(%ﻀe;dσًKŻ:9dyJ֟|gib^^,Bwѯu}3(ux'H!7V4˄IRTЩzjK'q2ɼrZM/frR9_zoc1躳A)e?I1K ){E@րz59˭wfw8Et-q"u|~ݠ%Fo2Z+Q;F)C+f)|hwn7qZ;N[>'эW⽠!Z#] 1v|XQó/4ͬ]$87pz!\aPn/)h %#AWq4pb ̳6/Nc,Ai!6a#$)Gsym5V P34v<"a |+WQS[RŽ(͕ ЍF R ]`4S例Us%ahZV~+ƱgF ]uf-㦕n l&555syXHW8rloϤXa!%\s03]yC T3কء`] 8~le[к3DZž䘮z`!85TӶ2m=aZXW ܶGcx Ao;J)>>Ǵ}i`Ä)nIZ zʤ5J{a/oiu!+EnRg>FxujMq\ D\3zhtWfz<MTzSiTCL ( ]JJN< OU৉a4è<׿A=ojA[KA-WdS]Lc`ZaqT׍]GKفL$Yk,g)3 Sc00ty7/FZN}}-w7ue7YX*et9 ?/쬣żlyVs塆E~ 3Jn, c qJCp饡G #C[/ݮ5U"ʏgk^k0,yִ HCZQj%Op2>ҁ}%kb4J쌛7QβDŽJBBX^u(gTK"dGSQb)5  YwgbYot%uĩ&ַ;&x6.UQxҢfyb<~Xi^yxN7T,:wDžf>:yN- ^5xGrrx8첲,Z)ZưlSZgLMmuC>Q4'jձV| F ;a5)cnt?|J .Ca& 3,tzIb`:(apJ1A|~{e[I̟c Y 1<J@U$ĥCCI,BX1s~|q/ yG /_ӂfºR!ʜĒ'/1g9 K@CJ Ef2"me 5aJrXɢHD]2"9Ah *=Q)D^ISC[I$tN՗~BmM)%L:aqu./ƾ?`yXܷ.q* Iǵ` mDTZσ0!_``? =v̼n(9,n?@γ_A˝)LiEo 3 =N)f3Ȕ)?Lσjry%Է.B]7ɍ.㖙ZD,8i]R=Zӟ S 2xfZhg?}P#;P3,2nwZX;K {v$_rD6v Č}r_~K^___Ư m`2! ycLh,Ӽ2M3y=^^t/ PMY4Mn&D)eX1fB݆7(UztIJ^k- $e.%4(QpOY\ɇEB]/O?ׯ_8&'DIe0lN=OD RY|$ 7l?>"bT!ƴ㽥E 9ZF@ J酡@ a0n 8JkCqL:9KIrhcP"4pʰ\Nm{aQA)eyu8tѷ5Y i"‚5U MʋUmɴ[_ŢnՍcdeSN }cQW{T)mCSZ2_z?1tw&iK\Tӄ{M>$YVug8SɹԒ7VmAu2 ucqr7ٛ"˼\ x9êsK‹n7Hu]`ZPJp;wi.hyviЊy?[cޱlw7¶&M.,Khˑ{'%bɾ*DUE zѣP|{pU>>>+ SXq.k߾ȦrWz<;MCOk}´jcx<8mJ&b[FPfya -f+bs5<Ƿ0oJk\S !KvqaҸܶoߘg"V,~+Z9w{n|Z2b6JfM\>a;v^C|pVy<>X:5si뤢j:F_\mWkz\/^Sɟ[%T(A])zCH5caweـ񚆔(g 1A{=Z"\4VvSB&U}`Qa&chZc݄+άuTcat gnr"L _~Xs<(Y FѴabnoPEJ&<f0019'$MW"dy;Z[pN2ySz¥ߣh+L{g^:H5iᶬ^IHAcBum/CŤ?5%Fj >P 3IGKN3VsLs_7hT 1f)SyFy̗?wyZYZG&^y"S'E]C匇[GG4){ӟ# f92Kd7v匾<2vtfv&+&) }\Y+'.3bRioh#5UWsƄw f*HĔζy!Ȁ}0*?ҍ3\sNh-ZÄ+2V[NU_ۚRZ/r+LcPr-C yG Z{*r$&q8x>n][49{DI'Z$͎&`^:4P"*4UIWɡOo0ttc<#-eZ|'y2kˡ$5g1<5ZN\*u:i؅i3Cg%՟r%Vdu~!y|iCzЎ[|e>۝*y,gZ}_fKUu vhjUKm`p1@ RHHmDm @\$%T9y23"kyxgSTpN) .Wg58;*nL:ͼpZJϤwv, U}O8gYW $ SETFӎj.{v9:5%~ D`>HPzZ3˺r:?b?8y`x:Hi6*wrUU7lEsP[ykQk{IH[b\"שqkm7BtVsI$VJ{IzJ\A-9O]!@6Oۇs5owA[~x$9=F >'±Z{ μJmZkXE1)?k,m(L:ꐧ[i=C8;&Z"6-\|лqI[kn.Ϧ]ZU{ާ4$*v0~Iqi)%Q}~8'^VL c[(l.`p %j`|MYltR.XV1G>2g6j ,6,/ܳ MU3Ŏ\+Vy8w% G2Ξ}$ PQ,7*8cRrs)ѹBGI{R#r<!ZR~#z ] ao(-Yg51xvR5ZC|vif Si VEznU45ɁW@%TZy)/k<tRtG+Ʌu1oS$wVl8La]Os jFSh |F+|}|)iN*.B ̬ UœφjiY!:{g7z)?.ә˗/~WZh@ueů'^NMεɭ Ʊ_+N\GyNrHa3]1,|OL2Ә}?&7xs=~Īd-IX.3ec#?hƬ/AS kPR ~j*ud3RYì`Vk#j\q,,·⼧ir?鿠9WF(33B: 1tPfڎeBXJKC ^^$c@1FJ0ZJ[_fKB9Pj?\0_qV[Fl oMea"Nom?hlį9%(8,]|D\N&1_kdVF˃,Xg K7ahA tcDq~9 (a4w ,T0T݉; NAShwbX0v iBt(5ѣRw,88%,$ NMl>$xKR5?睺?j1zP8@[r#eZD;\4?XhAM j%Xr" Z%AϨ2rÜV)*mLt8;%u=v+{‡vø^85\p'>hVu2:c=@7 p/=X&$eԊ[={nZFf4֡7d>ד|Ɍ`WRse9a.( މq!A9d-1AuӺ!,WlcНiWl\VS[&D׃OWn7\x%,Bd۹mUvc1^Œn ;:R1iܹ48N2}큙}k%?R#.C>pC?OO"h7oӕ'ʚ3[g&C=~!Zf<퐌A)Ii"FCN,w%R߾K ;:71 ̭OO{r#;Un% F.qIth@u]uXPyB۝҆6o5۱S& u*Yx9@6J,wZB̈́(xYպo;IrbqZTvyr-rdbQO<:L *Vc;x<6U3;[~hVN'ol60BWrh(&+-[:ubL f].q6P0D(${&7;ӕKLziޱF=AՠCj  3iQӬ8xY=pDmzVVxJN)_W6RcD1]>>p^%sVzzzr^ɹ<DV?8-gWRi p|%xaF'A 5*~YQC1jTJJGNA2]Fgh wZ9|%; ,$$iOG% jX/Vi5DO 4轕:%r1 F)|͊5(Z r&N.-NB?Ӎ uF,.8CGϠoǾKkb $֒.|qҺ6$ꕚ)^ yl\._X3r%NiAs?ȹCDc0R+F'rɖT1 J!GQF_ހ2Cp4VuY%q uؘh@'bBg=H dibSvF9,J <3C1MG*^t8$g24Fbtn,V(a~Jj++Zb}FI;NnFu4Ɛў3V/-O8dgt\\WCnUFBd4wgg<֟ȥ~~dΗ/XYNoJ*@SdžhZTF#H4ȨAI6F 2vqу6,Lp'zw\?`1QICj$-+ɖui̲ڶyX8%qo),¾=x7ji-?qՊvQvgc39X'ʊf Π88k*mwq +V%\KX+ ,WS}lLL٧(<>(u\_0r>_?e<$rKmRG]J0pMW!4og\Iֶ}yJsR$\k[aMd—lĺ,CP]q hk52PjUoa=8zyR{}V ! f\Ğ,s\.cmw=Ѻf'9|Q]78mm!ae֐rZk}ex@mR+tXxlX9N_ϯX/zPB=.%?/g ʁr8&rфЃm"q=kePƑoh%Z ~B}djHml6j >FѶ:Rʈ9 45`m%Ā兣._ԁx:˄/AZ)2i&,(1ZY2UJjVq FEFPfw2 @;8R8b` FfUo71c|j/r0o?Pep!r:_eWt^ϔ@ӇrDC܁Yy-F.Dn"+u¨ 5٧60(ǍZ5h__m ijIaVMJ6n)9Z%2*Vh897z#ܽ^hPsc:*عWZa _B A&k։0O[4cѯS%'2?rxm\2)5^FvE:3|v8adkhTvby]6I99Qzb = {}|JesbBDƜz;_#1$(F+uNYUzcy#jp:)Z@{ 0 qY^4PD(|tvvB8tmolvt)ActjT U<4hٓ?kYO&]l);2[G+1U: PBA>{ R ;D~\s8n0ZlԚ-R(y'f3vh8{[F /h[ ?e3"a~ӱ[,䬞C2ٷi$*5hZ&uZ;Zt:ֺI&(5Gr+-qyffWw&C˅&ZNmi<6gkI#釱)ώy/0G51%Ar䝮 quԺ:ll8/En2â@kSi]Çeu}еOH5PBQQZׅVvU #j.T_P`鸸v/y73 fRnZJ"5 淿:RsH`=ŕec¬+d3zZJqnbr{^1BdJk/sܦ`ClfaźϾ]2Cr8Q+@ڽ8r8_tsb؏|yAE ]XqƔR8҆ ִ.* vY1O'x8lSFn9!y3qf1\"Z=F:e`qŇ %S: fL !QҰn z)A] ǩWEʴ>{G8u֒D!8C?ZέKO;%(mqPsՌ1k[@1CNC@H8|('p ,D1Q."C2W>N zG9]n/oD2fg.B=%\2ɸ1.Sw_)C('.rbtu$!XpNjm[+zr}򅔲]O~bW,IT"˱ٯ!). xK "c׳KBa7i;E>`?uպ('k~nOPN_&˰jkQ# e X/ejE{^ nD+ű'Q.[(@uM_Vv#S`hVJP߻@>'19Os_悤ٽÙφ<3хD*:Cxg"F;~smhR,scZ\Jκ)!jnXUk@wʶay%#3Iww-kZ0(9`3`HjVBjѪ ޽7lƶ?9C0`)h%6CrbYd佱V\yR*GB;_~cK9V)zE>P sPClXnNmb t&{ʡhfk*p>/lۍc~2Akl\DA_q} ^ Hǎm r&Ĩ7Pq<2#wR>fkRZcY#? {9F*IZ/{#mwic]:iy4?A~l^"ѧ| N;t[`K⤻Q;%Wᕩ!I3G#9P8#m|A-D1vp.1r~L*H,H]Pm[4nbtyjoE- 07ciMц^ѧ+{@9W6FAwP㌧α3lRD 6&=V 5=O%+G]P,Z)TNFD[I.CWR,Gt%{;4WRɢǏx=h'?wvCWRN+OQ>~k>x_=<0ylm8 v Z8/b Fwg]Z3/`О\/WG/x,Dz..V({toЋCہn걣G}ҒmMZ^1-ݝma lhI)o+eŝ'A3A¼)+-qK ܶ_Bxl2 N3US+kAsadzȭviht˨i5p†H.ޕZFce;Y1G:&"c$`Fz5 zEyʲH0ej%TuvU8' v%AYK5f'KVjנC_9 IDATgYɮ(w!B{<sd_2Ji < =n63/ I|GǬga.E"ő7j,[R2Z) Z>[Ch޳ۀ'NA.wt4; [HH4mヴִؖ1B{ب4naMy^^^y<E%!T(V?Q)hw57B`4YG.,;rnh-Ԋ,;Te~5)mc'C$Hp<ָIS>(Io=[ '\c'M[zZ?MR uJSj ,KIIG~S2+9MH V1΢EkY18h rg@H~7/X:Ȃs3"h}UGvhqE,z26S I5gz AEcWZUʰ\άu> Ys硧яwJI^"7 Š'lx+Ο1QPuGk|,gŞ*~IKl1fSx>Gh -١>6wgr<9RLx$ƵEޫh]׳g8%8;$1+{=q<^P}M>>yQuqَ`tэpViDYeݘ+MJt>lYB٬>3G۶z%x:7Zm֒r/'q)ZGGsU8ta}=8\+UL$X+}׽ F\'4 7kHU93tA~9yiRElrc^J_rI&ՠK`j d;q9=&[&MMHiivsã<\7GB+^y RcGrSZ3NjDo.U^WN2Mp}}e31,߾p\ uhLp>>S]XgJ^ t|fTWNXOhC4to\/0,,1f?D[^ d.QF6K139hMpl1ӻqo^>k.0RE:hkp gRzf,)9ZڪVB^b(z#Ep.`$ϝ}>'¾*ą˕7bܷ䷬sN08ivb!9cӪ}}q$Z:3BP3KbD+uڋvfq{ѳd4z)R3tPJ{O\L)^N@.XR0:g<(?h1: 9,{M'ڱjDTu>b ЖSwǍq#wJ:?Ii0\^_ƠDu]]j# αoWؽ"\M9pt$;SбBo~/< B? zfUu˙Mģo~E*1zv~Ihu,,j lEHۍ ]ȳR(0-^+bQR2F)jδYnfQ]_mµy>0Oױj"S'JNO~CQ=v7D.pj1F@rtF{`|Ȳ)4QN gGњR q R[ HJʲßRԂum zbj JT-PW_H;c &$-z|3#* >no<老=.cA)=hɭP)?rv=p 1lL}k4J eZ3$jgX YF)2;J`2h-BO%ģQҀg z:i{r;Y1."mʾ3B+ )lAt23(]͔DЩANδI hr@-9n!;wCAVʱSol@/Xq^Uye/puQ֎5.j7zXi^0:oΞ^/{"H {)YFv肠Zc&f,|` ۷(c̯g&UӪ1e榟JycH/icv<:qMN]qYiCS@(i>a4ύ?kFlDl/ #Z qXRxG\Spjjpu,串uQM HP,v]Ffj]ZqVR1Qb1NP{ swF*CeAHێjr(e>b|6<9_^Q~E/W/ ̲w~c?BDkӌ+(nn0\Sn*lu|2D=硍!kQڠ!Vg q9MIF?;L bd~&?5~ bMDLE")qRJ=q=(00"V'Znȳ\I;c^TFX t6rЄ>gǞ8_Rxy}Ҍ*95w:.AugwxI}JU9Tp^~FR;r"DmQՠ-`n?w-дa]WґaG6s]%ezɴɢ)넢i\Je>VƐm+V5:bN%JaFT+e*5.H.-4An`CҬ!ri_mNq!@}ea/|k?zAIfpE:ӸQYu!<H%o= ~y{ҪL[{0p(i $e6f _yW⼛<# =Z,GLhCSE IaްފZyh_U]:5r;;ՌޥOzhŲ<Egp:zZ`OK Lm hCiw>1uEr՗C|%I\`K!F}J[VpH>]$ȞoּzZPF{cLNLN+5 ER;>f׸H Z?d_1; خq#g`tH˗!d_/'ry~ `I#]m/ * RZ:2\#eQ2AcdKc` @#6v,q!#]Zf4kCD|s!3K`eڲ}**:?dlVˆ6Ć6$1MS2k}am<#bX;Gs4,eH["Z7#[x};7ALaa].bE|)6䘲kGj NJd9ydajyTZOԜDlQy!@utȍbXsSs2Q+xr(ѻvEI )v!W?x|KBjn\ @ĕК,SοiJtݺBo,L{mґ0>j-49HI3:kt7*wEzj%"} 0By|ܙCwX+>\Rráb&'s.#(8Z iPVSZB90`ܨ땦: piҚ^;.7u)Ĵw@)WT{ŪNz|OH쨌 guJ(y` cSHn;G?~$S FI7?6. >-;Uȥ2Ƚ&=7z\Cs%Eg=’RGK e%_Ήׯ8+џ~i,%^2[뙧Օ|\Zi=(hr,+"L|9JIhtHGմ̯ÞZ%2/^8sT!7wB¶>29\.y1"V_ܱ:A8c1h\X>^Uρ$i <~`'.tl 3- )Jʘof k\Fu`:MRXGzQuc*٫L/$f`( X[UsR<^B\Hx~a/q#Su!Ԏ-C5Ҭ8p?/鵠{$I{H~l\H=8jJѨ"yJ?itw29A;my[ިEȰ.W&?IpHCcB'8J)QiX_YHҞؕf0C_OhcD[nQL `֎OS`;hS老χ8cѪ}-ո]ɤt5x씜Fq@X7HZW"mdn:%,xiYxc'ʅ_˾e芒2^;!S=R8qqn4yW,y|iކqL7:W0H'r5cWJo؎aylw`-oWbb4@ȧC:Η|P;chu tmd=>5Q(SPf*} LJ\@SrT]B~LDKzh[QfؙNTMi]7okUL)Y,J$='vФ+?<#牪 g=>L89b~ lzĕ n^_tKwڨlbҸo֌Nء;瘗QB 7 )uZZDE3,igFYSe;8iV,`_W+ZK!TNyh؆<Aʑ9?Pơf64z#V1]heMA4Ua\ob/Hh<<#{J;d 5cj>O-H0$cE֌zEElC5gycFVx xz+91713#0r;<9cu}CO!户8:s?h$nZx =g4kd̄669cS E^V ZyC@V?1M+ֆփe;qL*rz7dž0K4V1?ykR h *h:|yVU}`jbyJ*xE( KN򧙥NLkZ>z3}X 0S0RB+u$l)|:/bNh'R Z),|.T'(`7JK)WVWz˲`ۧ<]T|j LWGShG9?F\;ƔsJ! _s,y^X׋hvzer.XzAO9#ڄy~m8Or k>!xj2ϼ}bV<BS4<>4un/G;ͱx'd*n-]k1Mj (RU 25|D8f?J8)Zh$Qf,;QBU{/ )c ȣLicx963a4)̑(=>> V;r􁒑vAjB=1@5δ {eQjj3t]6FVyd:vl x+Y3J@{^RD+9sbՊHu71Te>0-W&7ѫ4vpSVeLeɱʭP B?CJj 3J=F/c-&qk<}KȄ(6\Ջ@,Z&׃rNj~$Noɭry Ap3h 5Km̿KwhT#eYDBBk\ J)2/IXcz{!}pM|B[R>IBLe`WzkgOT}K-2= K e3A;6Vz8fGﻡ vZ% "83˨ӵhq4m<΍Wl_8ύROz w-y8{LdJQrDi!Vur.R0ԌUfrUC.6R9` c,װ~) NZm6ճs0h~ IEBCܷ)884pz';*;O˅<:,Zep\֐R"%{%j0!ZY7Yjc_5zĝ3&tQzUGVrN,٢${U[!>%>AyiV񲾡%Wg(m8}=ILiY,Z@_kFNc]/-8zc]WA&ZQ phgVT<7 (kj 1Jݪ89N1l6^YVvRѭ3{O1rf=U;LXODw޲ǃiH ߌzyZY+zrrY/ܨa/]:~0ک`BNQt'ckac;˫x򲼮)\Nw 'zoK!,X k֙9s#KZN)j3~iZMuJ2," cWLmED6odawkmP֩!-d櫡V7 ⑙'ǾWVʴ,GLhM_ߥY.F֋4qhgi] tZユ@?D *aƻ;_;4Kkh̽2/ fT@T˅|`L#"Ɲ/LRK:%%[+4FjV۝uYPZޤ)%.M^,uIHQSi!0bRh"?(ljrO\o1~3nL&?@;F*FzwPXnB#2WR̺imR꜒K!ݐ*i DJE\Pr^HI,±kcSj/J2^q*Pii0ҫƙpt3 },͐W~+O.ri]!!8'gero3)J.Ԣ 5BoJ[mbJ д JJmu˗/ZL"mۆ߬!kB-]܌q{,dX?pQͨ[ N1`}: w/-W5D@r銚Vγ`ibym=hˊ{{+n8b(J`ƶm`/I7H Y*Q1ˍ2͸Oߡ3g͘7IgR81KANiLrŪb%,ꌄ˕cY+G;1HO-Q2yA@ԤY.WT2}Å^oJk$IFޙhTZ ~4?0M7R)-Y&,9h4oQO7Nkedis#V庿Ng6n7JX+hҥ"HOA ?Vz}fK8kxl( ~ubLJZJ+LNQ nYқ9r@WEjKXH)&n(*9%2*%v/J9Z\諌A.HT2VY evݍ^i{p"Ԧ n\?2ٓr7A *%Fbz`$0N%{be*˨˵foV뺲?a;XMY\A}T\H?)mH Oed4cbY)z.o%_h 63ӧ_~o݁[{?XB_'pLT?|J,lGFEw4dI[QT#'h9)`9r/u!:+vә>SzZ<旿4S /d1˕Vx(Vˮap}j.aZH%I8J'+9㤧JNq-g+V9S7ҧ~5znXͬ 5tv+-9)n|u œxn\/3%2I)"H½wE1WzkVMLvrҞ\Dyl̫NRrJgWP4@g2,˅b lZhs"}csa1 L:(2e:8ڎ<-faF'Q]0NfL`aaJ3.Qa# d-ȴ#X~Pό r8g1Sj)c牟&˅|f&aBJk;wtʘM_ɲ&ّ +R|]lgN_ʏ/+jLc;h-T9GZذ`''&t׎$˺0YO& q;:9sÚFN'$o))JSe/On*Y()x25),ercUt& ﴚ RJ#,T`U5Ob1< hA{ Vt-X.ЕE\J=Z:ֵj(%v:YsGFLn c:q{-:g)8ȼ,$98OMYYMN YJ7Bx{N:{؋$9 H:T&&,%aDLZ;->pgΏQgf˙s?3M +7x^ɋ{GpmO2^51i6-7/~;4OZD^"hNScߡQ7Y+jJ&Mji+u0~(_mJ䀔DͭHǹ/[uJ&Xm URNhc2}U"0g9?jd(qOT Sf<0ZaO*0IgL)K! h' ׯ_Ye ʽMxpˍy^ݘE-GۡsN~ƌNVmZZ $ܖ[%PkrP91: 'Fq|Ӽ:rm}J$ؚiHj0 [.OgH|8̙^JOiU;G}^漧[7Ӂp#D*BTi*]*9pH/srR(ueRcE x/}Woye^ra&#?`0kA=7rk @ni{^H)L뺊I'K'?hU%{g\\VLr羽)q"*C-JiY)[I*DX됢Ól d?u暚33X*8 . 1*pRܨJyf?N N  qBD,y1 {{a+MQRK&;yԋ Si%x:J",rY:%h7j[c)z > ,; cZc]@Z?M):;VRad)h1:`l Jf$tWPk&ӧ1@Yz"jZZ>gLhmYW)`kSR\K+uX6+TG#N 7Z&^c*з֥ݭ& c_tXZ[/ &-(*hr=[}c.{&5dh'K^* 03c< H?X4R|۳݌FL1珄/q>+$Toh-Mzm`52cSíIjejm\IqCx㩏2_$5PFɞ5oEz0nz\ZVft\܈|eJ ƈtrʄ_ơmq쀼K. mXhFAxVZ#~/{IQ)я+#YC8-;lb.3>, SRi)Q1J_yK8pb;=)2 KmS;=L҈Sr&ȕN/>9QEjL݄7^h5Kt,~pe|RbDeRssehr/WT*F,nKLWqMwԵL\$Og?9ShQr΋\r\ƣ3F:ChÅGk8e`1"iYĿkR>9xüH%Bkuu g}nuϭNů.s}+} "#?g۷qC[׳?FŶGNeUZ$[+|;%cSaAPoQ='rZ2籋yѫ>`9Эhʶ ߈ifR#iZ97;%LO\E AWzC wJ*rR 7.?G55wd5c]tҒ,IJuvY=wM2g(n]ȚK`* ZEJ_bڸ. ViJL /ײ9?Vݟh[/hk3R@O`„ 3'Z6h'b:h-2!^pRfYVHM6PhyA8O̐ipT+*Y:6jYbNҁu"q?>hZLTqȡ>$ jq,˅%Rj)iB)j980J$U{+*# wkǍܶXwQF+'Z0Ì7Zld.9[Dq$,aɒ 7jnB,Hx.z#{%$=\X&F ~<ã5R#)<- Cj-zCQ\xjF꠴T!au$pYjY %;nB)fXOL*0@:vjKTոRvr< >쇕Xf8 gu *jR-3羍%C6HU{Naf>J+5U4SX0? {igx/\ FRv<$9ѵ2ӵF0FQjICCɯdQ,w=^rɔ\-č2^~-0hjhYTgxcAL3f^Fi&" lHDOaA5V 6<رRQVƭy1F1ZtL(R=GѪQTƐIkYP=v)Tʫ h4)互2Nc)*y&A}h2j븉|KLmzeC/ XZAB'5j}6Лf^pv"}~T+iSXUl9~` aƇ@"jAH)&E}I 1rK{AnHoCN>*gmH9ه^ PZaG82Lk͐x\v<:8g_H]7IPq|k-O%rbe@y6:;QZLG>^iIir f]QkUʂ4-ꆮ0y- -ӿ IDATr~&xc^sTmLtVַVOJt}aE~]3h-7UJBmƌti-g9@f?dG2*zcYWeh&=X*)SAU]IV9C/t+3LaZ04r*0qqmۆߋ)ct5sNI-8H7eKEi9_eLXBXnri]#¤5z1zz#n~+& XO0ߨa%#FR+D/~]@s4bA6:O4};4`*idJ˽ӽS8#^RtE+ftԣ`Tڹa[Bޥ X*jĆ㏘&/P+-0 L+?bz3tW}wB6Pl_.?RBN;΁o3ut8Q2<-ݹwym]׻~߽{cugs-XX@"9ұ5IA$) ZA *)(Fт/ H8Zs{o}W ڜ[7Lk֜_=(e.E>( ۾4V@oco yO,~gE-6@+ۿlzmJ`j=,6`Z˽mZ'l0hFDfMdg J\?U=LJkE緢 r[*"^Ky2D TRYZkCۯyJw5F9Nd#s"m+xß5FZ'Ye*K1.JQlۓ>V(2tEldH#ѣ>vPxe Fׂ1Po;V2y>ߙۗ7^__q]1LLk$RgI3sXCp5| 8Sƈ7/x/}G^䘥엎}2O Q6LfǃV sOJC{Kp[lrDIŦ|ُYil|d |Ç GIYB-.RL1<(bKŪ>\M"VDqL6FfmIeT JD3֘3 oH*̳p`J9>>> IpyɭRje'DާwQ$U5u |\7BLEI%MKJCkJ^.iNW W6.@띺swo.{ϸ_~)3$bc VEwjoE]#0w;g YI6 HNA5Mr8x`D6ZUx7ɟeV/*9С9(‡q6;_he&?,؏e Y$QGn2Iaf1+Ȯl h̑-cuxoZ+5L9_꣟314(83p5F_c_=wJU=u*:QY&Ȗ%A&TL{d S0qROPtz,Ooo7E|/,)l\9Z׍=yH#۶q^61.~[F" :htRzd&,1b/s_wwHF򲛑-E=Sľ.XNRB%!]r!*wȥ\.Bܒ`<{e(Ra EjcOf`ghU){$cA]d4N}/ ,"83(ji/E曜CVJRl7&E$c(mc]yJ-KqRKq`-(%GuRk= S烮AKINQٙ;y]R#=w&cpA0&t iO%FUΒTn?XcbJu5DL!\Uv~Pξ>[&Z O:䐀f5Ck3{璶jriF^\zB/CSҜ~.Xh` ߫9+{JFf=6<0B2(#V8rctH!1f5LicЍ)gE B<9 c>g5ӅYf\fdh0S^?3dIv "[A/Z3F%4\7fc -+ymRhwQM XK7*4\NMV:M|/jyrD8ԧ4%v(֊##Z5 JA۶]U7{E~F"#Di B˙B܏^; qqc ?׳m8{qIFA ]O S8lbJapC8Z 6H̨AC`}!k)HTNo<߭r%<.{^.Y·\-ӫv[Q_!&E[` Ch1Hxg>pӌ&?L]ǟQug{ B)ENZ%")tw!T. nUx"ZgJ3(qy֏/bL^͛[bƁC*~On,`sq"%Cr+Y+ 7q"̓ddhW>@@ A^r[Z@+w~sU.MbNO}e^81P*o4%>X!RK'H77l7juJ) o/l,81rGEآB5 3KG]A¨wZԓaD_kQѺx=Pt FVGǿ>׳;ԙ$pE\"LTCn)% Ro\9j-< EuTZC.{K )cm|z C?H4rڨM>JҏɎZ}V.!0Jélϻ֐BƳ~OpVR`] iF[pΝ1?_sN>ٶwd(kA{CTv8}!9*3k93nXi1ʹG/?~\U??j»2|B8gį*57Vnt/d$0g-|iDB܋iW*܇gr_Jf^zß(55zkbzH)>Qk cHx}00R0Hd8(YT5*yJTK,W|yaBX.Ac"q:FɴGWg!iw~b:OL3}Z%f`]ć#\ t4B8pZ-ϔ,hq|tQIg>ԭ/h'͆7|Onי6z</7?|/o_^.1JN;D0ZK2wX$Mgr[ :mZrM\Fp3@/9˳<. h2{Rs &VJ0d.*mMOƨ,Vim/9v0]vV/ӂAGۮH8.{ ;I$j?k=g$F4OTGz5fK]m$ 2zS$1#Z »ðZ3aEE=JޏԦD eHqa†{|[Ğ7 ^iEFXh(Ӱev nN[nt3Yq:;Z۶E)MѨ~F ZD6:]b1}(Np"_ފبYY翹F/y~}HX7aQBbz7 N Ǫ5/C|Kh/x?0SNA"X Fk?-V<;ˢ,'g'Ifݭ(k}k4 q8c$tސEΧ{!jRHI4v|ogoĝw^2V| ab[3+3rp.r]y<\`-efvư§$#&8rX(>$pr|—/_sLL!O;Vxxg.Ik+9> lۊA䲽a'K^VKɌ&" Xx&F)< #.1-J=ISct!Jq^6)ڸ^/O291niH룥Qdi߆uw*IE,sX拨FاA)_Ic|宅HL 0]~=d)kuh ]r0օD!2`cD.ֶκ>rg4( CY-cCO"3fqY.;P{cSYŔkd/_۪02'i}YE pS5>$Pe)%l,Wd8k$fv&>Te`L\j Ӕ♧EgrԪ.wu9T)][ZsJX.t0M.RLia GpBEǀ>1΋dD8#k:L7a]?/@ٞ*bAj#,|mk)J.F0ɃcxYZ$V ۶?DJ{Vx%>O.4I>- eyř$2T| L")e)`J+D]~b.u=D@`bO;$^>C|d9(7ˍuS-Z%L>cRyEP;Y2KS+uѪZe09Rʊ ia8F_d2o7~b`M\n1N!uw;yq5~8ux<},1Yj`|lO33? v`:ʁsgZ.XY3$v5>BiU%i> \V)dmͼ^^xolyc7FFȶdl0^cň:yJɥs^)\piG.s٣n߼޾`VeV)n7,98/B[d5CTeJsyya8zM>DB at-g%S[Ͳw֓B'R3lJ01+CKYw),x/y$o;-=luccDzz}0kRs gy&u=#UC Vtla<8g煔&ϕ=+)8.ɥ${Y*C uztvf6KpeRO WØA1JUjmǪw9Sホ@SzىB*r;HZgei98/QQ@^'(U?4%zt4-d(vBm4Rr񱡔B;)"^]"Z2e`2c'Mm}zoi}ƱId1L lazUwVi@j ӄ]zJBK R.N3Ly`U>t4U ʨ`Ë"'{ò\啽␴z:4#B֑MqNT!(tc\;d 1>_Æ`Sću`?޹K!@a9g;^1F%b9YCkC|laRxCNdtɶQPJ+XZZ[QRq3mjeD9 g&a H 3K8G&V]ݐ=fyf C+кF?xo59`ۨZQ*g',Q`PE~I \|>H/d ʘk;;Aϗ*AgWޓ,lC 1Qk#R,N}(T+kNLum{gVainjnU=)Rmo&gvhnEʔX#|2}a^6~H{dQFZaihZ@3K&uWaϲW[|:-P6Ǔ&; V(U1c\u;ǵGqrn|]$*/[.$wjYgl+užwB-Ņ37>P]9sMBC$"hh`|`[wi"Yg+Y$tv; gdpM4eƘ>x><ʛ EwVZ䌆];ҚJL|;[{km8`8YD+31zU)ziFUJE76(C<0+9^^_T(V |ǝZ$[mփ5x!18h*+`0z#*]g* c"۫3 xClnP " mi"qG"]EzOlkuP@7D. ǿU[9e T RUыxZmVtOϭ;r :V7Jam>*z<93;a< zy\xJf vFm>C2կ~}ӯw ;E/Ǔa ܯ ;D)d<.1ԮkCF=C hB>$d O) dF!:0pVܿv`L dz2`čpsz|:RX0XՋq^y>;µ2FgB8 bhCNmyRS̊;/ug,6^@;Oŕ1Cn+{~r%MDHrDf ϳ/`UFC_-ok?&:LHk_xw|9б˛P9F- !om| yu"j9;\>r4-F.HB`PkV[qi`gu!LXV;n2>>}ř` 9|yߡzθ'{xtA]tHk6_9>*1&)ր靲D#v}h9FHJPՠ;;>vc0d bHqRP~m =8=G~`1J5M',T _zwĤNky?xҍM*W22I*\.""3Q ISUU#L^'+3w;,d+;wF*Q kfʶ?XJˊxZ&p~Nxw)t4 !aY'@S,iQZۆבyee4uJJ20ZS`/2t)  -}; '̆{W){&o ΒÖJOl t}}0aV}лT]7̚2>) ,̨֊v7y#տ[فԃ^ӫ nW t ^^_y{+-T,"uN&y2E!YBW<[ٲPEWp5lŤ{;TV˲W:Rce˯ιFZy ê.UwF(1~G~|ya#ZUY9X7)LQbL(5 =KjZg0-Loк6DZɿ?p ”K2K0[%֙j#rd羾o7ӚNt<+׫hue4<ƈA e^B"8Y2cq:wָ%4Xhm`}T.\asa߳'Ͳ_ qZ&Pu!VBJY Hq" X,ϤlR+J1o.*| f6G00E@NhRZԥp yjqЁFDe,yo>\z}a'}!ZѪ\>_n/M>^ u_ʾl",Gz/Caz^kkι_ֹ\f tS$Q۾Id}j,U0EAeHn%8izogr7^n7ϝreͅ&O5ƶ.Lm`]q?}iƥt #6r. 劻\:6x~oa!2iuܞ!>l=ؘ#Aa [mi/)YQŌAi k ,>&GcG.fEZ8gj5pҽ*DH*Y*)6 N1ƟʜtJY34yMa!N Ë(mQ \*UxSH^29bUemDJK&)qKJr;[q[g>UsgNTq3j4y`*>4~)vAAHHoDg$k(nl/%#*ad zhtstǶㆎ, {LɓiJ<<n/w޵ ~e, zSt%Qh[+gcu6)ITx悔K0ě)ApX1"l#xFˍ^۶]b]7i39KrXkْŮ1}˺[hL4s֛N=j^\*חWV^>Rep-?Dhz)᲋*РK}U_8`fg+Oeg|cPz ,.x.AdVm]1Q2Ijk\ (F”^r䜗VSG9fFUdhƺ>E`_ۄ[n\[PV,.Rp}r{4Q'~|. ^$! 1D!>bL9Gj#S͕V80Rdf >F<mJ&D}8TưBRAcY&Zt/=!by͡(F\@j$<.X׃ {^J);gCfGjDz,:Y:V\ Y9_ל$pwo*rhՅW`_.*cy9qY>4E޾%zkO_?'1/~`"M{r]+Vvcg+b*`-<7^gʼn):&0Ǡ.B cKUĎhЀP׃83R1X&eu2z"C];]1Jgʨbi'54Ȟ4ZPBsHie9gOᇠy>i!aI.KeB(hQc4DTot.QҤψ1|FUHҵVj s ۥ?# 6lϬ#VGEx1"I#'"Rv ڿBRw]ɱϿ&\ֱfɔq>ppS#`iJF'Ɩx 󺳤(K/I7gw)£=J`$";PM9K%:Y^nf7?۝^ #W<qr_WF<̒P;}>iNPkT2i!1o2;: xQsܐP^(143VΓ|^VQ|)T/Xlk$}2spV@Ct)z3LhZY(pz2Τ:QGoI.*I?"X㾒Gye'tR)kPv\.Sl*VOrYG.傔p" ~O.]0#>Ny4UX+a<2;Om]U'*EhxS7t1SHMcD|챼[ uTFUcyk;&3F.tspj򠕝!yy+Av)!zM.x`A8#eyr+N4Mjd\3KGl08')]$ z·6>῵* ,Rs{[z/8$R1 e$lJیy5C"cY(y7qXCs;ODǾ~[I3MIf!Jdhp[1o `'CQrzI&@('H:,Ro2(;}/ľҹF,rᩉ1nO8#F/m(u}1 y+yӯ'cBg׊ rFm5s\0sex||ད 1t.TsMrq$W]]mSn} IFc0(~/" RJ O?#K|]LK$H-bV?Ĉx(0s%*'駹tLIv"-gurjMЀ' "fcQ1ήd(ŚA-3׌w^q<:3Dgh0QAZ? *). lpvċOeU56* c}|S&ԻRja8 Hq{] ,I] օ[л?UwZdGpK^e,eb & udvZ$jo5V 2ЛgJ^-3zCÇ !Dg(@!J=8> U cgrHT_նm{}9{:UV1PY"F)D yA <$R*%H %!PTArnk1zo\{}Y{9G.˃qbϊ/(DPp8r>a=<׀шq|?gQf IDATh ^+R+ǑV|Cp5aLpdqCM/t7R|X cdX/ 1p(c"c )NZFJ% 0㟆 թ3e.nȭ3{&DLm0 ?~Ù ,5#̎U>bsΣ'F'ptxB-c`Qs`S|<1s|b*ʃ}g[;DUbl ĭ͹mȥ0&Ї %gu41H5Ac\wr1#!l.qJI-&ɜ ^3Tiy!f!6pV;^kC*'|pXMFp9/TJ/?+y]+dgb(ANaӬ<֪ d`N+X\2ZѢlL iM֋d3}lvКUDb9.c0!+e{^'^JvAu yz֝ aQd. uѠ1tqs<6t: SM8eDgpm$(- ;F׈~C9=QZ!xd±Yx5ns0KBpmPh2r*Xo3sg ;\i+|Cץ\t6D6ٗft1q= RystY]1*zèNO@B MuȨO?kOZgDŽ:2.to5tK)8KbCpQ m=-C׬G.0ku>ZcDĶG^#R)оm 8w(t!c0a4avrjv.{5hΣ,ﲇߕK+ˣ6Z$p JYP֠vc%+qu揭\m;vl/;7c2׷kq9Ԇh_"WUז㈣.¸mQ_݇-T0JC 9Z9?HO^!CWx.S]uV:%c 籆FRy.$v2+@g[0IqԲ g9¾o2(W3gHUDX>acН\VrFhع(s@#=Ȏ~q0Ƭb&-R~@v\P[d^ŀGxeK8t6a 78ld>}=13|X|/˴CE1Z}G'BtZVb@WkBS'F ZW`(mP4CF-F' {UqCRiNO "mgX c'r>ࣿ}w*tQ]ܹs}of/P֟W1鬼 u4~e ;p`f%O*(9v1D|7Ӊq$q1IPІlLt]1B7|2*ZzB͉=q(Z&-qGJOXC̑>V+8WiZl}hutv/Ԝfu IO !\0A^^^a;J^ s։xU[kQsP#7Z͋:P +|]bZla Jyy]:DZ뿶m<>3Z-(viM8[ m{f¯jIjkH);becI1Dv&V_*u\Dk^ kl‘:E:/itbSV)VTaj=NjΜGm:%O?|VRtmClOD9J,HbC8x<ӫJirp~?^my<9M.MajE{)!l`[|6m=uL? >z|‡ ?jʺ*h"y_vXcѸw"pe!k0TEvu4efj c#|R}f{X5Fn80P6Fi&s'*2ʱjr u(l ˆIBOL (k'p5iTu~%Hgt%gN⭱A rN*_ 5o(3.88.W1&1npnC- )װXv{x1Q1g`'=ޡo'UOhćCcOV|>͡Д;О$ewL[ &8o%'!) N  G r94$\v+ݥtCsO_.D>0SB)~*p6;,Ta4bDRBWm*(`MFnKጿUlaN1O.7XØCJ+80H!]iJGQ iPZBC!?#aJxLsxOwp{)]Pz'ΜFpF 5 V|y'/`Kk,RСȰm{ x o)on?Sj[8C9f g19|bγ`cR+2gz }Q+;m)?J~uƄJ*Ď \J뾡 1"W.xru8Z&_O(ЦA 7s[Fc&n;ҙ|yoR B(DIL(/]!^q}WKioU)tfw1^exg߀ >^^^|>[w&UpI8ʅw"\R#0ƣ,P8`r:{m#zu0aqpTR9ɀvW׶TgTӬ/Xa4u|rn}ɥ%I$0GIGGz*cG=JMh g8R>?#aGmF  :&4*UpJm9;, ]+BHϟa kLQ 3~7FW3 A(q2FT6Xo\x6tPq{*[ƮCԒKxBEݞj9 0x{ݡ'ckY!#6vFr2 on`<|F9kCŜT>NvxiآH2pctx`0%glE~2vFq`4 Z[1.&,]F;׽;jmp>p1 oootqKd%Ji"2bg=k(nގLVh}`ʎ+ ˝=B]o#0qG"b1]K4]S$c;s~gEp49rjFͰ C;rƄ6w`~LbeyLÅ$Ŀdm]XO)Cg+Sc1xtr "7b"vЁvlYjvV;}?_v+5 !<ZvK(+5yIwƗyJ9⮯BuDk|&{~ocU)Y)_6KVKO8g?>~+ɏE޶ پ.=,Jho\xYA}kU!@T fZ.tu\8iK6p[y`K";$??R#4$N.ػ# úc#ab*7J!W;3hg XJ`lD/ 7z<ˁO^Pz:lfC(uhiid- 6:ut L&)F+4`kC[ >c),59ޣ0EsD<9g y!' (R8mCk [_aM[R >}9FRmj]Yz#(Cx_/(vB1]?_sXkO͡aF"8Nrp2/qv)<U`ZyE Vh.D!>%Wk>D:/Rdt࠴Foo2Y/,9ej3zc"|R[D`hajCְ +4;ڄsRJKҢ5Tq Dxbux|fڕ "\pɜOYHFsP2%.x@3sD3nZGh@ضx2E(P@1;M9FWwXKLheҲ j%g}^hV;^^^E͸0AFTK^TZ~xA-bH9ILoS%^ 7c 2V2N$cTA]>h54-לm__< I%KNKkzZ!6`j =(fNk8=LYtpV[ڀh]e;L'bwZjA̖Qa6ʇstcȬRQ.ΙiZs"2[qvGC׆0$.3^}ꄦwBu ;:%c&ՉVF-xǯj>F y^*3˜3^__[1jfem1W\F7icVZc?f;m4DvN&Yɏ=&(.՚џσ.nS˸(Ek6: {JkO3($!$w(02hN6$z3CnH)!!hՔKŶoȥ" <;ri@\(M VC| DŽMG:qr! R\; s\Y2AGv[qۑGU:p tr8N.1J)mpuCTJb(`i{O-5]* .II<{|مLHca/61术qlIxҡ5i L@jp.7 -$QK!ғㆷ"L& o 9]8ϡXHWЍE6Du8HQ`)Q– *sS'9ShFdy=(en Z+ؼz 6QqiVP@V9d5WJaw{1:9+z 3fQO9eXo* I4Γr5[]ŵ=ޞbxJE"0tVe1:+m >|(-=/\Nβkf[I\Z[OQQkQڢg `<¥߾a<]SMK]Ҷyz!8Z3e`&P^ָYl%]KF +ynͬ[譊y@[dvn-4̢WUE.3d1 pL`BV6!Ǎ2J"96a _ƶݡ`72~haNOZK0V !z橏m߶ 5KXTj ۶{A)q\#e1^RCIR =71Q jnP^\6KLk;lY l'ClauƑUh.Ud&4rB1 GmtEqIs4@wف F8H04^Kn K"IZ`F a \"q=Oz ?$(.b'h^^8Zkp/e-Ri_GqbdJ.&r)(V&nMT{Z}ǘb͢?0rX ەZ>y~+h7SJǔ6#{_\wƘIT 8r`,ET,}~:%1FD73CXAWcpR<5W_&-,+^j8q1B?Ș-`߷]EZ7G*q`nCp㶿b7 :Qj(~~gr8~9wГ@;p<Vσc JR}h_aG rFiL8 Tc z6Pѥeւ!Y?9(}EF6S:YU[!͂#n""!t #j}UП8mR!+1{8v,}w5cPƾw?)AU@7(}HRLKU+ :)n10C,`xpFv|,(ltk1nFk/3!J) \z6xc {ڼH2N@F { с3'Qxvygz ~IЈN;5|_\/Z6Q J2 IDATv(`n#* LS610Ñ `ˈx־ReZk'DLEZ n.Hw!KvP|Qڻň8-JeN(&K1hNxi9Sv5βJVJ#r؆F\>@:4#Ta*Ex_U"ߝ5+26ް++(qAo k8ۆ*1r<':< y;R!lR8&7:wH%c( / j!6| ?|đEU;ңIޅR SƚG/>B2^?wFM7>1J<P\MV?jB͒J\lc6Մd-f'ӾG.w*4|I_q>dF1uKi~cRkL/.?w}Ѧ;B7>`ldLX+kĩ gd{vji燻,p##2EگE Ns۶3hkYk̩?_Jf7Zep>q>a,ǞMN"/n}+(Kdz?n/a'kZXaM X]1 .FnƅrTJK>WL[8̡14Cw QTw| f`1bmtIT-b":])M6xү^j^y=y-SJt-׭oea\TD9Nt?j\*v]*sRB;%+!PhE]p.IMu}J$5h阺HM 7=H4hJe= ?<%SG2fc "UU'0q]!L=vLP[Et~aHsH\FUO<+V _QC\ ~KAĮV%@ci օQF11QGqfң;LɌY*/d@u488gZZK$1&2BcxT LX))(.Z 0XTr|M<'>~R:va#'mai3\L^Zb Vվ< .чC(eJ[@Q;d'T)=1υ[]+b% \{|^)r){ Ą!_α,9=}G/ětFLIJـ QfWq!Z #'KQ76x!`=+F!*MHdC.P, &>={{~5CDȰ7.8fi& ,o6/Xqw,]1F䜀1f_p@|zxGO avX(P"ǚ .1 _[>uEk^V=⥝*ؼ@L9%(#u׵ֿK_ n"N-"n;t`p <Ԇ)R$_ޓY3G:m;3( %6< p'݉iC.xl!2mr(C/kKq$w8![r"})hF?}]z[֯L&yJD3jtݔ20V_WN<'G`lj!7FMa_ovH<$d6>me^~en z!۝܇ 3n0~x[ȜKZګ]u-+rWPZkC.H,-f<e!0)Вl`k}@c\9_߆_11:s7a**5a^igB+J)xi2Vn10&848kP =POdZa MDž˜`$q9E /yMzל;g4D(/$:9zc^.h,"o<l2!B憴ʐڲr|1Æ86sμ0)0 ԉf vMPd2}Nb.Ĺ/bXъAoCCF yv~Gǘr(Vjߔw{㪑.PT[7B +r;](ռ_MQr :.CN'I ^̡t Nl7*6Ȃ+g Ϫ+#"`J2`&;n502{cv>`JC}^8)`0"]jyPmHXIXhkhtVUTQ*6 k wGl͵ &#kVBKvSIF)}2ƀۅ.7횝>jgL##D(E5%W6N =o^ZeT(wmsC+O !eNVJQ AP.f78ǩr񩉚NzX<;F)sO%ԝA)I) /~pc`BŤI0ZBoɵ#=r@2Kgci>eK.u)[!KǙ I=Jb*,^(bpb=$p}`7h<)d3׌^I6i/!۶]rm8{ʋzaQ`l`|"JYLy!Os:M)e*__EvL˩62/Ƕ5Ypo!J4.j'1'!R39xG)'me-wĴh ڢ_~k'@;nW]""Rj)#NA1q<9 J a, )Dž Q 9Q)ւ >(? 贠Awr"Ni5#Q{U4AJO;zwN\"jW\sWcm?Z"僾FTBbHT-$Ď_0߁a D˧UXCX #Z4wMJFCc*ĶHhY"EJ/j~Pb_%ׂ)*RBm6|HfC92v[73RDKsg,j)]?!0.Qy&v=9x׈^) cNxo~\̳KRsB!K+>8' !~Kʺo/׍%1&UnTh8 Wi:036y8mF%qBomx>&6̤RepvfY.2u4aLR*hԛׂ}Yk`h ;> iV4<eT'@C!;جAO4>lUyx=``PR>^~[_wӿZkD*v儉|'cffj+P61tN&P2@{e֨JuBQJ8>'=:e0:۾09Ĉ5P[TT]>Q lqY+tL} ڠ`u yLQP!l/hM}b'Mz1݅ O pQ`@'e7) 4DcAm'RçO..{+c=L315I1׿5F oO!К¶0:} |u/WڜWԒab'5!n(Vi>Tp!vT׹kcԔtΔ3 h-z dU&hэQ̀Z15Zy@O?6oPNqڢj 6(aLDnK=! \NCِtüy4Z0wi8S^ǯ§7QzuۈD@0JRwZzZeT ]$R[%5l.A>`I[ݥ~yVnwqҩL}}DVXk=S"'fF"O U4t1Õa} vEMvE)l5}`rL8jvYRj`Dk=bv6.D92[H4;Zx=PDp.g6N+30#l髥XwO[ጠػX[0c z<@.gAj/]p^3+4ƄIh$v Ԋ}qh"Ԗ1:Ͻ>Gv;/)lU/Zkѩ0{,~$Yd.P:h⡵V4U_J g,<<9ЎV.c Q' VE˸KG* ?g ["m' OXeFi'jM. d\ -E5z.0Q }șD İbTXȼ8V;:k%/9vLry^:"XpH<34^a[kͨ+ R2jlAY 92p74G՟ c=jI#1D썹 7E1E2}.K&#*ׂsuke6)"dO%0Iˈ^QF6Εƾ~5 JR91vZi'mA=:F9ZkFk Z *lR"( J$!F !DAɞ^v]Wjݚg9Z{ T b _bC ; l *^VR#\Ihթ֜ac9jjH ̊Ѽz+uE]^vx0zWem;r({фRC8\"3<7z9GsqM5 bcr1eM1.h)9ŞhDc\zK2lGLHzXe1EUɽ>@yhb#u\z6Dtj*&HGYiGkցsy쯖:HQIgM$>@x2jYqRN`1tT2-&CՆVJThBaDO`ʚg<*3<}YqepmCRCQmk=",[p4&("LGbGm]O4>*T` Rɮiǟ:eaT\AcO׫&=@EﺧkV3 q f{<.4sqj0)>\P-= c0J-p+\lŦY2|ȈiF.qBTNN$Ց@CD_{PpzC@)']%e7#_D+S-ve'( | Y IDATpz( yyюNXUgc4])a{J91 s1ƿ~V~M]IݺdԺjQUQp2tc"SĔg0-HCuqmP]Zama$UFKdܿ c{kH_ejA⪸чʧeQ7ԲM=29vDi} O3غe^S7ؤ{ݎ339<%t9Bl1K9|tDSmE2OBjL1ANY1MZZ~~yՈFE婖mN`t X׻~c!y" iY7L+ "4M9kiXTzf{}]Ԋv#X|vSϋhu4'uˎڧ'ܿ  1bpJOhFJ2C/$yEf.h:0/O!2fh D'ற}(p#UQZfIJƾ\. ,\.W6M|r$Oc0:k&}VZm0Y6ҔOq&,"St N=^/W )1"欇L!a N7PZAC{{Α Wj7`hQ}Sw((`s1+RKٕȲo'rЪ:XURðCGI, 4ykUL8i_,hflp1{yF,'-g9syn L& p "4]b×9f׻zJ!Ï!J z!%a|68wP&`8V%P?a,0YM fEdj01v$׻oz_$ai H9ߪ|=1M3؏*UixVnJEA^ ND[2C~98>_yulWavfͣLM=SE1;?M/WnUe1\ rg!0M imM 1K}E׏}BuY7v|pA*"f |}}KEz{ ?͠qa'$]a-r3# }h7M.rzLKmvVx'K0wE7!M ^;CZ ȝ'[Ԏ5^Y=5N:e>b̹+Cۦ^U\. }w* Qs"B0)](#`\*4nM isbȠ3:;]0:f#9fG~lftv8gɇbyߎ8O6RGjVzE  BgNdCTEvB:؁yUwL rH)?\1!31Zlqt"}y+TIycmuG&Y a\e:\Wq]\;ϔŃG&Pcdt(t3N4O30R0Dz<&BF|:SGJssZ?!74}Ľh0Fdޖ} v.Š IA^))f8s7r Z%8[i!4g| L< ؅A1akƾ wy`(oL-r~HS=Ѐ1>q BмeRGr WrKcq>`q 4Ke@aN_7.j+y/nJKdBg{mYɍ8`N-ו0z;I>h u \.;nŁzVnۛG75¶ud"0ʿ(f7ΰ/档L"xGbH9b w^i™-f980e0 ^g\'Đ-PE`˲]8Y(6ȱvݷ ʊ9`ʓ{U"pN1MDd*W!mk!_gH \?{n 'Lێr}{:Q96lk/AcRHTEPxzA)=P)EԦs3KwNvC1hg<_nȎp~Fꏸ@ O{ $nmQD\1!$ԦHUKq%.% 0ږ Dʤ`"p BG4UleE23yb4<)!8Զ?@:CĶn0!GZ\Sy1h>Rirh}Ŝ#Ohq)_k),~:!`/]=q8vl_kZ:G4kTF79cpEi L)k itN kq)`^Qy:@C^ Wr`>j4'^ B{4M:9Mѣ7MB{p1 mc$;?@ d M .N@0cL3Br ihT!d:~WJ5{wB<`  0, 8YOZS`}?bĬժFb|rQAQOrߎ1|o~;>)e8C瓙:T??`n6Vo b{|6.kcl%'wQY) b<@XX{NNGZEΓQU@c@?HcЂȐ}> ]4SldӐ&nA, `L#"<4Ɉǰ} n_¹JjS,B!MHӬ pC08A$@rʘЪ6SU¨3\.iBd񿵭. vfr4/]q&k_ 7<= A=es VX:jLWTDG ;F+h0Ln s_9H9\RZk㧈B94nEG<>!x&"0M0B^D\`Q8lL7r];:1Bk ]NgmG +E.9[J4 \;l(Cw h_ܹwǤN^0=iw B'Ni;-g&X-C0!j#S#YN^޶/\SFm@N 8^tv^rU+xmrc^ Z峓nd8bX'Zw!W۶pR4=bN 51 d IxIsf<,0ݏjXNP#j+#5j/zCcRCz@iMeAH}h9k@*5:;|+<}FkdwQYri}ǶSKo2bP*]&Z{}f70u,FPeqwD!?vu&Gu$=&8+'l$5̋gyxSұ-ELaRDE;tVdU`5{v"0y1W Hw|0t]te/H Nnpqr})x R#P&U]Uh~YKaR{^VS`[79S~%Ӆgm̈́m/?~@jJEAj['/ɪ1~F<(H*Wۢo8q f#.AUDdKlU%wzds*;p9bx<  2Am#h~dnw9!Pg>lѱ~> .ag;&Yzg>HxTQULŁq_WKĄxAd1%;@bf?iMՃ<ݧ0:r轚l(dpT843x ;t|nm7L3Z/xb PW/ [.4ұ^Ζ[3RP7#Fx LMBDh{R2`nDVEGk ?hb{"e۳Eh "o?@tzQw&xQ<#J!6V"9̛ʪ#>jJ/6_!Mgy%9^__w|RJ ] :2b8+>'RGU-Y3Ox"𧥷k5BZ"0EqPvUBrƬ3a ;BGe<=}}E * ]죂õ >*g pD:.9o1y}}s !YZ)e͐'*jM+bYno^pe+ұ\2 gwJȏC apxcTQ!bj~b\ (Α%Ppgl,Zp㈍S9Gx+hˆ[1OԐ$n# .3X`{{=>}>*2O|sǜ3"#9:p"c1M1o ERCa6:* =R@t3Tzf>P__sut0TFiEz D *KV6P ?6*@`="~2aNħ`mf^C: Φ{yR` z}a3CF Y TO=>#Ҕ>Ȃ889!<|1瓊Wв#̅#:t WMn!"~D1 xiuZt nO/W8*c/*n8Lה#dqȴ߶ >/%'>vw!V`"־ܑrDƏdž~pq?q/\% P'w;Kzd'ibGU̓1O G&-Y7 O3s8rr>?zpy^5a><槀1k` @3qRJp):Lqye֮n@~~/ɁN KkŤ ]%z8v/&(y. */ import QtQuick 2.4 import Ubuntu.Components 1.3 Template { id: page header: PageHeader { title: i18n.tr("Bottom Edge") trailingActionBar.actions: [ bottomEdge.hint.action ] } TemplateSection { title: "BottomEdgeHint" className: "BottomEdgeHint" TemplateRow { title: i18n.tr("On clicked") Row { spacing: units.gu(1) CheckBox { id: contentToLayout text: i18n.tr("push content into the column") enabled: bottomEdge.hint.status >= BottomEdgeHint.Active } Label { text: contentToLayout.text anchors.verticalCenter: contentToLayout.verticalCenter } } } } TemplateSection { title: "BottomEdge" className: "BottomEdge" TemplateRow { title: i18n.tr("Content") Row { spacing: units.gu(1) CheckBox { id: preloadContent text: i18n.tr("preload content") checked: bottomEdge.preloadContent onTriggered: bottomEdge.preloadContent = checked } Label { text: preloadContent.text anchors.verticalCenter: preloadContent.verticalCenter } } } TemplateFlow { title: i18n.tr("Top") Slider { id: bottomEdgeHeight width: Math.min(units.gu(30), parent.width) maximumValue: page.height value: bottomEdge.height onValueChanged: bottomEdge.height = value } } TemplateFlow { title: i18n.tr("Regions") Slider { id: regionCount width: Math.min(units.gu(20), parent.width) maximumValue: 3.0 live: true } } Repeater { id: regionConfig model: regionCount.value.toFixed(0) TemplateRow { title: i18n.tr("Region #%1").arg(index) property int regionIndex: index Repeater { model: ["from", "to"] Row { spacing: units.gu(2) Label { text: i18n.tr(modelData) } TextField { id: regionFrom text: bottomEdge.regions[regionIndex][modelData] validator: DoubleValidator {bottom: 0.0; top: 1.0; decimals: 2; locale: "d.d"} inputMethodHints: Qt.ImhPreferNumbers | Qt.ImhFormattedNumbersOnly width: units.gu(7) hasClearButton: false errorHighlight: true onAccepted: bottomEdge.regions[regionIndex][modelData] = text onTextChanged: { if (regionFrom.acceptableInput) { bottomEdge.regions[regionIndex][modelData] = parseFloat(text); } } onActiveFocusChanged: if (activeFocus) selectAll() } } } } } } BottomEdge { id: bottomEdge // make sure it doesn't land inside the flickable parent: page // hint hint { action: Action { text: "Demo content" iconName: "stock_message" onTriggered: bottomEdge.commit() } flickable: page.flickable } contentComponent: bottomEdgeContent onCommitCompleted: { if (contentToLayout.checked && contentToLayout.enabled) { page.pageStack.addPageToCurrentColumn(page, contentComponent); collapse(); } } regions: [ BottomEdgeRegion { objectName: "CustomRegion1" enabled: regionConfig.model >= 1 to: 0.3 property color baseColor: UbuntuColors.silk contentComponent: Rectangle { PageHeader { title: i18n.tr("CustomRegion #1") } width: bottomEdge.width - units.gu(10) height: bottomEdge.height color: UbuntuColors.blue } }, BottomEdgeRegion { objectName: "CustomRegion2" enabled: regionConfig.model >= 2 from: 0.3 to: 0.6 contentComponent: Rectangle { PageHeader { title: i18n.tr("CustomRegion #2") } width: bottomEdge.width - units.gu(30) height: bottomEdge.height color: UbuntuColors.red } }, BottomEdgeRegion { objectName: "CustomRegion3" enabled: regionConfig.model >= 3 from: 0.6 }, // default region, mimics the default setup BottomEdgeRegion { objectName: "DefaultRegion" enabled: regionConfig.model <= 0 from: 0.3 } ] Component { id: bottomEdgeContent Page { height: bottomEdge.height header: PageHeader { title: { var state = "UNDEFINED"; switch (bottomEdge.status) { case BottomEdge.Hidden: state = "Hidden"; break; case BottomEdge.Revealed: state = "Revealed"; break; case BottomEdge.Committed: state = "Committed"; break; } return bottomEdge.activeRegion ? i18n.tr("Within region '%1', status: %2").arg(bottomEdge.activeRegion.objectName).arg(state) : i18n.tr("Not in any active region, status: %1").arg(state); } } Rectangle { anchors.fill: parent anchors.margins: units.gu(1) color: bottomEdge.activeRegion && bottomEdge.activeRegion.hasOwnProperty("baseColor") ? bottomEdge.activeRegion.baseColor : Qt.rgba(0.5, 1, bottomEdge.dragProgress, 1) } } } } } ./examples/ubuntu-ui-toolkit-gallery/ProportionalShape.qml0000644000015600001650000000304612700370701024154 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Template { objectName: "proportionalShapesTemplate" TemplateSection { title: "ProportionalShape" className: "ProportionalShape" TemplateRow { title: i18n.tr("Sizes") titleWidth: units.gu(8) height: units.gu(14) ProportionalShape { objectName: "proportionalshape_size1" source: Image { source: "map_icon.png" } width: units.gu(6) } ProportionalShape { objectName: "proportionalshape_size2" source: Image { source: "map_icon.png" } width: units.gu(10) } ProportionalShape { objectName: "proportionalshape_size3" source: Image { source: "map_icon.png" } width: units.gu(14) } } } } ./examples/ubuntu-ui-toolkit-gallery/ubuntu-ui-toolkit-gallery-click.pro0000644000015600001650000000176412700370701026657 0ustar jenkinsjenkinsTEMPLATE = subdirs #load Ubuntu specific features load(ubuntu-click) # specify the manifest file, this file is required for click # packaging and for the IDE to create runconfigurations UBUNTU_MANIFEST_FILE=manifest.json.in TARGET = ubuntu-ui-toolkit-gallery QML_FILES += $$files(*.qml,true) \ $$files(*.js,true) CONF_FILES += ubuntu-ui-toolkit-gallery.apparmor \ ubuntu-ui-toolkit-gallery.png OTHER_FILES += $${CONF_FILES} \ $${QML_FILES} \ ubuntu-ui-toolkit-gallery.desktop #specify where the qml/js files are installed to qml_files.path = / qml_files.files += $${QML_FILES} #specify where the config files are installed to config_files.path = / config_files.files += $${CONF_FILES} #install the desktop file, a translated version is #automatically created in the build directory desktop_file.path = / desktop_file.files = ubuntu-ui-toolkit-gallery.desktop desktop_file.CONFIG += no_check_exist INSTALLS+=config_files qml_files desktop_file ./examples/ubuntu-ui-toolkit-gallery/ActionBars.qml0000644000015600001650000000550512700370701022532 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Template { objectName: "actionBarTemplate" property list actionList: [ Action { iconName: "alarm-clock" text: "Tick tock" }, Action { iconName: "appointment" text: "Date" }, Action { iconName: "attachment" text: "Attach" }, Action { iconName: "contact" text: "Contact" }, Action { iconName: "like" text: "Like" }, Action { iconName: "lock" text: "Lock" } ] property list shortActionList: [ Action { iconName: "share" text: "Share" }, Action { iconName: "starred" text: "Favorite" } ] head.actions: actionList TemplateSection { title: "ActionBar" className: "ActionBar" TemplateRow { title: i18n.tr("Short list") titleWidth: units.gu(15) ActionBar { // no numberOfSlots specified. Using default value. id: shortBar actions: shortActionList } } TemplateRow { title: i18n.tr("Number of slots") titleWidth: units.gu(15) Slider { width: units.gu(20) id: numberOfActionsSlider minimumValue: 1 maximumValue: 8 value: 3 live: true } } TemplateRow { title: i18n.tr("Long list") titleWidth: units.gu(15) ActionBar { id: bar numberOfSlots: numberOfActionsSlider.value.toFixed(0) actions: actionList } } TemplateRow { title: i18n.tr("Disabled") titleWidth: units.gu(15) ActionBar { enabled: false id: disabledBar numberOfSlots: numberOfActionsSlider.value.toFixed(0) actions: actionList } } } } ./examples/ubuntu-ui-toolkit-gallery/OptionSelectors.qml0000644000015600001650000000770012700370701023640 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Template { objectName: "optionSelectorsTemplate" TemplateSection { title: i18n.tr("Option Selector") className: "OptionSelector" Column { anchors.left: parent.left anchors.right: parent.right spacing: units.gu(3) property var model: [ i18n.tr("Value 1"), i18n.tr("This is the second value"), i18n.tr("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat."), i18n.tr("Once upon a time there was a story nobody told."), ] OptionSelector { objectName: "optionselector_collapsed" text: i18n.tr("Collapsed") model: parent.model } OptionSelector { objectName: "optionselector_expanded" text: i18n.tr("Expanded") expanded: true model: parent.model } OptionSelector { objectName: "optionselector_multipleselection" text: i18n.tr("Multiple Selection") expanded: false multiSelection: true model: parent.model } OptionSelector { objectName: "optionselector_custommodel" text: i18n.tr("Custom Model") model: customModel expanded: true colourImage: true delegate: selectorDelegate } Component { id: selectorDelegate OptionSelectorDelegate { text: name; subText: description; iconSource: image } } ListModel { id: customModel ListElement { name: "Name 1"; description: "Description 1"; image: "images.png" } ListElement { name: "Name 2"; description: "Description 2"; image: "images.png" } ListElement { name: "Name 3"; description: "Description 3"; image: "images.png" } ListElement { name: "Name 4"; description: "Description 4"; image: "images.png" } } OptionSelector { text: i18n.tr("Custom container height") model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4"), i18n.tr("Value 5"), i18n.tr("Value 6"), i18n.tr("Value 7"), i18n.tr("Value 8")] containerHeight: itemHeight * 4 } OptionSelector { text: i18n.tr("No initial selection, scrollable.") expanded: true selectedIndex: -1 model: [i18n.tr("Value 1"), i18n.tr("Value 2"), i18n.tr("Value 3"), i18n.tr("Value 4"), i18n.tr("Value 5"), i18n.tr("Value 6"), i18n.tr("Value 7"), i18n.tr("Value 8")] containerHeight: itemHeight * 4 } } } } ./examples/ubuntu-ui-toolkit-gallery/Label.qml0000644000015600001650000000275612700370701021531 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Template { objectName: "labelsTemplate" TemplateSection { className: "Label" Column { spacing: units.gu(2) Label { textSize: Label.XxSmall text: "Label.XxSmall" } Label { textSize: Label.XSmall text: "Label.XSmall" } Label { textSize: Label.Small text: "Label.Small" } Label { textSize: Label.Medium text: "Label.Medium" } Label { textSize: Label.Large text: "Label.Large" } Label { textSize: Label.XLarge text: "Label.XLarge" } } } } ./examples/ubuntu-ui-toolkit-gallery/ubuntu-ui-toolkit-gallery.pro0000644000015600001650000000104212700370714025565 0ustar jenkinsjenkinsTEMPLATE = subdirs SUBDIRS += po filetypes = qml png svg js jpg pro desktop OTHER_FILES = "" for(filetype, filetypes) { OTHER_FILES += *.$$filetype } OTHER_FILES += gallery \ gallery-logging.config desktop_files.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/ubuntu-ui-toolkit-gallery desktop_files.files = ubuntu-ui-toolkit-gallery.desktop other_files.path = $$[QT_INSTALL_EXAMPLES]/ubuntu-ui-toolkit/examples/ubuntu-ui-toolkit-gallery other_files.files = $$OTHER_FILES INSTALLS += other_files desktop_files ./examples/ubuntu-ui-toolkit-gallery/Template.qml0000644000015600001650000000345312700370714022264 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Page { id: template default property alias content: column.children property alias spacing: column.spacing property alias scrollable: templateFlickable.interactive property list trailingActions flickable: templateFlickable header: PageHeader { title: template.title flickable: layout.columns === 1 ? templateFlickable : null onFlickableChanged: exposed = true; trailingActionBar.actions: trailingActions } ScrollView { objectName: "TemplateScrollView" anchors { fill: parent topMargin: template.header.flickable ? 0 : template.header.height } Flickable { id: templateFlickable objectName: "TemplateFlickable" anchors.fill: parent contentHeight: column.height interactive: contentHeight > height Column { id: column spacing: units.gu(6) anchors.left: parent.left anchors.right: parent.right anchors.margins: units.gu(2) } } } } ./examples/ubuntu-ui-toolkit-gallery/ListItemWithLabel.qml0000644000015600001650000000160012700370701024023 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 ListItem { property alias title: layout.title height: layout.height + (divider.visible ? divider.height : 0) onPressAndHold: selectMode = !selectMode ListItemLayout { id: layout } } ./examples/ubuntu-ui-toolkit-gallery/nav_expansion@8.png0000644000015600001650000036315712700370701023552 0ustar jenkinsjenkinsPNG  IHDR{5bKGD pHYs  tIME.#W IDATxwGySo%[rcS)Lw5 @h;4Zǁ$BL3 `[ 1ƀ.V+~={9\INu_=w3O<qZpD`V% ÐF1)H)Egsd thA>o;( W_3N?+//z8c/Wj՛, ^WrQGsawK/s:>(k{g+I`4|Cguk?i6Br !u}ObEc*z▛cz2Gs=X7b͚K=܃W  104J%otoW9_ʗ?w7r}ګ/[s9OzyK_.Z)_;R!f#8CY7䤓= RJ/^[w}>q_oz-BeϷF ~ !mW}G<%HBXa97u-i6C(MSdvbBQP*U߽F}»ٱs'skT74=5kSOeht624`@,=Q-"0B(wAbI""%MlňwIɍ)-)e_#ث؟MݍkͬZy䑜Oqi3Y|9ǹ/{nn&_s饗ڻ^?kɦ28T9t 5?1_=SնTϝʕIN3y#۷"uF||ӟ[:?|}_Ê2597Oo~k~~Ծ^FT٬sŗ^_])'? owocdd,]x4 TR2>Mܠ}x~I+Ah(/"`uNKM43M?B6[a<8>Jy 8 h+ZS5ARQ d5&V u_F8 RM_P g(0n<^ }n8^U.b&t6n"@ZAsUsyOa?|裏F9xya.{v9eW?}E"B(J 0+Fau{3R.UFy!QHa5,_~۶mB"J)e}Q$juE3 Oye&w`ew%ya, вloj%STtZf#t]Zx^E硁A,^_F%_[oRɟ j_Xk>6lX*yՏI^-\3Ƙy^B-HkT|"N8uMЇ "0TEcbѡ b xhm)WxByK>aR΢Qha1 @VVo)&HcA{~uo 46 i:B`,C{{w1g}l}gsAC?g,}gVcǣLOO3;[/|><Ţ7:|ͧV'{s}t)|ڽyt$A<y8F o VX 煂s$C4M&'' O)5&#Rkhq^OE;M >R:cD;Ϩd׷ЭoAZ-KZUH Jя?.%˗p߽q^74!$ËF`׮]A0`ZPV155ٙ5~cccXZ[ ͌`;;x`={XlSSSrQGg4ldthUp03]':aȃn`\Rq :33S,]R̎0HFFaZSgjj 8 &?D4` %S{(%>\c .093K^ec ;w3<0RۈDV傏` Xd9| /T*%v`xx֐lti-k_Q&H f3&]IZ 1*i1d3-! b̿2=3ƍ|Ru$ggY "V* A`l!`vcZy"bhA*II%,!Ƅ})ӅMJ껅 J vn>o}_,] : 1w=TI~A2:0lg8RJ0&:P!4.iB$}#>MrakV>ɳtxxтXa6,!L7lBV$WQ)URo67*4Rd3hR† %,Z4"""+ riAGjjLQn$TR!EvKc^ʥ@jhWrB%g>PQj HtDE==ᔈauF76qbx|ϞIr4sQ*OV$&ES+8Z.6 thi6,he `ECt`Es% btY~ FpPI ]ǍE@y8xB+#ECApɢֻnN@ZAA CDa #|cexxm۶qWfppc ڂP0PLJDOqC+}-ԈD_LB2X)Gk`9cS`*xDBjAUOBkbffw]l|*QL'f|Qu//; kda3O?7 . HFRZd‘Yc]6fN$`]N,. S{v GpAX'Q3336RT)#=G i*@H =BF,gUXi "޽K:XDDJZ~ݾpa;+y#*jQOU.ӺvyC.꒩i9I \Ql'RJ4m1:KrΈ1Ƒ!<ɩ=U=1lDIH4!@m_i VZRMh`sGC/L싱GRD]XR, _uEa+r_صKƚrhmjC[FFF:t½_|InF|BYA1-tlm(@I gkW[B'aRcl2fmä.BeU䑇X"H&B[!Bq@FJb@hDY } ](44/Wv?y>*T-jW+18YNNmR4zh xhODYi#ntt O1AmWڦƻZ{3UYh_m[}v-#&Qh/SZnTo,35dT !^TDJP(H" &b©{,ȘmB`Q14 ] [_Mlo8+aUiZ!p2T!V`qĶbWpxl{[E['m0[X[U\jDkŹ?^y})g%XIʍ\eAW#OnyR)=X# a\-FS&2GcZ +QY|h3=N/y?Ouc(6"R`͓ȫITm?}Y~<X5x+27G22[oxv?$j$r ڰ 3'g?Wj^1<2ȶ-9D9ΣR 4:A)J(黐pTi:E. -is:\TۑXzί=xL{$1Tl7N׸H( $ ] ߇o-*R W;W0ohQ0Vm>w Ͼ_/y*}GF[u>Ua&EM'<i&֬j5B'1`k ŊcV DA&pO̯U GX{)K6˻g|B*Vkr{ $<gcJ9"Q`nc LfS]0e3r6We@)%#l[uB ,† dy͢zXcӞy&lg_|Ms~G3%Ӣ_tozcu޸zOiR0 Ќ Ju~m! Ȅr&_v/sދ8E;q-Eq,>;%u3 F s E#t/1xRbQ\Q~i= 1H< ;1&,.`,&C5R?.GBɼqww,t|t\jc_nr[2{hn_70f*:B;QZ1j51I&ߞ |]h|cp2yO9ӂ~޺;1Opk=g!0g2H;$]6]e{}iZ1}76(XkSU'dSg߷9[cL;#zTo"H=r[Z*P}KTr$l. #kk& cCQQs5HcQBamIlP ;nnuZ|ᱢEiCߗ@_`Q/TA?w]S2 ̑js+.9/dCđ tXg>>V2=GgVɖ.wbYgQ`[AVBH4&@ f+mtNƸ@YFGV $T&aF$;,D6tŁ IDATEjEYiY>Bܳ$k;$ذ"KϻL#^*uiRA^|;OʯV߬뛂].dG^WZ,$Pdo{yzᎣb֞CvUVEɸD ='+uu="eb娹:W$kA(cW$%FC ע^mj߫PFU&$ՃUVI,QX{ yǕT6;ᙍ :g!sl\A?r#u}ϜDZIdn M y2.ݔ}\nXf6zMxJDi&ݦWJٱ0rrݔ=YYʃ2@fsg[vi2듼s=ӆ0k`-z\=8re,/x"%Keyk`r<]"}][sӏ&wl6~7_i& bJH)rr Rh')f||s:*D3LFa~B&Y"#+x& Y%jf]2,bf]"na|eCkm7#ynv v6 iUkԭ=o mn$R,zuĶ!*yuǬN.## uS6&#kz)L$whF^3܍MayuI,cD;act[wL\|c}|J`g2U2 2?]g=hy-(P[rTg]"&PBR{5AF!%(js!֢ɲ.0glN:T, #آwP2Ƭ{)p on žx][kϙ .Ҝ eiSx9.]#`~HtSmP^br_Yq?B`ieCaڋ6݌X:.rUK6) ֖͜/=Δ3I/ZeNߍ0UvŖu/MgZkeѨ jB!9 #0;;M D'P %^Ei64;l?&W!ˆO\~3 'HEӢ4dF{ &{h<ɞ/Tn!(,,5J0t^$ØY̺ !mIV9~>U?Fvaz]dD2f nPIv=͇eJjk$ a.= w^9<',>yN$r{BZG1Om319^&}U*Um^J٦;y y>Rr1!BjthF,7G ч)%,e.+RihQum;#WE&þ t {Z&O 8OiVQCK,>rz0Y#NI0bDۢI|f֚I0":{ĵ썁F3-`myƵUjul5q}H>jm^L[ !(֝d%+JX*ڰAKi VZbKv&h RQ+Q0Ƙ󰀴&H}ˈ%ߓ3`E 15)F3H);yԴޠA[:#tҟmvn h3tsfN$CX3ŐE*Y(#A#cu/ <=i8&V*j;9ca:Gw q6yHCCybJ^`l4/U$GuгjZk0H2y Ou7t}d<1^G|2:XxBoʵJ<cXė %%sssmz=),Ah줔QxBE'`62րq`7T!Z]C|"hcv$ axF|,F fpŒU,@IB U{ w M>NP`tt4:ǩ0{vEcΑ)\>aE.D T2J>`c|&rV[Bg&3k^Z>pw000y4hO9S/.굯)t'BLnˇy(ݣh~tybet2jx~;Zc""~HяC͵Z$7)H"k4{F[ث*أ@3;609@(%VIQ Q 0==Wd9pB:8%A4֕$ϳ6nߺ%-FY2ڀ$9{T22$fPg>ѝt V 87s˱Ox \%֭JfNo䕥 @*#o+mjCZQo~%㏽ԸKXQt>,S,"333|cfv QߓaC̲t- dY9?g-_ʅ^~66m_B9)RQSJ$]%m=Mt@WH"4hHСh8g1t:@.TC=z3 '߅JWiS&Ui| GجauHAyFi i4BsBD)Z^D"jYoQ0Am569y&jC8NÍe<yx;pXCAVlyS!J362АG/0hkb@윘ĭ7gV`jJA#XF%fۧnjh& %A01r'P !OwO;y'o)^<ŵ +=\tELMꥫ en E2== *X<-[FTb8;v`ppr֚Xd =ɖ-[h6,Y{{&e֝ UTKT|OP8` /,333rTlܼ]vdlmS{}=Uopڂh0TS_p^ol4(({b5^MP`m4 J1Bx+lŽ;XdI<E`a֭$Zy1 S{rkX`bb±uw^G6n& C-Z䨗7P*JQo4h6EJRb&dEVX֚7233ŋqj"/^%f&U+QV:#8J숪2VW2[4ҁuQd":_d^RDzf~=yNf\Iyh㡼*^*%QX @7)Xkl0c=VpSie+d[ B=aMuòE=S;PسΖM!w޳KWUTUfjL#u^,h ހm &Ct!,+Jԭ%ZTrȊ঵ P2DS!KH 0Oxʑ4k(ܙdK L$VK Jm5֔A]neR5[x֞(iKX2s3<#.T ͠W\ʿ}uBs$'|2K=s|9w7%3_g}f=V /i8'Xv-͆aɲ1?N P,_1F0l߾/sW-BuDwEfys3ujsaѠ{x3?~#\C9_UW}Z^ =:mpۭSH\#@zMs!ђY{Q4B^ׯ_/η+~}݇`O\p!a쓞N>)Q(j^TBÛƟO88|?lxhv8OyظA~Ë9ø{f9ss˖-+9g>KEbYdl>YÐDZ :owMhB`q0S:# ǘQJuH,Iwڤu@H:uT#S'g索g3C9,J„!wߍtfV,̎=HSTE.1Z-RoV_4f-֌êe,߄V ;y۟î?`xDr,2n̜ϢjT-XUdyЎ̱fŪ ' FMٺus ,͛ٲy:mW4X>/=r<[~{ '|"07753w&]ëMlt'7\.x O{ ʃ4s]LNw g%_^~a64i4j^kk4B*@r޹8]vo{'q뭷22d׿ ͊qݼffX IDATJ̛Jŗ]MO.W'wpeWᇩ7/O|gO|˿ছnXIHjIO:_WQ+Ʃ ̡u jw?}}q_/w6Nx8V>G6l#jɓJcG9cغA>x%m{ˮ9O{177 H.r>|Y42PO BmSN:;wKyk38\@n}ڪSJNO`F4]NmY[/#3&y;ȍm1fXUZE/N:^Ɲ43lo!TL4 Ɇ=!EIQfxd 71^Jϓ )4RZβe:+tƝ+I.cU<28Te˦u+SL"䐃cph;ƹ9U}1,]͛RxlnԢ1+`;EYTUAZ}C]Eu-m+Wܹ쪨٣\vYb9]w+o}{8S_eyof˦LVXsS-sɥWpU7kvQo{ԵU:HcajX3&+cqRT@:Ǣ7BTdk̸Zl(Qbqct%dÀeKXr5wq;zWtPnX(7O|x?=,~k)XVRF aBdJaSLlذw *pS駿5ԚAJQ>XJ2dlH*ٛ[Vwޟx;5HA*F`DFmؙ1t5NNZ36VcID" LP@UQEMp{Xcs>{4>>ֽo}/e#Ok(ӟ4_W+ع @ЃGQo7\"@@t0$mlL@I0XEjZQeFddvWRa/tGwJ7Vj~%q(jԦ,<'H[]9"+lPH0Mc'JĆ! cP;'jZIB[i(1>2ebzZbEM(A(k 6f`Lw l6+^&zXEL\)C2p?11+c໏)RCY-E:sT-)a"om9~}oE #,Ax<>Zm}-:n^wJ!SWk }}}@H`hh_Zokno{'"5M)M]JQ g9i-<}eيJbA_OS̏cq W|5.m3e[s͛׳e.߲۷20ЇRJ?#w7b+ Yȇ? }-_bdh2id!.Rd7\ 333 o勼}ɓ'׻ n{-pӫ(x|An}۸|ne+^7+T DNN5ϟٲuj0UDг{lWAsB]$tQ.LOOs9x"sssŠYԭųRdFB,MpA 1jPQz[mO-8rPyDi&c%ahn<^c*"D$qlV#}7l޲{/DžFۂ}l\ϥP(|L&` Y!FFq=\|nGxNVL6cFXE֬~j(Wϱmlrݯel*U2# zJVǎAȎJQ+[]ίʯgw6Gɲ,AQ(%f6u #S>V7yEg48{{Dg>ڽ3Ǭ]שB)-o-~J4>K6^8E`늫S8qy119 +Z.L/|\}\p?E&PJ1 3XЊXgQZ=V!JFBJ({Ag_)|򓿌x9v% {cWqo3ᖷuy?';wۃl6(gjU¨vbelE xRiZES_6\1dhOtzڣP +z$zuץYΝ;/ş_җk9uFcY1oQE"݆ݳurY03-Jz=8y)VHJF5w1ZJPv"wT̀Vt@Ah$4t8 ڣΔhl#[L$BXZ@k<1BR 22:d0sAF. M5&/6cT BX}cA!Vl8[.[gVp59qqq_xw쯳z@_*M!λ~ȭ?>8/puT+!:a"(fxxO 18d("`#}7FyG9y(en>?#5QJ /{Mԃ3gN& (9* \}s̋LMg|rػn|`Ϟ=rxџrlX ,3 ևuBW(*2GkrZ0<33\??w{R,{~G?I>;|2_Cx;EvyArV[ pI~??_w>a .CqU÷xҾX-}Щ7v` +y=ocwܭ|1\U'G+oR+MƼt=T=q,VkswMv8SVj}o=/d P9r0G_u,DScG^6G>Oު!DG) sUfkkƸi<‘6`.h#qxgL f`k 8$brgfQB@0_pq2T=̾#3<[ ?brb뜨+k䐞O<8JOR4SM:?'XXXhDVJU>a}TeQ/bu~ĺDQ̳?ŝwC¶<3gxG*FZx}1T",qyg9ԓfrNs}{u7 ž<ٌORGq߽S)W4b1#癃V*M)jF>q0032f Pߧ|ȷ-FqlGyԧؿI֬$C2^"}Ϝ\\ק??/^B|v2MKx8<}L6CV_~b$zN~W? CSض|;L_F3O?w] Ǐ220\^)\<3OzP_{>#=`)xwG~j+-EBPױ,E2mTD vhZ)%zquU>Of=|]̛?~AvwZ%d"Ž+9s2jup}sgW WY\ZZ]H?73\e#SSSurx( Eusq'Km'\q31HX+8<[.5hX\:"rekHS\;nGdmفZB<[*T(&&6*& b jD G_;{fjFY/W!%_*]ɣU VđR]ӊȺ S,-cQZsyRL's+QeΞ=BYWJe\eƍƔ!F/u]ۼz6[/H^8rc\% 8A=hsע>|uٺe pqfضui`'O25;Jĺuo&'ZѣG}6oAXtP]Tu>g?_7LN09˖EDıf m* ĉX R044xkyEN<뙜l=7o628&e^|Er<_vY ym IRd2lٲƶm*2Nϸ)ULNepp+I8ϣf֭O9r)%[l1$Kٳ,.͓ 7RTU֮db|gr)'&ذaq%kfuifͰ;l]r&TMXDUQnd< Jc9q"Eb!pZ P!JP @Z6'wrz]dE&hv=d ԕ gU%#, 5*3q.L Z*[yY|=dxv2h(n2MłI"rӿ|l6˾Gn]Cno@\icv=&Ų5c%yٓUFijYI|2cےX?=77f0ɶ>]s4ș^z"5o-( UNtxMMs1h$fd&xuK(i+ @2c)%O[~~!Z2 .Wqx饗=F,ܳo7Wlڴ ZŋnIhƘ.kܺ+t~)2gyJAKЭb_URN290%-;*WuL B-M԰ηc7o͓GNIx""8q\kyJk%\,zjyL0=3<ٜ$ Krz}QR(GZ.N*J`.Kc:J|ǍR!&K5q};Nt+Iwqr6!Z/]22-;M.Ee9&28Q,":#.m) {$gL_Iޗ+<=a@ILXVLhv*6׶ќ Ni5)؄m: w'!(t&x5TAU-2A0j|Xc{j{`|?ÄB_-o& T*%nV#|/~KfETJӼ'kEeVDfځ-A@QI24Z Y.2ٽ/+>M{x@t`7J(,m`9,OA/Re|_.\`/,xg9{,?0N`dd!8w:MW3, IDATm\H/f/RF>.6DJds\.ZLbNZBtScǭ]_E0?,ٚL۱uN7ܸe"Msnɗ8[UW\@_j±S癛5۶vS,4 (e9lZ-[wPtsa+yG9~EFw_meȆ tTְpGDDHPJYubY[YJ.u"ʤѮ<ꑴس^.AYR,N2MvʘDP']rޅd,e[0]1]،k5eo2qy(4f&225\ӄP]BmFR*VugOe2*z[JGjz",у\;nGZI샛yhrxH&YQ4Ͽs, 1EJHi-wSX*=b -%ymg7??#"X6g뮻صka)8C__;whS%'MYR3*.ek3F1ވbKJ"mzLhTt+׃8Q̔SBA(&;x%t'"mz@ZWn۬IDHJ($R1#cpnǟY@xz)'57WSEvNqaJL4-C_}E܅89 '-Ux1Y-g䤃Ü<L9b3kGL?Z+Wjww$\`;N F):Xf7Rb%S-tkn t[CfI{יKav~Ɵ䍘F$F4u[ەq箷g fBK{WL(%)#jK\FC]&")mm!MnהJ/ h]s~6|P4}ߤ!+wؗqp#Sò,fffXv-_W>|_fm0wX(PHܼVz57JGN|V3EɴopAwY M"uIH:V8-mؠ@`c%Y X:6b:K.Bh˕.\%GI+!L XG"m&㸌,$w.^8{>z~ݯ~-Nh܌bTLkϽSWrTW젯P@c`{oz57lDXf5v 6 "z' qYD;DM쒻[{VS ,[GCCٱ&!efPU YFr&HE''=,M$sk,@3-Qq"u;ڮ kPJloT.vZ~skwMm{pv H&K4QgL#᩻u!Sh,C6u//ou_p{ХRo4(WJ>_dzz|>|ccǶIs\NV{fEN:Q z<κT'4]+|EJE2gNʨZ8?$Ve|\( ,'*Co*2ڒ#NR慀IRw1D%$Z0)e060H/2Wjc̔ں>YZBTYE7Crî]W%icCunfosNn-vMnN"04Ioz.aV}Lte'`ʤgIq72j?xkEZomJaӈÄ Z}Bi=6L6Y'C@,q-m"7" " n*a[6a],abl q4Nlv̝;{ Q_ݻ*4;O rkRz%Xm2RD9lI(+mVuF&RM35БeURRoČh4_X"&4zZ@&cF(Q'_.䤚,fQQ]j mo>|ZW@^EW=#){|{'-R&&J6]g+&V*lM[ӳ84W]u0==(gΜaϞ=\xݻww0dV?V;Co.A*cS@KZU3Z#B)!I)*8B`Y1a ˰r}RCVHi-͍Vt!1(A7BB[cIj۶m IlM?:q ܱKJHP&`G'Vu*ssШSUFD](Kp|$Jh.ssQ/mrP`iMW"zzmB|p2k[ΩS8ty|ߧQgy;AXDk͑#GxqlrcǭE5׿0 ]Ç#Fl={šq(D>G%eE^&y0P(pǩgd2TLLg~8s h&b-Tc ]vP9"mw eOR߭dM }2;5?2ZEךI^t>j %ݽ^2Նvdqz%{KpR0+軯R_* ۶mK#]f,dKgv+DyCw#7}*]KZdYywl٥"&^1Beԣؓ2@j.?#2L)B%\F3$M3J`II6E>"Y.^_j脱>pCD sUS4%2F]TΓ=,!4Ϟř1Vt+1PE"mzHk^{qT1IBI8h`KIo,^6z ~z+;ayRuVnz p10__}Qطq|oB]wŋ//0;;Sadd07Z~giKw# Pvߎr^>w7̛}vMeaa#G0?NZKTb V6o5v]=v|.cH# .buyH Aĭ~>oT-W:6RF~s|s UfŴ8n&PpbҎP(GKD Y{7> ٳK%ַ2==M?5+R|{[@w:VE5=9 Qr*T*jCC Jemz2~ KZH6F2K-b)V%=N֠L ~@ȶC[81.ϢQ]ŠhCjAP+trA/V<FxjťE`͛(*=Aڡ5d|^9.zf%rPAH˄p`$ t7{|{]U+~0ayn˕W^:hLLL004w-ӳ<Ѓ\ssvN>Oq<>?/fZ|i.NM/@P +\wu 1?z 6sO_uvÏgW0>6_fDqZ70::{JjҤ \wk߿RJTbtt=o{3277G Lx0;m3J =Ή\3k^*ϟu`rr\E&S48Ξ=ϺuX*y(&V!k'h'XV;{ =$^h5nS^A.͚ٝ  :-zb>w]EUJJ6KenujoZſ{@*OiNS+-n级(`y~mus^$.RC6QmPVQ6V1$,ݰ\ HzMl;\VO-&;qM8BHJ* 5Q-RzR], yB?;7]NP8͖M1~n|,WO]ٲQj_2.LȲiEF<4 *JcjD%E'-_}u@2̹._9O± epn{8}V(JhiCj-1PfIEr8–N0Я9,]Di8 <`q?vn}?q: 2:y߾@R%5vz (~…< 8R1nf~13sѰSFӷynٿ?۶]/҇T*ζmy#hsIyشl}ӧOo~ٿ &'zx]'%`Mіtha{G>߲]_?:Z|F*8ǹsS4{} KA`rr_{yx#Vƽ[ٵk'p=Zxqd/rw^4޾~,Kя~L.KZfxxq8ș3g~C>ajj AE1Lkאɚ{v#Q.d AI(' Bfdd\6KFZ~\Y0ı|p^Z\ap` '15qPgS5;M *݌FP]nEqP\1v B),==sfh&iPA#MX7+ѽ%{<9hRW*mty?D5DCxe f\@e #lKRaRQT(r~7rkG< R)jđFŦ嵴Xf߾ O? YZVj8&Ah;w ?`Inr{7x#֭c|bT*;vOGk/>O:Kďw]?/z-vXZmAE1B%B~g %qv)\ƫZ_*{ԓpz"bl"7$C`0J5؛T ]ZZ؎$ n&D4kojjS&.~)ݎ2_,r~_H9Pl02\\*12\$R1f癯KK߰Vñ$ibe)6*4_E`q.XeTCbA"ABBbP45jĬayy iKzMz%{|.1 8V0}>\/[,bg\cҰMa 1׿Uضŗ<*N,^MoGwUضhMo ]YnG[SJgrig3ywuN:5'OK@ll6 ؾo*;v'Mv6\.[]vqdK68A!m0 9Yu%O>qRdhar ?s̙J$ oyWb ɓO=e-kB ^HVS䤩g:{nĺPt{]W[ҼWmX ^amG̠Bq>|M7idjmNFATJD}Eg6cyQARjD[Ag/%aʡdA@ԉ(iDPRv9mD1DԿ[Lp4yi4*8AAAL-,P*Ek65ĂLc&3"2~AZ qɱ0Gm$)-PaDs\%[+bYPx"LWzc\ʥF=X+w@9*me1dxU\}l߾bKK%2d x~p?ݻTKP,r#ctd[355/}<˲8}epǵZܔm'=Z҆]Ȇ =zi[9}rc<w$"N4?`N!_VUqi#p! OE( #}9yFm2mcbT.paa_ЖeGp /!h+81|#U=SwRVۍV,RLNN2Y4;>`xsk" FG;p͟dž'vV)aJ%9b+]ӎukַ{)8u(q]rF Sؤy ^9 Clfbb\Q  %9!BZXڴ8=g|<0Έ8pI@ ^4uor?_T*$um$%b۫/S{}~Tɥ xUvܰaϝoF) :YWK:K,XD+>mlkT6Z7c[V[//RmO&x2mdjnQɰOIGh%5#-b!azj(j|Hpz"=5[_2s9l S-a E_qO)Tš1&&X^ qwTu󜙹- HQX@\qEؐkYaq+Z*;A@֙9Ǚ;w̽&ϽSywyfs:E9,y1&'(8%-ZlB!/kQ[8"\ZE|t I0=KE[Od!PP |1U!^|׃u}!)H2KBG*23.~@;XCT2g-FdMŮH)ѩK< m!#VR{L[0bcS ;15Judit`Mj~Ld%D$$:Z^bj4MlXT)յJx?+y؆U6)JvG$,| 4U*BZ a@ :R+,G-(8RK|a,P-ZHrPF(KRq]yldܔUR 9x69[P3? +4 0\aiM޲i*AAmb7*/ŢÔcv޳VMrüs3̓[o= c{BƲSUniP D`, G():Z@ {v8gL5#OP528#@A}{STv`wp Z~ū@BWO6R[:r 72fKqyE] ML>G^à=JZNQ uq<&:,g).=p>ρR0 3[?KB:G<;2MM'ײEAnğ* \K捃NT HT.X~)h.Fch.3RXMb@#oY$oYUFy`Ѳ͖'6{n%|OQmQ*:S8Xii9䤠99ng徸K\ö%~yY@csqyy/űMri4-!y.>jka;FP1@2ݒJz]~i# -Ywy/#1eܩf22u dnc[T~yGk"DX)VGטhtx0I唉DN&֞N14;`#)d3'IPazL$*&Î{܉{<@X~Tt gK9>>4N.fhiZ8sBcBߘeу/'./c:m(8=e) I@1ЁE%;ɜkvXol-t \˖`>D|IZs1!.rMwo[9i PB *l/0LW>Q(Y &''3!0z=[h0d>2IV zS<[%QBY8DEQiCex<89$i)g=g }bwJ%{ W>++{:i뷟tARdi.+Yx'U4&3$h盧%qM:bnn5Vd =(C/#*)W ˬ9̠,aea{v)8մ9|X:\fh0Urx,]–=l~l ~g6.`pU0Q()ia%/P߅jI:cEBȲEɶ-O^Ebh`Vm ?@aFGVdc=d9LHS3OCwFEFK|FDf&)<ŌM\wֻY"zd ީ;Ox0Eׇx"֗FS׌i8X$BOX4P+wC/͇EдZZ-ڌ^}Tz/{z} )lzQV;EK`ք֒'vN¢MSavvr% KyԢCRTr9N -B0=Sç-/ۂZVɧq;8avD Ki[wW4|2:EZx&+u[j ^YedW泱rc%xF7=A&eko=p$]!QwT,:*l|#F=O*dIJ)4gVvvʪhʶ;aE=e.=~PͿꌝtl[Ҭ7p[ u#xI|>oP7xe">>J9JMEwAF["^I[b4xr Mf/p!Gsfo]LNAEQ@>0:8Ă1r4|gvw,C Z V %Fxb69h5fl2.[:V9wوD)ӧ,0 $ ] 'uytzoI:IH<4l3$!4jăs iEݣ52[f^VSiYh Z,$:tʚZw TRf?iW LƉnCڴYBjP)UE?bEݴB ߏ yǰs \IHtM3|>{-P %MVx1!q5`) [7gvLXim 6B];rk~gwocGp=0XvNp4?_ǚfwDÒy{t3= ã1iJ%k4pPl(V9eĦw=bw1*?* ?pKI2ұ$ҔR*:08[= qy+a5O=&Eגend]y0z[BQ*Rv>06/Hmm掄 HI ZE]6|߀e˱Po Hl[".q*c+R>2H 02J OX8*5;-E {OƾêUv5kpq.pX0ʃL5h_tlk0ymP{XrV4Mr9(CabS9 .3-|k-u `|b=;~Ƕ;)}`=ao}Ldi:.3X]N%e1J^zrؑE!o)z 3FݽT ܰ,'OVDW8o zxkK65T8Pύ{ R{ eɕ e템Jp3V+{'MYcBJ$+/A>L۶M_H|!p)CK𱐸d0R"ebVQ7:)sya^D0RZ(Y9SWΥpo!x>Ҷi긮k:zFE:\JEhY~4 Csّx}D$mCc^(y2Qp4|5N|& ^^'`$ (b%fS ||:qomI\-:" NJ Prf.mNLC B-}hIaPZJ-9 KlP7#-@P(apZND h{8J'1ǍIYEHAT@k#^k_{1a.Kb TͤCKD+ -EDFP|,ahҷj!8si voPN,zi0 E8,2NI Ű¥/G%&,!K#s ?M-~8a쫫RHf=]DdPвKqs1Aܵb$Lx2s3xNgo(T齁EEK۶c\=TLqrQ փ>Z 롥@"J(PH2x{|s0Nktd)ihX!Uhmf( chXK2r܀%l\Ϙ[ ,0h]r !2^iˑ+dd/Q~)|PM ,|'#<؋(},-aB4"JaI`J#uKzmM !l0RMYNAYʒYsioFקE2_,)^0.Q k%Etr3g ?3~^ir>X ~eVWK'\L?^>r'EKn7ȮDgs(ֳZ%F$RT!-U x>n>;C*Zx$1P4lX\qtOMdi>ZdK/q %u蓮wZ;Y29sIsoZzѕ=\Zi=6Lj_k[v<'LI)fb)GDHm)i7u k82Ek I1LE"$cYf~ʏ`iCz!2IR ^Bm$ȳDzͲR!XT=22NisM$2$xu/Ɍ&-0}tӪ¤d߽gOdCݛ)K>{g0W;@kEP*^'4M8e0Zǂwa),KU^zaef<$'YA)nU I'!<+06|p%^SoCd)<`drG֙6s{oHkeR=Gh?Z}`|HJ[vH2l)a|<]_jȠl6i֪ ) 4k',`9RFhg-sFmlZ1Bk±&˽8Etłv_iڀ'˲.Q"w{b ؒa9d-¤}s utA{֠8hÉ'[S]5_r/Zq]4} {&qİ^p)ѴVaZKcNbQh}^V *Kڣ_FU0KFcwIK8F"@j۶i & Ok<磅T*( <#&k`DRh"gVmG#j^'a֠WBdSOGX氇$^lA&IVYJ`w& uF<-f ҆t*:J4OxK!;D[ZC=1EJ"Y he>*Aˏ$?1̲Atz]ZC>^2fI"HMWDNCů[9=c|g{rE +&_O18|ՎB;Xdvv!Z-k( VE V(_̀=*JO&סŰDݵ͞P%ڃڌ޳y{oo.6xmaE=BA5wdBXmT2H\īyed(#T^<ŮZ>v7e*vBq9!2KB-\eRŞ66BYvy؁>SUV_WiU"ޒv, yع _w_A[gXTw2EŒ+z~" rxbsn kKR-T@Ҳ$!OZ%e5鐚C[I0GBPG`a,J**\ff\ +l†˧V1W _ w1<Ku`]-'\Ym4aLEh\G'aޝn[&Va D0J)~]l6p)B%f8 4GJ16.j:0A3` \ϻ-|ګ?LZ kJ%LPŰ섎2Y g"xZk+0F?֮ !^7[- 7K -\ԝKb  DӨzߦ6Wȣq>@ey e h2ˏD:@VZkp}>/sss]^nFF77&{ڇ]( $@Z&i& 0/+Oxض4ZyA5h٪208¿|#Ysss OuS]_:bfӍ~F25{+UI:ߤpa>0YZő P pzIe0'gڳuro4ZcZFfo%qLև%AӀ/ Ki zϪX+cCB`>0WUaqLMM% [/{H6@he1JBͨQUɌq#vm(:m~dF{'qJ(e/81xe{UOF3 6Cs̆W" PV1P 9 ~Z<mjׇYm1:a)#!}eZ'Zx~MCBkvG%@%D㉃ v+Y ټC24~ 6e9fiS=aA4њ B u_uL'ew׿\s v6%qI|*>(6w3SrJ];v&##Cцj6])˔J%PX,jǖv$#cæ 7bBM&'"K6(B(lUcdl4RTJ155ETT*^019eܖe1<<ܡdnl[N%Zݻw288V!r9;̙6(WT*x.8Ԫ iG"RcO<;vk.qc 4FVukTA٪351RcQ KP0` _:,`pL23;3ёmv[TH 2'JJo#LK8mRE$sMۄ e[ _BBh搷ؖc! 2\c,A%Qȣr.g~lp΋_c`̶{?ч73228Xv5/N͏ӛo\q8߾[ǿfvvy}J^ʗrjؼy3< ضM377ř$?O73d5,l[r1GvZ.\yu]{ PJqpu Ygy:?O<KZtFZtFŋs!j ٳ{|3۷fd6 33<䍜s9T*enWG?1 ȷ9+!e2›.}Guw}7=ʢţ4./vrYJQ*5oc>m,R,X;/~ETHi3=3>]X,np.aV_J݃b1Oq1022=wFAVSO4=?LLN C42!DAO |5LEærց*dvU͏a 3KKP((L|g+ZIMT¶RxB5RZ(Χ%`nQmBdJF0ę&A !RTfuȡG3_/z^x!"_/3pH>H%s?bJ.Yj0y+/ZR, _J K,|cSHÒ?.LNNrͧ>+^~! _—WUW~)3^U<ñ*\qݗȧx '{/o +?Oog֭{vJ+Z*0yekxGbjbw\ytߘN>$b۹611Yg3_x6r wXt)u5|k[@Ж*я/8vիWs ׿5ozӛK8gܳi6x uÏÁܗϿ_&W(" Lf6K2n>+'dŊU+ !koܷvEPPy7cdx!_pF~߳b8∣Ϳ2.IV5Ӝ~\xUy%g-Z Gy$<; ?X,Ak7] X-5V7&y%rwS97_߂"˵kO d|zt\%D Y\e}1Mb,+ *tÛ( 8Y/HL[F=-0JplLR x-+i`ih`k,1.u,ۗ8z$o{i4 }% ,y9[~}+K,cxp9yͫgU\tE:`k|])12_fFFajr\J^ y.أOеrU%o|;=*ŒVW2:E~K:(tkpi Л&MwZei,[0==L8/G6d>,]|o󘜘'o._~a Mo~1S3h_E|._ZrI'PשV;0~Q*֛  3shJ|K_dǎ],\^t.˗R~h Fru_eɲuKqǯ(z-Pg t`ffOUXxkς߹_9nÑL77hmV zz)†N3I'3N{1Z=y(K͂Ec\Ox} rߦ{Mi ﷑g2[=u:˗ǮSӳ-Ռ,caY`_n-|kXv-jZ-ke˖N΢^or9xat!>Ahm]Zk5FGyM?gffF)%:[~sO<k]m0BljlḆcY|?>S.8a/ʗ7l`R&gJ|VZ9{ܖߡͶXz5't:~Ztݬ;P,Y|jWz Zm諦]`|jhxٹrJ"NFXf.nK-y+_JV`z<Ѝhe,eŌ*Bх^-\KtRm LrJof88E:g|Y}r\5~bw4T=c9Ry sTL=8רc\&ծ}F>P1fW`hh0z*B% }RmY'&QC c 7 JfBpJFH(2`G2>}RG?_ £V((Xp)&&ev -I; ("Lq\.@AGFx7 Ee\,EFFFRD$&d=+C/}޳ёx~ 8,cSWoGlBd @R6َ&C)Fd][ )x PM19QF ;qr%޲D079J9O!ШAyh!DИD^).&;$*m?.JBCE5A=フK/9nFry) Ô߾% n^@.ghx#9@22PFr§Q2<2`F #)(aE-%=x`iU -D]ԭh9'YP|1\ŶmvQr9 <];080lnG*7񖷾SO=;*%vy`MiZr|KG\.>K9O;5+z+ՙoz\p%mKK&YRѬ7( x~+@-i2Bɉ)j8ՓV]JCۇ? 7ez;s{."33SSko~Z M/JlV&A.F/X{iyRDiҶOFV,qDgv}2-6F̐ ܇\P@D@p7p |/ռ5i&FJGdk҇h K*C*(Ĵzռ$b6,g[sy7Q*Z,AP޴O윋2K2%AHy_ 691=}mtu,j խ-fguNi")ũ/8>ț/}˗/gfjAVF i4 ennh-Y !NO?$ܟ_(mQ8 -U!l )4.c< lyV:lyQTR^bF:f#^sټ=y_ٶihPϲxR윅cA(xn1z1sT*LmRX(ZQ%E@cde˖.!ph6|FxE03;KV;p`*\G}8wGRarjիfߕ_j`Ss%q_ќ3h2m`Z ,YSOmW/yp΋| mz.z}zeƍb<KF=8㺳l{f~B6ǯ~kʥva (&򘝝062֧[H Pn٪l6iZJ%-϶ o!̡h{_Z36Gʗ|7^r1FZ2 iYiGYirʙ]y"0&RNJ& y "mjLG[Cvf$&'՛%Dh KK}DK 5cD~I k@""2SZVmSOw޹xb* nȾ d n5J~ky)|cg?/8LMFcYu-7| c/9!|{*"uX?݅@pWeKFeGdٖeY(ߔt" e D~5^p߁vzy,\-UOzJA)J\rq'\o9{ɩUɈ.G> ֚ ^r-\0cccȦZN:[|~˼W7)%PY|60>>#?iGN\#י޹?Ss@kڵpˆfz~Gϸ 8qapA9#'|GYdi+Y^toٮĸHG xeBXc֜', .R(h4X ʀpA:(!>&&}iԉ)Z+P]48a W]y Í7~g{I]w^.>sٳg; Ɛ䘚rxʥP,>? a) Tryp/={ettۜrXBr=q~?a&ɏnfdo~swq+7΍7D<6hH+X |K/y3@z >e}μ~xQsY|y$g10POwwʇ*m,Y:UW^ÿ|h,˗-c\7?_[oMp jPβzJ>{Wؾi|d~` B3x!xF-X2 :&F _Kp]wC*|/03&v򗿒*Km=ӟ4o3 SSa'o~S|Ҩ8̳h4ZA;-?x\ogtx)zo`8+ eljfE\bLd1055\>}g(XvIfK5Gqkp[ =w4m8AI% E)ݖ*tJ5i>po뎂F( /GQÒN¶s^w9DZtRfl綃vdۑ4HX) ' HQnyvlUt/ddl!lpS,399 "jDP0#?&Cߺu+˗/裏T3>1?BVX,>4o߶Lk':(ÞDZxzy6aw?fBDYc ;0g@`7 g|鲈b/={&l}!z?ҥKeמ?(V:KH}Q}9J f;vp5}عsOlyڨo,:S]9|Orkl,G;uGejow -g}W6=g2`X,255懷0=3NlΈ;T}׻;l舰ioXdWl_?+1p(a6C*!r:!Emp~^ Mh_ӗM (M*1;L\h2Y[/_q%bm7ײvۡoKOERa  ˹%9j؛VYc#Ov^ \h'f{ 32:G<\j18#?ak#661ʄ8Ui) JGt}k-}||ɡN6Me(?`ՕJ100Pl>Qʴ彛le W rp^_w}\doA/M&2DTk-.#Mn[ & Gس]H ]7h Qx7e7Dԑ,l6E z~_82[ z=z_@BHucWGg0U/ <}zŇI>TÔ5#k`גC>?A+Vz6(lj*@%SBPZ{FE$B6Y첯 QD @^-:. \Sm>1:2O=+š5k:$xIDE4BE b-)`Xեc/֣B%WO3OyǞ#-3WFFʎݤߏt}7Ձ.pRJkZfE_6p~-!U3fwEl; ['^M-1Uե+՚SSQFD׵amD7QT~4r~[!%]~]XTh@!5;X-w{Ưm%])E5_z .~O!## YG&IZ1пEUY|hF Y_]ǫQZ$ݶt]Q$z@-{EmtY \rX_xG$Tf!!PdSieMт`o2Ufrt$B(Gix( v-m^0] , : 6"lZxWU;mBuz&rh5ˏ w:+j%<ũ< K(-q\m[F1c_]n!{L-dBKpY@PFz :[IY-2xM^e ]px.(u^UH/_~ID`a5'"=*\qW?amyǿb@$/$j3'Ԗ@V,];ʱ"Liu]sTx^7:)Pf㫶~ NցηdB)g[8zS)V׭[1P(}vɎǮT*ű˚5i4fGw_255i_nl'dzvwnZٔ^-mE^1ABjPMYcJ;{Up!)d<'bd7C8ue#W0NjUvjb00(Gmmš#YRu %[M:Xư EZNLW¡z ~@;FXK #SH >v Edj /дQ^1lY} ]nph ID€J-!tHth!/CrI۬\l6{WfUFr/;ֆq+e}idR!Yd9i|C'V+%6CyWL >K6GqAKM:AK֬[KZbb|//VÈ_9.BjJ6Olf9x&aRb||ՕEZ[.-kT! JJ|Fi@!MfgjE*fltav3dm4Ǎ}vsT*e^8EG/CfzjL(f>FLJ]xZ Z^<F2y6ZJ {.axT\.R1Пall _W(ʤ3.VL!L[b`&Ruc(!}ԫ s(_lϒSSS~l6Gb0ah(oT*Qk0dR GȠCPV19$yazj!}&,D'C'%*j VJnbkN/lhi-cW/@T\,O I4u<(ȶD-'MY=Rtt6uJZ%EX 2N$c)<\'DNtJ`a&nM{8Bn{hoNdhh_Cg:+\n'x+%/o( o?0vu7.re/݊#vuGi5=~puK?n*!6o~=ڕO8_\u->{rɾZr)5\+Lϼ;pguO?4wqɤ(J#yC.cӦɏc=JdJ$jv=;\7G~Zւoy#;lT=γbe/^{PTqM73<:BfUub6H=.B6BAUwvvLLLpϽpM2<4drIQ,Uկۏz 7]z5}Y,8?;o؁k8)׿qOCF͑+)Sβ;O[oCPnEn9z_xkbfrn6Ã|<ڞG:wﶁmVB)C<̕?%oseWRfh|sfLM6q.wѱ~tَ֬T*OJ 3H'ykW~fkKY儏)2\~FlNF=HHMv1_u|bK@IoH7\VFHۣ8<+=ѩ,LR:Եy(Ǡlg$McN)Baq" EDگ 0[)VB`8[Fr}KՋU Jnv:֯_O:mh+w_^^d)>rXv;y";ϦMSЃWnJn+:{ͯP/t*pӳ]k?.ֳN;xGS(V8餓ַ_^}}(cG'0Ϸq[X8q7p(Jhɏ/ď(˖n{P*γrrfq_]G>fff=%Y˟?|KSmZ^!]¶;G0ZpLhXl+sSN'Ͱ{r}wr'Rd*xBw 1}>#yٗѪ '|ᩧ?;Y֮ۆn 8#!Xe@pp#c\·ftt{9a\ed2nydY>r±~ۭoe|l>eKW0\* |SyᚫZC-j:$M]~sC:3nxssE^ˮ?z7lڽRmlVe^ޯۋ;ˈe'_߿aFdžYl o=%JR7c\t|G]%[|k~@:799lvVjw({,LAGywh_ ^Lo)u "Ӈu |qWJ /=G 7@s>\ěۛ[n>=cNӨ7Yt/4}=<oo|,,yon;8x׸馛[~s3kz2L@6FqÄbI}HvQK^YL'qrRJ@g-ޘ kR6]ߔe'V3\гH6=U\c bf[jkd^ya"f%`]ô2B>=ܓZyD֊+zA`ʞ/u;PTpSPV;1Bjۭ\O}XoB ;"U𘜜dp`ba_FN8]?I}V5IY:YٺEE!( 9g\Ë4"}>t+k?`tt|~y"Dfd)kHbzPZ09xyoB39|_%0;tSi6| m_5~ D(ZAxQo:3/ۮ;3؟Y.CAIї @ MQWYO|3|??Ə.1}u,\^yyq )7C9ó>˒c!WF)3V(M&Ρr~&錠Zdr^t>ff6ё H "x^N:\-r<5p{}WYtp W;~W Hg^dVM6v8j+|:T'",(*#ChMfm6רT*MFM.,)Lre6qc}h5³g>="ٖRJ_ҡhV[ .qͯDf!ߌaNui]дՕ±OjjucT˾Tڀμ@Z)eT~~\K.+BkՉα7)9fg va7Ss> Is>cƜMS+QYb+ڭNZ7#ĉJʕIs٥??Ff 3\O~Yv}W:WzB-NZ+= 8ni7]62Wkuv׻d(s|NGɟMo~o{)*jy Lza^z酈~0\lH#$~+Pxwp0Vyj|+?>zRͷ\c`qQwZ?b ٰIp,`nI F䉶7t)>T1(*ޣ%,y$ qK6U(4r")N~B[b@ .΢I8K&vvۣj|m,Th'*-i~IǬX;FSB2 q]kmN###lr%+ن+b6[brYUۭd(?"ĔP*vl \r)g) u+Ml51D1S oQBߊޙ'2޿WC`$2xNƛ~g|z06Bl"6VOmi:RbhnG’e<ȃMqݿ>0^|ro㠷K_Xg뭷FZ mEU|:^d:Û{=/ygO3^kv*r{F石XcG*myڗ`Ҡ\.S K A> /z׻xG8/O|R6;8\kB8n{q9焲r[U϶q;FQ&ezp\sJ!,7GO^^<;g~t:47o^[R,[:%? η9Cкk뮽>vt 4f2|擧+.W C?čD& .Yίt:Yšo= MSַ?˲%[GQHIK))̕, `R/=؃?~2VT*֊ӿx Om9?88_~FAnowpVevHS4m@/L.Y/1m!(zF B\+y?S_K.7UV1:6F>^q 7I{']3¯Gy8Qa%B|"^ PRj:dHHf;S]p@ !UwӨ p$:&ndS8BlU-O>Qֿ055RK#p( NÎfygrn y&V\z=ws-]B )]<&||s{<M+cLu&uΫ1ao] X{ q#Ltj1^5TO}`]m & u54@D i!R|C&}Ec'l%KX VmC\oL###h&ƇI2]Z0\.G. E6eɒe}d dɒP_Z366n\0lcؠ144~0}}}lܸ tlMN,ej7obl[U q(Gu8("61?;n_?tR'R{xXvWSx`bb JDъ+h4*?@b㸂tAb||<\1xx‷Gd}^DZ}$jꘖy <= _1(]m`=W|f " ,q,.^}O"a$O h#͑Z Rhf&VFiJvDZgBRΐUhKC\37]DDYWŚxč'*IMեY5}7Gl.=F5mzZE53g ҩei*}28t?nJ26>ҕ&F1vۮc=&v'?gy6Caio4wddxQH ,KRyjɺ&4NH/t>"F-;)%2t:dUV,*5,xtfzKcj#\Ii"RmM5Z{cNY|Hӡ1ygv H{yצuЌ iv+e#C^Q88Pw |n`mC%STjg5ivWpm^ $%j=h}bOmd"gEqǵDEf\"l˼:wkdGxOR^f;&Mek>GK)q\`|DD@t+H@icC(Pzz@ҎF[=q͏N; %@FèF23c6Iq,  c~+OJѳ)ґ.ƆrͷpUft,O*XRV[ XS'Fy.B8ֵeW;@ .u1Ap9cܮ)%~/p6;hŽ|h!t MT\FF4#TJkMLd-q'P:d ڀkHF:PITfaNاp]JDXj]ʺ*Lh Ync-Pųw 0OQ I:ƽZ1il=d3g_LTmOrBY}G)ȫlK\"̽L2i xV/I UunkL;,tѴJª_J(FWŦ!aU+c |T?;j!1o$n}7R(ݑyUQa' jsr'hS!cx2j-F'=i!# RXZ:c[x-@]'Xl+OH: VC ^hRPHTD@QG3Km) %eR!"{gw񊔅v; ᠥZ(|6 >WzJ4MCya` _aW҆mQ!dXmƼ] r$L"o>/2; 3Cz\ܴ^Bz IRxP][`ز9zWpkU6ЍLxlrlVt"ѡkZ;w&׏ƻo%qqRd.ZTj&CKϞfr0%pvZWL@BܲT80Œ||_@+FC^v6|cfI&ָ'̹r QB|#2/ܧ8}ٽJXԢ˴;1B#@B}r-,9d~P,4Ov;lhh9#&{ wt@ek?3n3%%JK<B Pv JHe&;eeDUG40[qDYZ?_-_(5mZ60-ӒҮ%:viR)`VppZjJ#y7H45 $ !R Iv*g-$[̤a.I^ $$N%̸eLV}L0 QHpp _viH.\X*# #fBA#>bʴO|𵲧c{ iSnj<>pg64mbhӶ YDL@mj>#`MՉ Ra߬;#n6fg~ $ fV'Z@U4!zX*[,"E"nTG;')iYKmb܅ZP%m }Si#5\Ob1ÅB!n4snIi8Rut.̢q*u[-"4x 0(o׹j 3Fewc}T(;z![pbU CE\|ϡBIZ^ku_? 8 }YR:2:bu3D&N>I>H6m^|q#ӛ) E+q=AQXZIvwځff:gau:DA nR,02rHfh-5( 9@r Z)k"&a=UG4dhk h*.p /c'M6l;*h* M6]u"<62̒ ww'6 iǝi4灱OQuX9|^A d/A(.2p)ڧݪ34_A%64VbAZg6[q]a("M`ˉz2AEDdeͪxlyPo܈kdeJؼ*NvZ $kH %֛5H@/x%cmjNZїsXabrLr(OAǞ4oX#Ź mN1*n4]t뮂4 '_W˯&xJbHI[HmFQ1ږ B1;;g?)յ19 L3Fwdצ \ݘ s 7.pn]eyt$#je!L>Qdk qhG>b̒Iڭւj"NdQS8KT*5ٞߵ;GyqmB3*ljCQtBQ.y޻r͵rfvv"cQ`2b|gz6RQƤ ߙb![080w%Iy*AmO12<ʕI==@jg-&"o9`?~y8Mj!L:șAg[ZI},/A&$IѫCPQRFTwP[ E Cde.}F!#JθadmtУCs8BD _%H @-)BШY|Yr%B+8.u~[g6uf%Jrxydz$%iX#vzьA&`[D6M|i R2;;_r fvˏK(%HٯC 囶Y00掱{_>wtSx;4Z ZMhrf5]ZʶG|h栴\њ'wۤڂL-44Oy4²h^p}q=qq#]x wo {!rm}}\UZJ hVi$L`]Ri۝kG~^]<(&k)Al6aLv4ЂT(NvmdPlU(0Ut>ٌU2nC']<ضU *uН`(Bu+1=A_8C=#|7vރwuK,od+CqPlB,jJald/}^ff򘞚"Jri+%*nS.ɤ]J;A]9e})/רTjhzٌ-29chM |߷>CCC4>$3Ke*5*ssE*sJYjyJR)\eJ|נgi[LsT7L2d3 r,bzfvgoy*P3Fa>˅0Sy11ڵkYv-+Yw[r( _8rB?Ϯ sh˜r'8K_\.ʦ}ᑇ`ҥKR.۸k;k=R)%\{﹍;ﺅk9JfN:Wry]#~<\rɏ~s{yg177gi~ӟrqQ,Ρ1PJ?pJyJG]q8T.,d&89n:VnNh6xGZS?˗tr!4"??RTU9틟+.Cŏ~=Vنp,wy3=?Ou F?2شi'Q6JslrqM~ņ]v cqƗb=w73JjW淿‰'O\Vg]w~ky>n ]-SH.<6n7+Y +^B׿~onV|NN?naffvݕ~q;ng]dbv]5\s;|~J;<!>(fmRfڵO255E&?? ;=|^Skwffgfa $].{"֋z=qrr-KQ3mB()C{m\ B!x#)a-!KBZ6Km;upm!SVO>Uw™·%\R(mq\o:^33wK<B @)$PU+ԁ%ݡť'XHnQHp(!u_9?Ιٽ{C}(!Wvwsy>݂wd[ " l;M?ڍ#w7wgk܏.Sb3 *ӮK-撋Ka{m47(qʮ;-O6cv;{;Uتi hRxs1|]cu7\d Gf6#Ave*O='8-[]wˈsσL%ٜVI"(72OII_O?;3#hoo'^r-/:wq\ty/-P b@0B:?O⮻˟7!a&_8.ߟƌn91e`itc}Š:bnnL"+ 5`םw̬oSOHQm>~8#=ab}60_SUU}? /LGW'el`;O~ݨe0:]w$>?<)S&ódu1x R!0P0wQuE逶DT_Verϟl!rp|,݊"ް|GS\Ew/\:F6DT]%JVx8R`ICˮ]kٹ' j/Pr:0Ql^a!M.+Adr)w[‹/Ls)\!NXnj,]_ywߝGy4|>eE"6Q+0_Imm=Oߏ?Cq0}e믳k?3!oaƛy9\y |D#qxA{~?J5lG~λlW_v =lW2m8q-W󏿝M"g3N=9?g~؋(Dz׵FR\|9~CHR̙BX IDAT4irکgqǝwnM%ʮ:ºƛn3ϚbY ,^b}李>ױaE 5Ԑ_r7n$LRWWǤI@9[4~4{I`z9俐/$ b(r2n3xk;\~ ?Mjt3TU%i؉GdUu@s: |xL8CXv~1Fq4tuvNSI%}5ul5ikjj|*rALنI&R[SOwO'k֬dR``65I/^ 'Z9 yf>Z7pȡ!HUU2MMiiiRPWpO\]Hrΰ[3eK{%Nq466K2GJ'm7_+:p^H=X.,(1eۉ} ab7F[Ƿ=Js`vC $ 6L%;n45UDu.]΋O-!ap3f<໻;{ֱwّ_⺽ˎC\ #F60exuHO0e$2YZGC\ԩ2e\ݵ؎ǔ |W"~ˋtm&NvSv뮤Lkb|;ns0&ͤIUtWQuJDkTj2 5|RmI'P~ol+0pGE;jLT2R=}4d3[x6LV? 1y.S4]IiǕL#煜e =?Td{c CVM!RhHTފeFפ*y/7yBCC'wο`&s!s.7|#w C4f: ={oa47@ðt򌡔ag`qeZFb6~rl!!s\l&SEeECJU_쭗9WsU7~iCI$#=N8ӈI r>C=L^]Ѧ)r8t:xR: 2t*p_b')]La XDPnx)Dp,Q= LdG~/`]vIRe,~mۡ,P53b "(u5\|Lk֎CWW|x4D^BmMRJ;I&fSLvK%Mq q S.jfө/j0=2E"Q QyL S`ZHpu7sw1jdCi6uu5TWbZYB D@M( yJC4놌\GU*W'*"^. ~#GmWJ)Ez1:^M݋d*d:vX,?@aބ#ǐ쥱C7 eEhAJɈQ/TzQ4ͨQ#`uttt   õU3zLﵐP ` LΣQ?CƊ-1Lĸks]r0yCJyʌJNey߷T Qe(*qmF̨tQD"ԡҖeA7Ȣ٧mLuK͋ecP_cSk;}u0r~A/%]]K[{;a;Y6Ave&#7eK!1rT }=ϼ 8's Hi+/KSc PAmheAfp.Z7eXq`eqFZ[d7;>;yrY* K(vx p؃aEr,HR_kFw߷\q8@n.\ץ?p\H2HaDcb ťiX_z2);LHx"M6W`ULf*u [nz{Nz\bN- +5ܢ gJ*Va9sw:;[줵B4b -m7tvy㍅47CN|AR;cU>ZΉ?֬YG{[7]]j$qsN:D8֭go;2u,x%r h 0%sYv=~St^-{[MܑA aӓQ3տZhljC L< -YJ|i8z㐡hA9}sИ2i6wr/(}!$U4-|U\{U16n`-ǀ2crӭ̜yUUUG?`Æ6'Hģ,^tnyso,xGy.]wJm]喻/FaY5DU-ф'U:.TX,12 r0駟DVreW1k̟"B=؃x^Ʊ=rw׮9O1L rYs=Wya]wfuuICQ'0{C{~aX HH$ #}CuMJx,E,V]X,@={ *׋Ftttp=r;m/Fvk6n܈' RLH$RzVCC< 1}?Zan&Fu3ŗ^勹ƛiob j%81w|^yev' MkeQ^s9\~mfͼO/ॗ冷um+{oՐuD7*셧s}uђDu`N{p= p6aW᠚+fB %\ç(3S%]diǭ7'pU%趓0$ `w>z5i2!X䂗qhKB}e&.јE ,Y&&guS]wml5qvキM6"C.|5#b%|;|$SqjlO 441}<|mjk-723g8lgDN?o]wƣ?F2 Z/qseriF =[.S|{osuٸM__<$Qr~"fe:9Y֯'M)bw\OEXjK/qqG|cB?xv(55i?|0}L?d?[_ WcX|,^TBʨ,b ,`⢋f_8 !$|,M5ihhO`k.od|Wb1q}cf8+ /̝7f]yԦt\y%lX>}#O9W_s^t).6O?0̼O:i <~>V(_M$٧M4jQ(OhJ$A Ӓ$\i`gɸ 8"O@9;TœQ"Z j0B"mCK%֬^tcn.;@:fɒ̝;kְ㴝=v y;, ix#\C ۓl ?3<`CS[E&td2OgW m6֭*۶0 Ək׮%HP[SCGGTF?V|g'#ZZHR8իB^J_#g̘1^i2 t:ͨѣMuA}CaJu:MS vttvd\mƆ"]]J6n8lG%|xKcc@twd0aѨ*k֬е^j 477֑L&5jvyAFgw[O<60A ݃hlh uQS[KJߋv$G[L?h׼okkkIy3fL(?˲شi}455D(pKs38K$awߑ9blnxݷߒiin)%6mb0aĈ؅4+2׬^Mss3uuuzR$`|k0rH(\29][aL09#&%j%JQdY0lWIq!.dp=5d+=л 楀-uU LOfkhosϙYV׭]xcƌgڎ;Hx{Rz ֯_ϮQ#P(=WyบSohA8lv< ?:}&|2MBU:U1l2;V$B</V3=nhZ1 uקeYxya0 vW|Y9(鯍L&MD"`C 7(ki"ٔ#3DH$`^V4 L G${`+K J֤? [)W7L+'I#,qSJ] aXXh,>KI kb1QL x=DtW4I 1DuOIJ4Vo.~$t]N/UUUW..QEXU{QA(B)Gox<ش}1siPH?Ex3 o,5`D\ 3 𜐡_X!19|M]*/x<^|N";3WUU yAtrߣ !vᅫ \95|8>zɲ7B!0N0J͐\6se{J;\?v*|4"Iv'Cq|~rd2=?,46E=* 4$J0̽dxR~eCapzחDWz *ocYb;Ɛ賓+/ViV B k,A(.RzaYN r+ ZZs#v a j8܄p+CpCzqV]94tWؾRHW>+n p^~_T!qeQ)u-b"]|YVpCnьr!?<J<XRCq$8M4%=l ]|LIsyHiJ"2]7efaL_ /(4FͥpYPJhnвr&i%2G_o__Rp%'p.hʯoͱTm4aF1?DV>lNEy.abM;_j؜f!͊0*X)Zgs` G'IbZ>Pg X,G_GIOH 4p 7 a|0aUO Sda*=:nfiF)eՐN ?آ ]?wWp|fMi(v'ώikOP(pӌ`bb yڷJW2R cDЄ+3_6.f?uG =tB56W |>_z*PaႀX|lұ":&RIU2 eB!!]0i#DOef3>MUXxƐП@P\2 fQ6 z w*>#t+?b9S'KF!B0d$7Ꮉ |{!n:~I9qȬ->Rᤇ;6*/JC6a;M q,kDrIWSOuBq,זky fq]АWQAk6&V$aSxSI,ah%f(s1$B(FǣItWVK)kĉJb8R5_/TWٲ]:!G ؤ7=+S !tJl.WrA4(-rd8E8>RE.eC $SAW?9j+ )a u =ֻOo&G IDATlޡ1z!8!Y!lS)9V&ܫ«Ui ybxG4%JYP. ,FUJYzy/)?NECf[ڀ 9fb!D$ЂDQ1 JcFU+ *.A7!L<ӈ#~7/ sߑ24tI",_pqܼRgYƍ :u }}}{w⟽{O=)K.n0RߛaԘ,Z*;}}AV) (HAJ<++1yrK9Pdstvv+ XSgjɺߵ{a[(;^! unCqa>wrTWDtU Vi;lǒ%?a >77_ЃjGg{bsS=D$Lse`pTi~O v<[Y[ސM4JϤIXx!l3>3vq{8r BS:8.s r%@K =#,/z =lFUF=`hp敢:W.MM,^{')?$r0mmme?ח's9k  wF}3@5nVwCXIM`q=<, B!O!5R)7x"5Avf )ƕ_I?ZSSaF(|+C 'AξSp7[䪨i;vsJRPȗ8VE,bM~5U "7SXx0$==}zꟹ뙶T7uՖ[N^(9xA&LUW]ìsΤGQ!"RJ̙qam+ B)A$Z90,*KNvn =wՅM+ժt,ǎ$ ŒԎ(Vax)۶`~JXLxΝ:glc!J֍a+=Rnn[(馛3sS1 ҩa%rWe(L VO$0"35D;z |ꟿiSd޸H V@i0pk*j Să{R46Nep{dk|us rw8(xNx ՜q7wM&69ņT%\-/+.CB8eDK(Şxg4ALc멍:(ʙjf u)4䣼C SvIaz@~fe .6=m/nu=Wo8;Eo_Of9nJr߽pG_#a3e[ܼ a! d2ɚΛ[HH.ǣ`Ltm0QƑHvnēNT).젋t;4Txx[C@BHlТv)s47ߗ-lrumnj>C4jhCf6;SQBŋ Q{o05[k@ yG6um]*N?4%hL7\}5rS8ۂDw -Cm"==Hf )QÓsr96|6#`f+Ϫ`&G!hJ`h3ZPϏ]P͘ Da5!7^ͣ.9$9$mӢϳ]aA'C_Fvy]:Wۍ$J%({u7H:6Lf{)B}BЮ$T +Ba\:;zI$Ltn%.'N hX"ei-Zy\e1$Y90\^8Ym1 i7-$bх%QeK,o{]ձs8L(Sw9@HuQE q CO. Lf-30pm O:@3LǍŔ)M;{quL::C!!0~ 2XQ)F ! ´ 00ѣG2ed\Wu>j\*:pztv@RzHn 3 illdNu]ivaGGMR|*Sycfdt,/]\pXd ѭS$kk8P3 GsT)4yX"Ɩ[gDcf.:JCNr>~Łnɩr8RG1P԰ajj܌%z:{PPmH$;.@m.ڜHO,[x1_Rf6GW `q+Xx)<̎vOᚽxyn<~~^yɞtwQ+U7]Od -ZyoUَGoo?wK.b˸44<]y=?ŋ[o?Mtqh <ݼ拜=s& kϯ}=rK-a%<p1ÏRЄ "+/1,!e XfO?Sg:;?+~%Kbeʋ~MooopBPk,]5]9v{8urUqEڶ)%8`$ Nx'?<,^-e׸3DLzd25a„qd291x8@/c[8Yv5U5 ^~e>/O9ߩPl0<:60}A|;,yU z2vn;kO3{Σ<̓<Doo.z.`=L6 `睧ߣ6.~~~_$ ul5<>![ =0]]]B-嶶6.|^r\epp-w x'tI@?=t;?<< o"s::ms 뮻x{hoo o.zモ^\,pnc~%w/pmDiyN<8-[ yg8_ыtuuqʟ~wH67 ;l#>,㷘`6S,Sv hlcWyfSyq^%@VZG$b2'1Mk+8?d–;g'fH%8Ӹ[9#(?ȿu6s|{{/ A:ga2nH:;dr\yepS?E?. vk<8Z?8#F``3O:z7 /OvZ+#;f5uqli=X[?c /¶mf?`! ںwq5ֶ.\;N;9Oa.Ǐ%s/it1OԩFWGvڎ38ڗN__X̢i\xu&M)$p=_RSS_~FKK Wի?sΝ7|%1 U{r464ՅJLޚz7Ɍ'N3sA3tȽZhTۏ_~F\#$O>#]UÂ知Pq5_wOlf̘1LrXNuֹTWu6$H3b;L}&Mˌѿ^t)wq7x;;-?4X$O>DBa Nd;/_9\aXpQ\qe8vgCzl3y[Eq<"FVpANiћA,'s嗫d2y\~]?D20JIKh˳Al.vAKmCKd'PdG9}}=%bR)CDZ#'8G/4?0,pIGx`­r{Z87 ~y#rs3 V'j**<7_Λ ic˜'"H|Gz!,^͜v?XB;DFݵ+W|:m M<=xr!@2ٹ 8wg=ȃAHsj( r9Q OACvp KVJԶ[/#KأOw= N8.  TfrL3O^c .&HИL7ފix oC{yW!HWy455ljX9}'HdšG̟" xRUxɛ+a1nxM|;Өg _x5G;6l\QGEK ays9O%09E]0%[oW_$HrDzۏ9cxgaڶlܴ'xZ6|FXmLNbqƆfj9YSG`ĈS |n#d,DTG}_0?z_|b.rL07ƮgCJ9Y pwaZA>3֬]C.YN*QHnۦ !b^e vUZ|79 &JW쥻;ƌm!/YgtU *4MnHLej[ &P[HoO~)G6e[T3o 47`豤bl&-M͌7~4`]w{$7跙v$Iƌmb;D-܂Ɔf0$7㉜N3<0\OG,>Q3Dd1qJ0a475݆+Vge=QA:U{Mk7̘q0<xÏ _eݚԦtpMI}_*_Hq&7~$ \ƪU_p{q5&^3_J~8=:.vAQGCg`QZ y0K55iƎ͈4f,D[nFjUo<`mɧIz$B2'a=~v1}A ƦzYbj+=$pQV>r؟B ]!#v&*M"/٘J/jX Ӑ:Z1Dp*DHDMӛ(o"dDm$zQ )q4X E#%+!>-Z&+O< s ՝q%xXV)J' +g7m:xB `lADU!;wlV + O(&tÓ>Sm,ZnkIG $*sH4 #a\"Q`=cqƹ4ַ˕ђH]8eJ qp@s ,CQxIbĢB-S:\I'3eݷbR NAT=G; j몑av/HAo.|>d"xң&믾e8<?0=>#՘IVsf]'||ŏ.|..h&gϼُ?A"G[NG}Cmp ^~6"ѨSb 1T2ְ)U15΂ %*3_N9V¤4jT>]ސHJd~CN:l} =r  -ptxkjmRPM  oA4 XC}ͻ@J+.-kb* )ywZ+EΐJ zGb1b|bӄH)aG3QLiRc/A%"_d[`45 9VURM6peĜg99 E\YaA:hEn7=G?kYvGm]O=93Θž?ƍ˖-@c}֌vC-F֢)pi!p<Fna7ߒf|hsx>_s }ټzѪ"|ĢGQ#PGDqۺ/>)mTOccc03Rbߴ͡LgiS̳gRLO_oǖL?H<#iʦK*"N9XxpQ (l'aHOz _v4 dI>;v,D}.;dyNnfL?X4En;7Losӵ7]4pmL R'!)0 ybև@X'ᬳ ] U*#GQNQ ]G1VZ{,?ĶmÆᆪLŃ[UXK.ɓ'aQRTT1jh21dZ2Qtv Ess36lo *o-c98˗/gݺ5ۡIX|9 |XZK ԚkVp}[ BN?t|.. $c &Y~ 2gڃ!Rmaj</=O#-"6!)%VH~޽OSIVe|Μx^Ʃn^C~-h޲X&=tnyzB'ct'o 4@iA…̾7!+5\g?s7xHYpthzjeS.P?855͊+ D* {ER15\s5\},^s7|=W_}5~;4cliK6u-ϳ~wʕ+y\ENX{+4o~ظi==O*"oDC?([N{~w\sU1(,_嫯Rpտg~N޴/.yً Wo9S1w]-[ƽlGw^.r8 ]k%>~bMd/8v|m4ƟkYV\NF~/}r > npfggo勿Ȼr0lg{xǻ?1֮^wy[֟]wŻk^Rļ፿M'Yoru]ǡCyrw}X9gn' /_I$Ns5g|sk9.|JKI}}}@._sl{^K9|po͚fOSMhqv~9v_*q! _7 zfYeڡAyU/TvN,lt\]veه_o2V=%O΃+WarjvW"A۴!M/cssJDmj TQcnmƸ'SŜwlx"KK\ FE'c)nlX38ײg.ogFC?B^Gz4)wzƎ;o3Yg;}{[9x z=Xչg ]wS7jN@`|b(|0?s=M6Qo|릛k_cͯ5S<917}&>M6{s8Yfwcsaf[oiq 'r=rw3<.{'t2R*ny3λ?"Vu97Uxhۃ<4cl [)SܿAy֖-Ɨ|5O=Oͧ0==LL6ysaݺu|_]1,=7|8gy66/q~ [[Xn5O<p`e<<ȣ|¢ys[`Yn69|($Mrw5 qH1\Z ЋvgHZM tRlNpp!Z4M8t:^/{ݻ^z߰nF9WPស뮻szj:7&l‘Rb&ݻqU˴m0a8??? ',F;=Բ'tA6O=;˲ִZ-N޼Z-bOE!?qSND"̐^1K7s`qq{2;%a9EcL ``-'oڔ)yJطocӦM4 عs7 GdnaYb&eO+m۶1;; #@ ~#Q͛OvI{>̡+`eƓ"7g8 6^+Vpcլ][o8Cg֮E]Hq?c}}9]gvX1oYkQlbٽp<5K ,r?‰m]o&O&+Q$=3Mkcbo"훢Q-pQa"Hv!T-kރT~7z!3oqL%4䅔~ivt2s\CtEq 1JOُ>k\ym|Lbcڍ_bƍ _F\sN whE!Vh~WhщEn洕BH~q[EcXRyılbbL!H>~NCT& "č)v/&5֨l֢zFL@(LݵJl!^:C9Xmx OɞHR ʰT4͘{=eH+J&k Ӳ'(dLb.OD)`iA@*CW1j !$I)T?ID9mJϢ0IA uGgf1اZ3IIz1*I`|Jrj&byZ.-LAjDq52F:!#8%ܶp"x9J^S&]+Qd2"rצ"\)'ų^HfqDD`*&dASE5a08ֻюu#=eASp3\O Mc7*Okc 5-,]l8a*iX }_.!=frjot+˦>g1WEH Q(%t&Զy&hEHAUҢD/,BvF`E* "=P Lh$Pׄ 0^:XRy 5JNI "VX8Q$2gl,5SUf.E0\p2̈́#ٽk]^a(3%/v6l0R;PDE[8F7蚧l*W-#hQ~n}/kfyb UvD5.\o[=/'%NƔڐMR05k !M`JT5-;,t*/%/uRvB>"f8%5 ' +9o[I̎L?,4e=PVj 7z`|Qrļߵjc[tۥ>eF|j;ȗs g-E1d徬xҲ-ʟ R[ mن[\+ ِǓЄYf.y ׽ s22W) .ZeOo~VN ,;y^ȫ]ی醥(J:\yQRZ qL6m̳t,ɻO`M*jA X|Sgn<&eC k2x6*7vf1pZfUv-l8DRB: ],AUNdMu*meHY0 e_b@M9 ,Fynq<{65 yPe4-J ؤeq͗0O]zI-ug@hڝlf'L> RD/3Ka? h2 (ZeqE9`UNWrUg0T>g+ )76!y w_WypdᚅO`fPd; 0BH'dnxAdE"5,ڠʞ۪JkUm$`bfTTsC7b"迯a.e9gfaLaii 5nˁ#R Z[&hEk*.uC 촖f?e c)sRi>\``L<*.\lJgt/4ʮS a+ϠY>ti5PR9V\F‚AUh_u`j ,d8EUU!QKuTUǂj70Ч`ψ.޵*H1668VIuͤ嘽fckai% ¸֕;ǵݿTaqL&h.gUE( 6r@6\^}}OAKQد(M ZilF,/ 5^B<8O0Y i%TTY/Jo_*s@rIGtU%k6K6UKR}ycq >x맶44" sA*-8"DBu#5i2S5du6!EȬpYQX~ ,ތa 2x {5 ",DPX9Z Lpwl?lDhfyYe*)=IQQW]XNUĠ$!c Y &EpZcUU.eeESɽDԵE y0P5j.faBP A%Z_Ϸ|hgsuNS 2,[)N,Q6ȜQ$`IDo49<]lxA&90taL)BHEJgU^:Rs7^M^_TIjR2,oW1v8.V0?/#4CVGv)"( IXk֩k1'a. W=^_b]fDVzV5qR;=C$PZ`S}n/9,3ЪD=}%Rǝ2cbX=B)|Je7oUƺ(.B2W՜I=( 4A"u̔mKSYY9UP2݁uUl,T#ey[h2 d2s URI@:Ҭ0GJB*`$P, s"J2Hʮ MUhDםts 1nτ?J|(M . ^K:S&8 IDAT#2<%5vְg:89}^zN5cR$I k*ޣ[Uc6Vs)p[X" p%VlG >ciN/lhӝKWeoAX ң.KB0|x%6$_c*!nؗh*$9.&JVYP9< wtC.h! T EaP_hEbPpGaMfGWAFeBq+n9)ԇae۠N-? )y ݎ"oKuT9mNivkʯK)ښiv)5,Yl3wl#p?V f$oyul;#$dYN,K,"AYK](L ϠUBdEqI`Fsb>@A zvL*&f[5e p/YM: JH"+:3^JY ctc1IjRrWNy0H1 ˈ.d9zg=t7pgh48vJnnr@L=Urχ>PTm|@q@`+b~KenaMy[*nփ6b .AaYT\ UX Ay_̡C;/Xg..El3I j(o>T(m)m11{5bwۜ $Fjϳ}'0IdzcI`^)>Gz?mS6i qnbXh;0+-z;9\WJ=s ,"&'&ޯM*1xmk V4s eGs}{?k׮ellC6Q ͩpRv议Me6MPA/iƄTmJf1,Qs=JnNk'Q%E, (`emn:#gfh}A $l2֭[ƍGO:Nz]1Id¯#l^&cbg Z:k6puiUZӑd0­'N\a@9g1}BI`\hhA{ ц|3 kMtڊўJ& IvluTFR29(hw:u?PeԮA*-v"ʗ-2 BڝmocƍLMMeũbC0v20He2Qq1ROksܐ-\".GMte2eiYF6E6KoioK % Zq]Ca{%ŵ=X'{)eH.??OLOO57q3fk,n0=:y`9 `n)8G/ҎR7p AJ!jJsL ;]X"%GVÌi0A42E {&Axk}zy$e=a!%t%IE(dܿkx{YI .\!5n ;mD€̌@25biiŬ7"#QYfB[C]Jb$c&'&&;}i')P+f%4?lVkMe5l޼9TR|q*àtЄebX|MqN`栦cU: : bTe!tS~Uz=kFh7)f 8iv()\WRgIV+pRO#!H@6X^x:fv]LOcH!LN롇sZĖejywwk{ kC$l X-Ho /Z#'`4!h#!rI|B}C!"7$5KR+5bbh_6[25 QgQ) 2Gt;:h8:PS"7"qJ)Xz5+WM`z\w 0bFĞ 1G*GfQڋa3883*C?(˰Mנ^vL2m%I͛sZs5)Z!JK)3wKa3ltnBnC,CYeÎǟ {m'>J"uR@= Q 8i`HG?ךSL:KH$ސaF3 R*ThIII*(^xM.TYSNDULMh%~r+n0|G7.AF1&e=7yp0@U*2f ǣwy"` ծN@"C, gt]<\36c7P:ٗM"t81 -4奄DF h tSk[s<.$\u#,پkn\Byʭ]:2}E:(OҒg=e\ıT{a cLv a ?/ Ǘ^J!KErk:3Y9p@5D#䯑nVgXidϒ~TyU^\/(M|IhcqtNSNt('(% ' ߐX)wHI7ќ$Lc7?085BruY)IҦ% }5,鴉cEHŒ g Δ1S7: lI9WQτRr1c=ơCfI65(Lᡵ $OO˩j}Ei{vVޱG7T2d4erA,lR*;oHzkpAA -*wD:d_E`d`?R}3%V 23<}6,3JuVfٚ?ߞaR \X]6 mRdzfzs+jƉIN}\]LVM6&bmi(,uY[9x8sd&3MR"oE^^ Ia8uo%Z>nC,dLJLou F8R, 0N3©y-e)B:9#i=H2c(m/"kzzIV~>=)[UB6Y*^{H-5a{$SV\akįAoRɜu%>Rk"!uսї+&DE˟Ν;YXX c\8hFݱ֎bv>m@JtDBD\rQ2C#t}~/,&Z u30?HǤӣDe7$wh$%3m$hn4}DN;I8r333Z-&^x!?ٷo7oVqO}zNۥlrsEa+_ YZZ5x;{?O|zLNMKTH׮j@dPS'Y+EL;f.imeM8aӣӹs}&vEdօpP;=dۤ䫯@@="RAX3DL4ndDWhDC1>јKPD;ً!n;]Љb|jּfG0 {QS`DŬ}%,?e c&/Ia!,[Ydą3mGbgYܰok +/2 ڰ u!=DsAT}s<`{]|a-D#AȚ&: Lv '4>>k.--gff'a/+m{h*O_Ʀ׼7at,q,0Rض٬{8|V}N8/z9$D->?ʃW_sCXܰm[ּ̞qG߼A:*&@*&M6X%K۲<شj&m1dS|NTRcDPަ Hd\kA&o&̞q'^jg8G$ 1{.mOMt9aSLmıKc"!hActϖT)t#ci,YVWͩ|uh6jD]e)prFc|Ә2r"A!6KțʻTl0D2(|k-{allu{СC|VEV2C>jah4x_W_ѣG\6 BW|+q\r%}!82DfqMaf(4}V@y#AJiW:y<{;SFRyܶз/TI塜(nKģd1"q¸Ѵah-jaJewP7]߸#wS9\f~|kױkf Vq~F %Z6E RŌFXB/Q3+8tbXZxI[-.:m{^ Ȇ7A,ؾ}VRaS-U#&fiIl9f'K,.-t_Zh ʦ 3 <4HiZ#l&Dƾ%M sTl6z,Rzz;z|3[}s|#aaa!=&MvZXz5gu[l郪RGw]\\tElٲnK.[lSN!17:\hV%"ez1i/s U ǭ^TP G͢3X |0 gs{ֻ#=?`gi{Da%ZHm"עvBCcKsR;۶rW0u&Ʒla$H4LXCs?,-bb!PI4Bj&U-$&DʒHA-2 A+u.cWaއҀ4! 3/1}p 2wr1#cI nV$M\SL/_Fk[Ƃ[jKuD*C-n8={ RH)&no*A%8Bf1̙n{ޯ'"#NMMoz<9sxͲe˘x=ZK^GeÆ t2gbbӟ4> w}ox\o?tx H17nzfeuN,~zVqisw笲R\JQ0p0~UE=1iMS Ѥ)YdH `쫐UnId&AH9s?w <9!|]!+|Z˲ coRiEfRJ'{ dD~e IDAT CFtš : 5 qMP_G|7OНo!MڇU7#DM` +%crՆHC$ItДUDqst/e|z 4mD$@!xFП}KV:R&WM[$L| eR Fp蚓[ҡh A3VcDq ZLA9FKw !CO/bʎ qT' ~||^Wn~ٻZ-|^])$;볟,r /}KsbXOx^8^z)Zk^W6fO= EÔdq'ӸCFJ,L2Z9t5OڬIg_}s 7`f678/ߐ^p`JH6 ^N*?ۻ.PUYjeM_kkk'瓞S*^_.2Jtm z&1Ơ~ >f( [K+Yu޲xz1+;眇ԂZC<6yLo3N 9^R(TM/zeMYܿđocͬ}IE4!S$CU;(@ނ%ɤVm`(zNZYn/$ &IELg1 fD&HMYgl2/V J?.e셃k׮lw;LOOw׽u\ve\vef۶m\z|scx;/_菸+PJb ~w/fӦM9W4_-15̕jRL8N48f H?#祤AC =!T~Xl2%"gT^髢s gl*Qٱz2~KⲌi[>?o,KK?,p7Kk }Kܔ9<\VL{0a:pi=sSOm5/y+>Zwi.g}[ܦ*댭X5/ȸ4G)+o4}[0 @Ďy;"t&(:SkjJ"„M|tIq )!I=uX]51;睢`|d6f"`Qo`oHhI&-UrMկkɆR?37|3w}7sssя}vϟٟWT&7vʩZoo5 IC6* )ޜJDv)^k's y6>05d4gPav2f !ddduQs(sNJQ2e8I)o=K7TS$=[Ҥt.Kru^朑l_hȴ&9vG|5⚥604^Eld|j4X:t}Q1aaD~ 89iTb YNzfO%$^0(MPJEn\2\Ε8+EHծ`/kڂŚ`qS)acyt.\pAϪ$]jQ̫_jRQ%".. vY9ny ^^$IBV~=ZZ՚ۿ/y !s`cJ*|(OܵNQo i_?], ^ 4t!fPf.{r!qPD%I{6q>wrrٌWNN5|dc)[澟L+d~1=K)0 (X :aD^eY.˪T;Nf'"+nz^e;BA30؊ }Jrbm"> 9(jrш0_0Yenqxa+>ʔ]nD襌_nfJ d2PԌ*躟Tvm1aa$ -lHjM &V5M\#A`r@A`ƾLdS+ ѩz !mK T5dE N1!Nh|,{]i%8fjFQ䎆))a4pzDdYV(XT)Hp=8~ט`vv6]+Ux0u`ff+WW1JH5$Y[H 2$ RfƮQ#єOF֏P[wQr|)7w|% '9 2U4S\T ,D)[[l!X _CN9xk56D;.)J 2?,1}yXCkaGyAt:+,V(Kir:BSPO" *HH&B!%ȸߕ%t-ZiX bhGqectiBK] AM2))\3' !jy&MK&aLB+#dFJ{Tgoc5tDWw“hТ)c+a(L:"rNwő#G[U1C" &BoH笳⬳ΪȊZ矟y,8RXA-6Gg CZVuItʱyai],7kc1z )w%Nľ+l$Dj@ uk4RJImA5ڒ:U}ι;3$$ = H` `!y&[` lpG,2$MF` +$cd$4H3{U;?Ou>w@V]kFwڵ>Xrs+⡠sR4Q籔)4Y9JsKpm $06Z5eRR .B:1$kCFEßЌaX$ L55&ݳV.| 8t7#O뇸a,"$՟Ms.c(h6ՋZ<}[~2TA{|O@}DYa$v>GQ `cilJ݆;o}v8bii9K`F$$!զc6"`-PAQ)2.&VWWw7ߌ[u< O%|=\ر ""'Liv͠l( W7OdlbVlC8{h><)8`0#Gp߿_K[t\A:p@ `/c1c.gta!!KD5?H x@uG_x : [GB+@ GAv=<:A $Rr>4MzomT f!s"a/Mepڷ1}~bfb<S>cTu;\v+^n}eR&bNz"1x ~O )?k*%[_D4C}BW(POu9Q Cbȼ6@"SP*D=5-[ʎ8yG2@@ BZMԥƲ2s ZOg.fv41a<1H{lǎ>X׵yG e)t#uuLv)W!oUж>C^4Rc𓷩 Jb<c~n Ԯjc$FDgal{jeJDL,dF*FQ( X__/fף1ԪEX{l(KsOjHm䜿?)j9XWɮ;h"mqSF6D_MMc( |%uzXݵ ^jg-BΗd7k#BCޅ~Rd2nn≌GO8X;EȺ?!,)j MlJym$LnFeX jF( kSRC@4A&"@MyU&KN K} P vi RDe?3"\ >(oeq7~b"@[%YsYeѯI:R6=־ aXKkg]uNNZUZ2x $@',UIY͆U+ H CDQIyH" OVC)e2}CC*%JrU!T(DUȾLA`˱ 懧ҧMhK`hjY>ϰrÆlxsաL 5}Q|WZ`ubxk1}X 1%95`ۈv3߽63ƎjT7󆨫rA(XMrsD|]y;*T̈hD&(34 (:xdF TU8R5wa`%̗KXa8Ƈ" ,Xb"ABC\7[Mf䗮k&vR oZ{1ך[@|nи6@nbB\ԏ3Ps4v!mpe(tStNX;XhCcZ>xEʽѸ4@UP7.D=3TkG33cB83xIɀ4 #ĉ8D9[-ZFW Bx6lN: NK $Lfh6jfS^Zx \yM.Qx=AWRV)c~׷1p%ov< m{sV.ʪ]ꢹis$ӢIpty;}mn4zuLiξ^#u94OU.25`mqSCTY,ER)q2Y9ts Ў|VXke@ QB5`dm)3F_B͞EY?Ù󉒡t1v :#sj]̐*]5Q&ԯ3uv%Z$g\~Z#6U2*M$8NJ'VC eb;v"ІPL3-`*o$)Ț1Q~R= }6یZI)U+^/gR5.Ad@LsrM[_x/P湹M,W?Ȩ.;ƨ ;'V*MU;[gu]RUTa8:\SK1G5VlUqTܢtњ0I9:: Ȁɬ4\Y{:'J0+ m9%dJ6"DPHHAߋk^1Ň1ƈ(<~2e5:$1&<{OrNTxԴY[5e%*J/` f<a%&Kn\+/cӃU+˛p& Ӡ n:TNj3OysQl@z6DpLβct:sG[ZYg(Ec-z>&߉& &屾Jk}IrӊeQ_r&u2 sIfob8BhYX:cB?@@kY&X].0- `26P\R}bs5^df]tChp8+pDq} ; h% ;!NTX<{! Ѝ0أRHYKa@56qœ!H V*^Ė*y8 EIM- ©:;h_f8xaF.֪U64MJTNeQvE5Mk=e)z~h.+yeWuӓCLu.*/JJ5ʡ@^c_IZ2Y&jl4#IҜÅ}M@JhR- jpɏ{P)Ra$$4D^)=/Kh$sj 6[jY]ɓ-)qL4RA6ְT |Y)nVհTDfj>ze\>t+5Fbk.(`%. 8$PRJ.EDZq[I_S Ȱ( mu@jk lH n=*!bClVfcLA0Ԣ%ZXh*騞HcU͋r4Iyy1}R& m ';/yx)[u^Y]"[zmaݵ_IgTƝ k]{IMZL=V縶ɲRfT4F_&I&YHRq(0ňNm-#&*V8uV2r Y##W”I0)#SiL݀Ví4ɻyŅq6iga│B(Mj9^akޮk۫mݞkZY,k+80\V%vM[D]LSU 67XޱAFX__3! Rb#0H2$ ?+`X Ͷ֋xC UǴèf0˱<cum7I7N{?Sr` ;hZ'ەj{p54vYH{qp&$hl4:$#p 4YBʥzq 60t/>Wk 88Ä-פr,@+O[gV=6Mͺf5Ru iQӴDVwwmv•j@=#!+nXH@iPxQAQaKU'x6V<&sZؽo8V;4ڭgl𶉾ԭ6MX,?ms;|O'Fyٵ7 98p'S׺*i|͛2יZ bF`+W}nҳWc4zNI@)ck( H66) HԠlk` $)1RպY;=%;\.Kڔ3e"Y(&!J$~M>&NAD[T*/@ rj Gb tHdtμhVWL1Ț$S- `móBe&:iHD x6B|?.77QuMPxOӚzH.r}oSitۜG\ߴξ3(NJ3(}ib:i¬L S)υv IS pOD(#h6*AJCpZݗ V$dCΓwM`M0ɨ]O X"*U.vbKrPc,SͳF^Ŵ9ϣ}=Js u^tOF:&EJ.n3Niה%T*~` O̤\TI@hJT}xUv,MAmjCQjlET*#q ÉEmp(FVVVrc'\"ggB&7Sk^?i\sq:kDT:vE9f)qj*&NiE~t^gI`b$ h!!!  5M?51n8XkN\JM@Irr, XܴZA6\I-KӀW t"vjX|w~OuTB,dn[MV6&)>߷;o2 4d l3}ɝfs\'v<aATQj  ߆cfDhښUQ @ =!l m+(u>+3ڡ\ $ F`ItI ! ^5tmH@$4A1 4$5HPI Mk)Ԇ hUQ0Z) h{+)CO|Rla(xX $c%cZt: a  Z3ps s "*Q:kh<*N,δj{lGl+y9F;uQ*U e j áj=3F`8~Ib  P.TRﭿ`WJ$t'9g+aX'gͺpUKZ:̦&1N CYJ p5zpZZ"&9? 2U K`<|cy;mB0 kcƏ1c }`$F;@ vvB,FgAK'vCvBuV@K X>ݝHнU˧$E$2bz8W88g #P 9nH(0-6 WN?رcR؊ SeTfHY#e0B)1þ'18\K]%HJ5_믿{.~ɛxÇӉG>^z)v\c Ě <[o^ȑy™uy. cmm W\qnF<+pCXY݉ /o+>!Mʗa+en\fILϚ7V u<NqXkhE %#ģMDQŵ* 4Ea?Vv|IQ4p8IV1 ۱'؉]ib!mr(2DAFphFӃa"$$ R2fF#Q54h0>cǎsA7 ZWEdڴCk}~gqq!|ӟ[okÇW{|eXYY4$bGqyygnh* >30 +J!F~$46bx}3ϜeQ|Mox3سg1va?Bqt} z׻g>x+p5ǃ ?zwkލ׽L05<(Jw~UWa]u\_C.~<jj5Y8K%槕nm2nU̬c؎,em泩(473L:Df)Nu0XY^ā͞섑f4N BZAm !媌OY4#ɐ ~  j핥 #`ee c*d@dMHt[*(V)H w@C:Հb(V!&xIRt ~YZ?w~[7v&YyDJ)SC<яƓt% /p8‡%C/gy&@|3qusB IO{:AGqӍ_@'!Mc,//`;ށÇG?Qݻ7?xfcc3t]\\W_ ر W+Zz8 Y0[w}u.1Q*߉E:!ǐT"W%HR&4BQ . )T`)RKA ˓cOmX(KSJ*H-- (Ħ{iM2U$CBHTJ 2 FSJPJ@pAkS[c2$n4M18V`!XA!%F0 |i8un|_p(CږjZ\V!I S3~os _EE翀o<$$k'Bum2^ 8 ^g? q<e; ()4뮻&OiOWDQ@b{ Wwy; ~կ#<7i\ySpl}ss]~Zy> FM nߟij"=:DDa:;J>PԩX JBSm%@3R/]< mۇЂMY+wcyy1 C0#E8yk^(qU`nn(o=[&z.5N޵W9cFU KcbsƮ]1G@< t!Ksa!- Mklx"Wa98N9d\';6>뱶(0z+[hHQfrmxq$,--A1>.#HIDATO˷|~OxN9, 5 ++$khcq4گ=_p.|$QH$ 1p忈e !g< UvکUj0R(g{`&cK+u!$=o|ӛolgD0Ԇ m¼ gC=t06y?KcDAMZ}V#)6771̪'J7VI{5MhƉDjA]RcUg !1 s~ }@n4g`(@/` ~|??}z71VGqh KXBDgu6; !g[C"=ʈ@' [)Y\D:삆cuJZHxc._E(]&o#r=Uk*(A u=wKr9^[/řgG"M50H=|@?(G>9J%6[x8q pm1_XXq45U2ޙGx ^|fĵ^[y0.;}>n;Ww ,`Ϟ0i4cٟ<$rB!%J@NH {>8MccSAJKKi,q~Ide83O"3CKԀR`FAA$ MK F HH8yg =ص<@:@WHpbaiq2 {ű#`[#hd `yi8Anw::^JG>dBX5!06Ʃ3߅D3$ vXC<y޿5b" ΪwU6t(ma`c !K xo+opB @}`c}G=7|W\$$)N?TFHm>%a? H/zы G&Bқ8spKhm"nK.ymFVenI\Rv-7ߊ?qE|%46s} 4c߷t<㢋.c c ձ!*,9H*X{۫hk׷vYYܶjTD gBbD LD uzH)P&SٵIENDB`./examples/ubuntu-ui-toolkit-gallery/map_icon.png0000644000015600001650000006464212700370701022274 0ustar jenkinsjenkinsPNG  IHDR2>sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxg,y;ƛqE RLbDbɕvny%Ֆ\`sպAr.KUE$$R$!D.@$09=3=Tt3" Jbu,*s]r!BUڹRu{h ><'HA䚖902H:!{=^(ra Xfn؂)yR1=(^)RR#EqL^\Hu1,;Mt4Ύh}U&҉ci¶:?UuY]=5οA{,*hoB4AK)4tv02M๝e d~+M~(pQZFSr v~X1L iTjT8硔bvvvj=֗mm`RO5;뎸ɦZOUH,s*Vi6'ٟH# |AۦPiL4}9(ExDKh0 S1- h\au*BRSi,R, ~5Ea9ZKiP,7pr_?izxI;V ߏxUj%oDu70MXN(W:mk#<0.QIAcX|_K>\|o1i4f~/6@2Cs{w àPn\}~MG)@7,'WrX4Qzntn D p:u֗N=l@mfô  D?Dmrc6̐L2UJj#UʥڝU)0(tۛA"a S*+.*Fg& }:[+8HRvRIY=tUk:qFS,5(7)WҘ O_&kWNvXC(iy-֞&^'b!G!$DdKƌcx{kJE,;7ok'{_2[)8iX3r%:Lvۑj%Cٔ e0F'K|P{WZrl6kk]>#@,-Bs5TIH<>Ll+* * RhԈifI{8 <AQ`~4ҊSqD~i왨2i]@eI H^BN<^7.=vT5"ɕF{}:ezK^|]M%,8Z{'O k{h'?Jdb1Sĕxzݠ^2yeūRp&78~x#Y%rοBFGiXN.wG~ Db狃Fv S&.*RR(Pww;hm-y.ΫoR~AtaxmC>!Mv"vQ7‘cD>O>IzjE+F]yr4 9e{')JysbLC:4Ov]_̮]ɶ T 4V ~ :5)bQ^;fR~(mʈ7փk:V^kY+Tz:|mm-Z&p;:ļpO`DJc..bvcVhyxuhu…إbv8h!WV.]"!P.?o=N˿C\o^&x؎CQ²Tx"y]+v ː,4l:w*gonO^N\矞>ǭ,p7yػ:nmű4N?{m4ȕ!F-9a4a/V'hV#ۺuGqS'_``.. F1ƁY,!yT?Kϋ9q|Ȟ<)贆ra fcZ={V{Jyn^H0?_JKTAR4N[m+tJ)UX~MkMZQ(7fP1|-n NNkP;qS /M䅠<2M4huY,Rnnyߕò-L<6sU#`rClwLfL;&5r>Q.73]`}=dT_Yj&b PG8dy 2(H3;)Oqm8 mhӑ}%E1tu{:'9?s%8-{⭭֣+aȕ R۶mY̚{DtmT Y<(`x[TKm 9^xBОiyRHDa,q=7ݘY|R\e9u,uN7摇#3yU>#dŝX߸ ϓ+vMuv ӲPjLzŗ#Z۫47.vḧݣ:J=giiaOОCa% yhD;ᧁapG.ǂe# .u:[Ba . r`@)o"`\ 5Ddʚ,~$c| |o|p Zj[ e b^w(z| tT-݁6J}q07u#Է~MWhoBKhn"v(/"_DRX'kHkq̳.BҴ~:*M.~">8Kb,Sr"~yrQC6'Q\/@}DeRt/˕)k lFO6Oje-YK5顰.(vE)aJ!] <~˞ 3Q,xM>|o=(E=ק @?1Aq~XMEXr&к|!Bv:i:fG?>CV8aO}vrN-C3@"INHn( prEGV0\YqLmĦklM3ό>?9{5ZiXq~ʲKE.Ly>yX 699 ݯApk.ariC;Afk}}st:(>vmZS @NcYX8a})yc u[lo-!^L .RS\it( p-ċ{CL :'y;Z[S+aȋ@닭 # p9)H47~t9(|\bn\.fНu V' #d&O#{'T rc]iVcI&4GָtQawk?~r7@^أr_%N63)kzk)X.8f< {6(-@q$wPq﵉bc|8ܸ8RiJ>y0'OmK=A@2¥0s ZʹWin.Y1[zwvʽuY}EX4V}9R_t4f'J>4>(A0|#}LbU=jDXDaHaDAH("B8&BbF`0(Ɓ2;6\;G1|glDVԕs w vMhROq_,טZ^GŊZ'8$yFPFbG?d?7~&?8# T*$ DNp.d{E!iK}DRw1$Ky%] iPKݯϵ1?W7gi4 %1.gĽq,]x?yK4À\sxe'܏&>Z)Ra9Ћ0ted]_2nWu_&심A> 9Y60Z7AG{>z>^q=/Z=<ߧ\v\r81G50OqţEoS.;qL>ӐO >JC WIe(&Hvd@ʁ6:&m1a4}#3:OwNŃ9}=˩gCq}p;7 聂 (x"AؤРPy#L:4n"_,1qcRJLD5> ]ƃo/1!d9ɭˠ_korl]$65zDŽZ+X!Z>%\vDLMOz/ pů|eP;%l 3\ut]s=|s=|/\vsU<%_Y2<||<#klw[> Ng^ok$žUJ^ş_~Xoz$JJuF O3xa5ZʀPjDNG:D]> g!pG%r;9^fG B<ϧxA@A@x.:n 3W>*0^ R ,@+D$k>[ַޠToPIV%W $so:ah8*zڠ4t,ڠ"f9`BC~N#m6[DZsS"_MB\^}1 Rb -8 Wpӟ&9c\mY)Nmr)|'C`hEQDt[t[ Ljs(V戢0M?x>!i4јSt]k|cX/7\VW0s/R,װ%aցsWeC#E\O&d}g^R:PsVZ"P;Ew}Pۿ1oVcA!QGqim1nj(}e,|ߧL1(Am@QK}3Od9<3^̗|orۭ #5|Bek~N1YҜ=,+Z,efH:* u¥瓭jdWuʊl11?xk.Ep. h^~Á's#e !@iّH0RcF T+jH)8c~R#ng smκBzZsg}VOba «d/12rF΅)R8I2LP:"<5s]X30\ !}7b IDATf Z"BA\xsA& m30 !ٰ۠ybӧ6oq9gyrs FCbs!|;ʂ4a⛝+75%YnQu#L~p!Ifs}F?fbiKɗ_xDWvLcwc0g3-xaUC ˡM8\0,;8\ufe &tj{''T>OfrH >tpo] ݷk7u5ZcB2>2.GkpD1O՘P[B=C : yˢT(019-]sHJz@in]?O]50DZ]RR[X0q7~>ȧNa@JA*cTK+f]_T8\rMs~{,w<('ϱe55-J^'Ր>[VYZthIP J\&b(n,"t_A= 'P*0MB,,-.AhS,N_) ðwqH Cht뗰8:ƑZBpmz-)IT(IZP5" ôs54` #GjECԆw$ױ,vXG曉UˢR.)imcg2qD^~j:`{0@&WN.K `صQ5Udk RNg(q?[E/}98%]]k.CB HC)F" )n/{1\:X(:9 C]Iz:BwcefRJ|KF(C6(I %O X_B*aY@Xr^{iZJ5ŝ]0ۖ| ^\qJ jm!?X9cIR OOSr`{*i?R`bGvHS99Y[VW󖡘*Z2q̵~k?/:C:\èZ"c(^!m"-+1I,N_FRʈ&lo\FAPILEQBln^baHfUǴwp2_3O! 9JEgWFS ZR e…h|]0lDcu՚by9C eA]0NSfMmoKJVwdPMnbg!JR$:hY;DpZFg47X>K"u@^@ DяڼL]kuR>+#2_ }Fd(4[.ngr uW %XGncZ[KVrgO Ё08<7GAOqjr)%a޾cR.(HE_Qu Bb}!CJM^r(ɮaWcB!nAiڝ ʥeXqeS\&u&"z=v7 #"ǘp7nv޻aי1V-\ntFj=$g2cwXdoh8mǏ#LgPF2/[+=H#%Zsv9 kg^9:*a/V1͝32Nkʇ*8o4c ρ7O-&W4Uıu=:$BO#;0@Vt}b&i6K 8Z#8P,2_pysMz']h}ic芈x"m!R&\ħ`It=)x2 5ZH KVal,3R? )>BEdVu pZ[#yl,X ׍?JkjMflY5Q Xe$ 5L ,J}=fzv,̖VtPxVaD(Z c"Gvf&t:Әο()+4huy* K!J>uKҼ:o_1W6oH"Ev@rލ}wr{ !ҩo'۶C;Yl*{ /a_aY']L&0.FL^/Z3laK S8+r8gDPlK}> t '!j0U@S;)R暁^o^z%#Ā?lz~UXi=ž9[0W"'/y7-N4u,YZ~q}]i&%ebc!{*YBsO>K̅y@ lLA:{1=cD+Θ:c} ֲI&pc;'?CT@JI*:wWlPP٪5ڂJvUJʳokֽעlveb+3BH ^8 9}:zk%e,)D}qwx8Lt$kј3]`N.".;sV*/WOhNW|f668^g6Ghk&zm L{p˵ن M :${>~8KTgƂVEb=sگIn+ f02HN: ;D81i  )_ۙ&Ƣ6z۰3 âZ+2/xxwz_7|̓wTy6K>ݵ#T(PFc_~C~lN!5HQZޣj8}4O^ƾ}fCda 2gD^!u?'DJic!Mo .'/-0men356.nt p cqisqa޽,--Aw^n^^fvm) KU(lb>A2A:cq}aFN(Ԣ/2@ՇE*cd \D-yrJ-mz~h򣑍Aj0*%w?<ٌ5N>z7X_^Q,G: 0 }'_bMw"do{M7Zs;^xaWXk]&YrtNd+ 5r%2+eyiBAv}}* )yeǠs&̖ S]Nu^=ݢQq8XD >҂xǚv`VIi?d2MzcPw_w֊a{=XR˴Z-n8j~׻XyMvO 9}'t68)e$g-=|GC?ЄJ2Pg4O00ҐsZ~.0(3S/a؂svGUs8//v*8A*l\O2@NmP v&ЕY Vq~ t3.J)vsRw)%wsssr9lƴm.s|a tTJt]Mv}}ߐNjހ}H)Dm؎E/8) 0 ֞B,y.pc?Zsaͥ-S.|Y<[![5,|0$z.a F33{rDG|2>njnTB z(`h'ssse\qA=:[Wج/Yto%Ţb%P91#u4f G5DD%G!$dLC[̩|.9*j2)o_fyos}Ҫϡ]9DQ< ?-%Mbn ×U';*8I>E҄a!JF< J,B[t[brN+X<}݉4jRz=ɬ{_ =,~F ~v+ARmEt:+*u,v'1;dő 0 αvC 2 HY?wL߰y]t},"Y$j${aNJPFm9T*Bt ˲p5V+ev;],Jl[HD4z =yN!>yHV:AcPLʶdd&V Ð-!RRvOae]}w{.@AI$R>%a+Bd;';.ڢdYHRXb93;W}TUCV=07QUYUY{Υ6՚ϋ3kWnU qb'RCKV RRk(W0.%u)RauZŚƷߋOhC4h4ꦴyMh.FSp Cgyȓ."BNEgqz:Koѣ4n~*Q LX"jBoscStC o]8//~n Ҙ8{4{[G Un\nO/-Y ]f[Oqr>q#7t$cs ߍB R{uF  y0B"D@. $h MeP~ qPwc]$QX])4 %LkXZ''e LCq^~gJ㘂;<) 3}2OҠZk!u澂s=w>p-et>ZmF/1Zrooo%S672;w*9C[4bp:]\Nu0-d({#Hݝ~ TGnG--;BdG[.:Ųa؎B%2-36]aƘ=GZ IDAT4'+tt2 j TgĿSjylT3&M÷7R> ,:|RjG Z$~Щ]& LM|ۯqD"4=R9lPBiP* tRªA0SC`(u@DEY6n"Fm!:±1q\x"F"*I+Ie$.K8!( ei鳉A74c}y%"<ϑ؝N?R->izNӋVɡiilKG7+|^b?}/I#pY]2_I6^>2Y ~eIPU,P,OB#ڊkCW1]g-;e~"OvY)g"dW qlqmܸ38qRBD 7É؎B찭Z68"W$r (ohk' NDFgOVM*Qة|\ /|m%[?~s4-Gm__6RJ67tc;^^o+_?CfW7X >UyϠi:B)o+ fI6 Tn{HkzN19)Y8 yWOбaIȣ2܎)'cڤ]<ɌK2&ܸC̵mdZ"Ӂ%QVkTuO!O;d6]5ye5`ykS=a r&@wmB!}~ icND"G%$+R9d5RJ^z%^z%<7o작Vۭf(f*A)S`i'A j":ϸ;RD:N"dXqr0,3s!Mt%>ф'wl]nyX zE\* *|4 ;&`!oro fR>PO!s.;dzX 4T*M._?Ǐ t']V+_e{6b}:gcc .Ovi: Y_+S!ؙ#lRM.Ic_*M am`JHONƎ١!\z-#MwGU$Hoz_c/V씫4G/o؀}L[ŚOgb]G( pʯ>R"n6f RࡼrXKX|3/q)*HdV>_@YŴbmnyq]/;\ڠݪi&n{4Z[*ՉvcIūyj֙~ve&NLQ7OIB8OpM]ue $A֏@A )j\*,}=ԷD!ptwcx lr&/[;oOᡙVXC=ժ{-b4ΒL.@:٬K:/!_YqxFϿ('r%tkѬw$L_~ׯs1ܹC!aqJ>@Ʃi&!CľM/Wk&~Ц^!Oan4Mq>R[ 4MczM^G?ǏbW+ߧݬHMv#EH͋;)n.r_YB7)Si=*;43 zKI$ G9xY&fܥqzp橳[a1ddxϼ`w. BVn]ƛgZ]eg9p3JSոvlA5?f}#,'NpX<iBS?a>BI1Q)x6@lR),E @uRUC7m|cc#dYbXᔓJY?t ˶>"ټ$Is ҙ ZiiUVL^GEVGCOx^F]DA,F hΕ+Wx7 U>OopQvkl\M#ÍgF@[A7h6$jtߟRi+^!rXZd~e.: } Q/c9qˆJvMM %$qg*'0 qt6ѓyܘB>mY0bh>.k 5Cɨ5mOMAun2*:M0LwyWr9X[[<+޹LY#& (t# zh"ƻ!p՝lU].]Z%0޸C&8AlEœEA4)}"Kԭa7Ji k!]isO!SȠ驘qnt/ԓwkxݐhTC螆3"1C9FĨ?w~7_>a`e- |Zyd.\`߾}j52 .]0 ga~nl\W_GP|4*2E i5CTUx ~9^}U}Yyٺ d@,f#|\е)lQ.ovqLʕ Jo#X,fV߃(h6&籾|Oк<4Möw Z[u2$`9eR:EiwaY>$Ny|[F=@:MUId dfOY^^&ꫯrQt]P(裏8*~%v61}%IBt?>eu|W 9&Fk\R"` iL2a^~vVen"MM>DZm4u*;$DrPS+M 2Rx~ 8nIX .y!gϞR`=9H  chB) fxAu+s:Wm]4tOr4n̰yeDpzHDhu*x&LIDD"8c{2;$qk *Bס+!L?PlwW? F/&v!OSN^{3g<3Ġގ%;J{Я=}aòZ٦1d˳lӧgI&m}qN&SF'@2.uD 4M|8뺎eYضeYL$΅z@ `J92D;GD퉭aϫ iG&%.[}6:N(]_qZ ըQ-G MxAy%ܼ-p`|KT}>R{5AЄM9:*_1׫in9!).St#Qe,| =!'IKTUh?chp_͝@ߦ٪!44.T*ŕ+Wo <#dY뷹5Jl-< {I"n1JڃH9K'i6 {Vk~W !H; hf"Sx&P Q4_A@6GB\|UΝ;˗T*izB~*֧ blaa{4g/-0 Eҹy G_9I<ٽq+qg{G(v.[,]yn6^T B)4L XušΒnթ֣?aMǜFl]`{tx䥗r=wJk海Zw?cxv)XoZh,P8;2(B~a2Uj-ڲJ g΀},9DhajXE?mǩUi6dokd{{P7lz<}(bv{aJM#{Hȵމ4M=<BXp'ω3sB s#,_l N< Nu|I*aq>~MDQ0À/Aݝ,cԓ ŵ= c?>Ma:c.L8*CL&0e_7ߣ=|C?hu3)GVe0E |<$麎r}oLav)dS^4gs B- 0L%,4t$=xgW=eǕQcl̎eefkHaյu.HT%]Sxj~:Ziz:zyW7$33aF 2e0?3K}c269qzLaHIDl7I~R`1G,f#Txt$ǡStgs n/0=X< H;8~6zRrI2}r,lO][ GZ`kmS %埰:<ڊ~boMJ7Dѧf+{R2 !X8tôfqe# >d>i.Ai4zL *iqXZ*zy~syHFB2\n,c'et d`SV{)-;w0-> BC47[eE2Nx? R~QVZr~!AXJiCe i<Ͱڤܼhh^`Q?̳|],PdFΑ1~;lFA"20 Idh1&Pu"cdae{h'2lJL]7ɤgl"ޫSZ޻1W8@2S@J)4ɠq0{F@N|i794 MhT[l޿9 $;fJ1evtm|zmz}о$ylEo]ߣ*~cƮƲ]y vye"u~0u:0;" a:%jA,ǥNK`[O#Dr^@Jfa\dT&Gv,>ЌȾ :}v1HH{?Y=-d`oB~ #%ܼXh;O0/{MvvVG4)(7XvaBj}K{S2NШ~H3618c b4 <ʭKsSdhThԋ=O18a\[=zk\ CzyWߩ=d)yY.yjIԈ ~ĉP Z3yӄ@Kcvj0P)mD 1>Lgds ju4jl-O% x) `(l\EH ]HIENDB`./examples/ubuntu-ui-toolkit-gallery/TemplateRow.qml0000644000015600001650000000260212700370701022743 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Item { id: templateRow property string title property real titleWidth: units.gu(10) property alias spacing: contentRow.spacing default property alias content: contentRow.children height: Math.max(contentRow.height, label.height) width: parent ? parent.width : 0 Label { id: label text: templateRow.title width: templateRow.titleWidth anchors.left: parent.left anchors.top: contentRow.top elide: Text.ElideRight font.weight: Font.Light } Row { id: contentRow anchors.left: label.right anchors.leftMargin: units.gu(2) anchors.right: parent.right spacing: units.gu(2) } } ./examples/ubuntu-ui-toolkit-gallery/UbuntuShape.qml0000644000015600001650000001145212700370701022746 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Template { objectName: "ubuntuShapesTemplate" TemplateSection { title: "Ubuntu Shape" className: "UbuntuShape" TemplateRow { title: i18n.tr("Aspect") titleWidth: units.gu(8) height: units.gu(8) UbuntuShape { objectName: "ubuntushape_aspect_inset" backgroundColor: UbuntuColors.orange radius: "medium" aspect: UbuntuShape.Inset Label { anchors.centerIn: parent text: "Inset" textSize: Label.XSmall color: theme.palette.normal.foregroundText } } UbuntuShape { objectName: "ubuntushape_aspect_dropshadow" backgroundColor: UbuntuColors.orange radius: "medium" aspect: UbuntuShape.DropShadow Label { anchors.centerIn: parent text: "DropShadow" textSize: Label.XxSmall color: theme.palette.normal.foregroundText } } UbuntuShape { objectName: "ubuntushape_aspect_flat" backgroundColor: UbuntuColors.orange radius: "medium" aspect: UbuntuShape.Flat Label { anchors.centerIn: parent text: "Flat" textSize: Label.XxSmall color: theme.palette.normal.foregroundText } } } TemplateRow { title: i18n.tr("Radius") titleWidth: units.gu(8) height: units.gu(8) UbuntuShape { objectName: "ubuntushape_radius_small" backgroundColor: theme.palette.normal.foreground radius: "small" Label { anchors.centerIn: parent text: "small" textSize: Label.XxSmall color: theme.palette.normal.foregroundText } } UbuntuShape { objectName: "ubuntushape_radius_medium" backgroundColor: theme.palette.normal.foreground radius: "medium" Label { anchors.centerIn: parent text: "medium" textSize: Label.XxSmall color: theme.palette.normal.foregroundText } } UbuntuShape { objectName: "ubuntushape_radius_medium" backgroundColor: theme.palette.normal.foreground radius: "large" Label { anchors.centerIn: parent text: "large" textSize: Label.XxSmall color: theme.palette.normal.foregroundText } } } TemplateRow { title: i18n.tr("Image") titleWidth: units.gu(8) height: units.gu(8) UbuntuShape { objectName: "ubuntushape_preserveaspectcrop" source: Image { source: "map_icon.png" } sourceFillMode: UbuntuShape.PreserveAspectCrop } UbuntuShape { objectName: "ubuntushape_pad" backgroundColor: UbuntuColors.warmGrey source: Image { source: "images.png" } sourceFillMode: UbuntuShape.Pad } } TemplateRow { title: i18n.tr("Gradient") titleWidth: units.gu(8) height: units.gu(8) UbuntuShape { objectName: "ubuntushape_verticalgradient" backgroundColor: UbuntuColors.lightAubergine secondaryBackgroundColor: Qt.rgba( UbuntuColors.lightAubergine.r, UbuntuColors.lightAubergine.g, UbuntuColors.lightAubergine.b, 0.25) backgroundMode: UbuntuShape.VerticalGradient } } } } ./examples/ubuntu-ui-toolkit-gallery/NewListItems.qml0000644000015600001650000001652512700370701023100 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.2 import Ubuntu.Components 1.3 Template { objectName: "listItemsTemplate" TemplateSection { className: "ListItem" // no spacing between the list items in the Column spacing: 0 Item { // compensate for the spacing of 0 by adding this // Item inbetween the title and the list items. height: units.gu(3) width: parent.width } // clip the action delegates while swiping left/right clip: true ListItemWithLabel { color: UbuntuColors.blue title.text: i18n.tr("Colored") } ListItemWithLabel { title.text: i18n.tr("Highlight color") highlightColor: UbuntuColors.orange // no highlight without clicked() or leading/trailing actions } ListItemActions { id: exampleLeadingActions actions: [ Action { iconName: "tick" }, Action { iconName: "delete" } ] } ListItemActions { id: exampleTrailingActions actions: [ Action { iconName: "edit" }, Action { iconName: "save-to" } ] } ListItemWithLabel { title.text: i18n.tr("Leading actions") leadingActions: exampleLeadingActions } ListItemWithLabel { title.text: i18n.tr("Trailing actions") trailingActions: exampleTrailingActions } ListItemWithLabel { title.text: i18n.tr("Leading and trailing actions") leadingActions: exampleLeadingActions trailingActions: exampleTrailingActions } ListItemWithLabel { title.text: i18n.tr("Custom action delegates") leadingActions: ListItemActions { actions: [ Action { iconName: "tick" property color color: UbuntuColors.green }, Action { iconName: "delete" property color color: UbuntuColors.red } ] delegate: Rectangle { width: height color: pressed ? Qt.darker(action.color, 1.2) : action.color Icon { width: units.gu(3) height: width name: action.iconName color: "white" anchors.centerIn: parent } } } trailingActions: ListItemActions { actions: [ Action { text: i18n.tr("Edit") }, Action { text: i18n.tr("Move") } ] delegate: Rectangle { color: pressed ? Qt.darker("yellow", 1.1) : "yellow" width: units.gu(10) Label { text: action.text anchors.centerIn: parent } } } } } TemplateSection { className: "ListItem" title: "Select mode" ListView { height: units.gu(20) width: parent.width clip: true ViewItems.dragMode: ViewItems.selectMode ViewItems.onDragUpdated: { if (event.status == ListItemDrag.Started) { if (model[event.from] == "Immutable") event.accept = false; return; } if (model[event.to] == "Immutable") { event.accept = false; return; } // No instantaneous updates if (event.status == ListItemDrag.Moving) { event.accept = false; return; } if (event.status == ListItemDrag.Dropped) { var fromItem = model[event.from]; var list = model; list.splice(event.from, 1); list.splice(event.to, 0, fromItem); model = list; } } model: [ i18n.tr("Basic"), i18n.tr("Colored divider"), i18n.tr("Immutable"), i18n.tr("No divider") ] delegate: ListItemWithLabel { title.text: modelData color: dragging ? theme.palette.selected.base : "transparent" divider { colorFrom: modelData == i18n.tr("Colored divider") ? UbuntuColors.red : Qt.rgba(0.0, 0.0, 0.0, 0.0) colorTo: modelData == i18n.tr("Colored divider") ? UbuntuColors.green : Qt.rgba(0.0, 0.0, 0.0, 0.0) visible: modelData != i18n.tr("No divider") } } } } TemplateSection { className: "ListItem" title: "Drag mode" UbuntuListView { height: units.gu(20) width: parent.width clip: true ViewItems.dragMode: true ViewItems.onDragUpdated: { if (event.status == ListItemDrag.Started) { if (model.get(event.from).label == "Immutable") event.accept = false; return; } if (model.get(event.to).label == "Immutable") { event.accept = false; return; } // Live update as you drag if (event.status == ListItemDrag.Moving) { model.move(event.from, event.to, 1); } } model: ListModel { ListElement { label: "Basic" } ListElement { label: "Colored divider" } ListElement { label: "Immutable" } ListElement { label: "No divider" } } delegate: ListItemWithLabel { title.text: modelData color: dragMode ? "lightblue" : "lightgray" divider { colorFrom: modelData == i18n.tr("Colored divider") ? UbuntuColors.red : Qt.rgba(0.0, 0.0, 0.0, 0.0) colorTo: modelData == i18n.tr("Colored divider") ? UbuntuColors.green : Qt.rgba(0.0, 0.0, 0.0, 0.0) visible: modelData != i18n.tr("No divider") } } } } } ./examples/ubuntu-ui-toolkit-gallery/MainPage.qml0000644000015600001650000001053012700370714022164 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Page { id: mainPage title: "Ubuntu UI Toolkit" header: PageHeader { title: mainPage.title flickable: layout.columns === 1 ? widgetList : null trailingActionBar.actions: [ Action { text: i18n.tr('Right to Left') iconName: 'flash-on' visible: !gallery.rtl onTriggered: gallery.rtl = !gallery.rtl }, Action { text: i18n.tr('Left to Right') iconName: 'flash-off' visible: gallery.rtl onTriggered: gallery.rtl = !gallery.rtl }, Action { text: i18n.tr('Use dark theme') iconName: 'torch-on' visible: gallery.theme.name == 'Ubuntu.Components.Themes.Ambiance' onTriggered: gallery.theme.name = 'Ubuntu.Components.Themes.SuruDark' }, Action { text: i18n.tr('Use light theme') iconName: 'torch-off' visible: gallery.theme.name == 'Ubuntu.Components.Themes.SuruDark' onTriggered: gallery.theme.name = 'Ubuntu.Components.Themes.Ambiance' }, Action { id: aboutAction text: i18n.tr('About') iconName: "info" onTriggered: mainPage.pageStack.addPageToCurrentColumn(mainPage, Qt.resolvedUrl("About.qml")) }, Action { text: i18n.tr("Deactivate mouse") iconName: "non-starred" visible: QuickUtils.mouseAttached onTriggered: QuickUtils.mouseAttached = false }, Action { text: i18n.tr("Activate mouse") iconName: "starred" visible: !QuickUtils.mouseAttached onTriggered: QuickUtils.mouseAttached = true }, Action { text: i18n.tr("Detach keyboard") iconName: "non-starred" visible: QuickUtils.keyboardAttached onTriggered: QuickUtils.keyboardAttached = false }, Action { text: i18n.tr("Attach keyboard") iconName: "starred" visible: !QuickUtils.keyboardAttached onTriggered: QuickUtils.keyboardAttached = true } ] } onActiveChanged: { if (layout.columns < 2) { widgetList.currentIndex = -1; } if (active) { widgetList.openPage(); } } UbuntuListView { id: widgetList objectName: "widgetList" anchors { fill: parent topMargin: mainPage.header.flickable ? 0 : mainPage.header.height } model: WidgetsModel {} currentIndex: -1 onCurrentIndexChanged: openPage() function openPage() { if (!mainPage.active || currentIndex < 0) return; var modelData = model.get(currentIndex); var source = Qt.resolvedUrl(modelData.source); mainPage.pageStack.addPageToNextColumn(mainPage, source, {title: modelData.label}); } delegate: ListItem { objectName: model.objectName enabled: source != "" // Used by Autopilot property string text: label onClicked: widgetList.currentIndex = index //follow ListItemLayout size height: layout.height + (divider.visible ? divider.height : 0) ListItemLayout { id: layout title.text: label ProgressionSlot {} } } } } ./examples/ubuntu-ui-toolkit-gallery/AnimationCircle.qml0000644000015600001650000000176212700370701023547 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Rectangle { id: circle color: UbuntuColors.orange width: radius height: radius radius: units.gu(12) antialiasing: true gradient: Gradient { GradientStop { position: 0.0; color: Qt.lighter(circle.color, 1.3) } GradientStop { position: 1.0; color: circle.color } } } ./examples/ubuntu-ui-toolkit-gallery/Popover.qml0000644000015600001650000000554412700370701022142 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 Template { objectName: "popoversTemplate" trailingActions: [ Action { text: "Actions" iconSource: "call_icon.png" onTriggered: PopupUtils.open(actionSelectionPopover) visible: true } ] TemplateSection { className: "Popover" documentation: "qml-ubuntu-components-popups-%1.html".arg(className.toLowerCase()) TemplateRow { title: i18n.tr("Flickable") Button { id: popoverWithFlickableButton text: i18n.tr("Open") width: units.gu(16) onClicked: PopupUtils.open(popoverWithFlickable, popoverWithFlickableButton) } } } Item { Component { id: popoverWithFlickable Popover { Flickable { width: parent.width height: units.gu(35) contentWidth: image.sourceSize.width contentHeight: image.sourceSize.height Image { id: image source: Qt.resolvedUrl("demo_image.jpg") } } } } Component { id: actionSelectionPopover ActionSelectionPopover { actions: ActionList { Action { text: i18n.tr("Action #1") onTriggered: print(text) } Action { text: i18n.tr("Action #2") onTriggered: print(text) } Action { text: i18n.tr("Action #3") onTriggered: print(text) } Action { text: i18n.tr("Action #4") onTriggered: print(text) } Action { text: i18n.tr("Action #5") onTriggered: print(text) } } } } } } ./examples/ubuntu-ui-toolkit-gallery/ubuntu-ui-toolkit-gallery.png0000644000015600001650000011407012700370701025553 0ustar jenkinsjenkinsPNG  IHDR\rfbKGD pHYs B(xtIME 22 IDATx[r\gQ(poGaD% @@UPŧZ'7-D($@a7̕k|{@#7bgf|H;j}I6WnFșufpgUޅmԼq;V<9N2s%c|oVMNZԫjHO^x'k#@d=SEkuMeϝON.ffykd뢴kas4O]COOO8y=ڂ5 87;N3ǬVa@r׉;S}f|.2gSה.p{ Ùxݷ;n8 Y*d}-3 `iɑ k|1<==MdyuzͅXiys'HIrSdYZYו7+33a‚3h b[??+̃RϽVevo;߱ӢKxsCZM}^=Bs扚'~FLxZîZr.n{tt4sԿe0V;z/'⺟|O= tl%3&fL*da epfFk$nc8אi<y][Vi3=3A}zAҧHICT_f)꿹 '/n"Zk/_t>67q R,s^SWY=b$trn=C+bJn Olfu+@@9YfT\|~ @)]m~ZvQEZ$D6a899|߹3Z/ɇ0nlNk0A5~>|Y/Ȏw.]3L0R!B̀e_=~sml6lr]0.q !ZJ{yɻawחˊ*LϲDW-,櫛'oi$)6#=l)憪NxhVb^_CX$G!W-{ `| A!{ٽk`*OGdpz '/!Lsst!g9lIZZ^oq[2զ@6v noowbl(>dޑx` {<>>].?Kd},NZN;Fzd.2eg͑vxr-i2gGnDv9X 3;07sn fBN)1?3e\k<=dy``krp$t Zw 6dEq||<{"TycD)f1#)6yF*,)eXO&K Fkw2e&%6= 7{ k[93׫& dpdG;@&.lH, 2:d7wGN0ٕOO߾}D1X_'Ed\U5$Kř۩(5HivR`HFwn$̉x2h3Ӳ>x:H>%OQq3'e uvlz#Xpt&+ 3j/ Ys呆46Q_Ѝ{ʛcaAq21"g=<{jT~l@iQcbZ[-Фbw؈=cDY#Ʈ%8\A<)v˃z?@%l]c; Tܥr5,emOOOxT#ia(!Ð$% 2uZ`Yf;/Ҝ`LR^ɸ~>EYӉaV0N',SRCyhTeo`|?E>ʞ1SdI"9DpBfD{ ˾>߉ѳE j05:b'wd)@bFN:{C?SbM4;Sk@Fe>3ʴZY=ѳ.I; ZKyM'oCl}l0"fE]i)wRlr X{7͘ L%S~OKt;9âyw炫/;HɛI46m." ix3%U'-S:%s*`--ߟѢ;Yt~߷oߔk;"gn"7! UP^=SpIҪ'ƃ$Y}N{(b)5d {G6N0z$.On. 2qdtN_C2 pl/V Hz)rA0iƠtb%g9Kw zցY,۷o-iܬ^-kM-e  pPYD̙; R_)l 31/o"I6DQl0.a ğaZW3g=1YS4]lZaמM]yMsIAI.6of,:~c )Zַ5aB i3do f'4߁Wdڻq`1i=DǔӨTgX:Y#<10FHPd5HU3"LyĜ hIصORȔѯh |\ J |Y0>2ґIyxdWF= &bZi v\zSuސr`$3{\- rS%Gx32@+Olo[SٱBϯ^9.qHKϠu5&<3c7>3%5fkemӍ&^ ޙ*(AV7vSΞ;ue35$)SL ʍAwxY} rcGb7[fZCF?-\͎SgNu HeY. &}9eWMqiQg&66uG[4i_\D VAXWfXj8 lHtʲײ Dm(#vqҴv5MDWYo=?I&nQP$&[֝d12[,K5*:;ǜXǷa']H&1SPVcMR:] gik%-ÃzxÞ45Us4x 1 s6!ā)2{ gYOg9Ip}|3ec:Y4qGgc Q5Й WҰ4#:ÉL)iXii[**ɕ E:c3-XʣAs3tĐz֯1$Ȏ =M4a%4o.%UwT -\*d^Vɝ΅i5hh,EΤi` 0.߯\uxSQ3yL(T}벎cLvf+C.Yw_t񝴕fډ)P{7dj|0q32Nf>;;ۓgΤC@j(5Q$,k$ӗO(-Yv]| q bN3 Dɨw\uB5C,خ3tryoYˈ[6ݑL)[XXpS"ND,<\5Y noS2KTtxv$ M$b3)&ɏ9tԥ'Ӎd_\\*PiϻѣqRrMdYǓ `Vޣ 7`0v#TIKL%ρ?;))5YQs^RYw!@G-+LMh an継Huj b͸`K&k\Miy3j z"9g k]ia(^gxZMڳ 0x6ּߌܵUsݷ6%FwAN?fW8LmQsQIM|wi[sy [ug;4=']vr]<?TKA5Ñtno-13=M`KRW=G\z5L6:1JZwGTnIq5xߛQm5ɆLچ%KO-IT=מD,ͩc3=hݼ) dO|;54GNfbO?AQpvO!H\Q5Jj2b4y*7 +V}gw?g|xAe΀a IfSw{v&wN<gV g] sp,fbcgcjv4oD*u6s">-X!|hsJ%#*Xiabr+c$u-WHAJ~ E`}ӿ,:ZkƎ#n35& N=#hь-Sb-OΛ>\ tKBQLJO2W@5aތsr&1%oE;Eb ff~ڦ dS~:>#rgdΡy[KgZaxxxU4"YfwTjn8#SL3g?S%2S!ulja&`Ğw^kX9r䕺Sesib&VJY/s:zsm*@s6HVđg2s(5%f$e~s5x X/jQd6N CF2Qn_><<'?-,0qxHgLdzsjN^KKXs2U,S֒'''{vڿg߆aXC~a%삌1-g*OG,zlLXf5̇y\-I3cJu,J/AnO`bƒ2RWM!\̬{n3>Ale1笜v;Js)C~՝/@KcZxR6Z^'ו hb,=;텵{||f3 7G@Aɫ?b "߾}e2~E?KCMm"r;NSueVs\iA IDAT.0s6e6"N\Y$5G jfXcFz*+͎+eptt4&YQeO]wM_sINYjw`um~N [v~?>45ˣ (?\W{خbff5N.=:' ۡ6sӟ G` L/-G oHkRd91&w4JF$ƐD:ܬv͸Al޷۷ɋ_{$,œ3Z1 m'7tGUf4HQ].wHB[z+vR~^gbےIfVԞAxd@~0s|}:ڙI+T#cXՍ9_4?VZl-sZuuu5md)Bϟ >eƕG-u4Ș54@LJ?|0f|_ |3`*54dZb)y&AXQ7Zq3}Ew&v;~a vh2#b&ƚu94_'F&!y"G8Ce`Hd9> :,(L>{\۷yΕ`dw 檳z,ӻ䆵֠vso}Q]~dVJ6蔬 6AD;ϜQ❢RlnLnKRe:'Y zxx| $KCz:^s,c2!*وgĜ[20 -a^AAm9qR' 6[*];'0C#`AyL/ijSZl}|Ky܍FۦΔRRkrQ̚F1kvҵ'K1;gn\puرMsH.|vUa4ac.tR s3Z3L:yMfyc9f]C2^v`CSux2Fud`eɔ٬˗7umnxf4%tlɚ ?"*Y)Xs{{;^|ԝ\pA''ی U,ӳkea[E$&x0;1(1Zi fi \9Ӻ+Lˌo6 rd_Y3eQc3DZj_ud&e<Wž[ym -Q|ظ/fnAڰ1\u2爽l?#E;ov#tGdkʅbd`JߓcQhoP|uRw)l6%N]d3龷mjCUğTjj,ؖdc͟%Zkw,I05F,hoD6"#64&Fԙ\b5$3n2#f.L`E76?cAgSƔXFFXw݌ Bl7مV2|5pXmFN L 3LzPv22x1@yemeL("5s|ب(f | 7 \Ox34._DiNUtr<S6j}6M 0OrvPL[Pl8==,.cp)v0Ça)I/{Vb&S)VF73M'Հֿ+eIXɸc9atw"rڲzxxnnnZ]7o~fP5Q P90;=*Pouyy91E;U+r/{::mhu\g`_Y\ w,O#[e}62~3}"|Ҷ^(Z2v:ez;\lO< K)H:Okkۑngr\;i$7b޿+_P֪4u[&۶/N?$`V'9(8לeɝш#K͙62a T^>>H3gvO~=kvI:y9gv߰R]__޽#`,NW2N03kSL\ ӭ[k957;:Wl>OFCdDdfvVv t&wƲ% G>oLŊdZ{g SLr*On]Vjc=`]'Q.~B#("Ш;"\<13(܋NI`0]86^QK:rԪr/MXbIS>HzH,"OKh  s)_Lˤ|/l.DRu'=AVt4pєG_kmKtyxxP46"kD 888kCfd?+>kf+ f$Xe6qIuߜO[ЩJBE~aXDNcӥ@(fp؉խEf sV[wtƒJ[VÛ7ox :,)O>Ǐў+|ݤʸ9aHq d9a"2\@;q=,[]3Z)$dke\{ 攲n'CEkT:_AwV{"R#[Rf Գ?::NNN&>Z۬U eo]% ܵ,;#zd+ڌ6P<cNމɖ 9Fv"efnnooK}iTyD;_fD9/b^w2V@I 5:sW;??...ԕƦ_t|/6n_jHyLn`^>*| f$ 7tIJ6 lE2JI jSg7s 4LXA|x||t0 wwwsB"VdϹtn˗/Yf /'fN۳ُseK d o!ܦ2#N6vq!fzd/jgvG8%b0 5锻L`~9?(k٭>,L[k7Mr9yf&pvv6DYl(Ꝧԑ뫺Mx?<<< F F~;L3߽h=eիWŅt*OɅsc*lCcgvc{0 v>|yn$?sOYW1 張n I)MƐ{7F1cǽQV j^~=yF_|_~~2( O{zznoo8_^^F{NlcuH2 ƿDߐYcJyBa:U圹bV+mH]///rK[-`K3}fgO(Lќ; =lJMޫ ͟R.Z 0xԦD+߼y3F,bJ/7I}X;4>wj18UfXG$js'Ӷ74K%٥f&0}:2wqϗ|g Q\'[*L:A }~z_6[!իW4''''#'~$ unB/;iAt_&A~ɹ,7،=l&ley ]/0ů.@YUrRҀCjXjy͡fEfiNJ$=܌svL߿WO<l:eoyo޼4yo߾J9wtt4C3 \C̠S RPlZ_޽{7ǣ 7իQV{s=ڵϕ[fuǏ6ʔ|*ln07FV,X |iͺ-44[:Yo>6) [1ly7YC8n]%U8 &pķ ܤ=N"䗿kIsn*i8%RirYli1׽M9țbBz7pѡ/OU@Uh`b:>݀|._mYj L[;|'Ǐ hIfj`{֬ę>??q32C;g샫QU>3gT~t:1H'pq ڈ9TuAVK,Xo2߿~;Ov;r d`R꺘te;-'''٤gb']&BF*L2ze_]cR*Ort]#~gց乁Y~Ӓ/Z?;{򶉜{룓fi|v)%fAwaMLkɐF|xx8}vsB'aLp* JC0*3# T|o 8YYY<}vB¯ ,]vѱHJz=Sme3*`|'Ӳdv4  4n;^f&S(aV_t%4F梳{߾}ڜd5U)4e#\l?g'p~NMVYך_a.ʺ7o;z"fjK ㇺ M,s1JC<;"EoucN߿tNynjceԦXb &TN.yLI2VZO:,sMxN˜jYFz3=S42heͬܐEK˗c""dA9:1*6Ң>}&Mc߹Tt3:muXO7\׭Cm,X|:<<7{|luRb1 5ߌ Jx;r&L)Q^nTA^ H۷ɜDRdI6h=7oLv_u #Aw\I~˔ߘH ]lNc|EA999P22\ ]Mکe՜;HQ,&VsCSi|qg???o޼Q"E%,%d0͘z>;D0x ~zO)Af;irxxx+\C~ f ͿgB1irJ% dVKV_k: +F'Ґͦ9*_lֲu}\NN~)$+Q]բ] S{/ IDAT鲊Ji0?YÕDXVU Y*LAb0)m=0K'} ,:muxx8<<< mʂMV쬦b6Ym.u/˃Zih"G'2`/ceˮDM[ʅk K,ܵ{IA_~Ke\=rg`H7TJwxf%YDf׀@;͢bUזEt%a96~nl5x||O|ٶ ?///CnE1 [JUM[יڳi=;Ɓ?::'یMg0^o߾8Yz/r&K 6b/l)FxZ͙N䟧kLxsDImLu|IDكgZ˙Vo XЪKQn`n PW>:e)3AA&.0~Lo T3R-%k)l$3WvRsc|I<];<1rꭥ\dߛl0e%bmXWU4<#sɬ IR6QނڑNr[|ڛ=Ɔ?qxDE'aleQ>N>?s;¨hVy@9p'?Fȅa&˥2i[f=cFeKCHY::WXG3Tl;k6mF;jGcCvª3&vp,HBcuS`ggҦ~O #PXMbjI4M%N.3?r':ns>A+d.IlX0V['lYIzӉ%J;iTm8&y*8CbK \h녓Er1c{{2`aiYFQGzʡ#̔ y6,+͵Z-ugy(TYfJTHME?20F@gfˍrRnĪjadmlpYK|5OXj$2|+͡s3먿[c'պf1ZL٘PsE9w2'qEiƩLR5 qV*>Kc([$F!CQV8|ymH3F^؏?ƀS_nLhm@*sBܠKUY.SKwʑ/, BaYbTYvb5Nf6?F*PTS߲ȇcщ5UR@SƑcLapʠE=. e@Ǐij1޿L,2,6m mL-RQH,Rps5 ˒dCL;MBJm[&@i i84mre6\9.YM]O6(ݢS+@)X> 1 %eܬکN7cVQypp0/{>SÇ{Az3[q3Pe)Ɩu6+O}r]HPnn(j7fGj`<]`ڜӗ-C,0hw!)O@{2 {;N8#f aeV~gHI<ǙqE0ʀܷojiRMM^JMf"фupg\YUkZgќ;+UMMi7SnLRX}p9+~{˒g9FeCnd=V%矉0-J 2d"Q`a Q&' `Zl*&QegY'i[`6jo'h&df}~; $V&w@"{>xs+dk&3lO5 * 0>݆q9cfΥB3ȧ;r Hh ,d\0H w"{%;fGEzQ-Z%"_DYl&$3 W" ;\<|]:β6YfL0ߛa",CX LZsv)xbHIIJSshdHŊ̒it|l1u|᝶(2xOfC0K BfGOrA)[Tnz5$TDU1x/ͬ8ds}_93=ˮ~"cL!*):Ev ВS"ּT v9Kn~NhL5q=ivґp2U6IjVle\H1uo93°nDxsQr'Y3*[F`5?kN% dW+ґ:9* }5YsKiƩ/_Q!Ɣp3FleKK@X)Ŷ`; ;v.)`L: hc #lɿ r-VP׽^'<0j33#-0;'d`fRJQnΔ]V|l9ʝe2 yŝ%iItlf<m0ԚOb^rCaf9=\t.H4lhc[^zGh1"X7#JezO4IwHP& ,,S\I|V:&{HNncZ0ي҉ֵA^S(ѻFRCDLENj<hhx|/BΔN.cd"Y#G$$ޘ X:ϿYu'?yd~ ro[cmsPobC[ιaXFiY{fH3 #,tZpv;/_())udo}e~~^z`NrT8yh$Y7Xpg0SWPeeQ GaLNНs馵Y7ͤ ՍNJ;ڂB<&]5F1ȧ1p56a $S(:%=X{QYߓɚ_}>oooϟ?OOOOׯGzfi7.e!ÍI^L]DtTfumrX$3 qq z>f3X>...=P7qe899tD~KB3يDYW\yZuƜ3N0f gvdXZ'/].+6cONca&'Β-D-s$$Sl0ue۰ˇԹ$fe"# ZPƺxLci]C& Xzz:G)Tٜ3xCuwzۦxfFAni3@%󱴾?q!fۀΘgE^})յً֮4ڴ:\Np6{f $dDҍ4dnڌ!s:m+ɓP_f\@cܐ_]kx899cɮ\HHp\[=6x%%?R;3|弅|T Yv&&r&rghZfb.ngq1]Tդ b43t^Mʸ-)mԲEfvQ6N,^z5ӦI!1%K#9z5ߏl6bɃ[iTw3!/+n8 K1gK6ͳ\tުSSš&~oN |x]d` 瞱rzzw;D krܼ|؛fL~6ׯ%[YWZ$@ `Yj8K-]CgXVIOuIm6gZkT TFz겏L#-1'ò43Wa&ȅeCW"Z=kG؎Y.vUgG!o 2,N2H/; ĩgƢf nzxr443ImNcG,\דuE 8KTm50؅@E;p]n+Tge }%ͷ,t/5dfg?^4bcaٔڸٛ7ϴfdMV *TeIOޣM[a#do`O[|xED<;!s(իIgNlڹyPC6ٙ2+􃃃QY@' y $QV672H*{DԫU6{=OEk1fr\N(2>zxxe7MZ=Lehٕ0Kw8%I*g#hY!˞H33Wf@F2j|2I6;63+ }%9܄ϸOԀ_&1%6ԃiKzec|!ӥ8[cIIEc {Jf % g0r"uFqjM*J .$X1:/y{̺?3٬My OOOz+X2Yۨ᤬#qxggg~-ѤsZbM`=GaY݃ONNu#tae![VWX9y8@IBB:慿yffB!|e\F5!eo0#z}}wJp@- ᒡFx >f}ɭg*Iw&ȓe^2T7 =7ij ,= sV24biXrӧ~`' Ht;INQ}#CgV $⨑yzKEחikݎ`uXr)el6cL\ A+˔,Hyfx/ F նʹfφ˼ i9䦫MQeGNY6;`*TTa Y]YP|q876\:&8S/([.˛Ouy.aْD*I+~gm@)KH7f’T:)2e8;;MffYZnX-(˅:ﯿKԄY W8|Vd弆:Z>ZhN 'Kߔ^ZLqɠ &Ud,e-ljMBf[mj:)8Nu}Mn|///X~=??^~=|a8???gin.ࣣ׺@D\*7YME:=]}v M'+8Z>%}Q>ݜi-OZ9 8쏲8;fHnUȠ3TƉfۄU/mnz#K9Rlr ɶ,e~:l6 }e{\qd]=F,yd@\nG<)UmY}SKob)ðySgN_^^N8L5e5NgT籎/NyyȋD۷{וdj5:a |'-Y///HEdG.pUv;ϯÍuU]gPA&LYgcaf/\dhiNBWΚ(Ai@Z$ \j5Aɹx2“a,.3C13@pww7<1)F!VlФSdڌov`a IDATۥ+W z||@Rɀk:Tۦ7:p,JLcݛF:Div`|ߴ3ay&#)Ȕ*'M`FЖ1ˀXE4 ^oZ ڵlϟޓrAeWRgvh7ԟ?>< h]e}eIj.Mcx/UfRrKe+Unl]|4\Dbu TevG2F-;3x؃@4ZE:oujeVONc$v^<<<Vhfࡅw D@@+h߇ϟ?OZKdL ~{eEYLDN 3/{8T3aIaї ]Rl#Vظ$;e3XPύW/bH#ЖʲnIr ߾}KU.o޼lI^uHH٭юSG.f2X,(ap>*>|Ƨ9>>>~8e ! MʍXrf|mGl3wu4Wa'$KEq0jf5k#+cVDkt.SIlyFx6,R Eӡ+3#nDt}RΔͦ3ȓ(s1OFJIrssf}v*`3r{nTL'T`܈U}d;͚tfI" <)5J#3EGԲι2EK:/BF4o}NpdI!LAMGHpRNIQ9f,iҹ&PV3˪5jih91e~f6UH|1dR땀)q.6,+6ugY3u1 J2]bj `ͷe#y_6, &nv >,N(Qfl6ϟG ؉Xm] ydt{KWA&($pu71==NNNRi9ʞ쎕G,|5eYu~Z\X/Ot: g4\o2xq. n^v#9_~~:qbgƲ0ώD(Wdñ0|^R $gw 8vׯu&π99%ׅ 2 O^2i8|3աP^K3˴?kXk10Ӌ9+L |Y ck*5b *>92v><|eGѐNrg+~5Qz4pi653Uv ^^^FY'kRi0qvejLzOFhK:  Wj`fK_KLa\߿bKAn^>r9VS Wwyy9q%&К(&gf>L9F)X۫F͚7 qDf5^?>>fŘ5s>OrE(l5'P#s11S22+e@(ɼ4ga1B4Y阍Yt%B׋M{ g'IJ_ɵyjכymb& 3 ׯ_WWW*)Znqlujn}OIa57Nml"2tn.aWȔ9MDbde烃͛7%9yH7J2x@){*, $e!  [.\$X"-$Cٮ)vY_xԋrsP@’\ؼyjLIT471|)K-^'ߺBsYs0j}vi5sO]3k5q%yzzsafʝMtI}\{ֶJMAw(;Q"VEZ6VꬁYi̺ȜA$w:jx*96E}³Y]B5˴3X$摘jS|lb.׌Zfkf¤|l2vؾ.EY*s*p(Kbl}-cF^xY[4c+]~t&S_;xXsWtrL_TeC<*9 ia?(0l4܏ScfPNgb $5qJU{,/<<07l\JG-A&qrsRp2=/"%CV >5Iu%txrNe4\p<92K;K;!c?cptg^ Ů]KIZӓ&BeF~t)=:rR= .}fMAϴ@̌LH&)"AƙFu8R+;V[%6_2 `LK~n׺Ln%y&[w*5|ʞ?>xQZuuuKf/_&~GGcfʌÇ{8a7u;h&yP$a&;8G2dFA:.0}IdFʗ=OF=G3bCIxzz'"(M\v:/Y a^Ç&|܈g.tbIY ePk,mMG2Ek6Aٜw?˗/;0L{MAHrCr2d/ $cb {d@i {=w[̍/+d{`ݎr\+:F ǐYǝu6$]J6Ǐ0:Ce9m R{5ޑN\#ƙ$W`iAŗP> AL;j͚2ìВ/%?4]!'ۗ8l!LgjCOfU;bKA mz?9 ZvrIAiL>5 #O:۽I.d/2ݵys =S.ԆXB)7OiN#6.:Lh ^Vnk {hRy8?? f1%Y#իWÇ4Oʶ );bv#0. ;I* #FletQ[T>'En>>>N5 mLF]0X7r|gq?;ʭe_:W$Cy{w٥eg6aZQ PXv7GUq+23z< n۴ K988" &%#AM:C dEplUe/6E8 *ģoۤ1$4$U"^m\;q0a65eLWd^W'x%F3ԕ*ĵ\A] zۭN+r3ʌ~qAuSlsg`}ݐ hq'~WIBFcNtmHC^ywwwÏ?S)&kxsx!THs2S+49djy?t`>3аq_u:ǖLN˿ t:KeHDf ξ|7l! \Fh>LsV<>>5+K8<0Qt͡YuF81߂3ZVnnmvkY 1fԵH<7\DnFќ_^^>-2 R7JmQRrSu}3&g͞2ImYm0ş Uh439\j7{nس=M Vd^$Pl;>UМNsnMׯ_OƇ d", &mD&s)"c4)b՘ E7kϟw2逢Ǩɇidƀu)TPYtusN62! z?13eJKIZ ^:M9:yrdFrf=gfckLS2jK'mA)h4b}}gKfhŪkOPǏfٓM[J&hB͍E cnf@%]l8??\a%PI6.p:05׵@3ck$~.Ft\j R PO|XD9#B'oB$t]o YkPT:v.O4vͅ#xrqцְ.sIEV材2T s Lֺź~goCF3wcrHm;|(3y]Ǭ2Q+Cm) 0&,~G/lXmV)ȗXݰlt22O#tXT&6n;BfI"~+$KZfIL˯(` 3IS:<朘XѓѸUuO2RPmVN|l&Y=(Rz-B7`d ?f ɓl!"Rc9(C aFw3✆O;;;1gXu(NKñQ6gB$kѿ2=;[w1u69ײM2\ş` =6" k/I!Tgg+p~v\JOķfExxx8hȺ8  W f\ &Z~Wħ: emm~&Ć~v:J30 ZZ*aofbLӸ12K Sٹ 2v ,~?UmOuasٚ!)c2 3"N|Nf>۴guMfTqWPM7Yzf֑֜aaY 7;l;`ka3eHSYBj4 =0I+m2]O95!x:;(3@rZ ??fĞ0_pּ4j4sUyh^u$*ZVn#1H:cƓmܤ gpYF 6 SYr-eڡjl_3Fu%2N6d_N2s(N`s\vu79q3w5uP.4*ggS8cI $'2-Ό؉VJ}dM޽i,̰ڦ:Xk7F,b59Otn|A|@Fdji[𬹈TzĹvzfxtt4MR9vJLI3SbBKa_ASmZs | rȇQ=''=Xa&uL"MkN[6qmXr&]$xh>@_6,ۭ@li1 `\E^yeM57'#v7(Pf[E5A-fbUN06$~OY~ܟ3|٥.^?5$E{vf-ɖ_]hUkӀIwnXX<=LtQE6Ն" zzzg I~ɔ&d$zaٳK{1/9ڜfRJ୛ `-ۆls %@f IDATmN%6l)e+K1ד13RN$sa:>ݔر~c\N-8,OL'9^t'miϳzM eչ"`;.0jj\_x*5p3kN;mf)MJlUOO )gw>ON˺7a^ا l8Q$?jo;lN 20&nsS 6hN`B|<2;5; (g4LY2$Sp >U$fAYyΥM,wd)'OfOS&֞w :ПWf>Rn]zߟ"d2PU- Dl02rTv¢?ZNOO=)9mz.c9&trSZﷲf3AM=F,~qJeG#<,ĉ=lA2SH}dE'j")ݜiAğ_3k\5&:FN}߿C2J930Kr*̻dFr"2Ѱm<={jL@B^4B0}8(_A|D9U/~5QǕ2tign>,]n+2}fH~Y,ިqj keY}l{"4_ffd'ZKB3.#='R)tXOiX !,M(F$蜙 L^Ոm6arD 'iFEtac}%w#%Jdm?3` 2U:l'7Fz tS30Tښz?3ELh '$GY!XjJ;M[ AJt: /IV&ׂ@㞩kr㪲0Ze0vpP&A0\x!268Uk_"$$Uus?ߏƦRRDvs$jj5xDdY'Qv٬%Ƹ]̬g0-n Tq2Si 04$L LP&ΡD:-(/7jD~'i]IE҉(K2d,'v8~oue}[t:)h΋P'`KnݓO+@lXE#9g Dd&@ 0f^8DTe$d ;Sb dY N W: 5dn*l +P͔2Ԫ![b&Qw67%ujn)-]qy]Jjx 7|8ZE% U,I^kn+ve9чkl$*${3V bITu#gցFFqd4oYJ؀hѓ1I9 8UVA-A&gfU>&kbӌ]2NeUq JK)K85u*g&ٽ5|Տyׯ_o|qg}駩?IY׿YYYf//{eYp%mYŋҴpаK}>q*i,`R)2qM˜k_o5j󗆟59+^ ~AV\YTI~`Q:WW ǴS LT)K_u]Wlӓy]NF{kINo7vib3a)\B|dflj *=J{hF8FONze'-*=0 >d]O3Ȓ.otsIߞ׸u&Cxx>_֒/j~zJ[5<%).3lzL}ݧ؆zFQ}6c9i1f"N?aSrI&&ӣ1?H~ g.T\m6'w\|"(fJt} rފ2ܘhM2rym @K~j𹽽M~5[ &AN4&^>c/rS b8CØ'bĵyմp]6uO][-Ӈj"j4~Oc\ejٳ=5}SR`[]\c'/n?ܐ4g (F ~g)'cB,܎W5 Ge`%#p5Lr  !R]3aH vo~!=!szΘFxE^q~l\`8RΈUOܙF\ͱ+ @#)OYrUGZ̜GngWWWyj{Vo* SQS4&CFsMxl-3MbuS% ks>̅I/0Im2^/7?.Mqgyr^6Ƥ줯Ϲ;}ςbxcB<0 sOeIʠT'&Ws8~0v<̜Nr "w޷Rwۇ,ũ p+%TS̍^?9Vcmӕ^:(wy \Xw{3,s7ULde_&D0ks jЫ<իW"f\⏳SI}e/Mz-zS=+Tc1HoV.X9.ܼTӘQmLTԨt5m5$ #ϵdOP&aI'3wL҆d%7G˩F0Q)r}V)Ě{lTR-~id f???М :Xh).:+eǧG9aqS`Û:!]L'I.&$iaq}S`AIf8Q^˥[ABߓRd[J8'0T{Y+;xh^:T&j̢Rb]odt LCcplZ&}UY'4#k0ɋO)bŷ}1\KSKh)K) L-еH-feT E oj@QlArsOY$eVE6jg61ޖbĔʟ}rf-)p\x'/jB1?͌_@Uq0'`1-TNps鸞B:Z' `SnUkO_Y)2tIoĸ]V7Ϋ>S|wwww#ĻMe}~~ul5,Zfa#)LlJLoP_egi7fό0ՠMMJ`BUV L?Vˀ_LA[3TӢ+44XzrD}/sP(?{/^ݛ7oՍz :}ﴼO^; IENDB`./examples/ubuntu-ui-toolkit-gallery/TemplateFlow.qml0000644000015600001650000000264612700370701023113 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Item { id: templateFlow property string title property real titleWidth: units.gu(10) property real titleOffset: units.gu(1.5) property alias spacing: contentRow.spacing default property alias content: contentRow.children height: Math.max(contentRow.height, label.height) width: parent.width Label { id: label text: templateFlow.title anchors.left: parent.left width: templateFlow.titleWidth y: templateFlow.titleOffset elide: Text.ElideRight font.weight: Font.Light } Flow { id: contentRow anchors.left: label.right anchors.leftMargin: units.gu(2) anchors.right: parent.right spacing: units.gu(2) } } ./examples/ubuntu-ui-toolkit-gallery/CrossFadeImage.qml0000644000015600001650000000510612700370701023316 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Template { objectName: "crossFadeImagesTemplate" TemplateSection { id: crossFadeImageTemplateSection className: "CrossFadeImage" documentation: "qml-crossfadeimage.html" function next() { if (internal.index < internal.paths.length - 1) internal.index++; else internal.index = 0; } QtObject { id: internal property int index: 0 property var paths: ["demo_image.jpg", "demo_image_2.png", "demo_image_3.png"] property url source: Qt.resolvedUrl(paths[index]) property int fadeDuration: 1000 } Timer { id: timer interval: 2000; running: true; repeat: true onTriggered: crossFadeImageTemplateSection.next() } Column { spacing: units.gu(2) anchors { left: parent.left; right: parent.right; } CrossFadeImage { width: parent.width height: units.gu(24) source: internal.source fadeStyle: "overlay" fadeDuration: internal.fadeDuration Label { anchors.centerIn: parent text: "fadeStyle: overlay" color: "white"; style: Text.Raised; styleColor: "black" z: 10 } } CrossFadeImage { width: parent.width height: units.gu(24) source: internal.source fadeStyle: "cross" fadeDuration: internal.fadeDuration Label { anchors.centerIn: parent text: "fadeStyle: cross" color: "white"; style: Text.Raised; styleColor: "black" z: 10 } } } } } ./examples/ubuntu-ui-toolkit-gallery/Dialog.qml0000644000015600001650000000411312700370701021676 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 Template { objectName: "dialogsTemplate" TemplateSection { className: "Dialog" documentation: "qml-ubuntu-components-popups-%1.html".arg(className.toLowerCase()) TemplateRow { title: i18n.tr("Dialog") Button { text: i18n.tr("Open") width: units.gu(16) onClicked: PopupUtils.open(dialog, null) } } Component { id: dialog Dialog { id: dialogue title: "Sample Dialog" text: "Descriptive text goes here" TextField { placeholderText: "Type like your lifes depends on it" } Row { id: row width: parent.width spacing: units.gu(1) Button { width: parent.width/2 - row.spacing/2 text: "Cancel" onClicked: PopupUtils.close(dialogue) } Button { width: parent.width/2 - row.spacing/2 text: "Confirm" color: UbuntuColors.green onClicked: PopupUtils.close(dialogue) } } } } } } ./examples/ubuntu-ui-toolkit-gallery/small_avatar@8.png0000644000015600001650000000117512700370701023335 0ustar jenkinsjenkinsPNG  IHDRVΎWbKGD pHYs  tIME 4w IDAT8eKO+1 ?;2ZR@BBb_AbE;6,yTGK'b&iJ#b;\.`f*p "ghD:8""e$h lG6 1F13|`8$wUe^38==e4Rjd2!@QEC@EG33PU w咣5סR7 |/f'`Zʗ)bh4:s0*CB%Q a: ebqٹ& սpzMRJB{nKydQ٣ۖdjaSJ<<<0Opn`$͝mrmq37gJٵ^4j<:Y1tT3#T$zfXx_vUkb>s}}]F&ն-777LS>??w&!wwwG}I ޢctuu{_Vu]ӓ\IENDB`./examples/ubuntu-ui-toolkit-gallery/Buttons.qml0000644000015600001650000001113012700370701022132 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 Template { objectName: "buttonsTemplate" TemplateSection { className: "Button" TemplateFlow { title: i18n.tr("Standard") Button { objectName: "button_text" text: i18n.tr("Call") } } TemplateFlow { title: i18n.tr("Stroke") Button { objectName: "button_stroke" text: i18n.tr("Call") strokeColor: UbuntuColors.warmGrey } } TemplateFlow { title: i18n.tr("Color") Button { objectName: "button_color" width: units.gu(20) action: Action { text: i18n.tr("C&all %1").arg(shortcut) shortcut: 'Ctrl+L' property bool flipped onTriggered: flipped = !flipped } color: action.flipped ? UbuntuColors.blue : UbuntuColors.green } } TemplateFlow { title: i18n.tr("Icon") Button { objectName: "button_iconsource" iconSource: "call.png" } } TemplateFlow { title: i18n.tr("Icon+Text") Button { objectName: "button_iconsource_right_text" width: units.gu(10) text: i18n.tr("Call") iconSource: "call.png" iconPosition: "right" } Button { objectName: "button_iconsource_left_text" width: units.gu(10) text: i18n.tr("Call") iconSource: "call.png" } } TemplateFlow { title: i18n.tr("Disabled") Button { objectName: "button_text_disabled" text: i18n.tr("Call") enabled: false } } } TemplateSection { className: "ComboButton" TemplateFlow { title: i18n.tr("Collapsed") ComboButton { text: "Press me" objectName: "combobutton_collapsed" width: parent.width < units.gu(30)? parent.width : units.gu(30) comboList: UbuntuListView { model: 10 delegate: Standard { text: "item #" + modelData } } } } TemplateFlow { title: i18n.tr("Icon") ComboButton { iconSource: "call.png" width: parent.width < units.gu(30)? parent.width : units.gu(30) comboList: UbuntuListView { model: 10 delegate: Standard { text: "item #" + modelData } } } } TemplateFlow { title: i18n.tr("Icon+Text") ComboButton { text: "Answer" iconSource: "call.png" width: parent.width < units.gu(30)? parent.width : units.gu(30) comboList: UbuntuListView { model: 10 delegate: Standard { text: "item #" + modelData } } } } TemplateFlow { title: i18n.tr("Expanded") ComboButton { text: "Press me" objectName: "combobutton_expanded" expanded: true width: parent.width < units.gu(30)? parent.width : units.gu(30) comboList: UbuntuListView { model: 10 delegate: Standard { text: "item #" + modelData } } } } } } ./examples/ubuntu-ui-toolkit-gallery/call_icon@8.png0000644000015600001650000000267112700370701022614 0ustar jenkinsjenkinsPNG  IHDR;mGtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp =IDATxbLLJa n@l@7w6//`G1ZADXdP$C899͐EYYYH2D_EE$CDDE># 8:ؿ M!"W`nnEIɩI2x?˗/@6;BB+4߂8g#LMgE3oP܉$C@P%!xxxѣ{891 惼\+FFF IN~~@@ NG@  aff~*b!P幹:qq IIpdgPPPv4h(CIHHtlظI$ˋ@ **(.A6HJJ'1!GX :]E,rBϟ?#Ο #gϞsվ |!Hqp b&PL"}phIENDB`./examples/ubuntu-ui-toolkit-gallery/nav_tabs@8.png0000644000015600001650000033147112700370701022471 0ustar jenkinsjenkinsPNG  IHDR|ibKGD pHYs  tIME5!zJ IDATx{]U}cι.d{";@"BVKkAZm߾҇=*GꭶhE[m=R`jjE \n $$;ɾdm12\k%j/<<\s~oc Ͻ{=_%x9y9y9y+}n }_{ŕ=S֮jB<'sr(1c HbAJIJH"R l4V[Y^穽Sz>tsg? \2+UXYYaeyUVY]5MRAv1@)$IKhBRbSy7HRF0F) IiT["%U4MjԲzAUddd!# 0<V~,#2LHYB$t:8EV9IevjV9:VBh4h6chZ`N 4 :yj0°J&sUl4hg:ZAkipxxf||m<zNi^[wų{v1w?K ,//J B$,˨V 2Fj 204HZe``T*5 w QՐYj2ͨTjh\+4E)R< !1ƄwVv1m? ͕6RBN'GL R5ФNJRi.d/$$.H J*mAцvRVbyy1&lDJѰn`qqNBur(t VfI xRT1F[ 2($^6Ff 10X#I!EP}:JJT*]xgCJzD +&F4f964WYm,Lfqitm&yF$,P* qʜ$ I*H I"DB$@ LIS B#Eq-_h-C."DGa) h: }6-";hmHTOyRhJٰK۸xHC5MSFFlSVɜ^Df)#EkuT*Hh4dYF%l6i7h9xphZ-hggY_b~afs%fh! zuk'x e/{{Yݣv?vZGy47nd|6l$k׭e||Z-?24-VWؿ?{ΰdf h,..nuP )0"V^YTSPjUjaR$YH*8-' WИ!BC$W5Ɔ*Z`eQm[ +a[NT Hb^NFFÅ>g0mtG6vB́۝cvMw@PP82 <6R2::ؚ cڵje,,,ppv?s)273@}HaQרm^RCb#tti,NJ:Z:[`&tV{ b *N@C, A{ZX61}G˄&q6F'h to!& eݛwJH<)bIWśjB\t:MdM:yۂ2>Z= 011#fp`Q֭[ZFf6K NkL];y;e].S)Wzou/SObr<{w۷~昝fuA;$C22<##C RשT*iol.btqM1c`{OBb+kA@Ħx)TBVN1EMFkYa~I E@S>8#ܿ.ǯAB$AAX%4F% "t .2"G0>Zv|z~x;g~?Tiw?r7s?΋<,ַ7#ocff5###a͚51f1*̆Ch[d'7!tIK1 8&C eX57: R\JɮBiQ,Q&^I E];~8`@ ֏Hlx4L(0ҸZ[p}-d1sT<MJl@QXA< J9gtlhnMcX~'t;nF5y3۷8#֚UJs7V ?} >O~|+_a޽LI''ʑGɚ5k+ExV(WsPʆ"m,6LBF`DzvBI9)+!]`|ѵ^)^9K"d>j9VhQfxڸ;ѡcQ4mBIh S(-ZAclcB?,V8U@#=`׾7  mO9&1Zt'c Fda_%n]b \i5XYYaz333Ԫ6mG93<AWs_ukPJRA W 2 PtSFdVVuj6(ps]zElcxDKą)N#t,-]ml8bϤK }ʆ`@Գ10hƀi5AoY⍍q`AC <ϋ0Eb< Yr %vdX^]e]4v ?@}m<)KVĿɟ|x/z<>;z?S1f˶rlPH[ KH7/E0.>Ƙy'ƺ l'V EqB%UyOe\Zv2 Q^#zrimajBgk'tN%SxCL).W+@mr.Z ](hBexH"rPB)͔Q&KFdHbaa;dpp79~Il{0o?E/R*>1ضgy-'ͭ$ׁNk8묳h4WXZZ*y @(h*ےİ+m YImTx/#=q)W( nN<9sHxʘN `^B %Ng:KITV </ U{R1{b[-a y@ Ϧ&𞷇3 LYX $0m  ER~`\YJ AcR];vxW"~켋7}2?7q~ ԧ>iowpIG\ۿæN篲n$N_ aP3wmMP3q};ȕSj60i~ IZA)v"l*YX9NE9@bdO}/,p bgЮ)<1͔6Z(C8Oӳi):x1t#TB\cV HPCTʬPcK. vu; #FjL UN)*CKX2$kX#8\aD}6"=Vk( ףVY%($"-|Br@ YR\a6(x'y+^O]{1Z%ff&_4o;͛f뮻yɏ+&,K9xp$]`!2vӢ-@5)ֽ[K㕰 1QrIW.$K+ax%r)eѥ40==)'P{ޤ~} '0-"|" qg th.ހ9TT8c#<#*j{0 TjWq0F ,gh5;,eݺu )FifMlFR ]9W3 j;a";~ /|-"v=4~v'k֬=y]z-] >Gk~SN:YZ!*y,z"ZOBtMy"LKQTEX7" ply!L F&9O>_XYi088RRaey9Ҕ2*ifEetT$I,y&WSXzH%乥sPVi,R+xnv+VXFk8͜F5(Y(2EHc4JjY#CkEY%jAP񹢏 "iR yL$I@sHQFw:6BF4]_g3b1{\rkyk^-~`?Y]Vʻ~}yeW2h${TW_1jv7,\ruJU4J,n(l( ?ٔPw$c~OfX;ǙX3%*& ,7Ya#y#&`fvqܢXjfݺu?;=E2@^jQ3:<xh.xpNxǨ2fsܱǒ4?zֹ菼 ϢD&h%F a}08qcNYZŐ!($$Z+@-#HHAHk;]Ƣv?tSiL$i277f188͛I JG}A _d%TȲ,%f|+/4ӆ$84יWLn禛wo|:Jke̡xv0K H+mS GVmShD LtCK[mVIꄑ"E*viT3y6̶L:ԇ$VW"Vh[r7fl-y)|փ@ t(0A&L~Fֱ4[laǎ?;>꯽\r%Toi4WJu*h tYY!rqd0[06:g(&YYmrQO~Q/u=4 IDATi/Fk>91Վz?p \oC15V;&19êkK\N KqJޅP (`@k)fᩴiHۨ\EtR*$ׇ~ : No q8X^yER_'n`BR8Ô,ҙ6ձa#A: MI  D-h 6zrJ'3LTG$)ybٴiC/r  O<z ]9=W]ebtܴEjaӦٳ{'{,w7ۙ++Mӷp]8/cќw|/Hbh"pM'dol% 4ߔe%s@9 rpW:zR %&x RE).P'JX/"U 0`,_`SkCH:Jbe'.T[ eBSAVs#MSeQZJRD+C"$.*(`Pd425.LDdֿ \&E EڬmQD"]'/d\%`.//߹nݑT)fݻv0g҄Vn\I4CݚE ,~7Qpx,,y3,L a|@?,x卓efs—Qt4R1`!,Ń#fG}T OG5*YZ$(i+E62%v *D-7(9#0Rbi)8}RHB6뱴_ ; c\QCZ݌Co܅OOZxY[.i0u7;LзۮҒDQ'<;袻,-.#`5_ӱg$'M+a;,ÃU^sϿek0kL30<4*o2_jcx?(,ydCQx聵} ]bѺ]r!&0PTɺ҅,ڊB&SRF ?s4{uӂJ& %X~pSr$i dw^a=&OBJiʈc HQ|_PX wM4*-/z­},8i#V5+ h4 qH.`Ϟ)FG,x-1F&Dk\^D^CtI;7o{Fa+l]V/m#ԅ‘jJ>^,l>e̍.՞bbA=}KL)lQO|c."KD)*}4zB D4M8iA"6=kuwX "3dH6@ek>3336<۰q_mKK+^-Dt4{s">KC#LEWGBzF6J'E>bnP< i%s#TEPֶ%;Fн# I4,dJuAi(LiDLbarve1`~J3O`9 qPoiDܾؠj۬V0 u)=*7c'YB"[DoONB}@AܸW߯,-H)’}ʎ@-;j0:f; cz%Jɡv!<,-,<ʑ+mhqL4I_7JXmRZHFyn42\C9 ^G;~ZRJ %"P*܌9ɔ@rҭͬ>6m[)FhT=֢|J#u(2Xc+2#{PO'Ѡ,ǯr($*`PyCS0T)͆#EJҴm>OYPn€D'݉1>V B(gOBݲ<$ Q&bTgE:5=V>x:)0~݉>YӲob]Ҙ~2}Ƚ2*]S4] ]wk(ѳRTc=O&yni:DtYK-KuOP~x-@hA Fru#t6>HY@^[߲alTAn#ʴ{mʇ*R;C)=t6E% Kb)lbRjveU&yL1 ,xy!rIӥ,.)Z27J@;cP҇A%K pY5:'Mz&Ѧwed̀d.eI0h:~]G?_CjQ1ZB?#+*`0ۻSd׹8+16ZL7}=Xp~r[b-鞰~u:=JJ葮Y]z0~*Bcé:wEJ)<҇g4+ЅT9 V=~}~^GAj3Pָӛ0 !CKOgⰱ+[2ݝ r䑤"R2!dMez2҂6U󭄔+BMs8e, 6q-V/bCa^.bFI=-zɐgIs[az(4QSgD94TM U 8.::-eQeu9_K"{B^FET:ЄLQD -3JJ;r[jş=2CXH13uuN)Lg.W,9|sT7z#KEJz.,mU&.JmԅsW\Na\-CƸSL'Ud:_;@nC?(87@(:ljKdġ@{vG`$Ҷ_f8H@'7K(!Za"omPR>ȳэ"=H3Ѣ`4xY-aƲ+js7^L1픔ӱmRɲe)e E12|`%PpMm~ؠ?+yQ,dtތyJ13I]NaJa :>ƱmG(nr):G5Fvd=prɎqGiKכt|õ_$Od[vGmB>hH$i D b׮.91yp>h/1 ߡ]GKM'k1WELx7(+t @DST@1=6MS4y Z+&$^ݩiFrQۇȄiE:T#:|KOQ|X@H\3hso" 󬻑1!ai6tuX12N]Ԩ$RË$0(ST!u)0Pݴ_A#RIɒy,&:.!]SJ_CѲ)I9z1 \5xk]Ju_*Q1e.Vt !#G:woxD1mhE\L C㎻aG$?ĵn2«yB8"#BWe٣FDWCp<mm nS63ӐqKHqԊ@;(jc+4RH^ j򨠫"2pԺ0h%EK!a2{UP P#} o$r{\0%EdbΚO :{D g Ybb2% tzs?Th{:*`Z9d_?ɸ 6?Ÿ1?TDw0hr ~F> ZYb)jM)!P%lž٢@(\u5"BRI=D??\t“R]NEuvY"U1J@v,ۆ72g.~Se ,S/0eh[ 3a\2Bg D ?0b,tM÷}O(PYpGE qOlBF-(Ht.7JɋۥYs݄Sd\<)!Z*qYHǸa?=p.g1gtđ*ؽQTz>oQ ˣT9byOҨ&KBEsVÛI 2DðBvq9tH|>+WŎz0sXE[L_E]YkrjS(.x^)܁LJ(a`?vX#"e xkp F>vV4T2;M'0RZ͈bx֚NCZ-r4&ŨWFJwFfC)#2 983KR)o_;PÑDžP>Dѣ7{7~=;%Ja؇bPB^LHQ15%>:5Mhm@2#~%]x~_̗?~>spJ=X^C* Ldߐ`B[9]/#+,kh3AS%: #$#1)/w^:~CJ< z~_:wۿzco_z]BQDLM? s{Ḣ ۿ!X7 '-VY6# 2T-Nm<e9MdI_襀r!n6P{]a>J˘AC>Ct&b+FYw}P):;XQ:v"عiLh4o  4n4?\&YFlM^g˖-dY#<ij }gv[͈su8!]gxp3~֬YC,..Zr'n<å}Hԕ'aCd/~ա9nFG",2\R,J!R[ Ubrr[n oy[ؽ{wx-[p9o۷s90113<<@Rabb{bOGecX~=_|1۷o硇V1==(j|__uK/eӦMya_*]wq饗rynԧ>֭[ p2DBv6,CxޫQhW^y%\}p ݻ`͚5lڴ/~s=LNN25o~|[͛׾<ȍ7׾5.Bַrm|`ffO>SN9W2TawqgfffxG?K!9}[w\Rp/۷o^IGL=#% :*g׳뮻89%gLZJa\G?~fggV\q,//2=="ge,--044Pǩ)y&''i4|;#䬳xٴG_x\}͗OJ`4o'I,ˬ U*+p" iT/Ľ\ IDAT6vӦM!ɲ,;#x{믿K/38'x|3Ny3Mjo|odjjN8xkj0wέaÆ ?%g,cΝ}ٜr)|s_:_~9#C;Uz]wUW]ž}Ȳ׿5a~~`p̰fmۆkO|TU~a&''Y\\ ,..sNN;4*mƝw=k׮ 4> ÃE})y?6|)_7/9::U;yc?سtq&݃D"o)$ʏp'miԩ%p&syB<77=~z(Ї8G?1>q|A&={{WD¾ {nmƩ͛QJ1::ʚ5kZsP>O|fɾ}{y'9cgqq$I{v7̓O>{^8㌒G7~WE/bttA."| gr RA|,//Or=!~頀GgvqM79ABy||gܽ~;b}4ҳ}}Pԛ~n%^fS9Z0tRV3'MI^ﱂ HRDŀ .fVE^xQd1Qij$Bq;o0ACh@Sj"d鴵⪲)쉣9irX]MlFW X2 } NɻTZC!Œ8L8 Iء[(ϔR)J׭݊VRφz :K9鞥F9IDB4@5}kfᏕ AsQ(t vng[W~8<Į^ޏׁoiDŽMR>Br,,Mx>?h[ϤI d;֖׈ߏR[ #_K7f gsH!:K6ݘowj.ø ay͚uGI*]{]pU܀ KDR]RX)jthA+qeY!^Ogl3K21>5;k?dZMSMj=GT%vz_?M-դ3ypq낶kEhV5!&d93@9 ˩H&d6qbO>REjL!T!,BO>IQ|e%%O&Bd͖`m-Rj"+ k":9{T7Ѭeu|4Wj̘EDJ!=r0T lڋs٩]^ b()(]q3/xZx9]cbr1оRSw(? C(eB19!1By?/!H^'9Dw CgG~aKq^P$fi*MDu7RjbNz"ڠ4a0zzȥks@|ʹNfƘ śg4)Ggf59D|b+Olߍ9\+hr"mka<ē3tieYNcݖ1=(ٜnAHP7؃8u,X(E1m]X@j)ץDر~L=Qm0hXLwy1߆azSE4ʷAiS4ZMLekM!]S1鲡ZIYڹV$9D'O[nhP'- ^\\M,Ä:L]bxoUUEl`МFSZ2L4`gZk_lP41XؽB>MR,hFZJRx"-`;m{0V cPȻS. H߆JƬ!_iJZ2a]E>ЬV2MߤA0iD#X6{00ljiY_g&.A3WͨVi]!0 Zk>яrAl2F7tW\qkkk֤$_1Qd7JooYZZke4M,t3!:^AB?-<2&k?amA-?HX4 lEa#|]妏eݺ&6AjeUޖ彨QaҵvOO|=1%9{Βm!R~(Snl3X;jT8 o'!ud'ǜ3=WWWkxsDٯn_s0O4)wf~~5Q׆y1nۈI:tl۶m#PYFֈ9AN04h5{?F@2u6f9 ꟶHjfs;q gsY@sqxeYokByETj2cV2':111 h4j^8ĝN >{2 Zt?7|39כ .u:g뮻3^w^p077w͡CH3ǭ?(/9 ͜FLnv*ʲl'qYG0r +',nt)7z`k(T4iTѿ?cJJ RR䌏6|(f1fgI#S: ̉L隌A5gúd?y:^V/'!ScE;RϏ۷\@G_x=Cxt:qwqYg׼n?q#?#ݻk-wy';wxu]3G?{^77[ /~vίp'n啯|%guÇOe1O?~WU;vl0?/a&@Pmg?i !L]!UN 0Mh\63K[Yǃ2.t-FthW/?'P윦8xȱctۣ~r GLQA'ʩp]=/~~k}?|n&9sxGB\Fk矏sO}S,--?k~vٳg 1??{\qMZXXO ֺf~~|n_5nJox1E/x_W9PcrcORJj1yHgZci~JߴJaST+)#~cO&Fyiir@A[4ҨXqa^$7hH5JSxQɛjUUqYgquqWsWrrg7+cǎq!g5gرcǎq?|VVVx衇x衇X__gyyG2S%rҢ`"KKK;v,9FJ~7b~aaOǓ6`]x351_tX^H H fi@C8BJG41ߒPh3s\ek9S:E@kյb o .}/gc>&#dԉnkgi4߽mD⃘Oۆ 5LJi \ve\s5  lllP5=^}Ǎ7 >(x3Vc8G۷k-nw'hhnyΎkݼ o0Ⱦ}g׎r5z...RDz&Qhc15NԲŠa-aAR~I1E$tmRq)&ҟX7N[7M^彘8hrJ&=K'X΃,lm70,尙H!B˨fEJᐪ2F,n™g׾5nF~aF^xaRkĔ6`CN9Z+ꚩEozF^nVw׽ <qSFam_BXCH3+ jSc-J`Gw,NW\)$<'mC 6(:^rM\{.Ni:܆{h}4 (:T Bg9 ضxVLt[SYzrİsl9稆#*=J{e߾}l߾j8O<2;wdǎڵ;w277714/FZt ȱ{|_R`0O:??m|ONBf.˒}C\|Ŝs9^4k ̋== ]1qMY^ e%FٸNZVB?lNX}OE"X]LH|`Uߤ4>L=u $yyutXmndܜ^zÊ.j]4x F=yO#= SkkFeYsΠ,[lie?'?IUU<9auuuPn0p֕ߦbڛr-(6^K^Vd ' Km戋;Ws6{lO/A"fLm |(N = "rl<V׷b~_a7LAV1&!"~FQ~<#Mg-BZs\~~o:UlllpWp sm6e/c~~!k_UU æzֳŻ.={4u]WW۷NÁg?g< _B֬4+% Q nQt C=#A`zMcdw2H:TT qUuQ¡'-6yT ׺$J6*MڠOw6/-}*I)*[o6nʽ3gٚ/`eeebgGqqq~;w?ر~?Q(}qp}qI z /x󬮮6qcc[n>u]}v^swu]ݻg?#GpsWReN϶mX[[`N6|G8J ߇Փ` )I'4JNyяcTF9LvS^V9/E8=u9YRI6+Y#9Y41u?OcE`.AiGS>Z934|7N(OԹ`?/WcY<̉ny:ĸK éuvgIUUMjpRM::۶mE/zQsjk,fCGAxPRΥ![~E>T/]#Чi5+ F3ո3.A) E]45U[Ң{Syo<LǘE&x䑨ͣi6zǺa]OZ*S7>ƙ-'qSрnK\>JOf)X__@1}yf0L666/#Pkq)CAn{(1D27FWVg4XePcDK=^s[CM/jR; IDATjz}b$ pֈyg5DŽql6y*٪S]N%4Ŝ PSs2=[7{kAc)θyT ҝZ,i/dDҋs׏|0/DsX4mr|Z)FTgloHHE*Qc+v):7Ss:7D9p?uHapj}O!xbqaܶlIi pqJ=Vy֦"5947"_ {.sΡUxGFPIxDgNTny9zRNj# ϙbI;m3RJjIۧO ='g<<Ứ_0B貅v2yDI9*vDJZEe?_N%Ș~M'%%OmHB2%4Ѡ9CYjzcr=_}X)àÊ+]\y  yx7-&V/T>љOaL{Ѹ'|]h1k?ýM[|X5Ix"j1; H ƸvB01%1ڦQ!h+ϔ\5u]7nzK5OlDs _aU's|o>.>LtS,KR3)is3'ŰO:a):7NN3qRۈp7˷;U//[~ѧߍSG`D!1{ECK,t1a#V819> NLӞtSYF{\K̔=mlm=~MEUҍS9ˣ1KJY6_J$"xv4𼫵U7`|(Ίf[S(,J/~T}1|gQ`5Ra<;;PSu?H5֔ {+Zzp^HQW6^ aӺYHG6}zPTMzZ`4fijOAnmˣb 2-mhlgi|j u覠kLráMY>ϐ/6!s*5mFh˟zmmYWgDe8$UHnPSeQR ӌl;͇ڵ2o`qmrUm59ؑw6KY~ Ɂ0:?{N^I9Rףf乁n~ (ʲ&rthV~*1?2pn(JTCt&4(rLad2{(]ZfW5iZ ' F8!)ibJh8zx<&ȥf觺\N{.m3|jYRN0K4B[d MzW>/3!!>fE=9f~Qo[; :OrvS K!6Q!х'9p@9l0xyRGAm W"T Rak֞H(L{h9<L#I^ t mzJFsX;:˟mD;0u)O[uG][:.Z*‹.8S AMȀֹ$Ht~䊛m]|po[o(ONy)8sY۶> ʏPI%Ύ˜Z S6=@)*p815fOA\ɥMgG83CQJy;Յz5%ߴpsCho\iߒla 5@M/i.UTmb~k(g-RD(!rESE#YuP~c!*(NDX R[!XrJU,^9FrBH[>;iOgڤۆYYXmV_t86( mzը,s^cʁ6BN%-fMy{m3!ɖ_qT2Pȡ׶?BtMWZ2ApoߦV@ܹϜ6/ӱHrm}Y$*>S6 AZJٺu+'WTΏOD,8 8k%@3)ۗwwFl/Kv>HVn::ӓtnW۩6x]<=]"B^T\Ӻ+o>t)hBe3k9#y4˳䑻jlk*fnnm۶%I1ͣGW=}|B2!WT,TGG7O#sm"mnsqW`~SȒ;{͡8]n"T (>o:_YMukH\)O7q[:Y^Ķ!OyBG&_ۨmWHɝ1 I_?q-B*͌[NCj6YO8$4T\:TJvHiV o3PS̅fG@tFƼNh*k^qcٹ07,C;n9WQA iVptlLŋ0nMƵi͓i"Ckiv-?8>,46«t4ſ<~/y{GB'/周v I5"يѨϑOЁC8>tPj~EƦ"Qkv= b)~#w^CQz7-[ر<2;v,3X^58~hHDDBTk ocn2Ccl,__;amhصk^j?r]ѝCQz45^"QΚĉt5K4x$Yi'_XHm9r<{pHb1}Mrљ7f.CNM{iTCc6m6R2+{mرC|~>诮PȌ|N(Pc|צ'tdc{s;5̩s8c09Co**a*+|K\.;kE\sՀ!FqRL }QÖ-[(|ོ~3)vqW|䯨?Jzȋ:l TA) y)&qì1YXXh(?S׌RGB8XXɖ8N ׳ ЏЃ*l'֛ o|UVVVXZZ|0j?F"-le~_V\hc8o-d>-%vԶFPRb8 Ј"h\XtZYCp: jCaG(pH\I"˄ԟY!Sո1P(>{ۙ_׾Gn`ZRvon<};8 쁁˞^Z@ rNv{u1!2b 6BAm۶'ITLxD ~\d9,^aQPqb{LaINZӼPv /BKD6@ouNS)%m@/һӞ"CCUü*ԒnG! ԁ Po1Fas*"%Х)Х(BbBΣ֐#|Zc֊JiV |4Q.~1K0 !=* p:u Zu[ay:~Cfiy+PMZ>6pz]R eF`A:+p rGK )D G4V>mƧFio!j2=0r~0o‰&e2Iׄ8xLCo5:uQX_`QXegk⮯.c0XGRCh 3a}og/W9?O%v=FF%@9EDW3^ZbF`0¨uMQ}qHR2HP)/H ?0hSs/˒￟*rr:]8 z8y֢kԾQeV>+:t?usN.\r% kV8*s5ukWj"Fv@! !K#P  [JBRWu0* j\4QF#֡F.PH(SՈ |gkC4M6D'2hߏ ه`9/E㔄u Uwtֳ@կ>3oxh‚%,УA~3}KnxRZ.;!5MxVՐ B_$}][C|!.ÙȣM#ab:u*zifrbSRkA?z7)S#Z.c=Ƌ_b:Rh6UPn>4=Q:R19?_y'xsmzOu zָS2cǮ!0:QSjJZ![z\Ws߭/G3s [#Cc|XӤ/. q] "}T_NpR9ʪԶ$iz=/|Nq~wy\s5\wu\zEU,mJnc1dQc^ IDAT瓟e>{3o|#_{sss!v?wqDŽ:|̈́PHbX ~j)|)< SR~-gw EY]Np/H-PZt8gJr 7 oy)Zy) SVvpCUψIϤlFg:|G7:5>nE&l"WO䒋.F)G'cq;v,{n8LimN5;wdI"8سc 9$eTOsə2XV!(,6QYSz+t!رOiJ( % /``CC*@M~ ߈v8cPX7ԢI1!n!J0 i@I)X'YbyN;p)% Eiu e CG8`\ϮS:25.9z]W(;[)Y߱NwwwV|{onyH'c[mFlmc 89h|'oFi`ԟB~^6#FW4&F{CGI j>wo嘴VO;NC 9C9At zƧ?B:2`*hSdn^4Q }&vaBdT"%ܗdatutaGf=̺: U4(+(D*.ͱ4vs'8X3b4ZLf)J 5x<jCe` *_c3}ǰXs/s.5E@oBJS7O;aqB"K($N(tGEɎ @>jIA[梳O2:wybc< DJv|-F5~2d@LcDj\x9v ]^SXr_38y _|f'v8 U5z*Q;L.eHτCHy:PA,0p?:c>Y:Un8m5nR s<أ9r(kNsZ) x(呣hwޗ܂.:AM!,-}F`۶mݻhDU[, ,jbZylmkR)|ޟ*w./ nSh#@QY"ԃ *ГMCBuA)p>劑$+ǚc"V cu8DmY;w۶`C>5Vڛ kUsPYbT,G*ha Q2srcNY_khܧ]N][ŏ|GYt }G,ʥ\a+hE=Hl]Zλ.9y_4ʡ+;e8cNDjՈ@.%A_fBi4K'8_?N!u]O)Y42n\-2 }c\ WN JڀbItDgtb#7ݓu` ~ :tQ=5 . t D~,KttʎFi-+BPfz8.;ロ+.;=?+ wS{ְWE8mƸyB}ǿϝK [b?E&>CNШ]7pۡ7'q w}QN\yN/%oNܦY[f'sz6=f>|tx·|5q0$h|I=͚)w_|w̽-&:D/]DeGoQxpnu'ߢ~s<WoYqύ#t KQ:eמ{kB:6ߪisl>ao68H.+O{ mM*4[`.`g?}ފh6ONyT~B?U\ x 6ADPjϼqni$s;f|ew7ھ>_!7 co(#D5/GӶ>SVa3̛aէ?ꛯp>>yMm?ymv_iFQƹQTđ9ƻ+E40scEI&#[v* opuP\/s{0(t9߰t.H+![W6#ͷ[Gf *kڏ]"@;N #lokK[f$)4a"enarװHN0.-.{?^뭽ۜ4cT$6x9-nǮv#RT$ouWvo \n} [C4*)qF {ofWU ޵ϩ!!B hUQΨtSo_"~iJ tZ@B @I%TթL{~aϩO-43VU b 18(rNn6]~s4A+Bߦ;nhpw`(9@x(w;+c!0uX QT>,=HJ?iќ#0Wh,ch\#RWA@7(Ƚ-'}Ӧf ր>sG߫-5Y+mw9,v?v?z D0mXϻcݏݏ':0Fޜ jfc#%5&piʸc;~g+a4M3v[ݏ? A8Θ ?IFq_Oݖf M/sYH8䵶Lz=jE-=fэΛgiI:xj"Z_|4i8ތ?~?knc.dIc㞳??~cWn:^ ^E a `aط/)[h^ǡ*<̅ZX,K0zeLcQO7sm[o5x\419`|5iG¹I!P;HJZZv K87/]h407΢lbnn3sh4h5l6jj7jvzT&$#,*_J\v7П LϿ\"=g\.P(\.T*X,V\.\)KUT**(+=+űȸ_ug ku͟| e_y㦛n:awOMMa||hLObjj SSS7h6zQ!d ||ЃJsRIO ( vwCAnXC gub@D0CVQ!+qqq"l6t DA""7,"DQ_8nZMP*N_ZZ ,@__ \,my_矽|+cKC>Ƚ(^ІtXWwb#`h͟ ZOCጏvz=~t?X]uVl1czzE̕%P(T"ϣZ\P,Q*WQ*P{(Bz%M@O7R|y=$HIY)b>tv4@iC}[-P +@Ez4a,;` !NaףYArzԷ:,fFfa jV0Dԑ`F2n71;;N'3k;V*\ӈc-hZN;SJVq * %TjU -YKb! a߻r nLK([ P8C({ݳ;?sظIDBqÊ"P>09',64$D،RgRd|*f J;CР󁑳Bv:dZ` `JjCr#x %WJ!"(F'.Zt qCJ]$֎\>jjֹrb P,UPahbKeTਥU 4MDQ ;GsvNa>"ʕ+q=(榛n5qU8蠃d-[J`E Svlsk^s,^C{#b ?ׯ'۱}L} Rà2j*j**VGRA\>p9)6hXAP֞1+H0cƥ>4U 3vHTyLMMWGy۶mrSZb`pk_3 %D$fG1 G%郠&C!8M%#{0509ϱO2ޟ,'4Y*/vnf\;R>o1rm4'kEh#ƙ&J!@vpk&ԲS:6m_~CY}CCC)Q ) *+ VȆu/|Mh֬* Pkov6Qܺ7 q":+0>tݲ'FlǍ[8vO M% >Xv]dB3ű0 dREڴ"!8smDU@dX1Ny(&#c6g13;1LMߏU/?~IXr%v෿5?c#hZ'>>˄^+V.{c#チ|;ơG}4VP,\8&۱AaF L@Ph7ʺIDdF$D Pmj@`vv+dJ* UPCHέK4%-/!(fH4cQ&nJ"-!A$%KDJS񖷾"o69ts,ZN'UT!!(R",`ch)wn=s kcaw-:З Xü^h|N!HuN' gLű;;9<>~56?#%#|;l-?k;os #@>S}+_v( 4MmV""㶰}D];ҡeYWYRNh8-P!eb{ê7JF\(V0 f#"u6?l~Rp6J\NY&qB)%˨&`K1XjƢEl,A+s-JoK@l !P HHH)rXHYc"^>[A^P ?:zyx݉c?)" ^]ﺸ\)pYk8uWo|?pVK>K`lDJK[gfM[+L)mpl|#̡ui/M\'f^ )څ)?ZcbXI~xS_s7MÎ?qTLNNB1  C>t+,4R.u) 5ܪpAy\$tb UQhrBi]@g&0:CRiP$Z1br3Y8uIa?J&mNC !*@@׫Hgݗ-[Zv+64:h F!9YhW>HXNq`[쬽$H^O Fw VBXh *DNlc||u#<BJĊS}@ cزe :\w܉x٧[n>{>1?. >cp;Π~#>wa=/~Rz]k:e!r)6&a-tMS@65{Ԓ$$RyBެf56I/:)V].CA@x~x+nbllb`F. RY[ v|>(j܃Ni+b` v\\$1 hwDQ e 6+o3c+E4Zw]8Зc18P '|{=_|7mڄO_){e|ϡWF>bq8TJ!fu pc=&mUQvz!C 5E, anv?@p;4:m %Ƭn#@B```#Xx! T*D9$i5Zcj| att'J2^X`nnr9,X01ԪUSC,ʥ< Iqԫ+;QGH[ P!IOp$bao{ڎ95q PmHgF&9 XǞ P ^CVz(56MR]׈C!>Hx/.^V>8]f޾g=>}Hgy .zυfFrt K^NG!L6A_tKNiJp 70YT 3`IodLg9?`Ps;w>9w]x;`l|j-αa*xj͛@!T oBS "lzz#j%<,Y? JFFG6O aO`x!\9Cc oݎfgpA^Z08؏Q@P  k谆Q[ȕP FX*T.N{0xpj*IUF U]hEƥS 1Zb>,Z06uLND 9Tj p+!D:`4": :.aprp;~Bf$Q.cp7+4ǾfÙgPaR I'tr*!Et΁6~Ҿ7z("tG|NR:WfrG RAN{~_s .lRI `jb}C>ȣ՘84Jac+Wsd0L!ɐQSӨ92P؉b>DDZfcZ;Q,h̢R,ݘCF@ ۶nΝ;KT(P%:(PXOg#%!T :C!dl&ѮXl,2dj(17; I,j!ma1C(\fȃ% X;j0a&CV`V{XmGrJ<]=^56:}g?)馛NK^4'֬Y&\; D-pʄA=ڂO,?Aҹ‘d9Uȧ$! {~\bѢ%h4\1UC2 *"C6ra 4>5BZB'҂y[skOObpp33uJ4fP.5;\uPȗ1ۘ@?:0=;PkZ-]0==KMo~,@sFiBAt DHq Ʌ8 Dd4 LAIx91.Ba}Vcfj9QD__DNK\N)fS(J(#FwN/ + LGh ?0GXdFvlEP>g)*;'_yau=;G>r> "&&w˰}!D!;ྦྷb2t=,Hgd*辏32AM[.5wǣ͛7<#_DX|Yt+nj :{Qa K ?1c+Ў$/6<3]R2VCDKH-[=щ(8CP6 H fъBJ"F90nk*j!`@!g Rzp 2!(Ja%!kvscaN$d8f APa^ǣNxކo3%4=mᕯz }šLQl$ڸ k[/AX˵W-19u5$^JqӲeGe ǚ~B]`E 8vTdb]hsK~nѲ@๯ (R&`jyd HuL=FH"i~! C2#BCNA+ ,4EP ٙ%S($KiIuObjj+A_jՙE%!aöϣX)C* ؤ|"Hˠwpkҩ>E <կ< վ"e??6뮻WqFϾ3MM-~>~_0rҐqTZ邿"\'Ezד#xJ2BӔ96ۜ6C@2Ayl~x0++edS-*s*C)!8R|R:9LP9HeVl.q@%b+PRB 2,NJI 0H)%Ca蘑%9<1TU,] q P0 mt2$ P^EڪSR/ Rit,@wt?q{p`hryZ-$#J14҈ 'dHbi 6Tws&%Xól-Xmy-R:^VYa2d~ ~d_Ai"beʯ '&ARQ7@!4e* svt $ 94gg裿FP}&Z|nLf'syG>0` ),݁-[4,Y/!^t![8ejBq(#Ҕ6YP$Z9SR%؃שԏ29K$ D&$KXg]>$,U'4O A=$SeO&<0𩾧X m:cg&StrkK#vbiCq D|+ML"3#<C*p ),7o DĮLD@ yI"I |V oݎO9֮]{c={~]ig, [R Iɒ+( /EH`ݲ5iGůbDЬ@G@*a 0JQ2Q=B2J!v/R J57A@R#&u5>{{zF)N"Jys [a7(w Q6&.^%hAfX"SQ҈dS} PRjffĜ}r[Ax< Q̔vJ+H+3h9~S*Jy(1 rS 2 iGPNbJbIC>) H7^|eGk%$6-FK`eNJdGdZMA^W f-;14pǣu[7OG!unCAI0Wј&5sy.:0%ӭDyu|Q[>M̍u>X%5DRKR>♜ːFȭc=cg[ޭ )%BavO]JJIaŽm[PETJ.y ͂C-[V RL>fBfP'԰NRV;d91"B//F]nբi%&wPDW2.PB0q:K{Hլ̡=A鵖f.w(h_%角ġViMӍ( b. $` !,(K Zd<w&9Q*QuvvrNr ;wN&_R غuj~T*:~*l lY IDAT|٤{/և `8e"eRA~~ܑ$eǬ/xL+K6R7A=J40@LhYQz-3GZPGJ[~9A&L ȉЖBS^@BY*牫DZ8?SE2HmrZkvph4(h4D;'z!7 GoTO`b^ecR^&U4PB r z R.S3Uϓ n#c!&SZQKWB<œu n-K)<%kmDE[_"?;TRʞ`R҉Yybض &刴Ci纒O@1]gҔf'uC %cjjʭ S_%"j5 ü]-OqLq:X-4&(>99FqжE CﷰmlUp%K7̳άwmݟD`i."ݮC2EZ%HZqA#*RNq)8F/8b,R *x 0LDd`6L4ǩZILΗn)2UI }ٚ1}b8Q;Ʒ[ QJbg/\&s,Sp% =ZB'-"<Ǽ>1 Ħ%&|Ŧf{[f["QIs=XQH2I/aAx~ Ed"tz*^@td J6(e*ua*B& 6)w F ])e4f`5'oIk?<Ӧ)'*1:PTҪJj5Agiև&7#tҜl}ٞ dܔrAR6N eq͆zICt@|Bs?3괵"ᔑZ&=Eߟ cn=[?@/I2-/"l_s HOo749<uqC?U>7E,[Ke1Ku"I1!)ӭA&I֬$̛-Q]Hij]) 9Ƙqc3VO o>fiqzhd#|6v㳐? 9-l2A2=tLy֭K& $@zKQdI ]Z$.8 eF:uv')M3I\e 8 +kєD.FtŔeq9AH: b$*U،m L.auT,Env-433zIo+*;5_{eVJuё;i|KI{;0!nP[I/|{ȋ t^\;\{"++Ŀ֔Dk=gy/Q2%hiv6x <ܓHOo$ݟ4Ì,2(34.і^m{t"籩\؆ʋ'ļ{ђ F#Sl~,xb^%Ի(9. M[jK.RH4-qifDbi .Js|N(!>%LPwst_3"%Nn4EQ£?ʒJ(GKSZUr $(CALEIW1}LmaAnYh?;va$&d)=exm|@XuXbض2b`3dTA7`:&%e"QJFJEe<klYI߇&5s$>3 %'T&=+rsb2=ϳhq:w,@$hE@Q@=1"&i֋pz$-Q֭rQ%ҨXRY%2✲/i^T)s itÙrN3Sy|_\G+nY+2VltףIHXw0N('}$+F&:PoY2TL/g=*N#MR1vܨD r Mix>;GI킀ڃ"J= [#hc8Q㪅iBIo(, ce( 7;;ƽpfA QSZ]snh < S3`UtN(Ecf^:`.;5!Qh7>P!t>E fU2if??M@Oj0 ӲnXJqmGۯ a mzZ$;ڔ1e [ ̢k\B!W[D=W{f-l:RL ph v^=\N+N Okҍ)IGu%WS,ߏ8n2 uXA\pa`݅S̙ \!Bm͛T|1 ozYg?oW}}`meX7֮ŷRAOk7LrfVހR(#|aAEv ??v/^A]Z_s#`R9F2Xw1ͺgrr{T"xb!cǎftQc2jgF+Ջ}mk_b`ZL0 ]J!OZ8gaʕn&~w߱S=x˘{o+$𳞋 0q!Hj'4fT0LȰPj(PTp7bŊ8155>{=q6mŋc˖-x',_~8}Q M~ӛބ7b󘚚BZEWsRZOꪫp#ė߹Ct2>я3Ȉ;8p/R\}]}.R<p 7bӦM;?pCEMp=`x衇ܵ|__??0448/jp '.WUwX/^SN9zUG~CYg,]p5׸8餓O^x!׾{<@\jn </Nù瞋i\wuN1wA= MX7I]0Eϝs9`foΝ;111t:袋8rJ\s5Xn8lذ7x#~[V .ryx[ނ=/5k[oE>ZC=4I` Ygl۶ w133[b||7o7ߌ>X#ڵkT*8묳0::O>333c=g/^z'|2,X 6{1C9q;w0;;[n^{-~k_z)=ΰߝb?شiFFF0>>ql߾Ø`<22 lV«_j|ƜKwg/OSwyu} FAmFP S 6Κ+Wtltݺuw}v*?87n .CCC{qq__7P*p-sŕW^ ?uX>;04?),{/~17`ӦM[QVQqUWaXzu8zؾ};Z>7 Н}bbVC^{\s =\ʕ+166Z}8z~Xhqg/ZP,Q(P(1t0;;F ?0`_tE˿K~nft yqeo#@.!⤱.i1e-NCOti%W{DZ;]v.B^<n .p 8 kA^ y}sgq?1ܲzXwz8#tR|O~N; Z )tⓟ$:0ğٟSOfggS^c``7n?|\}Xt)q,_333J;vދ=\p.\wu(J)ܹs'}YJ%t:mSVAJgs},Zfp[oΝ;˖-CZug#U011C)qexpw40B>/&9̐rkP yf֮]w}NGU/<fƊ+wqo݄M6K.?il޼LOOc||V“O>~^{-wkW^~xꩧO;?utt6l#3%R42/ oߊ͛7C… QTߏ}J)_>@k_֭[q~>`=_}8: +|I\yxf^^#<38<,X Vd`o|'^~+bb)%6u}v,[ ###8h(W+8#qWcx6Tz &.cП͋&*t?P\:7_H~z>pI'cvjZCAH݅2' Wx]zWc3cڵ_s9>(122SV]pVX v]k߳"uvocl b|̌(!񬇿~;{R{~7 >Ϡ\.ht˗X,"c׽j\}V… Zf5"BƎ;RJ׾Z cOVR\`nnN?gr+נ=7+X{]3ӓh̵~Z<̓B3zP9tT A$ C >gY{s4}Q.ÚM0zx~wdXv LoCQ1F2SRe'''E; ~G/| htuafl߾}qgfffR.|X7>}^hbHŎ6WI[)I8. QibUH&KRQM"64YTir+y ͳ 5<L~gbչbN3[Vhf=B⋑xۘ<;|?#""6 ~{' #HJQoJBdнBh6!!{ s:˵5ANds=Zw#s &#yl^8I_9XAj F۴6hUB!rLǟЙ|$u(2@n#(F P/X U̴u e4q_{{ ^l[]Lb+EPPFPhB2 AiJ*KIowoj}^^Kv|n} ڛ^P+ d^P%|lΡPA|JŶGiC'D `Vs ZPUX̡(m4 C#;߰b?B%sD ,$n^ܧL$\3r1O(r$x^ؾy-9tOB)H֑ Y@dF%ukb!ngy~ H?QvvͲ\{ IDATn&le2?˧;#9@"dB }5ހo_ 9'AHl":H@%݈ @B+ 8@*T%wPNzn/[g5o­7ΟCfzBBw^ZrWLV/Kc-2߸̹ڗU\+"  #LjJkA|ӭxs֎[B[䠶 bQceA ZTR}c?s9EX)ewo$;6SeL#MkrChH^hV2jntw A>t}4TSZk (ϙZnWzB5R30Tx̂n-7M=hD87=QiyHqz&`FYLMBÉ~71hqD[MYqߎ8r̕^T\FZSẏAW5bEZSOy0# ?F4k$kF4 *MC%f YA#F9hGk #HE)+[^Ke0?4Ijָ8V'NoR vUp) )\md[:&Oh;RQ/5@B8lz?p2w9ħ9pYJit)g1o"W׾ PN`:+U=W,܋@[}2iO|¢_>h5il1y2pi~,HFt Hc ,,,!Ppс|h 78DTߨ l_[ӷ8 }>cȲ^8#AW:M9,4E1wރzh'\UR(4sX7v?@dg Jf8G 0(U&>@B.^ဌ3b?MuCFІύ(Ns J# G^{ث#C"meެXj8NT]lOiR㰟Èz0YkZk}k 0eO‘#SG|>]/V JzI0~ETE5BY=vD4ټ-imzn=;y򴙫LJf\'k)ZwR@)|fUHU=!gbb Ǚd||i<_5@* m)o9iimB4 $M;V|AН.?}pA2?:(`9VX#0ON"CP=oyz5 :izdJ IvJ}oO-pozȄ+,6qTQJS5u"wcpA RShT>zUM:c=D4m9ej/ilrr^׸)bH?T?fNMMY\\X[he|9-^RVē+hD F*;]d)KUh!pw܆m0I95VqEᴞtkCG>Btc0=b&E\S֢.9U!: hޑFGF3a`5Ԗ.;G9pSSSeaa}ݻև#_{?)Zqzr)nVv[Vmqm?8)LcccO|.7JE)`em]etQ'E@U,Q\Y";e:TV[[)DaHkŵR%մAI]^k{UeA! r!uu cka+2f y1h7@JSO=_ϻn;fl55.;Nbn֚Xuӳ,7lqqNi뮻+ c!y%VVV8NAP)U z)^|EY2݆=6 RP‚q!H ٹ#0O;E.5ᐲ,ɲ^W?xQkߵZU =ǵhZub,>ӖFXmB&K 9϶XYYV7ZYanщMF0@~mƍٰar [mg)k.֭[Z,kQʲdƍLLLcytY~=RJyx}Q&ֱat`޴ۡYkxƍ,//o>8^׸BR7Mn&&&&x͕uWt~Fka72 1Y">bd:Cw4+K}<ȡC_ 6 СC(o,I/K~xgCa3'>#/lN3=^ԓb jpMQUV$Зqy5=%^3<ï|;G>–-[x{ߋ@9*?^;u] \\\drj3ά{6m<=>J)~g?|3~팏S֭ٺukɈZ<~Rٳcǎq}Hӥ<VXʊ̟Ado_斸/Yq/ī c _=sˎ;X\\d||G}/ 8g͵N'hݷogy&SSS͕mТhV$j|oA \Z}8RO"M\Bxߍ:-Fo jvk_ڻn=Z^4tꩧr.袺0<~8{/r B{9~~>㌍q뭷|O|/__e0~w|ӟfll 9.2nffffBp|}cʝwɎ;kٸq#Rww :wW\^1Hi!v_2o  a%q Zû.b nJRvkxF 8=o ˂n494P8W4>0&oܸ??sչ9.2066ƕW^YrRLMMqwvԧ>E[o?#=//2z\|l۶~O7~7xW[G38 .<֯_[:~ 4gevv={† 83ٿ?^zIY~%|q)P+}'-`$v*6Rڂ׾<l޼ .%x[m7<Ȟ={xs9`P?k8p^z)rX!]/§Y!71}<)Ez}GDS@!֭xwy'~;۷ou{7o<qr}Wz4}BSbBZB*If-(T>Z7U #B^vnnQ$btÆ \~|_]z( :]YYon`vvQKM0etJ{FolpRrq.2>7|3{ǩb] !:9=KKK<3<㫺={i=\f־T9!)Ŭ?n@JՋhR0v"̦Mx׻^N; ϻ033CQ5P#ci1.te 3xq\j=F :Q&m~02slj3=s)b>:77==K='D4nUyY/Np qݻ;!_W8ؼyg^7 :<[mcp8N,:kܨ(R'/"::~O~ʯʪ~Ce|_eݻ6'ѣG>L9dr: ?GH.>E͇hT%gqs{9SR^ǝwɆ 8qa3B:y U=5m6MVo(CgV0==6U75Z?Eظ02{»!4PH(($"]t\pЇxG馛p1vr|nޡt RїN;ڇxÆ u#-Tcv[z: /\űz{lٲGg:[03k`: k~XB2]-PQt҄ԩ[,Q^硇'൯}-+++Ňi؜a#*s@?#O~zCh0*r4 58GTguyOOY??_z~~K/Rr7O|+-[077<bn+++ w''ٽ{7[na0/< />Hn׿uk"߅wStf11 0P#+iR*?=RZ%xWq` )SiD䉥aEQ3w}7v"sfff8|07pZV ╯|%5r#amܙ8e1D7?LmJa*#Zu~ RrTH\WT͞hfdR81&EOo|ဤܹ.fgg9s8j\mk/}K,,,066Ƶ^T!n6lИ999]OjN;4sMoìp%я~m۶qFgyy]v{UpqYU3=cһ(L+ BX@a(ER*K r9?>eA4ccob|5RvSe]w׿[ټy3_|1G׿lذ>3Y\\.cjj5!{i?%t6_Jcm*AYJ)PGrX{EVlu/)$׼kfMP{{(arY."F7F.˒믿(X\\͞={fd*r-n0pر@ rg ʸʋX^:?p#ZV@M) Vn8y f9CA zc\x+X\gX:=i8.Bt:ޅ!x-sF_O &}Һ"Unu۔)L+7,@ڝvB3G6_4 fJGFVhhmJ1𳀘Se1Fֺ@;Y}رp DΘlm|8kNptxG~GɏA9eM@ c ݦ%Q"|3W~+KȱvR5{Uʄ{_Ʋԃ!D:$-STFt᷽&fQ-bfjdž pbRо!DRyy(ML㏋T6eDk,.(,سMmrrQAqSH ҮPmEl݄pB{Sa!Hi2#}NbR`C5K)GfP8s;(T¿TGJqAmRtMFkCU@J]O3x#M&gNUڜbp[*W~N1|cJ`s¨7ғ,HSzMC=Rjҥmef T/ c yu*QSS.XYbKCm ӶSi@ f'`Cv{ /?}OP8 Z  EaK*JS6S45js+jC4U+mR#"m55ץv\##o"f\=Tù"^J[VƓ՜"bX8aD80bJi3!#' a>7E2NWj6 o@E0y|;ڝ'^Y=2!p¡~6 `XH'u2JJliPNeȫ\tD|P~y|;~Xt#Rw6\QP,lxxt9<8j Q (o0RՙDž܈{&p|SaGmbjt 1%<7MOxZTPN`Mh ldm1p 5džyJ#_ L r,bD[Wu%Y#CQ=ƙ@\Tfi<5p&JC9չ+ޔqkt0:2L^ul0Z5X-?^;bF0вZ~󇞩Ӏv Z'?([]OFtmBH_FHMrtLyni\H(M~.yH19UhmͿLL9q߮[(,Zߡ<=uJM4-n6p?}Wj8?DuiS16"eȔtSc-Z6"Ę),NCCb.6Ue*u#Kv޸ʼnӵc*MĤsۊٔ("8))%Re8:'UzXPru:ޏ8"uMo+]!=6^_\+ [hkRR{Kw*N7V})sU#aޱFJ(Ѧffl\VԅB5]tܩhڧIk&ҟ9?sݶ;hQ K "҈DivTe4$JD! N?YW IDAT(-R) 9DD& H۳[%nKk[oe"ڢQ}?Km_No~@?Qdi3cصcFu<}}k˔}"Ck;r 7.wiB)mf7GW:(U]Era%źa5H&mkl~qkAVB{+1BօmicRn5:mqzFqV5Mf/MS w:z8f~Sxh"쓶S4=`4Ӆf.ȏ ضFdv8%YE87[M>sUY s J(*21b_Zc*/m>mM@ŋKLuѮxSL2!$5gᚇu2=ʲE;vlHa 19}S|=Evr$!=ԫ-΍cJz[zixK:aAvJ6L%Np囖,TOFSFZ}8k)ߎֿga-%+.{M#Cv&@ JT(lSUU3HPaZ oJͫې6>X[C|4m7mmOZ߄M榒.q>W$hyJЪ4ZH$ݖb5=ބL9if6B*#}.fQ29᧙;;3U,gkm&5Rm|8Y( b*`''Kqk' =ض5&7q-8m5?SB|eySRD3g:aŅk>إT\=U^Ʀ\?m@d]Ӭ"|eVL&EU<ڄ7lþ#p"Fɐ6ʼT﷒ vnzPg%(94a=20x4|R64UuM[8ৡ;ŋ~^J*GNӥR=4Σțd%%Y\XOZHDݿRJ`1tq3:Yވ u]]@N Ie5Ĩ:HLc"6m21gH T#NzVf[xͭ& d:f!ϻBQ#FPې=PqM9g0s|c }qu8Ne04AJ0Q%Vu, tKXǖl!}rUƊzsdYFoDt2֯_MYa-[6딭LLLZQ <.06<>B:7kFwycs-ȽwR6m~3O=韀1-I27fo}7H !=mt&li봭Mhkױcǘoy3iTi>И˹KgZyX `|(D\ .q,%sss(c5U$*#B%&ƦXZX3v~=$/< eR8)ii4*8*ve JUdWjnW+A!de`hQG W9jqWrm4Rf`;l<+o} Kw|~.=zrX#dYAobn'/|c\y39:]߶mdbɹ .Qiҵ,ƒI l A6a5nOsڝÄ |g*duF#.kT4H[/Dl9$%E$Jw0?Oe;v8TG[') _?"s96ݸKq::cRk.RuCE9b t0SmC~[]\j#!^M:Uk-Gi:V@`-]?X`ye:ﺋ_5W?E]s8'T 4B\Zu2~[S|| 7㦽piLdG>-ɗV(kU:J,S㯳)- "-1wu-}tpӛlv֏'DQNvl%-ZX%BJY7b2bĻ"p-Nw7cW`ݐ~0׽᛿E'.?*Ȉ}68(M[H---Q4өl6ȓ`Hpzo*Uj# !݅4):!OOJ[o艉 ejjnۀGIek WJνGpi@ CZ$tNF&5]@ F9G?DzT N [*u>SwRT aRkE AttdS ʺN2 BOg~[|S|w733Bj[/n)$.Kٻ} f̰8glĖm{^cJ#ضͻ6#,\ !Eൎ`”0v؜xc(~JWb"j-޸P"8ֲ0##Š&Ȕ R\ӥkP8?UxJS 9:U=Soc3EeްO)oaN/O87kB1()5L"DɌ<3e\.ҧ2*V>e)tPRC lI:Fet&2aɔ@ Zw9XZCF1]Y=]IzA"{>%e&֟Ǧ79r"-0c˼sτ W;X#p w_ޣ阘)˙֭zqݼt-ըO٥a<\&[Ù#D_P] S:UT# JoM Cg;2BE=Y7JS7AjP +FS5m%Jx4i⎿>@g5NK:]E)rQڋ_]AU 2.3D&W{NV#i#NjNw33I:Bf rLi/tSFi )J5Y+koD<9uNy7#`=b6~3dC(%2p7@(gx8tQ+ ?<йbjr_wʯ^w۶ћŭi.PCRb\9,-Vmeɇ9jX%yY5&HelVR^o:Ч+>1U9R;F-!ȳ\R5Lp0YQHol%Q;lҬT%|}ؾ}+ve {ԕ TYR"QRyg̲CTJTM=YV%tLԳmP+A8QAN7I:Y:&:S-*~VbKJUʇA  L=oTDJW2B>WW0VVae5F^Jgr\NJ;7p?Ks}~gY~~i:6o䓰V)baG&"A u5 ?>cX+}_X"2? ϡRq6mƍ)KK9,jCCJ?"Z19r_|DXΝ;Xcee] Y*P"!e0<AL&Og!LyO tYؼag[qAKUWD)uf#eLO IQM!JxTLW0j(U4h.2\O8: *Wtn:Q"Ǹ>U>n!pH!ݬqgy+g8TPQF@#t0˺Mw>[Ǟ=ƫŠO-|e?uF>[ )88)CcF#;᰺U,edVˤԝÙnk\=:'_?ѣGYYYild<Ӹ+ذaRś駟f9/@RJ.7n/Ρ3 F(E5B Xlu1֐8~t'/:Q !*2^pr0ICGfDCst zu1J*0SEU],Bf#?Gl7ҵPX6Wlqߔ(E+13XJ #`蠻=\}B&=#+/++ <{_W:'.@`:- ܯ!€Q(%vxLJU3ԀHh]k[3~A#2H`a4++ƕߚ-K*4"{Ys\5sDvWΏAKUgeظa=|0G}gڂ$J gBa%raoz;He`,[_q9;.~ᅬӮ<FFXk+L!j},JO#P!vir='_g 9>pGjƻ *0Г<\ʙ\`LMW?s~p;x9w);]-+E:4PdOGRVrtԅ(f! [DO/@i WVصkzՕ\{5{=6McL,KWv\wuɯ.DIB~HP:G˦,8F*S+-;9 w(dFEP))%Z!J:y4g#3q<ȡgd<Yfg+a}S"&o{ȷYzqJ}C< xP?,;ݬ:GS7v\DzYΙ ѭSRq>laa={fff~,\ 7of۶m:tRm.sssϦٺu+F &ZXX`֭LNNT QZd Y'Q}@ ? UA+L)2VU/x︐1?%QYQ VɊ4(TN۲!a>f('D5P3^r9J)y1ëjj-L"[g1NURc=c )=lFÊ-Y^:rH?΋k_Pڒ++jsJ-8K)XU@g$BGjҖ AekF=`XOf u㜲iw^=V)ȝ]e84%H"gfWLG{Y}S (>W>λRcjr %o l1$#ʓDs!ޞ ĉ7k%?~?!$[2~=x^"D1l?oݧk "5;p6S6t0p66oT9u%V:z=jm3LIUJ5~iNWk(1} *^-5Gj|1 m&NX6XS*kKM S߷X_K}[#.Ñ֢mBu6 cc*#_/|8v4Ն[};R|oz};}ɚ;s:o'}^ۿMqK};iFo};R|Nn'}N߷GO}{ o'7 )ny:]};v"߷`oAOs"߷~u:[V !Fok }߼E5r2QUHADH]2öTV\VP!ۆ 杖r'ʢ6,==70\jH9%~dkRyC )ێ!m-Et&X0H㣮u%Vڍ(r7§oDJQ3Onj7fV9W~[߷2 -Wɠ uX{.y>OXFG<}t J:#X5D ̆[UwYhUia/dYư(j0 Xt)bu -h |2-0BQMYhF v 0"HsNyh$PGG)pΘ>U}{y4Ծo\|ߞ<};/߷/<|v28}$]䦁 g N|Nnj7Z}ߌI#V[9~O<GkD|"߷W}߶mͫꟵ|!T|7IrP>Qeb˓2K-t 7\:qR"KЙ*pڏfwV`lg}P}dll<_h?GOþ>6׹'gnuq-j(W+gOipݶv`S0vD{ /fqc @_P/{ogYU݋>[U]3 4C〠 C@1mxѨA4" i#OŨD#F^`7C35 M5w:~s-!`_?~ùZ]*E[n( w|5urvKm@z4\q9>I|Y`)!uxauqtI>od~n( `DCoQ zN3~Ʌ.%:cFUg4£cpmJظb0Nn铏"()&D À%K}~x&0Qy }{,\NVm8JtD(dczn&ԃލ)o@7sC冿Aa Qxx.}F,?ҟ,1cćt N+>_⟁d\a|+fߣcGo BB@ C0=Y OAxEI{N^>9^N@3BN7< eܩodb~zC{⛯Y mʓõKE8yoC1i.?db$ p8g}F\M8y_x8?翌K=n=h<.ׯ?&Gj5j5TU,,,hZVVVm7Ȋ[ZR鞵2VXtԺkrB̜aXbX+T*Qʥ.J%J%twwT.PDwg68x>?5ZUY-F__8wߋAcԹA1??$I0?Jyժ LNNb2zy4 wJuTk n vck"3fA!PO^v"A Y.\MàJA30uCq n QCAK+KkVHS"\f3NڎuTF(vD wtA(t7Dww7:u7fvVߣjmӐ"=55Qb~~Zݧ0 Qubxx{,9W{[ͫ080z{{r* -ÒZ.twP.PY`||'F1=iAZ4:*J)%R"zS &4 :Ba6L{OER%F۝)uqNdgOB9Г ؄a&'b$ZOҼ+L%$RjBJ1I1D"NH%I4I1Xg3B> zBsщ=}(&/*D=XdaP@gW N@8N177'099 LOObjzs:'^W|婧oa4?ɿ~zqCo*,_1+aIUFF022ݻwcrrs+*A#֧! b!DџΒo'](hrb R4C,rz&J2Kf|%{!y"Ry9~sz( m|fv'H&y;4_즌sWA6b}}vsPzMK3& GH6d"N6jPRI@@!@ BJ%uJCgY{+W`Ū5(K:AGGRH:rۋQ޵fgFE'K?AIW¿:h_KJ =~޽{={1>ss ,"O:9BWWե (N\* @%Ƈt2@ZS$gPlXjz.G-v[!0!:%!(RhkQn6,Q/q(<%f -{=}#0dRB1Dkh@& XEq"I4ӫA ҥXz!",T}#xx;#Xoshܺ 'xj0}a;pww`td/$ATBOOJGgg',D__)bC jr2VT7 B)q$K4ob{PdSLAfЛվ@zn7hXR 5z X6 c%ٟ'6lR2a1rRJ0ɼJy7 =|Jz=x,SW!ʂ%1n"ⅇ5.ݍ-܍AV駟._D@d|77~oz%!|:[W@ww7Ţ>9-I'ݩ %=R 5~EZ<]rsc !8S"eo@8ObmOe&Y8.l"ϰ@Rυ1c wADD,“O>{&Fwaltr9n/3 ?p o !I$ok_^^6n܈#:+V@XD$il&%Sav!bp`Usꙕ6CLr ? I=T}#VZN>2ycNTH P/U'Hz|yl҄kmxlDY()0a% ˘vd:9N?2w\4Hf=f V+akARJabr ccc(Dxщ'<K[ߋ yYxGFwu 9O00XmWkǫ^u֮]r'⤊jԸfP7{Ct@P@\W鄦͛N9pKq7Qg҄ ov1?B(!mRȖ0Y&S\EτL㐷9m~dK}_\g,}O4$DHsrP]zF5"?T^y>6̓y6)/OnW$Mb06>#qa_ӌmo}z7 K?~JO?cٙyPD c]g+Gf^Zcbo@ 59 CdNoΓ؍n˅g/ʋ]HgZKfވyf8yɛZHaf+8@% W`mmvm{C .xn={:055$֖ϐސeR.%\.u4 !j0?$#Cn!Df|P@!ʌ@"]|ޤ@ e7gj,uH(3TvP Kl0%5 IDATPtwx)XBbI \08S S()@( ݽL._1Qڻ)IBek8)kZTt{K|YPǣ=7lŠFAW ^擟x^w8_4.}8E/B:B, uKPXY/qԞ✏yu 56aj?r oD>&O (sP$ eKRfeP C:XY|DHLĐJԃ$LA;tkYC1! g(u9~ Ũ $nBD$zYOV !L9 >Czd]`HB?(8ƛ7o} N*صkq埣h38~{?|=kɉiĩt xyaFT@ L׆0tt y>K< F\mX`o0~cXoppJxPz~] (ـ`΀$ ( ^'|Å{*FlȤcj~$=odʾyEF=J"EA qtX)AR)?8q15`^ @Hpֈ2ץ`R{`fz⸣Ow>_/FwOq٧{x'qch &&d "0BđI 2IKs8/.j&Y-$~ (ڡk`d(s; "8ѡ9-*zz,S=_ Hob@ ϔNZ(H* @Ln%#e@O !CHb aƐKRJST5, 'f:Ddzb` L@ aB{Di#I`"ubRarrj "X jy: H=]*0APaC.LNNcӦÎĎ'Bؾ};^ҍol4O*ow^7 c|ScL$( HeC CH5?TNfWZh+἗5f| "c{aP5C4~rΝ; jͽV tk!M5?Ia`BX^~DIˆD*DCI  Hu @3"AHGH^)% e԰>i)$n iIp )k3 RաRW-Ovx4@b~X|9J.w( D!4%ȢF:L1ZHb]ǟXr%@T–{zof4r ⎻#pk,>zXrLNOkrEzXdciЅJW{kD~'xŬ"W[2[~B-y`y 9t19ZN> ,9e4D@C0t˘D&Q,v"D :z r/ׇ)ɤ2F@T(@)ʥ.N܋4 ,P5P 095J)K^|2;4R5EC; D눫PIա^a2D]V&4&dZB,wlK'P2c`X,Bd3AXǯ ( I=SM!&աrbPB":FBP¦ Q kZָs߀BA l{z;C16>->&_L>`QE솄lSr])4+dI[6h,D{![OhF$tD2! Ccw_bLLLA\cU:JK+133^p v؁5k֠VkZ[ڿ3Xf%&puًeˆPoTӉq`hh &&pbjj x&'14g2j211N49 ,-[)tRG'(0??~Lc!ٽ07? (t3+PU z^@P@ubVF5@ Ih9bJŐI )硒 X*kZ FT[ZqGbnf **_P@'ފ J% B49<9= OLYo{7⤆V/;c!lڴm5||_.\.0119fm, ί--eh7g&e9frlNm8-59Y6ľ چh.W(u'J1zzzCKQO߿̌>AqRDze'1 D'R~4+1z DO  !c,_z+VAwnoo$IbJñb*Tk5ӱI`N! ™IdH ȩD B8AExOA@MbFA|*-$;:%B ?H;`,0+l[Ԭ A@P$PT5+P̐2Z5f 2` #0DQ4 䍀..43/G-)R33SÊU+Ӄzz\CX B1 h::5B)tvì}slX4\SK ]h/D{Gb D_WSKNo=uQ([;q"M f.)Z\~彙N)A0ra )yLY{iZM`uR_gq&JSFKi4H!S@I $IzRTߩCq te; 'ǔ6M9n@ M k@R+u53% Bg@#_mbA &! *4.ZRM@+xtCT*\!aR#wCT,ه!CUڄk'%:eL'aػwtnf8N=4q!#a~aPC 'PFh) H\E,4/93BcSזcPa }yI.ʲJ&n-R'zM_ ?`tt|@V&0I8z0G;[ܣDXSY=غ]v9a I0ijRsl_>9Kfs JIŲlAslBH2i P ϝB(%AԿ4m[nX  Qdc @XHR:eewg(n &`d^M! PSttFH5 9Hi:67;-P)Kr9k׵MפitKn,4Éܖl[IWmY U`[Ml00 NM H{PG/ʆ!yo(k?P:fF3Ei-Uh[290,s,'庖a,N$Boo/(i2غu+Dө<{&,&;mS_iEB2ML|D(훟̭CHr=#CG7YH.dP snt;ѷͅv1cNT>ɡjw'T֍TSY[Ih]4Z2/u5Ä'--ڪ6ba9!(YΡ Z 5תr9ỵJykOp^ANk'mJ>Ru0 kx~g%yu$"s!:Fk_f I {S-ڳ*FTB^GTB_pT.133;DQ1Z Z] bzEr],RHYƱrgMI-$M43 {`dM"]T335df՘ay!IZm]PARm"[vdttH<2Ri2|II^GԖVƞ?T<sODިT*^oD1va+055%(JNvrd~m,\۰nBdVP˒CnUɪ*!'R(ڍ_?ȈS XC܆`Uq2P]ql2H,Y NE{Y=Bփ5F(ئ9/AmP^WAf'@ݘmP}aXJ*gC{\%r4Њp0Lx, ANWEųJN4F\oa(<5 ˼j oIҤQz"u396CNPGEWVҕ2MEpбS}tB3lTa>hU>"͚r!Zhė)((Rm~d@.Dk+2$hyLn:욾;͊Xֻ5τa>C9eN%FzqTU$Ir(}Lh]`oK׷SOLۋ})%,s-nO2kn([A=O$58jCN*:l֘7^Yx(ESxD^.jϘe_є;ahYcBƉS·(N B𶙽ke5"Zk7?8I(0k4ztV{/&4Zkߌf,s!g(|ũGȸDgq0[a)'>:.DCbFH)'X@66͙0ydsԨ~6'6HJsHAXI< S05^7=X!5 gBPP `K"m&:<<34O0aX01mZ4Un(]Q V'|)Β>/tC9؏MxEvaSx)tJklVWN :#lg)yrdZu5j MsVPV&P:9&r%ZdPKYRNS߳Di[eOs̮~Y lEfOǦS[d6i˂/qL5H@y_cF`!sEPgbcf/)A0`)j( tTVf7UĠdM4Uf0,dS񬩿EYuO)-^]qҏCR&$r-Sָw?xWZdX%;VN(ϗ[ܶL Y2) ސ4CmNӣq$툷ڶٜf,[\"|#R巵+ۑ6T(v1R4 j =gQ0bvԊЃE5X?D2!=U +̈́B+ IDATGj4`nnY6_ДkϤpE« Óbl2^nҢ{ CYA ,&Sڑ:ͣu"mpk8@/K3!dԹsu't^@"XmbAXv?g_$C: εK (k1@p0t$ AN!CSҟBm]MS^?)f ̡N)0fI7pJ2G-v%48t}6D?τ*6aE,o_&/ȌO3K*M  ,]8~geYh(tv et\3۝%ra}_hJSS^5% B1bi"MSۗ=NY!,ƞg"AnaE7?%4$)r )jrE1+^Ӭ rtZɜ!^&YCu+r漴|mNE$zn&ے!,E{s2 I'F$Vy{o ᷶'-4M4D[ x'X6,`R֟%n+.,<~2^Y^(f23">1M͋|]x fR B+x#3Cna5SC4k yS S]16ೇ2-D"bR^{w VqM=;bCL ~dRZ0[фYhFcU>$&&,YNHB҄1Smcn#y3C(htQxH=A?gQMuI%rj06 ! awDhj&RsLr >H!9db㍅+T16Vt%{VNJ4KS!HlJN{˽\Ed``dZFeΆ*pAr!qh !9Cm'Q=2Cq/LTІgs f8es51KcLd^dVڐRez +|~@_1nOdJl4!OFNNC:*2;2m w=OYbs譛Q9$ <*:k 2R^'^x3["HVό1 :zs jd+f!<{F'3yr3\0JÿVx8rRnJz`T,H4ݺl2ge ^Jʕ ^?f[(7}DS"i*-8+)Ȥ0 3 F[5|t -)BN {JM"69Xk܆C+>W[=;ӌ NzUpd,8'8T,;2ZhUh@Fj:b l]&2("_;Pw~fYYf+6w‹o+e 96-)J%}Vjsp;^G`L;i%I\ UB/LY+JF ѐq+ؠ -ߐDZ"ڱcR8_pm")&M c663M+iw(:N./k @ $o4%r-D(ٍeCm@) Qz5kL*,lAr_$cCE+7~X0Qд|%YNC hJ UNCwý@1rtw^G.WnZ[=%Ee|,{3./j]і8aH†^8m?a!Ӆ#EDQ6aXDF'%c1x9v|67dn ],֥֪ۉj_Kyqj8+;g~nZ' 1orEC-r0.Ech)!@fJD(ˈݐ抛,Ҥ46*3#da #[Amp@S!lus6a wG ky~xDgr3[@k׮}[y^XD.Y "LMMa޽~Cfngj]=¶BGD-h]( ,sPTޛ/^g>`f`LNNbjjeusU J?ߖQ֭W_I~gy&vEX.|_ny9眃'xwu>{s)zFT<Gq>~qUW{-[{ ذa.\{׼Ih`Ν?3<Xb?||k_s=XDž^YwyOSx " | _֭[|s `||_җgϞ}b~3P֚2FD =leXr8Sf/ǝwމguV^M6qI'__g?;8<>[npᇣ\.N3T* 6oތxކq\tEсkׂzj ? ,8g?{ fggo===H`ڵ/} 8ՅO?8{/]j6l p}a˖-8묳jժ/xqu/K|/K4 Y&6mڄz;w1>>{VVZ~ V.wr)X~=6mڄ(|rq/͛qyKi>FqKi aeiQ~+*1*4;^Gy$[nFtMX~=n݊: }{1<N;Y_7ko~s݋uC8 'RĈx+_{wݍz+B|}x׻ޅqu|_ǿ" CJ% ===q7k^:?ƍ1::nQaWؽ{7>㵯}-6l؀j]V^ Q.Q*1* 077p뭷b``?yl۶ wO4|Iw=/=e^kCC=ְE0 }<ظqPΎ:(<|%\?1*ر{.8tA8q '`||wy':::w^LMM3e˖a˖-q 7ϑЬϣ8#h4p 7?=Pcdd$wuJ_x8 4Y.877NڥNoŗer!x188r]voGWW8 vmK޲>55qDQFZRRzMsn^%Kۿu]G} ؼy3`Ŋn/AKbVDdVϡ 3I4@ROmFlQ25yNZn x;pM7 .Gqo|#C[qn O<˝ЇcVOƮ]~袋pW_">Oaݻ̘>?ONNbbbk׮ڵkqwb``Gy$8vܾ};/gq&&&pOC,Y۶ms1>>u'? ~\xعs'>Ckz'Q(җ˗/ʕ+j*VX۷k_=7׊/A P( fΝ;[P LNNbxx8ÜWabbW^yg0~ O2&X+։ zȞku>էG?. oS|ɘ,R~FS(@/|O׷Tzvk}ͺ,>_O;/tf[C;1NLdBT鑈uEmuC 7s2)Bѵp@A9oNk}SRϺ-zr\+]lj}n snwXkiQF_kgaܭ}M+گSSKZV{-5n#H–j7ni+#/:V5z$mC6m?! r(H1`48FI @:b8c bN+ if4$ $^B8v77h_f;kk~! a&4r./9C- "~{7T`46>^/nٰ|ݦrm&_~;d6n 3z{{>޷vU}cε˾O0kbK>6CI%mAkB#h>/JiJ*S)QJPPRl %s|Zs>9ko*q7(YBp* =2*!&yjt*>r7: 8hE&O X{#D[D*,z~hxxJ/|nw"i6 v*:b~TXKņ6A4'*6_k]XfyeAG@Q-O9Qu\ޮ*K^%,U. VE`/^?(=:~hX2C[{g9JG9:둇RSNm0j,CA;Q9%3/!NqttQ]:bd0A iP;X׏"⢼ '4 ͺO]/U:Xp+,P6?r^fC.y< U2rjyW׋~t*_<0tӘQ=o i? B Iςs)<.!+wmrpBy,l߹)(%BXהRKg(꜐UuTp(~ CRhRe6D]責*+U$k)EҡX5閩zR'tafl|@d}:H̟ۯ.n}Oқh$|s#!-WsG!9(D8zgunIpUUbM?ϑq,`ix0.JwUr5&Ja6h&&d{c*S=~AE7?|l?ǵy&?B'S5M|ejDNy@$=:WG9m,=.N׸O'NKȩvt9o9 ^=_)V5kw]4Ba^T2Dgp/fEMsᩧl63X2\9}ի=~aF%F'ϓ題2/O<7i:)zd] X2XpWAh<;ƘD,A2Li8%>%cݵTqXJzY&S$M`/²s]ass>,oZTUd#l64OWfbhZȇi]vӧ|Qu;78l J |G%Oφ\NJ;95vx>J} VO;$Eѧ! K`28%1֌k^UZE- cǎg?q|;c糗NyNgJ:.Eʐ8l*NC{hիIu1- ' 3jQ/5?P3z :-^gr%8*ԱAbޗtͫu>JƮJ~_Gݴ [F{p@gRۊݔmOO<N8MӠ Yi8ri$VÙ]ס<!F/>NfNtp/>IϬky2%d;VctCuYXՠt&tDt ΐFuUR앃B֥s>2'I9{%|>B<bd ro.\?a|ӟO?o9lxgB^'N˹r (k],90?+WӧOɓXVx饗|nZ=+L&8yd%w].u IDAT fʴCٔ64Bk5NrM:j4|Ӎ̑BۗzLlBכ%#ݪZXm\n =+%#QƳ >uH \׊A(=re׾7 qM7+_ A3aXMcǎ}/×|MӀp]wᥗ^ٳgʑ#G`ss3ψ| _39}?f֗ԧ>/~x` _kx'!>}wLX| 8{,//`VrȈ#{B: D0(Xb$Ay XLsj:(Q$"4ԑ _v:r |jr&OS&>e|@>['$%Y{\WvccO<>_.]n x'3*"=ooo7|3s=̙3򗿜ӲIUgRГ$ #DO_5='Od1MqԩS[qiuk=xi=ٳgq tÍ׽.Teڶ{dߥdX>5?d o2R&&P:עs B5|= ;BaJp"Bes=3g`:?sz\/hi@UUh&.ַ /Y}6!,KrzsΡi8۬k-%wy'Ν;~.\Çs"Z4Mn r / kFIdѮ]C)Yt} LL%Kz} JYf%Nw HM/.KjޠFeC3eO/?ߌ7fS3PpWZ6 EKm|ŋÓO>g~&+\t ?/⡇§>)\pa>Hwesa:-w W:)QJ𰄼K(_ ciH\G{^Ҡz4D/):vOsQgS a٦ת |9/ \xu'x"{u}yw!\zLҶ-\𹳯_1r5j^(r~@`cя~w§?i<8zh? k?ıc/9wUU 09VA-=^^)(8pRh9lIi4 nOGTGT? k>@uzLNE>!٨|W3x?l4#<ƅ?'Nuڹmkk =1I:Lpbs烦{2Z*sBފn '˿Q;Au]|+8s ;(5@qf(!m2 E3#J#C=/{S >H6sm66rȔRn6Wdip)e,$טeu]}\-`()lzQ?) ޓws|[B]xߜй!kpwOd/˅d:rz+N:b[n/BN8;\ 2&FRiaoo*ڶ#Ūp!| _6w`gggTPL>h/=/fI!*y1PצstUseкfȦi-W @l̲,v {-:ZUl>V+iʔcZG~7 tHl&7GŻ.vm7O~_:u Gţ>~87Ϟ= wvvvж-nyg?o|Nh/^׏0WU|u]k-Ξ=#G;nX,pw}Fګ\(ӧuo 3ƠkKC^zHϕz4C25$9hK)p{NzȤ]LNi-x-Z%@9VCw@Y|\6,\s X2u{4yϽYx>n\xu>{7x#VU|H>?s?7^kjk,u]ߏM, x\.q|&vev{ƭ72He0ggj5J t4\L!1/g;Ppn$\7 (f1ց=z\&5R|ZHhX&zbѴ.OM{ f~soFsqmij&k۶8|0?+W.>`\b:oߎ3鳺n zۀy˜jObWo1??d溭V+ass?3?Aӵh &2TAds#FrR@ @U d(ҳj/@iIö:H uDg(,j_SJ o4zyhd#Xd1g!HFqڠ\TA£3e\`K. Fi9ꔼϓ[,hfD(DǺ9]@N?awwwQ5AtS2" t賵64%B;D$45k*pPOރ>["zFE)N`Mr˫aԁ9fil3F4ri SJ~u]#8_4BBr1dO= 4̱e$QtxRK97bEH*Dڱ.#QPm%Ηf4 娻DdJɡ 눬jJjA G21ql6cA ^"4 iBx*6~ +Hgv?ij\iAN{RkR{%՗=^yX痨RDFT=/rhM_ZAGIt4#QiF,'8f4J 6gm?;PZU{#/Arm܀BK8;Er#pQ{tM;F9!Sk-Z Bn)MCTu$8q,H`\# 0HRP8ppiO2%6$,eI)GsJ#g-lPUFxB]' #Y &|!z4<$Z{%k?1}#!yWv4SFIY/ juNԄ:-G5O; ϑFFPFK}ﻔΖR\EOAːSNYLfO DžpWCL/sÑF"2e9X 3&zLYs\,z&m䑤}qDmWH( ("@%uu?EíI;Bk(x0j_JԪO)s=.Dߙ.k)^%u)r+[Ag:3԰ qx"xBzfC#,%q7yxuZi%UualZ)AIFVgt3Z^. GI:i.i8khY7U S4\vUHbI0(9=#:LrÇ𝧟KQ$eaf B`M /q_Y1h!8 8-TumZRNyFL PːUXelZst6Xm$& x9b6hG(4K^F(%uw鎴FJ3H FѮkSZ!ؒF:>- ;oAaЅ:Y;P(qSiZKJ쒨v !n}$U ` h YZIFe)4Hcȍm|~ TF FK]L7(%ҳK]-s{.}:PZ>I5c됳lJ^J%j)umrJ#VX? 9Qr#TX[)\\JE<hiu[LidDhS!t $stB%vkm0>tmnXKʈNQ }h(q₥4qFk*`5CZ9@&`:'z5pǘ*)oFسhf>, ]KFR>B bمx5ynN@KK :fçQײ'7):s&EjUڗ#k/ ۮsp%GPBrV%] t4Te:M@D c-a:9Z$iRtkeaSI4Nva Md&=2*ygfPs>T0)HJlRήc)/XZSzz=Z#\wnt/)vfKLu>ՙd$_*lZ0>c%QtOsZm&ZCj'_`X̕X*Jr !h@})d`HM^cϑ z#='Б8t8x˛qC񨳄DY% 1㔪xAl|wY@.!-9okԘg <7mow! t>|n`k[̪ `N&kZEl2:q=<7@zA?N0L +l סt]l6-ry1;PL_qq\wuxpQ\ Y7Z,D,4.QV΅AN!8`DjDpiF~L :prStd.ƺᓢ#*A#%kNGLv2QiDnnLtնJI8TX`6Ԥ?~/9iP*sMء? N= w8<,|P̗[Ma3(mmA^P{=H/ &)Y['gԩ/pN]tn4OAn h8Up# B2V{ip5)Şր 05.A=.a*_A^i*D@d.P+G,6"> D>| (|%ì%F!^*}:t@:[[]=66fpƠ{jf|wqPYG}}gkx kt{мŌߊ_~M`>cX`Z 8 ʤUdхXO4zzX皌:x`B.r5{ʠTYT`ZaP7zr)K7'VAGG=Dz@Cel^)MUpߣQl; oʢ;;;XctJhI ;Q*IDATuuC+Q uMӥVUR C N%m^go$1 Cf;v6 j-K#Id>bkܿ2b :t2 Km1+stfT5Mu'c{3"] DzGv)2L&py#Eݤn?7Hͪ4K6B@6GII+(e5>4E k'\4\t8ylw}<ҤIbo#ejfk}c i8X!V_8TO1@Ba,5C.F0GT).>?7*#4wY ƋC3NuNW~cЉх-2)"LmWϞh^x;x|Ѐ8ڏR0kf>0sn@JV;Nu;cr.A X..,;-PV La q 5A pʦjM"R1qi3F!h]IۊgW0䆠DpFpc0^׍ECaWbsTpt:r&#jl#R?,)?h¤RɉcQ9[=~%ÍQFł)ɶOw!V|IPFt}_tulPL㈲t(!j[ {NzXkT ]Ybtuӹ3OhO,en`9 Aմl9"T7C,K] m,G `~S.9{qKR| Tͭ9MzmG=g\Ae 7ѰS2&OfI),qSd d 0J^YZvb0(61 ĒroQQHu3k[V OoɰK|)77p-E@V`ψ,,cRR?lX`(ϰ"ҚQ>BlpҒĨ@A*hHF!*#b*5蒦) \yLm[Ee´l($6 1mC&C9u5\S!DPqƚ%*&Oh֡ȶH7u~0NZ||L:?0a45 HbaA!;Hm"Wh"Q2K<:kJ" g4-_Ui4 POIy !Ri\Q0imbȃ-X,{IN* TH6T` vX3R?qޣJeb,#X53CqvQ7_k5~c:Ɔ/y"YL "!#H9:"*>b0cHQ&qRtaD5a1*gkQFh@(5LFwZ;"?>Ghc,ل_BWBӼk>aj+P #c2 h1%跪*4]}Ӝ ?R"Srؠ}ҋ#nkml#bAn]lll 7mڶm0{ӧOo0o3+qT 9pJDDiPvzcSke `LYbMZRjG@3ԂMN[*?֢9uLN>f2vpQ-CHgJjK6& Y瑐obsmBrh?rԏZT`ؐrzO΁qA\ҳH!km*gr+)LHÐ*}i p2{w\|d$  i$q(jձ=/X%Pe2m!9z'hFd\cf|A}bjR;t^d,N`ʻYCMb{t.d/.*81W*z_ .G!,`RI{clzZ_ld"%#873"ֶ-ꉅu5!̭Vz qDB\'zV`}~y T aPKIe%F|mt&p/E CQ/rD5 42{P& 9 Hjy~z&0|,PF &s}vHJ9>=t +tQe3__`CTrqޟ|臔Taw a݌jtt|E*}.AfD*@G&#\[1!Byg)apGcԲߓx-.5uAҳ\uC"[u`c!샃ol^K]ޅ=&*:"T5&ԋJZ_@ѳ657{lU崄5|PM,i4<Hr# GlB\l! Hl[w=4)[&T@hQgz*nT5I;@@()|kbiFlt1E0@?~EѹI@[S!$)mvX*섴/p "٬:t]R+eF@޵?չrZ @U4%`=Zנ89,o^`-j~@6'ZӅH wF/? ;;;ؚ4-&s?f6͹U;ӭ1'GZCQY,1NV49y7PLc1ϵ 1yeLS$1nڅ6IiƈP}2"+dlXQ116yg#WJrz+k0+ E鄘ZOR}A6rlMi欂=Ye|ܾGdah/u \f p[@?|FZ*MX&)R5OqۀBx?BKf&FuDVmD<66x{ߍO7϶uC<o>n ?=T3\s5pX7Ξnćo~ॗ_D?W?'2SYsGyDؽd:\ZrK֠25<~5PM? 9i>-8~86 9po^ $L?NK{"7`<@3ńxV0LvNgfM#G)<`K|#~#O>N|oon^T't?}Bۺ@-ܧ6K"zw.^??לć?a*ͬn -*Mly?Zo!ǫGZVIFJs9?fҸ?<#k:ϫyj4yOv;ljϸf=hڌ^ocؐQ oZ;(=ϥZ6e`pҲ&Rl*g[ =RėlW~?ϱcСCtu??fAC<Lx\ U(*tY (6u&õSZ`Be1G%8E5ϝ|VlHeQD 2*s2 L(UT|bhW6+RF$"lKu1S@ <:j4y)7?\ϓ+y~~{gx~y^~繺C'IENDB`./examples/ubuntu-ui-toolkit-gallery/demo_image.jpg0000644000015600001650000030701512700370701022563 0ustar jenkinsjenkinsJFIFHH XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC   C @ !1A"Qaq2#BRb$3 &4Cr 3!1AQ"aq2B#R ?T]مfdjT]}PټO?4{:\m|i CC[\]-|nkR*ʫ0TH(<.plSu~msNiM)\[P(BTd]D AI=yI8<G"*YEŷHTVޥ6<+L0DHF$o ˺,ߦ 5,3TJ5h&+6 4 ZҒHܧ~ms5sw'5Z5YY lNgF:qZك,2Wz_Uequ3:VEJ4 `#X#O udE|t=yr܆XѯcmsTԥdƚTd R:v)$~'NSG>]{uu/N)- 6AlbZAb1ꤿ2A)7z.-ez-bAzVڂI.TkVzOEK:vr[ln550~r[Ο=]J3Lբln ywe۶౎x8psFA:>,r,(Vΰ"P)DUGܯ GޏԚo䤊7"ˮrK:ZC301YUQֿ<)ieᩩvm<NXvta&u%:BT UM#Mo+z68/O]<:c:wm^ڛjY!J!`2`(DSrF-YU4MU  o3I3iĮ˯z+;fig=~^۵G+ gD;;pilKTNuj˲fR|r)(bA@F'(ioG>s^l.W5ie*%&P L$J'.V@/![BO 8}$21ݨTD6sG|EiQӽ+}W4i\WB0ԵH @(oq3ym}+E[\K7.-z$] A Ҋ{f\MگݖWيvhlOKXڌ1wߟ5$+'P|L$;J5 R j5YHNG"SYSV9E<9+O_w`nj)e,B}$R|OL(a mIrqZtr$UHُW%B *GFyWfi|#HǗ{I6:]r7V@rJ+r[l<0gĕN]s(GV.5j*S#;qLұ[ <lVs+] jC #7籹1F4Ab8Xba6 @a*5GƆPT > \gX1d&6I3nƛ؃s\$ꋝ Y ЂFpjzސYA*tr#smC]Tu,GoٓʔӺj+|Qƨ-4cEZ72~1=ynur XoqR9y27޿ %wL~$`䜿mp}~pֵb\>57f׬2G*bJ_t֋#91J7C'٩4x'H~ϕ =oՎ$WLυ:$jӿ?}KayC֯عV-rv;|ӡZV\+2X^~':&H|<[[;jP BU%V-i|FÄ>ޓiWUa۾)ZVW7q QI3nCRTlJ'z%C)i$`\ *qFǨ^N4Ъ^)/l[s@'sw9f8`JRiUҨ6b.T-J+v\[ȤP+dzIvw:C$n{|ˉ3-v{eJVIr2ʲ4nH2`NP$.d9F:>drQ|]L?KW{zT[ E!A#̹g^X9)3fJ?UX]&"T I vN=Zb!'hNQyNwBMWfNmTRr7IR;u:V:4kTZtRire$ ;|ˌcr|Q7̖(c|/\kSN"Lx)XFr5gO;![FgVE4EHH WS6 1*`Ǡj^vs\QiQsgRֵ\ފU-UٕQT#J@;82qﳟ,T2NzQdF :/+%D,w1+.;_NCZo]uM1BK)uy!B@&q+U9YӴQ? %nҭUVVN%Tv nRm5:?Ϧj_:2gkzSp*Q`NUT1,L9?id^:'ǖލ_C8t]IЙ|-_*RVAZi%i+*1\~Wgɏ:ٰFiɃcyaayyyG(k[_ 0]2Hװ};'rx3 ;g\snwf7;u9&0NT:DOWhd%/[tV[vy)ue5HR}Gaq㌾:~Tuq=ȳ'lX4)biƕurQ S7bIz64UHdynI])#Q*^(zzI; N jlmO-8>/Fi@C, ?\5E 6q:aхtdy]hl#mƜxlϟ,] 5SR lvm ͜$V6*CsqF|ʚ*;mƬiRch )%X3̚j2T,4{_iro<3Mih̞|q)ʔd`i$޸>mdrX:)//KAMT2MlUu+}1oM$'+v?uBz`Dd{ik W̚O3T'XI,|U:77'IR%+]ݡ&("  b܍R|ÈlL08G,AG ;A'$ .#/L.t1BFдjSd4i.Ron ) OLHqߣ>{iV e P;WM\"Ǩ& }G; TښIm\22ٛ$PJ3b4N۫Bio Q0cqOGd#R2S,I}q[xnMiHe-pzH9Lz‹ʐˬ=@_&|ᦚ/~QZt E 備8_S̓%adI.NQK;U3xv yIO;c hG[\tka=cJ +jUxܱܒ8SISm$;GeW. sFSOmݪc|0?%[=Q.Ⱥ5z|)hn3LQh Ke /AI*#ɸ3vY卽;4^BlhbRX|v:k~MJ6ܻ;^KҾwI+ۭ:1MEBU]'ӆ{ÛMEkoI${`Vwo89[њPsi{[t JfNqZ O?g-ej]4r:eOQv%*pIHcw>_gg:.j[/-khT e1O,{2Td޼weo{J[u򛒉Z ߕ?ßÏ*=UL=ouA[6.)>zbv.o ~WRCxl2T?Ӣٮq)kSY)P(mʐ7g$9tct.ی>K*IqFԫB iq21~/uZEK)嵿2[f "*N|x1{;:R{H>#f6Lz_sZ$Au 'mǣvEU>K6yutz\(Uw he!>4OF9˓Jtw,oI ֥:ZjcM;c"{`;.랢 A֔jV" s9t*v|QJIAz?L :O1k^3w:0ȳkR1/P^CPyD҈6rq^4Sżcz]zWi%{e#da̙ߜG6NI][?z)ZMZ4;jQx ɋiOߣ"tR5\΍CV\MTK.4 WoxG̔V ٻ<|f-oQuFoJ*xMe|=*&O H 57~x5cZc޺Y[uWWtVgwm^ڛ@"M6 F?zM,v,Z-J裠҈UIV#0Ri~AmY+[C1$x#G˜:/ї"rt;vqNʝ&[oQKSur ǿ3yRrK@J,.ɲ6y% ] obx8a"!cgkUhקE*:Iě|Z;۪֭ՠYUNḑ ǸFG:r<(% I;}1֧VQհ哔tX,ATqm{5Kr˱ O0/:Vj- F6Y X-q}0WPN|K7/*3V2#x?f %*ː P`B6+݋= K9'_ȧv )X?\Ipi0vduciա7 Sr@-ßnqT> Aa@>p\v%G_aFTo0vgȵ)ۑ596fwOqqtsԬfT0tƈF>_"Y_@1fD?n0j2~u| ՔIq= S+Lꃰ)S1dJ*hԂ:04b`#ñʄdj{~ne&+tH-qabߡjO)+*S1xҜk ) O$[RZw⣓V2x(aKI552 ?r0IG4 `XH~¦F >4oͩ,P@`aR}*76Z-ǯI9'|T'|񴻰4ƝL+v0?BZamH+ DNrNHڢ!ZAfrjVm1Τ6`HFU&9E*eMcuJ1u?7_8|ԣJ1k7^OH'8<핆<`a4R  rHpY2-Ќx?jMuF퀖Mh mT|vzцs*4-6{c4跖xih֭"71{9R<ͯ*` xCHA)s> :lU7E^3-T+QFGߞ# SI rkiu\ζTzip)"ǗHvҦ"7nswoeS&i1H#s>\|:|uŝ>[SEFH3\ +ZfxG3>^o٨Fޥ#UU\YB'ʳ$F3G4 xc QZ~'I~'kPmjIP*;H QH F wU$Iü첞[ӤU!P?cQT,ܕ{#ف4SNOYR7;c8v(+󮛦6 hZuS Dy0G}<~g%B臣jJT ؍^cY>}}7p? 3uKNҪPMݻlU 4wc临y2g\'2slD\ i*tqsTssl ]ֶ5nrQB*9?#P?1~Կ6_t/u-CAMG$: "AϴlTw|ω 2ȳWi\Զ>54؝D#J$IN4T_ԛì,&q;RiTҪi`Ycm| 9tv1(~?~$UtŮ[`ӠPPDǘĒOs;|@iU9k$AGHf>uAvXљI[褣gWhjRqP(mb6MtN);*?zs6ee^)\@Կcڡ.joL~$?QJ5;Ďgygd$~4~<l>:RW"vBЇ`ЮYbA$STb4k~v֓uZlj\2]m I;&q| JWTfBb<E'0>kJG?,'^>˕Ϙ PA^0Jp۷ffբ26ũjیbZjP "YtqbOR$qxR02Ǖ.M))BTgi -H`-vnxbmӶ4ęi;Z?%*kH=Fvۏ Otexx7խcm@mSE}J@Iq0Ŗ'uK/N]DHsհ'BIKS$ 'mVus V*R 7R3R!Cv'-!Қנ $ٖJ@~qy |t_EI40o3ammQp>^'&"q|S56g:#a˯ydm7<]Ay-r䂭iؕJc' v}t`|.Mbda@v@8ByRz:Ӽkqp멑ĝLvq^LV̞z< mRA+y$qiKnz&(ZJOĦeAL0F+$@8SI6hkqgwL2ʯSB*Q O$&K&N:~,˥z5Tq]<6 uA$5'"DDznr24ޚ pWA^p?yYmJW<|qRiڢT6׉VUj7  ckR\ދq^6vAZH=f874K?nKGhW,n֩soRbCI8!UT#@$p=R\ZqKMQԕ-9l4զ@YmPv~_dI3@xp[.,PPRJmJ+A7ozcW*š i5|MjO8G-W\ͺs<ޣ% g:aF{oRK%>MLElQJRԃJLs]b87 Jz:[?QԴjuS=-|2KRve.:%3xl%P*+0mԑ@N]77)6gH%dVokҴ[[er)}!:X(ƔJJ_Sީ3[&-OEFTebQĩpN鿃:ΜytmSJԱ^ gB}Lռ$HfՋ主ο.*|EzK1ϦUz"ZiӪU*Ux.[Wҗ`gů5Quo7"o 1y&'p#ӎ?Etd[!>\ .Xu 8+ cqW;=m MMk'LRVm$y@gC\Zu ߧ򋚙+vDCB?߆?-_T~mfN֝:RbzqߖU/}~Uֿ`,!&vW0y,^~-Pw%cqƴ:=JօHR$~n<m ա {|`e+V 'LJ+۶&I >4 ?}rwf\FԗPXP qEN g%WV|l#.Q5=Fyaֿ@j&"`zL'~ $ юRE㏟ZNjr C~ܐV[O8zdz"`TYt.xW:L?ˆ(}0QnuГ)j$KT\H{hdշam $_4`jF-TNκhF0XB$Oo|5:V2uJT a++P;H]K]=`5(~eƟ} 0nGYM Iff&5v,QObafDș<\gZ Gњ6@%Wm{kgq$8ѫrDԥvtAngqZ`RNҊkeV./ƠA' 5q?iNa1406D<^~Nӿ}I{y5k|EMrM?ml 2,.^XTIpa!v>Ĝs~Yv|C:o02ڄ=Gf>">"nLI`x7xSgtܧ4s^U,YG3~X91;wVF@]K٢ҡ54Hml>xx&S#j[S ⅹjP6< o}Qo!oТpA[jd0D񍸢;GH2RiJj?8) m-x4G 6w~,\6Wjk5@AX,dIϊ"SOo֟o`tص%,!>t$\u1xSkjtA}p@uEҹ_r 7lq S+i=s7:iҴ2m E4Uĝr mر'Me=$Ow.DKg{!D^*"MKOH擱mЙJN5ПOEsY0Kz5XԤ;wXT-$A^Ζ$'8L?զQs|멫5Jw4;Q^p4 |O(q+%­~ 2R 5Ibw&vi>.G,Kz[ KT Nc+2|]#B;QcT,lZ <%C8V\Ə*]B7}o131rKm q,f&Nc~u);ƔVw6ԍWFRL($L{%)GgJ UK"91KtS-4$f~[ZۊՉ"O Y>I2N;aђ#4U3S:AHOtE&'TqR/:` @$qeBJ[b2ǐ03W)*n*9cebrRl )3xƄD3֥QТf}1 ]WTU\*¨ }SBVIIPU$q; k #Q~ {qJVg4EAzȔwrZ꣱PLHͪC @ O”Q1(UU j*vSiU)7&ieolhT،x教tb]8dfJPmsc\Jع)rq0AR 8e%EZ5ʍD N9۶Z'% P,vߜY˔& =39[tٱE%  1>C|UZFK*3 05amܓ'1u~XBXUy pm&>))7itY=ss](kH#'i 5 Î9y5izӄ[-^NwjrJ}JnC>A36ʰW4aŝj2ֿz+&X4ڿG#nh>*ZEi~$S;T2 0=(k_o<}3:ҭDm/MbHbo,si=vɟ(%hҹ4Ҫ@#C%eJ;%KJZ#ydK~m} V %m?F5&evζ} PF5΂yc:0FYxSs/7qMA`@#c|O' g^Hc[?oԸmEZ=5cMuHMq26a8&xY|wŭzQzw[g9M |PM'rZDHv˚Y_O> ta[o;$w q<Ǚ.݌⾪/daZ([@U`N|sF\cK=\:.Z] "$2q};@>%}wqV5( ^06Q3lte|k zU4ꬺå~5ҬZx 6@uf:sW8I^VUjV]!Iv,=O{6䊒j:KjЂBxU >6/d{3EҔm,LaOر~s}ΛJjJU֦g6e5p~A$#>I>|^!׽3ҭmu[.9 T3|iR:i#2d忂/g4Jyy9t}K;Q4T!6 kCucÎQmɹMRLL|t!fl]?t7Iҷ VL `7ٟ$;fYul.5jb`%b(kaQ_an#WT&} T&3tXO5 c~d~tW]S\ȉWȏ9V~w`p_r"H@ oa T^'-hѩj;J "RD^0nIHJm+ѪR"pK2 T@%b~2ļ7R -zn5j{xavtcMw&g+Uo@9I7B%hlMm :2fw Z%$,b@'M僋c]Jf< ;ayۊLĐ[qًɏ*/b;'G++^S$I<>}\PKM@!RY~xSߠZ[Iq޻aH<؛ЉPPO.Ш㒴. 8 Ϻ1BFmR{DYF7ZMQHD{IՎ 95/f q&? u'OXs}T 1'f"g1pf baT萩,@^-k^7\LsHҪ@TQ;T8 j];v d.l2Bi'o|@bRGDǧ8)dԩ%JvES+ƒWE:@*>XGjk >]zdmJx=QsOfJZ43>~bK%p`$K}$FI{5dTRqDlg"X?$N#+2ĔmlJA7_ASճ `SAB@f+؂QfV$8ۿ| 
    y[mf{ dukjObccD}aԨ?|%`A+$=73ml(ŻﳦtP[uw{'2EE† D/taF|3J2K]՟.J7CuW.zƥZItR+1QOC%3$k*n(>Tz[.5*H$yǩbrצy)XfUK"ʒʭjMM1ZbC#D0$$3d<2 <4˘ԩV *G$Fѿ֎FE~èdƵ[;AV?݀H|0f7COs|1)̵ HD$HٍBR'j4E;!['7>ȥI7H4gM^0N|f ,wǿgFfW_=?5jV٭el fc rۑ9q)5fȹ;qz9k̯/+ R>S(P mcҫ 9>ï߈:+PMV 8Ig^<=|;F뤪g7mhR.VA ,{,Z zmP:AvVF`{R}ԕU͍\!^[ZI(clu>t~t>$ur42=P$ɝ:{s_lon3gYwPOobX[S Ӑv=BMC?3zD_ O N6l)8e_]ENjiAbNÒ@#nI#U3o`hZ QdL tđb*J:^KܸUQ)\Pj)xHRֵ!)WpxW $sWNa\fV׶Wv~5JtjejYiQaF\mîB7Wju>@cM^=|Jң_#I9'k.E5J0hb^!yc}ZW P$Ș#evt[HӉi=4[=LG]kS4VA}A! N 4i?={Ѕ vW휬xj>z  Sn01M -$GA71}U@`A[ @(]ȃ%0M;t D`Ds!xZZT[Rsv*KyLs1냔z^.i3mе N;q2dv]SI'hC#3roJh@NV; zj)j~\vrZIE˴bFm8^@QGU4Ȓʵ6<܂{S*iInַ4dvHD*62Y}/UV^ŧU4c̘2z(r\V2Oq=&ѢX'Y'Ż:+mVjJ,"BG9p\miV[}?y Jxά`<A#N)̍8-E.L*YTTUP-͢hŪi *BKNI)Iǡkρ}k7Jd8MN:ЄR@$s{&V:gF\fAG)C+!:C8D [x{c:F<]ϟll, u㼨5adbațFvwE̷1[Ugc@3dG.:X}3 gTW-U]pɡh^CZ0Qu)k.MHZ־z,X(K!B OQ켓rI{ٚM.߿"JORrT*QӦW(Ku0yHfܭt*q\y4~u_wyV^&uN>riDG%? ijVj jwKգ5LfA buY̰. AwwauBJ73D 7>)WF}?ww}@iUp w{q+]#z:X9SUV+ ;w}M JoYwWrkj-XSbGA:xDp1J QĞ=K\gKqV ʽDZ x2 \[<̤u3j*%Bss;c%{3mK翈= ٍk-DvQCLwzfu&3EwgpW.$ir'cǦXjV[V ,qǎvWIZ ~R\iTfl4V`.jd0ؐ=);i)½L;YvB wj(.IPA!L7BvZW7ӢU*и<Դ"63`e?aSè'q#p;ؖI"Jε+Z5)CFؙͻy[k=U #Ib*uSzv#g$@<c6lR(FTʪ$ۼ\cf(G{MZX[a)Uvه8:_{1hEz(0 vl$p}0.h8–Taxʬȭ zK*}+TW]WӨh'zmq@Qqzk΀oL`v9`1nUU RٶpMli @IR UB@3}`Jо⚨b ƨ$1ig!In1lRQzUIcL&G'7Vr1Є6EW 5xoYlkg:Pi88h; K*vBI<3[^)[* &N$r{cD% a"[2-lbN/"Yo#L鰹Cً?qGMrx[lPlF̯:vKM&>[#SeJN e}j1퀄5d]t6 H٢#|؜X]lʦwtqѱMXzf ظqO*#{6ijUjga3R4KaP[R=xG4e%,i+kBT3FC*O;}0|\q5h-+0'$rqJ*lI;U 80?b7ֶt*]\ZtQeaBseC)(/} )ln0.[`HN0GcɺC3~F?Ц[e6ܭj(t#{|e_K'',C,K$B?/R = "$qkiDQD$YժHO@sM9G'2+ԢS|-LڥůR@b[dx4TAG 7NWȇvoOF*9sjZ5WqNT5)6KiSOEJ/o0|;[6 cNꐩZJɦTpUvZuFX:1`M>UՈ̊:sڟmg֤SdWjBAu,1>͞9)fEk UUM ;}Ó[7|鼲׭nS< yA)&ݫ1tUO7q;O1&Rj|m5c9eW)\ѹhDUe @6BGGI\V~ZήR ȀFFߩ)%F 7'4P %)E@!VHƸri?Ό: +NfPj  1iŒ=6[g;οs卥&Z5*bP S'[2u6?WfL>|IʳjOpMm>aƙǎ~3ɑEtw0ƿGFe O.KjtVW PT _"}3Nl宬_3RjU(e"8QQ3zF=E]L_\?_VgkV/P;$"L'mayenN+ힳK37][EEkRfStRI!*_8,ZKyIZ?0ycWjE:cTHEբOc[DDGng1ν }6YLx٥S*I} mɟ${}.ut+Y_fZ2 DNyWA#OdwXfֵRt"ՙ4&u +,O? s.4ELҝR** ppxiݜV]BC;-<Q4.UҘ,Rw;JYҺ1)'n⛧f$kU=kE- [$s~KT?1tFS< a٪xtþԵTXw|w.yo^q:uSg#uv1(NNx%u~OAjlL,kFhLA:ב4'يG,2J00Oedi4|2rHV oo3 V'OҐK ՛aKHbhEֆ\GbcJ:]dnszB2EcJACLv19vsTo*RH}\j R.5#C+H'Ƭ9@5 c#鍑̚rrxc0%K'm+"NR_P( @،E={%9+ JWuLC0q<L& 4 r?/^%._7+/ O0juOu:f*I$j T>q#I،Tz"}_gwS'F6,%z[eM޺(;75\%j :a$q#RrqPPyE_R`(Pc+=c0yӋj.322n]=m2ڵD)ǣ<-G'$$ei#(1ZfKr]beǖLֹ֛#LF;ۍ\:d4gMtSe6y](FF^i!vQsgϚiSZzu.,6Z*5B@ULuH-'/_ZWo>Vji:EJj)RU~f/HZq33KKlގRVJz:SS$LPS 7Em>Z-ye=zZM4 Hۏ>r{2gGXԴw!jPj7>+RԥY%H'_O9|~l ZYuVY{̾Se{P[R6]?T1eX'O(F\-\~ӟߧ̷OIi;~cCIN7dBec+ȳ,ًD)N88'B2IS~w/ez(ѹEj˭PvPeGVtt)\=JCƑ+1ˁc#Zf9zAv oY%5_U _]KgYYu{{gYMDR *I^ ? xK_p8+W-mnT H@~7Nj͂qqzLO賺s27 M]֫QA`$Oxl5xOa )57U[zVjtNK:7;r=arnQ}3{l_^ vʰti" 7 )hs9W,#fYufiVJ*]Ju)> T]'td*`gF?ɉsIz<*̲K74RC̸ʆ`V"--QZ]fw<`m+k,^¦M :^>W(ś rIZt>Z)W†ZSӝGmYjb['{$:vW\ZVViv¡ 5+|oL"v^y7 qNj=_:K8\Z[]T9kMlOE%:H\{MRkcӦ:4BVI,SHL25ǣLRi&Z^O QL@Ɗk2.,ëZ$fpRB5P|BҡbdzH_-5Ӯ>N <(w[E(SJ׈ۈ+܎'|HSVd`՞9͏\tX߈]-uC1߹ry#M.|R_TWEtMdl!Mt7U5O`Os%p+HLSr %wo7V7Se32˞>8Af?CrHYb71wLhS }drz bnjSC$8:@RcE`;=ppmq ar;N*,nVF.2]5B)mlKs>1dܬ"g#Bg^*=:F2`|9dihR&)0ۓ$s8v[ĕF<$|Νu{Ziw 0ST \K(xã'iuq&wӍ1rSpRs' ~<_q:tCTԱ4WϮzO*GKnJۀ9cr3cM_gGι:_܇`ɜTzQ:ſ|/I:}T~qsr+Dq^GԲ=5ab j5Gb5 Oഎ|)2>\jhP%VFp'8~Z˩7MZGGiI8? RQT$,-ANSy1)r|9%*oUgvw7kת[Q-$9?rډtQ~kd\M}w9';m\BV1ےd~`s)) _E6$6=Mq@թBj`ͫN?ʛ?cqWWFU^]%#ypvH7>9?jBI{ʔ^V HI\ c5~΍Q`>b\7^Ԭi G?{]v(Gl*L.Q4 N*Q)9܌*Svb)>nj22, zoHxF6bsB5M~O%)"W W ^( ϴWNݙ%O=ZAar@A$qR؟#L f/He`8O=~7S='*OwZ.Rp"8F-wgʚ?j |N>cwOηU_fޕZUPH e;b?\fqlˑ_vG}Ns`$HeuQ_VEo o($,WT%:6{oV*>1e#|K_:GW}f*07x-I*v?7rQ%9G'|W?NS~jT,VA@1?ڒ]c:_RgRC)ʲVE7օ!Ղ6T%]#2dA6:d%̭a=+pVM4fRO',^ro-{ IvTB*`I 46D&w%7gDdt 5njJWI[&.}GTuvpxooD CiV"BvZH49Y( ؞UkNkWI4[q;w0;Ygu_/ԮrZ-zShP q3<m?uMQ35g/iN u ::K EJ&q񤒴4ݺ9.̗3BQY`x=瘟~1ǙsA%&qޚUu/fmru-16gkM^QEvm31w {`rE8l59&uCEņuwM*:7"xۿq<5./w|l{$]aom_^T Ƕs2`{ax&^6wUoQyj&jL&b?,G1_Ǻ8rΈ=K]ytmLT5A$2,@=q8UJ͒Y0Wu J?xIqFNeUsI]VA>zo7 w6=:4UH2 L>.΍$vl/k CAH}uL<#M4ݨ[eJQ,dGƖPJ_Xu al݆ZF7LIMR i6ӯ3.˲o[[դ*arbT'Wq̆7ϓ'<TaW:pEY@*@X Mc4z),۩P*G|6Rm&FK+!iP7 D8tʧ7֒PV$o?_κ[*jZ``Al'ɛR6( D- A*[GGō9K%_6.VB1ޙ油 ۺ/a11 Q`hUj ^dI lO+ E+D}@2O~7mB'ֆg8l(F1I3UV@Ivcn1+{йKBҚ>)L"^\[k.<6Zbɪg]$Dnn:71$}Ⱥaq1Uj2vcKi"8ZrЗ`JeB?Vn`)`ptpZl.̭^W rK7zc޴_~7M[da_OJRSnumhtd$'/KZu-hQ4mYP?3' WГQLo^޳ҪaQ=#O"*95t+oE`iB1Y[c+Zz!ЫE/L/^Sp*S, z$yuRKv|[1NZtƃD4H?\T1:J55Azoǚ-̙!4!-^QR dN2懶ue;Ga۾ɚ#1sI$iZ uR l)U5jieHܑɀ}s.΄rG{M5Cx•؍a(_b(Kj9cFhuNfO'\f;T %EfMQRdU vO㥣v۴t^סQh={M*4imkPy ((&vi||'43A\uh,55/IZ+G3`<*iG^OGzG5![ZXp<2wQ T*Ol9=Bwi5m[m;ۅj +<|Üi.*ozk:ΐvoK\ܖWϊ=<C~;^,,ӥoM?T&PӹiռD1IqŞ6_ϥԵi@Ol?vg?$%]'cGAŋtOT5Sp&V=Oe@Tj,`7'9i-APStU2?)$|5SI*u0!d{"vȾBt% l'(M4KލD@3$ls՗U䆅ETv'vTn>'ֿ3J:zPK9"NC*ѫƃrUt'¾>z{#i,{OסnUc,{p3;j-!F$fܪG ybFOr'(rTL (QF Vs.LT~~zOG[\ѱI&iN9W ^tFwY g^.ˊt:-C8ө,$3ʂ[ NN?7j^s׻V6z!̘ێI{P 3=$bc*^_̱W*'LqJ. jL?}eT-W riU+/VyKjWn*$Am8䩳cQkmܾ7jJ]  jvΎePheO%k SUIz㷉KG=ZJө3"ԪH,F~d[nm5Ɲe4n^ ;ǩ|PV~d,)j޻Ğ7{VdRrV[w9m* 4c2Tkۮe*6>gkRh,oQ=YR7%Uf6o(P*yA+\4k)RԀ$~q.Gv +^ck7iԨ 5&9Lz~c1ˍJX$z{pڿ,4jڊ/`e "?8y#ZlkZ>T-kH)2 m4I]z7qtC^yOP47n8Rj/Nv=6vP]ybO6ޖfwWR^`GQ>=ܗqÌt~3Jfe;m?\l"h}++ҋfT n d2즺Ӭ59VӍЙ=ܫ-ZզQ@}A&]$B#c2Z&֒ԧZRf`Ω)۝bzldi\Yڕ5 N;QZvmd`DO EP, Ϝto㗰zKGi;*)5k Qqn;kCC 5:5HwRj.lUBWS`+RLroSb BjU oe}|"K嗅W@MGkVۊAu_$h֓W6ZZbHX rFݱ@\ 1QW;Ѡ#xcLjo-tPQnZ,w8I@ZNߦ/+\EM%ޥJJ4rH n2+u0_5iicܞ?,7 #*CQ;ib o {'HV&4HVR6ی>1M]QU f֖N SXwz +Z;G䖅)^C#_4 k'Vѥ%hm?7S)QA>i=FT+OQ\)jM#] j )Uzs0Ui10LD`=㣬EoNK(M@TL=-іR|O @~cyh( =߰6F7E%UM oXSEt =fZ,yoMc}pVWǫ7扖QJ6TT:U*D Aի*UqETdU v-DsUvtEU๡ `)gor0y+Tz3uCP^RNk-QjDZd J,gVڊgV?WYCtKծڵJqTl`i1r>O>FPI~wE)7{ViR=4E$:tZuףLY7X-JaٍTZtJEedAbIc`#m"(zN@񇶚m= YzdR`[R$})wN\xfYY\7>h[Ml|nLz54 bN1QvU(Ui( >>HZ^9]f) lNRgy[;ecLP4z4:qV+\V@1XۺdȔSȞQZVc2bDaLLj=v6^$Q9ռNn CQFX.A}_KZ`M6\jTXb&@ s]|pI/rSY :BDKMUi+*LNyᨹ 80pQK:K {b)Zx8.LՐ-Isq3"nj¡E -~T8'TLJWӤk'lEKkŇ4:JH'y'h`wC!P5"3mM/B='UҜ1tWVv ?^ WZU(]鈙mL~.-鲔HgTn#V)718 CmT{k&'Yy'l\etEmHBs9bB)-QmF3K#ajlt[*S%"N4PW-V×APD h MZHT`A߉$luJjwͤIUv""xJ_cv\ )qCրOĢԝ(eu]!H\$QQs[RYtɻ~\_ an[3TWovjت:t:5vǹ88CiiҷTPpL8Y-=;MHw 'W%5KnFjzfbHGrhaɻY;Gh{GӪiUjpiV#p<c^6S^nuB`BZKUZY[a#lM^5 @y,O`H?#"EGkucR~*e%VH2@}Lw*+C]KM'j:3WMѱk(mLy IN8:il6h- T, 6vZN>(_*3(/%Dk-Z h;q6oQ䩖֢we䓳oЕ j.`TFNܞ? sPsnDl ɼkԢe*hj$p7v8lU0` LG=pi5yb.,ҋ |aղI]IԵzT/(_[fRCrKncvуˊ)N0kjՉMzGvN:td߾7cMv-( Q]J89*v);WoG&Dw4ªm=Lg EhJDJBiݧi'6폔5g]t[;c.[zT0p F|iٝG<U]3ugP64:jAr!#F?I*NL/?}^QzjVc &I{qĒ2M6z~ }%5  m<]8?~?oKdcdU,YYX}T'K$~RЫdmK?MWE>'8ɺKnk^r*#CR%V3:.>x9MB=8i.|OYcK'eſi=EZlav*S6< >ݏqj^kҴJVPX#g8B2pdJ/3D-5S>)"yc(L>;MhT Qu!4ثd8⌯)49*Vz3xSM +dAQiՕ_21Rޢ*Ig!$O`E:Zc}s'C0I(:N1iٮ1n5IЩ= a6Jk_rP]TR`&?Ƭ2wei۫dZħ 46# „c;z=vM+y5&hS䎎ޢ7aΣ ev] v qsM^U1\Ϊ5:  }(u!+[ZS 7Nm^Fm]Ra;6]^`ZB}gX."AnF L[2pE=MQ'cމ:JI-$tJ'be1~QhuoBW JAں'/%楻.O-LFE!:ՠ\3:8cNT8auqs(}GZlzƆf}}`Y;MGk[CywFȩ4}TQ>ST4YM(73e>Uu"Li+@F.i{41[YxsRvo &ZT*1t0!<6&+} \daU mb~ƸA8A[PUP}'s ->lNR]Pm;\[I[Ȟ¬jW 3IE\<"{`RP]:NH 큭%c:5 'c-a>[z X&Iօ,e-jRX0?2hp҅zuUΡdc_a*eɐ5/{p@>_-;_Ym[e6ٕT+v:TGiLnO\qrxٱeOk.U'b}㤭:tԭJGt)!7Ի j;`T]+ΨfTUM G̘ŗ ѡ6G泬)ְQ5"['sG00Joy%%E݋9;}1ʒK.*K%ɂq['?}ԧD_1m y)Wgmʦ3.B~ rbMDңq^T)LH |7'Z&h:@IP>~ 4&ǬfUC,A }ԗYy7Nf.hT|Vt_ǾC;[.ҮTV>J`pc%*0괉dREULOͪW7e ұs0 J2KX6jި%Ӡ w0Iulب,f $BxEsi7*MXTM[ _ɓ$ ̩TfJ5"(;;D㣅B2\dKsQk5o=~odx\Wf0^UF'tZYQ*v Gi *.,S,/[KZՒRWy98yV#4xy>,u',*9Qd-ގ_ni4u,IcP,@0ToM Zӗtp aP@3x&x׳rw*Ri\caxcJ7R=`O+tIiдni\: 3mpn)4fRDWW5S9u]]U{ZtK]RkCǮN3r<8ә^ZՋL>qe9:zeeX֧Qφ@ 1mErnkׯLQ#l;[F:de)+EXiN5ii/bB r`7'4a3(ު3s|T۠Vjt@#'_"2Ϭ*ٲR B#A;m{wǪ[ d\uxֵ*A*R|F[#QW4jX3`1 jR,$12BޫBIƂ DF3N5m|G`@<϶7cO{t7L0좍0-Ɯx-u0kji?5]YUg_] Jr=qpUgK;mu!lT*)izY"IY08cqVCR:T "0`(TJ bF* 9Ӭ.+:{v94 7v@<~XE(G+5 ڰ?Q[FOvF HxO5}0B R=v]Qz$iFko cc* ԭt> RKVNG1cbh`I >qZUFӿدtD~YIޜ#i |'U*bruc )労\0.6WLq`mt Iwq0ZTͭIXX(4-fBBǾG'zkvBNqez.7Ho Yk!5}N=;ZD=2=pWJ 3S06?"C%6% , L10#MUv}#еLR _E'IlSj`SXG9tY5@*Sug>'ӡ+*ѦN|Smp~Υ{Қn^AcH^GNPnlc1r5ʳ j;F$qRZd8<[DĂbpض݌WU(?=Ͼ.p}BUWUf@Y;ooC{?=W-jomcF|73nʪӺ̟Xd+VB< ,RlaaMj5ivq=km0T5Sum@1N3KZs-LKrUdǙ dcoC{C%;}T98EW7t^]gP@(YnOЮ4R'Pw?-LCEoADup(o&~mGªU09'N m+[nIPF+$*˳*t#sS׿mY"ErRԂ4lt4;vӗM&mދ]ZVxۑmX2&~<ʭ. gMV0'C9^th]tw(f ;0&#QsV6Z&4j~9 *%O)4OmHxW(ia6<+ eOckɔTJ-Z݊e~O8VI.FQEaSXt|4mU5@,4#vi1Y*(!c0I>@k ?㎶F!k:vRyqVr-\m$cacOrVnt>[V5UYnxN"|$dV*(I O{d;nlt헇I.n\0 #a^ԈouYI$Do\1bOH6T5gs E)Zȇ\8!v~ vɩit2uQQS=\_'TZB HӖ-Av\搭Zl) LN:Z;EoVLhFI}ڥE jN.w*٢!@NLM!0z)k]톤RqLg)x:b$º*X)Bv $müc=$Z+y{MZ/JcpR Nبx.ķ`W'=? +- }&rWb-j]XiappBRi@ J2Ucdޘ'V.;{iT$Aۜɦ}U?2y)#aɕh1kb^E+L,I)'*t}&ÓQC+jmG}W$}:b @ ;qD`hdrn*5 c>G S:?QQ i I;Zm ݌G iP27aYckE&?%HOY"m\U)iRԕ9zw"2=?Ar}"-vxP2ThVF" ؒ8j!'O_=)t܈^@'11ӣokzk[4ތ7 cx{5rd&mNfE43 `r =kRݧBDoxOUD^慦GĞ0/OL'8촺S]-Z&0 ^ˇp } 9e]q\tM]+% 6N wD9}P{cTeڱ1O;s;ڗVn^ďqcn&-ױ3/KelRޝX0AըLvz MO]t?vn5VUaZdL/'Ӻ$0){.os m BV$;Ͼwj^o/l֍ !\V7 4|!D/0l4z)PRUB6IgRNKa^QZ Zk:ml*L 2OI(E={SvVmT MHO1W\}ʀV )\i6i&Q&}gKL8]Y+V34$mʄW!Ӣ:HP$L lRvmJ%4rU ?,]Cԑa+M ǯ;e|/_ Ahڸ=yX׮KwQ oz{GժH$ ՆJhd+=Zc4'+^®iFbľni'G2Q+<z9ᱍ6.sԋTH F<`PidzlBqHn( ŷ8$~ŭ$$`kcX6tBXPX(A1<|1ʓm|Ѕ$Q`YA,J ۑ)=4hƪ F {[j/ŜW`;|\.8{N岳.c ŪŖK(1'GH eiZAb j{G8N.Kt^ڒOBI$3ۺRL ^(\wNIc)Hȶj!Rf}9gRJJ)2*гOJ4rX57HE4 Jm.\DTr{?ix+V=ÍXqU)S","`J7TQ\I3'{<\ع,j6Dl1'TIIk+gkr%pblB֚55_\&J:vejh[Ùo O)YwS~U] >++ʚƫ P;o/ȅVeqomNTw8(63UTpdpF9) P‚s91}\M6!N^=Bԋ AX7#Kh|-eP{4J e'}0A|aV[$&thiќod;pf'6\N'z)CFޭ Zt 99ƛvD7+k+qBDשim6jXwK*usMiQ5t WUUB\b`?LO-$e>hM\L{|1W*ou[+ K[A]c<*Ď RDr{v&c8 ,ҥ%] (Iҿއ6ڭbJG&=}gױU/4lh^-*UQ `pRW٭iaܵҩZTqT 'oO1Ɨ&*QE_ k/BӸV*J 8+R,'Q.DRu@Y%v3 Hx˺nMAJw'LʍݖWѯZV Jʫ;:{Z+#(G&9-#cIۢ7v]շ&HIȂfHQ A뇷3%oIٙy^@>csNZݎnNp@fѥN=Ǯ8i JPc%jIĘSbθOIҏH FOLժBɓ QtXc1P.O+S Uj ԚT<0 | zEMmR -m( o]i; gl4 D8ld^ Mj̍ܜ-Zn~q`O{Tj^`_n~c *[b 9Kض{[O$0;_8;9Tt5 I }X u ?6UJ@% bD5͏TR2ŵb][Sjj&#~?O~ʭ"cej\~iaEKpm;,թhl-.!)JE60壍~›P_7eoCuEBJ)p3ՂֶUpk_ʨvu؅"x?s:x!vZh!9`jۆKN6[z!WTv,OS~lE\*5oy~KfxǓ.n7!OtF?C!'*D\jVxm\rBJGOLfoӫN G?cU#Lhβ K™ {Fhl <+voBI`w=f}0)+Im(;uS*"/u13v\q,*ѿZij;_Ci)vIsک׸ZW HL=bO *rFbxi;![FOCUa#QDTBwǸThr,Ιꋦ[kvF,8#o^~xӫ4Kwe}KG,ai 1JM[gX._S19}%Ke|#W7w2%jK&R^ 2b'-_ݩ7D(0p5 }iѹEI٪TP<qw&#ǫ)1_g~-f5*"=UZ(TKbp'-ti?7ӡFv'3uk;k85\6V32<)?D}7Fwٚx%)lUE@BS*"9RxJ/Lb*Wf1R>d ; u+eNWVu«5ڳj\$I^}"1Td'1IsQZf4àV+v8ӱ q fL&NṻI-z],UT\j0PƜxS{%4ktҥ<5Pn#,sl؝*#*qcPvm*R :[aeJbcZ.RRjo dG8R#|Wm MR ycK{-%Z`7SfJ?LT:[b .w9|6i* *-6|(PeQbԘRd+lcWCHH[h jO.ǧo|-4bW6)U5Ih8- )SUE0 O$QC3?C;$"e)e{` zJ{~_kjNĆ-<lfq_S[v, )=1Wm^ŨZ[no\ST%bWfEC MH_,?*^N򼒫( ?߮ 822zVIINBFCl~;L ݖ$}EJ;dקr7^=xU}S O`WS٢ejP4"}O|.S/mubi@|R@pٻY5:H$m=ia05{AEuJ+6|VMmSg¶W$틔]5uCPXӺ[obҧdidvi !1#s;8ѲR+[Z(]ٿ)o~QoCRkOH-0>VBod<݉SߴTֶ&eh.iSY=6N9Sro]WYՊoT< `Hm6YyfaO1T"˥P#}@f^<]B\USktgl*h8I=vjZZ]/V$}S7="wL׏Kk}TJuuh;m8͑/cV"ڥY{ϗ@c'@a .#­suj;~&Gw>Ti^H6Z³j,G{a ]JbMp̎WbO7mޤtIjB40 U <$9f4lYͳ+1@;I7(*$ړ%?`):Brd?Lejdkh%[@ҝ8`:?6m/&ZU('*n莊ohijS gepTYږik#205@46*J9C迧lh֯Qb> ߢq1צ渨 2A,km;@U B4Gw =9f+ɾ-jfҙ0s-)EnAS  No⛫gW(iIA׶޸&mr+I-Lyl*mnШMܷnot֪h TpM/FkE;ҊtU~&RadyHJRd 3 ʪV)y}A"M47R:#-Z-龂qsM2+ޥ J6H qݭr4 :&"}p%T!B㧩_ cN*6wNTjxZtDe!O;vld.kG@|]mX9]@HCK7#h~XwEJ-;eS`b67 &|kpijmtƒqbKм#%B-b2p6-~? L,O*16D{=8OmGF#qTdSQL[3m鋊dk:izoRU_TF.4t7P[Im*66ēTؑ+uRo'OQ$XU+ST}Y~bL8GTʌeOREz}QT gcZ'W.O ;F=>c%? Gq30$jXfiPˊ❊>^NYH;킋H;RU`c*3 `$a|t}lDLqi[JW\TX$Meyt.PKNQ}Zt/a>P?|ROˋWDږ[onomplOH ȟI%vYcjfy|am?fy):qD?Ce*"2C79/c#z'nOkU=4߷01A:DʗLUPR"4&pz=;pM$~l[9qrAWFӱr* e%!Nwoe{ ~\[ZI4vGX`g` Lin qMgΌCiVnZ.^jgs&gɤv"n$A|o$W%y/~5cE="%@$:0:"vtl(Z`1Ǯ=2OT6Hg,,jQ~iT]2c. iUH@n$#q\tkROHdJ/BQ!]fLNߤFUQF:Bͦo8#`H_t[]56ꪟs `8'+lj$-ٚu)9rL‰1s-A"%j-+pĀż9 .K,Ȟ*N)>޿Nz/} -CIzzLv R@^UgƥRfWrp0'!ɞx~8u'} v9MV&+ecA*Q_y;(m[ңa{|X˰/EwXSP1^D4/oDnr6sƕS-6ZPi `{my+wzRF}ǾؿG㾄dZ҄7)SE:$&b m";LUt`,$2oC}I, Lvv8"h@܁T%]ճz@KUֆ+aHT)XPA)0&],jjmOlؗдP^#}1|Iwɉ6Tem={/دUb`y1o#_t$=KJLi߶b.pKjzl29 URo@GW& $*ȁcn㝇 IOp VUR< GOԙJEweI6S#iaۈ +&WU s-sTj chظEU.t<.$zb6GR%yMSA9jPIY̮{b꽆%}4>xփV6T֨JI"t\##-F*bLLۤ3'j-H ;qdcwuΠvӿ%&YYC(D3AQn%f6eۍaR l#cLU,PAcb>1?1t2躄;A,ȺQhf)Rܻ oM~^Doϖ)-q" n?o9Ƕ.zR*V)>S7;sVaŵ@\V|cȮ;46ݵ}j5͹AqS{4tem؋kԔ)=>HFySgf_rJ^;c+O W@n l-*MV$(o IΟG%|EӦ(T6v04 -JpMia@Z9҉|jS yqz$]L֦aJ֭;)VTOߏ|GM[(qux*ի.gY=q"m_ɣv ]_O;J2ѩTUG(ga⛥av꛲dvc ob?ERpԔA 4HgUuD544lXSIjzy|yqK§UC fX t{<ʫҮIpǧmG%a.?QutOmVb' )I?Ӧ݀4٩oIγ_c'y~]Vei1yUw?, PRSNv~w,28Zvha|eбF qҴ[^⡑%*@s_'#Kǿi}mH0#9LE:ka]>u3I "xd&œU;b. s}#iFB2&8ᱚb9'K;1 9@aRVhQ@o|RpR TW;%$.sN+"i'ùc5C}Ke5ERpB\2(FXN筙ҌTQ}&IճDh 0'uGq>b#n s" rF(Q4Uw0|ߨ>uCSFOÜIW:QVW/H0HJ1'C{k"=P'a|sa]n:3[.giREsKwRA>]"? Ņ"j\5C8>|wٲUԩ tFmR'Y~bmh'n0.g?7jb72H7# TI(+ZlI lHĎgit8\r0;C-Y*\Ӫ3=c؞L7T ZrLDmk' Ar @gcwYsP̆P T#n.]ih@w m;c^)sʯm2WZgũH לuKoj7qw{~ݪ9`ǣZ1?P3i}gf_õy^AzT2J$3鎌$3՚Pr}^.b@5`sIItiXpbg|m-4KgkcF2עi ֭j^ĿhF񍑝gTSrIQ3(.H;c:*.RrWRe7,,]%sh\QekJiUJyJ qRj:'h2kE&pčqR{ݲ2zhԴj*fؙ`>}%VIo..sdh;S`r7%)l |*:B_ Qn\Km:uEv8F#)uRAڥ㺶g"iPJl#c8L5F1CՕ*4DUc0'SBB#~X(3kc],]&b7 Pҧػe’@i=1Jvc%|7U&e6z22&{ nmBIl:W)yMe"ێ0Q^oN֫4P?T!)iUQ@ui6K~ g ܃ ]!)]+mb87tM p;ǰWPW{JM@ Rt11|~8i|I` v?LRu~9=&>0]AE<;\/w-MGnOb5.+{fg}L_`mvTӦwkoއ*Y[@@yUX*;tY+1.>qٚbӦ-mQ} vBI <إ6=i-b+= ca\,XZsp$6v[K*J8 Be&+Qʪtkh*\L$oM-n^]" qMOCU\]Hg&A{ᐓ/Hln(bwl:xZGA+{cm57Tmz|p_ʅmC+r \I$̬u'~ѿDO]" p)bN2ɇ~*.`IGnR~ƹTuOm @FG}T3ڤ!{ 9=6tā^gEo컃QHc銛l$,*Rz Qlvcƌ]gce+6nvՉndڪJae5* Is?|a+frk]*-hH'N?IE. hK1gTf~Ay5t9t=cWpeQ'}7dsJsjk#)f QF0d\mmNӬY @#g8&5L9$L6Ӝe6mi^b793䭌rIw (,*xlg[{Nj6B4N$4F .؀'#鈜oD*zt $Q#|:T~M5;9Ą9'6^$ju.Ь&}>C^(IJ bﳢ9i+?[&`;&8g~OW=Ef}29rjyOkwy]_ja* I^wż9Oes=RZX/(o|zOId%MyZD9 wl]ܳ3# MZ}T-QDG(dHUozg*AѮ/eI9C igu^YP7 ET =;w9Z /.~[-v1?-f]&V@ӷ]!A9omaXlzWj-e4 b|ŀoʪ}XtR9[O?0K-c6^*)`gIeFA/дrsoN m{JZgy'xZrZ4,WQR6~["kC*i+dz ڠ{~ :0xph4BJ&?\~ inK#yEThÏl|hM>\~}]*;A3l3\>v'Xԛ#ײ4,ښK&>KpM;4x0c{Soܒي֪) 5bj8p0V$AO$*"UԶ%wmֆ8| +#C%P 0D#/A]1-;MiX3}9(d(ۥU-و 87`T`J?hXyx0r`[UkzTӦ_~9Z$ψs2}W(b5ߓn~"U]Kc$q:g1O'a,)LgPHONݢ'xb3]Sj}هȀ{/tZ@rp#?sy/HqKL S78JI-5C<\E&Rz9t4p)4oW,]*"cpPEq}eeI'Jh^:ſlt@f]&I?-Οؓn5˅Sax\9'<}['M S`(֋i4WNU[/ @WSS除dSw< 3"bsTR7k$ރ_f+9& olo`Om}~Uvę8vVIjaX]\(jS3YDy*pT=:4h!PsQ?f&l:iv>ÿ~qȭbہ\-?P|܀'H\㌓&t9)]? l>I e9`^NWv\ƒ%˾XTn UEFRAxlgpWdOBKg|O١jY5@;ɖaM69Ky92>٢ySɎ_^GMmi#تub2s )t,B|{3pToJG.Ę X۶Ӎc̜Wܼ2ǹQTѷ˜z {8nMki$ ,3-+kmz䖕,:R0vl.m7~َWZV a׷4ў{j|̫:\: e`H҂ؓE{#}'iB;1s3~ַ)>x@GcqrtGhU)IYIjKOlzjaHkbL@l"R4U!Խb~PaXV Ǻ],!: =03/vZt2D"bf6)4(i.ɺoVZv) 2i[+֡ %}_&;m֙rPpWBكo vQz}0)uzXmIjmwiťZz/\(wclC /IM Wo: L(BvBުceNU;Lv3;bT5/T!|'}ށN-W`Sװ77=J!dlSm(okZVzoELn7&vv8O`4@A7;l-X # о mD+Gd( T: ߾ ?E;m @;ZFE @)a`䘲;jXm3OjYtF'lskH ~Cm'Ԛ6{7kk؊X.;[-ղL?'TcnC*Ԡ7CR2_Mǿ=_&E6 P6÷ˌ>;76 BG)rj1y8>$Pé"$ pVa%frG8.O0NJO%Aq{bܶHQ`Z1̉߁툟{↋¡DpMk3JSfY, xelTʭCϘ96T>y&?|`d F&9߲N l)61mڱaU `fhq 7\EF ;!ȐG8Fc7[l]Q@Q RTSV%UfYƺ,*G~^qM42儯~[QjN[Z)r$DvUg\tI">\AsƘq$Ve.9wؕ7Fft:E̪%I{2c"0M'㖑/2Tje&O#mt!0u.U&*S0#?> ?6 /V*u-#ӷaruY}JAK?>p4ܓMt4]bF d4c98N1VНA_r{_\jfy&:[2=9~bil\+-ӕ@')jIwlZamoOם%]V)v݄mf.-*9u:ѤSod?D{zA͒&PbQRmޗnMJd==$ $q-.!eJNI#? %2Q L Ʌ 3hO#R aK!qz'LfY\0|Tl#QiD;Lҧ\'yYTUXo+ENU%JRiN^( (^t:跍2Yi"vG/.)1KR { DVBbbn%{Q0A?% dqP=%kX@ܒ'(G?oYu0vM{HJayT(<>NRrv]5AmLG%QO؛ٻF/*\T457g>{{`B(zI@1'Rj =j`SrdH4$$%q }ʆ\j2$v'7Hdb<ߗӿSUV*x0YkvƐ!U"I-I6 (֙xv vTh0 WV\{C^Y)ܟ{mVYF3;mp$H$ڔӎp*5Zz F)'ɾص)4޻t 'GpdGdobeGej`}qjLM2b1 ũQ#}Dlɐ4m_' JkN7~&p P\B$>2I1*Y$m.@q\Wv8RcH1o@m{3y nxzCoi <O)N!AI0ZR~ɒ>i0~R=|LCI[eF?t֏u3 6>d7}&ER v5Tُ<iyd|. W0Jv3X #}8F.9U@/ w#~>rv'k&9<댓MCl)ҷ$A11#xRR7'o45d)*)se.oP2r+l}ɪL2d_=*3aDn6IW$ld9^Z"6}a8i-ȝ\{ γ;o!)|5N͛"zI5ɑ{.Așs9+5)*0 _e E@7 [VҋM{'PbL<1?88+'+K/izRð#~LɛGFeuh(D'J.vr24KQ$؀$c\fѵ ( }f9VCТK,56'*N)P:j 0h=OTem<13ŕS`ͬôLSVU9jJ#G|*7+Z(ڧc Yj-3 2w䗣f)[#[4) 6ݱܣ]3YM=(&#T`Z"p22A^eG)J O 66JomEf L[{l󊄻ǧ#zq=|ʕH:IpZ-l7 I"W F)F4N)#>JM=2QcL++#1|Dj0ɥ{w!(`w{b_s+wqa$֡$3  `h< XRcվO4 ;=Rtk@%gizDHj'>`oV cR#|SefVbI [Ճ$ϛ)d]_~Ol u:=Wَ !}~Cl\ 7VIn9N-J5|T➍jUj"ĉ`]2(+| AaVq,WCRi@q'%aB*leRy@>%;EZs+jLXQ MR#Q8rM!ÒL2#쨦r(Kqa$A wČ߰mW]IwcM?_R[Kebji}bi,A>۵ҷblQЈ#p1 4( O8'j!^ܲGy.2%{K Ao-|V*IF)O*BD*j")3SE^9sS  ~͢)[K8Y٭͘j 6{EҚ8R"JSLrGmiSR ԩhwͦ{:aԍvp(i%ZvvƼYtdD%'O:O8Ԝn5+z`e#*؅|)?pc(Ls5VY'W2tA-4 aFkKVbjFը?Q_l ZExG0 79ߖn*ʭƦe"3$հU \ftE.s8]k GJӫDGI(me &ARrgS1В2E [phPB' KR-ON1 |A\hZ#(evcu#kd+VTQk$qiri--VdtU2Fn5'V|dM];ujxgnJmY<[V'ӌtdaț?Գ5!]Df8Ltc4},`2 m;hY hcjΪޘ nUm\[pWŹCLZ+P8*0t9 B`1/a5oQ|qM!w#lK Rh h!gh3tz Mʰ|K" A[a qL#]c- HO~`qoeOiuDAv|Z&X'DjjwKj3LVvNTݸI -" w ~)I6>|HKU@O LR$}wҫRv^=Xa^.D5oL/8Q jE0q}Q*71iJMM mE5"wK#:{@>bۥCZVmfR@l_ tJ1sv-PjUf}Ra87} }6ƌ k<O2QE:~ \Zu%%+^NddcݔFjЀLG Rb=hA>!GUkU'Ƨgǒd*%BX$ߌ9$aedUpAI=,\:vT l'ySQI\^U%dB +?lem;o.+tiRH1 kCv0ֲk-V3n vn<I(UUT?|rJTtyS*8$mST3uoLG6z5 5DӸ ;OcV Tf^ުTo YVWLJS- XH gNG M7eG#+缩|R`}Y&$mײ )z*:GH\l$) UWTX #}|G)4{,Lt LL.f/n˵%VEI!| QJ:/ V6%0gyg#8ĩ:DjR;'>я,jk#RP~ݯQm=li4*"( N$3$}lhKB S'cDDTP<vFlqp6?Lc/HӍGUEzt|:4zAu^S*n6j]?EVD{hd"X+Mh~U %Y =Liİef"{JDpTP} *A{vuH g[3UV L'69LT 26}SJFʡd$LqتVɮEjAyy`&A%<09]vi^xqJV\$*i 12=#kj 9Vu) jtp7lSz>.0@SwfU  KAnGqwƅbm$?vHlsƾ OFc" ]ڢmRIșb7+j~`@ˊN0JɈ6 q]<\e~8gmML#?qM PmRCJe┛rN4-J%Q $Sti [+j>);o+)G[O ߰_% ޅN]K-[n`o$`HBW8ĴmvG& | q..XYeVFv2V5mRqm:[r~|G&JJ Xݰj 7\-FGDnFpJHѨBY]87ъv ʎg$b ea"ʕ qNE} RJ>ʈ>N$=MF+RzF0IaJzgBbI"iH vX'Rl.n]qRuXq"`,UvY9NKV[ZӦ$11ZDˉE;]˂TkP¦LzFя˿}2BV^7629uմx'ږ)jΒXDjɟ6C%i=3¨wl4ؙ{*lʕc0bXɈ'ZB\Z} :5$1P)v R+C#eUl\,'H;|[Hbtek5 DL<$Jʗ$΢ dl< s'ݚ}>顡hǒ#o·ߣT7mSriauFxUHFoߌ xC3i[c}AmZIUO9&"}} s{L ;27QjZ EZAx8ziOJ튊3Sgn7o$Pn>? ߶#I UgxjT'O Oգ )! "Wl BtP<ß.3(i8fZGl )1qΐ8 3H09F~?)Qd3X 0OEF;JRl JA]1}l|o/)7_QI@DyL[W\*FD1`J5$(dk v ?eТp1AAXEYUF|@m%%W#Bh۟L&kS].0l+[+c>.0k`2 8~ 7F^O;A s dIqK7lD1BXPOlDK{>usoukFAGniD(1inn:A)ޘ†y.{2Q'V'nq5FFJ`{h.ٽ;Rڄ1Y?/$b}:{8/|'Mm:jɝR3l8@[ wH|G"I_0d)vg.ʮ*v|I}%bL 1voc,J#t[V}JVUP02n5צY1RM=%WP ?vdZ_EE|$4kjD<9#?}, ϡ&\I% j=I|XԤ݌m'ljĩR7:lܵB:N]eocQwF @8+eNڗUp$06;cmm7|OAm;ΥAv7 0#op6ڻ[jd'RoLe;4(*t'J o-[BBDJOc)[}(XN cѣTZ#s VMz.ڿ;y>-: UlJZWWry=5jAlvBڊTZ*EUH#P0yۏ7ZAV m$X.Ý&NjYZ֫, {zct9(Wzq{hV-˼${c/pc\_KhY'׷9ғƝbd9aX>T"v1m2bOVtGZi5jxy9ˍ/OF)Z]1?}'tL_3:r`;A?oBJ)\w |Trv -#& WZB~[a] -i ȟb(qtH"UVI?#c[dzU[]6a$jxqԄUo9Sk+]^*ij ؉y|GhK:nJĐsי\z}Oy=:U[jT﷤@%F[Jl~&d껦*0ߘAʸQ,ЄpWL#aP99wٻQwP  )hm& 7$l'AƑ7ɲKہ-3bL%UQfm[̶JsՁuvBUB|K{}p.+t͚3E WJA95QRG $"./duvA>$1+3F+'@t4kv1ֵpٸQ8/NTnb c?`ʞ!"c^}p)P`AoL$w $b Lr70} ӷѹ؂ׁOz.2ޅVՔo= )Ķd(B73IG;b0hp@]%L1%8y⃋0K 1`bNp6*/Zlv#V vȢЇ$lI-*BGExDA n1 &C#n;%DhjKH CnG%aFP#)};Fnx%+ƣRèԔ,W o)lm4۽SX*~L+$kNf!hH>*'|Y*zYEj(>hɝkC]_o٪ɩ@;y7"4cS >-g N\b5L!^XfX^ڝjl4?~Sk"ۑ_-RGRd}@w"Ms :씪"HA;>6ԨۭdkHᬈؒ#px$cMr3dcmD OYq1GjU*tI-$F5ŭ1stI)F*4u1M*ΈnWCUœ~%)Aa߷:fwHeiMAjL?f͑= |~w4\mRV1&}vp{cFNWlVFiQOQMTF7p%itpf~s؜9,3 +lUC`~~VMJh鞓ޗLktn&")sV#lUVڣr yZ~ !޿ͥ |BE%QP̝>X\ ZeV(;߾'".YR6 >؜vD.Z$N䍷;bPJ?(!1$#TRLۓSVO~JƊa!Šyb+&s[}.\B(O48 qnAܤqY*;}pشՓb$ s*^($SAFښNH0Gmk$N3#WE&*mԸp|؝! @ 3b_)6 =8?ZiU`{MjjU투*]6&QժOӡ 56&@Q~D}:Wo^jVjbex .H&& 3`eXZgR¬NN ՟#io-;V-"A罖ÂH~\|v E0|)57ZGW3ũYm J̒$[_]#!8&ވ dWlb#q^6Ԣ+^[#c }HۏĽRV)Ӟ1Iʄ*SccNNf UzjMrHGM#+ 'ocuZ@j*1"3Viձ/?4idx,ttg.XMvsv=4kYmZBcĸ5}NO{Le7 _M6d450DZל1M5lԸ]m.¡ՠ9'/fJ+a`mf eשP2>*K9-i%iP0;KRIRm,61~C3{5"4l"~9LuhԲSM$z) qra+^%8Nuv=1齄[ ȪFmy#OoD΅0F߶1eov.I&rB@Yyv0y PȫDq.I\Sy#MxG(ЩI^C>;#4%T)mcTkqIU[\Y<8wF\JU-~2A#5Us%I81ĒMzVÑQȮYD7ybi-Ɩ_]On4[S Mv4F{Q}*juI#i04(k2e$ڤgOig!JP= *)2M޳FЃ=>SxB41|IVSfmG@=4c٠u Q+#H&@XIDqwap`Y&s3.T;CͭM=Ex[eR'P枴Oq8l&V9﫛zW%GA`L9&%)vTUf%0ן渺tiT YA~"JJ@Q:V47q}h\-SL #Z*_UXmjJ"aWͬY'̰I_f/emJԪ&B&R}42j9"~?[i3!`'{>T ?-7c$lgɏ ]ִ$㛟m=4/S+e`oL~0(dy:[WWBeF1I7C29$diGSU$>ucPA\UORWJ4 mһOieҵUCN:k&]LRk:މu5(x 6D$a-$&F L.v: [5Io;mv[2CzRwl0'tpGvm+th=٣ YM&d[]1f^f#}m_۫S L;>.N˕-r`qbbG#NgJkNi DlF˶$3*O ITס=v)&Oq?.>[{EL ;HӜZcTk/`%̊ Q{{/cqMHJ#d =n"[f4o6 :Xj19荷ؐsDH3a[IBS+(;&0XCI`KaFN]uU]PZD] }_cpvc5,iH f 'oOn&5Ƈk'(Y&GG.*?XT=L>\>jVS @ 1 F}]n1辂TpI4=}7ױST9Q늜CrMӧV0\Hi?Aop-qD0@,US)%Ĵ3q K#uh6]ǰ>qȎ0HN`n+X-$c8N)JI|UR;=+qh zRED遊il6zravtș8jŴ%jZӐùO~M&B.suNhX<\n*M~еѪ0aL=έ^UiFTJN߯l\`+KKbZ6zklI|mŋ0rN3*ismRn̬azHoŝrM]^Z/5 sL:.jF!G26JrkCV7e`"ҕ dd_#e3>Q&6`Rn:X EF) DAef `.*^ :6; Oa*ULm!lhbKjQ&x@Cj!ܝޞN;+VѸqtI@kL @y>}NL75bVX$F-_E5nցu;lSx|V(#-=2qz(S YTvI\[Ǵ4d.* w;ؿ 6m=!&w1#xP;>bgw1TN/^jRkCz*ɒvQvm&Ч*M{[RRfWOlF蜥[7Tc3Q[@tn;l(cS]iԤWæ bCGh`eOLn]xa;]/7U-*eDx/4>XԁRcRXfǫgSP*p7<qpca]51;װbeHEa<߱qdڇ-&$7bI\o )ߊUDyHǞ0:XCQsK`Yʐ 'NݮCs7vWEi>RWq{Ul?'ήh\-٭ZPH.FƌQ5+Zi5DI<{8ߢUE;AzMc?CTYC@㤚lЇR`N14ћ.+TA?^gI(,ʥYH%BH8)ފorBiPŞ9<Õ5L(ܬQ>;5JTcOddm֍f[IOV+&tM+3A2E5c|*Mz48Z:CHdb$,^XtM@ XGT3rGR֕6[K,\2gApd.oye)E:!=~x|iXcغP$q'1{THF.p jJG&)d'o fѶ3qm*]׳JKb:f@j m@D1 G,l  gl~%%TeDO cZF&bU'|$RVU>o6on"C˴095`VQ3;}:r)(tR6&#a"8'Nb(*;$Qֽ (gwB&2/IРY .YJةxք@#)V16Ě ǴqR1ԖX?!\S[Jqa~|=;7|8! %@`=nqJĈs /kbNd:g;bM 4,ϙ7lBfmbQQ{5J86}XA!u:i!^ 1c 1KF }6'}i&Iن!t*a 7BI-i߶%vKVkr;bg2űYQXhP ~Q[[Ivp HG F1fJv9J NKGMTb dG7)?"3ルir5Z*A$,@} .ɪh@ l<\.Pjʌ7lIzIn} ;m ޺&9Uv$`MM䝧}).tUZY,Ds1:M9HIԎ'6U,rj J`}F| t?0f*wpAi yuE2bHʉ<\Uи*:C\Φx>ݱz`Ũ)c;q?9FZFYk3hHH 6IY1pk75_Oኲ ϶ o4UIrԚ62ټ>GI+JBie{zLmai;!ku<*1 '֒1u%kBkѨ*46#YM7L-S F?4B[{$Vޛ;m1qBKb^+k%u1v=#hãarU==QjJD$;̟O26#=EAR 'yۿTξwQ1 5I>鋔Rexim;MPI5il>*J$ N6c+ J՝Ӗ(СYi"Yti$,l:v\Sa|}W)>{-_a2ǰI R2ഈ?=j#lY!Q9ݒ Hj,GӜYqu֠ RU@"Gy^IVѥ@H"OQQA]:1 Nڿ0K Ϧ)}Zi uP؉ØG |B]lMIRA cضK0m#~~~5-QkvєÏMErVN `9 pR 3[-Qn(C ;GŨ5h|MCOGIJũi33ZXJ>SwBfe 7iĠ!" Ҽf>{l! jڑBYn!hX(PDI  *Jʴ&@H1b"4 ŶS"lWxJ6&i`g1 R~ &c\@TSgƙy1mMB 'y kT"UmrT$ޑ%UZj*㩎OqemoO oދԛ9 "F=WB\?{)O?{'*YUjU,t~Z1yq-W^Tu+)KѝK~k\-Euh2ɘc ױdvI/> bX2jD{d'ZtK%VJ(P 4iaAm)ɿ%鬡 ԪEjjHU&ñ )v?.\)%JWi߾;E["bm鍔ZJb[%֥c$~80ȦaP^]MG80 }TU `Vk+O,dgWR3 G\cVLNLzs6A7 w]6!Z QܟHGV Ï<c:U؟/o JFL4IDUf} P2W}]ސps۝}y-Z쯼m7''V"R.-z}!_TPfd;j& uح2IdA09ZCZ{ `(".΢zK`JL8R ;[v8PLH(ZA`ҽ,5 TQ DHb]-; `e IVGBm|=F4hʁ@'X;}0iH.Fcawluؒ_c1#ZD,S]_RjI +JFq$69L4ZEpWHԻj{»C1}W̊C7'8ѮOM.>QP+f ƄSNcG0b#R3N)+,UZ8#Il`iG~LtF<1eeB`4`EV*tKr UAгfh0ñWLє(F3IQdsoZl>Э9V1aѺ"4zE-Q$Cճ Iռb:T1vbfD#l@TjrJ4@ w$ b`q` ;q!/^THۉX4**. /pato\K/d@dJ  %o,:D=}hO@C4<`Mg%@I"~BbnxVAb'Ö#bݱHp ah>bgRAئ݉D1xzUIKIQ#ӌX)6 VPH{z$06;lS.K23L[vyv[j rh)R_"{IƵBTpu$piK'mhu>Qw\)6xtCUG;@a3\᫐2#Y,f0OoMd\n9DE'bDN0P^N<Ѻ{\S5;#ygR}mRqq^5RRx8c4KFW'WKmI킋j[аۚZҬFFcDmŵ#EZnLqhMU=kd(Kq;04cOAW_8Tatջ8SH9S !>h$զN RX<J4L@}LfpmYN6Yн lpbM,ZAOI,1htrRe؂~!it:x>ՅV$1PH`DDv8Mz`LiզwӶ) RZ8|Y~i]i jL1ø@P %A1NcDf88RK)Ol(LЦJGL@A RV =P H0k1 I]!@ؑ7431FHth$EF4,@@1閕3 $mDLm#41؏T^o˫~~.0wI 6dcNIٍB;`K .Yf}x8Jҳ LS!#}Y2%dOm8ߣF j4Rc~z`{ Ԉch@*~|mZE\SB5-~hl=J+zY,:{w1'>=hd>нYZ~` |}F˛fVh4UXZRtΠ7` \xJɅNbiSnʛQ9#@l PNZ#9JY$ZؾvO}0ԭBfEWWiUaD|A;A܃m$:'o3EZBν"XqIWc|ZF`a I 0tv7t>e50ҁv2$עbeRS .I$"xW[&MnX˫ڗl(c*zDzHB펨t; (v,I ďӷ*0d[Mu*0A{JzpX܁8(cJ )VrF m&&U ŦDD1H 툛w C{5GHDmq z4Jjv|xmP$x8>u37Se1&b ib6\Ui@Th:D|K( UR9 ҖmxL#u `J,=7i5 -'1,Vc( ImKhhRH1A8-tG'DL+KuTm@W'cDeA Ʈ7lL|%m"`p==ݨ)ߐqqTdHdI86_dF lD$XO>1R)]+i׾)z*N&1id˖!TE>ag,7<ǟ)l4HR $|d!(3;|R@OeYjm*`ߎ Em*\wjWyvcV8$v-HdiZb :RDʤSvc M~x͟mlxȺ4bwٶMT']6脄 ׳vNOV'V0+w~Y 3Leq>4oKS$I"{%z.di$(5p>bT+i{;ŨA`5&&RJԤ$ scfoj1T$Pw08{J8;%$o}|),tu@Rv1H1 }%&ރ/4"dj/4O% *jd$z{ d*{5olv@ Pf=\;$.LZER4=}f8f6ӤvOymխFEX.A|9eVbz4z9’5c1mE a*4%n:W&[8je7O($,)mwd룬jY IRMtTU7Fލ+j8p䫤L#r ww{$gph>VUv3$ 4ʕhdOR+$ DX:;3Ԧ6TVcǪ%@@1{]XI,[:5.o,RTIPfV ɉ0biƗCJZuP p,̍>1Ǻ dRI$vK%3ʰP ˜=t HVM'K>]$U{{u$2Ɓ[z֒C3i h}YFցNj DBD+#i닥eVٶ.C+=1ehCb)Iз+\SjTmǫi%v)Naؑm<Pq7i-MWyr)D>&n[Yev"sJTIEE>V`dHxB{ͷ0OC_z[ Hǂ.1m voPTAIf =q'㲢u(#(e *`mzbM!% 7⚵c"ԑ_"KH=?B9Rl5b銤"J!~fh*fUf@1`c [+&{Tnj*}a'nARjj:>='d҂WdW}>K_dΛ_o$>|/a!KV8[e+ @bǬҿ_Y-Xw35h\26IX˿^GsŽG*MʮΖWyTN5<<E1]y#e~ tLe6wх4 UРI'yMijmJd`A'rH(TKiV{HY&SfiDP&c -츦iBƥդkA`8x"{Rw؀䣁Q"8nh?GFv" za9+ 4DÑ0 {}qmcѶjMUcs` 8:A}Õ$4agwjP/MY 'sqUrVmOBGnFϬhֱH 8 cs'n0VAe 1,'a눮OTfXÃ$}%H-!R?0`/mm`7I "TӰ؈|E0h'I-j_ MM1rg#bй8>a'+A`XCRHqm|JQͧ״b%]MQTg RzA$t)QQ SYՔ1H$ w6Ӷ*2Ð#ʭdRn0JTBsgY϶c*JG)H$*|RO^Sď4Sz@'@`ʼnAmA(=mV @:c8솅 y$yܫE"vKSt)X*r074Bö/{"V*Bv0j R*PyV=t-( ػ(IN*)Q%HW<}󊯒(VJI=ؖ#I'A  *]Đv~XĪ0Jz֐aI x\zYhq_C8zkHl{-_S] tb«:ID}#_?&P2]L7xE$*b6#w*y޸P/v T?)>4RWAQZuQoSvuA*r y߰׾8ˌ{ bgp]┩Epһ|1RNKB[ M+ i'|`ٍt5Td5eSLǑ+,V}jVZLLLz0F~j4^ޟWQz>4/IQ,o`4Jz38)ݏN68c4tq%4I=njeԖ>[<d m+罿}L!oDeMZ;iٜҍRQ#Pw$ɍ>Df_muZ că|^)ZAUDH}Г aYy]ջҩoN@ZJFӾaWE{T&3و1;m$[jK}JzD$o߿lEF)J&VKXN@\eլv^ p'09*AIjth-*F$?i0I;RT RyBGmť{a9*+Mh( f \lkNwl74ZfN;~n%OPڈ =q/PO'v6ձP \FS0--Pi@e b'UfP1#hA(l—1ݧ~=o|3*W F`To$-MDg<#oWgj{Gs‚Uy D_cc=Ċ% W4qliwpd6Ź4 4$\7M>X܍\GvSvMTCi?|\]iAT1A o߱J@Ԣ> DI# I]l\;`Re#'CTF L)85+*2OkJUT)-J3Ϩ>Cn̳46D鷾v݄!sq27銔rZ ᩕ0Ju2+,qOnG `"?|8#T,Lǹ"x8dT)2Ruy$G? 'MYY˒RV%i]T:B; .+fijp z}cpIa  I!ߟL nJT ܱ$b h [&u@18(Qg'C"~x X#%٥eALv,#on>}~zXv\Z_ 9P T_0o_KV[k&ФhI#HѪeS?_\ktjdcbz)**q?-(:Pڛ*M4]40Dwėe)qz.B0=g:cy#r-G䆎շi_d3R<eV`X)h)%*)'r$G'$5jB@{LpkU agR]>VR#wdqw$(Qg۾.n˒* 튯Gd9ɟ H1 ,(E.:R )" Vg} jmAhK{ amGʄ ~a,\cL'vL5U %lN}k,R]Avՠ$+i㏯*HvEz ,EI; b} 4]P zDiE%@jol%fEqPj@R<7I vJ 2 SI @QsSѺM0 wDC:mMXL l"]v>|KB "~Xl >]4NN<ABt?\]P gئAI>[$}-Am}bݖ\(r-|ŀӀ;|Ivj`Iqe&hyfT)@U?beDF&^aV\_Gۖ|`Udtn$:-.5 N]nS@E!&Km٘!'VDF$80`Ngq܅*Uw- K iz%QW >+Xm/.#VӀV!NvY$=$uE $vE3 )Ԇ6_X۰vw5.Hh8Xq3 PUX*cz Dǻk˪wee}dhQN5D! ğߏ7$6WGRYI,#HPV :(LZR""yqi8'y;FC1-{s'.,mdںW!˨cq3Ub^4݃V \ɍ`2ve֭B WiՎC{`%A@wEfUO'JZawV^#ƔLu9k, p$N,9| Ҫ0f=p62$L Mge.QL0,D.^EJ؜)8aYL/#=m2VZ9t? hT$?>ÙD MtWH]TdQ-\  o#r[;jΘԨ/-UjtHFdy|`b-P&L cŝ_Ҡ* B@$Ǘ[5E.ɒg4*ЮE#U@dUU޿?L>d|][kkRε EkрK+I b;h Uu \RF QNc}'t3 ngq#*Ti>(~륶ִP hһ.vܙjdz]l4Z`T.Pi$"!P 2tsRF U!D 0 1t)| HBh$F(H$wŖ(bHE nȕ[Tq5r?(Wip)R_OcZ~^*'o|Q>oW"e&)>'2m߾-HɈ;N.tՖPj34ʭ xL@У|IėF<|SdPRHv;Z.QޅJZ{=Q{#UF <>$]16a0ԟe@Gqŷ#Kߎw=Q X_b1UgAe$ mhT w_a\L^ Lny*Mƒ%!=9KlÍBl}3S؂VN`AbE@;r 6IGɜD]NA$''mSPցeT#VYӣ2Uw~{ai;=JduzYC"LafiE[Lu<( cC"zu u;\b{"ҀHpG$+{JzH威BgP@+mtHjFZCleDn}7'c^9RbA+>{e@]E6N|f2x+)6* ӿ85A8@FYZ)MB2N٘g*ĒШɷD q`?|UCxPP23|>9bˌnIue; LRʛ3-TQ1;|&y1b[,3$&HN2յz&oCj`Gq|'hNJz/k H#| .A Ϥ~>0r;{UhUdrGxx|jCR]{kʶŦژybGćtܾoӽ7M ƙH+=ܟ5C=Z|FJ;E!,s(/ a[i{(}PA^^Cܞ'hLJ?&MNnV<Ƹbr|Zdtb iaV ,|h.OKuKf)QPTB7@H?uD ꋯ+<7w605l`ߑ/OCWjMTi;c1R+$-z |ũ=(/QJ;LvZ7ztKTPd)O`F+=1mBU3i4BR40=/MZK֪IOIL Lwn-HnTDGsF-+V3V%MUm‹odCRf$L@F5RUcͳIl6n3U0Zu5EX&|݇w'eAU<6 {o=.OעK!oL YUGܗSO{G]T A?}aM;tah7-*L}SKi31m^ˠ$bj;8zM wE⣬sM]2P,{HFNA 88 JeT{8!&m`#oBȈ<\^JYL)}W 3$7YtH>c]8 vqjAF;>8*BLF"c8˪عӦH-#qLޅ5#@;6zUDn}{ mXD7nyź Sh qA]l  -?bOQMCmz`i#i8* MXPQUF-F `$D{}qi* Y#-%n;V,;Hч&48Ǯ!%! cbTbx툒K01* Vd#x\oh\yQ!I Pdȿm* ,ƨlwd+gQ9'aS|hyM a_@h lp &RT'~NNnnHTQ'M>-Ux1kOFlC_Z^SjȊ̠T%Σݻ`SGVg]Mܟ>˟HGs; ;I~ZAhߑOrr},i5ltbd{%=7JK*¢+L`mSu(R:TuAM۾<zĽ9cN kAT;ys]#z9VSP@啽iͥ Z%]GqƸɺpTBTen :,+Ć4b`$Ssopa^Xq1Nm$8n/2Xy>81ғQ3TԀNc\B..@d:/mW6'yP N ,~7TH.w #o~_Yjb判'}a'F,;i[ծTU%dBx1nc@R[S jX>|'bN@Y$j*3fռH? TYQޣ X2=1kiZXRuΣ1'i`lV)hH ,uJWV. */ import QtQuick 2.0 import Ubuntu.Components 1.3 Column { id: templateSection spacing: units.gu(3) width: parent.width property string className property string title: className property string documentation: "qml-ubuntu-components-%1.html".arg(className.toLowerCase()) property string description property url designUrl property string screenshot Label { id: label text: templateSection.title textSize: Label.Large anchors.left: parent.left } WebLink { id: docLink property string prefix: "/usr/share/ubuntu-ui-toolkit/doc/html/" label: title ? "API Documentation" : "%1 API Documentation".arg(className) url: prefix + documentation visible: documentation != "" textSize: Label.Small anchors.left: parent.left } WebLink { label: "Design guidelines" url: templateSection.designUrl textSize: Label.Small anchors.left: parent.left } Image { fillMode: Image.PreserveAspectFit source: templateSection.screenshot anchors.left: parent.left anchors.right: parent.right } } ./examples/ubuntu-ui-toolkit-gallery/ubuntu-ui-toolkit-gallery.apparmor0000644000015600001650000000012412700370701026602 0ustar jenkinsjenkins{ "policy_groups": [ "networking" ], "policy_version": 1.3 } ./examples/ubuntu-ui-toolkit-gallery/Animations.qml0000644000015600001650000001433112700370701022604 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Template { objectName: "animationsTemplate" TemplateSection { title: i18n.tr("NumberAnimation") className: "UbuntuNumberAnimation" TemplateRow { title: i18n.tr("Standard") Item { width: units.gu(14) height: units.gu(14) AnimationCircle { radius: units.gu(6) anchors.centerIn: parent SequentialAnimation on radius { loops: Animation.Infinite PauseAnimation { duration: 1000 } UbuntuNumberAnimation { from: units.gu(6) to: units.gu(12) } UbuntuNumberAnimation { from: units.gu(12) to: units.gu(6) } } } } } } TemplateSection { title: i18n.tr("Standard Durations") className: "UbuntuAnimation" TemplateRow { title: i18n.tr("Snap") Repeater { id: repeaterSnap model: 6 AnimationCircle { radius: units.gu(2) SequentialAnimation on color { PauseAnimation { duration: index * UbuntuAnimation.SnapDuration } SequentialAnimation { loops: Animation.Infinite ColorAnimation { from: "#dd4814" to: "#ddcc14" duration: UbuntuAnimation.SnapDuration } PauseAnimation { duration: repeaterSnap.count * UbuntuAnimation.SnapDuration } ColorAnimation { from: "#ddcc14" to: "#dd4814" duration: UbuntuAnimation.SnapDuration } PauseAnimation { duration: repeaterSnap.count * UbuntuAnimation.SnapDuration } } } } } } TemplateRow { title: i18n.tr("Fast") Repeater { id: repeaterFast model: 2 AnimationCircle { radius: units.gu(11) SequentialAnimation on color { PauseAnimation { duration: index * UbuntuAnimation.FastDuration } SequentialAnimation { loops: Animation.Infinite ColorAnimation { from: "#dd4814" to: "#ddcc14" duration: UbuntuAnimation.SnapDuration } PauseAnimation { duration: repeaterFast.count * UbuntuAnimation.FastDuration } ColorAnimation { from: "#ddcc14" to: "#dd4814" duration: UbuntuAnimation.SnapDuration } PauseAnimation { duration: repeaterFast.count * UbuntuAnimation.FastDuration } } } } } } TemplateRow { title: i18n.tr("Slow") AnimationCircle { radius: units.gu(12) SequentialAnimation on x { loops: Animation.Infinite PauseAnimation { duration: 1000 } UbuntuNumberAnimation { from: 0 to: units.gu(12) duration: UbuntuAnimation.SlowDuration } PauseAnimation { duration: 300 } PropertyAction { value: 0 } } } } TemplateRow { title: i18n.tr("Sleepy") Item { width: units.gu(10) height: units.gu(42) AnimationCircle { radius: units.gu(22) SequentialAnimation on y { loops: Animation.Infinite PauseAnimation { duration: 1000 } UbuntuNumberAnimation { from: 0 to: units.gu(20) duration: UbuntuAnimation.SleepyDuration } PauseAnimation { duration: 300 } PropertyAction { value: 0 } } } } } } } ./examples/ubuntu-ui-toolkit-gallery/Navigation.qml0000644000015600001650000000361212700370701022601 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 Template { objectName: "navigationTemplate" Label { anchors.left: parent.left anchors.right: parent.right text: "In Ubuntu we use three predominant navigation structures:" + "
    - flat
    - contextual
    - deep" wrapMode: Text.WordWrap textFormat: Text.RichText font.weight: Font.Light } TemplateSectionNavigation { title: "Tabs (flat)" className: "Tabs" description: "Use them to switch between views of equal importance." designUrl: "https://design.ubuntu.com/apps/patterns/navigation" screenshot: "nav_tabs.png" } TemplateSectionNavigation { title: "Expansion (contextual)" documentation: "" description: "Use this to show more content" designUrl: "https://design.ubuntu.com/apps/patterns/navigation" screenshot: "nav_expansion.png" } TemplateSectionNavigation { title: "Page stack (deep)" className: "PageStack" description: "Use this to move from a main page to a secondary page." designUrl: "https://design.ubuntu.com/apps/patterns/navigation" screenshot: "nav_pagestack.png" } } ./examples/ubuntu-ui-toolkit-gallery/UbuntuListViews.qml0000644000015600001650000000720212700370701023635 0ustar jenkinsjenkins/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Template { objectName: "ubuntuListViewTemplate" TemplateSection { title: "Ubuntu ListView" className: "UbuntuListView" ListModel { id: fruitModel objectName: "list_model" ListElement { name: "Orange"; details: "The orange (specifically, the sweet orange) is the fruit of the citrus species Citrus × ​sinensis in the family Rutaceae. The fruit of the Citrus sinensis is called sweet orange to distinguish it from that of the Citrus aurantium, the bitter orange. The orange is a hybrid, possibly between pomelo (Citrus maxima) and mandarin (Citrus reticulata), cultivated since ancient times.\n-\nWikipedia"} ListElement { name: "Apple"; details: "Fruit" } ListElement { name: "Tomato"; details: "The tomato is the edible, often red fruit of the plant Solanum lycopersicum, commonly known as a tomato plant. Both the species and its use as a food originated in Mexico, and spread throughout the world following the Spanish colonization of the Americas. Its many varieties are now widely grown, sometimes in greenhouses in cooler climates. The tomato is consumed in diverse ways, including raw, as an ingredient in many dishes, sauces, salads, and drinks. While it is botanically a fruit, it is considered a vegetable for culinary purposes (as well as under U.S. customs regulations, see Nix v. Hedden), which has caused some confusion. The fruit is rich in lycopene, which may have beneficial health effects. The tomato belongs to the nightshade family (Solanaceae). The plants typically grow to 1–3 meters (3–10 ft) in height and have a weak stem that often sprawls over the ground and vines over other plants. It is a perennial in its native habitat, although often grown outdoors in temperate climates as an annual. An average common tomato weighs approximately 100 grams (4 oz).\n-\nWikipedia" } ListElement { name: "Carrot"; details: "Vegetable" } ListElement { name: "Potato"; details: "Vegetable" } ListElement { name: "Mango"; details: "Fruit" } ListElement { name: "Banana"; details: "Fruit" } property bool refreshing: refreshTimer.running function refresh() { refreshTimer.restart(); } } Timer { id: refreshTimer interval: 400 } UbuntuListView { objectName: "ubuntuListView" width: parent.width height: units.gu(36) model: fruitModel clip: true currentIndex: -1 delegate: ListItem { ListItemLayout { title.text: name } // to enable highlight onClicked: ListView.view.currentIndex = index } pullToRefresh { enabled: true onRefresh: model.refresh() refreshing: model.refreshing } } } } ./examples/ubuntu-ui-toolkit-gallery/SwipeAreaPage.qml0000644000015600001650000001131212700370701023153 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Template { objectName: "SwipeAreaTemplate" scrollable: !(upwards.dragging | downwards.dragging | rightwards.dragging | leftwards.dragging) TemplateSection { className: "SwipeArea" TemplateRow { title: i18n.tr("Upwards") Rectangle { width: units.gu(40) height: units.gu(20) color: theme.palette.normal.foreground SwipeArea { id: upwards direction: SwipeArea.Upwards anchors { left: parent.left right: parent.right bottom: parent.bottom } height: units.gu(4) Label { text: i18n.tr("Upwards") color: theme.palette.normal.foregroundText anchors { centerIn: parent verticalCenterOffset: parent.dragging ? -parent.distance : 0 } } } } } TemplateRow { title: i18n.tr("Downwards") Rectangle { width: units.gu(40) height: units.gu(20) color: theme.palette.normal.foreground SwipeArea { id: downwards direction: SwipeArea.Downwards anchors { left: parent.left right: parent.right top: parent.top } height: units.gu(5) Label { text: i18n.tr("Downwards") color: theme.palette.normal.foregroundText anchors { centerIn: parent verticalCenterOffset: parent.dragging ? parent.distance : 0 } } } } } TemplateRow { title: i18n.tr("Rightwards") Rectangle { width: units.gu(40) height: units.gu(20) color: theme.palette.normal.foreground SwipeArea { id: rightwards direction: SwipeArea.Rightwards anchors { left: parent.left top: parent.top bottom: parent.bottom } width: units.gu(5) Label { text: i18n.tr("Rightwards") rotation: -90 color: theme.palette.normal.foregroundText anchors { centerIn: parent horizontalCenterOffset: parent.dragging ? parent.distance : 0 } } } } } TemplateRow { title: i18n.tr("Leftwards") Rectangle { width: units.gu(40) height: units.gu(20) color: theme.palette.normal.foreground SwipeArea { id: leftwards direction: SwipeArea.Leftwards anchors { right: parent.right top: parent.top bottom: parent.bottom } width: units.gu(5) Label { text: i18n.tr("Leftwards") rotation: 90 color: theme.palette.normal.foregroundText anchors { centerIn: parent horizontalCenterOffset: parent.dragging ? -parent.distance : 0 } } } } } } } ./examples/ubuntu-ui-toolkit-gallery/Sections.qml0000644000015600001650000000546412700370701022300 0ustar jenkinsjenkins/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Template { objectName: "sectionsTemplate" id: sectionsTemplate header: PageHeader { id: h title: sectionsTemplate.title extension: Sections { anchors { left: parent.left right: parent.right bottom: parent.bottom } model: h.showManySections ? sectionsTemplate.manyActions : sectionsTemplate.fewActions } property bool showManySections: false trailingActionBar.actions: [ Action { iconName: h.showManySections ? "view-collapse" : "view-expand" text: h.showManySections ? "less" : "more" onTriggered: h.showManySections = !h.showManySections; } ] } property list fewActions: [ Action { text: "One" }, Action { text: "Two" }, Action { text: "Three" } ] property var manyActions: [ "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty" ] TemplateSection { title: "Sections" className: "Sections" TemplateRow { title: i18n.tr("Enabled") Sections { actions: sectionsTemplate.fewActions } } TemplateRow { title: i18n.tr("Disabled") Sections { model: sectionsTemplate.fewActions enabled: false } } } TemplateSection { title: "Scrollable sections" className: "Sections" TemplateRow { title: i18n.tr("Enabled") Sections { model: sectionsTemplate.manyActions width: parent.width } } TemplateRow { title: i18n.tr("Disabled") Sections { model: sectionsTemplate.manyActions enabled: false width: parent.width } } } } ./examples/ubuntu-ui-toolkit-gallery/Sheet.qml0000644000015600001650000000644212700370701021556 0ustar jenkinsjenkins/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 Template { objectName: "sheetsTemplate" Label { anchors.left: parent.left anchors.right: parent.right text: i18n.tr("The visual style of the Sheet is early work and thus clunky looking.") font.italic: true wrapMode: Text.WordWrap font.weight: Font.Light } TemplateSection { title: "Default sheet" className: "DefaultSheet" documentation: "qml-ubuntu-components-popups-%1.html".arg(className.toLowerCase()) TemplateRow { title: i18n.tr("Standard") Button { text: i18n.tr("Open") width: units.gu(16) onClicked: PopupUtils.open(defaultSheet, null) } } Component { id: defaultSheet DefaultSheet { id: sheet title: i18n.tr("Title") Label { anchors.fill: parent wrapMode: Text.WordWrap text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + "Integer et ante at erat malesuada accumsan in eget mauris. " + "Nunc ultrices tristique laoreet. In non tristique lorem. " + "Donec in libero ut libero pretium lacinia. Proin dictum faucibus viverra. " } } } } TemplateSection { title: "Composer sheet" className: "ComposerSheet" documentation: "qml-ubuntu-components-popups-%1.html".arg(className.toLowerCase()) TemplateRow { title: i18n.tr("Standard") Button { text: i18n.tr("Open") width: units.gu(16) onClicked: PopupUtils.open(composerSheet, null) } } Component { id: composerSheet ComposerSheet { id: sheet title: i18n.tr("Title") Label { anchors.fill: parent wrapMode: Text.WordWrap text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + "Integer et ante at erat malesuada accumsan in eget mauris. " + "Nunc ultrices tristique laoreet. In non tristique lorem. " + "Donec in libero ut libero pretium lacinia. Proin dictum faucibus viverra. " } onCancelClicked: PopupUtils.close(sheet) onConfirmClicked: PopupUtils.close(sheet) } } } } ./examples/ubuntu-ui-toolkit-gallery/call@30.png0000644000015600001650000000305512700370701021654 0ustar jenkinsjenkinsPNG  IHDRZZ8AtEXtSoftwareAdobe ImageReadyqe<IDATx]yU?zKef9!Tj$RL`GQ2ٔ ah ڈll40"=ejhQv[Qʜw<{w{{?wϻ߽{}-H-* B+ThZP(4>[3ww} "#C9kb!x%8|Ř ]+ul:G'l6] /Pp6x#.3 mVp&vXvhw-Fu m]"2UʃaOSy*t2 `g~ҨnvGwulUa|1]B(6TBp6Cqy 67Х >3S눮´U.`lQhM*tR9 *tW{47П`#ۨBH+UX ~-V.dx1?'\P,/mlh>M*=z+jiT0M|Qv>Th7<m/KLХ; }fT|~Is.ȟ6_or9o>pE2 mRz<߲|_ $vo\(o؊sxل+pssXYn h- pc{^]fU3}|Tbx >\0Dgu1$=EBq ]#6vBuфw9u*t) yI5\3K_B*ty̢|* ]x8si[Z̺G/{zӒsh+nh;K/[\{k'׀_בX?PUhZBg 0". */ import QtQuick 2.0 import Ubuntu.Components 1.3 Template { objectName: "slidersTemplate" TemplateSection { className: "Slider" spacing: units.gu(5) TemplateFlow { title: i18n.tr("Standard") Slider { id: defaultSlider objectName: "slider_standard" width: parent.width } Label { text: i18n.tr("Actual value: %1").arg(defaultSlider.value) font.weight: Font.Light } } TemplateFlow { title: i18n.tr("Live Update") Slider { id: liveSlider objectName: "slider_live" width: parent.width live: true } Label { text: i18n.tr("Actual value: %1").arg(liveSlider.value) font.weight: Font.Light } } TemplateFlow { title: i18n.tr("Range") Slider { id: rangeSlider objectName: "slider_range" width: parent.width minimumValue: -1.0 maximumValue: 1.0 function formatValue(v) { return Number(v.toFixed(2)).toLocaleString(Qt.locale()) } } Label { text: i18n.tr("Actual value: %1").arg(rangeSlider.value) font.weight: Font.Light } } TemplateFlow { title: i18n.tr("Labels") Slider { id: longBubbleSlider objectName: "slider_long_bubble" width: parent.width value: 50 minimumValue: 0 maximumValue: 100 function formatValue(v) { if (v < maximumValue/4) return i18n.tr("Small") else if (v < maximumValue/1.5) return i18n.tr("Medium") else return i18n.tr("Large") } } Label { text: i18n.tr("Actual value: %1").arg(longBubbleSlider.value) font.weight: Font.Light } } } } ./.qmake.conf0000644000015600001650000000062412700370701013117 0ustar jenkinsjenkins# sets projectwide variables and implicitely # enables qmake to lookup the projectroot/features # directory for possible feature files # # Any variable specified here, must be set manually # inside the debian/rules file load(qt_build_config) CONFIG += warning_clean MODULE_VERSION = 5.5.0 ROOT_SOURCE_DIR=$$PWD ROOT_BUILD_DIR=$$shadowed($$PWD) exists($$PWD/../qt.pro) { CONFIG += build_with_qt } ./features/0000755000015600001650000000000012700370701012710 5ustar jenkinsjenkins./features/ubuntu_enable_testing.prf0000644000015600001650000000125412700370701020010 0ustar jenkinsjenkinsinstbase = $$ROOT_BUILD_DIR/qml !build_with_qt { # These bizarre rules copy the files to the build directory defineReplace(qmlModStripSrcDir) { return($$relative_path($$1, $$_PRO_FILE_PWD_)) } ubuntuqmlfiles2build.input = fq_qml_files ubuntuqmlfiles2build.output = $$instbase/$$TARGETPATH/${QMAKE_FUNC_FILE_IN_qmlModStripSrcDir} !contains(TEMPLATE, vc.*): ubuntuqmlfiles2build.variable_out = PRE_TARGETDEPS ubuntuqmlfiles2build.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} ubuntuqmlfiles2build.name = COPY ${QMAKE_FILE_IN} ubuntuqmlfiles2build.CONFIG = no_link no_clean QMAKE_EXTRA_COMPILERS += ubuntuqmlfiles2build } ./features/ubuntu_qml_module.prf0000644000015600001650000000005512700370701017161 0ustar jenkinsjenkinsload(qml_module) load(ubuntu_enable_testing) ./features/coverage.prf0000644000015600001650000000435712700370701015225 0ustar jenkinsjenkins# Coverage Support # -------------------------------- # In order to generate coverage report you will have to: # 0) Install following packages: gcovr lcov # 1) Configure project with coverage enabled # 1.1) qmake CONFIG+=coverage # 2) Compile project with coverage target # 2.1) xml report # 2.1.1) make coverage-xml # 2.2) html report # 2.2.1) make coverage-html # # In order to regenerate the report you might need to do following steps: # 1) make distclean # 2) qmake -r CONFIG+=coverage # 3) make coverage-html or make coverage-xml # -------------------------------- OBJECTS_DIR = MOC_DIR = TOP_SRC_DIR = $$PWD LIBS += -lgcov QMAKE_CXXFLAGS += --coverage QMAKE_LDFLAGS += --coverage QMAKE_EXTRA_TARGETS += coverage cov QMAKE_EXTRA_TARGETS += clean-gcno clean-gcda coverage-html \ generate-coverage-html clean-coverage-html coverage-xml \ generate-xml generate-coverage-xml clean-coverage-xml clean-gcno.commands = \ "@echo Removing old coverage instrumentation"; \ "find -name '*.gcno' -print | xargs -r rm" clean-gcda.commands = \ "@echo Removing old coverage results"; \ "find -name '*.gcda' -print | xargs -r rm" coverage-html.depends = clean-gcda check generate-coverage-html generate-coverage-html.commands = \ "@echo Collecting coverage data"; \ "lcov --directory $${TOP_SRC_DIR} --capture --output-file coverage.info --no-checksum --compat-libtool"; \ "lcov --extract coverage.info \"*/src/*.cpp\" -o coverage.info"; \ "lcov --remove coverage.info \"moc_*.cpp\" -o coverage.info"; \ "LANG=C genhtml --prefix $${TOP_SRC_DIR} --output-directory coverage-html --title \"Code Coverage\" --legend --show-details coverage.info" clean-coverage-html.depends = clean-gcda clean-coverage-html.commands = \ "lcov --directory $${TOP_SRC_DIR} -z"; \ "rm -rf coverage.info coverage-html" coverage-xml.depends = clean-gcda check generate-coverage-xml generate-coverage-xml.commands = \ "@echo Generating coverage GCOVR XML report"; \ "gcovr -x -r $${TOP_SRC_DIR} -o $${TOP_SRC_DIR}/coverage.xml -e \".*/moc_.*\" -e \"unit/.*\" -e \".*\\.h\"" clean-coverage-xml.depends = clean-gcda clean-coverage-xml.commands = \ "rm -rf $${TOP_SRC_DIR}/coverage.xml" QMAKE_CLEAN += *.gcda *.gcno coverage.info coverage.xml ./features/ubuntu_qt_module.prf0000644000015600001650000000102612700370701017013 0ustar jenkinsjenkins!build_with_qt: { #enable autocreation of include directory CONFIG += git_build } load(qt_module) CONFIG -= create_cmake # when building against the system Qt we pick up the CXX_FLAGS for a release build # reset them to the default debug build flags !build_with_qt: { CONFIG(debug, debug|release) { QMAKE_CFLAGS = $$QMAKE_CFLAGS_DEBUG QMAKE_CXXFLAGS = $$QMAKE_CXXFLAGS_DEBUG } } QMAKE_CXXFLAGS += -Werror #do not warn for deprecated declarations QMAKE_CXXFLAGS -= -Werror=deprecated-declarations ./features/ubuntu_qml_plugin.prf0000644000015600001650000000524412700370701017177 0ustar jenkinsjenkinsload(qml_plugin) CONFIG -= hide_symbols load(ubuntu_enable_testing) #hacky hacks to build the qmltypes !build_with_qt{ #should be already set by the qml_plugin.prf, but lets be safe isEmpty(IMPORT_VERSION): error("Must set IMPORT_VERSION") load(resolve_target) qml1_target { qmlplugindump = qml1plugindump importpath.name = QML_IMPORT_PATH } else { qmlplugindump = qmlplugindump importpath.name = QML2_IMPORT_PATH } qtPrepareTool(QMLPLUGINDUMP, $$qmlplugindump) importpath.value = for(qmod, QTREPOS) { qml1_target: \ qmod = $$qmod/imports else: \ qmod = $$qmod/qml exists($$qmod): importpath.value += $$shell_path($$qmod) } #add our path, somehow its not added automatically importpath.value += $$shell_path($$instbase) importpath.value = $$unique(importpath.value) membackend.name = ALARM_BACKEND membackend.value = memory #make sure qmlplugindump finds all libs ld_lib_path.name = LD_LIBRARY_PATH ld_lib_path.value = for(qmod, QTREPOS) { qmod = $$qmod/lib exists($$qmod): ld_lib_path.value += $$shell_path($$qmod) } ld_lib_path.value += $$shell_path($$ROOT_BUILD_DIR/lib) ld_lib_path.value = $$unique(ld_lib_path.value) qtAddToolEnv(QMLPLUGINDUMP, importpath) qtAddToolEnv(QMLPLUGINDUMP, membackend) qtAddToolEnv(QMLPLUGINDUMP, ld_lib_path) TARGETPATHBASE = $$replace(TARGETPATH, \\.\\d+\$, ) QMLTYPEFILE = $$instbase/$$TARGETPATH/plugins.qmltypes autobld_qmltypes.target = $$QMLTYPEFILE autobld_qmltypes.commands = $$QMLPLUGINDUMP -nonrelocatable $$replace(TARGETPATHBASE, /, .) $$IMPORT_VERSION > $$QMLTYPEFILE autobld_qmltypes.commands += && sed -i \'s?-1.-1\"?0.1\"?\' $$QMLTYPEFILE autobld_qmltypes.commands += && sed -i \'s?exportMetaObjectRevisions: \\[-1\\]?exportMetaObjectRevisions: [0,0]?\' $$QMLTYPEFILE autobld_qmltypes.depends = $$QMAKE_RESOLVED_TARGET autobld_install_qmltypes.files = $$QMLTYPEFILE autobld_install_qmltypes.depends = $$QMLTYPEFILE autobld_install_qmltypes.path = $$[QT_INSTALL_QML]/$$TARGETPATH autobld_install_qmltypes.CONFIG += no_check_exist INSTALLS+=autobld_install_qmltypes QMAKE_EXTRA_TARGETS += autobld_qmltypes } # when building against the system Qt we pick up the CXX_FLAGS for a release build # reset them to the default debug build flags !build_with_qt: { CONFIG(debug, debug|release) { QMAKE_CFLAGS = $$QMAKE_CFLAGS_DEBUG QMAKE_CXXFLAGS = $$QMAKE_CXXFLAGS_DEBUG } } QMAKE_CXXFLAGS += -Werror #do not warn for deprecated declarations QMAKE_CXXFLAGS -= -Werror=deprecated-declarations